summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog38
-rw-r--r--generic/tcl.decls9
-rw-r--r--generic/tclBasic.c6
-rw-r--r--generic/tclClock.c4
-rw-r--r--generic/tclDecls.h14
-rw-r--r--generic/tclIO.c4
-rw-r--r--generic/tclIORChan.c6
-rw-r--r--generic/tclInt.decls23
-rw-r--r--generic/tclInt.h7
-rw-r--r--generic/tclIntDecls.h70
-rw-r--r--generic/tclIntPlatDecls.h10
-rw-r--r--generic/tclLink.c6
-rw-r--r--generic/tclListObj.c4
-rw-r--r--generic/tclObj.c4
-rw-r--r--generic/tclParseExpr.c4
-rw-r--r--generic/tclProc.c4
-rw-r--r--generic/tclStubInit.c81
-rw-r--r--generic/tclStubLib.c64
-rw-r--r--generic/tclTimer.c4
-rw-r--r--generic/tclTomMath.decls214
-rw-r--r--generic/tclTomMath.h938
-rw-r--r--generic/tclTomMathDecls.h810
-rw-r--r--generic/tclTomMathInterface.c79
-rw-r--r--generic/tommath.h612
-rwxr-xr-xtools/fix_tommath_h.tcl99
-rw-r--r--unix/Makefile.in15
-rw-r--r--win/Makefile.in13
-rw-r--r--win/makefile.vc50
-rw-r--r--win/tclWinChan.c13
-rw-r--r--win/tclWinConsole.c12
-rw-r--r--win/tclWinDde.c15
-rw-r--r--win/tclWinFCmd.c8
-rw-r--r--win/tclWinFile.c13
-rw-r--r--win/tclWinReg.c27
-rw-r--r--win/tclWinSock.c18
35 files changed, 2347 insertions, 951 deletions
diff --git a/ChangeLog b/ChangeLog
index 325c773..9e71367 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,41 @@
+2005-12-13 Kevin B. Kenny <kennykb@acm.org>
+
+ * generic/tcl.decls: Added changes to export an additional
+ * generic/tclBasic.c: Stubs table to represent the 'libtommath'
+ * generic/tclDecls.h: routines that Tcl uses and export them
+ * generic/tclInt.decls: to callers. Reran 'genstubs'
+ * generic/tclInt.h:
+ * generic/tclIntDecls.h:
+ * generic/tclIntPlatDecls.h:
+ * generic/tclStubInit.c:
+ * generic/tclStubLib.c:
+ * generic/tclTomMath.decls:
+ * generic/tclTomMath.h:
+ * generic/tclTomMathDecls.h:
+ * generic/tclTomMathInterface.c:
+ * generic/tommath.h:
+ * tools/fix_tommath_h.tcl:
+ * unix/Makefile.in:
+ * win/Makefile.in:
+ * win/makefile.vc:
+
+ * generic/tclClock.c: Made changes to silence a number of
+ * generic/tclIO.c: compiler warnings when building with
+ * generic/tclIORChan.c: mingw.
+ * generic/tclLink.c:
+ * generic/tclListObj.c:
+ * generic/tclObj.c:
+ * generic/tclParseExpr.c:
+ * generic/tclProc.c:
+ * generic/tclTimer.c:
+ * win/tclWinChan.c:
+ * win/tclWinConsole.c:
+ * win/tclWinDde.c:
+ * win/tclWinFCmd.c:
+ * win/tclWinFile.c:
+ * win/tclWinReg.c:
+ * win/tclWinSock.c:
+
2005-12-13 Donal K. Fellows <donal.k.fellows@manchester.ac.uk>
* generic/tclExecute.c (TEBC:DICT_FIRST,DICT_DONE): Only decrease the
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 49d0d33..e5a51cd 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -11,7 +11,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: tcl.decls,v 1.115 2005/11/27 02:33:48 das Exp $
+# RCS: @(#) $Id: tcl.decls,v 1.116 2005/12/13 22:43:16 kennykb Exp $
library tcl
@@ -2031,6 +2031,13 @@ declare 565 generic {
void Tcl_GetChannelError (Tcl_Channel chan, Tcl_Obj** msg)
}
+declare 566 generic {
+ const char* TclTomMathInitializeStubs(Tcl_Interp* interp,
+ CONST char* version, int epoch, int revision)
+}
+
+
+
##############################################################################
# Define the platform specific public Tcl interface. These functions are
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 6bd2627..589892d 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -13,7 +13,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclBasic.c,v 1.183 2005/11/29 22:50:56 kennykb Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.184 2005/12/13 22:43:17 kennykb Exp $
*/
#include "tclInt.h"
@@ -582,6 +582,10 @@ Tcl_CreateInterp(void)
#endif
Tcl_InitStubs(interp, TCL_VERSION, 1);
+ if (TclTommath_Init(interp) != TCL_OK) {
+ panic(Tcl_GetString(Tcl_GetObjResult(interp)));
+ }
+
return interp;
}
diff --git a/generic/tclClock.c b/generic/tclClock.c
index 69abb95..6189a5a 100644
--- a/generic/tclClock.c
+++ b/generic/tclClock.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclClock.c,v 1.49 2005/12/02 22:13:41 kennykb Exp $
+ * RCS: @(#) $Id: tclClock.c,v 1.50 2005/12/13 22:43:17 kennykb Exp $
*/
#include "tclInt.h"
@@ -422,7 +422,7 @@ ClockGetdatefieldsObjCmd(
Tcl_DictObjPut((Tcl_Interp*) NULL, dict, literals[LIT_TZOFFSET],
Tcl_NewIntObj(fields.tzOffset));
Tcl_DictObjPut((Tcl_Interp*) NULL, dict, literals[LIT_JULIANDAY],
- Tcl_NewWideIntObj(fields.julianDay));
+ Tcl_NewIntObj(fields.julianDay));
Tcl_DictObjPut((Tcl_Interp*) NULL, dict, literals[LIT_GREGORIAN],
Tcl_NewIntObj(fields.gregorian));
Tcl_DictObjPut((Tcl_Interp*) NULL, dict, literals[LIT_ERA],
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index f01f3ca..6851457 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclDecls.h,v 1.117 2005/10/08 14:42:45 dgp Exp $
+ * RCS: @(#) $Id: tclDecls.h,v 1.118 2005/12/13 22:43:17 kennykb Exp $
*/
#ifndef _TCLDECLS
@@ -3527,6 +3527,13 @@ EXTERN void Tcl_SetChannelError _ANSI_ARGS_((Tcl_Channel chan,
EXTERN void Tcl_GetChannelError _ANSI_ARGS_((Tcl_Channel chan,
Tcl_Obj** msg));
#endif
+#ifndef TclTomMathInitializeStubs_TCL_DECLARED
+#define TclTomMathInitializeStubs_TCL_DECLARED
+/* 566 */
+EXTERN const char* TclTomMathInitializeStubs _ANSI_ARGS_((
+ Tcl_Interp* interp, CONST char* version,
+ int epoch, int revision));
+#endif
typedef struct TclStubHooks {
struct TclPlatStubs *tclPlatStubs;
@@ -4134,6 +4141,7 @@ typedef struct TclStubs {
void (*tcl_GetChannelErrorInterp) _ANSI_ARGS_((Tcl_Interp* interp, Tcl_Obj** msg)); /* 563 */
void (*tcl_SetChannelError) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj* msg)); /* 564 */
void (*tcl_GetChannelError) _ANSI_ARGS_((Tcl_Channel chan, Tcl_Obj** msg)); /* 565 */
+ const char* (*tclTomMathInitializeStubs) _ANSI_ARGS_((Tcl_Interp* interp, CONST char* version, int epoch, int revision)); /* 566 */
} TclStubs;
#ifdef __cplusplus
@@ -6438,6 +6446,10 @@ extern TclStubs *tclStubsPtr;
#define Tcl_GetChannelError \
(tclStubsPtr->tcl_GetChannelError) /* 565 */
#endif
+#ifndef TclTomMathInitializeStubs
+#define TclTomMathInitializeStubs \
+ (tclStubsPtr->tclTomMathInitializeStubs) /* 566 */
+#endif
#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */
diff --git a/generic/tclIO.c b/generic/tclIO.c
index f77a1a4..86a25f6 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclIO.c,v 1.102 2005/11/18 19:38:38 hobbs Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.103 2005/12/13 22:43:17 kennykb Exp $
*/
#include "tclInt.h"
@@ -6023,7 +6023,7 @@ Tcl_TruncateChannel(
* pre-read input data.
*/
- if (Tcl_Seek(chan, 0, SEEK_CUR) == Tcl_LongAsWide(-1)) {
+ if (Tcl_Seek(chan, (Tcl_WideInt)0, SEEK_CUR) == Tcl_LongAsWide(-1)) {
return TCL_ERROR;
}
diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c
index 2e4b192..faaaca1 100644
--- a/generic/tclIORChan.c
+++ b/generic/tclIORChan.c
@@ -15,7 +15,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclIORChan.c,v 1.11 2005/10/19 21:26:19 dkf Exp $
+ * RCS: @(#) $Id: tclIORChan.c,v 1.12 2005/12/13 22:43:17 kennykb Exp $
*/
#include <tclInt.h>
@@ -1116,7 +1116,7 @@ ReflectInput(
*errorCodePtr = EOK;
if (bytec > 0) {
- memcpy(buf, bytev, bytec);
+ memcpy(buf, bytev, (size_t)bytec);
}
Tcl_DecrRefCount(resObj); /* Remove reference held from invoke */
@@ -2248,7 +2248,7 @@ ForwardProc(
paramPtr->input.toRead = -1;
} else {
if (bytec > 0) {
- memcpy(paramPtr->input.buf, bytev, bytec);
+ memcpy(paramPtr->input.buf, bytev, (size_t)bytec);
}
paramPtr->input.toRead = bytec;
}
diff --git a/generic/tclInt.decls b/generic/tclInt.decls
index 9a07c73..02eeaf5 100644
--- a/generic/tclInt.decls
+++ b/generic/tclInt.decls
@@ -12,7 +12,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: tclInt.decls,v 1.93 2005/10/08 14:42:45 dgp Exp $
+# RCS: @(#) $Id: tclInt.decls,v 1.94 2005/12/13 22:43:17 kennykb Exp $
library tcl
@@ -878,23 +878,6 @@ declare 218 generic {
void TclPopStackFrame(Tcl_Interp *interp)
}
-# Entries in tommath needed only by tcltest
-
-declare 219 generic {
- int TclBN_mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d)
-}
-declare 220 generic {
- int TclBN_mp_mul_d(mp_int *a, mp_digit b, mp_int *c)
-}
-declare 221 generic {
- void TclBN_mp_clear(mp_int *a)
-}
-declare 222 generic {
- int TclBN_mp_init(mp_int *a)
-}
-declare 223 generic {
- int TclBN_mp_read_radix(mp_int *a, const char *str, int radix)
-}
# for use in tclTest.c
declare 224 generic {
TclPlatformType *TclGetPlatform(void)
@@ -927,7 +910,7 @@ declare 2 win {
CONST char *proto)
}
declare 3 win {
- int TclWinGetSockOpt(SOCKET s, int level, int optname,
+ int TclWinGetSockOpt(int s, int level, int optname,
char FAR *optval, int FAR *optlen)
}
declare 4 win {
@@ -941,7 +924,7 @@ declare 6 win {
u_short TclWinNToHS(u_short ns)
}
declare 7 win {
- int TclWinSetSockOpt(SOCKET s, int level, int optname,
+ int TclWinSetSockOpt(int s, int level, int optname,
CONST char FAR *optval, int optlen)
}
declare 8 win {
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 4978151..b183bca 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclInt.h,v 1.261 2005/12/01 11:03:55 dkf Exp $
+ * RCS: @(#) $Id: tclInt.h,v 1.262 2005/12/13 22:43:17 kennykb Exp $
*/
#ifndef _TCLINT
@@ -2864,9 +2864,7 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr);
*----------------------------------------------------------------------
*/
-MODULE_SCOPE void * TclBNAlloc(size_t nBytes);
-MODULE_SCOPE void * TclBNRealloc(void *oldBlock, size_t newNBytes);
-MODULE_SCOPE void TclBNFree(void *block);
+MODULE_SCOPE int TclTommath_Init(Tcl_Interp*);
MODULE_SCOPE void TclBNInitBignumFromLong(mp_int *bignum, long initVal);
MODULE_SCOPE void TclBNInitBignumFromWideInt(mp_int* bignum,
Tcl_WideInt initVal);
@@ -3027,6 +3025,7 @@ MODULE_SCOPE void TclBNInitBignumFromWideUInt(mp_int* bignum,
#include "tclPort.h"
#include "tclIntDecls.h"
#include "tclIntPlatDecls.h"
+#include "tclTomMathDecls.h"
#endif /* _TCLINT */
diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h
index 4b19ca6..5df62d5 100644
--- a/generic/tclIntDecls.h
+++ b/generic/tclIntDecls.h
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclIntDecls.h,v 1.84 2005/10/08 14:42:45 dgp Exp $
+ * RCS: @(#) $Id: tclIntDecls.h,v 1.85 2005/12/13 22:43:18 kennykb Exp $
*/
#ifndef _TCLINTDECLS
@@ -1045,34 +1045,11 @@ EXTERN int TclPushStackFrame _ANSI_ARGS_((Tcl_Interp * interp,
/* 218 */
EXTERN void TclPopStackFrame _ANSI_ARGS_((Tcl_Interp * interp));
#endif
-#ifndef TclBN_mp_div_d_TCL_DECLARED
-#define TclBN_mp_div_d_TCL_DECLARED
-/* 219 */
-EXTERN int TclBN_mp_div_d _ANSI_ARGS_((mp_int * a, mp_digit b,
- mp_int * c, mp_digit * d));
-#endif
-#ifndef TclBN_mp_mul_d_TCL_DECLARED
-#define TclBN_mp_mul_d_TCL_DECLARED
-/* 220 */
-EXTERN int TclBN_mp_mul_d _ANSI_ARGS_((mp_int * a, mp_digit b,
- mp_int * c));
-#endif
-#ifndef TclBN_mp_clear_TCL_DECLARED
-#define TclBN_mp_clear_TCL_DECLARED
-/* 221 */
-EXTERN void TclBN_mp_clear _ANSI_ARGS_((mp_int * a));
-#endif
-#ifndef TclBN_mp_init_TCL_DECLARED
-#define TclBN_mp_init_TCL_DECLARED
-/* 222 */
-EXTERN int TclBN_mp_init _ANSI_ARGS_((mp_int * a));
-#endif
-#ifndef TclBN_mp_read_radix_TCL_DECLARED
-#define TclBN_mp_read_radix_TCL_DECLARED
-/* 223 */
-EXTERN int TclBN_mp_read_radix _ANSI_ARGS_((mp_int * a,
- const char * str, int radix));
-#endif
+/* Slot 219 is reserved */
+/* Slot 220 is reserved */
+/* Slot 221 is reserved */
+/* Slot 222 is reserved */
+/* Slot 223 is reserved */
#ifndef TclGetPlatform_TCL_DECLARED
#define TclGetPlatform_TCL_DECLARED
/* 224 */
@@ -1324,11 +1301,11 @@ typedef struct TclIntStubs {
void (*tclStackFree) _ANSI_ARGS_((Tcl_Interp * interp)); /* 216 */
int (*tclPushStackFrame) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_CallFrame ** framePtrPtr, Tcl_Namespace * namespacePtr, int isProcCallFrame)); /* 217 */
void (*tclPopStackFrame) _ANSI_ARGS_((Tcl_Interp * interp)); /* 218 */
- int (*tclBN_mp_div_d) _ANSI_ARGS_((mp_int * a, mp_digit b, mp_int * c, mp_digit * d)); /* 219 */
- int (*tclBN_mp_mul_d) _ANSI_ARGS_((mp_int * a, mp_digit b, mp_int * c)); /* 220 */
- void (*tclBN_mp_clear) _ANSI_ARGS_((mp_int * a)); /* 221 */
- int (*tclBN_mp_init) _ANSI_ARGS_((mp_int * a)); /* 222 */
- int (*tclBN_mp_read_radix) _ANSI_ARGS_((mp_int * a, const char * str, int radix)); /* 223 */
+ void *reserved219;
+ void *reserved220;
+ void *reserved221;
+ void *reserved222;
+ void *reserved223;
TclPlatformType * (*tclGetPlatform) _ANSI_ARGS_((void)); /* 224 */
Tcl_Obj * (*tclTraceDictPath) _ANSI_ARGS_((Tcl_Interp * interp, Tcl_Obj * rootPtr, int keyc, Tcl_Obj *CONST keyv[], int flags)); /* 225 */
} TclIntStubs;
@@ -2034,26 +2011,11 @@ extern TclIntStubs *tclIntStubsPtr;
#define TclPopStackFrame \
(tclIntStubsPtr->tclPopStackFrame) /* 218 */
#endif
-#ifndef TclBN_mp_div_d
-#define TclBN_mp_div_d \
- (tclIntStubsPtr->tclBN_mp_div_d) /* 219 */
-#endif
-#ifndef TclBN_mp_mul_d
-#define TclBN_mp_mul_d \
- (tclIntStubsPtr->tclBN_mp_mul_d) /* 220 */
-#endif
-#ifndef TclBN_mp_clear
-#define TclBN_mp_clear \
- (tclIntStubsPtr->tclBN_mp_clear) /* 221 */
-#endif
-#ifndef TclBN_mp_init
-#define TclBN_mp_init \
- (tclIntStubsPtr->tclBN_mp_init) /* 222 */
-#endif
-#ifndef TclBN_mp_read_radix
-#define TclBN_mp_read_radix \
- (tclIntStubsPtr->tclBN_mp_read_radix) /* 223 */
-#endif
+/* Slot 219 is reserved */
+/* Slot 220 is reserved */
+/* Slot 221 is reserved */
+/* Slot 222 is reserved */
+/* Slot 223 is reserved */
#ifndef TclGetPlatform
#define TclGetPlatform \
(tclIntStubsPtr->tclGetPlatform) /* 224 */
diff --git a/generic/tclIntPlatDecls.h b/generic/tclIntPlatDecls.h
index e9c1184..c05b3a5 100644
--- a/generic/tclIntPlatDecls.h
+++ b/generic/tclIntPlatDecls.h
@@ -9,7 +9,7 @@
* Copyright (c) 1998-1999 by Scriptics Corporation.
* All rights reserved.
*
- * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.27 2005/05/14 20:46:45 das Exp $
+ * RCS: @(#) $Id: tclIntPlatDecls.h,v 1.28 2005/12/13 22:43:18 kennykb Exp $
*/
#ifndef _TCLINTPLATDECLS
@@ -146,7 +146,7 @@ EXTERN struct servent * TclWinGetServByName _ANSI_ARGS_((CONST char * nm,
#ifndef TclWinGetSockOpt_TCL_DECLARED
#define TclWinGetSockOpt_TCL_DECLARED
/* 3 */
-EXTERN int TclWinGetSockOpt _ANSI_ARGS_((SOCKET s, int level,
+EXTERN int TclWinGetSockOpt _ANSI_ARGS_((int s, int level,
int optname, char FAR * optval,
int FAR * optlen));
#endif
@@ -164,7 +164,7 @@ EXTERN u_short TclWinNToHS _ANSI_ARGS_((u_short ns));
#ifndef TclWinSetSockOpt_TCL_DECLARED
#define TclWinSetSockOpt_TCL_DECLARED
/* 7 */
-EXTERN int TclWinSetSockOpt _ANSI_ARGS_((SOCKET s, int level,
+EXTERN int TclWinSetSockOpt _ANSI_ARGS_((int s, int level,
int optname, CONST char FAR * optval,
int optlen));
#endif
@@ -322,11 +322,11 @@ typedef struct TclIntPlatStubs {
void (*tclWinConvertError) _ANSI_ARGS_((DWORD errCode)); /* 0 */
void (*tclWinConvertWSAError) _ANSI_ARGS_((DWORD errCode)); /* 1 */
struct servent * (*tclWinGetServByName) _ANSI_ARGS_((CONST char * nm, CONST char * proto)); /* 2 */
- int (*tclWinGetSockOpt) _ANSI_ARGS_((SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen)); /* 3 */
+ int (*tclWinGetSockOpt) _ANSI_ARGS_((int s, int level, int optname, char FAR * optval, int FAR * optlen)); /* 3 */
HINSTANCE (*tclWinGetTclInstance) _ANSI_ARGS_((void)); /* 4 */
void *reserved5;
u_short (*tclWinNToHS) _ANSI_ARGS_((u_short ns)); /* 6 */
- int (*tclWinSetSockOpt) _ANSI_ARGS_((SOCKET s, int level, int optname, CONST char FAR * optval, int optlen)); /* 7 */
+ int (*tclWinSetSockOpt) _ANSI_ARGS_((int s, int level, int optname, CONST char FAR * optval, int optlen)); /* 7 */
unsigned long (*tclpGetPid) _ANSI_ARGS_((Tcl_Pid pid)); /* 8 */
int (*tclWinGetPlatformId) _ANSI_ARGS_((void)); /* 9 */
void *reserved10;
diff --git a/generic/tclLink.c b/generic/tclLink.c
index 9a1f53f..6a4e49e 100644
--- a/generic/tclLink.c
+++ b/generic/tclLink.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclLink.c,v 1.15 2005/11/09 13:52:42 dkf Exp $
+ * RCS: @(#) $Id: tclLink.c,v 1.16 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -575,13 +575,13 @@ ObjValue(
return Tcl_NewIntObj(linkPtr->lastValue.us);
case TCL_LINK_UINT:
linkPtr->lastValue.ui = *(unsigned int *)(linkPtr->addr);
- return Tcl_NewWideIntObj(linkPtr->lastValue.ui);
+ return Tcl_NewWideIntObj((Tcl_WideInt)(linkPtr->lastValue.ui));
case TCL_LINK_LONG:
linkPtr->lastValue.l = *(long *)(linkPtr->addr);
return Tcl_NewWideIntObj(linkPtr->lastValue.l);
case TCL_LINK_ULONG:
linkPtr->lastValue.ul = *(unsigned long *)(linkPtr->addr);
- return Tcl_NewWideIntObj(linkPtr->lastValue.ul);
+ return Tcl_NewWideIntObj((Tcl_WideInt)(linkPtr->lastValue.ul));
case TCL_LINK_FLOAT:
linkPtr->lastValue.f = *(float *)(linkPtr->addr);
return Tcl_NewDoubleObj(linkPtr->lastValue.f);
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index e750809..1bc0344 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclListObj.c,v 1.30 2005/11/18 15:58:18 dgp Exp $
+ * RCS: @(#) $Id: tclListObj.c,v 1.31 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -554,7 +554,7 @@ Tcl_ListObjAppendElement(
oldListRepPtr->refCount--;
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
} else if (newSize) {
- listRepPtr = (List *) ckrealloc((char *)listRepPtr, newSize);
+ listRepPtr = (List *) ckrealloc((char *)listRepPtr, (size_t)newSize);
listRepPtr->maxElemCount = newMax;
listPtr->internalRep.twoPtrValue.ptr1 = (VOID *) listRepPtr;
}
diff --git a/generic/tclObj.c b/generic/tclObj.c
index 54b84c8..5237cd4 100644
--- a/generic/tclObj.c
+++ b/generic/tclObj.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclObj.c,v 1.102 2005/11/27 02:33:49 das Exp $
+ * RCS: @(#) $Id: tclObj.c,v 1.103 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -149,7 +149,7 @@ static Tcl_ThreadDataKey pendingObjDataKey;
mp_int *temp = (void *) ckalloc((unsigned) sizeof(mp_int)); \
*temp = bignum; \
(objPtr)->internalRep.ptrAndLongRep.ptr = (void*) temp; \
- (objPtr)->internalRep.ptrAndLongRep.value = -1; \
+ (objPtr)->internalRep.ptrAndLongRep.value = (unsigned long)(-1); \
} else { \
if ((bignum).alloc > 0x7fff) { \
mp_shrink(&(bignum)); \
diff --git a/generic/tclParseExpr.c b/generic/tclParseExpr.c
index 27d980e..ae1e2b2 100644
--- a/generic/tclParseExpr.c
+++ b/generic/tclParseExpr.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclParseExpr.c,v 1.30 2005/10/31 15:59:41 dkf Exp $
+ * RCS: @(#) $Id: tclParseExpr.c,v 1.31 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -1615,7 +1615,7 @@ GetLexeme(
if ((c != '+') && (c != '-')) {
CONST char *end = infoPtr->lastChar;
CONST char* end2;
- int code = TclParseNumber(NULL, NULL, NULL, src, (unsigned)(end-src),
+ int code = TclParseNumber(NULL, NULL, NULL, src, (int)(end-src),
&end2, 0);
if (code == TCL_OK) {
diff --git a/generic/tclProc.c b/generic/tclProc.c
index 126d73b..cab0788 100644
--- a/generic/tclProc.c
+++ b/generic/tclProc.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclProc.c,v 1.82 2005/11/02 00:55:06 dkf Exp $
+ * RCS: @(#) $Id: tclProc.c,v 1.83 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -1171,7 +1171,7 @@ TclObjInterpProc(
*/
localCt = procPtr->numCompiledLocals;
- compiledLocals = (Var *) TclStackAlloc(interp, localCt*sizeof(Var));
+ compiledLocals = (Var *) TclStackAlloc(interp, (int)(localCt*sizeof(Var)));
framePtr->numCompiledLocals = localCt;
framePtr->compiledLocals = compiledLocals;
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index bb1d018..3d7ecef 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -8,10 +8,11 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclStubInit.c,v 1.124 2005/11/27 02:33:49 das Exp $
+ * RCS: @(#) $Id: tclStubInit.c,v 1.125 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
+#include "tommath.h"
/*
* Remove macros that will interfere with the definitions below.
@@ -62,6 +63,7 @@ MODULE_SCOPE TclIntStubs tclIntStubs;
MODULE_SCOPE TclIntPlatStubs tclIntPlatStubs;
MODULE_SCOPE TclPlatStubs tclPlatStubs;
MODULE_SCOPE TclStubs tclStubs;
+MODULE_SCOPE TclTomMathStubs tclTomMathStubs;
/*
* WARNING: The contents of this file is automatically generated by the
@@ -308,11 +310,11 @@ TclIntStubs tclIntStubs = {
TclStackFree, /* 216 */
TclPushStackFrame, /* 217 */
TclPopStackFrame, /* 218 */
- TclBN_mp_div_d, /* 219 */
- TclBN_mp_mul_d, /* 220 */
- TclBN_mp_clear, /* 221 */
- TclBN_mp_init, /* 222 */
- TclBN_mp_read_radix, /* 223 */
+ NULL, /* 219 */
+ NULL, /* 220 */
+ NULL, /* 221 */
+ NULL, /* 222 */
+ NULL, /* 223 */
TclGetPlatform, /* 224 */
TclTraceDictPath, /* 225 */
};
@@ -389,6 +391,72 @@ TclPlatStubs tclPlatStubs = {
#endif /* MAC_OSX_TCL */
};
+TclTomMathStubs tclTomMathStubs = {
+ TCL_STUB_MAGIC,
+ NULL,
+ TclBN_epoch, /* 0 */
+ TclBN_revision, /* 1 */
+ TclBN_mp_add, /* 2 */
+ TclBN_mp_add_d, /* 3 */
+ TclBN_mp_and, /* 4 */
+ TclBN_mp_clamp, /* 5 */
+ TclBN_mp_clear, /* 6 */
+ TclBN_mp_clear_multi, /* 7 */
+ TclBN_mp_cmp, /* 8 */
+ TclBN_mp_cmp_d, /* 9 */
+ TclBN_mp_cmp_mag, /* 10 */
+ TclBN_mp_copy, /* 11 */
+ TclBN_mp_count_bits, /* 12 */
+ TclBN_mp_div, /* 13 */
+ TclBN_mp_div_d, /* 14 */
+ TclBN_mp_div_2, /* 15 */
+ TclBN_mp_div_2d, /* 16 */
+ TclBN_mp_div_3, /* 17 */
+ TclBN_mp_exch, /* 18 */
+ TclBN_mp_expt_d, /* 19 */
+ TclBN_mp_grow, /* 20 */
+ TclBN_mp_init, /* 21 */
+ TclBN_mp_init_copy, /* 22 */
+ TclBN_mp_init_multi, /* 23 */
+ TclBN_mp_init_set, /* 24 */
+ TclBN_mp_init_size, /* 25 */
+ TclBN_mp_lshd, /* 26 */
+ TclBN_mp_mod, /* 27 */
+ TclBN_mp_mod_2d, /* 28 */
+ TclBN_mp_mul, /* 29 */
+ TclBN_mp_mul_d, /* 30 */
+ TclBN_mp_mul_2, /* 31 */
+ TclBN_mp_mul_2d, /* 32 */
+ TclBN_mp_neg, /* 33 */
+ TclBN_mp_or, /* 34 */
+ TclBN_mp_radix_size, /* 35 */
+ TclBN_mp_read_radix, /* 36 */
+ TclBN_mp_rshd, /* 37 */
+ TclBN_mp_shrink, /* 38 */
+ TclBN_mp_set, /* 39 */
+ TclBN_mp_sqr, /* 40 */
+ TclBN_mp_sqrt, /* 41 */
+ TclBN_mp_sub, /* 42 */
+ TclBN_mp_sub_d, /* 43 */
+ TclBN_mp_to_unsigned_bin, /* 44 */
+ TclBN_mp_to_unsigned_bin_n, /* 45 */
+ TclBN_mp_toradix_n, /* 46 */
+ TclBN_mp_unsigned_bin_size, /* 47 */
+ TclBN_mp_xor, /* 48 */
+ TclBN_mp_zero, /* 49 */
+ TclBN_reverse, /* 50 */
+ TclBN_fast_s_mp_mul_digs, /* 51 */
+ TclBN_fast_s_mp_sqr, /* 52 */
+ TclBN_mp_karatsuba_mul, /* 53 */
+ TclBN_mp_karatsuba_sqr, /* 54 */
+ TclBN_mp_toom_mul, /* 55 */
+ TclBN_mp_toom_sqr, /* 56 */
+ TclBN_s_mp_add, /* 57 */
+ TclBN_s_mp_mul_digs, /* 58 */
+ TclBN_s_mp_sqr, /* 59 */
+ TclBN_s_mp_sub, /* 60 */
+};
+
static TclStubHooks tclStubHooks = {
&tclPlatStubs,
&tclIntStubs,
@@ -994,6 +1062,7 @@ TclStubs tclStubs = {
Tcl_GetChannelErrorInterp, /* 563 */
Tcl_SetChannelError, /* 564 */
Tcl_GetChannelError, /* 565 */
+ TclTomMathInitializeStubs, /* 566 */
};
/* !END!: Do not edit above this line. */
diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c
index 3b44f98..133de97 100644
--- a/generic/tclStubLib.c
+++ b/generic/tclStubLib.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclStubLib.c,v 1.11 2005/11/27 02:33:49 das Exp $
+ * RCS: @(#) $Id: tclStubLib.c,v 1.12 2005/12/13 22:43:18 kennykb Exp $
*/
/*
@@ -36,11 +36,13 @@ MODULE_SCOPE TclStubs *tclStubsPtr;
MODULE_SCOPE TclPlatStubs *tclPlatStubsPtr;
MODULE_SCOPE TclIntStubs *tclIntStubsPtr;
MODULE_SCOPE TclIntPlatStubs *tclIntPlatStubsPtr;
+MODULE_SCOPE TclTomMathStubs *tclTomMathStubsPtr;
TclStubs *tclStubsPtr = NULL;
TclPlatStubs *tclPlatStubsPtr = NULL;
TclIntStubs *tclIntStubsPtr = NULL;
TclIntPlatStubs *tclIntPlatStubsPtr = NULL;
+TclTomMathStubs* tclTomMathStubsPtr = NULL;
static TclStubs *
HasStubSupport(
@@ -118,3 +120,63 @@ Tcl_InitStubs(
return actualVersion;
}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclTomMathInitStubs --
+ *
+ * Initializes the Stubs table for Tcl's subset of libtommath
+ *
+ * Results:
+ * Returns a standard Tcl result.
+ *
+ * This procedure should not be called directly, but rather through
+ * the TclTomMath_InitStubs macro, to insure that the Stubs table
+ * matches the header files used in compilation.
+ *
+ * This procedure assumes that Tcl_InitStubs has been called first.
+ * Hence, it appears in Tcl's internal Stubs table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+#ifdef TclTomMathInitializeStubs
+#undef TclTomMathInitializeStubs
+#endif
+
+const char*
+TclTomMathInitializeStubs(
+ Tcl_Interp* interp, /* Tcl interpreter */
+ CONST char* version, /* Tcl version needed */
+ int epoch, /* Stubs table epoch from the header files */
+ int revision /* Stubs table revision number from the
+ * header files */
+) {
+ int exact = 0;
+ const char* packageName = "tcl::tommath";
+ const char* errMsg = NULL;
+ ClientData pkgClientData = NULL;
+ const char* actualVersion =
+ Tcl_PkgRequireEx(interp, packageName, version, exact, &pkgClientData);
+ TclTomMathStubs* stubsPtr = (TclTomMathStubs*) pkgClientData;
+ if (actualVersion == NULL) {
+ return NULL;
+ }
+ if (pkgClientData == NULL) {
+ errMsg = "missing stub tble pointer";
+ } else if ((stubsPtr->tclBN_epoch)() != epoch) {
+ errMsg = "epoch number mismatch";
+ } else if ((stubsPtr->tclBN_revision)() != revision) {
+ errMsg = "requires a later revision";
+ } else {
+ tclTomMathStubsPtr = stubsPtr;
+ return actualVersion;
+ }
+ Tcl_ResetResult(interp);
+ Tcl_AppendResult(interp, "error loading ", packageName,
+ " (requested version ", version,
+ ", actual version ", actualVersion,
+ "): ", errMsg, NULL);
+ return NULL;
+}
diff --git a/generic/tclTimer.c b/generic/tclTimer.c
index 6c07717..b867287 100644
--- a/generic/tclTimer.c
+++ b/generic/tclTimer.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclTimer.c,v 1.21 2005/11/09 21:28:36 kennykb Exp $
+ * RCS: @(#) $Id: tclTimer.c,v 1.22 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -830,7 +830,7 @@ Tcl_AfterObjCmd(
* to wait, or else index is the index of a subcommand.
*/
- switch ((enum afterSubCmds) index) {
+ switch (index) {
case -1: {
if (ms < 0) {
ms = 0;
diff --git a/generic/tclTomMath.decls b/generic/tclTomMath.decls
new file mode 100644
index 0000000..d68f512
--- /dev/null
+++ b/generic/tclTomMath.decls
@@ -0,0 +1,214 @@
+# tclTomMath.decls --
+#
+# This file contains the declarations for the functions in
+# 'libtommath' that are contained within the Tcl library.
+# This file is used to generate the 'tclTomMathDecls.h' and
+# 'tclTomMathStub.c' files.
+#
+# If you edit this file, advance the revision number (and the epoch
+# if the new stubs are not backward compatible) in tclTomMathDecls.h
+#
+# Copyright (c) 2005 by Kevin B. Kenny. All rights reserved.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# RCS: @(#) $Id: tclTomMath.decls,v 1.1 2005/12/13 22:43:18 kennykb Exp $
+
+library tcl
+
+# Define the unsupported generic interfaces.
+
+interface tclTomMath
+# hooks {tclTomMathInt}
+
+# Declare each of the functions in the Tcl tommath interface
+
+declare 0 generic {
+ int TclBN_epoch(void)
+}
+declare 1 generic {
+ int TclBN_revision(void)
+}
+
+declare 2 generic {
+ int TclBN_mp_add(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 3 generic {
+ int TclBN_mp_add_d(mp_int* a, mp_digit b, mp_int* c)
+}
+declare 4 generic {
+ int TclBN_mp_and(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 5 generic {
+ void TclBN_mp_clamp(mp_int* a)
+}
+declare 6 generic {
+ void TclBN_mp_clear(mp_int* a)
+}
+declare 7 generic {
+ void TclBN_mp_clear_multi(mp_int* a, ...)
+}
+declare 8 generic {
+ int TclBN_mp_cmp(mp_int* a, mp_int* b)
+}
+declare 9 generic {
+ int TclBN_mp_cmp_d(mp_int* a, mp_digit b)
+}
+declare 10 generic {
+ int TclBN_mp_cmp_mag(mp_int* a, mp_int* b)
+}
+declare 11 generic {
+ int TclBN_mp_copy(mp_int* a, mp_int* b)
+}
+declare 12 generic {
+ int TclBN_mp_count_bits(mp_int* a)
+}
+declare 13 generic {
+ int TclBN_mp_div(mp_int* a, mp_int* b, mp_int* q, mp_int* r)
+}
+declare 14 generic {
+ int TclBN_mp_div_d(mp_int* a, mp_digit b, mp_int* q, mp_digit* r)
+}
+declare 15 generic {
+ int TclBN_mp_div_2(mp_int* a, mp_int* q)
+}
+declare 16 generic {
+ int TclBN_mp_div_2d(mp_int* a, int b, mp_int* q, mp_int* r)
+}
+declare 17 generic {
+ int TclBN_mp_div_3(mp_int* a, mp_int* q, mp_digit* r)
+}
+declare 18 generic {
+ void TclBN_mp_exch(mp_int* a, mp_int* b)
+}
+declare 19 generic {
+ int TclBN_mp_expt_d(mp_int* a, mp_digit b, mp_int* c)
+}
+declare 20 generic {
+ int TclBN_mp_grow(mp_int* a, int size)
+}
+declare 21 generic {
+ int TclBN_mp_init(mp_int* a)
+}
+declare 22 generic {
+ int TclBN_mp_init_copy(mp_int * a, mp_int* b)
+}
+declare 23 generic {
+ int TclBN_mp_init_multi(mp_int* a, ...)
+}
+declare 24 generic {
+ int TclBN_mp_init_set(mp_int* a, mp_digit b)
+}
+declare 25 generic {
+ int TclBN_mp_init_size(mp_int* a, int size)
+}
+declare 26 generic {
+ int TclBN_mp_lshd(mp_int* a, int shift)
+}
+declare 27 generic {
+ int TclBN_mp_mod(mp_int* a, mp_int* b, mp_int* r)
+}
+declare 28 generic {
+ int TclBN_mp_mod_2d(mp_int* a, int b, mp_int* r)
+}
+declare 29 generic {
+ int TclBN_mp_mul(mp_int* a, mp_int* b, mp_int* p)
+}
+declare 30 generic {
+ int TclBN_mp_mul_d(mp_int* a, mp_digit b, mp_int* p)
+}
+declare 31 generic {
+ int TclBN_mp_mul_2(mp_int* a, mp_int* p)
+}
+declare 32 generic {
+ int TclBN_mp_mul_2d(mp_int* a, int d, mp_int* p)
+}
+declare 33 generic {
+ int TclBN_mp_neg(mp_int* a, mp_int* b)
+}
+declare 34 generic {
+ int TclBN_mp_or(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 35 generic {
+ int TclBN_mp_radix_size(mp_int* a, int radix, int* size)
+}
+declare 36 generic {
+ int TclBN_mp_read_radix(mp_int* a, const char* str, int radix)
+}
+declare 37 generic {
+ void TclBN_mp_rshd(mp_int * a, int shift)
+}
+declare 38 generic {
+ int TclBN_mp_shrink(mp_int* a)
+}
+declare 39 generic {
+ void TclBN_mp_set(mp_int* a, mp_digit b)
+}
+declare 40 generic {
+ int TclBN_mp_sqr(mp_int* a, mp_int* b)
+}
+declare 41 generic {
+ int TclBN_mp_sqrt(mp_int* a, mp_int* b)
+}
+declare 42 generic {
+ int TclBN_mp_sub(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 43 generic {
+ int TclBN_mp_sub_d(mp_int* a, mp_digit b, mp_int* c)
+}
+declare 44 generic {
+ int TclBN_mp_to_unsigned_bin(mp_int* a, unsigned char* b)
+}
+declare 45 generic {
+ int TclBN_mp_to_unsigned_bin_n(mp_int* a, unsigned char* b, unsigned long* outlen)
+}
+declare 46 generic {
+ int TclBN_mp_toradix_n(mp_int* a, char* str, int radix, int maxlen)
+}
+declare 47 generic {
+ int TclBN_mp_unsigned_bin_size(mp_int* a)
+}
+declare 48 generic {
+ int TclBN_mp_xor(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 49 generic {
+ void TclBN_mp_zero(mp_int* a)
+}
+
+# internal routines to libtommath - should not be called but must be
+# exported to accommodate the "tommath" extension
+
+declare 50 generic {
+ void TclBN_reverse(unsigned char* s, int len)
+}
+declare 51 generic {
+ int TclBN_fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs)
+}
+declare 52 generic {
+ int TclBN_fast_s_mp_sqr(mp_int* a, mp_int* b)
+}
+declare 53 generic {
+ int TclBN_mp_karatsuba_mul(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 54 generic {
+ int TclBN_mp_karatsuba_sqr(mp_int* a, mp_int* b)
+}
+declare 55 generic {
+ int TclBN_mp_toom_mul(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 56 generic {
+ int TclBN_mp_toom_sqr(mp_int* a, mp_int* b)
+}
+declare 57 generic {
+ int TclBN_s_mp_add(mp_int* a, mp_int* b, mp_int* c)
+}
+declare 58 generic {
+ int TclBN_s_mp_mul_digs(mp_int* a, mp_int* b, mp_int* c, int digs)
+}
+declare 59 generic {
+ int TclBN_s_mp_sqr(mp_int* a, mp_int* b)
+}
+declare 60 generic {
+ int TclBN_s_mp_sub(mp_int* a, mp_int* b, mp_int* c)
+}
diff --git a/generic/tclTomMath.h b/generic/tclTomMath.h
index a807e10..2ecc3c5 100644
--- a/generic/tclTomMath.h
+++ b/generic/tclTomMath.h
@@ -1,130 +1,844 @@
-/*
- * tclTomMath.h --
+/* LibTomMath, multiple-precision integer library -- Tom St Denis
*
- * Interface information that comes in at the head of
- * <tommath.h> to adapt the API to Tcl's linkage conventions.
+ * LibTomMath is a library that provides multiple-precision
+ * integer arithmetic as well as number theoretic functionality.
*
- * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved.
+ * The library was designed directly after the MPI library by
+ * Michael Fromberger but has been written from scratch with
+ * additional optimizations in place.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * The library is free for all purposes without any express
+ * guarantee it works.
*
- * RCS: @(#) $Id: tclTomMath.h,v 1.4 2005/10/08 14:42:45 dgp Exp $
+ * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org
*/
+#ifndef BN_H_
+#define BN_H_
-#ifndef TCLTOMMATH_H
-#define TCLTOMMATH_H 1
+#include <tclTomMathDecls.h>
+#ifndef MODULE_SCOPE
+#define MODULE_SCOPE extern
+#endif
-#include <tcl.h>
+#include <stdio.h>
+#include <string.h>
#include <stdlib.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include <tommath_class.h>
+
+#ifndef MIN
+ #define MIN(x,y) ((x)<(y)?(x):(y))
+#endif
+#ifndef MAX
+ #define MAX(x,y) ((x)>(y)?(x):(y))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
-/* Define TOMMATH_DLLIMPORT and TOMMATH_DLLEXPORT to suit the compiler */
+/* C++ compilers don't like assigning void * to mp_digit * */
+#define OPT_CAST(x) (x *)
-#ifdef STATIC_BUILD
-# define TOMMATH_DLLIMPORT
-# define TOMMATH_DLLEXPORT
#else
-# if (defined(__WIN32__) && (defined(_MSC_VER) || (__BORLANDC__ >= 0x0550) || defined(__LCC__) || defined(__WATCOMC__) || (defined(__GNUC__) && defined(__declspec))))
-# define TOMMATH_DLLIMPORT __declspec(dllimport)
-# define TOMMATH_DLLEXPORT __declspec(dllexport)
-# else
-# define TOMMATH_DLLIMPORT
-# define TOMMATH_DLLEXPORT
-# endif
+
+/* C on the other hand doesn't care */
+#define OPT_CAST(x)
+
#endif
-/* Define TOMMATH_STORAGE_CLASS according to the build options. */
-#undef TOMMATH_STORAGE_CLASS
-#ifdef BUILD_tcl
-# define TOMMATH_STORAGE_CLASS TOMMATH_DLLEXPORT
+/* detect 64-bit mode if possible */
+#if defined(__x86_64__)
+ #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT))
+ #define MP_64BIT
+ #endif
+#endif
+
+/* some default configurations.
+ *
+ * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits
+ * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits
+ *
+ * At the very least a mp_digit must be able to hold 7 bits
+ * [any size beyond that is ok provided it doesn't overflow the data type]
+ */
+#ifdef MP_8BIT
+#ifndef MP_DIGIT_DECLARED
+ typedef unsigned char mp_digit;
+#define MP_DIGIT_DECLARED
+#endif
+ typedef unsigned short mp_word;
+#elif defined(MP_16BIT)
+#ifndef MP_DIGIT_DECLARED
+ typedef unsigned short mp_digit;
+#define MP_DIGIT_DECLARED
+#endif
+ typedef unsigned long mp_word;
+#elif defined(MP_64BIT)
+ /* for GCC only on supported platforms */
+#ifndef CRYPT
+ typedef unsigned long long ulong64;
+ typedef signed long long long64;
+#endif
+
+#ifndef MP_DIGIT_DECLARED
+ typedef unsigned long mp_digit;
+#define MP_DIGIT_DECLARED
+#endif
+ typedef unsigned long mp_word __attribute__ ((mode(TI)));
+
+ #define DIGIT_BIT 60
#else
-# ifdef USE_TCL_STUBS
-# define TOMMATH_STORAGE_CLASS
-# else
-# define TOMMATH_STORAGE_CLASS TOMMATH_DLLIMPORT
-# endif
-#endif
-
-/* Define custom memory allocation for libtommath */
-
-#define XMALLOC(x) TclBNAlloc(x)
-#define XFREE(x) TclBNFree(x)
-#define XREALLOC(x,n) TclBNRealloc(x,n)
-#define XCALLOC(n,x) TclBNCalloc(n,x)
-void* TclBNAlloc( size_t );
-void* TclBNRealloc( void*, size_t );
-void TclBNFree( void* );
-void* TclBNCalloc( size_t, size_t );
-
-/* Rename all global symboles in libtommath to avoid linkage conflicts */
-
-#define KARATSUBA_MUL_CUTOFF TclBNKaratsubaMulCutoff
-#define KARATSUBA_SQR_CUTOFF TclBNKaratsubaSqrCutoff
-#define TOOM_MUL_CUTOFF TclBNToomMulCutoff
-#define TOOM_SQR_CUTOFF TclBNToomSqrCutoff
-
-#define mp_s_rmap TclBNMpSRmap
-
-#define bn_reverse TclBN_reverse
-#define fast_s_mp_mul_digs TclBN_fast_s_mp_mul_digs
-#define fast_s_mp_sqr TclBN_fast_s_mp_sqr
-#define mp_add TclBN_mp_add
-#define mp_add_d TclBN_mp_add_d
-#define mp_and TclBN_mp_and
-#define mp_clamp TclBN_mp_clamp
-#define mp_clear TclBN_mp_clear
-#define mp_clear_multi TclBN_mp_clear_multi
-#define mp_cmp TclBN_mp_cmp
-#define mp_cmp_d TclBN_mp_cmp_d
-#define mp_cmp_mag TclBN_mp_cmp_mag
-#define mp_copy TclBN_mp_copy
-#define mp_count_bits TclBN_mp_count_bits
-#define mp_div TclBN_mp_div
-#define mp_div_d TclBN_mp_div_d
-#define mp_div_2 TclBN_mp_div_2
-#define mp_div_2d TclBN_mp_div_2d
-#define mp_div_3 TclBN_mp_div_3
-#define mp_exch TclBN_mp_exch
-#define mp_expt_d TclBN_mp_expt_d
-#define mp_grow TclBN_mp_grow
-#define mp_init TclBN_mp_init
-#define mp_init_copy TclBN_mp_init_copy
-#define mp_init_multi TclBN_mp_init_multi
-#define mp_init_set TclBN_mp_init_set
-#define mp_init_size TclBN_mp_init_size
-#define mp_karatsuba_mul TclBN_mp_karatsuba_mul
-#define mp_karatsuba_sqr TclBN_mp_karatsuba_sqr
-#define mp_lshd TclBN_mp_lshd
-#define mp_mod TclBN_mp_mod
-#define mp_mod_2d TclBN_mp_mod_2d
-#define mp_mul TclBN_mp_mul
-#define mp_mul_2 TclBN_mp_mul_2
-#define mp_mul_2d TclBN_mp_mul_2d
-#define mp_mul_d TclBN_mp_mul_d
-#define mp_neg TclBN_mp_neg
-#define mp_or TclBN_mp_or
-#define mp_radix_size TclBN_mp_radix_size
-#define mp_read_radix TclBN_mp_read_radix
-#define mp_rshd TclBN_mp_rshd
-#define mp_shrink TclBN_mp_shrink
-#define mp_set TclBN_mp_set
-#define mp_sqr TclBN_mp_sqr
-#define mp_sqrt TclBN_mp_sqrt
-#define mp_sub TclBN_mp_sub
-#define mp_sub_d TclBN_mp_sub_d
-#define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin
-#define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n
-#define mp_toom_mul TclBN_mp_toom_mul
-#define mp_toom_sqr TclBN_mp_toom_sqr
-#define mp_toradix_n TclBN_mp_toradix_n
-#define mp_unsigned_bin_size TclBN_mp_unsigned_bin_size
-#define mp_xor TclBN_mp_xor
-#define mp_zero TclBN_mp_zero
-#define s_mp_add TclBN_s_mp_add
-#define s_mp_mul_digs TclBN_s_mp_mul_digs
-#define s_mp_sqr TclBN_s_mp_sqr
-#define s_mp_sub TclBN_s_mp_sub
+ /* this is the default case, 28-bit digits */
+
+ /* this is to make porting into LibTomCrypt easier :-) */
+#ifndef CRYPT
+ #if defined(_MSC_VER) || defined(__BORLANDC__)
+ typedef unsigned __int64 ulong64;
+ typedef signed __int64 long64;
+ #else
+ typedef unsigned long long ulong64;
+ typedef signed long long long64;
+ #endif
+#endif
+
+#ifndef MP_DIGIT_DECLARED
+ typedef unsigned long mp_digit;
+#define MP_DIGIT_DECLARED
+#endif
+ typedef ulong64 mp_word;
+
+#ifdef MP_31BIT
+ /* this is an extension that uses 31-bit digits */
+ #define DIGIT_BIT 31
+#else
+ /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */
+ #define DIGIT_BIT 28
+ #define MP_28BIT
+#endif
+#endif
+
+/* define heap macros */
+#if 0 /* these are macros in tclTomMathDecls.h */
+#ifndef CRYPT
+ /* default to libc stuff */
+ #ifndef XMALLOC
+ #define XMALLOC malloc
+ #define XFREE free
+ #define XREALLOC realloc
+ #define XCALLOC calloc
+ #else
+ /* prototypes for our heap functions */
+ extern void *XMALLOC(size_t n);
+ extern void *XREALLOC(void *p, size_t n);
+ extern void *XCALLOC(size_t n, size_t s);
+ extern void XFREE(void *p);
+ #endif
+#endif
+#endif
+
+
+/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */
+#ifndef DIGIT_BIT
+ #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */
+#endif
+
+#define MP_DIGIT_BIT DIGIT_BIT
+#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
+#define MP_DIGIT_MAX MP_MASK
+
+/* equalities */
+#define MP_LT -1 /* less than */
+#define MP_EQ 0 /* equal to */
+#define MP_GT 1 /* greater than */
+
+#define MP_ZPOS 0 /* positive integer */
+#define MP_NEG 1 /* negative */
+
+#define MP_OKAY 0 /* ok result */
+#define MP_MEM -2 /* out of mem */
+#define MP_VAL -3 /* invalid input */
+#define MP_RANGE MP_VAL
+
+#define MP_YES 1 /* yes response */
+#define MP_NO 0 /* no response */
+/* Primality generation flags */
+#define LTM_PRIME_BBS 0x0001 /* BBS style prime */
+#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */
+#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */
+
+typedef int mp_err;
+
+/* you'll have to tune these... */
+#if defined(BUILD_tcl) || !defined(_WIN32)
+MODULE_SCOPE int KARATSUBA_MUL_CUTOFF,
+ KARATSUBA_SQR_CUTOFF,
+ TOOM_MUL_CUTOFF,
+ TOOM_SQR_CUTOFF;
+#endif
+
+/* define this to use lower memory usage routines (exptmods mostly) */
+/* #define MP_LOW_MEM */
+
+/* default precision */
+#ifndef MP_PREC
+ #ifndef MP_LOW_MEM
+ #define MP_PREC 32 /* default digits of precision */
+ #else
+ #define MP_PREC 8 /* default digits of precision */
+ #endif
#endif
+
+/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
+#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1))
+
+/* the infamous mp_int structure */
+#ifndef MP_INT_DECLARED
+#define MP_INT_DECLARED
+typedef struct mp_int mp_int;
+#endif
+struct mp_int {
+ int used, alloc, sign;
+ mp_digit *dp;
+};
+
+/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */
+typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat);
+
+
+#define USED(m) ((m)->used)
+#define DIGIT(m,k) ((m)->dp[(k)])
+#define SIGN(m) ((m)->sign)
+
+/* error code to char* string */
+/*
+char *mp_error_to_string(int code);
+*/
+
+/* ---> init and deinit bignum functions <--- */
+/* init a bignum */
+/*
+int mp_init(mp_int *a);
+*/
+
+/* free a bignum */
+/*
+void mp_clear(mp_int *a);
+*/
+
+/* init a null terminated series of arguments */
+/*
+int mp_init_multi(mp_int *mp, ...);
+*/
+
+/* clear a null terminated series of arguments */
+/*
+void mp_clear_multi(mp_int *mp, ...);
+*/
+
+/* exchange two ints */
+/*
+void mp_exch(mp_int *a, mp_int *b);
+*/
+
+/* shrink ram required for a bignum */
+/*
+int mp_shrink(mp_int *a);
+*/
+
+/* grow an int to a given size */
+/*
+int mp_grow(mp_int *a, int size);
+*/
+
+/* init to a given number of digits */
+/*
+int mp_init_size(mp_int *a, int size);
+*/
+
+/* ---> Basic Manipulations <--- */
+#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
+#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO)
+#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO)
+
+/* set to zero */
+/*
+void mp_zero(mp_int *a);
+*/
+
+/* set to a digit */
+/*
+void mp_set(mp_int *a, mp_digit b);
+*/
+
+/* set a 32-bit const */
+/*
+int mp_set_int(mp_int *a, unsigned long b);
+*/
+
+/* get a 32-bit value */
+unsigned long mp_get_int(mp_int * a);
+
+/* initialize and set a digit */
+/*
+int mp_init_set (mp_int * a, mp_digit b);
+*/
+
+/* initialize and set 32-bit value */
+/*
+int mp_init_set_int (mp_int * a, unsigned long b);
+*/
+
+/* copy, b = a */
+/*
+int mp_copy(mp_int *a, mp_int *b);
+*/
+
+/* inits and copies, a = b */
+/*
+int mp_init_copy(mp_int *a, mp_int *b);
+*/
+
+/* trim unused digits */
+/*
+void mp_clamp(mp_int *a);
+*/
+
+/* ---> digit manipulation <--- */
+
+/* right shift by "b" digits */
+/*
+void mp_rshd(mp_int *a, int b);
+*/
+
+/* left shift by "b" digits */
+/*
+int mp_lshd(mp_int *a, int b);
+*/
+
+/* c = a / 2**b */
+/*
+int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d);
+*/
+
+/* b = a/2 */
+/*
+int mp_div_2(mp_int *a, mp_int *b);
+*/
+
+/* c = a * 2**b */
+/*
+int mp_mul_2d(mp_int *a, int b, mp_int *c);
+*/
+
+/* b = a*2 */
+/*
+int mp_mul_2(mp_int *a, mp_int *b);
+*/
+
+/* c = a mod 2**d */
+/*
+int mp_mod_2d(mp_int *a, int b, mp_int *c);
+*/
+
+/* computes a = 2**b */
+/*
+int mp_2expt(mp_int *a, int b);
+*/
+
+/* Counts the number of lsbs which are zero before the first zero bit */
+/*
+int mp_cnt_lsb(mp_int *a);
+*/
+
+/* I Love Earth! */
+
+/* makes a pseudo-random int of a given size */
+/*
+int mp_rand(mp_int *a, int digits);
+*/
+
+/* ---> binary operations <--- */
+/* c = a XOR b */
+/*
+int mp_xor(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = a OR b */
+/*
+int mp_or(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = a AND b */
+/*
+int mp_and(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* ---> Basic arithmetic <--- */
+
+/* b = -a */
+/*
+int mp_neg(mp_int *a, mp_int *b);
+*/
+
+/* b = |a| */
+/*
+int mp_abs(mp_int *a, mp_int *b);
+*/
+
+/* compare a to b */
+/*
+int mp_cmp(mp_int *a, mp_int *b);
+*/
+
+/* compare |a| to |b| */
+/*
+int mp_cmp_mag(mp_int *a, mp_int *b);
+*/
+
+/* c = a + b */
+/*
+int mp_add(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = a - b */
+/*
+int mp_sub(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = a * b */
+/*
+int mp_mul(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* b = a*a */
+/*
+int mp_sqr(mp_int *a, mp_int *b);
+*/
+
+/* a/b => cb + d == a */
+/*
+int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+*/
+
+/* c = a mod b, 0 <= c < b */
+/*
+int mp_mod(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* ---> single digit functions <--- */
+
+/* compare against a single digit */
+/*
+int mp_cmp_d(mp_int *a, mp_digit b);
+*/
+
+/* c = a + b */
+/*
+int mp_add_d(mp_int *a, mp_digit b, mp_int *c);
+*/
+
+/* c = a - b */
+/*
+int mp_sub_d(mp_int *a, mp_digit b, mp_int *c);
+*/
+
+/* c = a * b */
+/*
+int mp_mul_d(mp_int *a, mp_digit b, mp_int *c);
+*/
+
+/* a/b => cb + d == a */
+/*
+int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d);
+*/
+
+/* a/3 => 3c + d == a */
+/*
+int mp_div_3(mp_int *a, mp_int *c, mp_digit *d);
+*/
+
+/* c = a**b */
+/*
+int mp_expt_d(mp_int *a, mp_digit b, mp_int *c);
+*/
+
+/* c = a mod b, 0 <= c < b */
+/*
+int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c);
+*/
+
+/* ---> number theory <--- */
+
+/* d = a + b (mod c) */
+/*
+int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+*/
+
+/* d = a - b (mod c) */
+/*
+int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+*/
+
+/* d = a * b (mod c) */
+/*
+int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+*/
+
+/* c = a * a (mod b) */
+/*
+int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = 1/a (mod b) */
+/*
+int mp_invmod(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* c = (a, b) */
+/*
+int mp_gcd(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* produces value such that U1*a + U2*b = U3 */
+/*
+int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3);
+*/
+
+/* c = [a, b] or (a*b)/(a, b) */
+/*
+int mp_lcm(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* finds one of the b'th root of a, such that |c|**b <= |a|
+ *
+ * returns error if a < 0 and b is even
+ */
+/*
+int mp_n_root(mp_int *a, mp_digit b, mp_int *c);
+*/
+
+/* special sqrt algo */
+/*
+int mp_sqrt(mp_int *arg, mp_int *ret);
+*/
+
+/* is number a square? */
+/*
+int mp_is_square(mp_int *arg, int *ret);
+*/
+
+/* computes the jacobi c = (a | n) (or Legendre if b is prime) */
+/*
+int mp_jacobi(mp_int *a, mp_int *n, int *c);
+*/
+
+/* used to setup the Barrett reduction for a given modulus b */
+/*
+int mp_reduce_setup(mp_int *a, mp_int *b);
+*/
+
+/* Barrett Reduction, computes a (mod b) with a precomputed value c
+ *
+ * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely
+ * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code].
+ */
+/*
+int mp_reduce(mp_int *a, mp_int *b, mp_int *c);
+*/
+
+/* setups the montgomery reduction */
+/*
+int mp_montgomery_setup(mp_int *a, mp_digit *mp);
+*/
+
+/* computes a = B**n mod b without division or multiplication useful for
+ * normalizing numbers in a Montgomery system.
+ */
+/*
+int mp_montgomery_calc_normalization(mp_int *a, mp_int *b);
+*/
+
+/* computes x/R == x (mod N) via Montgomery Reduction */
+/*
+int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
+*/
+
+/* returns 1 if a is a valid DR modulus */
+/*
+int mp_dr_is_modulus(mp_int *a);
+*/
+
+/* sets the value of "d" required for mp_dr_reduce */
+/*
+void mp_dr_setup(mp_int *a, mp_digit *d);
+*/
+
+/* reduces a modulo b using the Diminished Radix method */
+/*
+int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp);
+*/
+
+/* returns true if a can be reduced with mp_reduce_2k */
+/*
+int mp_reduce_is_2k(mp_int *a);
+*/
+
+/* determines k value for 2k reduction */
+/*
+int mp_reduce_2k_setup(mp_int *a, mp_digit *d);
+*/
+
+/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
+/*
+int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d);
+*/
+
+/* returns true if a can be reduced with mp_reduce_2k_l */
+/*
+int mp_reduce_is_2k_l(mp_int *a);
+*/
+
+/* determines k value for 2k reduction */
+/*
+int mp_reduce_2k_setup_l(mp_int *a, mp_int *d);
+*/
+
+/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
+/*
+int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d);
+*/
+
+/* d = a**b (mod c) */
+/*
+int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
+*/
+
+/* ---> Primes <--- */
+
+/* number of primes */
+#ifdef MP_8BIT
+ #define PRIME_SIZE 31
+#else
+ #define PRIME_SIZE 256
+#endif
+
+/* table of first PRIME_SIZE primes */
+#if defined(BUILD_tcl) || !defined(_WIN32)
+MODULE_SCOPE const mp_digit ltm_prime_tab[];
+#endif
+
+/* result=1 if a is divisible by one of the first PRIME_SIZE primes */
+/*
+int mp_prime_is_divisible(mp_int *a, int *result);
+*/
+
+/* performs one Fermat test of "a" using base "b".
+ * Sets result to 0 if composite or 1 if probable prime
+ */
+/*
+int mp_prime_fermat(mp_int *a, mp_int *b, int *result);
+*/
+
+/* performs one Miller-Rabin test of "a" using base "b".
+ * Sets result to 0 if composite or 1 if probable prime
+ */
+/*
+int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result);
+*/
+
+/* This gives [for a given bit size] the number of trials required
+ * such that Miller-Rabin gives a prob of failure lower than 2^-96
+ */
+/*
+int mp_prime_rabin_miller_trials(int size);
+*/
+
+/* performs t rounds of Miller-Rabin on "a" using the first
+ * t prime bases. Also performs an initial sieve of trial
+ * division. Determines if "a" is prime with probability
+ * of error no more than (1/4)**t.
+ *
+ * Sets result to 1 if probably prime, 0 otherwise
+ */
+/*
+int mp_prime_is_prime(mp_int *a, int t, int *result);
+*/
+
+/* finds the next prime after the number "a" using "t" trials
+ * of Miller-Rabin.
+ *
+ * bbs_style = 1 means the prime must be congruent to 3 mod 4
+ */
+/*
+int mp_prime_next_prime(mp_int *a, int t, int bbs_style);
+*/
+
+/* makes a truly random prime of a given size (bytes),
+ * call with bbs = 1 if you want it to be congruent to 3 mod 4
+ *
+ * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can
+ * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself
+ * so it can be NULL
+ *
+ * The prime generated will be larger than 2^(8*size).
+ */
+#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat)
+
+/* makes a truly random prime of a given size (bits),
+ *
+ * Flags are as follows:
+ *
+ * LTM_PRIME_BBS - make prime congruent to 3 mod 4
+ * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS)
+ * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero
+ * LTM_PRIME_2MSB_ON - make the 2nd highest bit one
+ *
+ * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can
+ * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself
+ * so it can be NULL
+ *
+ */
+/*
+int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat);
+*/
+
+/* ---> radix conversion <--- */
+/*
+int mp_count_bits(mp_int *a);
+*/
+
+/*
+int mp_unsigned_bin_size(mp_int *a);
+*/
+/*
+int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c);
+*/
+/*
+int mp_to_unsigned_bin(mp_int *a, unsigned char *b);
+*/
+/*
+int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
+*/
+
+/*
+int mp_signed_bin_size(mp_int *a);
+*/
+/*
+int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c);
+*/
+/*
+int mp_to_signed_bin(mp_int *a, unsigned char *b);
+*/
+/*
+int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
+*/
+
+/*
+int mp_read_radix(mp_int *a, const char *str, int radix);
+*/
+/*
+int mp_toradix(mp_int *a, char *str, int radix);
+*/
+/*
+int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen);
+*/
+/*
+int mp_radix_size(mp_int *a, int radix, int *size);
+*/
+
+/*
+int mp_fread(mp_int *a, int radix, FILE *stream);
+*/
+/*
+int mp_fwrite(mp_int *a, int radix, FILE *stream);
+*/
+
+#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len))
+#define mp_raw_size(mp) mp_signed_bin_size(mp)
+#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str))
+#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len))
+#define mp_mag_size(mp) mp_unsigned_bin_size(mp)
+#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str))
+
+#define mp_tobinary(M, S) mp_toradix((M), (S), 2)
+#define mp_tooctal(M, S) mp_toradix((M), (S), 8)
+#define mp_todecimal(M, S) mp_toradix((M), (S), 10)
+#define mp_tohex(M, S) mp_toradix((M), (S), 16)
+
+/* lowlevel functions, do not call! */
+/*
+int s_mp_add(mp_int *a, mp_int *b, mp_int *c);
+*/
+/*
+int s_mp_sub(mp_int *a, mp_int *b, mp_int *c);
+*/
+#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1)
+/*
+int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
+*/
+/*
+int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
+*/
+/*
+int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
+*/
+/*
+int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
+*/
+/*
+int fast_s_mp_sqr(mp_int *a, mp_int *b);
+*/
+/*
+int s_mp_sqr(mp_int *a, mp_int *b);
+*/
+/*
+int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c);
+*/
+/*
+int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c);
+*/
+/*
+int mp_karatsuba_sqr(mp_int *a, mp_int *b);
+*/
+/*
+int mp_toom_sqr(mp_int *a, mp_int *b);
+*/
+/*
+int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
+*/
+/*
+int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c);
+*/
+/*
+int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
+*/
+/*
+int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode);
+*/
+/*
+int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode);
+*/
+/*
+void bn_reverse(unsigned char *s, int len);
+*/
+
+#if defined(BUILD_tcl) || !defined(_WIN32)
+MODULE_SCOPE const char *mp_s_rmap;
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
+
+
+/* $Source: /root/tcl/repos-to-convert/tcl/generic/tclTomMath.h,v $ */
+/* $Revision: 1.5 $ */
+/* $Date: 2005/12/13 22:43:18 $ */
+
diff --git a/generic/tclTomMathDecls.h b/generic/tclTomMathDecls.h
new file mode 100644
index 0000000..598f3f7
--- /dev/null
+++ b/generic/tclTomMathDecls.h
@@ -0,0 +1,810 @@
+/*
+ *----------------------------------------------------------------------
+ *
+ * tclTomMathDecls.h --
+ *
+ * This file contains the declarations for the 'libtommath'
+ * functions that are exported by the Tcl library.
+ *
+ * Copyright (c) 2005 by Kevin B. Kenny. All rights reserved.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * RCS: @(#) $Id: tclTomMathDecls.h,v 1.1 2005/12/13 22:43:18 kennykb Exp $
+ */
+
+#ifndef _TCLTOMMATHDECLS
+#define _TCLTOMMATHDECLS
+
+#include "tcl.h"
+
+/*
+ * Define the version of the Stubs table that's exported for tommath
+ */
+
+#define TCLTOMMATH_EPOCH 0
+#define TCLTOMMATH_REVISION 0
+
+#define Tcl_TomMath_InitStubs(interp,version) \
+ (TclTomMathInitializeStubs((interp),(version),\
+ TCLTOMMATH_EPOCH,TCLTOMMATH_REVISION))
+
+/* Define custom memory allocation for libtommath */
+
+/* MODULE_SCOPE void* TclBNAlloc( size_t ); */
+#define TclBNAlloc(s) ((void*)ckalloc((size_t)(s)))
+/* MODULE_SCOPE void* TclBNRealloc( void*, size_t ); */
+#define TclBNRealloc(x,s) ((void*)ckrealloc((char*)(x),(size_t)(s)))
+/* MODULE_SCOPE void TclBNFree( void* ); */
+#define TclBNFree(x) (ckfree((char*)(x)))
+/* MODULE_SCOPE void* TclBNCalloc( size_t, size_t ); */
+/* unused - no macro */
+
+#define XMALLOC(x) TclBNAlloc(x)
+#define XFREE(x) TclBNFree(x)
+#define XREALLOC(x,n) TclBNRealloc(x,n)
+#define XCALLOC(n,x) TclBNCalloc(n,x)
+
+/* Rename the global symbols in libtommath to avoid linkage conflicts */
+
+#define KARATSUBA_MUL_CUTOFF TclBNKaratsubaMulCutoff
+#define KARATSUBA_SQR_CUTOFF TclBNKaratsubaSqrCutoff
+#define TOOM_MUL_CUTOFF TclBNToomMulCutoff
+#define TOOM_SQR_CUTOFF TclBNToomSqrCutoff
+
+#define bn_reverse TclBN_reverse
+#define fast_s_mp_mul_digs TclBN_fast_s_mp_mul_digs
+#define fast_s_mp_sqr TclBN_fast_s_mp_sqr
+#define mp_add TclBN_mp_add
+#define mp_add_d TclBN_mp_add_d
+#define mp_and TclBN_mp_and
+#define mp_clamp TclBN_mp_clamp
+#define mp_clear TclBN_mp_clear
+#define mp_clear_multi TclBN_mp_clear_multi
+#define mp_cmp TclBN_mp_cmp
+#define mp_cmp_d TclBN_mp_cmp_d
+#define mp_cmp_mag TclBN_mp_cmp_mag
+#define mp_copy TclBN_mp_copy
+#define mp_count_bits TclBN_mp_count_bits
+#define mp_div TclBN_mp_div
+#define mp_div_2 TclBN_mp_div_2
+#define mp_div_2d TclBN_mp_div_2d
+#define mp_div_3 TclBN_mp_div_3
+#define mp_div_d TclBN_mp_div_d
+#define mp_exch TclBN_mp_exch
+#define mp_expt_d TclBN_mp_expt_d
+#define mp_grow TclBN_mp_grow
+#define mp_init TclBN_mp_init
+#define mp_init_copy TclBN_mp_init_copy
+#define mp_init_multi TclBN_mp_init_multi
+#define mp_init_set TclBN_mp_init_set
+#define mp_init_size TclBN_mp_init_size
+#define mp_karatsuba_mul TclBN_mp_karatsuba_mul
+#define mp_karatsuba_sqr TclBN_mp_karatsuba_sqr
+#define mp_lshd TclBN_mp_lshd
+#define mp_mod TclBN_mp_mod
+#define mp_mod_2d TclBN_mp_mod_2d
+#define mp_mul TclBN_mp_mul
+#define mp_mul_2 TclBN_mp_mul_2
+#define mp_mul_2d TclBN_mp_mul_2d
+#define mp_mul_d TclBN_mp_mul_d
+#define mp_neg TclBN_mp_neg
+#define mp_or TclBN_mp_or
+#define mp_radix_size TclBN_mp_radix_size
+#define mp_read_radix TclBN_mp_read_radix
+#define mp_rshd TclBN_mp_rshd
+#define mp_s_rmap TclBNMpSRmap
+#define mp_set TclBN_mp_set
+#define mp_shrink TclBN_mp_shrink
+#define mp_sqr TclBN_mp_sqr
+#define mp_sqrt TclBN_mp_sqrt
+#define mp_sub TclBN_mp_sub
+#define mp_sub_d TclBN_mp_sub_d
+#define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin
+#define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n
+#define mp_toom_mul TclBN_mp_toom_mul
+#define mp_toom_sqr TclBN_mp_toom_sqr
+#define mp_toradix_n TclBN_mp_toradix_n
+#define mp_unsigned_bin_size TclBN_mp_unsigned_bin_size
+#define mp_xor TclBN_mp_xor
+#define mp_zero TclBN_mp_zero
+#define s_mp_add TclBN_s_mp_add
+#define s_mp_mul_digs TclBN_s_mp_mul_digs
+#define s_mp_sqr TclBN_s_mp_sqr
+#define s_mp_sub TclBN_s_mp_sub
+
+#undef TCL_STORAGE_CLASS
+#ifdef BUILD_tcl
+# define TCL_STORAGE_CLASS DLLEXPORT
+#else
+# ifdef USE_TCL_STUBS
+# define TCL_STORAGE_CLASS
+# else
+# define TCL_STORAGE_CLASS DLLIMPORT
+# endif
+#endif
+
+/*
+ * WARNING: This file is automatically generated by the tools/genStubs.tcl
+ * script. Any modifications to the function declarations below should be made
+ * in the generic/tclInt.decls script.
+ */
+
+/* !BEGIN!: Do not edit below this line. */
+
+/*
+ * Exported function declarations:
+ */
+
+#ifndef TclBN_epoch_TCL_DECLARED
+#define TclBN_epoch_TCL_DECLARED
+/* 0 */
+EXTERN int TclBN_epoch _ANSI_ARGS_((void));
+#endif
+#ifndef TclBN_revision_TCL_DECLARED
+#define TclBN_revision_TCL_DECLARED
+/* 1 */
+EXTERN int TclBN_revision _ANSI_ARGS_((void));
+#endif
+#ifndef TclBN_mp_add_TCL_DECLARED
+#define TclBN_mp_add_TCL_DECLARED
+/* 2 */
+EXTERN int TclBN_mp_add _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_add_d_TCL_DECLARED
+#define TclBN_mp_add_d_TCL_DECLARED
+/* 3 */
+EXTERN int TclBN_mp_add_d _ANSI_ARGS_((mp_int* a, mp_digit b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_and_TCL_DECLARED
+#define TclBN_mp_and_TCL_DECLARED
+/* 4 */
+EXTERN int TclBN_mp_and _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_clamp_TCL_DECLARED
+#define TclBN_mp_clamp_TCL_DECLARED
+/* 5 */
+EXTERN void TclBN_mp_clamp _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_clear_TCL_DECLARED
+#define TclBN_mp_clear_TCL_DECLARED
+/* 6 */
+EXTERN void TclBN_mp_clear _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_clear_multi_TCL_DECLARED
+#define TclBN_mp_clear_multi_TCL_DECLARED
+/* 7 */
+EXTERN void TclBN_mp_clear_multi _ANSI_ARGS_((mp_int*a, ...));
+#endif
+#ifndef TclBN_mp_cmp_TCL_DECLARED
+#define TclBN_mp_cmp_TCL_DECLARED
+/* 8 */
+EXTERN int TclBN_mp_cmp _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_cmp_d_TCL_DECLARED
+#define TclBN_mp_cmp_d_TCL_DECLARED
+/* 9 */
+EXTERN int TclBN_mp_cmp_d _ANSI_ARGS_((mp_int* a, mp_digit b));
+#endif
+#ifndef TclBN_mp_cmp_mag_TCL_DECLARED
+#define TclBN_mp_cmp_mag_TCL_DECLARED
+/* 10 */
+EXTERN int TclBN_mp_cmp_mag _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_copy_TCL_DECLARED
+#define TclBN_mp_copy_TCL_DECLARED
+/* 11 */
+EXTERN int TclBN_mp_copy _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_count_bits_TCL_DECLARED
+#define TclBN_mp_count_bits_TCL_DECLARED
+/* 12 */
+EXTERN int TclBN_mp_count_bits _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_div_TCL_DECLARED
+#define TclBN_mp_div_TCL_DECLARED
+/* 13 */
+EXTERN int TclBN_mp_div _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* q, mp_int* r));
+#endif
+#ifndef TclBN_mp_div_d_TCL_DECLARED
+#define TclBN_mp_div_d_TCL_DECLARED
+/* 14 */
+EXTERN int TclBN_mp_div_d _ANSI_ARGS_((mp_int* a, mp_digit b,
+ mp_int* q, mp_digit* r));
+#endif
+#ifndef TclBN_mp_div_2_TCL_DECLARED
+#define TclBN_mp_div_2_TCL_DECLARED
+/* 15 */
+EXTERN int TclBN_mp_div_2 _ANSI_ARGS_((mp_int* a, mp_int* q));
+#endif
+#ifndef TclBN_mp_div_2d_TCL_DECLARED
+#define TclBN_mp_div_2d_TCL_DECLARED
+/* 16 */
+EXTERN int TclBN_mp_div_2d _ANSI_ARGS_((mp_int* a, int b,
+ mp_int* q, mp_int* r));
+#endif
+#ifndef TclBN_mp_div_3_TCL_DECLARED
+#define TclBN_mp_div_3_TCL_DECLARED
+/* 17 */
+EXTERN int TclBN_mp_div_3 _ANSI_ARGS_((mp_int* a, mp_int* q,
+ mp_digit* r));
+#endif
+#ifndef TclBN_mp_exch_TCL_DECLARED
+#define TclBN_mp_exch_TCL_DECLARED
+/* 18 */
+EXTERN void TclBN_mp_exch _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_expt_d_TCL_DECLARED
+#define TclBN_mp_expt_d_TCL_DECLARED
+/* 19 */
+EXTERN int TclBN_mp_expt_d _ANSI_ARGS_((mp_int* a, mp_digit b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_grow_TCL_DECLARED
+#define TclBN_mp_grow_TCL_DECLARED
+/* 20 */
+EXTERN int TclBN_mp_grow _ANSI_ARGS_((mp_int* a, int size));
+#endif
+#ifndef TclBN_mp_init_TCL_DECLARED
+#define TclBN_mp_init_TCL_DECLARED
+/* 21 */
+EXTERN int TclBN_mp_init _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_init_copy_TCL_DECLARED
+#define TclBN_mp_init_copy_TCL_DECLARED
+/* 22 */
+EXTERN int TclBN_mp_init_copy _ANSI_ARGS_((mp_int * a,
+ mp_int* b));
+#endif
+#ifndef TclBN_mp_init_multi_TCL_DECLARED
+#define TclBN_mp_init_multi_TCL_DECLARED
+/* 23 */
+EXTERN int TclBN_mp_init_multi _ANSI_ARGS_((mp_int*a, ...));
+#endif
+#ifndef TclBN_mp_init_set_TCL_DECLARED
+#define TclBN_mp_init_set_TCL_DECLARED
+/* 24 */
+EXTERN int TclBN_mp_init_set _ANSI_ARGS_((mp_int* a, mp_digit b));
+#endif
+#ifndef TclBN_mp_init_size_TCL_DECLARED
+#define TclBN_mp_init_size_TCL_DECLARED
+/* 25 */
+EXTERN int TclBN_mp_init_size _ANSI_ARGS_((mp_int* a, int size));
+#endif
+#ifndef TclBN_mp_lshd_TCL_DECLARED
+#define TclBN_mp_lshd_TCL_DECLARED
+/* 26 */
+EXTERN int TclBN_mp_lshd _ANSI_ARGS_((mp_int* a, int shift));
+#endif
+#ifndef TclBN_mp_mod_TCL_DECLARED
+#define TclBN_mp_mod_TCL_DECLARED
+/* 27 */
+EXTERN int TclBN_mp_mod _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* r));
+#endif
+#ifndef TclBN_mp_mod_2d_TCL_DECLARED
+#define TclBN_mp_mod_2d_TCL_DECLARED
+/* 28 */
+EXTERN int TclBN_mp_mod_2d _ANSI_ARGS_((mp_int* a, int b,
+ mp_int* r));
+#endif
+#ifndef TclBN_mp_mul_TCL_DECLARED
+#define TclBN_mp_mul_TCL_DECLARED
+/* 29 */
+EXTERN int TclBN_mp_mul _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* p));
+#endif
+#ifndef TclBN_mp_mul_d_TCL_DECLARED
+#define TclBN_mp_mul_d_TCL_DECLARED
+/* 30 */
+EXTERN int TclBN_mp_mul_d _ANSI_ARGS_((mp_int* a, mp_digit b,
+ mp_int* p));
+#endif
+#ifndef TclBN_mp_mul_2_TCL_DECLARED
+#define TclBN_mp_mul_2_TCL_DECLARED
+/* 31 */
+EXTERN int TclBN_mp_mul_2 _ANSI_ARGS_((mp_int* a, mp_int* p));
+#endif
+#ifndef TclBN_mp_mul_2d_TCL_DECLARED
+#define TclBN_mp_mul_2d_TCL_DECLARED
+/* 32 */
+EXTERN int TclBN_mp_mul_2d _ANSI_ARGS_((mp_int* a, int d,
+ mp_int* p));
+#endif
+#ifndef TclBN_mp_neg_TCL_DECLARED
+#define TclBN_mp_neg_TCL_DECLARED
+/* 33 */
+EXTERN int TclBN_mp_neg _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_or_TCL_DECLARED
+#define TclBN_mp_or_TCL_DECLARED
+/* 34 */
+EXTERN int TclBN_mp_or _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_radix_size_TCL_DECLARED
+#define TclBN_mp_radix_size_TCL_DECLARED
+/* 35 */
+EXTERN int TclBN_mp_radix_size _ANSI_ARGS_((mp_int* a,
+ int radix, int* size));
+#endif
+#ifndef TclBN_mp_read_radix_TCL_DECLARED
+#define TclBN_mp_read_radix_TCL_DECLARED
+/* 36 */
+EXTERN int TclBN_mp_read_radix _ANSI_ARGS_((mp_int* a,
+ const char* str, int radix));
+#endif
+#ifndef TclBN_mp_rshd_TCL_DECLARED
+#define TclBN_mp_rshd_TCL_DECLARED
+/* 37 */
+EXTERN void TclBN_mp_rshd _ANSI_ARGS_((mp_int * a, int shift));
+#endif
+#ifndef TclBN_mp_shrink_TCL_DECLARED
+#define TclBN_mp_shrink_TCL_DECLARED
+/* 38 */
+EXTERN int TclBN_mp_shrink _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_set_TCL_DECLARED
+#define TclBN_mp_set_TCL_DECLARED
+/* 39 */
+EXTERN void TclBN_mp_set _ANSI_ARGS_((mp_int* a, mp_digit b));
+#endif
+#ifndef TclBN_mp_sqr_TCL_DECLARED
+#define TclBN_mp_sqr_TCL_DECLARED
+/* 40 */
+EXTERN int TclBN_mp_sqr _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_sqrt_TCL_DECLARED
+#define TclBN_mp_sqrt_TCL_DECLARED
+/* 41 */
+EXTERN int TclBN_mp_sqrt _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_mp_sub_TCL_DECLARED
+#define TclBN_mp_sub_TCL_DECLARED
+/* 42 */
+EXTERN int TclBN_mp_sub _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_sub_d_TCL_DECLARED
+#define TclBN_mp_sub_d_TCL_DECLARED
+/* 43 */
+EXTERN int TclBN_mp_sub_d _ANSI_ARGS_((mp_int* a, mp_digit b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_to_unsigned_bin_TCL_DECLARED
+#define TclBN_mp_to_unsigned_bin_TCL_DECLARED
+/* 44 */
+EXTERN int TclBN_mp_to_unsigned_bin _ANSI_ARGS_((mp_int* a,
+ unsigned char* b));
+#endif
+#ifndef TclBN_mp_to_unsigned_bin_n_TCL_DECLARED
+#define TclBN_mp_to_unsigned_bin_n_TCL_DECLARED
+/* 45 */
+EXTERN int TclBN_mp_to_unsigned_bin_n _ANSI_ARGS_((mp_int* a,
+ unsigned char* b, unsigned long* outlen));
+#endif
+#ifndef TclBN_mp_toradix_n_TCL_DECLARED
+#define TclBN_mp_toradix_n_TCL_DECLARED
+/* 46 */
+EXTERN int TclBN_mp_toradix_n _ANSI_ARGS_((mp_int* a, char* str,
+ int radix, int maxlen));
+#endif
+#ifndef TclBN_mp_unsigned_bin_size_TCL_DECLARED
+#define TclBN_mp_unsigned_bin_size_TCL_DECLARED
+/* 47 */
+EXTERN int TclBN_mp_unsigned_bin_size _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_mp_xor_TCL_DECLARED
+#define TclBN_mp_xor_TCL_DECLARED
+/* 48 */
+EXTERN int TclBN_mp_xor _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_zero_TCL_DECLARED
+#define TclBN_mp_zero_TCL_DECLARED
+/* 49 */
+EXTERN void TclBN_mp_zero _ANSI_ARGS_((mp_int* a));
+#endif
+#ifndef TclBN_reverse_TCL_DECLARED
+#define TclBN_reverse_TCL_DECLARED
+/* 50 */
+EXTERN void TclBN_reverse _ANSI_ARGS_((unsigned char* s, int len));
+#endif
+#ifndef TclBN_fast_s_mp_mul_digs_TCL_DECLARED
+#define TclBN_fast_s_mp_mul_digs_TCL_DECLARED
+/* 51 */
+EXTERN int TclBN_fast_s_mp_mul_digs _ANSI_ARGS_((mp_int * a,
+ mp_int * b, mp_int * c, int digs));
+#endif
+#ifndef TclBN_fast_s_mp_sqr_TCL_DECLARED
+#define TclBN_fast_s_mp_sqr_TCL_DECLARED
+/* 52 */
+EXTERN int TclBN_fast_s_mp_sqr _ANSI_ARGS_((mp_int* a,
+ mp_int* b));
+#endif
+#ifndef TclBN_mp_karatsuba_mul_TCL_DECLARED
+#define TclBN_mp_karatsuba_mul_TCL_DECLARED
+/* 53 */
+EXTERN int TclBN_mp_karatsuba_mul _ANSI_ARGS_((mp_int* a,
+ mp_int* b, mp_int* c));
+#endif
+#ifndef TclBN_mp_karatsuba_sqr_TCL_DECLARED
+#define TclBN_mp_karatsuba_sqr_TCL_DECLARED
+/* 54 */
+EXTERN int TclBN_mp_karatsuba_sqr _ANSI_ARGS_((mp_int* a,
+ mp_int* b));
+#endif
+#ifndef TclBN_mp_toom_mul_TCL_DECLARED
+#define TclBN_mp_toom_mul_TCL_DECLARED
+/* 55 */
+EXTERN int TclBN_mp_toom_mul _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_mp_toom_sqr_TCL_DECLARED
+#define TclBN_mp_toom_sqr_TCL_DECLARED
+/* 56 */
+EXTERN int TclBN_mp_toom_sqr _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_s_mp_add_TCL_DECLARED
+#define TclBN_s_mp_add_TCL_DECLARED
+/* 57 */
+EXTERN int TclBN_s_mp_add _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+#ifndef TclBN_s_mp_mul_digs_TCL_DECLARED
+#define TclBN_s_mp_mul_digs_TCL_DECLARED
+/* 58 */
+EXTERN int TclBN_s_mp_mul_digs _ANSI_ARGS_((mp_int* a,
+ mp_int* b, mp_int* c, int digs));
+#endif
+#ifndef TclBN_s_mp_sqr_TCL_DECLARED
+#define TclBN_s_mp_sqr_TCL_DECLARED
+/* 59 */
+EXTERN int TclBN_s_mp_sqr _ANSI_ARGS_((mp_int* a, mp_int* b));
+#endif
+#ifndef TclBN_s_mp_sub_TCL_DECLARED
+#define TclBN_s_mp_sub_TCL_DECLARED
+/* 60 */
+EXTERN int TclBN_s_mp_sub _ANSI_ARGS_((mp_int* a, mp_int* b,
+ mp_int* c));
+#endif
+
+typedef struct TclTomMathStubs {
+ int magic;
+ struct TclTomMathStubHooks *hooks;
+
+ int (*tclBN_epoch) _ANSI_ARGS_((void)); /* 0 */
+ int (*tclBN_revision) _ANSI_ARGS_((void)); /* 1 */
+ int (*tclBN_mp_add) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 2 */
+ int (*tclBN_mp_add_d) _ANSI_ARGS_((mp_int* a, mp_digit b, mp_int* c)); /* 3 */
+ int (*tclBN_mp_and) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 4 */
+ void (*tclBN_mp_clamp) _ANSI_ARGS_((mp_int* a)); /* 5 */
+ void (*tclBN_mp_clear) _ANSI_ARGS_((mp_int* a)); /* 6 */
+ void (*tclBN_mp_clear_multi) _ANSI_ARGS_((mp_int*a, ...)); /* 7 */
+ int (*tclBN_mp_cmp) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 8 */
+ int (*tclBN_mp_cmp_d) _ANSI_ARGS_((mp_int* a, mp_digit b)); /* 9 */
+ int (*tclBN_mp_cmp_mag) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 10 */
+ int (*tclBN_mp_copy) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 11 */
+ int (*tclBN_mp_count_bits) _ANSI_ARGS_((mp_int* a)); /* 12 */
+ int (*tclBN_mp_div) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* q, mp_int* r)); /* 13 */
+ int (*tclBN_mp_div_d) _ANSI_ARGS_((mp_int* a, mp_digit b, mp_int* q, mp_digit* r)); /* 14 */
+ int (*tclBN_mp_div_2) _ANSI_ARGS_((mp_int* a, mp_int* q)); /* 15 */
+ int (*tclBN_mp_div_2d) _ANSI_ARGS_((mp_int* a, int b, mp_int* q, mp_int* r)); /* 16 */
+ int (*tclBN_mp_div_3) _ANSI_ARGS_((mp_int* a, mp_int* q, mp_digit* r)); /* 17 */
+ void (*tclBN_mp_exch) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 18 */
+ int (*tclBN_mp_expt_d) _ANSI_ARGS_((mp_int* a, mp_digit b, mp_int* c)); /* 19 */
+ int (*tclBN_mp_grow) _ANSI_ARGS_((mp_int* a, int size)); /* 20 */
+ int (*tclBN_mp_init) _ANSI_ARGS_((mp_int* a)); /* 21 */
+ int (*tclBN_mp_init_copy) _ANSI_ARGS_((mp_int * a, mp_int* b)); /* 22 */
+ int (*tclBN_mp_init_multi) _ANSI_ARGS_((mp_int*a, ...)); /* 23 */
+ int (*tclBN_mp_init_set) _ANSI_ARGS_((mp_int* a, mp_digit b)); /* 24 */
+ int (*tclBN_mp_init_size) _ANSI_ARGS_((mp_int* a, int size)); /* 25 */
+ int (*tclBN_mp_lshd) _ANSI_ARGS_((mp_int* a, int shift)); /* 26 */
+ int (*tclBN_mp_mod) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* r)); /* 27 */
+ int (*tclBN_mp_mod_2d) _ANSI_ARGS_((mp_int* a, int b, mp_int* r)); /* 28 */
+ int (*tclBN_mp_mul) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* p)); /* 29 */
+ int (*tclBN_mp_mul_d) _ANSI_ARGS_((mp_int* a, mp_digit b, mp_int* p)); /* 30 */
+ int (*tclBN_mp_mul_2) _ANSI_ARGS_((mp_int* a, mp_int* p)); /* 31 */
+ int (*tclBN_mp_mul_2d) _ANSI_ARGS_((mp_int* a, int d, mp_int* p)); /* 32 */
+ int (*tclBN_mp_neg) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 33 */
+ int (*tclBN_mp_or) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 34 */
+ int (*tclBN_mp_radix_size) _ANSI_ARGS_((mp_int* a, int radix, int* size)); /* 35 */
+ int (*tclBN_mp_read_radix) _ANSI_ARGS_((mp_int* a, const char* str, int radix)); /* 36 */
+ void (*tclBN_mp_rshd) _ANSI_ARGS_((mp_int * a, int shift)); /* 37 */
+ int (*tclBN_mp_shrink) _ANSI_ARGS_((mp_int* a)); /* 38 */
+ void (*tclBN_mp_set) _ANSI_ARGS_((mp_int* a, mp_digit b)); /* 39 */
+ int (*tclBN_mp_sqr) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 40 */
+ int (*tclBN_mp_sqrt) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 41 */
+ int (*tclBN_mp_sub) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 42 */
+ int (*tclBN_mp_sub_d) _ANSI_ARGS_((mp_int* a, mp_digit b, mp_int* c)); /* 43 */
+ int (*tclBN_mp_to_unsigned_bin) _ANSI_ARGS_((mp_int* a, unsigned char* b)); /* 44 */
+ int (*tclBN_mp_to_unsigned_bin_n) _ANSI_ARGS_((mp_int* a, unsigned char* b, unsigned long* outlen)); /* 45 */
+ int (*tclBN_mp_toradix_n) _ANSI_ARGS_((mp_int* a, char* str, int radix, int maxlen)); /* 46 */
+ int (*tclBN_mp_unsigned_bin_size) _ANSI_ARGS_((mp_int* a)); /* 47 */
+ int (*tclBN_mp_xor) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 48 */
+ void (*tclBN_mp_zero) _ANSI_ARGS_((mp_int* a)); /* 49 */
+ void (*tclBN_reverse) _ANSI_ARGS_((unsigned char* s, int len)); /* 50 */
+ int (*tclBN_fast_s_mp_mul_digs) _ANSI_ARGS_((mp_int * a, mp_int * b, mp_int * c, int digs)); /* 51 */
+ int (*tclBN_fast_s_mp_sqr) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 52 */
+ int (*tclBN_mp_karatsuba_mul) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 53 */
+ int (*tclBN_mp_karatsuba_sqr) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 54 */
+ int (*tclBN_mp_toom_mul) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 55 */
+ int (*tclBN_mp_toom_sqr) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 56 */
+ int (*tclBN_s_mp_add) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 57 */
+ int (*tclBN_s_mp_mul_digs) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c, int digs)); /* 58 */
+ int (*tclBN_s_mp_sqr) _ANSI_ARGS_((mp_int* a, mp_int* b)); /* 59 */
+ int (*tclBN_s_mp_sub) _ANSI_ARGS_((mp_int* a, mp_int* b, mp_int* c)); /* 60 */
+} TclTomMathStubs;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern TclTomMathStubs *tclTomMathStubsPtr;
+#ifdef __cplusplus
+}
+#endif
+
+#if defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS)
+
+/*
+ * Inline function declarations:
+ */
+
+#ifndef TclBN_epoch
+#define TclBN_epoch \
+ (tclTomMathStubsPtr->tclBN_epoch) /* 0 */
+#endif
+#ifndef TclBN_revision
+#define TclBN_revision \
+ (tclTomMathStubsPtr->tclBN_revision) /* 1 */
+#endif
+#ifndef TclBN_mp_add
+#define TclBN_mp_add \
+ (tclTomMathStubsPtr->tclBN_mp_add) /* 2 */
+#endif
+#ifndef TclBN_mp_add_d
+#define TclBN_mp_add_d \
+ (tclTomMathStubsPtr->tclBN_mp_add_d) /* 3 */
+#endif
+#ifndef TclBN_mp_and
+#define TclBN_mp_and \
+ (tclTomMathStubsPtr->tclBN_mp_and) /* 4 */
+#endif
+#ifndef TclBN_mp_clamp
+#define TclBN_mp_clamp \
+ (tclTomMathStubsPtr->tclBN_mp_clamp) /* 5 */
+#endif
+#ifndef TclBN_mp_clear
+#define TclBN_mp_clear \
+ (tclTomMathStubsPtr->tclBN_mp_clear) /* 6 */
+#endif
+#ifndef TclBN_mp_clear_multi
+#define TclBN_mp_clear_multi \
+ (tclTomMathStubsPtr->tclBN_mp_clear_multi) /* 7 */
+#endif
+#ifndef TclBN_mp_cmp
+#define TclBN_mp_cmp \
+ (tclTomMathStubsPtr->tclBN_mp_cmp) /* 8 */
+#endif
+#ifndef TclBN_mp_cmp_d
+#define TclBN_mp_cmp_d \
+ (tclTomMathStubsPtr->tclBN_mp_cmp_d) /* 9 */
+#endif
+#ifndef TclBN_mp_cmp_mag
+#define TclBN_mp_cmp_mag \
+ (tclTomMathStubsPtr->tclBN_mp_cmp_mag) /* 10 */
+#endif
+#ifndef TclBN_mp_copy
+#define TclBN_mp_copy \
+ (tclTomMathStubsPtr->tclBN_mp_copy) /* 11 */
+#endif
+#ifndef TclBN_mp_count_bits
+#define TclBN_mp_count_bits \
+ (tclTomMathStubsPtr->tclBN_mp_count_bits) /* 12 */
+#endif
+#ifndef TclBN_mp_div
+#define TclBN_mp_div \
+ (tclTomMathStubsPtr->tclBN_mp_div) /* 13 */
+#endif
+#ifndef TclBN_mp_div_d
+#define TclBN_mp_div_d \
+ (tclTomMathStubsPtr->tclBN_mp_div_d) /* 14 */
+#endif
+#ifndef TclBN_mp_div_2
+#define TclBN_mp_div_2 \
+ (tclTomMathStubsPtr->tclBN_mp_div_2) /* 15 */
+#endif
+#ifndef TclBN_mp_div_2d
+#define TclBN_mp_div_2d \
+ (tclTomMathStubsPtr->tclBN_mp_div_2d) /* 16 */
+#endif
+#ifndef TclBN_mp_div_3
+#define TclBN_mp_div_3 \
+ (tclTomMathStubsPtr->tclBN_mp_div_3) /* 17 */
+#endif
+#ifndef TclBN_mp_exch
+#define TclBN_mp_exch \
+ (tclTomMathStubsPtr->tclBN_mp_exch) /* 18 */
+#endif
+#ifndef TclBN_mp_expt_d
+#define TclBN_mp_expt_d \
+ (tclTomMathStubsPtr->tclBN_mp_expt_d) /* 19 */
+#endif
+#ifndef TclBN_mp_grow
+#define TclBN_mp_grow \
+ (tclTomMathStubsPtr->tclBN_mp_grow) /* 20 */
+#endif
+#ifndef TclBN_mp_init
+#define TclBN_mp_init \
+ (tclTomMathStubsPtr->tclBN_mp_init) /* 21 */
+#endif
+#ifndef TclBN_mp_init_copy
+#define TclBN_mp_init_copy \
+ (tclTomMathStubsPtr->tclBN_mp_init_copy) /* 22 */
+#endif
+#ifndef TclBN_mp_init_multi
+#define TclBN_mp_init_multi \
+ (tclTomMathStubsPtr->tclBN_mp_init_multi) /* 23 */
+#endif
+#ifndef TclBN_mp_init_set
+#define TclBN_mp_init_set \
+ (tclTomMathStubsPtr->tclBN_mp_init_set) /* 24 */
+#endif
+#ifndef TclBN_mp_init_size
+#define TclBN_mp_init_size \
+ (tclTomMathStubsPtr->tclBN_mp_init_size) /* 25 */
+#endif
+#ifndef TclBN_mp_lshd
+#define TclBN_mp_lshd \
+ (tclTomMathStubsPtr->tclBN_mp_lshd) /* 26 */
+#endif
+#ifndef TclBN_mp_mod
+#define TclBN_mp_mod \
+ (tclTomMathStubsPtr->tclBN_mp_mod) /* 27 */
+#endif
+#ifndef TclBN_mp_mod_2d
+#define TclBN_mp_mod_2d \
+ (tclTomMathStubsPtr->tclBN_mp_mod_2d) /* 28 */
+#endif
+#ifndef TclBN_mp_mul
+#define TclBN_mp_mul \
+ (tclTomMathStubsPtr->tclBN_mp_mul) /* 29 */
+#endif
+#ifndef TclBN_mp_mul_d
+#define TclBN_mp_mul_d \
+ (tclTomMathStubsPtr->tclBN_mp_mul_d) /* 30 */
+#endif
+#ifndef TclBN_mp_mul_2
+#define TclBN_mp_mul_2 \
+ (tclTomMathStubsPtr->tclBN_mp_mul_2) /* 31 */
+#endif
+#ifndef TclBN_mp_mul_2d
+#define TclBN_mp_mul_2d \
+ (tclTomMathStubsPtr->tclBN_mp_mul_2d) /* 32 */
+#endif
+#ifndef TclBN_mp_neg
+#define TclBN_mp_neg \
+ (tclTomMathStubsPtr->tclBN_mp_neg) /* 33 */
+#endif
+#ifndef TclBN_mp_or
+#define TclBN_mp_or \
+ (tclTomMathStubsPtr->tclBN_mp_or) /* 34 */
+#endif
+#ifndef TclBN_mp_radix_size
+#define TclBN_mp_radix_size \
+ (tclTomMathStubsPtr->tclBN_mp_radix_size) /* 35 */
+#endif
+#ifndef TclBN_mp_read_radix
+#define TclBN_mp_read_radix \
+ (tclTomMathStubsPtr->tclBN_mp_read_radix) /* 36 */
+#endif
+#ifndef TclBN_mp_rshd
+#define TclBN_mp_rshd \
+ (tclTomMathStubsPtr->tclBN_mp_rshd) /* 37 */
+#endif
+#ifndef TclBN_mp_shrink
+#define TclBN_mp_shrink \
+ (tclTomMathStubsPtr->tclBN_mp_shrink) /* 38 */
+#endif
+#ifndef TclBN_mp_set
+#define TclBN_mp_set \
+ (tclTomMathStubsPtr->tclBN_mp_set) /* 39 */
+#endif
+#ifndef TclBN_mp_sqr
+#define TclBN_mp_sqr \
+ (tclTomMathStubsPtr->tclBN_mp_sqr) /* 40 */
+#endif
+#ifndef TclBN_mp_sqrt
+#define TclBN_mp_sqrt \
+ (tclTomMathStubsPtr->tclBN_mp_sqrt) /* 41 */
+#endif
+#ifndef TclBN_mp_sub
+#define TclBN_mp_sub \
+ (tclTomMathStubsPtr->tclBN_mp_sub) /* 42 */
+#endif
+#ifndef TclBN_mp_sub_d
+#define TclBN_mp_sub_d \
+ (tclTomMathStubsPtr->tclBN_mp_sub_d) /* 43 */
+#endif
+#ifndef TclBN_mp_to_unsigned_bin
+#define TclBN_mp_to_unsigned_bin \
+ (tclTomMathStubsPtr->tclBN_mp_to_unsigned_bin) /* 44 */
+#endif
+#ifndef TclBN_mp_to_unsigned_bin_n
+#define TclBN_mp_to_unsigned_bin_n \
+ (tclTomMathStubsPtr->tclBN_mp_to_unsigned_bin_n) /* 45 */
+#endif
+#ifndef TclBN_mp_toradix_n
+#define TclBN_mp_toradix_n \
+ (tclTomMathStubsPtr->tclBN_mp_toradix_n) /* 46 */
+#endif
+#ifndef TclBN_mp_unsigned_bin_size
+#define TclBN_mp_unsigned_bin_size \
+ (tclTomMathStubsPtr->tclBN_mp_unsigned_bin_size) /* 47 */
+#endif
+#ifndef TclBN_mp_xor
+#define TclBN_mp_xor \
+ (tclTomMathStubsPtr->tclBN_mp_xor) /* 48 */
+#endif
+#ifndef TclBN_mp_zero
+#define TclBN_mp_zero \
+ (tclTomMathStubsPtr->tclBN_mp_zero) /* 49 */
+#endif
+#ifndef TclBN_reverse
+#define TclBN_reverse \
+ (tclTomMathStubsPtr->tclBN_reverse) /* 50 */
+#endif
+#ifndef TclBN_fast_s_mp_mul_digs
+#define TclBN_fast_s_mp_mul_digs \
+ (tclTomMathStubsPtr->tclBN_fast_s_mp_mul_digs) /* 51 */
+#endif
+#ifndef TclBN_fast_s_mp_sqr
+#define TclBN_fast_s_mp_sqr \
+ (tclTomMathStubsPtr->tclBN_fast_s_mp_sqr) /* 52 */
+#endif
+#ifndef TclBN_mp_karatsuba_mul
+#define TclBN_mp_karatsuba_mul \
+ (tclTomMathStubsPtr->tclBN_mp_karatsuba_mul) /* 53 */
+#endif
+#ifndef TclBN_mp_karatsuba_sqr
+#define TclBN_mp_karatsuba_sqr \
+ (tclTomMathStubsPtr->tclBN_mp_karatsuba_sqr) /* 54 */
+#endif
+#ifndef TclBN_mp_toom_mul
+#define TclBN_mp_toom_mul \
+ (tclTomMathStubsPtr->tclBN_mp_toom_mul) /* 55 */
+#endif
+#ifndef TclBN_mp_toom_sqr
+#define TclBN_mp_toom_sqr \
+ (tclTomMathStubsPtr->tclBN_mp_toom_sqr) /* 56 */
+#endif
+#ifndef TclBN_s_mp_add
+#define TclBN_s_mp_add \
+ (tclTomMathStubsPtr->tclBN_s_mp_add) /* 57 */
+#endif
+#ifndef TclBN_s_mp_mul_digs
+#define TclBN_s_mp_mul_digs \
+ (tclTomMathStubsPtr->tclBN_s_mp_mul_digs) /* 58 */
+#endif
+#ifndef TclBN_s_mp_sqr
+#define TclBN_s_mp_sqr \
+ (tclTomMathStubsPtr->tclBN_s_mp_sqr) /* 59 */
+#endif
+#ifndef TclBN_s_mp_sub
+#define TclBN_s_mp_sub \
+ (tclTomMathStubsPtr->tclBN_s_mp_sub) /* 60 */
+#endif
+
+#endif /* defined(USE_TCL_STUBS) && !defined(USE_TCL_STUB_PROCS) */
+
+/* !END!: Do not edit above this line. */
+
+#undef TCL_STORAGE_CLASS
+#define TCL_STORAGE_CLASS DLLIMPORT
+
+#endif /* _TCLINTDECLS */
diff --git a/generic/tclTomMathInterface.c b/generic/tclTomMathInterface.c
index bf62963..65eddcf 100644
--- a/generic/tclTomMathInterface.c
+++ b/generic/tclTomMathInterface.c
@@ -11,12 +11,86 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclTomMathInterface.c,v 1.5 2005/10/13 00:14:38 dgp Exp $
+ * RCS: @(#) $Id: tclTomMathInterface.c,v 1.6 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
#include "tommath.h"
#include <limits.h>
+
+extern TclTomMathStubs tclTomMathStubs;
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclTommath_Init --
+ *
+ * Initializes the TclTomMath 'package', which exists as a
+ * placeholder so that the package data can be used to hold
+ * a stub table pointer.
+ *
+ * Results:
+ * Returns a standard Tcl result.
+ *
+ * Side effects:
+ * Installs the stub table for tommath.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclTommath_Init(
+ Tcl_Interp* interp /* Tcl interpreter */
+) {
+ if (Tcl_PkgProvideEx(interp, "tcl::tommath", TCL_VERSION,
+ (ClientData)&tclTomMathStubs) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ return TCL_OK;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclBN_epoch --
+ *
+ * Return the epoch number of the TclTomMath stubs table
+ *
+ * Results:
+ * Returns an arbitrary integer that does not decrease with
+ * release. Stubs tables with different epochs are incompatible.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclBN_epoch()
+{
+ return TCLTOMMATH_EPOCH;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclBN_revision --
+ *
+ * Returns the revision level of the TclTomMath stubs table
+ *
+ * Results:
+ * Returns an arbitrary integer that increases with revisions.
+ * If a client requires a given epoch and revision, any Stubs table
+ * with the same epoch and an equal or higher revision satisfies
+ * the request.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclBN_revision()
+{
+ return TCLTOMMATH_REVISION;
+}
+#if 0
/*
*----------------------------------------------------------------------
@@ -57,7 +131,7 @@ TclBNAlloc(
*----------------------------------------------------------------------
*/
-extern void *
+void *
TclBNRealloc(
void *p,
size_t s)
@@ -90,6 +164,7 @@ TclBNFree(
{
Tcl_Free((char *) p);
}
+#endif
/*
*----------------------------------------------------------------------
diff --git a/generic/tommath.h b/generic/tommath.h
index 8bb3675..4ce3e43 100644
--- a/generic/tommath.h
+++ b/generic/tommath.h
@@ -1,611 +1 @@
-/* LibTomMath, multiple-precision integer library -- Tom St Denis
- *
- * LibTomMath is a library that provides multiple-precision
- * integer arithmetic as well as number theoretic functionality.
- *
- * The library was designed directly after the MPI library by
- * Michael Fromberger but has been written from scratch with
- * additional optimizations in place.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- *
- * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org
- */
-#ifndef BN_H_
-#define BN_H_
-
-#ifdef TCL_TOMMATH
-#include <tclTomMath.h>
-#endif
-#ifndef TOMMATH_STORAGE_CLASS
-#define TOMMATH_STORAGE_CLASS extern
-#endif
-#ifndef MODULE_SCOPE
-#define MODULE_SCOPE extern
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <limits.h>
-
-#include <tommath_class.h>
-
-#ifndef MIN
- #define MIN(x,y) ((x)<(y)?(x):(y))
-#endif
-
-#ifndef MAX
- #define MAX(x,y) ((x)>(y)?(x):(y))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-
-/* C++ compilers don't like assigning void * to mp_digit * */
-#define OPT_CAST(x) (x *)
-
-#else
-
-/* C on the other hand doesn't care */
-#define OPT_CAST(x)
-
-#endif
-
-
-/* detect 64-bit mode if possible */
-#if defined(__x86_64__)
- #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT))
- #define MP_64BIT
- #endif
-#endif
-
-/* some default configurations.
- *
- * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits
- * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits
- *
- * At the very least a mp_digit must be able to hold 7 bits
- * [any size beyond that is ok provided it doesn't overflow the data type]
- */
-#ifdef MP_8BIT
-#ifndef MP_DIGIT_DECLARED
- typedef unsigned char mp_digit;
-#define MP_DIGIT_DECLARED
-#endif
- typedef unsigned short mp_word;
-#elif defined(MP_16BIT)
-#ifndef MP_DIGIT_DECLARED
- typedef unsigned short mp_digit;
-#define MP_DIGIT_DECLARED
-#endif
- typedef unsigned long mp_word;
-#elif defined(MP_64BIT)
- /* for GCC only on supported platforms */
-#ifndef CRYPT
- typedef unsigned long long ulong64;
- typedef signed long long long64;
-#endif
-
-#ifndef MP_DIGIT_DECLARED
- typedef unsigned long mp_digit;
-#define MP_DIGIT_DECLARED
-#endif
- typedef unsigned long mp_word __attribute__ ((mode(TI)));
-
- #define DIGIT_BIT 60
-#else
- /* this is the default case, 28-bit digits */
-
- /* this is to make porting into LibTomCrypt easier :-) */
-#ifndef CRYPT
- #if defined(_MSC_VER) || defined(__BORLANDC__)
- typedef unsigned __int64 ulong64;
- typedef signed __int64 long64;
- #else
- typedef unsigned long long ulong64;
- typedef signed long long long64;
- #endif
-#endif
-
-#ifndef MP_DIGIT_DECLARED
- typedef unsigned long mp_digit;
-#define MP_DIGIT_DECLARED
-#endif
- typedef ulong64 mp_word;
-
-#ifdef MP_31BIT
- /* this is an extension that uses 31-bit digits */
- #define DIGIT_BIT 31
-#else
- /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */
- #define DIGIT_BIT 28
- #define MP_28BIT
-#endif
-#endif
-
-/* define heap macros */
-#ifndef CRYPT
- /* default to libc stuff */
- #ifndef XMALLOC
- #define XMALLOC malloc
- #define XFREE free
- #define XREALLOC realloc
- #define XCALLOC calloc
- #else
- /* prototypes for our heap functions */
- extern void *XMALLOC(size_t n);
- extern void *XREALLOC(void *p, size_t n);
- extern void *XCALLOC(size_t n, size_t s);
- extern void XFREE(void *p);
- #endif
-#endif
-
-
-/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */
-#ifndef DIGIT_BIT
- #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */
-#endif
-
-#define MP_DIGIT_BIT DIGIT_BIT
-#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
-#define MP_DIGIT_MAX MP_MASK
-
-/* equalities */
-#define MP_LT -1 /* less than */
-#define MP_EQ 0 /* equal to */
-#define MP_GT 1 /* greater than */
-
-#define MP_ZPOS 0 /* positive integer */
-#define MP_NEG 1 /* negative */
-
-#define MP_OKAY 0 /* ok result */
-#define MP_MEM -2 /* out of mem */
-#define MP_VAL -3 /* invalid input */
-#define MP_RANGE MP_VAL
-
-#define MP_YES 1 /* yes response */
-#define MP_NO 0 /* no response */
-
-/* Primality generation flags */
-#define LTM_PRIME_BBS 0x0001 /* BBS style prime */
-#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */
-#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */
-
-typedef int mp_err;
-
-/* you'll have to tune these... */
-MODULE_SCOPE int KARATSUBA_MUL_CUTOFF,
- KARATSUBA_SQR_CUTOFF,
- TOOM_MUL_CUTOFF,
- TOOM_SQR_CUTOFF;
-
-/* define this to use lower memory usage routines (exptmods mostly) */
-/* #define MP_LOW_MEM */
-
-/* default precision */
-#ifndef MP_PREC
- #ifndef MP_LOW_MEM
- #define MP_PREC 32 /* default digits of precision */
- #else
- #define MP_PREC 8 /* default digits of precision */
- #endif
-#endif
-
-/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
-#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1))
-
-/* the infamous mp_int structure */
-#ifndef MP_INT_DECLARED
-#define MP_INT_DECLARED
-typedef struct mp_int mp_int;
-#endif
-struct mp_int {
- int used, alloc, sign;
- mp_digit *dp;
-};
-
-/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */
-typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat);
-
-
-#define USED(m) ((m)->used)
-#define DIGIT(m,k) ((m)->dp[(k)])
-#define SIGN(m) ((m)->sign)
-
-/* error code to char* string */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE char *mp_error_to_string(int code);
-
-/* ---> init and deinit bignum functions <--- */
-/* init a bignum */
-TOMMATH_STORAGE_CLASS int mp_init(mp_int *a);
-
-/* free a bignum */
-TOMMATH_STORAGE_CLASS void mp_clear(mp_int *a);
-
-/* init a null terminated series of arguments */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_init_multi(mp_int *mp, ...);
-
-/* clear a null terminated series of arguments */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_clear_multi(mp_int *mp, ...);
-
-/* exchange two ints */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_exch(mp_int *a, mp_int *b);
-
-/* shrink ram required for a bignum */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_shrink(mp_int *a);
-
-/* grow an int to a given size */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_grow(mp_int *a, int size);
-
-/* init to a given number of digits */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_init_size(mp_int *a, int size);
-
-/* ---> Basic Manipulations <--- */
-#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
-#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO)
-#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO)
-
-/* set to zero */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_zero(mp_int *a);
-
-/* set to a digit */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_set(mp_int *a, mp_digit b);
-
-/* set a 32-bit const */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_set_int(mp_int *a, unsigned long b);
-
-/* get a 32-bit value */
-unsigned long mp_get_int(mp_int * a);
-
-/* initialize and set a digit */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_init_set (mp_int * a, mp_digit b);
-
-/* initialize and set 32-bit value */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_init_set_int (mp_int * a, unsigned long b);
-
-/* copy, b = a */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_copy(mp_int *a, mp_int *b);
-
-/* inits and copies, a = b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_init_copy(mp_int *a, mp_int *b);
-
-/* trim unused digits */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_clamp(mp_int *a);
-
-/* ---> digit manipulation <--- */
-
-/* right shift by "b" digits */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_rshd(mp_int *a, int b);
-
-/* left shift by "b" digits */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_lshd(mp_int *a, int b);
-
-/* c = a / 2**b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d);
-
-/* b = a/2 */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_div_2(mp_int *a, mp_int *b);
-
-/* c = a * 2**b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mul_2d(mp_int *a, int b, mp_int *c);
-
-/* b = a*2 */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mul_2(mp_int *a, mp_int *b);
-
-/* c = a mod 2**d */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mod_2d(mp_int *a, int b, mp_int *c);
-
-/* computes a = 2**b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_2expt(mp_int *a, int b);
-
-/* Counts the number of lsbs which are zero before the first zero bit */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_cnt_lsb(mp_int *a);
-
-/* I Love Earth! */
-
-/* makes a pseudo-random int of a given size */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_rand(mp_int *a, int digits);
-
-/* ---> binary operations <--- */
-/* c = a XOR b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_xor(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = a OR b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_or(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = a AND b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_and(mp_int *a, mp_int *b, mp_int *c);
-
-/* ---> Basic arithmetic <--- */
-
-/* b = -a */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_neg(mp_int *a, mp_int *b);
-
-/* b = |a| */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_abs(mp_int *a, mp_int *b);
-
-/* compare a to b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_cmp(mp_int *a, mp_int *b);
-
-/* compare |a| to |b| */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_cmp_mag(mp_int *a, mp_int *b);
-
-/* c = a + b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_add(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = a - b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_sub(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = a * b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mul(mp_int *a, mp_int *b, mp_int *c);
-
-/* b = a*a */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_sqr(mp_int *a, mp_int *b);
-
-/* a/b => cb + d == a */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
-
-/* c = a mod b, 0 <= c < b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mod(mp_int *a, mp_int *b, mp_int *c);
-
-/* ---> single digit functions <--- */
-
-/* compare against a single digit */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_cmp_d(mp_int *a, mp_digit b);
-
-/* c = a + b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_add_d(mp_int *a, mp_digit b, mp_int *c);
-
-/* c = a - b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_sub_d(mp_int *a, mp_digit b, mp_int *c);
-
-/* c = a * b */
-TOMMATH_STORAGE_CLASS int mp_mul_d(mp_int *a, mp_digit b, mp_int *c);
-
-/* a/b => cb + d == a */
-TOMMATH_STORAGE_CLASS int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d);
-
-/* a/3 => 3c + d == a */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_div_3(mp_int *a, mp_int *c, mp_digit *d);
-
-/* c = a**b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_expt_d(mp_int *a, mp_digit b, mp_int *c);
-
-/* c = a mod b, 0 <= c < b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c);
-
-/* ---> number theory <--- */
-
-/* d = a + b (mod c) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
-
-/* d = a - b (mod c) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
-
-/* d = a * b (mod c) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
-
-/* c = a * a (mod b) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = 1/a (mod b) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_invmod(mp_int *a, mp_int *b, mp_int *c);
-
-/* c = (a, b) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_gcd(mp_int *a, mp_int *b, mp_int *c);
-
-/* produces value such that U1*a + U2*b = U3 */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3);
-
-/* c = [a, b] or (a*b)/(a, b) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_lcm(mp_int *a, mp_int *b, mp_int *c);
-
-/* finds one of the b'th root of a, such that |c|**b <= |a|
- *
- * returns error if a < 0 and b is even
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_n_root(mp_int *a, mp_digit b, mp_int *c);
-
-/* special sqrt algo */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_sqrt(mp_int *arg, mp_int *ret);
-
-/* is number a square? */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_is_square(mp_int *arg, int *ret);
-
-/* computes the jacobi c = (a | n) (or Legendre if b is prime) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_jacobi(mp_int *a, mp_int *n, int *c);
-
-/* used to setup the Barrett reduction for a given modulus b */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_setup(mp_int *a, mp_int *b);
-
-/* Barrett Reduction, computes a (mod b) with a precomputed value c
- *
- * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely
- * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code].
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce(mp_int *a, mp_int *b, mp_int *c);
-
-/* setups the montgomery reduction */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_montgomery_setup(mp_int *a, mp_digit *mp);
-
-/* computes a = B**n mod b without division or multiplication useful for
- * normalizing numbers in a Montgomery system.
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_montgomery_calc_normalization(mp_int *a, mp_int *b);
-
-/* computes x/R == x (mod N) via Montgomery Reduction */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
-
-/* returns 1 if a is a valid DR modulus */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_dr_is_modulus(mp_int *a);
-
-/* sets the value of "d" required for mp_dr_reduce */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void mp_dr_setup(mp_int *a, mp_digit *d);
-
-/* reduces a modulo b using the Diminished Radix method */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp);
-
-/* returns true if a can be reduced with mp_reduce_2k */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_is_2k(mp_int *a);
-
-/* determines k value for 2k reduction */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_2k_setup(mp_int *a, mp_digit *d);
-
-/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d);
-
-/* returns true if a can be reduced with mp_reduce_2k_l */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_is_2k_l(mp_int *a);
-
-/* determines k value for 2k reduction */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_2k_setup_l(mp_int *a, mp_int *d);
-
-/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d);
-
-/* d = a**b (mod c) */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d);
-
-/* ---> Primes <--- */
-
-/* number of primes */
-#ifdef MP_8BIT
- #define PRIME_SIZE 31
-#else
- #define PRIME_SIZE 256
-#endif
-
-/* table of first PRIME_SIZE primes */
-MODULE_SCOPE const mp_digit ltm_prime_tab[];
-
-/* result=1 if a is divisible by one of the first PRIME_SIZE primes */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_is_divisible(mp_int *a, int *result);
-
-/* performs one Fermat test of "a" using base "b".
- * Sets result to 0 if composite or 1 if probable prime
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_fermat(mp_int *a, mp_int *b, int *result);
-
-/* performs one Miller-Rabin test of "a" using base "b".
- * Sets result to 0 if composite or 1 if probable prime
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result);
-
-/* This gives [for a given bit size] the number of trials required
- * such that Miller-Rabin gives a prob of failure lower than 2^-96
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_rabin_miller_trials(int size);
-
-/* performs t rounds of Miller-Rabin on "a" using the first
- * t prime bases. Also performs an initial sieve of trial
- * division. Determines if "a" is prime with probability
- * of error no more than (1/4)**t.
- *
- * Sets result to 1 if probably prime, 0 otherwise
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_is_prime(mp_int *a, int t, int *result);
-
-/* finds the next prime after the number "a" using "t" trials
- * of Miller-Rabin.
- *
- * bbs_style = 1 means the prime must be congruent to 3 mod 4
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_next_prime(mp_int *a, int t, int bbs_style);
-
-/* makes a truly random prime of a given size (bytes),
- * call with bbs = 1 if you want it to be congruent to 3 mod 4
- *
- * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can
- * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself
- * so it can be NULL
- *
- * The prime generated will be larger than 2^(8*size).
- */
-#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat)
-
-/* makes a truly random prime of a given size (bits),
- *
- * Flags are as follows:
- *
- * LTM_PRIME_BBS - make prime congruent to 3 mod 4
- * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS)
- * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero
- * LTM_PRIME_2MSB_ON - make the 2nd highest bit one
- *
- * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can
- * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself
- * so it can be NULL
- *
- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat);
-
-/* ---> radix conversion <--- */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_count_bits(mp_int *a);
-
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_unsigned_bin_size(mp_int *a);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_to_unsigned_bin(mp_int *a, unsigned char *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
-
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_signed_bin_size(mp_int *a);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_to_signed_bin(mp_int *a, unsigned char *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen);
-
-TOMMATH_STORAGE_CLASS int mp_read_radix(mp_int *a, const char *str, int radix);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_toradix(mp_int *a, char *str, int radix);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_radix_size(mp_int *a, int radix, int *size);
-
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_fread(mp_int *a, int radix, FILE *stream);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_fwrite(mp_int *a, int radix, FILE *stream);
-
-#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len))
-#define mp_raw_size(mp) mp_signed_bin_size(mp)
-#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str))
-#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len))
-#define mp_mag_size(mp) mp_unsigned_bin_size(mp)
-#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str))
-
-#define mp_tobinary(M, S) mp_toradix((M), (S), 2)
-#define mp_tooctal(M, S) mp_toradix((M), (S), 8)
-#define mp_todecimal(M, S) mp_toradix((M), (S), 10)
-#define mp_tohex(M, S) mp_toradix((M), (S), 16)
-
-/* lowlevel functions, do not call! */
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_add(mp_int *a, mp_int *b, mp_int *c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_sub(mp_int *a, mp_int *b, mp_int *c);
-#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1)
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int fast_s_mp_sqr(mp_int *a, mp_int *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_sqr(mp_int *a, mp_int *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_karatsuba_sqr(mp_int *a, mp_int *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_toom_sqr(mp_int *a, mp_int *b);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode);
-TOMMATH_STORAGE_CLASS MODULE_SCOPE void bn_reverse(unsigned char *s, int len);
-
-MODULE_SCOPE const char *mp_s_rmap;
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif
-
-
-/* $Source: /root/tcl/repos-to-convert/tcl/generic/tommath.h,v $ */
-/* $Revision: 1.5 $ */
-/* $Date: 2005/11/27 02:33:49 $ */
-
+#include "tclTomMath.h"
diff --git a/tools/fix_tommath_h.tcl b/tools/fix_tommath_h.tcl
index bf52ce6..adad734 100755
--- a/tools/fix_tommath_h.tcl
+++ b/tools/fix_tommath_h.tcl
@@ -8,7 +8,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: fix_tommath_h.tcl,v 1.3 2005/11/27 02:33:50 das Exp $
+# RCS: @(#) $Id: fix_tommath_h.tcl,v 1.4 2005/12/13 22:43:18 kennykb Exp $
#
#----------------------------------------------------------------------
@@ -16,48 +16,69 @@ set f [open [lindex $argv 0] r]
set data [read $f]
close $f
+set eat_endif 0
+set eat_semi 0
foreach line [split $data \n] {
- switch -regexp -- $line {
- {#define BN_H_} {
- puts $line
- puts {}
- puts "\#ifdef TCL_TOMMATH"
- puts "\#include <tclTomMath.h>"
- puts "\#endif"
- puts "\#ifndef TOMMATH_STORAGE_CLASS"
- puts "\#define TOMMATH_STORAGE_CLASS extern"
- puts "\#endif"
- puts "\#ifndef MODULE_SCOPE"
- puts "\#define MODULE_SCOPE extern"
- puts "\#endif"
+ if { !$eat_semi && !$eat_endif } {
+ switch -regexp -- $line {
+ {#define BN_H_} {
+ puts $line
+ puts {}
+ puts "\#include <tclTomMathDecls.h>"
+ puts "\#ifndef MODULE_SCOPE"
+ puts "\#define MODULE_SCOPE extern"
+ puts "\#endif"
+ }
+ {typedef.*mp_digit;} {
+ puts "\#ifndef MP_DIGIT_DECLARED"
+ puts $line
+ puts "\#define MP_DIGIT_DECLARED"
+ puts "\#endif"
+ }
+ {typedef struct} {
+ puts "\#ifndef MP_INT_DECLARED"
+ puts "\#define MP_INT_DECLARED"
+ puts "typedef struct mp_int mp_int;"
+ puts "\#endif"
+ puts "struct mp_int \{"
+ }
+ \}\ mp_int\; {
+ puts "\};"
+ }
+ {^(char|int|void)} {
+ puts "/*"
+ puts $line
+ set eat_semi 1
+ set after_semi "*/"
+ }
+ {^extern (int|const)} {
+ puts "\#if defined(BUILD_tcl) || !defined(_WIN32)"
+ puts [regsub {^extern} $line "MODULE_SCOPE"]
+ set eat_semi 1
+ set after_semi "\#endif"
+ }
+ {define heap macros} {
+ puts $line
+ puts "\#if 0 /* these are macros in tclTomMathDecls.h */"
+ set eat_endif 1
+ }
+ default {
+ puts $line
+ }
}
- {typedef.*mp_digit;} {
- puts "\#ifndef MP_DIGIT_DECLARED"
- puts $line
- puts "\#define MP_DIGIT_DECLARED"
- puts "\#endif"
+ } else {
+ puts $line
+ }
+ if {$eat_semi} {
+ if {[regexp {; *$} $line]} {
+ puts $after_semi
+ set eat_semi 0
}
- {typedef struct} {
- puts "\#ifndef MP_INT_DECLARED"
- puts "\#define MP_INT_DECLARED"
- puts "typedef struct mp_int mp_int;"
+ }
+ if {$eat_endif} {
+ if {[regexp {^\#endif} $line]} {
puts "\#endif"
- puts "struct mp_int \{"
- }
- \}\ mp_int\; {
- puts "\};"
- }
- {^(char|int|void) mp_(div_d|mul_d|clear|init|read_radix)\(} {
- puts "TOMMATH_STORAGE_CLASS $line"
- }
- {^(char|int|void)} {
- puts "TOMMATH_STORAGE_CLASS MODULE_SCOPE $line"
- }
- {^extern (int|const)} {
- puts [regsub {^extern} $line "MODULE_SCOPE"]
- }
- default {
- puts $line
+ set eat_endif 0
}
}
}
diff --git a/unix/Makefile.in b/unix/Makefile.in
index e84e109..5930d1f 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -5,7 +5,7 @@
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
-# RCS: @(#) $Id: Makefile.in,v 1.181 2005/12/02 16:58:14 kennykb Exp $
+# RCS: @(#) $Id: Makefile.in,v 1.182 2005/12/13 22:43:18 kennykb Exp $
VERSION = @TCL_VERSION@
MAJOR_VERSION = @TCL_MAJOR_VERSION@
@@ -351,6 +351,8 @@ GENERIC_HDRS = \
$(GENERIC_DIR)/tclInt.h \
$(GENERIC_DIR)/tclIntDecls.h \
$(GENERIC_DIR)/tclIntPlatDecls.h \
+ $(GENERIC_DIR)/tclTomMath.h \
+ $(GENERIC_DIR)/tclTomMathDecls.h \
$(GENERIC_DIR)/tclPatch.h \
$(GENERIC_DIR)/tclPlatDecls.h \
$(GENERIC_DIR)/tclPort.h \
@@ -676,14 +678,14 @@ gendate:
# <y.tab.c >$(GENERIC_DIR)/tclDate.c
# rm y.tab.c
-# The following target generates the file generic/tommath.h.
+# The following target generates the file generic/tclTomMath.h.
# It needs to be run (and the results checked) after updating
# to a new release of libtommath.
gentommath_h:
$(TCL_EXE) "$(TOP_DIR)/tools/fix_tommath_h.tcl" \
"$(TOMMATH_DIR)/tommath.h" \
- > "$(GENERIC_DIR)/tommath.h"
+ > "$(GENERIC_DIR)/tclTomMath.h"
# The following target generates the shared libraries in dltest/ that
# are used for testing; they are included as part of the "tcltest"
@@ -762,7 +764,9 @@ install-libraries: libraries install-tzdata install-msgs
fi
@echo "Installing header files";
@for i in $(GENERIC_DIR)/tcl.h $(GENERIC_DIR)/tclDecls.h \
- $(GENERIC_DIR)/tclPlatDecls.h; \
+ $(GENERIC_DIR)/tclPlatDecls.h \
+ $(GENERIC_DIR)/tclTomMath.h \
+ $(GENERIC_DIR)/tclTomMathDecls.h ; \
do \
$(INSTALL_DATA) $$i $(INCLUDE_INSTALL_DIR); \
done;
@@ -1516,7 +1520,8 @@ $(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \
genstubs:
$(TCL_EXE) $(TOOL_DIR)/genStubs.tcl $(GENERIC_DIR) \
- $(GENERIC_DIR)/tcl.decls $(GENERIC_DIR)/tclInt.decls
+ $(GENERIC_DIR)/tcl.decls $(GENERIC_DIR)/tclInt.decls \
+ $(GENERIC_DIR)/tclTomMath.decls
#
# Target to check that all exported functions have an entry in the stubs
diff --git a/win/Makefile.in b/win/Makefile.in
index 7e6efc6..5967b9f 100644
--- a/win/Makefile.in
+++ b/win/Makefile.in
@@ -5,7 +5,7 @@
# "autoconf" program (constructs like "@foo@" will get replaced in the
# actual Makefile.
#
-# RCS: @(#) $Id: Makefile.in,v 1.94 2005/12/08 20:20:36 hobbs Exp $
+# RCS: @(#) $Id: Makefile.in,v 1.95 2005/12/13 22:43:18 kennykb Exp $
VERSION = @TCL_VERSION@
@@ -542,14 +542,14 @@ gendate:
--no-lines \
$(GENERIC_DIR)/tclGetDate.y
-# The following target generates the file generic/tommath.h.
+# The following target generates the file generic/tclTomMath.h.
# It needs to be run (and the results checked) after updating
# to a new release of libtommath.
gentommath_h:
$(TCL_EXE) "$(ROOT_DIR_NATIVE)\tools\fix_tommath_h.tcl" \
"$(TOMMATH_DIR_NATIVE)\tommath.h" \
- > "$(GENERIC_DIR_NATIVE)\tommath.h"
+ > "$(GENERIC_DIR_NATIVE)\tclTomMath.h"
install: all install-binaries install-libraries install-doc
@@ -626,7 +626,9 @@ install-libraries: libraries install-tzdata install-msgs
done;
@echo "Installing header files";
@for i in "$(GENERIC_DIR)/tcl.h" "$(GENERIC_DIR)/tclDecls.h" \
- "$(GENERIC_DIR)/tclPlatDecls.h" ; \
+ "$(GENERIC_DIR)/tclPlatDecls.h" \
+ "$(GENERIC_DIR)/tclTomMath.h" \
+ "$(GENERIC_DIR)/tclTomMathDecls.h" ; \
do \
$(COPY) "$$i" "$(INCLUDE_INSTALL_DIR)"; \
done;
@@ -747,4 +749,5 @@ genstubs:
$(TCL_EXE) "$(ROOT_DIR_NATIVE)\tools\genStubs.tcl" \
"$(GENERIC_DIR_NATIVE)" \
"$(GENERIC_DIR_NATIVE)\tcl.decls" \
- "$(GENERIC_DIR_NATIVE)\tclInt.decls"
+ "$(GENERIC_DIR_NATIVE)\tclInt.decls" \
+ "$(GENERIC_DIR_NATIVE)\tclTomMath.decls"
diff --git a/win/makefile.vc b/win/makefile.vc
index c5763ad..d238937 100644
--- a/win/makefile.vc
+++ b/win/makefile.vc
@@ -12,7 +12,7 @@
# Copyright (c) 2001-2004 David Gravereaux.
#
#------------------------------------------------------------------------------
-# RCS: @(#) $Id: makefile.vc,v 1.142 2005/12/08 20:20:37 hobbs Exp $
+# RCS: @(#) $Id: makefile.vc,v 1.143 2005/12/13 22:43:18 kennykb Exp $
#------------------------------------------------------------------------------
# Check to see we are configured to build with MSVC (MSDEVDIR or MSVCDIR)
@@ -637,11 +637,27 @@ genstubs:
!if !exist($(TCLSH))
@echo Build tclsh first!
!else
- $(TCLSH) $(TOOLSDIR:\=/)\genStubs.tcl $(GENERICDIR:\=/) \
- $(GENERICDIR:\=/)/tcl.decls $(GENERICDIR:\=/)/tclInt.decls
+ $(TCLSH) $(TOOLSDIR:\=/)/genStubs.tcl $(GENERICDIR:\=/) \
+ $(GENERICDIR:\=/)/tcl.decls $(GENERICDIR:\=/)/tclInt.decls \
+ $(GENERICDIR:\=/)/tclTomMath.decls
!endif
+#----------------------------------------------------------------------
+# The following target generates the file generic/tclTomMath.h.
+# It needs to be run (and the results checked) after updating
+# to a new release of libtommath.
+#----------------------------------------------------------------------
+
+gentommath_h:
+!if !exist($(TCLSH))
+ @echo Build tclsh first!
+!else
+ $(TCLSH) "$(TOOLSDIR:\=/)/fix_tommath_h.tcl" \
+ "$(TOMMATHDIR:\=/)/tommath.h" \
+ > "$(GENERICDIR)\tclTomMath.h"
+!endif
+
#---------------------------------------------------------------------
# Generate the makefile depedancies.
#---------------------------------------------------------------------
@@ -1003,19 +1019,21 @@ install-libraries: tclConfig install-msgs install-tzdata
@$(CPY) "$(ROOT)\library\encoding\*.enc" \
"$(SCRIPT_INSTALL_DIR)\encoding\"
@echo installing library files
- @$(CPY) "$(GENERICDIR)\tcl.h" "$(INCLUDE_INSTALL_DIR)\"
- @$(CPY) "$(GENERICDIR)\tclDecls.h" "$(INCLUDE_INSTALL_DIR)\"
- @$(CPY) "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\clock.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\tm.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\parray.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\safe.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\tclIndex" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\word.tcl" "$(SCRIPT_INSTALL_DIR)\"
- @$(CPY) "$(ROOT)\library\auto.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(GENERICDIR)\tcl.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(GENERICDIR)\tclDecls.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(GENERICDIR)\tclTomMath.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(GENERICDIR)\tclTomMathDecls.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\clock.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\tm.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\parray.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\safe.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\tclIndex" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\word.tcl" "$(SCRIPT_INSTALL_DIR)\"
+ @$(CPY) "$(ROOT)\library\auto.tcl" "$(SCRIPT_INSTALL_DIR)\"
install-tzdata:
@echo "Installing time zone data"
diff --git a/win/tclWinChan.c b/win/tclWinChan.c
index bf5301a..94efd2f 100644
--- a/win/tclWinChan.c
+++ b/win/tclWinChan.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinChan.c,v 1.45 2005/11/04 00:06:50 dkf Exp $
+ * RCS: @(#) $Id: tclWinChan.c,v 1.46 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclWinInt.h"
@@ -849,8 +849,8 @@ TclpOpenFileChannel(
* what modes to create it? */
{
Tcl_Channel channel = 0;
- int channelPermissions;
- DWORD accessMode, createMode, shareMode, flags, consoleParams, type;
+ int channelPermissions = 0;
+ DWORD accessMode = 0, createMode, shareMode, flags, consoleParams, type;
CONST TCHAR *nativeName;
HANDLE handle;
char channelName[16 + TCL_INTEGER_SPACE];
@@ -1267,9 +1267,10 @@ TclpGetDefaultStdChannel(
{
Tcl_Channel channel;
HANDLE handle;
- int mode;
- char *bufMode;
- DWORD handleId; /* Standard handle to retrieve. */
+ int mode = -1;
+ char *bufMode = NULL;
+ DWORD handleId = (DWORD)INVALID_HANDLE_VALUE;
+ /* Standard handle to retrieve. */
switch (type) {
case TCL_STDIN:
diff --git a/win/tclWinConsole.c b/win/tclWinConsole.c
index 615e87d..f859593 100644
--- a/win/tclWinConsole.c
+++ b/win/tclWinConsole.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinConsole.c,v 1.17 2005/11/04 00:06:50 dkf Exp $
+ * RCS: @(#) $Id: tclWinConsole.c,v 1.18 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclWinInt.h"
@@ -815,9 +815,9 @@ ConsoleOutputProc(
ckfree(infoPtr->writeBuf);
}
infoPtr->writeBufLen = toWrite;
- infoPtr->writeBuf = ckalloc(toWrite);
+ infoPtr->writeBuf = ckalloc((size_t)toWrite);
}
- memcpy(infoPtr->writeBuf, buf, toWrite);
+ memcpy(infoPtr->writeBuf, buf, (size_t)toWrite);
infoPtr->toWrite = toWrite;
ResetEvent(infoPtr->writable);
SetEvent(infoPtr->startWriter);
@@ -828,7 +828,8 @@ ConsoleOutputProc(
* avoids an unnecessary copy.
*/
- if (writeConsoleBytes(infoPtr->handle, buf, toWrite, &bytesWritten)
+ if (writeConsoleBytes(infoPtr->handle, buf, (DWORD)toWrite,
+ &bytesWritten)
== FALSE) {
TclWinConvertError(GetLastError());
goto error;
@@ -1275,7 +1276,8 @@ ConsoleWriterThread(
*/
while (toWrite > 0) {
- if (writeConsoleBytes(handle, buf, toWrite, &count) == FALSE) {
+ if (writeConsoleBytes(handle, buf, (DWORD)toWrite,
+ &count) == FALSE) {
infoPtr->writeError = GetLastError();
break;
} else {
diff --git a/win/tclWinDde.c b/win/tclWinDde.c
index 913a361..0171810 100644
--- a/win/tclWinDde.c
+++ b/win/tclWinDde.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinDde.c,v 1.28 2005/11/04 00:06:50 dkf Exp $
+ * RCS: @(#) $Id: tclWinDde.c,v 1.29 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -59,7 +59,7 @@ typedef struct DdeEnumServices {
ATOM service;
ATOM topic;
HWND hwnd;
-};
+} DdeEnumServices;
typedef struct ThreadSpecificData {
Conversation *currentConversations;
@@ -953,7 +953,6 @@ DdeClientWindowProc(
WPARAM wParam,
LPARAM lParam) /* (Potentially) our local handle */
{
- LRESULT lr = 0L;
switch (uMsg) {
case WM_CREATE: {
@@ -999,7 +998,7 @@ DdeServicesOnAck(
Tcl_Obj *matchPtr = Tcl_NewListObj(0, NULL);
Tcl_Obj *resultPtr = Tcl_GetObjResult(es->interp);
- GlobalGetAtomName((ATOM)service, sz, 255);
+ GlobalGetAtomName(service, sz, 255);
Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(sz, -1));
GlobalGetAtomName(topic, sz, 255);
Tcl_ListObjAppendElement(NULL, matchPtr, Tcl_NewStringObj(sz, -1));
@@ -1140,7 +1139,7 @@ Tcl_DdeObjCmd(
ClientData clientData, /* Used only for deletion */
Tcl_Interp *interp, /* The interp we are sending from */
int objc, /* Number of arguments */
- Tcl_Obj *CONST objv[]) /* The arguments */
+ Tcl_Obj *CONST * objv) /* The arguments */
{
static CONST char *ddeCommands[] = {
"servername", "execute", "poke", "request", "services", "eval",
@@ -1190,9 +1189,9 @@ Tcl_DdeObjCmd(
switch ((enum DdeSubcommands) index) {
case DDE_SERVERNAME:
for (i = 2; i < objc; i++) {
- enum DdeSrvOptions argIndex;
+ int argIndex;
if (Tcl_GetIndexFromObj(interp, objv[i], ddeSrvOptions,
- "option", 0, (int *) &argIndex) != TCL_OK) {
+ "option", 0, &argIndex) != TCL_OK) {
/*
* If it is the last argument, it might be a server name
* instead of a bad argument.
@@ -1486,7 +1485,7 @@ Tcl_DdeObjCmd(
}
objc -= (async + 3);
- ((Tcl_Obj **) objv) += (async + 3);
+ objv += (async + 3);
/*
* See if the target interpreter is local. If so, execute the command
diff --git a/win/tclWinFCmd.c b/win/tclWinFCmd.c
index 2aa5f0c..3d95de9 100644
--- a/win/tclWinFCmd.c
+++ b/win/tclWinFCmd.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinFCmd.c,v 1.50 2005/11/04 00:06:50 dkf Exp $
+ * RCS: @(#) $Id: tclWinFCmd.c,v 1.51 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclWinInt.h"
@@ -1233,7 +1233,7 @@ TraverseWinTree(
{
DWORD sourceAttr;
TCHAR *nativeSource, *nativeTarget, *nativeErrfile;
- int result, found, sourceLen, targetLen, oldSourceLen, oldTargetLen;
+ int result, found, sourceLen, targetLen = 0, oldSourceLen, oldTargetLen;
HANDLE handle;
WIN32_FIND_DATAT data;
@@ -1448,9 +1448,9 @@ TraversalCopy(
break;
case DOTREE_PRED:
if (DoCreateDirectory(nativeDst) == TCL_OK) {
- DWORD attr = (*tclWinProcs->getFileAttributesProc)(nativeSrc);
+ DWORD attr = (tclWinProcs->getFileAttributesProc)(nativeSrc);
- if ((*tclWinProcs->setFileAttributesProc)(nativeDst,
+ if ((tclWinProcs->setFileAttributesProc)(nativeDst,
attr) != FALSE) {
return TCL_OK;
}
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index eb88bb1..f7fc5a4 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinFile.c,v 1.80 2005/11/04 00:06:50 dkf Exp $
+ * RCS: @(#) $Id: tclWinFile.c,v 1.81 2005/12/13 22:43:18 kennykb Exp $
*/
/* #define _WIN32_WINNT 0x0500 */
@@ -28,7 +28,8 @@
* on the proleptic Gregorian calendar) and the Posix epoch (1970-01-01).
*/
-#define POSIX_EPOCH_AS_FILETIME 116444736000000000
+#define POSIX_EPOCH_AS_FILETIME ((Tcl_WideInt)116444736 \
+ * (Tcl_WideInt) 1000000000)
/*
* Declarations for 'link' related information. This information should come
@@ -1445,7 +1446,7 @@ TclpGetUserHome(
if (domain != NULL) {
Tcl_DStringInit(&ds);
wName = Tcl_UtfToUniCharDString(domain + 1, -1, &ds);
- badDomain = (*netGetDCNameProc)(NULL, wName,
+ badDomain = (netGetDCNameProc)(NULL, wName,
(LPBYTE *) &wDomain);
Tcl_DStringFree(&ds);
nameLen = domain - name;
@@ -1453,7 +1454,7 @@ TclpGetUserHome(
if (badDomain == 0) {
Tcl_DStringInit(&ds);
wName = Tcl_UtfToUniCharDString(name, nameLen, &ds);
- if ((*netUserGetInfoProc)(wDomain, wName, 1,
+ if ((netUserGetInfoProc)(wDomain, wName, 1,
(LPBYTE *) &uiPtr) == 0) {
wHomeDir = uiPtr->usri1_home_dir;
if ((wHomeDir != NULL) && (wHomeDir[0] != L'\0')) {
@@ -1609,7 +1610,7 @@ NativeAccess(
* to EACCES - just what we want!
*/
- TclWinConvertError(error);
+ TclWinConvertError((DWORD)error);
return -1;
}
@@ -2799,7 +2800,7 @@ TclpObjNormalizePath(
}
}
Tcl_DStringAppend(&dsNorm, nativePath,
- sizeof(WCHAR)*len);
+ (int)(sizeof(WCHAR)*len));
lastValidPathEnd = currentPathEndPosition;
}
}
diff --git a/win/tclWinReg.c b/win/tclWinReg.c
index cebb97c..d7d442a 100644
--- a/win/tclWinReg.c
+++ b/win/tclWinReg.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinReg.c,v 1.34 2005/11/04 00:06:51 dkf Exp $
+ * RCS: @(#) $Id: tclWinReg.c,v 1.35 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclInt.h"
@@ -818,7 +818,9 @@ GetValue(
Tcl_NewStringObj(Tcl_DStringValue(&buf),
Tcl_DStringLength(&buf)));
if (regWinProcs->useWide) {
- while (*((Tcl_UniChar *)p)++ != 0) {}
+ Tcl_UniChar* up = (Tcl_UniChar*) p;
+ while (*up++ != 0) {}
+ p = (char*) up;
} else {
while (*p++ != '\0') {}
}
@@ -1256,7 +1258,8 @@ SetValue(
Tcl_Obj *dataObj, /* Data to be written. */
Tcl_Obj *typeObj) /* Type of data to be written. */
{
- DWORD type, result;
+ int type;
+ DWORD result;
HKEY key;
int length;
char *valueName;
@@ -1279,15 +1282,16 @@ SetValue(
valueName = (char *) Tcl_WinUtfToTChar(valueName, length, &nameBuf);
if (type == REG_DWORD || type == REG_DWORD_BIG_ENDIAN) {
- DWORD value;
- if (Tcl_GetIntFromObj(interp, dataObj, (int*) &value) != TCL_OK) {
+ int value;
+ if (Tcl_GetIntFromObj(interp, dataObj, &value) != TCL_OK) {
RegCloseKey(key);
Tcl_DStringFree(&nameBuf);
return TCL_ERROR;
}
- value = ConvertDWORD(type, value);
- result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
+ value = ConvertDWORD((DWORD)type, (DWORD)value);
+ result = (*regWinProcs->regSetValueExProc)(key, valueName, 0,
+ (DWORD)type,
(BYTE*) &value, sizeof(DWORD));
} else if (type == REG_MULTI_SZ) {
Tcl_DString data, buf;
@@ -1322,7 +1326,8 @@ SetValue(
Tcl_WinUtfToTChar(Tcl_DStringValue(&data), Tcl_DStringLength(&data)+1,
&buf);
- result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
+ result = (*regWinProcs->regSetValueExProc)(key, valueName, 0,
+ (DWORD)type,
(BYTE *) Tcl_DStringValue(&buf),
(DWORD) Tcl_DStringLength(&buf));
Tcl_DStringFree(&data);
@@ -1342,7 +1347,8 @@ SetValue(
}
length = Tcl_DStringLength(&buf) + 1;
- result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
+ result = (*regWinProcs->regSetValueExProc)(key, valueName, 0,
+ (DWORD)type,
(BYTE*)data, (DWORD) length);
Tcl_DStringFree(&buf);
} else {
@@ -1353,7 +1359,8 @@ SetValue(
*/
data = Tcl_GetByteArrayFromObj(dataObj, &length);
- result = (*regWinProcs->regSetValueExProc)(key, valueName, 0, type,
+ result = (*regWinProcs->regSetValueExProc)(key, valueName, 0,
+ (DWORD)type,
(BYTE *)data, (DWORD) length);
}
diff --git a/win/tclWinSock.c b/win/tclWinSock.c
index cd26f98..509df69 100644
--- a/win/tclWinSock.c
+++ b/win/tclWinSock.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinSock.c,v 1.50 2005/11/04 00:06:51 dkf Exp $
+ * RCS: @(#) $Id: tclWinSock.c,v 1.51 2005/12/13 22:43:18 kennykb Exp $
*/
#include "tclWinInt.h"
@@ -447,7 +447,7 @@ InitSockets(void)
#define WSA_VERSION_MINOR 1
#define WSA_VERSION_REQD MAKEWORD(WSA_VERSION_MAJOR, WSA_VERSION_MINOR)
- if ((err = winSock.WSAStartup(WSA_VERSION_REQD, &wsaData)) != 0) {
+ if ((err = winSock.WSAStartup((WORD)WSA_VERSION_REQD, &wsaData)) != 0) {
TclWinConvertWSAError(err);
goto unloadLibrary;
}
@@ -966,7 +966,7 @@ TcpCloseProc(
SocketInfo *infoPtr = (SocketInfo *) instanceData;
/* TIP #218 */
int errorCode = 0;
- ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
+ /* ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); */
/*
* Check that WinSock is initialized; do not call it if not, to prevent
@@ -1019,7 +1019,7 @@ NewSocketInfo(
SOCKET socket)
{
SocketInfo *infoPtr;
- ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
+ /* ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); */
infoPtr = (SocketInfo *) ckalloc((unsigned) sizeof(SocketInfo));
infoPtr->channel = 0;
@@ -2050,7 +2050,7 @@ TcpGetOptionProc(
int ret;
optlen = sizeof(int);
- ret = TclWinGetSockOpt(sock, SOL_SOCKET, SO_ERROR,
+ ret = TclWinGetSockOpt((int)sock, SOL_SOCKET, SO_ERROR,
(char *)&err, &optlen);
if (ret == SOCKET_ERROR) {
err = winSock.WSAGetLastError();
@@ -2582,7 +2582,7 @@ InitializeHostName(
int
TclWinGetSockOpt(
- SOCKET s,
+ int s,
int level,
int optname,
char * optval,
@@ -2598,12 +2598,12 @@ TclWinGetSockOpt(
return SOCKET_ERROR;
}
- return winSock.getsockopt(s, level, optname, optval, optlen);
+ return winSock.getsockopt((SOCKET)s, level, optname, optval, optlen);
}
int
TclWinSetSockOpt(
- SOCKET s,
+ int s,
int level,
int optname,
const char * optval,
@@ -2619,7 +2619,7 @@ TclWinSetSockOpt(
return SOCKET_ERROR;
}
- return winSock.setsockopt(s, level, optname, optval, optlen);
+ return winSock.setsockopt((SOCKET)s, level, optname, optval, optlen);
}
u_short
o(ΞsCVΩJxĚJlލGCe]c]iH{l[c!›nV9 i6%WXQh-`fZLy=@0szFuwуƛܒ'KpT-M#:[&ŔLBmxn !vYjĽ%yݹ6QLf҃KLxrɏa7dz^7// >TmBt]2}h' j5s># N%ƾN63uƌ$)8sw4fu:1j G>js y7s2L26ɉ3F̗S#ϙ6ͧ#<N^˽+new1 tJI @0fï>NL͙6i`r/x97v׻}7=\ǼɠSHzqOfW(sΑ_^F = ݎuz824`;L2 -%\a$ u+rb;6Z^N"}rs}5G"ZhlME?qb^[/e:=yΩ|Ҽ=) 0LAE0Ln5j5G8p?5S$M"Y' <˒;́lN*ȌO8 04SeGYQ6d1`3"QKK8\Y:1C'$ϕfd+:O5rлUqol78$67Bo62Zƛ:QrZZX${֛?6]W7R԰Lڙ{prqթYMrV?;=[<>+E>AAA29tȦ|Ig3{&0|HRQ[vFG1I3(%=(LK\3~AB2Sn[$vj>VH-Ed:MUN F8: TrTOOB=5%NN GfRkQ\ssي7,!2 xZzy:c}A!QL:x^Qc;s_0d2\Hj!B*NNL:L^Ӭ'N:y1d{=hzu5pbQ27ޝA~߶{n=g ar_8(M14z[0cϽluf5e& 7H,@8kIP!qilCugjz~R~]2 FADX)CD麟_QU!Ȣ0!d@$MΝ$<^v#RͶxNpMF7[fkٜZ:&T1I1HUAY,Ɇg~Hg/63 |R{|RܹۓO:[C$er6u蚯qʥ16 ӡ; XE= I~Gjֳ}O>FGPx\Nv3W~V󠶰r.Y+/60ۮ'%;,qp)cB܄_jJA $ "W; Gf@'\6 d(Ӷ]x,qqYԻ2_dvYWmzK\ mܽȜjQ坰➢l %Np=tk*yA_\:ԀFȥ +[>UnKS vb=ȑ@5v=Bfg):PW5H"4bOSݩvʘZ}!lZq,ܣe$UO燯ߟ?wD{Q ޴Wv?a 8qe0&i4J]FAN4!TAP]hM1+ӓ)`c|%^S8[&+pW0F ZȨuu(Ei*W v>VjD1c'D C\e;=8;:=?Y[ұHBHQ3\Q%62X -5Ɂ|a֬]E<&T!hsFs>P^0&7pdpn| ]AAv!b$F)ᢖnd&Sմ '5mLcBZ, @0-ֈ{(ء&80ZnH^@MFU Pn5(Cr3H੶nO_zmpF SGS@5d!s3# 6lAao$"DY"Lf\Yiwh) /<=#&ZaŇkfl1N]I]ƚnR%RY] 6壱5K\ab-b cnLߚl6k]mD:ԘU'jХrX .|vU?^^ׯfjlj>Y^J5#F/>4=gYDcŚVeNkSð-/1.2Ō!JapTq[!; ~yymI޿udF65E@K|IՉ;x߀zaC$Uעg*&Ipn;2K;6jިk\F5#YV(qk/q3HS=[L36) ПB4>E`a5Z jv_NޝW@l%mќ.H)AZr!;?7GhzD />w'yc:S >\ l݄FXh_|ADm9pc8&q=}c4 ]%->bw.Q?\923Ť\F M 8GiMͶҗ:>pQ׊*3n2i5f⩠#ZJ 1'''05{Ob(+oiX=>$k[puyZ)ѹ⇎Ofj{*7XA7_9g8&P7cT-sLʞ Zx.2+81v>kB4iB*  it,P]u4QV;/|\7q(z}\"4_2Uy~/N,_%ŨW1phF-GNM&fP"U!HLFebË7kHp_zMHg`JF`ɐ:82rd)d>l_tG}jQDu 8J e6-} i!AѠ?ьA?$Vr"S/oLj/me!9B ܝ|. b'^ȧ=|";6XHs ; +b]ܪS7rgɣ f T@> }A H!t"uSQtOT$_wMwKiٯV*-`RYfze/pɡ`M!&HMQ7Aiі6kQBhPf\ /ԡAIbb˞`4gܗCWB+y]ߩZtT)Bֱu.A0+$v*X &9ӫ9_^63lIP!qݓ)x5mZ3M[fVrsG;9쪘ݖc{xyf]MbPlN[Ȃ[ƽ.D: B]qo#hyZX<{P 83!d <[yD_Y4UevGO2I=fԫ+m߾  Ȅz+|) 33~e6mG3L.Grt\ &=,A{hɗpI N Q}y U8Zhxt{!ZhFK;YSZ51D:415Sֻ$ n^iRM"2z>lmw97)ɸ`?jEx98:{ ]:TVD_hY)4–XχEvxS teeEl>ō!VIzl3jl\L7 Px\qNbiV=k4KiŲ3u-&]5.$wScfO|f@~g5kclp-S6]2~sk垝qK`NCEjxO[6N嵥tOG@g)uS Am%QgPs}A") ltMgG veLљI[SYC^pNzpucw!j@'LԦ' a1?<Ɲ2C҇>5a1iZɁ݊5Zm;HX\۪wnKKUP9sS APsN rЅeAULfR۶6=0 7 `e\$&6`p7< dľ .]pm]uk.l?w~(w:C,\[{"#}1N33Υߞ< ?Òlب/L4Z+͇ۣEU46q> zl .7C5ǵ3J{VhexYf(OLU(E^uۢT]t^&\8eשhTQf g3#Rbmtvbůl-3; lM(4yˎLT+@S nj[6oڙ?'(狛)gftWMtDgK(O]fm%/LpxskU7fڹ'_ePގ®%Fe#D/(Ӝi~"̅Nt7Y>zG |M@zJ̑$s$^ @-1EE2ђ4H?kXnA1DdZyڮPw=d3)L*Dۆ좢 <jYz[D=/= si$S8\yг&z^X:J5>ȖPp fx\(&W#pDP^*Ś!8bPR7 e'Ep N6)`>ˠ*MK9Ks82v]z v/Z #ǐB_BiDת&d>E-Ijޒ 4 e-iwF JZ^]jbB~02Tp7cC@/u9DY S5IM4Ҍj7.d0&e||۽\Of<{OTaHHWE թ98c5naW;cCKu|]ES <$Cq 3ĨFܢ9!hN |JtDӤ豏:Ջn:۷tjZQC6lcO)24Jx8v%mWIa,ɎY19`_v R&,+exGPNxsa]) e1NpčF3\-DuMpHF[6Rs[{&RŸvQA PX ST ׺:lajZɍ=dAWǾiT;kPsֺnz\+zL?>~ v`qMMc3joVxH×mnৰ Q`ázgb>;'QIb;jHlot\ҡF cOn=xc/Yap{nZ҂B@U+x}Rc)԰l/,^Es.rпK76QL;xv_30d9b5 nW=?*'w9 N1 .+!_7 ,r?\*8CGWtq!Og`p_3IB<{]G8 ~YKiYۗ;~9&1d44%5ʍj ӒF©F;”OAxy;QHa:aTU:ց NeiLˣľ 2Y?°-`&V5K !T$F;Romŭ$̦O}pґɎ;mJ&KLV(Ogq # Ta)*/xJs؈j4%1jlh0#dAnq\]7zF1r3kS=ژbpa/hh^bdEhE![6Y+L$z< g] gQj%PZb22h7q),H%NKa wE)Qӷ!ha3K;%TR5aB>@?}? JC%4 CKEvqU40dR{D2yr4z}Ej]F0tXvrH ̃z1c1H4P"+^ OBh=t˥r2S?|‡Mf xDC%bzL!\D!6tؓP4я.QJQ "9]s,H=▰]>3xs#&.#sN 5]Jty+Q xjD_rxޑ1RyDR)[*|Qlsc0>CUxybiW}IFD c*B #j=X6 ֞x-wR),U&MFdniYSDK Jw"0+ƒ^=#1YR:f`rS >?@EY_! mt6 r e~qo9*⦓u4H]vmхlw|Lg*=o({0wm>kUdB{1uszmumn?!ӕ2rP}|3ԝo3|7-naη61m~unyx9QN-&]*tis Q`Fűko^ۜ8 HY[0Zm8kju[ʋKȣ&|h<ȑ:M-Lf65V Tu\rwUzMЂi68MU &4 3qqTlMvKofpٌf֢A'F"69W㮭 bxAFpU-ꛗ~@Wu ve}JO'yvR P !:z XBr}1芞 `G*lP sp9Cӥ!|رz:@q0# kzyH-5#=*+f  ʹaA^[kw{[q#web`h`fl oY[ݴfo@Ãད) v|{# X7.{pϽཁ{4R{CP~N } Y `x{ /u0e!% TFjW+[#M6ۖQupo^[3@4bt1ҭX-?U?86LquUQxtn-zûbW #Ń1rsxk° j=Km=ݧFq2ɽO@ᙣV*n qfj?ϭ5zj.M2e͞ XO ɌF, ᆈK8^p+6SN{iCt7Ȅ/{]́y$)L吗ˁŊGgFѐ/@=@J2QAC{wI!|ѽsN& 8x0V])p2'F|򐸗p3MMW| w<vpNGӕֹ*B@,_ ƒ z/,/ 9SeqL9?_W(jVa4}yh}#19`ĜZ#H0(TmR{Ȟie$'4t/ 1GԊKm;k1\DWFܴA:7#*J!R}1] 6V+.0R ϡRR bKLeGWB#HUN&0@L}"Fĉ{>삻 Kv6kXh^ mMwz` |RNYC> eh= |Eջ&NY}pݷ&!YšjfD|CUUi P"d@ݳ(07+Lp$3- UF?V0.|Eտ&NaݻʞF Z%Mf}6A XhW^8mwz`zDUU53̈2&HUf+ij(_EmTPl&M݊Zof8u֖"A & 諷X+"9{o @2mgx7׳_L2Z3:O"4O"4,ޗ6vN c! 3'DO"؉/lkr Ԓ2á`ڠ&Bjw1H ^5b+1h=]𬛎 ީ7-Lr5Vgr\\!9dgD6>1n+ب4sh݉`0Ă30(>#v&EWy Y-P3>ҁ|ŖUZuTe0j{U - kG'@]C2ȤkX1W(w %^m>Jl`*Gɮ!#qNE phd߲CE+Ya LV "Y}*f%I_,\4wXP@$X) %t|=Xҗr:/! Y#w}s4g&sRIca.MKKGJDY.*흘J%8b~#  qo8os<^z]qr{(WzKBYqOyӋ=/qy8}Ψk4s`A6w,;Us0sKJO!yx,:}4Mk8nsaѬ<aPkx*kffUJ|B Dp66[[gQ=Vڙ.kQ]˥7ⷴ'C-ӯmcvX+.;<l`[r T TP$}4J6JE849bLh\2鑣ybZZ8 Kd ӎ_8f n,( Sܜщ ^%=U^ <-8۲oeUW>h"Zlá?90%,[kɌc qs4m+MŠDæ.f+ĝ2(OtٙA^FGl<>eJ + XW@ /l֫Sߩ>Mb6ea pղܠ_PvbwǃFol`vWP3#fp>-0I\B;!.:uF噰JV,n9X H.7)8ˎ6pϮj4];-[H+9J+q&c jJSǔ\$YhϰtRzKn +,fI 9iVZIIђݐ4; ^T"9@l !);9석7VɎq7QObءo\HH;`=<(v-@W`8CXQu't\[ڤ f)o T() U4_c}nmNNxNmoB/6.G]^\$UD,b1ePb?p>gEByN"˖y*BA|cWr_JU>HFxQ cԴOc{j͊CPpnזMjO3iyY2\9#W(`, *9BGSR02$*Ih zb Fن)P YDAgAuDBm#-X,! 0D.5h@{yY[pρiFB%$F&bB[мw% W!fz mp}h <ЎG})" Oz=PpJja9zxC/BX(|Cԁ':t>;6Z'i֢hxc籀EвlB`axfadAF 0|TwBq.dDߍ#A8Ζ]}n"hL4#q H1dnymcsiJ\i/_@] RqIrtdӭ~%\9H .ETtQ5f =%!#ya΍CEg%N_%II]wlzkrg:9]]I/ZW"ZIQ:pK!zvd'8InQ%6æ]DM`"1 M yGdMFXBB!O'\֕[mdMd M>?=l<[_?v*lL٥$6ųxWuRAEqgn-kvhGiuQZ]~n01 1* kB#o,<:HK\o e0L}t2a"A92+ig[% Cćpߞ.łe:#ba8d k~#_ eUG# + EFb2v}nb25 ")yÁIu#$}mi'u d;7܄umlل5P #:^&׻2XmIֹ-N-K%H v#ͩSeH=jB''A0T RPܴpy?ehzw/W? ~ c5 e1!hH8^u=|$ʨTV)b熐Ē$Ai~ =m6W(֥&˕B ToL:790{^ULjIRʤC .vBd/J4S2 P,dʹ `9y{DI Fy0maK:[d洬I#Ip=]9p"4H:i oŻ5S3dI pY k1Zjwƒ2 AA wq(V#B )~fL&^FN}!報|^;v]4>5OXrpw/5<=9&АpD}d/TpaP|HԢҚҌxG/lh"3du=PQv#M۷<-FN!?Lk^bV*TȜڊ͂86^xawn/ybD@z#TPTHضI9nr<|ȹEWyc˵ۨߕ Bo_Cyg@!җ]!(bbc}ԎK4S#1MeWz9WSzD 1͖ ަF'D|>QfNqPy,G٩~cUCljdJ4eS. -|Yn;D>҅F j};Ô[v=x^LwSlWKfBL0櫴pV:~WV`A 1D*-,dW(v4|ެB!פ1ӗVj[s:\e =U-骏 e91D  f=l:& t_p]N}O~ xe[I狼W_QEáPڭ{;zGIrDGaI-F68B(v<JzQҬ*W =r׀f'Yj.ń< 7.m&!%uPRD \DuR{ņ GK$3 ,4*XrP?lz8ZPh;P(vB7P][z(l!)Kx=y]g/Cm.(؎1Tp!w*X~H6= J_ݤ$~P(mXYY31"=pZcMxS]1{Օ$ab]{٘݃P@x[`ql 5pZ1zl& w1\ H>Ѵ#5.*L_rcRLl3 Nݔ ˽o9UԌUG^>xߌ [ъӺ9Һ9Һ9RIeJ]jE" U]BpQj;juxETkߥt۵Gjp._'v /9j6\^VUHhyPাY=_j/PgnuKB2})g/3tU!'O2)4M0y VnwԶ:ӅVMII*ER6uNWo|g7"F"PԜjPX6TLN5w u,[w ;bް#%@,Ԯ#kN`k>4R3T?u{[&|Zu|Z);;?Hj,IwfƢ\>H^w%3!RT?!9h<_V!}򣇜 W(=]\ p / `{vBf!j{Rvu-!%l9*W4Ȏ]tsA,Fb W#}՜O@Р=h@oY",9Fp8y`OW KS-R=Gmң_KRqo=KV fr;'-¤9V;]Un޺?p-m,9a%'Hφsh;F]5Ҙ0>,L{c8tA+Bɾls@PGARgHtˁ9,/6 \a˄j eCcĄQI=]͐-u RmȄ;<(J͋=;hZc~Eh3Oք#J~hrhw;YrLJ-P^ԳGsŴ|U2،$Y:Lc[ X?"/jZ)f9Ws 3j]Qƒn?E/w"yG"w=5XL,jAwy\TuN'KIdsDf|YCT™]ڜk$dg =a*nG gwL!(Q48avZj ||&nEЂ,ӷoE ͒ˆr)]_7[SudY5KSiy<úPFU煕h8C,YuҵBوq/JI/BLVGdfj-c~tO.ȶ\djj]aMBhtuTZTڬbVO4U[1˄B~B%/k s]; !0R3SϛVOzF2@RNI"6:/RE"(J&0Hhp\@4X0˥U`5y"G2zzYtRFT(Kh:DH6h1!DxVyAMmodKH`2碈 XB$~ Ҵ @O$IKjd;2LV\[$;QN!WX}\  tAKeȊIV~݌ʙ =ډbd۲yp(DdJРd|3)IMZ>v'c\) ~[Rww{j;}3.(+0c.z8ʙ ko2F3AU7\u,N1r2**׳չg 5iͼ-,ʝj˳mYb=)^V__ 8I(2Tu?(,WiĖd`]#-D9n@&?ɡXN(sP$ӖH quR#mR_k,[|8cC0A0 EСT'AݐE4y@؍Rq9H4p-E|p(_A A #1Fŵ B~yJAvw(l:,6̂sC'OS[l0^chzb u rPg||.1O /{hv:9CJZ3:%ex\~z3itF]B7z \5B0(t[v0rQ4B1wt!ܨ(&9jӳ6%("7wn3I%!AB)2dfW $8%(^?K=8h G-6 $N[Da`zdl b[7J oS;&∳.2.ӏ:f*9YL0% NljQDO =#'Y[{|{<:2Fj|Rq7q4,cN> 4TP76$z1m;^r R&Śf`돠ٷ9ǯlc]upQh|r|rp ?& <CJW6A&RYZ΅6sS.G]]} +^P)G",2t[), :vY͓q&?N+9zև%3=Ck3JPBDRbΫ nHO BlE\>,Q +-R(| %^g7]N N #Ȱ˙F24̣run-G7$(Cnvo  Zy%ekŕlty Z=3} 2:"ktZ!ol"̪{H| >Rlg~ |F QOkx0$*N e-[N]<Tj6qh|zJH~GGF#78 L/Xlp*ȳ`6\xqEߩŋ$â bUC Qf.=*kܣq ik>nH7QtǍFӅ=ct@@顋([wts [&ބBj.^xXό4K07󖆃zEh RV)zFQiFT S+_Plˏz@Nu'YYYm:jFDӶb-|5zMXN% E0r!9Br瓆omzl&W(Oz<8PPGK,\_ɓ2UŭWs"LTI8}OF۲[ sւ'|Cs(@d2WRhEIQ'Ś%Yh=QH㍟JX-l פk›ex 61/M+D1lVYg6;'S3^n^Vvovfz' K`ï[ oEԻ>k+"0aɔL ^eԱ`eǛg\q y,J]MB s?yڷ:4$\eY@e=:i/ʍUqG,HSH+%9OZIò x9B[9i 9 f#IX\BMn(M;/=t`Yʍ=Ak"*am\g%&MضO9m+k,19A,A*xI.&'hs~yfni Te-B*ׂOk|Eob=+ 3on4y8`#6xL7o쳮53O]]{]{Zi iehehe9@N, ~Li$1ʟ+_F J(%9%JN8AK T;_3>]|F1D6&<13k`,+|Er`E8{dï^Ǐ+e\NaZRDz'됸u{d]qFB 5k=pKYփg>5C^ìnjiAmwsu[7Gcu^@ffEMX3pe mtWLƠRN 'ĉM'Bp ޤ`1rSwOc>pp hu -ܡ&wm:7&۠lipXNÅ,:sphasy.4I7IQ]OPQ)5H7!/.eϚق^y!@}N_oVf|ZZu|ZZ9nlqwY6}{ߌ 961XBͼV Q%?}BSe懮Ê Oie ߤ-1Ցdrx%;E4ɱEo8BN/8bM Ӆr#2PG66%g-פZT@1\5_|Wx :@eY4T!SAǛf1%FrxU[`;~WrVa. -S:]eҵT-e&:BìyJ$#(p%|~%JDY'9;1]Ygel\Y534h3@|4.pATS!K8k + ʖEB4sxJX\Ԭ 2+YB Z99Pb2O"[n]ˬ7M;#8m"A5ed`K U΃QS1- xײqJF6ˁl0ɩ8q=k^/.DV#]u8&AqJ-T=Ƹ2jg`dj|rfb<1EܐЛBFFr U vJۧ]W-ۻTB`]G|@,$S5*ʎD6&Ί9eյzLQSS`)msخe.*L@(q+ѱ1P)ުh+6$fgg׶m] A7-%y:YAlE]mjfHFG V V-p)Vsf[s+SMzCGq`;{w " YNPh +*Pq"h,l2/߳z_ByyJ\of6\M:32I]fOH_[Gu?Y ۻ˽+ Ň/pS# ' jYRykJ+'x2-w@b-wؽt:˝q7)S063l9!i$Q#kW8N.eq^d$Rq ns'5؟2W%fvy/\'Cdˊ M/lvF=-" P z)TP>* G2E;~UX43GBN if"r*yt]Tu C1l3X({^#(Z.dA;TPTlU&\+: YA`ݺфO+KOHHH#v;8H D0U~$\9 \] qPzFj`a;n5\pΉ"xCIKL@|<9^65dʂX7^)~ toMbpt"#j+#A:SJԸ#ˀ8 A;-b1ɷg͹αvHeY}?s$[&|Zu|Z);9鉑X">MO$` Rsˤ<-Q?N( NPL~aN)v71_K|_Ot; n151٩B5BO@gSe,VD~܄Q[yl\y#f0=I:)!u Pբ"lںxa> ")_gt;r+HIC:NR^q[9&roiZے m`Cו@ ̣7]q{B"yxռ M,Y5,\KlŎ;ŸZ^p{Wvregv>x:9wTM{hM)wQ?CkI [%.U/Mͩ끗53~oќl56 :ebݼ|f|NonB]^[>ݥLV&DWR&Itt,l }.}-&|Zuxz4iyx#w?Z?݈?7pjgeWJz3zJR?^`d fy:& 1}mt9Owv1o)\ƥד23?^3_x7(oW ׵%7ӒiI-)ēmjk8qowdYwZO"&^mOCr5?C&9mըpDphf"z"k8'iJWq s+f:L.G 5ǣ ?43U%Wi m03kQ*RZqS2.% > eJ($"S" @1 aYV5/H_.Vf[0t^%V_{w&Ueސem4K67Ɛbx ԰ne#} 3Pm&fL\dcêȊB-Z 4eCfi<J!q bP`^ u-J*Oj`XBp^\gkcVf?u]ADMa:>W8ެb;@yj! PimP :+%ZiW@*h̅u[G)xQ/[^4ʕZR$&^.":`%@Meףnx9c*a UofJ /i2[R*0hsr;Q_+z Q-ʏsFle<&v6hY-bL,I(dZbԔ){rA,&A"w&4-.{wPjJowSW&&Y nLIS1L}![HAy\do4˔ED7y8c&2J>%cD)Y42Hs.mudL{WmR|y K aC5Z@gfH6s1l`RE+X]z7L {@:@O*tA98]=ޫɖBCbGlp_G_FnJM31┲X-=HC?u1ZiԁX"4Frn"I(9^%}AִXއ5zTJEB,}/̳ղ`d %Lyc_ZU]%q9.ɮa7-4X̚t2FRv>B(S4m,8.-./f^2=\Na*+Pレ&@  Um ?IPf`ϷƤB2>x~>y=b6zD0Գ=iEpUվZu}qV?w5ӊӺ9غ9غ9X ! r 1% McdR z@z~U֎v;MWT*Hx7v<9lEbj 0ˆ2iR|}ӳ[* +jEPFte`LTX,ހEW2O;4==AdTb?FOx{%/` -~ N@J.DO]cёB}":es>nߊތOK[ǧ%ŵMkpGGG$ƙ |NBOGЋ8P׮,4y|LOG,WcFɫ \yG/8L^^cFzUAxzC.&)jreDJc`tt4 slzAhPY(S>i1GD~ܜY#?CP)"8B%uԁ*[Q/0uUĴ8b m‘dݤ vF}֫oG^GoG}ZijlwP3qc0B$R)Պ<+kijUOcVfFD#+U_v{+~J5YffSR3D*ʝ`]j%J쑝PiA*n ۳}- OKkIq'WcX);h&w|NhbL1R8d`yilT&z}$TlAt4^M@+LgW[FClajtiqR ECͲgDƒQp4c\>qX]9 VTݪ3Pي 7A`KЗp#QznXIE-͞3rjU[ހFptٽYq)Lb"RS!* qčh5^uXqoMq@jd0 IveNps%"Jqiz^^ӯ%N'cڤ~-ҏR\ c@Jf^DdHJJjRYVɃF'8e6dJvr;9J]wAr7ƻo%&0`}fQ.vA N,Asvԁu$s)ȘGIgtH_ {`QH; ^BU*yfG%$[%[ 4;cvXV EZF'WEsU 85s0E]7mK >\fy+Jȗ#B,8sc9 8noQZ4b00LT%T Wi}$+B|(mω ,-Y¢|NX0v*t%Kڀ=;o^( %PʖYt'Q20!Ά-EP!g9eH?} Cr:Aź.5`-۴#KcL+G &,%+@ YCxYiPU҆leJB9T4# _!Q(R5R.Lci Th}gPUfESi^a&qm(YT4a̲S@9c.X֎daF5R4-(6RH͆I%aN8l N־FH}vR=sB-dϫ/Tg׷3)ScR#FNv&_`?Q˶%HG E]] Kӆ1n΃^sQrЊ2F5cG3TI>QUqw?MX:Q5W9zvQ5{{ 6-gvxM?}Z-ρ@-v~p=oKM?v ]m 4D.NmP6b {Yj<p>F(Rj[EJ6Pwc3(Z#Ph+9K.&]1:%ҭ2*`2g-  @M+y8mӊm̝"dgJNs1y~V~\{Og'W ;3P KV):m@F=NCLS|XxL 9L,<*wnuȼ[QS Ysjեphd?4H 5iI8#:B=$NyFi n;xz+~zcA8;wwWwׄOO:ŝx=0?2E5E }NhL/-KENU4WZ$-.O-v889+9sYLNNG o << My eIꘀ8F䵶6nPG+yVtR*E,b a>²X)QPd#veYpkLPN DtOn- 륶ȩᩴNuA-$qPhD<ިT[F˵k#pj̭6MJ# <)`j&E#['OE,ƿE ": u&V;֙_s) 'BrI=NJʴEVL_gʫJnº7.(I8.tuE:Wߎ@6+Mbn6q5sX**(f#aF}.ՔDNWCLG|[SJ7RDFJG"1 NP#Z* m' Sc%ߚg2+ch<91b%x# qWF`~ 簫t0"GUuCZ2rEd@N8jD6 $GrV+WnZlQrҏ2nO+KF"u!S/>R2ˆ;橣4ySɐ\J}BUiͦ# ٨K)HCǴMl%"ICЈ4WxXaK;5^utkSlإxC^ {fh9a(ƲqZg݊JlOSɉ6dP `Fx:] P.HG&igWʃD|QJ jk- \&Mk 4a(LmyBӣeeH$f@qWO"[iw69ҺNDڣrJ; ܍>jOXhqAG|$GfS}bzX)j^{}n b䞶HOW>c8Kx2: u?\|wVyh( oNP)-lީ: ;DD"K^ڍ gzMax_C-F 'ձ_\nDƽ='&e)` sBMcy[7ˠ=y7IÛgpe_;K_+K3>/>n/twPÿg=c++dA- HHX. ' ~.Cl_!n B%s@E6,+w6 q99° 0 rgoЙI4KeIY7IlXX]ֵwaG8kp @;nع/kF ':N5xyO%ife;e _3!ƿ<"*n(0Gba%uAHu*91MMYf1_G1ЫM|ܵ1 ԥs}߷މ"~%$õ5<v$(_`;ؤlSrnSdW㙷ǿf섰)sQ2_DVTɱ ^@W2 )BbJ<ڿUP*¾e>(Wզx RAb|P@&J5>5 [N^}hRAHUz{T'UJRI2HHFG 4?~PIY!Vtt\Tsr.h7ɠƦg@-:k&WU'5pV'IgA+N8 ޢɠUGCT"VꮫDʔPFb T+P%J gKʳA:67~\jbV_\~⇄-Ъ'A+rD|*{m7d}@G7FBR +5irַ̟^ϖ+# #+5rַ̟^O+# +5rַ̟^O+#ܬ2v;ds[΍VlH.-[̆<+@h˰/Źʋ pl٦&=,47 Rep &R h(s ma|dn9, ɈRΰn07Qt}Zl%|)Ƨ'G6cMcj0Z1eO! 4{EТMмmc(0@:QC6?'O̯<9*7iJU6GD VkX$= Ye ^kI5HVY$Ak U *kZ!5X!5e|EZ*0CUak," UY!EC^ >U$s3W(ymZQQ5%;xK5$U|N5#;TiE[yJQG5!;x6*>Q*UZq ۇ/ŻJG 㨰Ͽ I$=F2UFA^#`kCUF05*#hFZ7YQA6;{NbvTbvTbV+x"lv2U1 ;*TAk*ū`kވ`kވDTf(/ž3$➽ͿjqϾ_'~J_ϓ=Myңx)|=7N^χ |_==_]{[iiEkEkE9 ww&,QbN.7N1jY#lƘBDhFl--XAjU!2R:YXt;[GgD/=73r͛qtz~Ī5"Cb-DDS*AxDb!U $"\PD}w$\)-R8v}*H4}1K2QGSBh#}Qj&PZЕv@5Bj8sɚl `aƋdRODA;*/ZjmdO*%#w0򢵡֦dR'@q;*/,{Ѻ!n_lO3EaRE6 h .^dU,H/mP:%ԇlZLclb*.L& gGAO@*A,4g =U|ejoXEVr$],255>QU|&3/.h'-c&}@ dmJEb1ˬ2ZHQcHfL.(AZ) TUC:V^ 4"JV/NibqBm" Ԋ[L~%,JACvCpA+6Qs/(G;螤VDA !$@H%P'`S !!ihCrSAS` Cb-ͲV>E/ކ=kڢrkmމW=ҏ} #)Kr!)2 Cr!ިL=LjʗPD?!V IMC\oT~ أ= ;O{~IuR! kJϕNK'Ө(#Q+Ihlr {|BOar5:i M}~3GN8$"''rR|FQ_-ŝ:F}7[8s.(+!]pm.8e,${v }/:\RYtdTa )rk= hs[s >?kc֝sowO;g_w :>-/߉I?ɾ8$fS f\2`d-A)/gׯ$}T^A OT k l+$/Hb4L@/Vzȴ3=$#BVys/i0AK4lUHq^TgzS@fZSqڑRYG&,Eu9WW ".r&=Y {P}CJ2ld[fxUfo:Ju WKDc*I(y_V5_ 2 ;!YO.-ć'ss82>h41˂ctQ b Q4wU4ؼd 8+d.Th)AAg3N/×n99I]+Ul)rb!2 I_2h p ?`rD#b^)/D:2hc x.1VVCMnn* 6/D>˴I " ppPFv?䭄6d97"eL_Td}x%AFϣ\'!$x0$xAzWx3 7_xCvUgbנmJI{ب&ia* T$PpkpHDVݡLE2\pI`715EU\k@kM,߄3(J>nj[hšËiZ3 u@}[K4pE󬭾&8EDOW K'ˌ&wsIJiRzyusKD?>064B":!zr"H+rhI8N44_qn(h6i357e.Tˉx0K7G]K3 60'sQ #W!A7$.IM'*}XB܈ZȴBdk9wn2"#O6glok"^7UlAB#?h@ P27@O|gȯ-_Ӫ0O ],IIpWB󻯦x$Um pbXό%1@<- ā*%tʺF5C8tꚎ/! M@fLL.-&f +(L E v%x`T#A L!` o۔g{l^0Z7'<ιZɚh FnN0@^9֒l(hI-ǵ˲0j}F3, _X, @'w -uNoFtB\(=2%&3klZIT0j]|E ("M;EO܃-8[#%w|Aa]?xqTk̻,㋭NDQ2ӾZLΐ\jg=-ԖQ$hU|6жf-KGc!``m j'9g%+̉Ϧkx=X2 Sƍl<^v5WMUrϛ _AeAJYK6/(0< &Y5vHZHMr'OY~h<EsFC ,mPM9? GϢzP5kk1j8ݳiY{-/i!x\,aPMr`n -"vG6<1Kuz~B"8XXt>Q qN :Ŏ-qNR̷pn]LN@b\`.gp;ӊ;=FJS y5TCטؾ+{@m1 :@Q!؍kv2^|Q"p̪#i-*UW75Xta|j7IwMY(Rqm7W H~D[9*e}k;4#cbX 2Ǭse{zRc4siYߘV,d .yLIHj91:3"6+Y*#0sDQ;V: S :҃ǎ;ĴO*@V #v;;EgX|F x,ָ:jp Yi0O,]A/ͮkc3vc h1:z!ਫתۿA.'2A#9EiZn0>--:>--^KwiY~>ME! i Wȏr:Qr!|XOG,cFɫihb|{*ox̄79odgcszê̎2zP67pdl099&D6:e0:2;noPzΪS§]ds߸G(P)iѩK'#s,!A@4#Х<.i"Y#T^ܭucvH XeڂL6CwR51E#Ոɤ4^Ē. %[mTL5Aw>LHȜEp׻@ N=ؐ:HV] x.Jdl_H i83sZș2ʣ4W=$HQ1$*THSؑ!"eUdWa;k R_V,ՕBj'ՄeMIkY*_S0쐍.!1yq8UD$q9~z??Nut~Kq&tOdn|ZFíB'$QA*Ǜ;iTwGsfVtbP짭U&^7vJ.M 3SDN4lQNd7.M$asm;T8ݕED">Y |{ŦY0Md5"Z)Uos[ܦF ]3/.y3G-qaA Z "qF1%zְZT[Y6L BUYf"\b>"]T䜆ョl q-XO9 A PeRaS>g½"vHJ'5أEdHSi;\jɹyON2$ㆰ:k6L}kGX=CYuv"P O٭nYLw2$7%-|kshGA=v%&͡^3z^bf38F/:'2?Fr'$0=Z(a,2;ⷜJ~ן'<{eVY+4ima#옓&kF>n Юa[ ' (Ddw3=P|Nf7֛ZYO5zu;ziӧqPs^i?usϫ9S5=paw@ kG$,7@=LLŏ|)IѪSOnZR7$iLL5*U&ם&ErFyr 'ש޾WPH)[HAGmSK,/9]$cq.w߁iU59liTP0i^_hga4aP @ _׾}- OKoI'K[7PUkw>G/dvj X|7ܻ^z j?*o Y6?_^Myqe`،UH!y![˃BUb9:4vQB!^ P})Ռê҄lQmOʧ9"%A "BAG@gH<6"r96Tec^iP&enRv? 4?{[i44G'lV`c!vFH0EVJz }Piuޅ#wD:ݤjsVשqZa ó,nk;F]}Ðqڂ:kD7T;>'ԂM0Lmdb~ܔVP>k ".N3Z}.^%5}{xvd Md(_Y0rT7D @Rcd (`5HP zPC09G`n(E8W, ^dhOg'Z G$+hxzr215(Aذځ3ҷ}Y HS/=#d25㝻+ŒA:.fu"D )u(=hVx‚RɅzi('ƇVMYQ`FJȳ)꩹A4HhE>aL)EcI(t -'̇(AfDyon9(_.PR0{\wE?}7|Y*7-om(Uo0[Ѣs(F~I- NhPPs;<9=t1Ag1x<ؙ-3ɡ,Ya&,S.w#6CYϲx^e3ۤ-ײ 'mYYCEuفU\`6v /%:YIaY1yU]B&bq+#jYEe3ӄ,0RS+S"Xs2Z΅d;]4*%9?hg,<vt(\lSp2:NNO\>#Uħ."~߯kK>tЉPճ#nAEad#ZbX TQ^`ΪVm DUd}ɠgjQb(F&5,NGw:Gw.%L!y:f6, 4~jl){=Uim)}-<_zة>mûl'֗U6zy>E`4GP@zG[lCnul}І`@A3fAP:tԷ{UcXM"Roe sOfYϚiԡ W, d1p{9bLvU%"Ijܩ(%nlnisv9LvMu[%XjCjIx  gf2YfSZV %$յ2跮Gb(g(҅2Q-Ȗ$WRX0u 4,]K~rσ7 HENV-#ϧTMt~V̼/!8jIK0}( {rL~uo%P6G:bi` :'pLͭ9\[3"zNv%ݩrNS22A2Ȕm9g97rډebƶ/! %NHvfK߆ͤer~WWoZӳjMt< vO$4+Ȥ 3 :`N !:[ڛZͶz}fOL!ڨnroٮmwg_gO8qwN;+ ,p ae5љӯٟA~JoˤFgtEUpYVl">H%H9 47:JpɹDKRiX\xhv<1L@'S#a^^&fH),^Ƈfǡ_r2ĥDb$53ij|j,1;>O^Bhrb"5W$QώϤFg'4қaތMΫ#éxr~Z>LN̏c7gfRsl|j.E'*L6;^`CI2]@)1L|& Y9n>>=AS?~29ulf'IC'98L$sC#h0p3i5qCϧ3J(LJ}*NL'R9v76>H ]9 R@T_I OO΀h@J^C)?)aIPȿ2H- O8_ʌM_ QBrWN|sK*IrCCR!9AebnPr$1C66eLŇs=d22qBWQdJvy#yD4eN0X (:LuBk0z rA[vr7)r}h0>.9K KSa9 -xĔ/K3Ysj:y2kI`yɶ vl+Ӈ`M_1L /VUƶ'5(K6f? !p`ᄳrOd*؛哄.lk'ghGxD2NfD*SeZ'ɎpR$2U&ezuZ7sabKvlTX[#g#%"#ۂ"-yG$DޖgD,\Mb61N(ΗsQ0!h25$fUgzf5zG53񉙱PMdI\f4uHfxpʁԈ99%.Aש$!&a>IڛMsjR9(=ȞMA }޸lcp;ip11zxrDUoדK&jA @OMÂ_>"ؠ8| = HF"PYY,`wtE O$<ޱ8ln 2;? 8<`s](YgW[xg0j@*$oלlƄ<;Me,k$36f"':E͑.,NN.!g9޽84`a2)Tps ]kceJ<UR4w\uEh*>$ji<8ǭW!/TF1&BJ$*d>Oae&e+0lNFJ8zC̘!v_.Έh‡nVӗx59@RPPttH!kTHbb=Ǩ'HvEapUk)SԺZ1/HM Q̲B-9uw9K~oG3nvRgS. J _Gz|"9)$6 G3K_4Fw!/Pq$N0fJۨk>ճϕӌs5ܱVVh?}w VMALg2I@XڳqAlB󝖗-T]eDQy_(A@U"h."fId *i@xQ&ȡwehdo #gWf3&\.p xn !3 GJGX߄K))Cg/@`<6vrQ[8fS˚ "m: W[&DJ:` 5, L"r *^4 =(~1GX v%KS\]y!S6Nv T1.]٪ܪU P]5nAxE)gRgH,8qtauTZ^6Gh4?,aJ5 i 1+bz dlGޓU8 L"qED[eҫXUp]If/#s*EkEK!ps }Q B󴫤MX/ԦQtϿ.#kwY`sV 䆪-MYdd S)| X/ގ4>cӏ*tå2U1׊#Y1gVw}6!\ׁp Q@ͰÖ{@s=vGiMqZvw@t0vyhϽHN`Vc]dN藲BʺmYig>L6jukh#xR$&Ƈ={.޳E_gW6_g=gOb`Zy+vtRǬӭ.b(l[+T+WX\4k1Y6f^YY\,M w@wHI 䌲v㺊ytp|Ӻ64@4tI3Uؿ6ЙRai<#^J9lJC4Qd73GA5K=MY2R?iF&)O¦vYSj%&1oȦU2CΜUvt\IsϫOv0|ncY?jJJ)tONjY]Z! oBn8JzuGQ6!hr:<>cZ*v:b|A!Q*<JyP:83ڬ5JǴ F")T{񈖘Э$-;k@ܩB^x-~ e= +y_ۿaJ9ѵw?v{c]]րv+>Tc}l~JTϯ띙mѯ %}E?ogY3ɑKhD湻go?"E جCGsE<@|p|L*頕wT҂Cp(M;AO!r('QJQJ|eN܂\֌- S"rוY=5\ٽ';'%,0ȿ2Qg8tQkk&2GB\&[M'+T-ȌevV:  sXwOgVGzsM+l!E B?A.M ;b9FS-w-J`} tZ01.|B LtVf/,p{6xGEkEE *\d#B1>ط/Jm-^wA bFd "z41LHGϛ8klH10;0M 0 |ӟ@`Vs]ݹv==@w}}X ݋p\_?RՋ.rc}Xn}Xn_oSgkf i`n]"쟱k?a۰+H1[n0;s230a{؋ Ӳ@|&}7UH|'i:\L~Ii`Tߜ [ F|ZxS aXiN 55UcA_nNsOcgS}ߝpbDb?=1k_6ĉDuVnj.#a@X?Wv^Y_a>YtL'.<=]a4t~Ld$ßl:BEQ'z,E#u:kTTRKR>P5X>h>eZH z>CK}Gw n|rP ?V*7Qwt'`x<,fP#\,2DYϊ']9_KuKSd~0319z=ZVX5O?N(VUE̺5/hՔ Ҏ $mU439`[_ۘ*RE-O]{(EU.Rg/:Y}BPjG4֭6O!x4Nf UmasUjY=4Hiڴ7UD  z6F챞FLxrf O@ޘy"{@P=U?*QRh.u9Jjff-u L̩~2l4E>P+b `{[Xr]ԟ%tw_t.Y4ȱ ńYi9DW(WP; Ș@#8RWZYU$lFtP;wX!&/U 6:*^aA3cvȲ=5wRI NNTٳ@_,QejQ |6bFEn-mde"` v/&n v]}ML"{\V/ZF%LT{șp^],lP85@Dd. F0&Xc]6X2 \MBS0LՎҩ$R2Je1ϱy%zuǵYׇDFx.gƵYMpPdO9\\GC0Sx3`87$ 3lz-mTD;?{uoo?gʻֿ_o>pv˥R?L66 _8?HAukYuw4@zQ迯{rm{ţN:mEvOOzuyʏmsN{}N=ЩSdȗ IN9jAIrQ'3|{P)Ob%NݯJ{ض=\{{M%/Oz_tOkL$7ݽ?v&.Ѷ_~}ۓN;O ϙg>Ag>~#i=Ƕmu~4ڱ:p83>̇ȳسֶ9oc}~WW|m?N9m9锇tGOz ߩ'M)wi?>$˓| m'SNɧvO?:ySwYݧ?'Cw<|vå>sH[k~'y|&ז#?w>?PίGw=u|oؗwţOy;}.]Zy;E]|i/~{+?}Q_n>%oO|G;v^}m'LFwSw-a>~׵=Ԟ'>a~n/U=t/oS9?} +n\\n;_<'݇Nn; |̛xz寏H߯ڱc(utzO?w};o??.Nߍz?nCK|͗oY:wN םw=ޥ{ןq+?^+_0߽¹OH͏;9[F)}t۞zn;壷rۆw]򹇼(Vϊu?xO K8|m?}ů/{|x埸^7W?sُ߻'ڿq7wy;~ɋO^~1zS1V"ܶl}u_G^~ҟox'?yC}O򠏿|<~ˌCx~[}/ ?wMK^ye.:̗sϞg}+_i<͟Xxvϟȅg?ˇ_g>k1{[)W}~7 8wxysYogOo!zv_wwܸ#|gw[xw^/=럾`~[O{7~|CWMs{lu#>W|[cWs~xO:签}S}]^?7ݟ~'~zUݯ|];>w|ggVsϛsKORpǎK_/sj}IoxCW߻-vm׽k.??Co}Gczsx7~螷qח)'y_^s~=oo|__߾䇷ݱ훅#<˹s/{ߏϿgy}{9?ޑ,ow]_/s~?\Ӷ۾x|+GXy@9ԛtesO'? ǟ>m79N }W _}ǟ{ǯ}o{ϝݷ}G}_U6yΟwǝN.yˏ< reؾđw|P'e=亻_׾}dN }C~= ?Sۿ?r?gOW\]z_ܪD/>IWo;a0OG^V8ʇ慣*݇c]C_oҟg}GH%x?~wogny\~Ork*śNpk.}5×~/'u<3x W+߼׾-suɸy/uoG.k7~ot)OC߸_/Y߼h{r_~޷>g_/y?}ۙo|Q[<n実??yyoqK}O}WRw ɿ7s /Gx׋9W}iL>땏ލ\[_ɧ|>K^GUOqig^__ׄ|#"5muۣ d4~4*Qcx[igQ>G<9oG9m<ߞ}uŻ.8xy#  '8?@zܘܦǍm&gS"O;OO!o#)O)$c۩9s?a~oy{T<%')QRFB?x!;ԇQ쯞~h7c]|cw=_(>nȏ+ٟ?gꃌ!We7=/y׋}wg6?6b˿ON/~ڿ,~#+>kq$v{ޟ;??zƝO;a{ܯ^s_L_~5o;諟?~΋sϙ~9Ǔoݏ%W|{~}Ξ@-׮_U͟qˌ=g?wsoO4|їxuOvgߛŊ~ٯO~^?};n9߸yvçvxg?}|?9P(cs/g~{o]i_=}/8}Wߺz$uW 7?!83r#~SG?OW.}}K;;u_~[['~3ol^W|ԇ_wϞ?}{_Ɨ\]ɫ_ߐ~9;^o<<=yOonk^[k^Yk{+.BgM_uM/zqeG[OǼ'o:cKx羯,!O8a~򳹧;ԃ_s?K>{Ӯ?|sr=W]ݩ(zuwKK>/ϟ(o-u~h;2{~k0{ĊmW~黿~~?7ow÷}RK_+ʏ^Orw(/{~'&&~gs7~oky<7w|;_;pn{oNşס}]ߘ9mO7]Gӯ;cF~?>w}5_4x%=-r12^3c䇟}']{f~27>ymo[S~q%6Gu?^]f#Ͻ{+7w~\W?ѿ_ԛvyޱ^sEGn_՞[?yяws'"/ _:rﶟy~sOAW_y/xnmW߾~q{zr/n|w~Dw?>ߥWFv6m mKdڊ F jHD8L2p"uDe 4TЎ8.'*P؎6GX}|G$B~8]1N| _PC4)CJ='fuzAAڨ.ղ5gwG:5hkPxPx 9Hs5#505@#אS 9HvaߞpxF~ DB`&.Vn"r'Vi\ބhɚNN8i< ȿ21'`1"c~e٩6;J9M$b4WKi$Lv G,ZO#*G՘"*[A0t`aj2VH \)AKR8dt \ŌMOl k*> )IN%Cu. o|'w.zwmPڳ!-uIedA$4]OMMs3DS yB9y?[?( . (K!HC\b>eX)MxKN]aE`UE'g&iV2 )]|H·h(V&`zrf617ǻPAs˯CӇsBabA9Vrď_XCH. a2du4٪׬SDBpJ2U(/ΤF6W,4MճgJղsBe1ߣт!D!4ESȝ";!42  V? |6S)  @OK@rVz,Xh!/BQVJLG7LsR,4d;&?,3Q)WpŝpNJR9M{8zm*4ۀ;JiX -PT+ " 5KA9ٝJNL "E:s:JY0m7tMW&tCf#'c+{[PO^~wCqlj(֎b02W/0$xV:ƥ  F”'*h+d*E@@gRɞ"&BF#, E\1 3]%ϏNFdkҡvP 1k;ȷaޫ6k3B ,~㤋s wUϒUHJ7W^A!`Q%'>0 *GƱɰQ yK,'kL˪)K*G#9GڣZ OT ;joȎӑg <γ0DF hy";7TR9A Ñ C\e 'cߪ RbZPU؎^nKT&Gr>BȮEeleE')J7x.T+&ônp{@zжT(3m6t ONz5Jx޻9ka;]̨ƿ^E^,f+7P"} ߹ ;'/)cVe vE4rVMwf7Z $ћL#"EaXJ&\F4Ș-TQ"$0R }FURV@]R#m RH6Mrj.UgWv5TbJ*UKe/PN ! YWy+Xo^*q@DUv1A#ɠp/ ]K I%_H~`4Z.矏7$*,jS E&MS O+ި-J>;f!/lmYSef@]#=^>WhxQ˙pE_( 5jOg\YUxSN=ڥT,U~DP_ bcĄ7L oy,v(f*W%8ؘΤ nfĨ"(/b f`W^AAMk)%8˫-@N!H,c0ȺHW^m#@CdIB[Uq+[c'-tz.3Ua-I`* .I2[7Μu,#aDņm/V{XTžM jmI vwS1Vt2JǓZ)KV +5@І&g@PsC$^(![jͩ|>WA!]i;7cݐ?zzg=Yo>ňn}vݶy^GR=nڶm2eЕ"C95oo6ʎwXOf`IAXlNqğҫU[}+ZڕklQ grp062:ȿ1a}to'5\cnt3$;.jq YH(Хn C x`n,lq >.P'[͌R(iȇɐRR1QB1*KK`ÊmoCkCb1F+W˞J/-(= kΠ_ǏF - 힬m W^.d f*pDެWnvtrI1]BlaaAy"/̬Cv .linad-P`8rt2Lә4;y.d,<@SҔ|jr:8VGBϙSXj,~8嶑D|>N DJ/ @ۺҸIđn5CČJIy8cN(:Iu`:}S[67BcLy 0̡F=R=\ll®se%.>G=I:mԻ fYcN`(֭b);8LF+ap'۞MqVA!Sfܺ`[YKaf9* B5[IA+c퍡%H#pB}T(Y94d9V5d9P7[f3kCq/RYȊMt*ig!B*!3M؜- #:Dc7W #EqaxP4;"U̲%dZ?\ dzX}Q9C>Hۨ)ivc]WO}:UtZ1d/x̥yg>[/0zd{X 8NC+E+uA/a0W(JWݡ)Yy.wBqB(UCe۶B\2z6Z&pGd&ZZ'[؇}@kf8}jiWqElΕa]j.a'Dq jt n4fgve a.UkLDy+){OS6yiQ/KS)pwz]xxhmPK,v ~Y)22ԅfLS.γS+u}\{l"]pXiMkrc/2Sdcs] GfRRv|-G0$b=]2P`/OX;Г3 銑.rrv Y2Ρp+%~,AH\ʋ}U&tT8J>kLi{|fY9*֓S!PO}ޑa8h,)̇p' D/M,r>q_ A- *5l#E7TJQR mCE)65dM㨤gFE/iV MWYT^06~ex3TA`eg]_xw|U˹R00 Auw:|yˎ5ᏩX"ymt'%!>,BW6#m6Z 9 B[RH2@+)M" w[\|jJQ' xv0zEyvEaNt㒉ͩGT H۴dF=vq>~EnJ6Yg |t i596o-Ev69ͥw(Ŧ]9֝g7ΟKG_M гnpŠMg~]F֍o-}]{ii^Aede% ()Aʽ*U&.=iaM(נ ϔ@v=bL!_FB/$'@i".k-< YR x:-,ⰪZ`7pMŇSɩ( bVXڐ(gqOJ[nL`Hxeױ#ZʘR@48Sv yHNbÖT^4Dc'4nYv ti c`u~iL&5JZFТt ETk!rEP ȓ,7s"E%ɜ]qF"eR&l tgp{50(1KUCF#cMلcI'9PtF?>km z~W}M]#ۅ֡%4ȿ 7%'Y;wx¶_Q젚ώmJl!/k˅^hTujfP:(\&@%pExk?v PtʘjS2n ㋴ЌjRin,GarLNvhaLuXH)IJqf"E;xxKdB#.8!ߩԘt NV]7($7M//vfjr^!_yː6B,x1{azu|A!2)՛Y[&AK6%^|| D?B."!PN=nM24]`R<|CPR.%t3Y#i9QٷQD͑ юٺt%UQM~ BA 'd|Jv(QZ(Di?8x81;4 . ,8 .a(,>o.~;}-zGx\OE= 0dONnk,UBn7I߰I'lA|nҼ;a%6Iwy@~wu ʲQ^,FΘ2=P(8F8 F%V!zaC?[;6WF na5cTL7]M R݌b}xY1K7%f+gYov]._Oヨ ok}dgi PRa+\AiX{r2:AԴDSS&MZgn~ĩoŶhŘ}ƇpSXtC]`z&KQ$0HsqDv,J89j'p'j}:!)UnqVɣe=CE_sy #l-9l&1<' g= }x8#ZFǴo4T%(KFAd?d"#7*SP%:k"aL騼YA?jtZf|Zu|Zu@XD~ktS;4fK!qC:W!JA1ĂcOSaGWfg$yk;@snJOdGDiAu I0aR3)$ D.V<50ȵŕ(@dI(Ml|?zKW# $\u#@#=v}ÒBz‹',z9f;_mx#xLcwm ÂT_rOp}=j_ZFm\Y(P1)k>YW!yH649>Z7Kn^/K|>T2 hz Z~sϟ8ny5"y)H X Pz~fy{Zac/kvh*"$ ^4,yMǁ68_,n0r*Ɔ r (Q٦gwS o_Pԭx|ÌІ Hd /6M[(BpܩDHdHħ3mE0Y#]4k- YAڨrz-_KWܯo@p[4 aV" .NC=9Kx L˜=@ Q_tٞF_NU` :qC gƕktyƛ@ TA* ))Tr.1;41=|IjnDb/ۻXi(db%Ye=)d͏935RQ`!.$⣩K4ov| PԺwFAd8L13!yww.#cmzMws{]@]u@OqNKoϚVgWSk[=>+[u:_]wiu1թcezsL※4u\ӒjYzֶl-{յ_2DҺz>UX>^uBBB=sMw]3?0B&|T]#<9'-h c.4]i5LR>1f#h;T8 F*" LKT} =Qm;b|=idF3'Z#dg_ȑFQs:kkͬ=f/4j*&uJ.V[d[_˒$W?EȤm$u){y9400op&.LUv]V&@ D kwCJP }3IeRQk"";җX@\UK8=+O"-<i8BJi =ygGdÍ[s+bx$eU:X{Ųq. uaAPG77yL;Y2ESl9Pz)D%z%0mJ)v!j2Ï-RF$+44QQѽtɖtdžU]M"Z$Uާ (G 8ȱpcW{ t<٪J'lji8[N.?!ʪ!q#ü%&Gx> mYdQ6иډ6ȉg$2{[#6ܦr @ 0^^+U&P:#4 ::=Yv0kh=jFaVeXW lG``qybg8bԤEckc.!'\L%h`r;H!4JӀ.Y&wvcKŒn!欢.Okd ި&.Wہ'n֗]s`(dž Oު3t}?#Q?)S102HP [AeA&Qt#6h z-]S.N^@K*YnMN-Iq8?:+w)7,!C,4`C\a3/rynШ˗ԇz k|+Ӻu螶)|5oDQ0)؉ FՀS xYrRD 9$58㜒zJR(C 'd$4j +ooO ]yQq?dmX>(.<"r$2*$#c7I;LI#1GsAͤ$i|i#!Ce7?pW+pH@Hr8Eb;,ò/lFA;ULv?qA܉+}WRܗZ(s͕;;$j.oV>[wʽ0M" \ZPZj3`z3y|U~#\TM8%#m^ udl䝴y-~`KUaK 6v:^c'h7S7%7׀ߞL~2w>rq3z ԭ_懖zF 4#::9a:{UfP;^՛uX;ô`1Doa>2\>TK^A/*/NKLU=qi>UHfƢ"_ WVIDC;^ :XSAiT>}3I?= `)쾩}6;CF0KrІt9#e9LХͩ\a[p7D~3d&ݜXzBsM#!vpT bW8 Ŕi P } bN!Df݋@?N+*U>Uȡ!/YA+-g# {: i i;{GKɸ8c%qW^Q&U fck ygR\J"^)׋V7B ms.{ݗYZ1m'O#fs R؉)MÖ"%I2Η!$.A3|S9VO+?ZJ??y$*ck+iOWצ7tӸ\3FJu(h ^G۱iLJ?$F5Sk5 FGG 7I2FI%jT$da*G ?ID]+n)2ίd|~42zLzmpWMGawم,=Xj'كO#zl *foJg*xUDl~}9:݄w)æqCj=\6W @($& ͔®=݆60V+zhEV[;di\JMdpbb{bU,LJ0 %R#hkߖ|[mUOM񞙼7uy"~b\O E--TDY.VJgOOl"t~UxQ>"D9oLBeg*K2{\_h{DaѤYI^=3cKo XW+Jj|z.l_6/ycʂ(XC~.guޮ}"݃RXǔ͌52I0hKd8r29%Ŝ!e,xWU$a9N%zOfjWm zlfzA% p-t6X)9S>D2m\EiIo쩞2gx/^nݯ,Id;Qe i6pa" m8NdHdƈk\ Hf5Q mp, @&bD0@ͮmvsUҷ)yr"'R$1 | E) /+jټlf(uv#C+]5?)TIIY'!4{FR7 tk͟ToDrYlus̢@?{ -?D;:R9hNɤVgi,~T3VU^.匀l0ğ݁񹸠,)U:'[KFJο7ц´df4P1T"iC>2ZB|c#l0'([({R+%Ą\:a~F4r\ v,_ǣM9**jvߓ0{:*X, g ׏<{5A*bnjQwQ Bba[.NҔwًX;\ AFXs_ZcyEc_c4q (X% ͍_ ʀCjB'RW;*7~X:pNڢ?'vssc4[vC#;@rwZji#: i ) 7 SMT}k63 XQ sxxNGVJ+Ē5x85 =>mqL eҸmDjIr4U ;c;@u[Lb,ᆰqc5ޔv #2Ywe "6-X)DQ:2CnOs s/<E|A[7暦,&q(Y>|ptePü^K`(| tOU>f?Axy8E IFW O |$dݴvhQ"@ж/ u%mŌ?8Hf9Gkl7fylc26ߖvmY9jjaZךU5^_Se[]09~47H1VS*g"j!&oS0mPTi$TNA\@n7$x$$ө| DT> A'~E 0ڒ dra&6!֭ W W0y \Av*P)irbjh fnZ0aYmmEf!̲\NLb&L9+ ۴a'v~OA$*>&1)ۼx;D004PZDH3,r!qW!v`gHXFa̲Yv&vMDz w}f6:+~ b~~ D|gTBab=C?:A\s}(QKЂ%}<?Aԣžiz)=~t ̎_J @ `~7NQ'4BkD巠Zhp^e~|*}+1퇞}@|q揚79D(p(4nJ :udXӡ:Y $`~Gԣs dkC"S#/ٰY͛kK(/-E_pygW( \XSp``^aK: $+zqT0!!FӠ7 *g%9I6o.2bWOOq>/*qۇkFkPv&D&Ҭ{F?Vv=c)@=([ E'N ?* Z+:5h2N?<*إ0n׮F>Q` *ò̧f$!KWb|R4#e-4d=f6Ǡטłkq-D)OX`~hq%{n R 2ap4yL6$V|VXbTy"z·kT"~y_m$б8',çDbW@Fk>(E!4A 01.#ȏ_Ҋ/s1.˄s^緶{!PvTR2KbTv,Qf}q)2i9 )bh.8B+tAN"WɿJl==)X3;v1/ e+>ܹpU,L 3LK$*i`wEhDr) vT1Z9N>Q3HY+K[ 7 6[!@/,|V9CYH3>VYc( cmH,D{b͔y`VDfDQ,UXe 8][y d= aC2dK\\E0Q&dbGiT<"d'$%Y-T$Py?h>:`>):6͋F86!Vj?%5]-例lV&7a+ l)UtNU*N0oPJ'!DevtW |x+n< O1A,/.M{t'j ѽHA*CV[ڀx,t+jٞ цOI+K.Gi8{/G #ApPq߫)pgQeay^+*T_?ŏ@T;AQ?Mϒ}!3 A%goQNm-Dz^Z+S j|v6e|xZ8;=3>-lԞn]Hia`ojadw6aOSҀe+E%9&.oPlau |{uR }A9\8:بo i{PQ@Wi h<->-~ӂ(-~~ZhMJ3ag [j*yvzc /Mms|!FT ~gyr^탸A~BzMg2jd UDG8a߅9;h(Óيw$L7yZyv:`mo&%ڙdIֲY.t1b*zWM İ9xŃZ[_@b)qYas$_l#_E],F>FP VI;o7 o=v |$eZ|E w͸QzHs d]jLjas#]g/_?i7a6/xW.*գ&8<޳Tyy8DW/9ys#@!䆃G7yk-FeLFp,AX_EeE D':j]/RFX BW u8m046ǯQAPw!E'BPX\{"GV<)^zQ((v=$77jZΦx!Te[ <=/!2&*}F},sH 5Ͱk2%fD[bcsj!ހ0åXP"x3 4Xmn 9^\Wa~S[0 }foSϷoǀ9tv1YuȜ5X5Po7&- 3dȬ#!MlY- .WmY8SsUnHeK@\96Ҩ'v}ÄYH[.fj1]3 P9AP74x=H{ҹdp:%/QM(M`$'QiV:^qM_\W?sKUb`>%2ύ*^Q+.?Ɵ=TyB@vêһb:tO!QD%P p(Vʡ(%ׯ ڏi\. @8cn(U-#|j)%\](!gZiPE _1,tf渠8;SYyg#+R˹sι;..t9zf^ <)ҙ 3Nexb2D*Noױlա<ܷt18a Z3 QMTTa̤ H4h9l`QS,y`~TsPyyhҦyzS`;U8 ̧p=rs_(=a{xѐ*Yʃ8 D(?{pjDoaTMz=uTtW%{È'?.Q[5_z8ccF!7]]jVc`9KI$y\LV 4jbWcj'Ts bnmftJ2D4( `?r1' R2DBOx536'U84NK4'ٿ|/GR oDÐnziA!̺Q[Ϸߨ0k{g @O @ xҤvN8zDh|Fc0.(&s1K?+?ʹi^4n3 }Ld*v#t){`؋CZf{PP.ڭuI6)գBMh;4 5mCo/H#lXnB5 c(FTQU:rLŦj-ZYhBlMF sV]`lYfqX?FT5̨$Ӝ#6e2 eozAq2f 7gbݚ#?5rn.?71M:ǶeTrEhmb6kHBȦ$4Gw MLd5Hg;V#r“Bc٧rڣ!BGhYJ'ى7C>PrM16$-i=w4⾦t7voOB5( Q5Ni!kpC@3VS:OnfI M+ =!{7ůcޘE,!&ۦ$HXy@= M)=AJ%wNbvݤ uRME[2}Plec\$BGn5iS%jb?@50Yfo>y؅IY /)gtb`֧.&#o9Kі:A^ gR+Rifr7/v͒M+ďC4](<|*#ZC닳q"zp=/I#*g_)ZC9Qs?]t~x9ru~xi v*hZ4{ǧhL6{ftYbTZ1,ff5S\ZF+A)K^$6;PQ/bȐjT*Q$Sqk9埗xꮡ0 )h [;JDTp8X*AxVgRKc]z%݋aPd GernzPFa2:~i8vt&dždlaɒ)`0& gA q|Oٕ**DXcC7NJ`:[e|YLXrO*N "F ͷߵ sLQwIaѹ7oXZr_~٧8I4s^|̈́8٤i $²."Bo KNˬ)hH@@R\fKF 4 yr'KczYu /28*JbSEo-g=R 937t$Wh>@IVG>y[yA((P,ΚMJɠג:3mDoMc:OSZb##Sap;& dKXQ 6@<Bϫr(,^(uFgEFm_^=pOq*ëK1aٗ0Wkf_CUլ'O RzMޖЯw{_)57| 䗪I5Ht5n5OV:&ǏKՕC)?gIzvFǙ6hDfokqUDqs*2OCrq< E (\Ltě&@k5_`AI HrxXlvKw)m<Bmmq(d8j=a251 T |uD9Zfk"8!rDt[ I=F~e)@GU{db#h˃s<$K> GvEZ.ߊWxx%--N>3-/hH1/ȼ-ǭ@}/ۭ@ y^KOgpWwݑw 8KiYԊL`.?,U+]ut+ /³vVf,ѕ=u/9[u~_t~8Zm@  lRd4*z23of3 F/ʏSGYVN:p0Q/%f[aB4) ׍k#P\Ķf ѕbIe]*8,z"Wm9s_ =E=$(KFsi:gSMS@Z[|j"PZ\~]o_qqir/( z/V^x2%eVD"E<`K0/7^ QD+c9[i%)J&&sW^~W*UezڝI+‡S6 GRo@R?xT~ɛB(q3a"6P0JM!ާө&ڧ!Ԙq9h1.%n}V~4@ ZM *<~M+"B^.mخm*AulpP$G]`<Ժ|elq8 #f^~U0SWttL5LqZ&(sr(tCH.&&"Լ;9js,AEF ͘v(yޖĎ MڝjĖK+94,UF1|Gth cuMZ!c*hGlG|YoaxM؞ˣߔ́wj"ap5L릅9鍊C2uEuQ5W׹'t; '| W` ia îo<^x4++߯q⥤BwkP]Pڢ60tdvBjl. R\hzF.5ܠ"*XqŬAۭV1An(n .<~ͪ·ုx>Nj;緷ggcp~ʯt鯿#&O|ȵ$"'TrfM F I.ajա?lV0)t7}obS^auhB(ᠷo[< շ+&-V1+շ /KfA9nPe#b:O*m n 3I J{&g -ÿ+nP$x1΃K7 w\3}e  -΋e!#VDJ8$mg- 0o⨱1t@=Sȃ́ם ϢO +vS8H!$+=Ѵ#sgJ[4qܨ k=Ē :u~Fkm"):-8^%Yy%'8(M8; =1lr"XeJPQCUTNDž)2}p,ki5l|9~7uԌFǂS9&tj%4kr,$ x2gD\5`f-r;7\TJAhLOYڔMY}| 'W gep prr %t4;7ܻ׹Y@'4xacykr N 2e'죢 LJu|۰O.sʢl6hllv;gSݞ/UrMO_wkCuq%gjC?''moЧT+s6p|ۦ~VM~i^] uLki+O5d f8쒂 MEЀcDG:a=ee@,Za-'RSHǎĿ!u{ B呯m?0[^nloZSZ‰~KOg`cggKRoFM53 7ݤW\ABBH`\($RYnا*zkxF? {ݤ(]땹Z$X L`Zr+`!6^,x \o+a`4=\[*+r (gVI%kї~ daCXzsevAp 2^EiXVʡ=iGԍN깑~Rt8T-h^4} ~H2O7 z5-(hʞx.q#}\l$d+wh3(6IW|ٸqvF3TdBIivV+lC01! f$VmhH"68JIó2iItOIivV+1 ]`eZn"Z>Ll|Y[6a~$$j $qZٙ8DG|tI؜lg *0n"4,T C~kYimnJm3;\ZLKμ{aL#\'rR,J.L`v}4#C.edtޕ匼λyYfw3<afVǃ}e*QDrfVI' dub81HgItiP<[N.5u/iBo4\2>*9O={qplc8NG2IS39}2zqLS8k|̞-#<Ûu\QS|lG tq}953B}ʞA}˞3A}˞,Hfc5ݱḞ Gwm8oѝ]bGLHjaַEGMh*gַdDW=97{`3?V21GQjD͠c"sb/(lv㹏o@ΕI$'WF"@g,zoS3kCgU A^7cרV  /%4TO_=^=c`cij3&mXR{g:ӗ}OgɎX|$0Uڔbь'-fHv;$(t#)].gVDo8d\].wY{lS,@^zbxe*]1))( mZ@#g7-.ݢj&VV6d1]!!GMsv(Gwqwa\-ÃXDŽqmu}_X;8ݝO=Y[n)O C)ϲ)P^pWjo5{KN3ts1~/-}rJ: ?f]eoɨ<"v PXr0Tno{kMtZ^*1V0JO޵ĊfH4턪O6lx+>$a/brYduZ6|:;mآ7`At*ڂP2 Gl@O˼ =^]*t\Ej%Y-6=9E8_FA(̵3N?Q9 ҃6^[()`DqT"M.Ѝ {w?0KO.r ~Y7@ ބ`:y: )%hэ(&?u [v }*X4OؾdSϻ"<^{2S]o,|ܓ>ȻfڳYe&NAƷy 3 3'N?b0uN[7vc%h}Q KUwtKE'? w2a'%ROt'gi7 \DMN OGP \пa?a'( h~Y|'gARcM4>?0wI&M^3~pV@Fk==L)OkI#c:vqɄ ܂6[/ꇘgE>S$Z2e!ḤH@<"V[$A>GKb+ҏP7#yR!-nиU62/F#ޒ>l8$M+RQkG.( E ds+'(3T5\`s di# 7$Ĺ J,K ^pw'7v&<qee"_%8‚)%&S0ƭFdJPfB%OK&X ;Rj4?hbqD+M"Vr}q]{gyc=Q&lsۺ($򖤮Yz/+7dQCv~u ba}X-5tGcl~v-˖Sd&QdA'$7ZHP:7A9vs=K{,Wϲ|`~<$l -L sM8 s lxx&U#HWYY-={E[?ya //Ʌޏ&#羢 kD AAkΠ23<G#dEy}jxZjyf[ ;{ bff^o: ::&-}{!~y|$ c3[3D*M*썛*Fpaook]z^|$s>{CN'TeR^=aNjAtvh+r|2zYfo;uYSc[dyxM#N[2}wp>:2#)P(n M( dD9t9\Y7n܁(7q=B Cwrba$*ɲdV%Twu(L)^ȫT*`YP#Po:iNIig$^=d,.wm`c c>V0Z[\\k3SO`)CtM6N`gn51H90ѼΞKW0z΍c_qLJ+ WR*] ݅g'ߜN=G9j^fgSn0w;.i9sfpq03 #sesڢ0Y-٠Z"GD.;^{/gZіM򩃃yz*#+H&!:SS6WrbvQ6uQuz\-%1cuM#&9? ^*DтY4ʁG* ܮ121 7b3 ;pp:\{y;ߗRy?O=SSS7t>Zl:s}f^gro5)vyCP"v̜Ͱb33SsI;/M3D\+d4Z6ѐ*goSKϦE7T-> jry7venȩ;信w(] Df X:scP&u[S7vNS:EG :rxN\z7#k;6<8b]=9d\A,cvp/HqG7zt} SSS_ WwANC,MWͩwߔwߩwߩPq'񼱷8gmQp/;G5rU_.~UbC (߽ve~T\]Z.Vcwum)}czA~So5NST;* x* x* x Ywk)okM׬wߩwߩw/CUitoTNU_u!&N?7e3ҩooooO[Z^I^]Y7e3ҩooooXW޵@'.-Oҩwߩwߩw/D;3UNT;U(m@71>;K+ˋISM,a5Kpn֭/DJFKI2OZS=xp :X(m V$ $.Uתy'rN }?{^3rCجzOCe=0h.Qy {-bkjg)Yǃ,ɒI *: a/a#uPUH znBM?f#j5:lQ<,KcPHJ(~×v6(w1uy,~Zhy =}u*qx}SY[G⿠++*ų[Kg?U h؃.p螡ViS̬:#CJbV¿ױ ]V:q4f.T mةX,ѪJ ]'n=hɑj-҂ p"*˜{S[[|"kY|FQdԶ Xl/ ˳ f}?xxW Ao,.J˵OZ+} 9! ,0I!ch Ƌ-Sollnllѿa{skhv}ƍ!6_lozxP ֫ݭ3:>oo(0G[;[/l*c8$Ed^(fWwR9)d[g10rJD+q'!׺(Ϲ8z5ǠJ{ᤑZד8켨ABѬQ婩f"]CU Pa^/avLdT?./ϖGFezs]Zx"~{">A!~}Y?xB2t/+GT:!l%Uw$b;ۻ[{:F ƍo~8G4ͰJit{A7ؕ/./ɬ;[GG{kgͭ/^n?w^GͿKgPgJf-82k?PAq;aWر@pyTڑ Qf? f[G{r[ xU/BVQlI,Ї?Y f"NCV\)d'U\:Aٵғo_יv6AS*RmJ]L]I9kߊ9{N G8q̼8MgI}<21$L xl SJB<Tz ۶^0@uF)b1pQFt#ӮWWJ 6 <dZ:[>-%lPiKHÏ Ȟ8j ÿ<|,  "{;* ƻrxx[Q6lgR+ʨ'nͦqb˶.uuqpv|4X$B!WT$ruql 6 :nj.z;'H-Jjx$Jmӷq!%i>;hT0:=c@ fG<Qha)kct`^B15.7@L^DpJ1_E>k9{Zu &rd0rG0brͼfVC|$ syxM㛳ҍ[ cD|M?Nexd]<DyK)4ymRͽ2n bfRCMVr'P%5Oƒ-^" i0tĆԛ{"hMS( C2]G"Ā2V's% V #O]Mr;6JڅwdRןd C qSj ~qky$ִw^!5bTYĆKѠ26wO+LA/'<& HAD+;mƾ6;dJ'[5-s BH`OUN ^ :0Ra꟞7iu08om.p_+؏x! d:.܋b|*řHelJP!Ȭ63RRà7=;6dp43R$ϨҲ8O^R!-9eGS=7>J0jҬnPjP66&&]x2AD%,qGRmLc 5ł犈|;5OIĦ+i=:|4ш g !,x8'&޳h.C2V'9J%_$yh&[~UZ|gtol-.pHtbFUX!Sc* rYSM;~Ӱ#W]^3,4jxF)1RcYi <`f O[|jKW; ZKuO$ ,]K{434ޠ9y?cS}6EdpQΫJ2:i1eMщfpcx)}{EP!zzxtƔca=)gX)Cױx| -/T`&6l$6X201''ř3||JD! (h_\B:e8b 5ΐ$E"KdeQ2gw}}7FQ$puSW-!2Хm)݌^F*)ڲ]jt3DƖ4亟EO;Y4Z s@6ښ_> Yw+{ë=IRp6X5Vy,N{H8&28ӳ7[YP B[K0$;Pnۿ^4~d #[N5kShx ߢZᕼ&j[qJĕvy0bCWv(yetjJ{ߵ9ZyPi6[xG_@WU0㛉|p]Ѕ̄\x\3eQ-obLxk%$PiGZdi]+ ⯇Gۻ/#nP*{oCsVf1Nl"~݀sN IrOETbL?9N *"*W׸T j#uhO/7~T밁ՇUQfle6Ep&Jm/66R>hV"! g&=yj̆!kL6F3K֫%@wk Y/YȤ왨=>SBiD@qx %j|`ܬbAR',Z;ty(PSNr4SA"4i>Eoe 8ɿ0X[ONzc~C|iP˃vy.l$=P5`zYrhwDP띣Ay_[GxY^t俸 fk͑{0BpNo.vƁ8:j:$wNc`+~X??үGbgȐTd; ¾LgeM{Ğ1 vg8qG4D­ [e { <+qu1xKmwow lUkq3b?YiѰJT-\ 47_  pWjv`')J t5>Wn PN=0 5礈:|L^tb,e DU^rž PZK(9C~3lk^ػۄ:IA1<AؾxfqMOjWZiрO( ш}TT fЅq5z}1?B#ᓵޘAƇz ȦVhQ/Kf1Z*X WDQcvvP*fC ˴gkfIIKyWyw3T&zĐZ^ꥬԎguŬHэu[낐k'dغ<]nƦx59ѱV8@8м YPDEp*|kt%UhSS>>8ԃ[+KQ7/sj,7q&e8,PfI=ȿbl$Z~͊e8CkXlԫF:9~OA?v_Ev5n;&Zge0_Q?Fc Lca{^OU!)+J?ǏI=ȿ6F&t|1G-WAAJ#A[rdy)o$μ* xF_lǚˮO_5ڱbumWYF#W,aRªeNB|,4$.ӆ jSrAEn: YÐ&qCkxX3eU2(F ұJ gi5k/R6H*(5bzǑ{" C%ޓ]~d/shWͺ612Z%)X'[J1xNLd_7%)k4[fgc/)'O`qpcy [A D  A?Α,ks( `rw#b?ʧ( "C 2_~ l $hƘZ+,5z3_4{ԃ" O4%x_ b?*<fUz\&?'6U}ռ z3_1n<N\*+1Q?ٍٸro9o0_g)%J*dZoX~S{O4!x_ l`DUKLEǦ$4z3_%GzfJ [ztw2I&~uj2[~MA0?~҃f5;=nRI=ȿƢ,zyb<ǏI=ڼǭp0a$J2Y'|qbu!%TB#fd/stbD4ˌOI&fif6_cXL[O8TFZ:ɘqj2[~ޒ~Rj~OOcǐ|OA?66-ߒ/sԃHA\,Jј5k!ݯI0鬩dB9f42*)j4$&l l se%f`YS)Ʉ$e1O2%>%[h}e\飋dʞ5bgäD5. 6}بM bX̏)<Ȃ㊍(4HfQ32'bb*[2!9 Gm{, OA?U|LiGQؐG")?' YKuf8Bm4)aC&$5ɄĻ`~2ʿ ڭx3hbHOgM$2 Y7xzdxH`HqG]fj-DQ?7ц2H[yb<ǏI4.0lԨĈW|ǃGDOdocD wդJ1?~8kNMG_c2c plMxzP}0gsK# *~VC ȌQ?϶V[h+ncAs4G>^T`Nג`.Ɖ:)_if)QL vCb2+#1<5Qs5P]J0;j/_g@ԃ^cF\%x_< ?*lXZ.eQN1_Q?$bdR) _fg9~7!M?#ذzGęK|7OՖУ1/C*w^Gq*^GqE*dJrr۬/k uiѸo^m-26T%&-Lqb]\C9!VW Q"2WjA5(tuLkKo|IY$~2Huu;V94Ax]j`6HZ-xFG ߁}!yal,/-2#efA)0;gX? 4?(F @{J2=}f;l˺jDT.W;ݑaↂ#eY}$pi0, -=^*Hi8%' M˽جz`(2IAagMRpC}#Q}~b39?Ϸ/ހ$+N"=2K VHCAc ya-UKV4aKta ?^꠪3iSh|v OÈp_x|oF0lz =8i׉nQ!mf[Xyen{-My#=9'g3tjDν+< >4._G\KF dL8w充yTg\hp?7 c4MG#ƃRYA)X2B! cwߍ ak@>>3سH@9-nƃH$U-\ R͵\-UHrBpۑmUsis㓸:&7YRڄ*Yܐ0O27KƢakrǙW+KaȜ s\B6$0c)+.5"1e LZh-":/ج# cz]׭A,U`ǟFUzkG7@)ngIAo,/߬UY\ǃHdJCJƃʣ!͎N̖I~!$`Af1>̰,iQQl-5# yPCqKuC{2 &GSpkz"A0_ބ+ԍoJuID .76sZoFm7w-<$SPx ZGOPo1j*qPyc G (à׵yճjEJ+R%! *[cQ b?R ȷF[ɢ1< v%9t=SPIPFyEчkQJ) gPLHjlESE%QG6U/^GT9AV0 жq~dRڐҪώGW={+):t_Ϸw| h F>7-[:j`⒉׉߼ʊ6u25Wmt} ?/KPs29G3;^Dd)`߮[8aM.T@t nj=6 ff@lIEx.m2+ɨb˪_ϴ =Q⍷/)Vn(u@@C; tA_S0~1Bo$"=ɔ ~Ԏg_*x^|g1F01̋CK%iHeP (Ti$o` xlԁwz5U>k/1 i2]VU?̴FQ0]#ZJٟ<$qxNDQԒ>IFL^+D/)Pj9R+7m«Ge_d&InȺti@q&Wl=-{T9nUX_j=L~[8xN༅d)pA) 'B{(t%֐\1 #!_z-|l 9H@}Q頋*(aԏDy<"E9P/NA:v |8,-jb[EPJ1(U͡mur4ٓs[i^]0Կ6d~oM:Qd-AȚv/3yFfp^UމFE)irѶ K(*tqMdft{)J>#9s+یwt>Fv6j{ {װK^\a%y{+bL:vĘ##Qw8*3~P5]X78?r۞Y+ Jn}k:bXjf&qЋ*Υcz } A]1%ceA(M6dv-Z-Hͻw表1=RWct6>:D!=!#Kq"FFj A(~jlY$#SWInT|rU_'EG!6uh]Netɍ" 8!~^7fa1LŒ<]_mxL%;iSV hW׶B0QUA.}H wmť{ @TޭWЍ#eͿ[*g}$)$|:yAȴm8SlB͂M!xH[(x~Ee Pjq#8 E8q ƻ3``cYND:htf5Z}N #I;iv`= B%wFٸڃgYGKoBnKWޚKUpg8311¶N F$cv̀HqIRG;"D8;?"rJ\ BF@RñQ M/D 4xՊD*&4ID^yd/")WŹ+@ 8L蕏2bifLݶ*ail"a3ɥqU^$aȐ;]2؟$ FTl2" P<=2;RN}3 g^;vTlt?]S:zY,/.硇ۃKOCkV dWƦW6d'|,4T 5aw}l\"25]Au Oiϯ)vPBr<z4gDOPIhצt0cs[H-2m-qxyx{@+ئ*acb3LEg. ͤT4yOч4:|q T?]X7 (wzI ˞.e|e"L̅YbB>`EYOSyٜ6e4 iX) GR {^Slx@༎ DK}6<4#AdO~s4 "/}ӈ FsZ^camy"ɎK#F|20 ܨF*M"ukg̻`q"ͫhQ.J򫸼%43&^<%](H82׻֦ I"VE}EH^v|> oɶⵁ80.Tnx@N܅N#LG.egciX`a=G_7УEZ0\K'-f-QZq04=j cI6IiI,3!tBrOzW)ç o䏂\d: ^i%z>j|Q?g߷oGdzǿxx|'?tqݼ81Y5hʑĥl:Qd /KE%,v)V7j13`q AD;@ڄ)흤r B ?^/:jM|(I; |r M쳥cURrX"P7aaOMc)܆' rh "Yf6):2l~Kye`&{ЊD"L@f VJ7H!뇬DHI{c_[RT73qhA8v"AUMmo؇V`<:jF ;xoolW` " kݥB_$5pF;ޡ7x/gk\]yZu2&qUCo!9bx\]-Z@O JZ,@E !XN Bl'}-&PkH..5$ KR"n߃JK: ud8Ժ _ml$z%{>GbQNϚ98=k"OпOpYOԚ5  >2G\ K ">ph㹷ӟy%L;>.׎qqyx&.3~d7֕A=*HXtSPtǗ&Hʰ=E)2n$(Y(o0DF4cll[/r.UF TyXo6(r+h*{ M HD0Ng_ltZԸHM˛Tk蟫Cl%8gS>kGPmQnӕFWA `s@-b* !L:<}R'o4ӑs&5)@&ǨRPqY8U:Ll S*%}ׅblBT_ ߇8icE}ͬS7:g:޲bY]wEfW/|צh#3?U5Z{9m2xc-tlVi*"OF liI6+"(l]9ECYʗ@ I?& C6bK!q*$I 10/y(ũu //fܘyKḥ>Lj+L~fЖ6%>  t`L Wر.q Ԛ$Y#Z^J Յ҃\KoЫ ;EEz,\|iP3\&١LgaMvja/#5m7eUz]xXb0lo]~8UDr'VV| z:2i颉eoDDê(p_0x4Wjjstp*v=%YhpIjWyb^z=8&X%Xmc$RQ"Ƙ aag=zО*Q]uu&+K 2_~SŎD%lܿxuxW  ko 7 +:pL"ˆͯ|.n_5vEqtn6nc}`LE-uR*;QM֚v"NfS$KE> ]_D}/1g=INr[8& &;j}2-V>}JfXStNiih\jS&i*fQR:.^+k9Dwp& c$3OfX~ Ov$),yFMfr2eBM%}M S)!=dn2L$ e )9nE o6o9jVDeҼczD6i;M9T˥h(5V}X%!9~#_GãZȣр%R D館9ɬ,A:A|?Q)@&2)7Ĥ)&Q>Fp 2]5vԐ<8f50:B;N]ظ/6ZP_$  M,% ir55to6^Z*5fT&S2G0 ƎpbF B,"Dqbz/AɄU+XRK2ړno蕄jՍZDb[!V&e(ѹ\5,>H*N@*> iCb:%qEg^\T^/ErP,PR_WyC_Dj}RxtfV{3ˏqn? ]ٙd^33Q{T蓝uT蓑5 : gE#Fj(( n0P @3:ʫBr 6V@2y$ \ˤ d.ƞF9;QoU?UR yr9-p\kXP#1k-F~m "#Vͼ9JaH ޡY1c:a\g6܉;Re5;dm  r1&~˹Me{ h5Mxq`:&v08"u@߬G鷦a+b`dž=>`pOrKb32łTR&32ѵSY9 4ң~x;h M%%':u-ӹ-KߖDSDܻOф"5uuj jnLDΦVp\('_B=;4#$.0D~1?V2~S!GD{^. > ːFh蘩IDEz-o:ƾ򾫙x8/SYSJ:u;ٖzr;'do}!J{"YI[(hBcDY1 e9EZR1s9ӫ툦[3D^F߬W7N2ӏo֏dqLho Ǫ ʼ ?#a{V ~ ]f\yCu/[YqE]#ho[iVaA\pġu8{:ȼEB #0tcpL>=4 {8Fo7)y{SG(#F17< 6 o們\6R^ M<\@+xx7`3J2琙CI*8¥RtfCu)`כF CA]J=*@>,@O&Y$|ltFC3t[!4QcN˧-z*ߵ*Vd@~٩xgH>NzAIt֛7GAL0ρ-]&yW'Xk*W.ʥf*T6cK kV^5W͠ݦA+-:zE raFjJF$vRC([ukm$W36fXT#yH $}%^x(&T@ң+1=x'U?4ѷ.JoC]U| S?~jk]l=u|ԠF͎ ÖCX層^fTft[(6̥̀9_k,HH8{ =˨>]l@F$Fg_Jg{226-&f4qvA!xX;YEB;%g]QѬ5 wW)oJ;4}B3<`P6|dx2. ^aEUY] B' W0)wDQӭ&m7  0R],<@c*sgxqajDC1 ' kRAXsd5=@L06nN8rMi:W 0ƓA,IR\iˤ]>TdUo8fo0/ ċGbA{/o]rCŹx=Y@Fn1#,#JeiFedt ʼn)U'KT<^.NH4 Mf s]wtP>2O:k-3} UZwrCH>9 .5BWP8m0qqs9\dܘ{7SC7g +}?;ϝ~F&c罉>@0s%6ރ'kC7c@*fw^4bMfb@yIt$Xɜ{"oV0c3ڲ\`&gZeb%l|HMHhN$\l>9Κy=qq<8αV{/k%JHEW|Dc2$#݃ϢD 5=^ϵg3ǎp)ͻ)Vs!Jo FYz'ZU>ٔ sؗ]O{V,ضS UtPvG,һb8~ P+u \^:Ea*Ӭ>fuj2s^mQn~gr4!h|MǼ v2Qą)#Zx _̟ `H88vVxfOLW]iW yYo2fI֧M "ub&yvG V-!H ʘb6 '*7,"AC+#O{-Jc_Ay?MtP '[y# [g4?H$]G % J'#GT5NpIOhYDhtAw% Fu 6+.+5;[b^͇({3rΣaJobP{bd8NxXq~p `?@KEW@+(L8)j.F$] 6wQɅ)P[q,.ʆa{juQAp& 3ڀᨸqh^+ <5פY=heafC)_|Ym9㸽V-cB '+08)j5jQ(gƥic ȫowֹ԰H~. K34XZ./LpӊDf7ý-y*V[ov1va@Ea7NN QӰ\8YH2t4E6@$J/ ITqf~yELB죞9':*^}yo?`X%6}>3[7yӦ\y; ~ qH~d/:~HvT % f!$v h†UAN;IiH@d?j[472R_hy2V'v3f3Be45C&6^gE&T*ɿ(rZ .NpQ.0!<ߟ䄐`V,4t#z{{½Z].hL9ٔi9gomT_{)+JrdlSa)SObSBH0H%$2R / 8PK~b[¢cO8DcCxaۅ-:Bk\{#)V;86̔7N67lAl ^Kn$㼛cLgUָѧV'aOٹ 3loo>ƙo[L;!BV57o&%dqCw TO†Pd:cc4{> gV;72 9\)0Ry)(cqxq]ol٪#$ 9j@It~I b`ߌVHSD x/QuN`CF>uĘQ}H'Tl1c:8G}<zb*(~V-56jP9;kl3=o? DzQVWd|x-c|™9L*绞1xj^BI{[+ՅoJ7*짏DEqؚA)Ɉr~ B+aAl[/GLy,[ʔPM,@Ox)<ѻ[G Dk^HcB芳 h1J>{qE]sm7J)],h5CO~ q7=c/i p :P4.UL@Ke鷎V'b4d*"D~O%aaoyћ̽i"z\|i N;: z k|ڌ$Un4j)09 vQT] qs]F&Gn^h9i$- >(:} tTY a)6~;\XF;u HpG9%B>jRjóȆKd& u|Y7zdۨ#e9hwaҝ/[<`Tl~)%4OF.[ZE7:r6u<4骂%&.. RX/*U.N:yۿģ;WN~oxh$0/emRDd7 6P8" ?#C b=(O(<1JhVY:pU*xF #$J _VKk,yaE^sX.WᲗr5G${ fzM+DT`9 }XsyU m }^_&j$Jy!FeuiM* )NCL}Å: #C;'w>hi'T[DhWR5O]Cg f''Idq\Xq=JA GDYCynv&tkYt2B}3х"2.pU߶076Fҋ #jiI|QP/w,&R(e>Kc:ҹ@FJ8Y/}e/ɓ{Udxck2@aʊSA'|3KywB*,:bOVv7:JnxmvTAE'&Yot2.u1*-{*b&4~jtqYT;nNEs#4I] Ze4(Y*du_(k##J]ʋdGv*E9DL+μӅҗzx.Tn噧 Y4쓺cBǥqV#@NKN,5@N'Yj'r6=zD̳x$n8:[::3_8WJ2 zh¡m~#h@<7_U0o7gڭ'2+}qV S$wHW[1&uUzi*v6IXL {f#gTɀڢ?HP#!IZC,d+gP# njwBR1ds{{e/B.46Eb:瘛xә|HNǝ-XĜuYS\2&yop4ܒBRV3ԪZX,ըF:~؊>,@c@ZR:bECB'nS=.^d-foEUz:JhAXbЁT`I#VWxQHϞoK&[R7Z$ߑmDv/uhD?IÞM2АV-rfPJ(S 0AR"q vZc|3):dU") OIfK"cG#3-x昩K&TL8O'kJS%=3Z\y&8`%EnQ`"di5+d{@$s`VͰO 19p&{݉×*c#[}uNq]\Qy~*>m6dW͒y AukZ*S* @¿&ŲY.bb2ɸGeI`٢PMꈥVK"^hJ>x@+Ah3_)ۉȽ5(U P(^z-(.k~/b+ξ#,#)]7}nj4n-c:Fd_L'/7BtE*)d32%T<΃KYkaŽh6yL^֠!;K JF۪f_mخ76KTl U+I[*<ҙT$WM`M>L&wk\7&)7qu->{L,1^ p y8jf%X.[ ti \Rm}7`Z+f[)B 'oSY{mJXo߆ޙw]ZRh~O(uMj$]\Kg40LUVߍZpUTǤC^>M*zAt"Q_T;g9EwĜcv+FLm K3 9[(hRDDCre&ݢq<{|6WG? L,ctg0W ;dZn((h]ߤY9{BҼ*q-gˮ IyTnR;ւV/TY-<9r+T*egiϽ0/A5V8K'm()bfRK@dkx.%T<6`Ѐ?v o4Atֳ%uءۘP߯ u~V kf.op!=Y`2TCv8ޕޟ0EUٜD7([S^߮d^$?!Lj)H GeL18HQ68 H g yxE.?M\Ps}X*[;œ=m4!5@FI-KBp.u&FTFݩ 1pbH6j!RƪXyViyW0Qr:l+(Qcq^"ʲβ9V k&C6CL\=G.v[+HGGM,v.yO?\za)Q|䮑8/yJ ; ,RuB8Xz&y="mINv^DtӃ9~"G kEwAr ،.W}{ m9f;[ʹ2K`I&Z/9gOl%uXj"jZɸUG1ѣfR]n7 :nd;]%l//~=er2L,W~[QKօkх2H N\O2BnN)60 ]^GR FlCyTfUhZϿf%2Q4 N~ًڬV;fPWDSGr>D{qܢb̡=v^„>^wmcqhI`|LJs4l>nmw79 P=O9UcmI]bo5Ōb r?'O͓{nO&`Z` wHq(5j j[/UMR,%;\51T>_\sZxmCZe(t{Iti \rȋ_.@_+x% #z$T0h2W݌U!/l&NO8y9 LБ鼞O/=Y藊7i9(VuL$٬h\C*bvA%"d 4V`O 6x@P76):tmv[YO+EGw^:.E^l>t0aXˏc=;pTXF\I^'?Xj ͨJ Efd9ã* .׊ a4LATE}@aXKZ|'Bfh?,V? ÕH4ɶξvcC-i =iNn Z솭E>`ʰ"(g3G uİKF3=U uؾ܊" 6 @~ $hNQ2~k"E^Ifyff%g!{x*ճչF=>7(%rKPi?(%cK>C4{]'>)Q2>e```C H[zby7xO>4GGk7Υ¦|{5=,~4r1~Q̎#^qZ3χU47R~\Y1au<B = 2̏ Q)G̫{70d~*]QuhdHU!xEKl+|S1 EECQUsypH&h ѠkAu#35Uw>p P5Qb4Я8 H%\0VD;!YU HeV#FNqka]dj&2VD}qѥ& kKP&pŰ#ю6l87St&5E,nt.\e,LБk_З#B촖,x<6mycVصf~sԾw|EJ+Ra.HݵQ˥.%(}ӿXF{Sp;wAT= 1#c|ZEs?)H(J]#WmyؑTwr{sT7d i5gVX ΕO*[(# \ZQuo^"61P4_—P˰z#jDmL3$m y~e@22~Ձ S;Yü]7 Y}zgfTDS2HF:pl9f#({_@ L# MbaϊL8:-9 [5-JAfyи5#0>ʗ9l,vz:uS7dѐEߠMN3q6急ܖr ;iRY'T@zcV/Xhͅj3O}nlp"ҮjP@ZCU:&W9B `Hβt Sr*PNW@9(tN/J|q9[3 $|5s¡ΪDnC1I\lb.ʕ3'/]-Qs?Kdxb=dlF$˖hFSR7CI;\kfy-5hmnL1vI=e<Vֈ0 e ?@6Lsód~ڝ%Y h'ʅtȽv+9 miܯW+PAx]+)sa7G-) ">L\B紘(4$B-|ÊCzY)ȴ23 9JiVbMv≮ם`54;[9i8bTTQo"y gqcbX]t_nC6m;U VZ&]ոދog8n/m/$ֿ9:\IeQb96>e`Ys%$~ |~/ُ^FFI| #PY#r(tֹ̚%E]&w}TɊ[M7roXnHc|T X9Z~I3 z08 !#3n;i#ݪf{t=엍feiW fS4[K˯@p#& yds>74l/66XDZHe$K_5ti[|Fh]?>,PDz.&¼US'64E(s7u2[c5Yryy.̛ f`m.~Hj7|C T&<062JZBV=g_Qcޛ£Ga4y}uO{ȭa굆2k^ز2'0]礪6@R 74>JVgHȔ޾(=$uu8#kEEd-h91@TYQT}svڍ4`Z4d<Ԛ Ћ'nVuKnX\0Պqr'@~[AdWA]!6x,ĸ"l ZQYB*zf0gwDg$˝+AZv+~83~͘yZĻ,0Q/`aofv-+ 43;' ߾EA/f8.N3;.W &Zw>`&,|ώY{Q $:TA5lbdmrH3U :z[5mǍ{4lHwqm ~ =}~Pmdi" 9PJPb r-:F ]xA335%0{j򒧊aI=Nc~#7.#@i_.GtܶٚNU:yXS?N!Ysx#BD2%֧,x=:>]˶lp.Ey(OqQ6}B-vZ-3?ep 駘ӄn#!?ϖ(8\|z͠h=jyUU= 3漏}.dg։][M癸W Q>N\zyqqqwg^g+F5Wu#|Hף0r-' kXP#3k-&_xAc$v0;Nq˅ؙh M0v'5Y#v#LM{٘If3yD)6)Ido\^Şg#V *q(nڨDfYNIVCܟw"/olۺnɩKMlޤM"pf* DyџDh ρ9dg5# &S~0NV{&0VR%6&431ҳ1Ued0#n1*YzDNzh+.2$w0MGWI) kZ~. W5Jl`l@.\nQ\I^e@ Wi%3Y`).FgEeAY0{8ʂː81ςP4QiRFU3`45:x$c/4 geY1dߕy{kc`&Kyj! y V229=t^x\Q2su\VqڞF-!9!P1!k Ԥ1qK=o`I2Bgv)ԁ՗u?ߛ&WJ(}NY5\&b9a':@x?"㚱o*fB鵈3(t6.A)b}u"f$(< O`-,D8-ȓXl4<`HdWi4`C\a;n}qs"nsҌ]lHkn&(jCQ[WR LZ g~}PѠ j$|_8{{|\<>>=߻YZ8+QwP;l☴E\;Ad YOV5)Hǽ`4p{ H6>v .K\(v!Ć*c,.ܰ:Fv{h8CHܡ^PtV.]4kʀ(*t& j .{ro){ና[n #!":6Q (^\,YBͥrP཭;"=UbJF-܍N+6m1 X z]]/KR pـzx `h|57 ?K`O٤ Wbsn؎@od}Ew_z]#yn~z\5\)%8FA.8Vj~𾤞9ʋ\=?:')vYk {+7,r j 5_X_ IGbӃխ i.H&d\:)'9"-vH>Bs1 65f a|읎<- =+ka9H@iԒp@MYyYNTҤ[M&𢜼IZp9 ]O]cR].,ϟ|+,F"ǽ3%ƞ^:{mPtPw<Զۃj AhOݞ 2w 9[ I5ì [0PBVِO&'!|?)RZuMLS*/Z#21lHeH4~dŒB!萱o|1v[X Z~x4~DߠAA' 95#b;Ͳt31|{}\gi:-"Ǘq ## B:֎tz/ Xa[JfM̅rʏ ߌ_:R7ĒB+qYPDᇃk1`&@Jb A έTFD:u , HDiڪS00 :SCC|\E{W8x0ÏOi^ek|nٰ'Ñ{t<%'TU{01Cl8[*_EQT},"BQ=`$U]Z(,S'37ֺ> [ ˋ! 4}@Cr[Љӥ%@ \u{רy8 U{eu>:W$X@_Y{a =]-h8 cA^Wm$޵#ilAػ1!Y Y ~81H#jF0='iF"b74]}&a5# 8KoF0;WL )pbn^? 5j^v~A-[݁DUEA>/oe[?|~$lB:hUmC&u[VbEdL; m>8a]43v`}8*xצYBF^с6gҤm"R\4 0*)ٜ׀~)l3N.WSNB1Ӵ*% I?QȮ8m JߒC|H;fta{E+ko 8qd! %"X2 S_Ń߲5cLjHϫjG:d+Iu7]\d8e_Q\'UI% Tt|ڲ *TfUパӤf7Z2d>g:w"q:W%wiXɲ,@8e %‘hZ_6ٝ>ecMJdqӵd'6 (*M b]A@X岗zs٫"d.?<-"pMv}5 O&N&Zx5NE),-AMޖ*} \ 81)ēh]NgЮP( 6X0N# d :kWR;wk [ lNU@5mT[KZp[?_}q<"W+b}gvűsUQFSU9C$b nHN]XB#@c E1@-YJ^ElK2op"7e+ PH*49h͖|ObOoS2R:/Gx}bdc' o禎r1\ L,:Jo$_FRNXo`RނX)2Y'nH1HIaPsa;!=B+RRo& #lXa>a60IM@n2^6Yv ]sHȗ˜8{UT i2FOS&dN;D͉يvERQɤ~;IcֲL(y\kUج(2'QSҊjl@;3<8.kS>x>fzVijL-x.a&2dZ[fUEΣJ9Jhйc[,fjEZa5j֨)QOf11:7 tq8)rF'I7E2UҩRbC=˗&5T9HbշFIvKEuqag)=39f1r)_-sX RHmt8簃6!FerxӠ"5W,LFt'!NAuNQE0યQ<0dAk^潒Zjc-+nV./e^'i^j?F@){ Uw$G+鮉{qڏ=#&QP+L+tx [W}gSjYl9"n3TmBr`3ux¶qdh*]_PNbd҂W1攂 +5ȋ.((Sqyi,dQpR坵k\ `#1xA^G[өwfb~qxnJ1rp_2($&Msc`|*!}y %dG0NwL9 bqSNOU uymc~D1{8oqN<5 xEK kVEy^O'46NMAEDW;$8R:V K@\Kj6຺p(ř+#=9[?#7'Zyu6MN_yc5`[rU2OR*D"0ɢ¬^WزDo ~{ mq? ާ((zVPsёhF.Fmkt5B-Oh_{}X-F%% :>b Fa #zx}<ϙ a"V(:[ ޞ]q7 y LɚLHD'>HMw*5TpB6cRSӿufO"DyT$oU4Lkpe)KI*2G8s/Ʈf.v=FXނ D 9K*Mm:*Fǚ9P{jrau <Og\-m{*[Nz!k@ٷ8};pѬHb4  m#M*xkNkg*H{7x! rcF"pᲷ}\Ky$NDq`{siDpuP;Ӌe|l4]O ~g_A* t,LOIFk Փe!@*@FY]]I$4.R-!l6syTR:P=J MZ[~p ٜV 8yRJbCU@95I9j؆sO,zKΙuwSF0n50Tք + 6x!R'W^:HnBI@Kd+ ZR a ׆(: p:kk':i9NwE #lQPxL(*Iu4 WQu M;x"BhCm̀$ zd0S I"+YAQe(TH$"t|_'jʃBն+5 'L{Ѹb԰/TK@"S!EsZu5 jEHw(،N#L44h?RRKfrhh̥iwylrloz.gCjgYmWcɫSq62xH-TS$Zmc-pyk+2VsC_տmyuIZ ŲW<`M88P;U<}ZǏE%{ih7!YbMI"=ǪTU O{F_4 Xb$设{5S煢 ~9+@i.$T OЛ4CH}z%eUrJĤih ]bc ܔcбJM'3%LP]VA[6V#7?SP/7r*(O5ɥnx}"&$b* R-FM26LQi~6 {򾃾{)݉btّ#UKCl i5TClwΆM]ym*Uj^ᮙ^/EYs{3W/= ۳IcrӞtcKc+4hxɪh4S*iґl$@ԧ!]H2=#9"O[АU8>&7VX|K }+`3\f2Q1kp^{ZeC:Sں[E! ?p :{DV.N2W%,`<^Yh`{j^d6^tC#͢܎a:?M (7?)^Hg9̠]c{t:\$@* Ό'6>rCZ I)) % A $ [>(Hhx`6ȥY}Չ%ϑ.;YN>*5 Q_C̐RߪYW_"θGzս_ E `;sQn:"_S@+-)z L !9`t.#6}-.Znb%I`f *@쯾&ъF9j"K?IzL[Tt5 |[&mԫ'x$՞O0Y@ s2lHHS_–DIqڂI3iF7}uN#2 ?*x'UhMttfYBpkvx~ŰOy.IևU:F3|`QFQEOX5ܝDaU G⁂cq^4 (g-jJV*I* Y]cWV-'a6T׈Ђv`!s_]A he# S|:3SCƤ l.5V'BG%+ MEH˘|}vtJ^GgxKޒGA%¬/iAv)BO˰HH Sn`f7jNKxANʶ@z~/|d0/ F8Gi r"~jmiGsrҹ˿(q|n.C /kHid&Xxgj;S$H]oNRW(]{}v铪NqRDGb-9嶦w5}!5`Oޙmcdvq?;VcmdbNGµclu=?o Ȝ|V'l!gÓYZ=YXiV HX; *LiH*3M]1g*O%ɲ7~3jN,mD,W8è&k?i`>pd>*XpDSo.)X8  tS|@8tFKLPZ%A#hBB+$H )Yf!CsMzB(24YE$ (J kr 7EM yz3:#f\ kne@O?T`f=2W>``++_! W ?Aw]p5kQYK۞*G Յ,Y2ܯupRTXy%9ZY~:;8p$yof '[oolLuYgŮ/'_|Q5pr'6oRXy|eyއK`RCTӾdKkgTx2nLhOR+-FMՊ\ujJV3_m2t *Ѡ7%V "' G(55CxPD`,Y3MA3-A'u72ƪI%JlTԁ `7z< ѤW%>}g}b I'X+y}"Nm)J"ԥkp(C~#&fÇvǪl~2*Oj3 }PpI*qMO̍_ LOX3(2yMnǓ`;B"Ɉ`t^=9rlLJd/YhMF' e7F ^Lgx)PHh&o* W= P͂FXT5:=wܳ1E2fdx_rC=yUy$"?=X(kJh\;Y/k񹊵H{F4s*pi1NI8'gMM=ũ@IRׂ<}.&sO#[N פ,p;J\S~[sYVVx5t7U!@6v4eW+eRNO0s*P't2GS/ҷИB*Bdt8h?-|T?A>bЍ _TI` Ϟ)'ɠx3&t(o XÝ[EuB%31 u-y]Xx@yKNK4P[`F$yzǍ+&*$F79HQ@q1¶2(bRDDsïD^TE;9{w(qyڨht4yv\)I;x O 8CPB&Mo T]8G:WG)"j{pPu<܄'ՃW{GnS|Q^!>!4^F!#,O hY~ }:5痗,(T GU:%|lN ^ ;֧2gmNE6]TqkSKυ6GXΆ%Gb:{†`](gL(UQzq,8dO?[F&9x|g]M>0 ̀3tpkAh_g A; 9F1l^dVP$ C-yvTV,ơ*UUPPq--`5 hU !*mTY.\~o,,o'K'Ņ;Y?𱡢QW1`W1ILu!fE>xXHD;'O+i3ŖT`WWEF`[]Öa,|%pINSq&(Ĕ5][~ jYZsD>S5* ;Xg)\ nPJWCv=NjCQ%Ey2$LK$|)6C!Uǿ 2(=O>*zUK:tRizzZ{W|vKkytY:HY`jYhxzNRol;?۠RO:tG &ls?3ab$~NC/=GAqZR$༲lTZ=C۠MF)0yN[ ^O"yf#kZ0Y%h^SB_`#TthDGRҏŇ/S͗Qf7qAͿ!ߥ<%Ð12'HoĽMh IJ.d U a ]}ܝ=~%h_{|mdʈ'.|\bJ[FcOQoM9kI;h!3;F;uC RʫiY\v*+KYe⳾s7]y>QȌxN=@Xg&0+ ?L'NlA/~"Ri!lQ6DT$ƌ3ыFijqa8kVQ!z"vqu~Wy)c0DUN}V1s&dԮX2-NQ Uu(VEB v*(cO+$9s .I96t\MyNO N %*4Z=8F[fy3bk"gEg^S!WuU:LZ$ x V]@hOk+D1hU}4ř!9;Vw*ܑci;U5HKU(t_[/ekLhy:*#p!kUrPhqm黎Vu~] 7Ę7p)>xS#O(6izݖJ.b$< v !v4k.;H/wX! U1$C6=3Mg(i3揊׋ C$sd6PO ;B kLDJNux:ƷndrA l<X2%iۀzh?'`\QV0/jp!=+#Nz&oX2%]U\Fn؞1s#-صz4.sɰSqEtPFͯo n[/x( }u_dR kwcYNsNrK#!իYg3d,F5Tb}dأ)=0Z a|T rt!>D1zދ2F%c[k"jǪ]eHbc͗:v=~NM' jiJLjlVdJJO=N̪q.5*$d&x*,;1UJD~(^aЫ/@s=5; Wȗ&.Wbc $8OosfJ<1T12eMP>T^?Y' 1yIzB": bC^@vc( Ԓ]YE)b"TĂT&֘Dz!%kn>}Vlz{D2[JMvzh#>Q92xˆ_(\{M\*zKT2= `#!~<ޑU6 o raBo =@Gq=Aԡ8Tϣ+ e;[8WFlSS3 v" HѢ`DA&Uw%jC eʇB웞KXbTť XA=R6{ /(jT с2Њ|I"؂@{G ^%*;3+Cn+S:s$IS?VH2AXtGkޠ [~X&ΊHD%=u:U*/Ww:TMb| ut< GW(~ %-R:V++fٮ}$ّ&zmh1'%FuP1$# 1XUr󃧂V5R0I%$AMQ;QtoJ,W):{"I0?"@uDV0M隦LvnLD lBdss* z_i̳NW,6YlL[nMxJ&ͼ Kdu' ׬)LTLfuu%d6M2YA{L%[sd g娮1KKdǑΊ*p޼GhLtliFbkTXeИ*qV76NmekJ*Emw)7E47A4Ѱft^pd1'4s2g*aE 4ƠQ A XLy"c!B, ٹnIx孋YVmDLak]ܒ,%p;g#R9#tVF7Lе^eb7/y` kWN<0hՔrx'uÂMQ]?#Ƙ9P_EԱI:گGNEׯoѹV SEcҙA~}Pg 3˭vo^V+Q;:& UߝTO[s5{6UJS 5`Z98O:f!@wh P:u] }蔂$ yAxZ:EY*Q4:JhC뭃?r7 #Kp1Ͷ~t=^! J2T#eJha(4c ִwZ/mW #?$ ^!d}+ovX;;#J"]R;Wrb;ֿiF>>]Ɛ#*^/raL1 | =' D$YHp|n^N^DbXH.v)%SڴJhSKS";|φA RDA_2 Qgq %'x߭o|Ж(BXFV`bъ=ML|$$ 䭒HӏѸ'/;w ݨ@>">! A: ߹T&]H!%Si i(^$jpu9VH'nx ]sc 6yCj' 0jaZT5xô㓪@XbTDB"'MH.7~c?qx+<| 7}7ta/LG`{u@b"v<0z4[7Ϛ Ɓu]<3nhCg92H23Or{U yj |Т[*1{bٕ-x4d ē%V;T7tBN% 0]!2,ڰ&JMa1HTּK&\zr zt\{#ر LO?'L?346̛:WּS$ ϚiQh$5<300ʎbvxm#i܁Vi.WAM<99,==YǠB-"d DH-*ςUVe=窥Ń~ A{lY2kFڭ(?ZtUbL ?J,NG*{6r/t2P;?5+TL׮j!V TOqE h~^aP W+>G}P=&0]O 3$򚼡u 4wIm@=hH8RB3snE@J7b ǿl.RŶm9l=~ 96![}н^9z})!LTvit;z@N!s(.0WX5^M3`+Յ6#/Tk 1;9WűavaI7Hogh0-h}mm7-٠=4&|qj۱Y$-Z0 :' CB{v4熱ނVh)FAQӞnjQwFURB9XN@["D Lr"]O/-wV+fUq`UYfh#pW !3\4;twEG#kʵtC9g/ep|x/wjW>nAoc?\NJ)u5Co'[ 9`<#[l?+k. FSwΨmW%P|I"E Ii7NHN1ͨ/٤qAd cw`4*.2SPb=m.D|v7  G0P{ 貕:jTQEoCgݏ35Fe{noc M-觊ί =Bf:=]/'*eKy_:|plPK/ d-_ijt@zA?b@(+Rni*ay|zs>0U_ (^$ZW]{J:a֋+hjhꖗe<;ʴM)VʋV6.8VΛW! I3-t_n5 %d!cf2p8 M6^e_HI-ig@z^[eL34LuoZu%ܢWMܬF.Cjuet0't)P]s%h^S B9:']¦9SO ]Zjn.oXC=K \@F&Zdb[czAO,/9z$w¢&8 |4^;9oQ|E~D6 4|EGQigk%  RQaqes: PO6euGCiw}6\,4 ``Z#܏fD.NE7x&f~kNǚJž+'IY&M2ePDyYqKBV ݱXcUL.r눋dZ7J%N&;ynsU]pBAhVF"I9bur.Ddr3ak qSTp} nz' '6ޠc`[v;HUeEn'&}UZvn7H+ 0c=-Q.ABB&TU<zw=zFilTHʯ%V,&eE%ۀKEm EVǴ&œjD]EH ӑ󩕰STA X;z^Ԡ h`F|h_`{LA>qa!qW{ۂHI~ ]wis5>2"⏈)J}I-PR$]8g.błNӦg DSO3'y.oDǿَ`E3lԁ=߻d%5ni 뎜s!{HyF0%]y_L1.F7 -ኇ-'NГ:K cFΥLdS%GҏБ3Bd%(v@\ed%3Jѯ$/ro3X6+WBݬ+ep ݴB-A%~wJRe0τᬑK2;N]r]LF%dusͭNW{#.k7]lTn&M\^dd62ݥEj] ZUZy >ɭ"(U&`,ӓa/mtvE'}f歴;B44n劝UHKZe'dd/JTa٧V$H>ȫ>@`'yUhmmbASk<jXϱF2X&Nd' L #K"zh@VvuS:n0|RBu@F֘x5lE!ڑo9GJ@+{Ӟ2 ]H>ubҨm3aZK,h<(YD +$A tdN|ЖzK`y,-^*^3qǪ 9qafT2Re}, B .Khe!fTWZYEMS+dLr"P~mAT9g"h[>΢5* <K<Ӿ݃'OFrv*LD@jcc^tY"0:  e?Оm.oΚ qNVtdRpq? 5XOѲ B9IA%`ڞх1? ^{J3Qź4qgήZ5VJ+01lt7/ڭ(?FS %?{,}=@(`weW<#72) =¡З(wzkw렵uz_9})CGhZs!=[_^@NfOznF2RSYPCah%pm=8>Ez(˽"v~><13'".SN.0%ܪhxQgno<;dݘ֭$;:A5bȊ(J%Pn棋A嗋קe md9wbMXOHA֚"m ; rpɮb)ۍ ٮdChzX6$0l7f&Fl2mxv!KJfcP ŽfK+r~AR:c={v/+HD mxuo2{/Rx{* VÖ{3*RJJM˒҆`Q 4p6t[nD,v;+iwǧa)6 o7d_ɩom+VsxI3}L$8oxo?%%VQ ֆ&A~_kOԏowEZظa82c#cv,UU)Y W^|;X)~-LbV'3u%&-TCuGg`E TݰȦ6Ί9ttGzo%IL@tDyX o:d/d[z%޸"[3F MwHǨto῵TŽw1uj__ON㟆z=R塵}]%`RpKGS^wdT×+DTu): WAitdDEcHKb hRK*i )V P ΄TXT@"e+ / Ѥb&yM\Q(_ LLso`{&T@ CEGlbu*$J'q`Q(t<`PhTDefj_JU Xr^.apBa)L=PoN>6t3o%v-NJ)114&H}.||:$umxm:, Zkⱬ*U0ZG5**7 O% bH//*QʪoM՚,~vv6U|Że̔Ja1ޤ;t z$%O$3-2dH@nޠз2]Zy \.F.aLC5IބB͊FTbWd %aGaNc(3*#EwKFt B@~}@K*A?hFq):~:zY/7kV XFdNtOb)EտO?}Zb=޿tջ $TduX>fsߐlwGV7U)Gl{ש |?ˤH9$8:Vsc!V[uyMhB^'wz*/-&\Jl&}ԻJSr؎º/H>Lj { gEUGte)BM(GUozF {[-y۰T* ,?pƜ~iG'cfz6`DjL#P[A4Ek!ty@뗀l& Jιi)~rzubeQĤ/PuJ M&;xwv{a)x$B+Avwvy1*YV#0Oi1mz_p&vɪߥ۪^% LnrnƁ;+6g54 ۺa4ʶSٶ]'/yOeVbA[N.5q 4M1_?6U1峬˞T<ש;?4Vl +ΠƯĚH}= }pS&}YŸ61ӑ|%=k5=jn3j5R(uAoNf(&!aKi 屼y'LZdoXjfb._~[&I3%ffq~(lNb@:hm!a2TgXV \C 0t~B,L˰u{q5** j4eMyoJBBY|V]N)ɔ/- PK| 4CBxE 6KAg@IGܘ{F.tuup꺪XOhע o_>ݧFm0.WbCGuy{z 8DZV]orq7>Կz,P'mMƾԋ$`ZHc$V~z5X05Q_G=g#+rb{I,֜_MGJ~|km $"Ȫ.9OwŜrIBkJ6J% rZQԀ?{d@ݥ2=ɂMHDݓj!H40R=9zPFπNEbT9If$9f6 2D+ a݂Em4V>CLzDEHwnoA;pconJZlyU٩UjfKhƶ*IvZlmZk9SX/3-~n)ld$&0ɆI6La ld$&0ɆI6La ld$&0yS dht:~:INuld$[':INuld$[':INu欓YIoǷvHCld;$!vHCld;$!vHC^)5J+e$Pإ7V36Rld#%)HFJ6Rld#%)HFJ6Rl1$iCՅ ?Kj^8^Awy)7H̗ld%[/zK^ld%[/zK^ld%[/zySK##0Xryfild%(F6JQmld%(F6JQmld%(Fy(A˹CPzQd|$ / d%sVĤ^F~ȱ} @@@=g0C{!QtvρY(2?k|X[2~\h'QS33*XU}J|-ؐDiZžJtK:Oȯ㺼;Qv(Q‰&Xݙ/lJZ w/GVxge:+TܛYYa'L>xA1qAq Gб2w iJ&'%ܬ.$3T0o޶778'o0QS#*fl2_z]Q_G1 =>QپvZLMM݅ MQD<'ŧ>`ZW|gmaF%Z,} xH8 SIOvU.vԪŶ>Qȹd ֻ'^@wZw[ϟ7w[Ox.{]yh{7T?[дPʴ]e3+=֊ׇͽJJ|iŘm/)0npW%n/Rf!jH׀?u'戩 ll`cXSs ll`, l0~{4x (* 2"5m(5Wf:"*<[TRe)ڂ((msV1]@I\B,.Rx2[4Kl`y|,zn;/zgR܅dT^'SQrU4x@U@>dL|%l!`2":n_HrPJme [f*xxhIdƽ ,7Rr_ 9C/+44*ʨ3`,}iLJ菤p&ȹgvvϴ@oU~L:'J`_={=:{IE@WdbŲɮb/ȚA>T}a-,Щ~E|i"脻ws k[Uxrkh'2 }u@-` -AD~{>vɖh CDX 49@;`=>Wl;@=Gw}{?~}~dM~-~{yғƔ{,)<~(J+ʻD)E&Qږ(.oǞ+FU=kw]Cuv>{6o'}-6Em"$AY:~n>IR3%%g틋Ш6,lb)y$LaYF`ͫf·)"V q%…Fr(E% q) lMzGB!E=#av `E]Bc)O9D ZA}} bdh H5͜+z^be_~ u{$%`<# DO$!UoǸуy_iu,Ԣ.@tA\A }(Y,X!+=sEa]L{vQ$ 2I+`A}؉gg1 :d~_η'=bA_Kãf Ė2(?>ӯe0/@(Ol3 "a'gaed3 45n Q`Sr)MŜd-Fv9A z1uM4&a4o>#4n#Mܡ;:Z}:ѓGʱӹK7·{7I"zU ĽW c%.;<菁;!;!E_:\눨wGv}[&5W(Y#~OFd<ȣx$_ 6[)F19ڡ#1ܑGO׿wXL5CWnYC_Bq(#|y؃}-tU0ޮbyצcHFΕu 6abY|6e *GwvvGhr|N/TG:*b犧K?n`N9}iƆ8λQ!#7b&D,h+L2fl橬x,s]Ԗk񒯡 AoSf1s$7iU_cGܘW0݅,IjQH-=~j)w%AJ{Slm 7[q׳.Ϛx 0x\:8sKdX \R"\JFAOS:NUoԃsR,nͼpvt.A3mZmi:DA]81V" <9x獞^A"4]AcŖ\~SZEg4N&}Qt͖5>3pT?<X,rpaN;K rf[³X5«+zY%|?bp]5brHzP\<}PʣTy`LzpM$]:'^|28f]x/cMƷRq*Kk>)oU⯯QX味w,24ANQ{O_׃(TB'+$T"ٓ5{[GX3i鱙0UL_)Q0 _y{߸LT]cJp؜hL:UqtKY{# <j0Xސ ZIRhe8)L=U*U0sŕYscv옑6x1`fPX2vN[XJXXV @:3ᰥJΈr 6f\$x]cb,?N,VΕYpSqQt%͗GYӛ4qbq/= );e)8a;Dyj6V)ƨtQ731TWF2L$7ʂ)_'M1`FWFOf13cƾNڱƬY#_׹Ql[`2^}(__ 8e3$gĻsvlTkc]%y@ \p+ʮr!\q̂ot*m;H"[Q"? lDB[IMƶbp+oy;cnRޚ`V8u*Ƕĸ2ȕA7deQ,QY2u2`Ws  se<1eۘ37fkn+W0Е tO!R,!ҕ\5JnS<]Z *eh(]m[UxWEmˆ/J2@^?3A;GW(^J^^dVZZ@Xeа!o}s%C\_-&[+[0{Y2tւ,~Y2~0`/ f eqf%3Kf$mp0a0 cIT,)@?`-ClKClŵq9lZAj-^}~yΠΊ̓0"tU\sULT7Sq;Dm6&JW['FKz37d6q,lY2w*`3 feeޘ!3Cf mo.]0[9vS,!Veko5C=,%0򖑷F.Έ3m†U66"82aղm?Kf5[ 5ጘY+!fc6ʵS2YAtL|ᱲS2dy$}*!)Fa73q e YHe,X%ؑżyCe*;_lu7̏+;us  e,eUL{U.FpYNn3C el)3"fsۮ*z-QF~Y%l3sUetT*a g (BG-b{m JɰZa;>.VSQšE~F dX~y/cpY @f n!V>2f0@9ͬ1Sfhb[>e0`H.Cr;ײm,XVC\힔ɮ εf-a -Ӎ)sͰqUڍn1~ ڲx?k=Gp^{̂-N]ݻx"kьpcT@Dӕ.*DyCw^,d}A\ ]jB!\ٮp>h;#X`d0ϑd"eY J"dJa*"{!g8pVLJ T}P£Ys]cdq u+ rwoJjzWb\ACP=CٍDzK:>7rSMerVk3bp $t;T{4:KA: د~Z˺ 8Ԑht^ϿD*nШ&1vQK>2#/{0%_@5W,KWHaFO!hvdCl+4nk{083^ -VÚiC0kHeh~4pet:44YzX^Гqhۊꍎy,5 |WʃjZ[aZm|^~rk q{rzqeg''K_VON6zmuXUlH/zո #u%^6RWt|ꥨG2[0s}N|.k`e=OX⯿o} 7(ciaUcrOl-*_j_W7fQ$5FZ'VuE {M2 wnW,H q߯ipJ={&`4@a Ke=6Jq<vDp;qmZu;I7 @FM:Ȯ'$UcpoܠjQا{TbEAGdd{H Iq'~T9wx'hDɊ)I NyGWqk'yXƲ<ӸjW0C<|g2n̏{<ޘ[0;|t̫b#)SԎr1rx3ˠߛ_,[W 9s 2w3q̕+3ஏ593_ηb +VsUt7E3_{]oȜl]kT\J1x #pl8 8 *7lSC=)/Wu]z{Ih_*n&mnH_T8ߩ8U6:8Au/ 9&Ьr,pa(p,u uC f\(*78*a vX`LWbqu Lyt@ұoAEf ٶʵ1)"R"Q x`_# qba8 U*p.8Ntn1 {CDm ;{@y6o6q q)eYJ)m8jc3|Qg0`0c+<Š,XXCpU)@탍f.1Œ.d8׈1'2g,[Wy#pdpL\g.@.I^2šj…e 38 Eb 3 )|wxxqwP0"8d8Rb>rDK̰`,\YY 30x.3kr̖-32Əu9f4`ϹbK+Vw[ʄ7D@G`!|m|p9gڼ*F'D|#c?{=G09rp p\pn.6w"c1"S1}Oq; LmL ӕ<'Җ{,=/7{{s!5le`/ [ &ر̂Cz;g|7f̐;} f e/xVN˩{Fq}j%0\eJ8{ (At6ʵy喩 rp@mY 93ci(tray!WFD^U:o!NX"(xA-v%n56--ՓKEս5mTu2T0ږ.K]Fcn܂ 7sdȌ-c  2+=DףLsro3S emB 6i˪\wkQm0 Gw #4-ëJjj:A8Qn<o 8sɝDX97"nioP{2!3Qe\-jk?G|:"p{=Gv,0K@ٸaVrX#H`LhWAEc++)ޞ$ds$ލՠ!D.֩ bpV;au|H'qƄKg@w;\7}S}+`P"$V[KлC R'nT%D|_\Aj.K<#޷_`7 Bp'Ivhu:te_QLYuD_q%s!%T`ݠQ1Mܢ}0e.G^(Kս`J :X{  b# 3Xڗx7/'؄? #Vhݮ` pf49U,YӇ5ӚM/y`".jMUix_zWXL/ΝArFPvM' Z" )5q2a͚mPEv Bf:ōf[6NRz`RAt+~NWp%;|㏡gAc9{A mɇo+7:zP$]} N*jmkx-dQ ߖq&,mB~Y=9YBaU!TU"c֕x}{K]񩗢lj{N"iIg\g$<` I~]կRDimZ5%hv]@?[4#j}:*U5t&vK1F/]+xqLhzoE$-6x\I6餶!f}ߒD t:y =[por_//w9G*'ܭ$6òݝ5`=a=6IgKl&vv:n5[#fΕdl'`\YI:qmIIM4zuPaKAH43(E 2Ϟk#Յ(a+_N}~8*IzP5=0ڨ(ǁz*5NR"ξjkp{EoFj*qQ^x^nєZ0ytGHkJ-=,|\QcOTk#?EN9G%:4sIj8Umc-VnS4sd:lՆG~4MՉ Ι«3Pw2=GVOX==Gw66YNN7'5g{>K@evQ3`9fQ85If$9fdt1 Y<2ȎhMYaZ_3)^lS,Tb`sd RwOTndT4a%#g4;g##kLSIiOs(OS 9筣vBa(dWuXQգ7l7WYNɛC$\g.}Mk_k76d$YFJ(MDfK{br0{A>B-> W$͙ꍎMխq#w=CQTUNf^ `7Z 3m9t\Lǖ#{ck^7s)Tg]-x wTf$4UnCBf÷Ex蛕(E{1Ez`͖GT: dQ4C /"#y"[{#Q&B24fAO< Pw.tӳ2Mq/=m65&ik+Iы*8޳[USS!quP"]\ yw4ys?} y{H$lz/I̒8*P,d7B?.Hg "#wCAs6z! CF$z^^G!gg8]zR鄨ׄ/4+Iym"U?۝3?s$~za&\y)W\g3PIUm/w2V Hv*c̯nJ',doI*{e'0xqkދֳãeF+r? t]eEM\c ˃; QʒNRS6$lzf_?뫖[ U߮jH%d[1`Bad7hoVNj\a[ﮉzg崚 ˲YZ6p3/VEc.UElUӫ b&!bUvVhYoWiU{Zf:EW&-jE ;ׯo~V;VMom3^,"EFA `P"E0(A `P"E(BueG6l"짢K?X b0M`,c1h#!%QFq7ݣ.j  G '" .(@*D 7n?(*pvXVWdw8pv;gw8pv;;>[FHrw=|]P+!jujdhԤpc}ӻPȉܪKn}ע+Z8vpf+k Cs`CL$^1G}CWAO<'0㠧X!Z9timzsEUsjqWnF3c?Ƴ:YXeڤqZm[SjLR[)SZk H:)_&4/f64i9.m\׊,8+(5+ Cf5g iԬXجfEg#gEBg;+(<+(= v`Cu`h0؁ v``;0؁ v``;\/~VP"V0[-W0+ W|BA!";B3?B3aa f ?~ BPE/LjNlqGi=y,Ͷ3hɜ֢"0WPjbULNr?$E. . Ju)w5iG!Ġ1iFYӦ3s4(ŏVT,A[D5B|\hs:R3F`Zհx4 *yFq'RY)?U[,oGuRǣn0L2IکoPkZJn}A1gg1Me;gPYrotI eJ=W D{M73O$bw(VՅ ZTob0ܧ )%#I^HAoJ`b#1W0*O L^2m 3߉K7ϖG}ctئ5n݌c5ӌ5+&_^fe7<2Rsoa; -. :mr2Vݸj@{c v|5 He9\&z2_gzC&;K/&vv7Ls?k*#,@xj9G>ч#pDB4O}p-jkw=zЕ>֘]s *L6MNKw>\9-ٝldoqn{BpfL $.yfgoW2q 0Ok,ЪtHDGlwN=ZYڲ-$mkF&*^Pf$5ɯ+'Q_Nk]y"( D2e"/@&:w, N :ğSP97$&K:vE\,.nQDH;qA"E_)qg"N8U"J>Qĩtq &8Է,Z_p&Ix2_!T,X"ğKR ~VЪx 5M4Zo@B@5JoS^ze"&|- _ f x%0_ 8kZ@IkY`,z- !38dp UXWp !3Җ-26E#`2K2Cfp "Eܗ)8d2)8d2!.9d2#G2Cfp %0Ky2Cfp GR9d+ppȌyV@8dFѐ7pӺ:HLYUdT$TNTM*yl =PP gma1;hi FgJY ./\(t$K/K_80Ź4lSuR/aoVt;\2!CLz@/.: 7Ǡ87n7X%-JUk$TuD]E [ft_G5D>Ft$C;K-D6-Gic244zeRuGϴMlon .9wĂ'+6tT[ww߫:yiQ3"wgzf:L ;diN8X>|b'kܺ˚)evJ$͔UVUpهc71m jj4Tᕗ3[Ν3S<˳Q|Ҝ9K\yR=&sdJKg{ق?\d偔*!MJ nKג`YI˲E(W[^Q)=1:CfUZurh!tDrZM遑XYRTpTl hA:IVHD52W@H4vAV8"c35BtA74bDktuawZۯ_?zAխx%{Ü0g90g'c3Ü0 Ü0g93̙a sf3Ü|0gNi$`4v07ټM6oy͛ld&7ټM6oy͛ld&7ټM6oޚy3nvdFQM[CS/D}ssl:Bp\O,X>{K8.DžB4giJs QTC[e򍭩lMek*'O,%lMek*[SٚT,Ϳ@iTNШ]`1d%'YBPB:띖?tVw9[$3) aK]c-b>=a:5 XH1[_cj;MSH$43kwe(6PtBl-֐e5y>slt5Kj,sS%οNy-?+CE?raUeUL6#q=X(p=8GzA#q=8GzAϊ'^<[|s9[)iEԋ:6JH$frO7 :f {4@7a l>0@( t"1F3B /]w#! We#`y\:U[ۀ£ HxB seu+\Aʾ,gBA!erй!gKE=/;KT=a^vEZt[$K<6cwx<4FbdPA-INKg%pBqsPeʺ *%_"T`ڏݠQ1qT e7@ ǺLy$tPtŻG?&Cx!6y2v "ڄkÊ^1vY"k5ś^8>EFwa?4Uy+㍤ .2+w~!μP/kFPvM' w4?~mxNq |[Q1ԛ%EUЫ0wzQy/W?9Y=j92䳓MH/''k@h:!AՕ֫ƙVXҎGrcS/E=ق MF >mk`e=OX⯿o} 7(ciaU=Nl<^dAG~]կRDimZ5%hxݮX-@L74[O75XH.mG6*ڄ'pU|R^ÎCHnghЪ޶HZ$m42l c5 _n6ēuTb w%LU' T-$ mVBY'FEYdbx\5,$ƮOv}]d'>ɮOv}]d'>ɮOv}]7uyXyL6*X}N v Me-法sq21ҧ+3J0I"d;'-+>5TBn g =A8 2Jj߼dnE/FL0&:Hl_Kf)$Cw+ ͪԳtPڰywDrZMͳyXtZ$.tU]蚪NLՌT3vIT0-B2v*q02Ej,PAK]ck#F]fW/ׯ}W#n|vdg7>ٍn|vg7>ٍnr㫎,q& Cں/dץKhل&L6a Mld&0ل&L6a Mld&0ل&L6a VM̔q)`hQ#'DQlQ|"^t2M6j 6j=TuU |t]:©AFZT)/xAyvlV'( ʁeͭ绛 &Bm}!JNj>?sO":"Ι2IN/.f)}ϥdF;O6lVt;c;0+ uAѕ@#1YNٕk5HEv-.Ԥ3o(ߔN=E夦=r#,9 [δnV [a jW2,5&6E˝wtBOB{Ew< q$dEijNwq"GD#"|D>"GDȍ]VS! &35~s=;dFN+eAAkG=L>#l#u웃N륕p< -%0G;}f׻X4 ,yT6m7% ht}ÂBFŎ-vŮ8Ŷ{:ݮI2 sʜ9oהHi!\`un ۠C3}fän\F' d9rЫ֋WLJϟ/J\Caѭ֌L:/=bV0fF͌zn1.>g0Ȝ_;#/fy\V:[#&̣#&uW>YM11 t^&ɿwF-K#wAwXMbc`{2 |I&e_dG'=ؕ>uGUUN'ER-g#s*֢NQ]&Ix*'$b`F!Ė2)jaJ:Y CG#c%ԍC, 㞫( ?6)ԽuZ=ӖO=uȊL.Qw+Ӊ\Ӷ'/ݎsDAȂb#j`;6 hu7Q eB{չx )tሺ0+M'8yqq䊎l Ytoi!vCX/-">zOh_xX8QRO` 6I^9=y@# | 'c4Y`3HvZH.Qdl}__,% *?P1vB h$K.fR6$]b)U|kJ,rQ]Ju -o~{^ 0 tۋ"Tɫz|{ sA} 9gg1mG9"K!̓y"\IǨ>b_MnOhL_f:wuRG5;緑ZO6࿆i2oKy[҉ҭclpMFMgm@Mhfzu\_n7Hޠn6#<wh^EQ;HD!9E%"@]~g$ <ޑ@ڈxl}Г \?%s/Qs?8a]/_߼kk^f>[QN>&ffЅyͫ t:)TZk#wnw]{RnozPRI+h*|@zl[ wպV ̳"Re &;r^6 b:W`u՟$^y(f`Vt^19Qc=z{W~KqJC/ވmse@#C!g Hg8*(b.E4w-0%0-!aaBFj.pQFFNp(s3 zE̪YB$߹C]NRm$b&C)qƲ+?CmH]6_n`Gyﱫ H{}x|2u%N@: >[lZ o@.K^0eqk!3٘vÍCƪr3j\s'D 5N1^ @N b>|d> ˄l67?ߡð+?zӾsx밒J2+ɬ$J2+ɬ$J$PUmo4v+,] A0=f~ ! ~yw %,St L9q )(^8>2nVWI@.HMɠu7o!I6ǃæX#IW^~߈s8Bf| ;AkcnC5@HeX^^zibT%HbP|X]7NAe@T>VYo9LT>A@蠁 JBɱ$>)#.+0,NXq\\-Hki(.NR\:CDiTP^n2fIl޹,/σIѧZ6T 7pڊtQ(/j мLeDP QHԵZN{Rՠ@7Se_N4dƹXcǃ1L% ,3(| r/HVÃ8+ljvk2e~:a{m{_"tyL2%^]{vuKB)[/18Lէ5Kj0Gaa6}_1ei*~2 U {{)a f?yggg+ g}ۋk_ڨ<0SH|@ם軿?r<e̱OOB!]{֞o{R]ZBw·3ͭ}-~ZBdp+fg d_˯[?2SԪFXOJ0 :tWV'&&e,"doueUa1y}rfY0'F\` "\K® ,ݭݣ98sdž!*Z08,TXXZo2k^7c4e+x}Zjnm5iRHT"MD e\IsP>wu|J$/=I--Κ]-lLgMVm]ARa7>>xA^{A2O SdKIzꂕZ10 h7`^UmTT:1ظ7o25ĩiڤ3i" IK^)ZʌHrYnI0y<ŞAAzO4Ũ+h#Ď1.p`h,}#jՏl'f;n'3qt{pdA NGx$Eyd{=K2TfiOig DY/af ?kj}:zf!je0{[PZ0]`-uF⯙/ƆEQ92xajٻ|]'vNJ*OJEz밒h?  YtbA)B%49-y٧ <[G{/f=kCuL4:CU諬MWr!nǜ?ˬjd ׾05]Yt{cZ(IvZlmZkH^~ǩo'NM7;*iͺ\ۡӿdmuۃ%ylƺ_fpGP̿k;ɇ٬V8Ɗ׾\`,?:$i>T i8r\K(0Gb{+IL=*uܳ1|4VTCr]2Ṡ)MtbR^LJ}gٛ|9,#z~眻fitVܕ+2\ V•+T#boGV-^~ PwUjɠ|Mb1RKĞ'&,t#Uӫ(V?iE?wҲxKΉLImݱjȜbL/:nt9f bC ҚD.#QsDmoQ;`|}jvNAA(~QDRLq$Od?&YQd2`၈?SlȔ,ŤBo"m#62G% |=C 1\*Rq?-Ffg|zM9*=]k`*+"^E(hUϽѵQi(d742ڵY.hA{ . X'J xqNG1C?s3Bע^ FB(H2X!7yV҇a*@D80D;VGF{] gEMtZd.Xc/޹p+Hߓ8q;;!: pw% CXPXЗ~y]K`›z}JjةS t14RMԇeE ^s%ne !.a>=!wM~E2e]e}M f†H  IZ .`\P{tGAWC/]3ܡQDOBXYuFS@_?~ XZXɚ"UM+߬~"HkdӪd)Iu٢Y qEU H-_,B6T?U<#xqLjivݬ"i5f"k'Uֳ+^{uIR!1L ͪ2loiKwDc"Ekj5xDfxa .'jc'ڪoFAl e#\Tl3K[c?y>WQ_~S]9Ťee6j%h#ћ>͏dTUJϟj+g Lm(NN>>:n>fPo"A/rWE9}Qv53ڸڠ̄*aG/,N&„e_\^4 ?Q2rʶ_fk:#s{qcy:S5Պw)"$>l b ZF| ykb&"e G{#=ͼ"cYsJ`^kv2A@7 ?L!@p9czwւ-&cpw[B"REfBУA+ H3el!@X b _%(Jl.s[d̻pdusO7MݫLT6 @ ̴Cz.; f/mZm>s-xbދr`V $V]'|Pφ"?ٻ{,#@b,f$*]`#oˑHzak!V)ug/s9 Hmey#=-Sc3ԒΨZtW6ywuF(-!nH1'cO860`R(RZSu}q8Hma#\aBhL7 89Iu6G'7DrͳԲhN jǵਨՁki Ш/%L'#Nn KxBVݜKS`bdy T!cڞCsh{mZ} ơsqh{mϡڞCsh{mϡˑڞCsh{mo'࠻lsꜼU wu:/8Pkd@}Ά>wM9 @ULA^tϸT/"Ϸ_Xg Iu ׍{LH@$/'!'yYx瓼|7$oQnx/{ygaž[cE9Y; 2 CIE t Fz[seoC@UPVB`. U Ⴤ/M,JQʸD8.:8Zg޵ k=JS GQGﶚǭ޿w[^7Zɔ^=!Ms}{j|f^헻G߮wtؽCSuW+mj'uۺ o)xAaM2gK%ʞsDXO"M2ysdb48wzb.6UT>2Kn+0֐Z,jKN"#%Xu9KxkLG-)#,a4͐\8*ʳ*J%@Sc&j[ p-(j+)+/-DDnPPFm:k" dx Fn ^2⭣ݝG{{6'EE ⯎;G}ܽ#=-Xcb^ ~xIę Oڐkq4Q)M=ic}xݣѫ}=[DZuM񘥂 /ͽÃ)9Wu[ozj'E}|Ekgi ]|9ǗNqzc::V곑KKl[\vQ4QgeBfԭKU3>noO/مCkm$~:6c*G~gܖwRÏu:R^}XYʣ>t7X^vLVQg&+L;{VZTaU;VbcTwbӣ#g¿F,\u_f?B'|MZ'`?h)e: zxk+s5֑&ĞܛܮKt-$v,Ug{TBS}}lt;ws{(&F U4\:T]/zm+cݬ^^<܂j7Rۈ 8.(dJ 4 jի݃MTն!0~Xoq{:~Y[Xh?l`߫\=S)Iw6kr$ :%VkQz^UT1U<7`d|?Ǡ =5rK=@a쓸62׶_ϽQDzFF6Z/k\4`AOƪ|f:$**?n_׫?FGp/{Ep2ww) |:#Lx!mH"hۚi=t[7o?.!xA'WY~@ƴu0jҽǏ_zQ0)xVh@m `af*EؘJH#"tO$`/ar pL&cě ^-:DFo̓`-]օ\kIݛ!оͥ?={y@6W_W6nٸr_*$Y#6 bU /p=iD|ܬnӝܳ=!<`ͣ?Ǜ=ѿ$tY<&Z55 rQ`QWkޑ]Sg87~o{ ]꡺xb]bًJm>|E8:rg^y-S#3\AVx! KRdԀ{~j%ʭ%(yߨB߼X^Y&& H^Ug?td{وrp )E0 #`#{[G̡13,nB!y[s@p%Dr;G]ٜKm ֏Grr&Ƕg%..蜤^u`}x"-~jqbӛ4eB^؏5\Xyn7/&vcȦ?@JJ) t-M )ղ{2)'2h wx~ON+dGR؋J7,S Q|OZA oku/`{eDA2zMxUPvAV[{͝ ut<`1>C4uߏ$O\DuPlLfG _^jBT`x${G+ ܢހ9?F" ȨXT4C<<P(բV~kdյ}_\7Tn5W/:{ҕ0̓8ouuH{[- E^KKe RTqP!]\P)ܒfq|ZRmo =mR)XD8aZ\BEX0[Oe\]H">6UZ Y$ \S{KKahv CEt0|Ō?D606٥*tcn>o2Dd`Ha/ѓZΫ <)evVV:m7sksiao.}$Pf*XJRhw]R{N^|F} ABC 7Pa"=nS|?qt|xxNg_2qO2 '1 koOqzDS.hcB#=΅!au;R`˃;JNj͊-:9;9!{32{Ad_p@Hwc$PC@,_?CwJj0 Kfz^kt5L~uml{d6ڂjUܯRCZgt9-ݏW`j'xx _WO>Y?- xs4 8Y"CV|OױV!qYe4S@j^mm =g\}7Qn9\%V^\\{([-ڏL'6[%)\RP)!UB=B"ZraAP/ղEAjL_Yi[zfM>;QsR<Ў}LqM{J-y#mv = YoEͨnKiacSn C7K/^ $ќ & =m dI  x|= nY(&^m8]7PEtiT`C"5),N*֠ |-KL4d6"ȞKIHnF 9N;0o 6=7o._.|L(3' "#(үGL¢kedR ]N-]SP=YXft |B<ka4B^.UNm&pL>8P6&R/^,k$ Nޥx9+xb ~ޣ15 #oy wQxͨB{؄ YDe%֍.+-Aya?jd Y[o;AE2 Kf/-٦X-dm93NdMHl74j1`m~.<YEo0`Nϼ*n.rdI])P僕d :p9-~J۬f5*KMFk1ZH,],e%K4UJ([豾nBlrRʹ֦ ťC+g{rECDT͙NylWub]qjY}"NفQ',0"?X|7_7E>C۲ڐ~s?$: 4V(8.0rrNTd6?7 ѫ pp[.qVTO>AP4R`?<(q5|u;4zz_?= ֍x:BZJ SV?22y1L2O-1f7E>2ҳWM}OwXC<6WHf7}yr((u37( 45OnqMe-Z oY@ _J=UyEYyhڳ:IvF%(Y`r /CW|b"|h]U8`_B7OVaP;5kb0DiCEmkT󽈳XIEƍ<}rq^?˂dW8 GukMnmvTR+ IE^^f)Zn3F-8zg>QM4}9 P7шCBapz&$  ]j'dOJ:hA}|fGLwҸR?%$`%)<HB)WrgX3ta6h{*v-,A 5pטWl;FqJ0Uhɻ%o[Vxhju9F^P;+R[}?~3I5/J \˫lEg#O~42Asqx)Jw zqmE)pcBa2!fSyX*OH_:AMUȷ+KԝlbZ/OC]9:/ӭd@()ƃC2'ȩcxO Vn5bPr/W{ʗr?+_'u*9S)3S~*&O2%%ЂURdJ6v[AܣgGVQLbA9._fSֻ2S1-ȣry/tpQ|*E?8P4?R1.Eui eQYŜv?u!+GSmAF }o`rgPDKA.`~O]C);z>?Vl}?QH{-gcgLdPx Wn喈4ڭT{xڸ?;n ^쟺LN/.ǖ-݊ۆd@ooOZG}53M }=?/\/7'V$y 4qJ8B2Y){PswxWNlZGOHIdsh*2u4o;3`)I͒~k4#^,M@᧽ox7J/7Pa^_'fLM:ӛ&b?34/W:|3kkړ\^ͼ9~٣ v/?<+M[G3ꇻؚgwQ[Y?C ::Y9:Ve뗃Syz 'ʷ94xiyM:yndfm3K. L .`ۂt Io囵'|L7Fa~;8@fYIhpY? vp&<DM/aZiz.x7R[+__yÊ*rP1Q-/D~!EY43yZT~51fwQzO$d65 v+̧ @GY|aWur6:&=Jʃ'gHƾъ>fěw?;O7W}1iwp!NAB?tɖV,:-B=V3; IW7LONfdiˤZN{S^f=sߣR\bJ^)櫝JIbNo]lc[i8 80~'A˃gU|+ȗ9P!C@uڄW_.wj_h0ISQt˪t:F5 "fX*9H 'ћ@^&=~|ܯ~WR}]/W~sDU1p5SEkc,JZ۫D^1TѭkCWɴf;U10+Sw"/`7 RfS2YpMÑ9*ĂDo>Ji)>@vm0p|{qWŐ,E=j/_*JϮK䡤jA2B3][DWIo' Q`ih;/BTi孍Je镮0F;o+ P 0+M"7W/M/Y=d/$Q4!hղ *azXN4Q apl- 'rKLE8L8XlJ 0<m/i `C3%4",~h f.%${[4C 1b@7βN=$~Aq 호XVoUASS]L eZ\/%BJʔ H*><==UiGtqx[jl!x kO;xpK͚PtsB㖊]LKbQkgEFq#{ZmDZ9W]\!v~M%)h5ODZTNQbpq᪒0ke~~=Q`͜%A_c&T< ;i\1v%=W]s[yHM(5I'y3c-LBB? }H̅xn;y310썶x(My23kW%ՓuS H\kR̒һDޢZ`zp&VbF09J;$glj? 0}z.TF>Cglä) &ɴvnZVQ*-26d2h!'~e!W8*%?e&PHt/X1C|YZَO:džRs+N;KR"̶lCM6NYj͆sЏ GYtǖU}Y.U8-}⋐CSCsڣH+;ldkJA#4% KU' [$p%)O9}'+WyDm.ڭʋO^-LJ߶7`,qwƒȴx% )Oz>FX[ԼR?|Q&*d/sٱl񍃘sU9Sw"8Yb"YLߠ Ow:|/:o>5(Vһ.ex&.$?q팏 4X ?vЍSV$^ARȴaa0Rqjp 0O-wd*+9|ձJ+*%Srqum-B7^'9!&h/`9ϙ\vThw{ Bylc6+L6Ԛ&!mM 9C.%'B8rѼ[s@a-F[ nrFؾICzz !i7Щ LTxEΗj^CGq-@~5U)ps ><]PYUtL\p>_򿔶HyQ-:_G?b;mp.5NmJ7f7D'cg)3L`{@eR1(lX楃{şJ!XNP \MIN]n-Un}D`g a Mi66w߂V3^9]nч=j}A{BrŞfVF")c})y}EqUoQΓVVB8L5Ġ)bN/ɓshg m$Id`o2gkz[ާޭuT=rhΗ|!`XKUhdSa;U6lR۷=5f tR` Jl3ɳx=yloʝjJ.0<)orchv!o3'}]mKY %;R*&`|= =[ASG["\DigFس œi6cf eWlVCɓ2l &70/gAO-4'(XqaGF!7(n)-&F^-<-X/zܙDei9GM;eeH#VP_-+u\)2Os P_F2 xWoY*W.NVH6WÃdf΁6ƷVJ2: u[󁒌Y`"e6UPFк؀h1#'~ *CJ`k2`V̶o5AvәPpO+^_EW/TgDA7w\6یnloB:CgHDW:C¯r8?>Ώ>|}烯_>>6zWvk3zrqNi{ӱ)ߜd"V}U{8>A9vVZFSyZYq^ **>n:VN PH^ s ЖIQXPY5=SIpԀ6K?SQN1in+p֏:.vMX{݊7‚ksQHg^tdH[KFG^IE4FsRN %p :hrb4U ѲՔy$hՄ]8* 8ٱ ?po)ƺzaaPAx^K"ۢ'<J.24І%_\D}2"ۯ :ibE}#.*idV8Ab^ qL&8n9f%!+GzPKxEts{[;JT*IπpCO?S7z$2X,*f7of:lAb6E]bQ *o4_g0rJehZAn 8O*瞕$"d::E'PτAcyҁT/5$eXjCf="QNuZRlJ. ~fXW]{U23t Y4?o|czt1no!p4oz/nJm4a}7_7%]@s;e%_R3@;/> v Fj5K[s{J6_ uH@IB¨{.h xihi==!@(죣ط3?lYA"EGSU2Gנu{W`84 $5ѫv< ;G:": =’z ******U0:'ut D<}$`˞ I]kIBP3-;uV-U_*i1hf&j>G>G7Ǒ0B4*Fd`ȊA^~B@h)Zqฬ'# dv4“ 5TvPH/-݋PݨKbVmS7}NR&h< eIZ(U[*{zmP;OKHGjv̽{A!G>*d:` &m9O ?`oF!aQ*!|/g~ S)5z sDc`T.wqھ|_NJJkُi?q.-g핳v[ݮ{(:r$_yc<OKyAn2'x] (8J^5~oRW|SQSɲ ~lwXN3E!ˠFYU)MUM~O;ZUJzFSY?Rw2M7&'-oj k^Z+-?[=ScJIcl OF>^Jn9ԭX)iP +^COdRP4LoÖta)ow+w\q!%MgrҾwW~}YD#Lsp7lwNhm?#}g< Z r4p;`0#0!~2[Ýtez [ެI?j\f0ju{dz ]["6V z7gU6: &ݕ䝓`# k|s8گI&|D:@AH^]غ :x/v̳oZ{s =XaqɺiQY5aDJCQyDKѣS6VW;EHӨ?mQ/<`DYi{y{Ex=h<H}P~޾=?b`} Xw۟u׽m]sqݻK~ݹzwnvڽ]xmhQ%M{ܯ3a@2cWdKwЈ8KXxzG?0#@n*YA 8,n( \,==[`,c1 $Qh@r[wfHڽ1$8wA?Hy8H?]+2uB ax2g!&>/@7L556jgIS/жK[$P!)y OO΃H#"AB=Q4NPAB cN[&Ѱul S DZFK~/$n ڱ_v-WAn׻ʺ#$Q>,+ ś`,ϣ~CgAormU@bHR:j|w;en{ )L! W`_Ypb^>Ġ~3@k؆UmmIc Ǽl*f76m2YCtOO9}(K稦=hK0oFpq_V竵{j=Sn'̀'&Kpȟ0#J :,yJQǵ> c TSCu\85Qcgu9!G=)* Dֳ2 |xJ%&NOFYhAqfz~`I|LM?5~F?R3,kV ²X$hd%ASan߉ՍFF͡ã@%K)QT}eٳ~ ¸"7Akؒ#+,EPTñW6g%EgaFF﹘S ()7amV,u[$6(#CǐJ|i4w[&[rg-(U 1yfwgɴ˥}q1R+=qel}׽4h9㲐!yo G}aErģn@/ B9&aZt[ *D#z+L"\[pkUskeV;7Mdv-;kOY{-d *[˖h?;XN.[`ԳlFXs$?_ +мV bIό^˽{~8ڃ?pA^A2n5\i4>]e,֏K21Z.|qs5CHN("O'>:>8Տ]?Qt߄6^c7\CI`Տ$V'( OhÖErYXQʟ{IVB\Y8_'PZWp`TZ{L("bzPk)d1zmXmX lHӋJPo'i ޛ8[l[%1)Elb1[[vGWTf'ݑ/Ki}|NH=UX3\Wj''J\S^n }gҋM$e-|"$hGvs.Zw}+jl²OYwuh*@ͣtc6/zRal C!Vm27zCja:yDhv)>"m }"Kt @k7fc45)ladGQˁwdxU}:GB}Օ["ZDlV}r(`ӷ lJ2 p *HY>e4HlM h2-]]OØD)R4K51o9ݑw}#BR̪b/YTey}8g'x w%:"Ky;7ZrW7ӑŊ5L] %S@Dbh,ߵJhQk4|IʗH:cSse*pEYHY|wMFO"Ix ,P.˯ zϚWCKu:h%FhUO0RD=xOk-e}CV-&i6G[OZGK%Eq-d1DiO6>hcrZJLSiY8V&͞Ju*6MƔؘ4|n-رrl==(buyA`V?*O#e2߇ĕ0w)k.:'SܻLY,֜[ߨL<=4@[GuӃeә%/T4#r=G ?4gW:3ؒE-ebi4JTZ [6ϑCUi&8RY! 0q:̄3ap::<܄ő:r7 JcI5h;&Bʢ򪚛v)ۦ5ZݞxxtR!=)lpށLiD1PpwcjLh mv՟ \0[tTV tMUuDeYmyh`R>Z~Gel;Wc6h@}Ds<8hR@.yՓoGfb/.4٘ S _tFVrbh|~e-Qy; hB YxivUyu%,Iijjgk +q +CvuBrg+r=iL-qBy\9#t/Ѵ4A':s*>-k')T1S [@pڷQNh1w o+-] t]Y}{Җ(} -OxDZ]1|bCL k1 ԙ$2hw%r16VP_S8o^ը=3^cypߪƧ*;!;&rQ|k*-X"Í׋:BRwMw( Aj!Re] eow[!fZ>7=>Nư-i=Vf `ܾS }n ^gyq|S^! $ eBVWbzݎǻK=:65>W 0AⴣͶKAS*qc{oʣHgl̴jS/3Xv-- n;j}KOp`?I JqY .ʹ `A J6mmIyn<:vFY쬕%bbe,WnܪAq}r^}E ,!lPdvl^W^\\(Q4HIޘ4J~0? M/)^rc`0荎TAC[qߪ>U .!w0F@?PزvN=ʑCyut.̭ƒiIݫzMi"5&uvL* I_cjWKzAəݮ̄eX BJw; a1-A}ΖYCgT{~ImI˲ϑVj2f1'9TA%x>#]9B(O6!K/!eE_i} a$ui&Y9[D:AY5=<\htk5 ~J.ː\* dt[,*eKxbi^akd5?䊥TUEUְWZV*ƐDu4t,k6!.D8WݣGC , xMYݼzhdbǒݠ%{Áx+aKâON0cP^K>M;KfR9NTwNP R"}`$3"it~)A`MRn] @t=QyBPB٫7^+ۀCg2 4kj ]|Cbw`D1-FL/oss|؉0Ͽ#s%xܮMzޅ]EBYn`o#Ыmζ'΄WĖЅڭ/8%yYf61ć.z5i@F?0zW,\.<д$ KJƮżJe{|&WL ye{a~ MI;=4p'mݢmW9;y,\Mֿ$`\H3i >M7<NJC(fKfgC㉌hhdE=tP|ÄspYx=I 0.FjWemqqk!?gs,%-d 1&g-8j 8 Vq+J[+\67լyp&˷!oUGΥ)&VRNo4c\$3T) H.&׷DL -˪*gg0<S8,7lxѳfsxvȍ?eÓNX];!2!WAD iYW0G3ut9L"j~rn}^>$XAU H.!O5C<݈ӄf *~mmsQ F#;+Jt])Yy\ }o[^n~Y-{{{2֚ ];WԮf`[&Ԓ2x)8xh݌Eg'x$]~9ԟqPExmO+DhjՏ:^°Xo$"E6\sT-XV*j#F1\z;p 9Гj GGo&KN+mlzWP\/{.O4@E~`U 8k&ke *Zh;dHiKjCGsJSmMr9# )ysmO+5W>ms}g5:x zUn%Ŝ];q:v&;[^葷գxU2 fꖍ<楕GPq(W--ZţdOfUf%5ѣ VatkM4eT+Sj\bSuLoz[`Nc3VWdsXsoNG{liw7RpsyU]+b}LVO&0 oͫ+@y).͌#U^yhzUĪj D6JsHgl]3{ۏ,m@4m'G0טedH32RzF33ԋ C{[،\9'm\S]SutrY9(,4LlM] 'h,T݇Yt^xL/yrt]cR }~WPr$(1!&s8 ~I*^'TL3HL'!p]9x` ةRObKCD i*zcg!GC~UU1sԎgG #1C=mo;T Lj!ҵ[hg}r3nO˙i{}XcH<0D:ejjNc5+&V;l͊Ogl׊Qu_w 0+uU `Ъ,ݧ?7G{~zo6=Esֱl>R@fXJ]-c΁YGuj1>#00"EZwb9zvʪ2PNE #eOU#{aIv+),7 Iu8X,5szТAwŧA;{^~??knQ _^1@f"?@Q)Ex0qZ_eP@vbBK5Lɛi]i,ITbL]"?@Q0O?M^x6;R^?NaL].xx"Rq vݯ=cAIma4c(yt 5҆e]oRB#=_D7 N)a14: P~(%']( `+ Nss}chLgBg.xW8}qX@^?;^PLaZCaB35q ;A$q V4^l`h^e0{C V{ikw^]kGY4VCA[ҜFƄrɌMljGz{sv%k&d<7M|^YC4B Ȏ+\] q}B!ԙGů>w.Vqs3B (6 .]!dNaƘ Cd5R?LӋS0.Jemq.e}}w'uor'a;$M,Frl$'Z.as2 EU_^P(,^GώsblMhMw 2C+ Mڹ-ZuatbG/s"bno_:qtSGE83`O /N#T&謶Co{Β2WcW/%6s*l?a7@&W=֏,H=_=%9I*9:~y~>mQa TYA{LoS4 |Xض i)ghŔj`e̷晤`\XH_w+ã/}bw[?˫~=VCJFBգS\ |gˮ{k +Js2 ו |QdH^}5e$l_>;8nl/??~Ԯsm&ɄLeN4I,k\0AF} ,Oj!/ю(cVsO$C*o7>!N"'VG6 #jQ|]yn=,m᦯ܲ'NiB,9(J(yE-&ywVi[8r𕉇WF+r:Ϫ,ހ{-C)wʗX{jqRaifdo f6D?FTd$(;GUA "& K6Vƹ3X\&cE =T~e-ϳ]oh~5`@2дY8]*+TMA 4(Ҭ m`g:jJW8b$nĵ<ƣg[x2ukw$]2[ foWN*JPVN+g^%~UTT+AeɲGɂf`a\wg–Mo0t?^]\{m8#Yz3Pͦ[=ٶ{2zўQ)i&K3f$xm%."k2w%o^J}=@{7qe SLZ8bP9aqrȌ{49/r #=GeyӈrI [HkHdA7UO@'.ENhӍ>} l_~୚6YM?+nz5`+0,-;':S'"( 뇻[`>eCc}e[77.GTW^|ڄf.?Ejr1Y;ku\+l9rƭ[rvrIJ'Y&|`Q341p^=m]p`X{ItK1>#߸\.Kcj.nA;Sl7RԁuUB"3TNW: zPWئV?ܽj߰v37}. }DZtPDeQՑBl  q8B/sș]Pwq;A?&UN`*M"^wrD'IGժ2@:[DK}P ?@ ܏KUxH҉ D# /M50D;5 Dx/SE+&Aw S T0,LJ{>?^D|ƽҵ'gt,oJJT|˭cѳfh{F&;? gL8 c]3[ g4_Ժ=8y;hCKM-˜{6FxIA *GLctdXۈS^y`.LeÆz ldμUc=A~׈8 HO|c < Ʃ)ĺ'2۰E@Sxt\BqX{D {>s {%0]fȂ1nS\&ch;@f)_k|?>hh d}#&+;D\Lf/,L,<<44F ^\{(] 9:yFwKUfhބ*$U:n t*:P$%7͐e %2 +:ҋlCF2Bw(؟NU{ǏV2#ik1 qT(1 n~ 0iխ4d*0*c@!L} -.Vêjs(a 7yOw4 $W^R|er5R!mRkν:CEGQ =YuL;ԤΑnF[PX#Zae`j$j/ZGܦҫvP1ph[-dB}*)rTH-F( j$|vQ෪&&64FVT<گ]?U pM}x^i}  aPEzy8prAMH -bqC2!65}@Q78XX0d%,,Zx\$EԶ0AUPEVG^L &v{@%~f7s Z`/dw 9p]Uő ,Ud lh"zk.!^0BӥEOjfS&"d7ݵぺʥ_5^R ^UFtb%T,ޟ2U 1_!{n 6L i$2CĦalCKY4_z8RVT#8{" xVe犼?ak_ƊGbP0(C?G-El! D:%O JuU~=n<K;ѳL/%iҖ#` ) KZ&V(V޴ kWbI- d2i4Fqzڨ%l2R[[po^ jڝpbdbwr؁ mɭ1_, 344p`f?2;?~W*,v?1YE"urGG(Il~!^,T* &iy:MPvCe$L1RۻuyqXUMy rL*f UH]/L:k:>NȥCWHa93bIJyC2əyV(RdBm2aNҏ'AGP`})a{ ;;뀬Cn=xNQP#ywlͨwM!L1 M`I]G!K lr5^l^(ȼ%3^yeO\JE\J[_BZ&?edɓ'zOVbr4:{C4iHme)RE9JzGӛ Ƭ ޲<6aʬH`R_ʝ"{{ TRlDSu)JfhήUkÏ p f*QP-Bb$_~[̄ /|57!l7V$@]q`IqAӋ2F⋱5/ T9=bږڪ?zկx=Z TUCd k3w1_Ռ(Q;0m8oș?8@ i:ؖ i8:S$R1Ep)S#x;dhJlH"F̾魜,_1!e'xKjMP|?1pl"W\5Q}te[-\0!fVɍ nwЖ %xvoOEMg+|ZZKH>*ZSMX"=X8]u9f*j6=^!9 /cdLMq W . k$nXǕŎ2MQA/lhΏޢ Y`H}#s2W8n<=&Jh;kcu.ZtLfBM-(XX!, <,[O2(X7퓽XgL_KM^xuei [4g.!d3DW,ʛKGˈb ^4鴟NWƯ^ȣ"P*L_}uicBx%"[{϶_ŁH FU+K@m>Jwѹ%xpH_7 Hdp'YC_M>t˂}bҖt'l.-.-.'ѰE"(^LJ]b0Ĕ07Œ$ ٟ>P.o~=H)L:aL-:[o ]ϜH &uM =KYFh\No?`Gε,pnR8(m`c`f/8ƌO5ao=C&K"dM.) 61h }q@齤˭VWWFz `FɮO"( Vh}1)-6KH2T:z ѓZNY)liu}`VB: Jur1XQ.<;d\ZwR%E.BU%_5 |ýrl,rU@ݪBބWÇ菪"7vjvPdTҷx{ LtJޥlj"OПQ%zD?ĈMzN4v[VoeC7{-e3rՅ;] {;rjMk/Nkٙz0=3V&bXQPTb^&Ry(E˾vҀ4O[Tb"0wY9$o}Q,{[Li>P ~޾=?b`} Xw۟u׽m][Am܆>[OKwnv=*vν֯ٿ10#hM&>=_o޽Ef==kw~^<̞lGm} 3\^d`n#r@X*{_|Y[YWEks<qL>Tu-I5V%b㏗oqe-{_fS? ҿ*P,lO+eT4lX1q`;|k860ckxb Sd>M<ꕦfᓃo)XgϤcwOnR*J+RkoUGh-b.W(ii=IXՇT ?gd6xJ# N!a%tͿ녃(DCwcxyRlLG]H#!g08C fE4mA"nYx{¤YaW[3U*G&xn~Y"RK y.a^m ~8_\̩000 d 6#(#]; ;A@e$6#')X /zЂ)ZL C1 ´b)>QrV$x6(@gY 90.,GPDKM騾Ӂle,{4nZx04}0LURA?Գӽ>ă'γeͭ!CSw sktOFuAN:@'Hv!R\,xYY:<ꜣxR3!.05:[tXlum6Vq&u,yp;>`{GlFѕlrL7ԕV(:osL')HlǥX枲 ??Զt"LԦwMHvKt$ &dlgҴɲ+jDJ*f:m\}1ٙiUF&N Adl?{ vm԰p y `%|h|e뵾Ⱀ3Z,QqZ͡ʤX9NN5= G]hD GHa4ԮZs4,6QB>V_Bmx|"~<wmAu ɒCVq}|EVk : EGjQ)XZPe!%.O*y"KFaY(u,}dLʚaObyh@kfJ`p;|ϛb. | /ac솰:EÙ}gzu@9gބ9+9(Ov #ʳL2ƝOn\M? d}K/({85Sf)aAο^u{QoHcݰ{wf[7*:A\yw]~c{0:[3Twz^۬c~2h0\wM"+G;RR Hn \ߚ:-I_κ$QPb'Ŕ Vi]'GTTVCt{)ʘC5{rKp%+}Z`tƬ06'hNic!b$QcQoR~g~Jk0JX ?G2Gփy<>860+ [=WaǛo6& kK uW滧VLs^F!{ϑxxm~VivvǀkoBLX8yw.kYK!z0%KmNIy6-~nû_f|ߵ|}o9u{am27fMQ|`|fK_+Ŀע%KKM^cVd [OM`[mƙ icJǽSŘ(6 y"N:<`|9h!q1j0lxRd2j}:B22bL)Ʊ#l Gjdz(%<­ ?IK$W.)L)5%XY?8p?8xO):=ˆNpK ғeSEy,q0b(x AԿԃNaV'bWz4>P}Y iqI"o8>igGjy;om@߭"F: VX-\p(B"9gⵒ^P{|غ'u>xO֏I C$QeZ2T 77: zg/lV'fBe!|7 ?v"d R6,s̰+gv9A"m ? 6U^+4`X9(Ԯ"K_h/QYIYڮV`LGGi]4ÑfmJ!㩽o49=s.ʡ٩vbZy>0~qY {#n+J?y'X29m0~3sn]EBf=c`*篼IĈT "NMs%Y#Zȵ q*9a]eQ '5*C?<4'U%&}bԉp pDQ'&eQ x`^37mTM;E1HR<+u9VZ{_z:trNj f7?X!OˇcdD >vX S8 @3k5NX!_*PxK1;,v4lN*ima`T)Ib (q;Q4Q 1f'cgSbIo 犸`M}v!w~bW{_k|guj? _OvS?9d[5@ol1SO[uz|?< mfsWVk'#d[ E=MCWZ8|vkQ*Ŭߠ B>ָShiwZƠ9Be:/uINm-^0/皵fLfCKA$1i|ϣcD/TL,"n2@N%dzx<þrR#-~\+ׁj} iojG P^_+? Lڲ  I) za0ac <(?XH5?:ӟ{8<یzsN k,gԛ(Z"Z1HKP@*n +Pliѡ*l5HΖںE$.rayHA+ޕ B|mF^wX 3TKTOӅL"qc!a LcSg PL\i8w6-naVz2T5zj)_M?hFf4I50 rv4I8bhҜ[s|K?_4gdu>{½~Έؔq14Sk>U3uNt敟33l慵K kY[ Zs:`:cnI\c^]dXsLsdTzSzoQqQ}걤XQ\ާs|*Z;Wvh䦁hƁæ͑[{2ڍi!`J>^w^.$'8cby5kT`b3[i\)+vy ˂SϣnÙr`f'JO7_PS V ٚKf܊5r_ͥmXe-6"(J"H98TJ6H(^0u ^qh# 4Qm8O[r7v:Q~#wk ~fjd;\MVMQ4K[uAQ˜N1R2*/sr2적$;m1w(f0.g06/&AVk-\>|gVP76U-|Lz-Ҹ6Z[VLd ,%[_R~]?O+s^n)w`8}btE`k FB11`)GvRˏB9P#KL05jƲ538_ l˴aqKP1nsj;]ua,=@n"N:r;N]e-4&q|9v 7-0m6&Sg;r7ojFrh܍#(L[y8V['sd l+ WYG;ynk?[ZڭΜnyD^ο'?ͧ:1prz&ѮvgdƲlAs4Q fOdy>v1B}^qdx5X2x/9s+WޛsN.O.jBv;{:Y(4|r{suzi&[oځ9ggQd\V~GcI?Tgd4CΜ&Nڤ'Ju$: mb3ό,`>İb!ιEYUBb(PF}5k0ѸhCKNI7 `OtF1M&% Tң60&Ջ-QojR96>eȷb~]rML00 j vwյ0}"D ?9{15N^jD׬Nqi>Tr?)i_i?ҭz!-)ԐTj [|gfKcC6q߫z{:Ѿ9EQ-l)Zءo*gG&1f,tB^^7w Ƽ_[0]~4=sfekk ^t07k!jWլfg<}5`k샭YiN-*zH}^ӮI )v]4żr%;J:~MU uBy:?NvZ'uBDsxUŌi8(({u^.ڑ<W-c5~\2DbR[÷u/i'bVt(vI(/& ׹W%rz< )0 YNXG&0474tb3-񷘀;9={/м\&=@Jp,,yHAY$3j%*ZnW#҆*~d$PA N?o%N=ȈۣܠE-Lc&g@\v zs2ڮ4#0 $}2/muh&"AaFƤaqs4j6D_C^8> Ĩn'I,~RƐy]$dDMƪ4S`FaJ`88LbT~ڑnvV7r3FV:RWӔc8yɗ$1s-_ 2#Bza?rӞ1Sgτ6XS^t#ɩ 9|]$Xc'׹l fY \sN6Qx;-ŬsX`n@ԡFt #܁x]5f YarFUmOU^`kZ}wjblBǹg뀵cusm/o)׶iq>7N NN/x{2 +yKtʮ؂4}-H# Yvm'Gv!pzE׮K6 C?5v2= M\:qLi{b׏kAn*-4O_3#_bAxqttoEQeQB:mL_ lGYйcaR\Z̓p6-k $|=\WŋKMigw%`Vf5e5$kf˫FSf`w` :qb]#d[N~A ^?^?Jڽ(F2w: X$;neCJnmlնB&A"Sջ^3& uQOwF!i׸86fevfɋPAZ\9$P'Q.zKf/'4H[y!^ߤa֛s,.zg"^OŵP {'ɀ 8g_׊ts\6OIS(Cj7;yى߭ Ps߹Rsnh%smbú>[ K e;Bɵ *n#~GQ "8UGNŏ< ~w }Z8x7.?{ LӕY ̅ ja׉N6e fROrq-+5^A?n՞/0pCv.ʗJLU\;6q{9pav.^Ⱦ fXr1Qظ]VMxU9kq؆oS2w pYE2' t-hXл 4%plTRhЮww[`ocy( # zP†I&xc"kX/ GltBz| c`vG!Nt[.,P]\(,ۏ>G`& /^\zMU$T=c?9.{W៭clTGdޅaQߚKW Na{朮W 'OH9Vjε=2K_cr{QN:"GOj&r⤀[~Ds7m_*Q Xw+@\QX2 J+,.<}I5'B˄ubg?8Ük6z|o6hpl5 2,lIJ|$ t̮Lt8*Ȟ['7fC['>)b1A~vRQl 8}F (b'fϬRbI[q&CVR?KMZFV[ F,TѠOT#!6حA W" <ژ2j8a! km.oQsɴGY{bs2ջ u (V0n2ðT2& pI`4Eiܨܹ QHek wFVfcZr5݁Xy)#8x{.d)}ZnMIu_/2],< (#J 8̬H4ǀz ا|7Z^˘nw 6 hc9wBrq{n ]mdЫU:r;BpKs,R,ݔoQ ]qlūٰs\ rjqDFۡ&O{<:G'it46[bpON洒$9c@ .@ ZL@萺.@~z|7=)MtӆJ_b8H.gQiK-i.L.mHC݉tĶd Hk$-;xAGhz08Niilz׷rz~tk^y|Xss2'Q`amշXsJ-ߋ|$Z/C"q ?;>ލDtR*%9Cr2),ذFq-&raFE>rݸ&#ɝBL Ɲkm8߉zP.y w! Ӱ=⨛x_Tް'(?wsBufCNۋpC0'eǚf, mr YON\Z9–Stpvن'#$eH'6NaGyCeTYR!A(З]=6-"k0:~0, JԱQY[fWFZGW:+PcgU 1%,P]r uBDN6p%^Ιۡi}X8|v4t}[_5\]afFɥ&44Mm[=׺vҶxSK&L-28ɷwάtGvSi*VdMM*YnIn |ۭa^M1[C3KNK'gZG^yTvD1Sbh!Hl#ZfT rnD$w}+CJZ#s2L:EeVoyxLm&(ڳk;A,IRINUeB`@i²R jEo]}(gtFT ^>I0@L^|v`/ A"$;Lnj<&/}%AvYt/uRծAvM:En[ЎQLpgT nXN8hH;?ɵ-&9-@|RÔIW\x'k;@:0E!3mx0( {:jW-sTv̫j)Mqҿ&L_hz&і`Óg 3 f*%S+"e@ЏWF%uXO"t (Erzڽ)Ȍ',C@Xm\Q\i&קK`t҄lղ0g[2@o`7ʱu&8fP~ :AQ?PbS?PMqRCNǦӱtlw:~_>iH6H :B#e B> q0Q9!cBG} Fpzg!TWiX#'ab7Uìxc'` 9S k,]é8TEH :֥EyvEI$4k4 [h;t 2Oo0џB9hܩTe=NޱeW,Z=DQp@յ4괗m1bY&@C" qL3(K0 cdf5< OGq -7^H<d@M\`dτwubŌaoق=a)J8~H` *ҍU ގL (Hvp'~b)+l*dH[#, T]&Q|!Me$a/Fi=P<bK@[Y*jK( cir_bK^⏀5,5.A}Ϧ O} ;@Y.êXpPen(ljBH@U Tt-~s{h 4`Kem \~ d|~ [9? %jrl|tf &TCA%7i/٭j%`ua̬jzrY HAGBp G0HIP06TwT^kA6]ٯ!Q0ɣ87)𑥕>ʾ?jշ7kD޵ΐmHTm~oE wɺE 'UAHBTxFUzdj ]s7 ]5z99quu-BTϒdrدqt+رʳY4`{<;g6 taԷ)B݄Q'KuU&ӫB^cбs܉`/ $i4 0 L8vz[nlDuFb4-bE:^v"P/o6=${O1 6UС=WN%bGh`֫uOtϾXb5Xk<og/uoq?wh Ԫ]x:háXmw.}_޾s{}o1 hr}RiӃ?DO֟!lkk7V?{?ko?~O>wG?o;wG_>᣿>zfy}_'7{RcGO;U>~ —?ig??>GO)O>X7SG? }{>'Gw>, 0O? #ecr^ϼcv9pLWOﻀ6ƪDpc_Uyxg/^G g?zG1G _N{]񎢓F{~<򓳊4]/.[$&91Eo 6qjK9w _|q40xF'n͝d4G v~"kaם7J335)x(&YR Ub+T_(6KIAߨ~ԬvBAa稞#=!u,ҥ iQP\Dc|׌7zE]A]=xxȢZPq(s%šwVܬzv# 'tƖX_Vạh|zƽA$00dRD =V&uOEƀ"jj MP RPlUq[ ȰUB (CZNTeP+ZөNni 6l/|pBec>S9`',{oC;اXg8w$ٶxսSy*mK$-=q`c7.^@tAZ2nzL2FC*4ۨƀur 0>=@q=8V^S #x<+u;s!hJD6;tlJv*X^M?@(J.Ԑaf+ӑ`It&S6BqW@zLVdq<܎&UFN{5G~K*_du>`09~4b1&n/ G#w a_OtX;Jn([U  , Ӄ/=Z3@L+fJdB(`\`|lA M|MP7U,c@xKȰק"Ypyx:{)yxgo維F[[:T2m\8:Ni.Q|6=#vmP#Pbu1ʲкdpQ4Hp.КaZn> %AF֏Mұ"6v8;v"^*ʼnĘO<tV*C9be@Fcxn5Bx ,e8% %}xСi0Ĕy-ܖ#yffS/K'b"Me{>,( }${\T>S&襚Ypt1₈k*ݐ:_0D 8( D%@.zQ8) vziba-Ӏ}&c3cxrb7CM-BK{LL:tG3!hu%5ct$E9fKpLS{RaSY#Q,:qv$/d ‰f3dƃ̋use88%R=@:u'K{/k73ҊnN5%6[MhS/ -7Da0ǬFؚ4R؋>֛WOBF8dh9AZf0z͵N!cqt<>FY%{.G}#E@XayѐaCNzL/|ȥq1haFf}ǰtcz'ȴ'fDD]AcyW爲\JaӰ{~%Q-{ |eM\)63.~m  :VZ p((CwfLSܤVǔC3YvT3t4 )3sjF82edP7w%̈́>E:4ƒ4x9SJ|W|[.!"R]˅yJtHw;̇uvRMN5RՏvwy>l&IJU%*΍#kd7nrCv JR8xC}xL%.Cuƒ+"ť8 h-*^ zZݸK` 4CBՊ֍bkH<|bi}흪8;].@ |fӍ+:P{ȓZlXKP Bi̍zŧhlp%plM%l]/}tsyPQyަtlFn)l$%]];!Dǹ*+HEoU^fu!ey`27#8wax AD^@ T(0h޲Xtbo7&݄/Tlٙq1$b*σn)rqnuna$Y1&⥥5g&D&lpKPAXQԧ-pjIb\.QP( V7R)/FD +fС#HGᕈ⁹{,`6bl Ȝ( \_&xo(q|)qͺ:ϽƎ: wg8_!w^OҼ+f4vLIdI=)j`wV(84Bs\YEus㇛<|R羡2$RsnZITh1<9ف?5۶Vs/ӚLNpQ&`Ӵdo:wA1/ N7[6rn ckZbtN蚛S]ݔ1Rp&4 6$G==(61KU4('Uᵐ:HrU' /̽Gɰ"',㈷]D >ۢo*j(? Hhu*z[Oe->'yt‹N =[VlSu:a^#.CF!t`ExXp C(Fm]HWcIQ$#GJK8y@VMhp 嬂ΫCP\W?n=?^wݛuA&|w֭~P^E am-5Ydug[tPEDovsัa9! OneeZDvl)9J^bQJ /RƀeqL6*:³K7sC.{\DqXC[*ߴj %-CgnP 7n<uIj%*UFپY>^J'!mA`ZZ6kUIa=6nmnן6)ӥ+s]frxVkX&:T˖؞"V7R[z=?ӿ1Y7 0XClLtuicoy(pՊg߷~Y(,tp᳄ 37GԬZ\k{NirzCkki(hγAцFwӰ9g]3X9d%ɍW}v{1[pha tX7총V=dlр0c5S`tڝG)ޝg-&Wjfr o z" 0~slGs cSj7s"hmSu^s-IVѥ5o}U{hb*̭ ׼Ɵk̀hT[3g`_W}%OkA!f>}&\UnF8cVS:lEYWDh䡥)󀸪f~RrUY@EV/N`#ٗccGu"`xiߜjl{_GN0yo tTx \LL_%soTgx[)(trr7d@dmzwBQV?j?MF·r(s<9HRxyE;0QhA ;KegЃy6 zFW7ߴgl@HpVXWM3}'\t?B^63d c-lu̮P^o?RZnM\,wam^'G33A2ho56ꋲiV; {sgqZR$dbX&[6O٦D@^ڧ7…fa7[o$5^AƱEDOm-k[X, 1=(?tZ $:4(xJ77NWݿ2e]4hw4hۇ9!sr,# bL4\gxn4Qp>iHOS2yElBIƠV"MI#G7!xF@ P>ZƥLAs;Ϳ/07$P,ZoV7*E^%϶at20VʠL1"KXm\Jf"p2̣/v6)wydXͩN4-ֶf%:۶K^;9\iV}bA82ŀm>NQGc.Z"wŠ1Y/G:AOPvP=]{->G\F>cl$ً]o[ q(#7Ӆ9E{Jw(XS稞:jP $RujD ulzv5BXۯmx4w(0>΀9;$[u>l4}CXR85$Y/RAFLg-Y ȾzJ3HI;!UԻaɓosk4\sPotW8BrD=wxdDNOu Wrn<`%VPf,s]ӕf=7ѓǚMӅ^+RZh-c>8Rej-,{|Ҷf&|ȝ1.m~t|uwp wMRnTl-RYGwUjlaO M,Js9!Шd؃Ɗ;NkY~˜ 9ӷmwH"t6=~rMc<ݫjM9|&}Jj"Xק;Zѽ]hRpcWS6I@Jͻ?lC+-";P-s>N'I9DPXy`~QjK^COSJbM'-1ݰxRP~/WBvww36ҍ|v*i.e%>ߌPHԶ@rV0O-ų ksYLo]DYIZ$ AdW1?o׏?IpXbپ rȰ:%t)Ńa˸F& Qp6QoIXRK c(,2% \Nel:k̝r d}ɬbD;vA hr"9T,(CkZ3̖[&o߫q|*GFq"-H6xU'YHK) f⟮b [sJ)Ii0r _2+]0oiˀ6߼b+Fshm+V8S7 |mDRlv] H8.&kq}fYǤp`jC[5s܋;ko{BXkF\fMu"Z|(-m~wxkb̶4cœCtg̸ٴW0U認eIHiNfڃ1µdKLNGJNT.umXՑKቷs\jnWC"uabmGEaB0n׹݊zݝcd{;(8܇ rߟur:ysG6c2;< Ei *eE(d#ji ..j,`YH"Bxt$~m>#Ta::>FYGIO(dž+J7rcڡ/3enʓKm LWJ7VNQ@R9|+(5yE_H1ݲ&WTi4wX h"!]L (cXr@6H%9vumHǡKLiƮ&6, E+:6pd9)>W$,5||ڽnq;#{tME5DsC}MR|w5o{(KXtgܰB0@JĥJy8'ϭ %Dx[tSr oKmT2mQ+iptMROܕDj80\7j?"P!F4<  /i/~ǧ^ `pջ_x/VkveAYܾEubψuBqyqNE/~Rʷ{xԦ95cYe2&cR4aU񶑤6eTF>E7ӻ㗖)Vhr&}I YԳ" K(>%j`%A+h}Fr}H aV*g.y7ӗ(<% Dƣ'y^s ϸ\ bM[/881A^ #/FtF pb4>^з/Ycc\JY=\9i:^g r 9[1ٔХRL){D+yT*7DbXh"륻[r:. {J5HhLK_C9S>Mf=fP{DfuYk:Xh=;<NI'!4OUŘr]5,Zh8}v-gyVf^Խн=4 %[MoWcPM*uN&$ݢs̑,^OOYYZd.3IoKoi%!n!6!ub1$~,r6,BSZ]b e:3-[Q@,M}b+>?S_hdx&ĔTl}ici #(P2ޜ6 &$LF(!}EbN6gG j *_qX_3t$[ȽIw^^35@2,FxY:}rFGMDx|d; }-4ru%Nco-Y-Zb$"YT||HI؅ M((6(( ]檸ݝkv *;7зy~ͻ}ę3g?T(m7@oZ; cjj eˍ;+' ]qNy ڍ3 P%/lb_\CM/t9 iuM䷰ShA/hֱfɼ@*e2 He+>hhVs踏6I%='inRI1r&Ƚ8}R18N[C7tWuVWxƒ}bDd,oM)F%erpzȍd--K'2FqgƟԼ ]QBD)p>6ؙT䖊:!b]1 + Iʲ!ַ|1)aޒJLK^A.y#ԉe,N݅.#nJ#'t!>I/޸r1(M\NC*E$oQrA= 9 :Z%?j}qfu_Tk# ԱK1!kS0p]Vi4ϟwȦC鲏nNջ; L#ra#৞kWS\ѭP:eҴaR6c/ҩEǪ+6* 5 Kv*n;rE ?FVP6ˉv7W .ֵ:VjHhL gqQِ `ƝQM~~rc;kG)1ĩѲ4C/5f 'xcֆek,anp".BUZEWW簳k!p B(Σ}f@EuJؽSBV&Q{~{%*yBbH)^b-L_qX7h3*|&~\fN^B-Q۫ Z֜]-وbٕpiʥºc8Nc,(1 {&҉9 ޼Pį3+rڴmU%:d< yp]GsqzJSBz:;%Y5Ki,8N +%?O*Z+ރڋ{]5 hƩ| @Nb-MtH䯉>04~QZ*s )_SWQdR$WӾ£)9ϦwhJ-%VIM&`.۱ ).Nˡ_Ŋ]q]S,Qjΰl1iHh7Љ̄8jk:iwѸVUh.A`@ ?R~Es^X׿'錢IPuy)N%mNK4q xt&甌}q#z0h'8A.bX~zrD3ꗈ&Q.+x-%򶺟}jv\=<ɧm^t;UKJa7Vt"%tVWѕpgRk+q4ԻhǬ<Nr[U' 1$E~W-/.'Pa 8hEzi#DZ7hT,9 z^lpmT %DRS_ï܎7MKFRNvԐ mMVaG#]]!STVXG|gNC҃Ƃ @|嚚ҰnGm>ȸ5U2j4ȷ]@%o?`ņ`yCC-2q!<Wa635 c/<|b̦`fSQR&mذ-ϯ]mڶ*tg6z{|ZlOPɡKAY&86)hpG";Gp|t-]C:;0޶,/G/ԠVP@3ve\]Q46Of~%EpR;aMq@&:FGmΗspf\qSZ%ТYjmGI Zڃ₩gfQe/ϱ= vgYKDeȵ66Ѓ/-{p n+I) ٛ8tgVT<rst;:skDwW@nv>b8@R&s6wR0(N-{< @P!7UIvC7\^\DHbSG&鸙+\Oeezm8xP~{~U#W䚝vFd|Y5_~& sŐ_ŜKh*J}ҾPn9 ԃzmdƦ.8юUn.}Q/9nB9OQv]OqHAaQI妶B Aj[ ?岆-Kdɗ-;%)2Zu␇4"ϼ1[ SԒ#d0:@z0PniL]ǬfÊD6_tMܼomI^$ Y5埑YN_Jn:HreOɴƁ+:8u;>y5!-kq3C<5|gIÖykٍ ̈cwugT'5#GE#aGDq3iB^6R5aGH+2Nr">G` gmqH %NXURע=7' 0Qb59vT'YZj0\'[D wR:bϨI683-RW$/;޽ZW9*J &Ҭ- G&4Mqt,C N3%L^aKR ]G5 Ƹt3o!'qN܁L# JrchނއhJǜYf1bj.oZ/HR.wB%q 7!h)l/?.&fA{b)i.Zte4OPDG\ -0944Hci;+Κ[]9.Z:zR cTOɱd  q|Z qVwXhhݹ07Zĝh"1Icĉ; QQ| =+b\ql2IVV?z+Lb<# {Y DcQP^6R1ڇ #t@7;|ʚIp0m4o4@΢SVCw/`3?P{E㍸oDUhy jbO6 Jc8Pb(CxGrkA ?X⬭t;ܢ^),j0vUw%c-p&t}eKrMt"⹳Etv6nQ|[UߣrlXg>'y-W;=--N_9'~hŝIv4.Ny^8zE1 87Z+p>(EDxp?tl\b;v]n yCѦ\Z3C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0ĚrԂPe#InBl  $S48ށrEhGH+P!\Kl'd38N8.xe V8qq` 8N \%Rx ހw]A$~+K@*@yt<DŽ<9N|9zh롭V a>ħnNҰ1i BcL =͇6|1fd>ĸ *\e,, \eoĖ,u!wb$ʿ0Xri"Š kB>c18x9^-|q}>%/! 1/}L;6F疟9Ft? DؠM !I%{⏬R-? R[# Tg% R1͓gP#AP! LP7A9_ QzFtgNE_,!{*$* 1W[r-%AUj٩h`G#tG~ &{>є(b29? ~҆xJY-Ykd1>ہ:OYK7kg{ފE *ʨySjEB_ӻB !`PLul}FňBSkvo L% }3`Яb&zE$# Lyz݁~D/ [SY60 (.hKSE[1l~nL,]ӢI֡#XPn= i\@;Ɖ` 8^hrBxv[#[2ltZYFh ߰)WN24/B ѶqޥvrRLAr>J H(>)"|X=c~1W &?ۨjZ:e̾e}5o#暿Y0H9Yυ\Xl6ß}Vliqe0 dlѽ[Έ2dR:Ի\꧟1-2tܟ_bFepw,-XEWE~י]:H)ߴr &bČW5a)gH*kcrI f^QC2H^oX/)sgfROeD }1rnj{n[@*x.1А Y5gM応/T,`753g7=#IV&{<s<0A7B+VWpyX< :`Qp$ D>``#85W$d@1P00K**aP4! t` {Ṁ7.7OqTFG#Z?W-j{>% |D{Ci S͊?kL-?8Ku iLv4@0ه?J}KbAe nr>A7zf(ʶ!h :H0 H0ݍjlfBk7C'7U *`&f`=QRS1\ or[`4$IIfTk: RA:E7|kKM/IOe:{P8  ̈ $2v]/lrIfv!UTƛ[$=#MH# }&[=3_>DY`6O#c]w YѹZ@ 5}&I^GIjNq$Ve"zJ!CMKT{qdp gqֆOQ@$$Vt.> <)8nj5OSKu*t |fs R^ڟ' AT];` v!G?^ /E` f1v6kP21C'Tk:: _.q|C/? Ǝ6{>-3(3Q()z!U|`;Im&el(3M-,R62O[ 8K@ hXHnzW+ *!m4,bN:s- w]v`c7~O;ITA<@1&ѵ /soːs7 `f9h!́QG=pM_][`e&2C9L t R#H%7kh˩F`0m::jfۀ("߳pnBUu2Ü]A*g Pq ?T0 )Sx2 ) jZ02lc5px8R@󚨳@7 b@, v$:B%8xz އp.ߡO!)SrKGN_:H.}†$ߎ_/ ν7CD?ߢO,>uk! 6ʫ͠T?ڟڀY][ ?cД/al$G:u fgD=@w5T{ cbpq2E&}:*[7HvOˑ΂d]$cY;h6^~5-ːd_&f\[B[O1 gB\ޠlAT;iAS[hmiPspŕeVy%dzy &˿i+'bזS>ό D`0n? ` *b8"*/F)L?T4_q ]0 &Œ4v3u~l}`?Ҳ!A`+}b6aw?m)P?Pu W͐> gcB@P4 ?S󿃱-wsh97R,[@pS 07LH<-)a+BπF{< i=jWjof` v 0jGHPBƃ `)Xv* aLZlap$S-xl:APDw#w%$H}^t&wL?~OI#7 ߺqaL >~ށr\[t;FCTUCUĊb.<WR n/,pmVґո2_C^Lͦ? iQ9(M:JahgWbى,3A z)a5>IS5B!UQ]RZHZX 홗"+͞oGo U_tY;虤&QICunO4 oYF4AȾX&_ʐOoCXaP/:q;Wԅ=>4U!xD v#) cJgd~ t62Enb,L9eJCu:Lz#?`1)\AT Ac cH~J Fb }sb!/ \˃}/ p\O3  jd=PBja`8Xp(.Hv I#)wȻ&er29v/#ys7zQt M]XGĹV8_[K3#=mS]*( E!Dxseu<3d!>x ,'21 8% Td: Yy*"sK I\%h~fk+`=wZCL }4ԉPԯHw62>)bF=]Pu:}εVV'5-TL"ZH-TM\46B?:Dtw{(Fҁ(H+.޼ç~]ic jYJ)߂g y'j  `8怹`΁ <V3#(a08\g>+F w0C@0>냈ńt|!xRs-C@:ȳVW6mA; ,[ ` ޓ˟\:=/C ]\XX/N9_ʫà N 2,]w=5=Q)"?]Ώ"Bm!_}ZzͲCLj-BFx6sk>_2܊류^!BRFtE-"Swk7#ӆ& L=)W0A,%lDn*X.N˶L\::Nl~Գk7YT ԄT#NMtf>  Qld("H?l$^gD @.M,🗿5Kpd!!%A?U/ǃ ?c7bte/`cWk )΀%,#7{4ݷFt_-unct*dXBF:}BL|& 6 z}sFH,ގXvn$$=8(l=z?mO1p]s:#z<|h-ߒ++ n|D"O۫I`8N U@L[!4L3`38 {fBY\y@>ܧO?o^!A*ǹ/H.>yh'J6[*BĚohg kwM=~-v <G=uwC߉(' \@9PT  *J2U@}j(֜T^j?Q<9l\Ρ%˩UQL)@uiYI} 'ebGJ5Rk٭Qؚ9&A sLA5_!mliڂyG}m;cP[jI͒i#MH8DIePxS+b[h>zqkPizH|0#-,>d#YRҺ,YS5Ut\M2=ݵ| Q@[?IeEϴFrM= _ Ú]YNhNY3w%s^KedZ^j_`Dg߱unw 1La卭)ײ>CS0xNU6^C<`-&,,qΨ),՝[LGpN||iW]yŽs. ?蹃|5{ݻMpv$bXqVG]/$/=koW-G j??i:.V{rvfο%-4īo&Y_tfDh :pcM}}t//7~t69D5 ;xdž{]IZ5`oł}tV1l٦e\px"O)=zZ&opo}Ϝ/*yt6׶t0}g=aPV=bn=7=⹨Pgn~iw5ͳIM;z9sTIKZ[bԳNj]_ۈ|DϺu|wlɾnn?doϿN:̈́J`αޱ=lQ=U\xrjC9>:94;֬i3 ix_U'[[.b@+n6+V7W~ٳ{\Zl_{7RPˁNְ֫VGJfuƶ,Vdp璎(q)N;wZV0@BC9^WCqMoj+Jy 8y}2Jp)e 8bI%G"`8+sMޙ:,vʫh㏕xmdјYKj=|m7ѹko;y|Tƣ,>bNV+ǭ9t3r[3+]k]xy]1m^QlE/WS}z_7a6 -S^>q~ te-햫|Z:t_F߮ko\y\ЋVjWbŭz캿v[ʀokt<_KW ~aŮ܏.hjN[YI'B>/,ѬHz6 M_peJ6yD -;Ym+쭿S~/w.砣-?mxaygؔh3h)iiVve 3wr}.YѼi]\h'Bcҫ+6u Tw-WVZmyuV'$4M<ӻd\s(ꁲ][(&ϱGz4hz]Gu>nw^yҬfol=Ƒǵsdb 48nh .?~{&NWqsu&l8;克w[eUW"Hn̆_վLOmעm\a{<nDK+pRX7%Mjo{gPan].WrɋMOʾ5z`kzs1)<Ÿ1EmX}?*Сo2?ɺvnvb-oÆC[:n cX֭r̺ٿ@5G2ÙK:h۾m?W~emEGۥk*RqeݰJKPY}  _ *kN&ܡIg̷&Nm_0KlNaE&W:7m㲽޸Sjk=<6?-u[[>-^'oGF5̔ʩ lZvwM_=ER\pMFV3Ό;=}6di=+^#wkYaI\kn{J˱U6:Լ#vveL/,+E/{;me%#4شG+s\)K-/s~r3mM\͇&a;KtbAyU}/7s=`9pNEF#RhUɾ:G|9gV=W-krĽU9-2R|ߺ(7C7c]MpYVi.\W%]z%KļK>//i_:67wD<9z7ۚ ܧ+KYnk9K}Uh,tܨͅn[55*Rv[Jm_EYVȿkùk? .;harLŅG{^sdʘUϦ\`.eWZ $\+!oZ$Ow-]!1_1EὭoȤ/u缼z*'<?I6Yjxd4}稨JcmuR.{ȤȾl*zDimS.OiwZ LfB&>9?EJm?zpQmq#їgfZOiϿc磮ݞmɅZEG&(ܚVGh5X&Ϻ}qO]o6T^n?BsŰ7 i0m81dBmgL[VZS/kxx_eA-چS&W:~[|X">7ix;r _o_Y.`;tU{zT5.ݵtMS=4:UKwq:̖r;Zˤaz;ze{A{~z>=)t_lAcw率 m`}k1 ymTV-#^v/={щOkzY睷`ͶƳ^\mҍV oΦM_Y3 opUX l5'hP  ڲE˞-( €6ˋ;P %=( J82,p΄\ *W܁{ *P ~whAP>h@+hmS%MA& ks¯eޒk 6ގ3CA`iG" t&jBh oAKM/mGqojGG{jLػ8+7]jRKjwز$o7 6lYa``C kIլ`0 ð30gpr! rVUeΙs}U]T:(b@0(*P TՀj:h= JdLNir@6Mq>^W<`>8]"KXBˀ3+.o 8GX dl6-V+z~Nj#%eMx.' Q Ϸc#cl>8Dtoa3Z#u/`tr(ߴ6ăoA(_y;p z%Ϗџi#ED]l GiZ^~;lUп^7z1AǠlB"(?E`QFQM79GJ/\._kַ5#s$XEPBW^\X]𾘓.?R\Cd!K6kAŐ$D6IvwQ^Gr' ńX) j `>xZ+Vwfش2~'Kض,6q7ЏqLwh[ہu6ղ=rlk)ɘK%9cıEq spL.>O}V/q?0x!qg-&XM!謧؏xƀpu;_/!v98$,z|sI9K衁Y}=HRXl,xz] E`Q !.Fx$+!RXnC5m sITJʲhmk+ Ҭ44V6 -fX(5B:خGRo+cAF:S'ul:ȴA:N"M|7z!״v/%i`OB/&j4/'PsE?flO.GgABLeGgNNnv,sm1 ˏڶJͶM\ŶxФM;SzBw"<nzG{>rk6q;>2hV8^.vgey"5ci4;ʈWKMUZH6vB+` HAdLUYH`d!% )YIj mlh)ʃ%,$B${}]$K ,$YdɶjY$K6IVk!YɒqmfI: RmGY2diAmo<̓<'/K[P\1e4m#n,% $+f+^1ӢFʫ{3"ފLsěC!Rޡ͌8eƕFxq&Ŷ~&j7YO慑d<9:3+Q͢j3 2J'*9d8h:(ѮQs` )6kE c-$pI B a0 O\0d-,)T ~@NuH]HVNX5>.Yu7Tw+1tbE-mlEO/dM>HDoтNǙک՚C; LVZL+6 u"cF͆:r4)i)_8 -^xE - -+ZZV xH15v}rLn|(R!YbEPkfּ`=Aa`VSXO²NspH.d{/w.P^Xu_GkQ"$Q}¯pBj{hj%ڨ/;G]Q=b}| &X5X,K66mmb.XbR&z$9FHro, =RšN1He%p+ cfUZ(Sbf)̇ Ք:bd^kia"vgڙQW. # &ΊwNwN3՝&Ӣe YZZ]Eݿ>Ql0Xɞ`BԬ Yx1m?,ӯXX 6o@#8&UY}CaUòJspȭk;6^!Xݢ6O*Gd@86XU5DG]2GE+%:|lJ&a5#,$ĩ.v>VlU[VQ"& #Zd`yYE?JV>`Œo<,feu(,\ր`9@e ~q;沒!Pe`+sp}y,ދ'SYX~J7+k34]|K(t@[aagX+nrm-@7& Ubh:miYHŽ !s[p|U鍍uj:۔JCf|,dc-ZjvfZ3|{"{ ŧ,K-[9앫1F61BX|D&bWEc6 (A~ʴWZ5"j󙵡ci"m98m)l P (@/ngWbӜ[D ~[ΆRW^ƱB;|+C;vR :+ii $<ǜ+a`\FEө6R xlA#[#+Ct֗΂U3E2Ss"*<:vnD<UWh°"5+škhb~t57Qa )QJY5J~[*<2 1ٌ( _:=NU#[MЗg&B$W$V OY8F늝Y !' E!jz̬`y]hQ}`C+1'sdqD1,1X9aƨx ^ג@ Wݻ`1妙[b5嬨N! h"54FI1]6xaVKMV Vsbf\Fsh5C3 `jJ3L#X͏"A"qljk2fa`ph?Ne,;;c7d)=)1`6aX͍"9l<nZ!~o VEeH"IXd6Z>A8.ADojc4:ý\ayYp,ȁ|Z :V>b ~+z  kuuD2XE쫮nV4enMuub?Cզ&_4ރW,{^*$:K騔}IϫsOQO(-PBꙥqYK nB %{  o %YIe.zH%쳹)d&,$˲&RIeBl[%'%,x}Iu^d )YI*YWJvb$rMm,VɖVHɾK$YI*ك>)فʑ$78ݮc7oGy{Ka+] _w΄W<^Z_Xن@9( JydD#F ܉^V\E)#=V *ՂJqV&`Abt2}5tbXr}\zY#yoSt$g8k-yJd\CvDS4*#cKD 3,.a)c|U&unh̹wLDuڑnu4z >ݶ2_{U57T粷+,\v`Ce/C/؃|rI`8jh*2rj9U&;N\dhQ+p,І:Bs{66R#4|?4x M"B'ZQ>Iff:Bl 7FM.]f``5&R8Y-l3o7ˌryX^`bNl%:hFyѲ ;`Y"*yXNxךY 8S Eހ?7ZpaEb DQφo'l{߇6{Y +KhG9pksz+2{.$+FPc$"ik+,т$IRi^TS"-R)oF4m҆sKa>sys9=5^AhVP;A *B BkQ넻pHR'"*Y]j+Cd 'UTJ1_āzeCJ[ @|Tv* *Bņ?Mmݹ46ևt*FOs{J h*FA?Hw@0G3o`;XHk.{9ph:;X Órz3#Mh26?ma2L3+};Hx165`̸O3kL'WM`iFsi`4D`۾TP3i(KGN_,)t(0c#궑%ʝmA% DlKosu=Z+p 3hi2\ .wY*Yje@F4Ridp r[D\Vidye&F~%oJnJ h s 9n0 q f܃~w^>V|?bڇ֒?>>Ô<QS|; r wt/hDLaKl|I5Li>,nZdeeeCyLg7γ#Gpo8gƳlX,Z,pcH,+E%nc~@A80_ӞN~Dḽ` NYղLR(m:嘤iwl~æ)+lf> ޴ Ҍ? 2h/K np{ !p?wup{ 2!N$> 8pfbd-=Rnt,$0ٻ!7Mr p)Px(CM|I>) sg&HB`p $i${T96ͦd@#J)pd8J(Hd`%(h߳''$au9k?MSSۀ"FxQ >~BMT}̤c >Vc]>DT}lB-\/ [˿ д\pg* UiGz,5#{1O ROX/"uXx/Gt ?FO})i? o?%LamF,7Pnxm Z LGv`D>JgnedBjbc!9'w)ZůEA偯GkHD"D$"HD"DUhOW|o0| XG7)ko>U'W r% +Du\?Vya,n8kB77kh 2dۏC\$8n=$FTɣɽL[ D$"HD"D$"HDh>͏lwqXٵ2BOzn5*<(f1ήDVػ)}3=gfV8Avj'_^|)!O  p 8&vvM*RX/^ˤlR>[ϖA9%Rk?r>w/ϬS*̈y闪V]töؗXVm^=D/‚_p^^sdo=?*Lҁa{dUoWg.ho_S'gY# vx49IPC?WTf֜YwXI>z7Y} XgVb5 qcԮ;.P#qtJX孇#u\igV^=ՋKeh+#)mxm NOu<&pObHeS9R=1J#- Td*b:u&ITni>R/8ZF6&yϦVk^ӊwUMߋԆoїSKRp5էqCV^=luq婤gO {$rFfqjqQm;*{ę̊},@枆Hgݗٷ\];:MiQx^fNJQQ*_V{^mWƈE%k8쐺I{vzeVeg=In uIK<`j?˼V}wRzg[n[1xS_ךcͮp? 0(,a m[zikQWx7zþIMVz~՜9A.qӯzsd)ުWe~p5deUDY'e]zɇr<_386'ռt>^Kfk4hĩRy W5 .:{#UJKJ5/R7hHCzݡ})[en;>ѫwI!.yG+-tl(x"_~x;yC=tAdkL<M:C}k?Mg3|K\ORWT{|־?Բg(Κ3̳~wיϾN:O^a7kPŸۛ:43{-lt$әS}R8QyӠGi*5 7Ez]MJBw%R=QmsK~#6nwp~N[5XdXqba{i|?)%\ShJږZ(Pk[6OLJ.?Ԋix\qJ̨z-5Y:̸Bq]zzVަNj7T>yDmfF2BDW}H,~eqMzpuR$س,~InX%YAիetL)ي|fny 2āo-e?: 2FO;!B idND$4"*!($Hsh$SDDB*EJʐHE&:zn'>_^{\p֢VJ-n#CΓh5bj "WW,Ct* .XKqT+bTbO'cjLD$jBW[Cap+m ApH'~t~Io'YZ l [I%̈3cPњB_Jc@H?!;v'Km[>Sy#n,=/u^ҍ/:ԲCukF\ٷ܈c÷ P}hC0e7 =Vd2DzW*jFz4S{5£ţTOպq9.uƦy ==@KVqseMNݵ)L/LZ2A(YQk~eG^z챻:>}pRdFp8%G.C6|cvj,͋$jKfX}X"c?q5:vB=׃Ձ.l'|=VTrݹI8(NY{gMOs-ωֺB^3}Z?ʲŵUJw7ڲKC;2*3TQO8H?,w?mCmLOU sjWI<=T8q6Wcsef+T樊O&-PؾǍbwG8w9Ð;̷HHo#f,t^>"iƬ;9="Or~~PV ?[`+<+פ"h2G7=- a彣 kep ޑSe/#}9yčv˸^_ܧ07=Xrζ|KgX-$bli%/¡(׷|UF5'"w%ˆy{ry\:GXЗ51Κs;Mfł5H{A9tvK caU + 3bӰ4N9c |:r5X#.XE\H5C<0౏|c=FEcŧ陖{^͆"ÙǵFg̑RqsO.cS.qoYM{-sb56fy鶚 9zj[H[CDD'MGF쵩ќP6OKmX'ۧC{]Jvʹ`cC_suv'Z>a+M<+2&2>>wߚq'W\ES.IPYq7a7P(C9cQ2C-A~eVw]Y%O5n9?q wAw_j:Wz))GQS)`i4<+I#=زZ)_'069yީd[ڹz}$\p0P鳲O'(%~~e'#'&Vt8_xi'OVgZu'7]auw7hM1kE?RzjkL)o=ۺUGow꿊}m؎ƨ sywlS$4țqS*}(x/׹"A}߲dç웪UZH%NrѭVqDOn{^TPXA4fNvU]vM}ـB z)'fe9o~e9LEDT-5