[datatable-commits] r398 - pkg/inst/doc pkg/inst/tests pkg/src www
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Mon Nov 7 02:29:33 CET 2011
Author: mdowle
Date: 2011-11-07 02:29:32 +0100 (Mon, 07 Nov 2011)
New Revision: 398
Modified:
pkg/inst/doc/datatable-faq.Rnw
pkg/inst/doc/datatable-intro.Rnw
pkg/inst/doc/datatable-timings.Rnw
pkg/inst/tests/tests.Rraw
pkg/src/assign.c
pkg/src/countingcharacter.c
pkg/src/dogroups.c
pkg/src/duplist.c
pkg/src/reorder.c
www/datatable-faq.pdf
www/datatable-intro.pdf
www/datatable-timings.pdf
Log:
+ Consistent use of R_len_t for the future (int in R currently).
+ Tidied up a few casts to (char *) and typename allocated wrong way around.
+ Passes R CMD check on 32bit and 64bit.
Modified: pkg/inst/doc/datatable-faq.Rnw
===================================================================
--- pkg/inst/doc/datatable-faq.Rnw 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-faq.Rnw 2011-11-07 01:29:32 UTC (rev 398)
@@ -14,11 +14,10 @@
<<echo=FALSE,results=hide>>=
if (!exists("data.table",.GlobalEnv)) library(data.table) # see Intro.Rnw for comments on these two lines
-rm(list=as.character(tables()$NAME))
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
options(width=70) # so lines wrap round
@
-
\begin{document}
\title{FAQs about the \pkg{data.table} package in \proglang{R}}
\author{Matthew Dowle}
@@ -387,6 +386,9 @@
cbind.data.frame = function(...)cat("Not printed\n")
cbind(foo)
@
+<<echo=FALSE>>=
+rm("cbind.data.frame")
+@
\begin{itemize}
\item Finally, we tried masking \code{cbind} itself (v1.6.5 and v1.6.6). This allowed \code{cbind(DT,DF)} to work, but introduced compatibility issues with package IRanges, since IRanges also masks \code{cbind}. It worked if IRanges was lower on the search() path than \code{data.table}, but if IRanges was higher then \code{data.table}'s \code{cbind} would never be called and the strange looking matrix output occurs again (FAQ \ref{faq:cbinderror}).
\end{itemize}
Modified: pkg/inst/doc/datatable-intro.Rnw
===================================================================
--- pkg/inst/doc/datatable-intro.Rnw 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-intro.Rnw 2011-11-07 01:29:32 UTC (rev 398)
@@ -15,7 +15,7 @@
<<echo=FALSE,results=hide>>=
if (!exists("data.table",.GlobalEnv)) library(data.table)
# In devel won't call library, but R CMD build/check will.
-rm(list=as.character(tables()$NAME))
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
# for development when we Sweave this file repeatedly. Otherwise first tables() shows tables from last run
@
Modified: pkg/inst/doc/datatable-timings.Rnw
===================================================================
--- pkg/inst/doc/datatable-timings.Rnw 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/doc/datatable-timings.Rnw 2011-11-07 01:29:32 UTC (rev 398)
@@ -12,14 +12,13 @@
\SweaveOpts{keep.source=TRUE}
%% \VignetteIndexEntry{Timings of common tasks}
-\begin{document}
<<echo=FALSE,results=hide>>=
if (!exists("data.table",.GlobalEnv)) library(data.table) # see Intro.Rnw for comments on these two lines
-rm(list=as.character(tables()$NAME))
+rm(list=as.character(tables()$NAME),envir=.GlobalEnv)
options(width=70) # so lines wrap round
@
-
+\begin{document}
\title{Timings of common tasks using the \pkg{data.table} package in \proglang{R}}
\author{Matthew Dowle}
\date{Revised: \today\\(A later revision may be available on the \href{http://datatable.r-forge.r-project.org/}{homepage})}
Modified: pkg/inst/tests/tests.Rraw
===================================================================
--- pkg/inst/tests/tests.Rraw 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/inst/tests/tests.Rraw 2011-11-07 01:29:32 UTC (rev 398)
@@ -1095,30 +1095,21 @@
cat(format(tt["elapsed"],nsmall=3),": .Internal(order(u))\n")
fsorted = f[o1]
xsorted = x[o1]
-#cat(format(system.time(
-# o2 <- sort.list(fsorted,method="radix") # 0.318
-# ,TRUE)["elapsed"],nsmall=3), # (page fetches on counts minimised)
-# ": sort.list(,'radix') on fsorted\n")
-#cat("-vs-\n")
-#for (GE2140 in c(FALSE,TRUE)) { # GE2140 = getRversion()>="2.14.0"
-# if (GE2140) cat(">= R 2.14.0\n") else cat("< R 2.14.0\n")
-# cat(format(system.time(
-# o3 <- .Call("countingcharacter",x,FALSE,GE2140) # 2.186
-# ,TRUE)["elapsed"],nsmall=3),
-# ": char group on x (ad hoc by) [slower than radix on f but without up front cost]\n")
-# cat(format(system.time(
-# o4 <- .Call("countingcharacter",x,TRUE,GE2140) # 2.400
-# ,TRUE)["elapsed"],nsmall=3),
-# ": char sort on x (setkey) [lower up front cost than factor(x)]\n")
-# cat(format(system.time(
-# o5 <- .Call("countingcharacter",xsorted,FALSE,GE2140) # 0.222
-# ,TRUE)["elapsed"],nsmall=3),
-# ": char group on xsorted (keyed by) [faster than sort.list(,'radix') on fsorted, same result]\n")
-#
-# test(389+3*GE2140,identical(o1,o4))
-# test(390+3*GE2140,identical(o2,o5))
-# test(391+3*GE2140,identical(o5,1:length(x)))
-#}
+tt = system.time(o2 <- sort.list(fsorted,method="radix")) # 0.318
+cat(format(tt["elapsed"],nsmall=3),": sort.list(,'radix') on fsorted\n") # (page fetches on counts minimised)
+cat("-vs-\n")
+for (GE2140 in c(FALSE,TRUE)) { # GE2140 = getRversion()>="2.14.0". Must be FALSE first, so can simulate 2.14.0
+ if (GE2140) cat(">= R 2.14.0\n") else cat("< R 2.14.0\n")
+ tt = system.time(o3 <- .Call("countingcharacter",x,FALSE,GE2140)) # 2.186
+ cat(format(tt["elapsed"],nsmall=3),": char group on x (ad hoc by) [slower than radix on f but without up front cost]\n")
+ tt = system.time(o4 <- .Call("countingcharacter",x,TRUE,GE2140)) # 2.400
+ cat(format(tt["elapsed"],nsmall=3),": char sort on x (setkey) [lower up front cost than factor(x)]\n")
+ tt = system.time(o5 <- .Call("countingcharacter",xsorted,FALSE,GE2140)) # 0.222
+ cat(format(tt["elapsed"],nsmall=3),": char group on xsorted (keyed by) [faster than sort.list(,'radix') on fsorted, same result]\n")
+ test(389+3*GE2140,identical(o1,o4))
+ test(390+3*GE2140,identical(o2,o5))
+ test(391+3*GE2140,identical(o5,1:length(x)))
+}
# Test unique.data.table for numeric columns within tolerance, for consistency with
# with unique.data.frame which does this using paste.
Modified: pkg/src/assign.c
===================================================================
--- pkg/src/assign.c 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/assign.c 2011-11-07 01:29:32 UTC (rev 398)
@@ -22,7 +22,7 @@
// For internal use only by [<-.data.table.
// newcolnames : add these columns (if any)
// cols : column numbers corresponding to the values to set
- int i, j, size, targetlen, vlen, v, r, oldncol, coln, protecti=0;
+ R_len_t i, j, size, targetlen, vlen, v, r, oldncol, coln, protecti=0;
SEXP targetcol, RHS, newdt, names, newnames, nullint, thisvalue, thisv, targetlevels;
if (!sizesSet) setSizes(); // TO DO move into _init
if (length(rows)==0) {
@@ -52,13 +52,13 @@
PROTECT(newdt = allocVector(VECSXP, length(dt)+length(newcolnames)));
protecti++;
size = sizeof(SEXP *);
- memcpy(DATAPTR(newdt),DATAPTR(dt),length(dt)*size);
+ memcpy((char *)DATAPTR(newdt),(char *)DATAPTR(dt),length(dt)*size);
names = getAttrib(dt, R_NamesSymbol);
if (isNull(names)) error("names of data.table are null");
PROTECT(newnames = allocVector(STRSXP, length(newdt)));
protecti++;
- memcpy(DATAPTR(newnames), DATAPTR(names), length(names)*size);
- memcpy((char *)DATAPTR(newnames)+length(names)*size, DATAPTR(newcolnames), length(newcolnames)*size);
+ memcpy((char *)DATAPTR(newnames), (char *)DATAPTR(names), length(names)*size);
+ memcpy((char *)DATAPTR(newnames)+length(names)*size, (char *)DATAPTR(newcolnames), length(newcolnames)*size);
setAttrib(newdt, R_NamesSymbol, newnames);
copyMostAttrib(dt, newdt);
dt = newdt;
@@ -97,7 +97,7 @@
for (j=0; j<length(thisvalue); j++) TRUELENGTH(STRING_ELT(thisvalue,j))=0; // can skip in future
targetlevels = getAttrib(targetcol, R_LevelsSymbol);
for (j=0; j<length(targetlevels); j++) TRUELENGTH(STRING_ELT(targetlevels,j))=j+1;
- int addi = 0;
+ R_len_t addi = 0;
SEXP addlevels=NULL;
PROTECT(RHS = allocVector(INTSXP, length(thisvalue)));
protecti++;
@@ -117,7 +117,7 @@
INTEGER(RHS)[j] = TRUELENGTH(thisv);
}
if (addi > 0) {
- int oldlen = length(targetlevels);
+ R_len_t oldlen = length(targetlevels);
PROTECT(targetlevels = growVector(targetlevels, length(targetlevels)+addi));
protecti++;
size = sizeof(SEXP *);
Modified: pkg/src/countingcharacter.c
===================================================================
--- pkg/src/countingcharacter.c 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/countingcharacter.c 2011-11-07 01:29:32 UTC (rev 398)
@@ -30,20 +30,20 @@
#endif
extern int Rf_Scollate();
-void ssort2(SEXP *x, size_t n);
+void ssort2(SEXP *x, R_len_t n);
// See end of this file for comments and modifications.
SEXP countingcharacter(SEXP x, SEXP sort, SEXP GER2140)
{
SEXP ans, tmp, *u;
- size_t i, n, h, k, cumsum, un=0, ualloc;
+ R_len_t i, n, h, k, cumsum, un=0, ualloc;
if (!isString(x)) error("x is not character");
if (!isLogical(sort)) error("sort is not logical");
if (!isLogical(GER2140)) error("GER2140 is not logical");
n = LENGTH(x);
if (!LOGICAL(GER2140)[0]) // < R 2.14.0
- for(i=0; i<n; i++) TRUELENGTH(STRING_ELT(x,i)) = 0; // TO DO: time the cost here
+ for(i=0; i<n; i++) TRUELENGTH(STRING_ELT(x,i)) = 0;
else
if (TRUELENGTH(STRING_ELT(x,0))!=0) error("R.version >= 2.14.0 but truelength on first CHARSXP ('%s') is %d (not 0 as expected). length is %d (should be nchar)",CHAR(STRING_ELT(x,0)),TRUELENGTH(STRING_ELT(x,0)),LENGTH(STRING_ELT(x,0)));
PROTECT(ans = allocVector(INTSXP, n));
@@ -73,9 +73,9 @@
tmp = STRING_ELT(x,i-1); // + 0.800 (random access to ans)
k = --TRUELENGTH(tmp);
INTEGER(ans)[k] = i;
- } // NB: i is size_t so must be i>0 otherwise underflow to maxint.
+ } // Aside: for loop bounds written with unsigned int (such as size_t) in mind (when i>=0 would result in underflow and infinite loop).
for(i=0; i<un; i++) TRUELENGTH(u[i]) = 0; // The cumsum means the counts are left non zero so reset for next time (0.00).
- // INTEGER(ans)[--counts[(tmp==NA_STRING) ? 0 : TRUELENGTH(tmp)]] = i+1;
+ // INTEGER(ans)[--counts[(tmp==NA_STRING) ? 0 : TRUELENGTH(tmp)]] = i+1; // TO DO: tests for NA in character vectors
UNPROTECT(1);
Free(u);
return ans;
@@ -100,11 +100,11 @@
// Copied as-is directly from src/main/sort.c :
-const size_t incs[16] = {1073790977, 268460033, 67121153, 16783361, 4197377,
+const int incs[16] = {1073790977, 268460033, 67121153, 16783361, 4197377,
1050113, 262913, 65921, 16577, 4193, 1073, 281, 77,
23, 8, 1};
-void ssort2(SEXP *x, size_t n)
+void ssort2(SEXP *x, R_len_t n)
// Copied from src/main/sort.c.
// ssort2 is declared static in base i.e. not exposed to packages unfortunately.
// We don't want to call the sortVector wrapper in base because we use Realloc in
@@ -117,10 +117,9 @@
// it to the && to short circuit instead.
// 3. NA always go last in data.table, that option (of scmp) removed too, but there
// won't be any NA anyway
-// 4. size_t instead of int
{
SEXP v;
- size_t i, j, h, t;
+ R_len_t i, j, h, t;
for (t = 0; incs[t] > n; t++);
for (h = incs[t]; t < 16; h = incs[++t])
for (i = h; i < n; i++) {
Modified: pkg/src/dogroups.c
===================================================================
--- pkg/src/dogroups.c 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/dogroups.c 2011-11-07 01:29:32 UTC (rev 398)
@@ -11,7 +11,7 @@
#endif
int sizes[100]; // max appears to be FUNSXP = 99, see Rinternals.h
-char typename[20][100]; // The typename in main/inspect.c seems static (not available for use by packages), uses a switch, and uses the internal names.
+char typename[100][30]; // The typename in main/inspect.c seems static (not available for use by packages), uses a switch, and uses the internal names.
SEXP growVector(SEXP x, R_len_t newlen);
int sizesSet=0;
@@ -19,7 +19,7 @@
void setSizes()
{
int i;
- for (i=0;i++;i<100) {
+ for (i=0;i<100;i++) {
sizes[i]=0;
sprintf(typename[i],"unsupported type %d", i);
}
@@ -34,6 +34,10 @@
strcpy(typename[STRSXP], "character");
sizes[VECSXP] = sizeof(SEXP *); // a column itself can be a list()
strcpy(typename[VECSXP], "list");
+ for (i=0;i<100;i++) {
+ if (sizes[i]>8) error("Type %d is sizeof() greater than 8 bytes on this machine. We haven't tested on any architecture greater than 64bit, yet.", i);
+ // One place we need the largest sizeof (assumed to be 8 bytes) is the working memory malloc in reorder.c
+ }
sizesSet=1;
}
#define SIZEOF(x) sizes[TYPEOF(x)]
Modified: pkg/src/duplist.c
===================================================================
--- pkg/src/duplist.c 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/duplist.c 2011-11-07 01:29:32 UTC (rev 398)
@@ -20,7 +20,7 @@
// Unless, order is provided, then it also drops any previous row.
// l must be a list of same length integer vectors
// ans is allocated first (maximum length the number of rows) and the length returned in anslen.
- int i,j,nrow,ncol,len,thisi,previ;
+ R_len_t i,j,nrow,ncol,len,thisi,previ;
ncol = length(l);
nrow = length(VECTOR_ELT(l,0));
len=1;
@@ -61,23 +61,22 @@
// columns are looped through in reverse order.
// iv) not using the rcmp function, saving the 5 if's and funct call
-// It is still a comparison sort, so is not meant to be very fast, but should be slightly
-// more efficient that base for the reasons above. Intend to come to a fast radix sort
-// for floating point (which does seem to be known).
+// It is still a comparison sort, so is not meant to be super fast, but should be slightly
+// more efficient than base for the reasons above. Intend to tackle fast radix sort
+// for floating point later (which does seem to be known).
-extern const size_t incs[];
+extern const int incs[];
//#define cmptol(a,b) (x[a] > x[b]+tol || (a>b && x[a] > x[b]-tol))
#define cmptol(a,b) ( (ISNAN(x[b]) && !ISNAN(x[a])) || (!ISNAN(x[a]) && !ISNAN(x[b]) && (x[a] > x[b]+tol || (a>b && x[a] > x[b]-tol))))
void rorder_tol(SEXP xarg, SEXP indxarg, SEXP tolarg)
{
- int t, i, j, h;
- int itmp;
+ R_len_t t, i, j, h, itmp;
double *x=REAL(xarg)-1;
- int n=length(xarg);
- int lo = 1, hi = n;
- int *indx=INTEGER(indxarg)-1;
+ R_len_t n=length(xarg);
+ R_len_t lo = 1, hi = n;
+ R_len_t *indx=INTEGER(indxarg)-1;
double tol = REAL(tolarg)[0];
//for (i=1; i<=n; i++) if (ISNAN(x[i])) error("NA and NaN are not allowed in numeric key columns. They have to be dealt with specially (slowing things down) but also NAs in the key can lead to ambiguities and confusion when it comes to joining to NA values. If you have a real-world example that really does need NAs in the key then consider choosing your own value to represent NA, such as -999.999. If you want to join to the -999.999 values then you can, and if you want to represent an NA row, then you can too. That will be much faster and clearer. We think that requirement is very rare, so data.table is setup to be optimized for the most common cases; i.e., no NAs in key columns. Also, binary search is faster without a check on NA_REAL (it seems we cannot rely on NA_REAL being REAL_MIN, unlike NA_INTEGER being MIN_INT).");
Modified: pkg/src/reorder.c
===================================================================
--- pkg/src/reorder.c 2011-11-06 11:09:00 UTC (rev 397)
+++ pkg/src/reorder.c 2011-11-07 01:29:32 UTC (rev 398)
@@ -9,9 +9,9 @@
#endif
// See dogroups.c for these shared variables.
-int sizes[100];
-int sizesSet;
-void setSizes();
+extern int sizes[];
+extern int sizesSet;
+extern void setSizes();
#define SIZEOF(x) sizes[TYPEOF(x)]
//
@@ -19,23 +19,26 @@
{
// For internal use only by fastorder().
char *tmp, *tmpp;
- int i, j, nrow, size;
+ R_len_t i, j, nrow, size;
if (!sizesSet) setSizes();
nrow = length(VECTOR_ELT(dt,0));
if (length(order) != nrow) error("logical error nrow(dt)!=length(order)");
- tmp=calloc(nrow,sizeof(double)); // sizeof largest type. 8 on all platforms?
+ if (sizeof(double)!=8) error("sizeof(double) isn't 8"); // 8 on both 32bit and 64bit.
+ tmp=(char *)Calloc(nrow*8,char); // Enough working space for the largest type. setSizes() has a check too.
if (!tmp) error("unable to allocate temporary working memory for reordering data.table");
for (i=0;i<length(dt);i++) {
+ if (length(VECTOR_ELT(dt,i))!=nrow) error("reorder received irregular lengthed list");
size=SIZEOF(VECTOR_ELT(dt,i));
if (!size) error("don't know how to reorder type %d of column %d. Please send this message to maintainer('data.table')",TYPEOF(VECTOR_ELT(dt,i)),i+1);
tmpp=tmp;
for (j=0;j<nrow;j++) {
- memcpy(tmpp, (char *)DATAPTR(VECTOR_ELT(dt,i)) + (INTEGER(order)[j]-1)*size, size);
+ memcpy((char *)tmpp, (char *)DATAPTR(VECTOR_ELT(dt,i)) + (INTEGER(order)[j]-1)*size, size);
tmpp += size;
}
- memcpy((char *)DATAPTR(VECTOR_ELT(dt,i)), tmp, nrow*size);
+ memcpy((char *)DATAPTR(VECTOR_ELT(dt,i)), (char *)tmp, nrow*size);
}
- free(tmp);
+ Free(tmp);
return(R_NilValue);
-}
+}
+
Modified: www/datatable-faq.pdf
===================================================================
--- www/datatable-faq.pdf 2011-11-06 11:09:00 UTC (rev 397)
+++ www/datatable-faq.pdf 2011-11-07 01:29:32 UTC (rev 398)
@@ -382,40 +382,32 @@
<< /S /GoTo /D [254 0 R /Fit ] >>
endobj
287 0 obj <<
-/Length 3593
+/Length 3594
/Filter /FlateDecode
>>
stream
xÚí[[sÛÆ~ϯÐôÅ`ÇÚ`Å¢NÆNTmNSuOX¤(Ö"¨!ÈÈʯï9{Î^@.IY©cg&Aìý\¾s[gó³òìËOÊ//?ùôª9P²Ög×g²®
mβ¥®Ï.§gß_Ld©eLd1LΫ²,º×sU+x³
¿
-¾
xM¾¿ü˧_h5YÂÌm»I§Ð¯ÛtÂT²¸Ç[²¥¨ëÇÝá8ø»Âí¼ÔUÑÍÝH·ü{^}4Icäê¢$ìJ´u°Ë¹l¤°usv®,ìTQ׿uîpád²¸¥`í?Âãj¢â>ìF¶Bih¥_ZÐÞûws]UÅ×0Ü?à8ï¿!QM1[ãu¡ó'4ð'%-c´¨lvOëü§¬±ËÚÝ#/.ÍSGÛX¸Í#\ãÒ Ñ¼jìp?LêÚÑ}Á¬Jxæ$³á²A@ØÊ3y¶FÃo¾üäì;7â÷Ï[çÉ P:$vÙ³V´FÇ,SªJWÀXüº¼áýhäÆ3ú>`Óór±êá?·VÅKl;Éé=Á` H½T(õ
-I½ë
-Cj&Imw=²xë6î`î Ùø-9tÓt¼{\§´nØÒ5<â×Õ{´nó8k·v§iÍ*²÷LÅÓ¶,.øÔKǼ©E«õXj"§A ã+¶.ëÕéêûàV¦tYÌ©aså0§,©ï©×0tÙ#U×DDèÄÙÎáëWd:ÃãÔ{'6cáKëìµ`ÞϼncWAR` ª´q P)Ѳ9r}Nb^ñzÜ"ÒMph«ID¦R at yÉSÉÉyÊòr6çíô9ÎW¶BB¼À%vGGѲºi=¢©{i.9ªeÀðNa;²TUño§¼Nh˦³3Ø
»@L¼¿ï(Ë¢¿ï÷·ÒÂh?Æ ÔȺϬQBÃ^¹½?_-TöÏv9^ZQÉrÊÑüxDÇ÷|ïíSÎN¤o÷¥ø^µ¢ P' Þ ülæpÕqã7yá #,mõTé8¾àÞbZÆTeG¥úÈ$Çöê$ÛT»³Ïö*Ëöº®þb»UØ~vR4ÍA0p[éðÃDGéÊ?vý¨àÅ3xR¯[^òÍ
-o@_nyîeNdÝ
-#Ç.ª·¼Î¶ÆçuFJ¨2HÐ:7Üg´
',rXzÌÞ-³Ç
-iÓ-®Àwû[QZuØo¾]ÝBKú}ËÔ²Þ_À÷gKjÜÞ¯/½]dɧÀß6òù¼cÓy¿ï4ùv¾©ÛzG=¨| ªl2Ê§ßæ¾åÏþü1¯xèÕÑl:qc¸Ç¬ÖoXÁ´
-óÛ6¬áÓèÝD7®¢tÚV·¬nyu%
-ì~{ܸ?ÏÌ Á}ûÃþpþNP®w[Îl£
h¢ñÝ~<¾=90eóÐ4!Z@$»ïÁÕ,LÈ,ÕÝà½yï¼£ç@Â"8˳UÀ6&PoÉBuÅø÷6äoóöµ.
ÆÚ¢± 9@Ì! (õ!Ïí#/àºiY¼8g
-#u&LÖ@¼VÅ)@fFV\ÐùϾp¨H k
jí ½
-H°zÃ|ÑøfFÏl×SÂ8<`·ÍøðnÑ'¾FAû® `9,û*èËæeüôÿ;ï+y\jrhmXÁþîæ¹MñS_ø|AS[xß#ö^2ðEZZ£oï¼×´vÕÔ
-¥bp«Eü¦m¢ìá,{øÈ»ºs^ÂÜÙÞeç#é«îùñÀݰ} ¿DAÜ+õ¾dÞP²*×å¾ç\ê`½ÿÉ(¾8ùlX>]Ìå©XÅ4½pÛobNyGs)Ï}¤¹#,yóJ} çì©]r\Ч¸Pfèo|øësÌñ*
-Mô<P
-Ïg²8w¦c&Ã=£ç{$|·ÉºMVhÜ©QË0 K
-.ÜQZpåÐ
-OR7d¼ÕÐôþªfOSè÷("0Ô{'\]ûÇ:-xÿvìÜ<5ù·Ia âýÔŦ4;uQ|
-ÌÄS$v×)]ÎÙÇà®Ûx£üy°ó>J¿vÑtÏîYݺ+øÆAþ|S6m?@Æá¤~·@8c3ZÒyº$ɼN¸ô8²¼ÛÞ² Ù $öÑ"ÕÙ¨Æ)`ÞÆAþüÒ6Yz46=þ¶~ïÈy÷C!QÐ@ÄD8ëàË 2¦}MËe&¬(ëàß3&x:q}*_Îe¥
-H¯Ýö)ÝZH×¢´r
-|,ô|²ÖêêýÚ£§iª!Uc·$v?%àIó-\¯òÁÒB¶ÇÒvª`Oc¬£x%&ÜÛk.yå2K0m¯òa~HÜmbÐĪþO^å éÐ'ZTÕ¥çH¶k/ʳ8'm³8vu} X6ÙţGé纤zÇñ@[
-YfA%Ðmö<ÂÎ.êÈÊ#gl©w
- ³C¼4¥huý.ÒÔ¾£þ/C¹Í³¨ûßr¦àÕAg3FUýD êGªF4e®#+âû´?¢ð"©Ø"ÁnÈþàõmäT
çÀ[vÆ ×À¿ß2NwÌ/Ǭ(X+ÝfLõqGv9ýNÓi+Ëjâä%EeÏXw¥.ú§`{²É5h»çÎ}Y8^¸>ôÆÁó½ñÉ*è¼T!ÆMlQ.Ç¡7]/É¥´MkÿÍ¡5ÞÝàökªæ¸ùÍÀ]65®BίIHÖÐûµ·sðìÒ«íÝ1ßÅVs3;|À?%d5®ã+ªã9ëý%î
-øçÉú ZÀîíѾù |ðc"õÂ-0.¯b8â¢ø)5Þ¯½»\ë î®}GdZ[Ü®¨W¦+ÑFóáPB³Ù[W¼òù¯!Üò ÛmÀõz5Z®¶Ï\ê£(ØÑÐ%Ûç³áØµÞÆ¶-Cve9¶ìXÎLP]U[¶õ7CCƬ55±xAftÑ¡ ç¾Ó%éßèid«*{ ÓJ}D}3'QѺ¢Ë7êØM
ãÍ($'çn*ÑØQÝÃËÔæxµM£¦Viq¡ãYoóEeÀ¯;r³¥1¿Ô,çiæ#Xc¿¿±àSkÈàÏ÷9 at 2ð(¨ìÕ©QZÑF`~lýyÔæí"IçÃ-´u._èJ?g 2
-cNýþÈ*ä`6ÄwÒ6f뤨YiÊMói:d&A·I î´&Ø\ÞQëz¥¾ Jy³ «ä
-qRg7puióÚïr@\ßMõm§cÀYa6Mþ¹Û¤´Ëp÷`5&xN¦uã²èý
-å¦,Æ7!N UÄÓ¨hÖ>þ*æc&¤w#zÁ°OMç²ÑG
.?L!»)ÙÊ¥UMÜW5ýÕrì¥Zµ!®I®X$I=7óÝb|Á%W|ëe¹Aì^ßroAéϽ[U±dp m;¿iX¢Ìáxù¡ñ¸yRÕI®ùë}õU&¼®ñë£ÔþØ#óÚµ¿Z*æüÓÛåôÄq;lª´.ãGpº´Â´906/ÊÃii¥°ñ¶¥'üQ[¼ò·ûüj\?õy\®
-¾_®ä/¼H|²4¢49÷ÉW_ú8Ä$g À·îgÔJ+{{£Qi¢×Cv8+¿Ù¸RÔm½ç5ã
-Þyyû¤¿Þ¿ÚÔ2ú%{3x7â»lbÝ;ÏÂí»Ê?vb¡Û¢Â¶Íþã¨ïBSÿzâïù-M¨Øí¼9?R¥D¡ºZÝí$Y±¿:}iø:rÖѦæLaüÈx5{ÔL#É`¯)Þ±]D»«ËöYÐ*a[ù9ºõ
-=Ü Ñ¸}z§ÒóL¬JûEãFïAOäL)
ÞEªQé¹÷$ÂÏî6ÜзùzµeB° Úä 6snýu$ÅDrß²
-©©ÃΧõsú Õÿ Àõ]D%Q9Jü-K.¤ÆFmkú½£|
-¸¦ÙKTMóëe¹w*Û§1¾bW·úäv\zõmôÒäÇã:
³þ²Oª¯Ì?^s¸0< ¾vÇsp²½¨`ÊWàw»¢vëÓ!ÌZ'UÑ1]-üo~éöÈ£s%üÚÊ+á¬Áh£4þ(mTN*vKüÝûè.ú«ÇÜEßYÿ¡I/¸[äÄ#Z~öýÓå'ÿ/
+¾
xM¾¿ü˧_h5YÂÌm»I§Ð¯ÛtÂT²¸Ç[²¥¨ëÇÝá8ø»Âí¼ÔUÑÍÝH·ü{^}4Icäê¢$ìJ´u°Ë¹l¤°usv®,ìTQ׿uîpád²¸¥`í?Âãj¢â>ìF¶Bih¥_ZÐÞûws]UÅ×0Ü?à8ï¿!QM1[ãuÑ<§OÍ%üIIË-j¥ÝÓ:ÿ)kìòvwëÈKóTëÑ6nóH+׸tD
åh4ï;Üàºvt_0«¹!Él¸l¶òLQâðá/?9ûθá=àâ3ÇÖy2$Î%]ö¬QÆ1ËT¢ªÒ0Ö0¯.ox?ÚÂ0©ñÌþØtż\¬zøÄUñ[æNrzO0 R/J}CRïzÃÐIÒdä]lÞº¦;{DB6~KÝ4ïWë)¶t
+øuµÄÛ<ÎÚÝib³§ì=SñôD«->õÒ1ï¤FjÑj=ÈiȸÁJ
Ëâzµfºú>¸)@sjØb9Ì)Kê»dê5aöHÕ5º q¶søºçÎð8õâÞÍX8ÇÒä:{-÷3¯ÛØU ¡*m( aJ´ l\W<·t§
CÓæj
©P^òTrrÞ²¼Íy;$}óçP /p ÝÑQ´l
nZhêàFZ£K@ªf0¼aØ,UUüÛ)¯Ç²iàÃl aâv!Ã./áï;'ʲ¨áïû}å´0Úqµa+²î3kT¥Ð°Wî_ïÏW ý³]ׯ¢VÔ`²r´?Ñåñ=ßûd;ÇT¥³éÛ}i ¾Wh Ô ¨÷! ¿a 9`õeÜøM^8ÀK[=U:/¸·¢1ÕAÙe©>2ɱ½:Év%°àî쳽ʲ½.¦«ÿØnÕ!¶â@ݦMsÜV:ü0ÑQºrÀ]?ªxñ§Ôë|3aÃ'çW«[{%Y·Âȱê-¯³ñyÇc¡ª'´E¤Î÷mfá 3§wdËì±FÚtk&ðÝþVGöod·ÐÄ~ß2µ¬·ÁðýÙ·÷kàKboYò)ð·<F>ïØtÞï;M¾oêög
ÞQÏ'**òé÷¹oùó?Ì+zu4NÜX"îq'«õV0A$bCçü¶
+kø4ºb7Ñ«è¶Õ-«[Gd] e»ß7îÏ33(@pßþ°?ܿԥëÝ3Ûh!h|·ïbOLÙ<ô&MÉî{p52KµE7ø@oÞ{%%ïèâ9°Îò,Gp Ô[²P]1à þý
+ùÛ¼}K¡¢qÆ
¶(d,@sH
+ce}HÀsûȸnC%/àÁH5PF¦ ¯UñgÊ
Yôf>ã³/*RÂÀZ¡Z;Æho¬Þ0$ßE4¾Ñ3Ûµ%Ç0Ø-C3>¼[ô ¢/âQо«b% XeËÁ¾á
+ú²9f?ýÿåû
+f×`ZV°¿;y®eS¼æÔ>_ÐÇÔåÅ÷£½|¥ÖÁèÛ;ï5]õug&ácBE©\äjF¿i({8%Ë>ò®î0w¶wÙùHúª»e~<p7lÈ/Q÷J½/7¬Jâu¹ï9W¦ú¥Xï²'Êg/N>Osy*Vñ!Mï$Çö§S`Þá\ʳaiîb&Çü¦RÀ9{jô).úÛþús¼B%=Âó,ÎéÉÂGçpÏèù ßm²n&·§F*FÔ2LÂw\9tÃÔ
+oF5ô½¿ªÙ_ÅáÓúàýÌâ&uÆÞ c×þ±ÎeÞ¿;7O#FþmRx?uq)ÍN]`!31AàÝuJsö1¸ëAë6^Á(¬Ä¼Ò¯]4ݳ{V·î
+¾q?åMÛq8©ç-ÎØ´b.I2ï.=,ï¶·,C¶#(ɤ¡}´G5c6ªqÊ#·qPD¦?¿´MMåc¦ß;2aÞ½ÆÐ`H4Ð'1Î:ø2éãA_År +Ê:øÄ÷ N\ÊsFáGFiÒk·}
+G7§Òµ(£=¬µºz¿öèi¦ªFHÕæØ-ÝOI+xÒ|Ë׫|p¥´í±´*ØÓëá(^÷öK^¹ÌR%LdÛ«|w4±ªÿ×_9 A:ôUué9¢íÚËòÀìÎIÛ,]]H$M$e6 óiçQú¹.©Þq<#ÐBYAP t=0³§:²råÈ[êà!ÀâìP/M)Z]¿4µï¨ÿËP.£Dó,êþ·)xuÆYÆQU?g úªM«åÈøþ¢'í(¼H*¶H°Û!²?x}¹ Ufáá9ð1fÂ5§ðï·ÓóË1%+
+ÖF7S}Ü]Îd?%ÄtÚæÊ²8yIQÙ3Ö]©~Á)ä¬cr
+Úî9s_®Ï½q Gðü@o|²
+ú$/U qgËqèM×Kré"mÓÅshw7¸ýª9nþ`3páÍ@«óÀkÒÆ¤5ô~íí<»4Çj{·gÌw±ÕàÌNðO Yëøêø_Îz£»¥þÀy²~°{{´o~B_¥üa½¢pLËB⫸(~J÷kï®%×:¨»kßÖ·+êéJ´Ñ¼eøßÐlöÖ¯|þk·<Àvp½^M«í3úâ(
+v4tÉöùl8öÆE·±mËFYN ¢-a';3S$ÔcWÕVm}çÍÐ1k
+Ä@M,^ÝFçábt(๯ÁtIú7zÙªÊè´RQ¦%gßÌIT´®è2â:vSá¸c3
+ Éß$àɹJ4vT÷ð2µ9^dífeÓ袩UZ\èxÖÛ|AðëÜliÌ/5Ëyù"VçØïo,øÔ2xë³æ}<
+*{u*FV´[#A¿Eµyû
HÒùpmçFË:ÒÏÙ'ÂS«?²
+ù#
+ñ´MÙ:)jVrÓã|ÉEÐm»$¦ 6wTëĺ^`©/R'æ,èª"¹BÔÙ
+\]Ú¼ö»£×ÇwS}ÛàiëpVX¦Mî6)í2Üà=X iÝø¦,zC¹)ñMÈߣSBÕ$1ã4*¤¦u¤¡¤¿ù éÝ^0¬çCSâÀ¹
lôQ¡£Ë%SÈnJ¶riU7ÃUMu¦ûA©Vmk+IRÏÍ|·_`p åßzYîd»×·Ü[P:ásïVU,!`ÂGÛÎo¡è"s8^~h<nTuR£kcAþú__}ɯküäºÅ(µ¿cëöȼvíï¡Ö¢9ÿôvAy =qÜê#KæÀø.0mÍÇË¡òpÚFZ)l¼mé Ôïdüí>¿×Of}b«Ä@ïצ+ù/f¢,(MÎ}òUâ>1 à°ãûµåÊÞÞÂhTèõÐ
Îäï@6®u[ï9G&¦f͸C¦·F^Þð.Cé¯÷¯¶µ~ÉáÞÞxà.X÷Îų¥°eû®r«ãXAè¶§¨°m³?Ã8*Çû¢ÐÔ¿Þ£8á{¾£aK*6E;oÎT)Q¨®Vw;IVìïN_¾Îu+d´i§â9!ç`#?2Þæ@Í5Óc2ækÊw¬@Cëî*Dz}´JØVþd¤n½B7h4nÞ©¡4åü&S#«Ò$æ~ѸÑå{bÐ9SJ¡wkjTzî=¦p at eÁ3¦»
+7ôm¾^m¢,¨6¹aÍÛÁGF1Ü·ìECjêðóiý¾hõ?(p=G%cIT£Òå˦©ñ£QÛ~ïè ®iöUÓüzYîJæöéA¯ãÕ>¹^}ý¢4ù1ã¸Nál¿,çêã+óÏ£×.#H¯Ýñ¢¬f/*òCÅ øÝÝútÈ s%e£ÖæIetLWÿ_º½Æ2Äè\ ¿6¢²ÇJø#k°Ã(?J
$SfÝ÷>ºþê1wÑ÷DÖ?chÒænç¹ñàçÀ¦}ÿtùÉÿ jN#
endstream
endobj
254 0 obj <<
@@ -1879,27 +1871,29 @@
/ProcSet [ /PDF /Text ]
>> endobj
445 0 obj <<
-/Length 2102
+/Length 2103
/Filter /FlateDecode
>>
stream
-xÚÝYYÛ6~ϯ0ÚÈ@¬H$uh4méµ] (>ȶÖVÖ\ÉÞMþ}ç"EÙÞÍnö¡\ñ3ßôFÕ$¼~É÷Ë'Ï_¥jREªÒÉåÕ$ã06ñ$3içùär9yÓY¢t0þyùÃd¦Ò0ÔdE0ÅÛiÄÐAû©cûÁM§¹+þ¤#r»kû¹ÜÉýÜAÉûò篲ÔSnÎÂ4Ѽù+¦\ÀÞ
-´Z/í]DðI¹Ëê(ÏyC³h[h´Z
-m1,·Ðö<ÄL½r»HÀjl¹ÙgÂéüÙ1¬?ôÊßõ%4ßsh_@ûZí
-¬Ó4³¿á¡×¤)e]y:Ü{â9ÒþZV×Âë0hêVtrO«¹ÕM9 {êú¡ýï nMÎÖ2YX«¿áÏVö]iûÞb¿ìõ/þnnÿôÇ·³èÞI¬RH¤82ètf¯ sSÀÙtæÓ3b%¡Òv½+ì<,hîµNÃĨû8ÇQhKp·¶Z9ÕFæMòÎó<5õ,6s~[<ÞqÉ82ÙJ¾Í=ʳg²ÊF¾¹°K¨=ØûIDËOZÄ]{Tx@#ai¤oYrDô¸â³TÂÆÞz8
-V¨keWÓ*qµn«$x8iªN½<%Á_ÊæÓô¸dr_É{¦&VÜß±h?)GU5ÈCw´ò(Jí²Q$ÜP´®·£#+J9"ÆLG²@r>º¶³nVL¯k ï'¿¼Áã:^s3ÕìF_óò£Ø:ù
-'KÒHÐwÑvâÕbOV%Ylá¶3 ËÁU=JÜL4(ksæ©Ü0Úy_Ì^MsÐ «aw|æÚFUÝÀËG¨«êÆÍ>aS¼á.(]²YIZÁ½Ä`ÉU
-³°qêI°_kWbÚªaLÛkQAßn+î ·'´¶+ %RÃ
-Qª£ù¶jpírB³0Ö©Q%ýÀñ]ûLêÂØ¿dLÀP|©Äd¶9ëiÚeÁÜio*è-þ5÷·ÙBy£3|ihè úS+
-Z]å[Q dX-î¬G9CÒ%ª¼Sqt¼ÇÛ½Ø^ðØääÕ-ö»T¼&" îl8×^1¡õ_ìóf%ûKÇ+n)
-î½\Û0Qm»YðR¶ 6qêÐâÎ/ä&
-3§öëÝÌeö§FÉÃ|@^ÿGR|ÀCÈû0§§¤Q$ÅCé÷bç=è`ÞßkcxTPÅ áGÅÅãÌÁn£óy¦¯zlÄ@PF¸¶Xã)V<{»f:0ÌgjQtIrA¾.Þð=´~ÅÚÅH2F50S ª;JbuUyuoÐdæ^Ãd3ÜöEwUÍo at 5³è¡?e
-q*JTÈ«~½Z\²é¤-ã9Þë£X4ÄÍ×O&o)^pÄx5
®:øg4å±ÐÀ÷lT\ÆV=ÞäÍÝr
-ÝØ¢¶¥¸Å4|ã^#Áqìü«a«Kîÿ^7˸íìÿÀôJ©Å¯L+µ9Îh5»fJ<;©9^Âün¢Ô¦PsÆÜËAÀsgiªè¥´& ÉK7KVÄîË,nFKËÇ/¼NÓ«Q{¨ÊT
-
OU ÕÀøæ¸#Bp5#6 ÚìEt¥}«`(@~ÊÏ!ã0ÄU"Uq͵¦§ºV6R5¢~_èòRƾ°\¶BÈ/æw&
"«ÀÑ yÅuÔøP*èAÄ׬ÄÖO°ä²ð¤ÈÅH øµõ:¿$ú»ê^81bîH2T3{¯(¯+Áçî4{Àk~m£21PËͼ¦ÊìÊ\¥xØçä3¸\nï¸Ì6F»Üã#÷jÃйs©ÀéW©MWóÓ EvàärÈ
@'9©°å.1h÷""L\ç$CuýáÎÜ&Ûæ`
-^Rïê¹Ò=äGöáI\°ª¬N#áa~= ÒADÉýtjï7®³É:(O1Ã7]¸±³4þæpªÂV1ü"¥~\Ì ¹¼ÈuF'·4E Á2£Ò Ǫg\:øþ >< ?ݨ\pkvE7&óGôNW»K^"5oGî«Mî¿P¼JY^Í IÅÞHãÖÝË»zÝHAQ~Tø>·h·ôlSQ}Mmë y £à)Ö¹zûFÛñS9
-îE ÿ³ñð,
Å [XaÃ
-ï¿;Â3`ºZs at EÎáÜÆÖäÞ;©(,jã>áßT°Jô÷{xÛ±Oï+®ÄiÞ4,ͬª£²¥°0XVv?ùÜ&Þ%¯"ÝaË<[ʽ<0|w¬\v÷«ñs`*Lá
;SÅðª8}wùäop#Á
+xÚÝYYÛ6~ϯ0ÚÊ@¬H$uh6méµY (>ȶÖV×\ÉÞMþ}ç"EùØn
+´}Ð"ÃáÌ77¬&ÑäåHÞß\?yö"U",RN®o&q±'IÃ<Ï'×ËÉÛ Î¥ùô÷ë&3q¤&3 ,)ÞNã ç)<¿3ul_¸)òt WcrůtDîq×crm_ÈÍÜØ×òdLØ?{¥ps¦æÍ_2åönà)áéåy%¼R²:àSÞÐÀì-<<<5<a¹
gϸÒÐ'S¯Ü.pdA+ [Fnöp:vë½ò·@}
+oË9<Ãó<<¯ø`¦½ø½Ü½%MÑ´(ëÆÓáÞÏ)öײº^AS÷ {ZÍÎhÊÙS×õìukr¶ÉâÄZý¿¶²ïVLÛðûd¯ô¹ýSÐÞB΢{;(&±J!âÈ ;ÐE>
+¾&ÌMgÓ+ ¶ë\açYdAs§¬u&F=Ä9BXËÚrhåTIsþ)6}LÈ;ÏóÔÔ³ØDðQóÛâã6
+e¹·ØÈÅ>ʳg0cY&B ÛLÞæñÞO"ÆJ¼>w¼âËÑä|xðEL
ÊÈé©<ÑãCÈs!
ó%kÉ çÚUÙÏ´
+ãBü,^±J¦êÖH"Yüبlr¨.MK&(çðt°gj`Åã;ÆØrYU<tA+Ò¡>)_E2Á@Ëqèw;:²¢|#bì Åt$$ç#k.ëfÅÔîºÀ~"ñó+øøú§á¸Ä_£ËÜM5ûÐW|
ü(på¡Îc¾Â5&É4¡ô^´8`µØÕfI[¸mHÖ²|YeAÙóGwÓ$
+ÊÚùf*7̶aÞW³ÓÜtÂjX㦹¶§dU7pãòÑꪺs³åOØo¸ÊElVSp/G0XreDÃ,¬ g<ºD%ì×ÚÕ¶jãÓögTзÛGÈí
+hE£¥åpCªÅP¾`»\@hÆ:õ0ª£ß8¸kIB]Þ ø/É6g="MÂB»Ô± ¸;íñ"óMާ¨¿fð¾í(÷ç1:Ã6CÃxÕZQÐâ èì*ß ÃjqM°u0&,rKTy§âèx·G±½à×``kV÷8¶îRñ ¸g°á\{ÃÖqLtÎ[rì/¯,¸§¸÷mÃDµfÁsÙ&ØÄ©C?#8g¼4 rNÚ/v30cÙ[^%ó!xýIñ!îGÂFa=¤ßö 5zÿ ¡£0¡Â·2¸*Î[
+æQ¾êùc#zêXH4´ÅL±âÙû5ÓaÖ<Sú`HªC:ðvñ?ÑCëwQ¬]$cT9¢°£$VWW4ùvÑ Mf4L9Ã]´/º«rl^ÕÌVþ)Ä©ÊP!¯ÞûÅjMJXr½¦
+¶dçx¯bÑhO:4+®^>¼¥ zÅãÅ"
+¸.èàWÑÇ8û ¾g£*àüã4¶êQl¥ð&
+Ë)vgkÚÖár$îèókE Þ?åØù#W'ÂV<~S7˸ïìÃôJ©Å¯L+
9Îh5»rfJ<©9^Âün¢Ô¦PsÆÜËAÀsgiª¨MZ¤ÍÇÍqøü
+Ñ¡ãÒÁòñË"ïdдç
+Ôª2Ba#âSÕ HA5 0~9î\Í
+v#{Q]iÈÃïòïòsæaÈ8qHU\së¡é³]+)ÉLQoÖå º
´É8ËöQù
Ó<ðî1Ò¤PdU8ú@G^q5~ÊA#ê¸àúØú \¶¹ ¿¶^R'âó§DWÝ'FÌÅ$C5³÷R°ðº|îNC ¸´òkAZ&¶å-UfçPæ*uÀî¤8?$ÐÁår{Çe¶1Úåi½Wö¼ÎuLõ N¿J%lº
+[ÙË!3~ä¤ÂÄ Ý0qCÕ
+;'rgl5pzNU¼«çJ×È-ìÃI\°ª¬N#áa~: ÒADÉýtjï7®³É:(O1Ã7]¸±³4þàpªÂV1ü¥~Y̪µ`¹¼ÈuF'·4E Á2£Ò ?Uϸ*tðý
+| ø:#nݨ\pkvE÷Mæè÷®v)-¼DjÞÜWÜïPôN¥,/Êf¤bo¤ïÖÝË»zÝHAQ~Tø>·h·Ô6騾¦¶u4àh&øAbu®Þöh;n%Óà^Tú¿`),ÝÂ
+nèÿ.§Átµæ<Ã+¹É½wR1Q:XÔ6ÆýSÀB*Ñ?þh]ãy$nÇ<ýQq%Nó~ a©hfUuÈÂÂ`YÙý(æ3x¼t-W´Ò¶{i0|w¬\v÷q;0¦ÐáÎT1ü*NGDß]?ùR#3
endstream
endobj
444 0 obj <<
@@ -3035,114 +3029,131 @@
/FontFile 505 0 R
>> endobj
507 0 obj <<
-/Length1 1838
-/Length2 11345
+/Length1 1856
+/Length2 11465
/Length3 0
-/Length 12497
+/Length 12622
/Filter /FlateDecode
>>
stream
-xÚôPÚÒ
-ãw0¸»»»k 0È`KpîAKp×\!H ¸[p #÷s¿ÿ¯z¯¦jfV÷jY{wo:*M6)+'¼ÊÆÅÎ)QÓæâprò°srr£ÒÑé¡ ¿Í¨tú W7°Dø_WúbB_xjN²»ÀÅ/Ì% ÌÉ àæäúÑÉU ô [ÔØÊN*³·+ØÆúRæ?L .!!Ö?ÃR W°%PBmA/- 'K0êý?)Em¡PgaOOOv £»«8+ÀµhÜ@® +Àê@GÐ_ÊØQé º¶`·¿ì:NÖPO +ðbp [ n/î++à¥8 at GI áüEVýÀ
-øûl \ì\ÿM÷wôÀ?NÎ@7b°; òªìP/(+ ±útpszz Á@ÂòRZ àÀ¿å¹Yº¡nìn`?$rüæåå V2N Ô
-õþdÁ® Ëc÷æøëfí!Nß¿5beý+wg=ØÅ¤$û7åÅúÍðqrr
-ñ@. ¥-Çéu½A:¹þ0¿(ð÷uvrX¿ ùA/?¨¾n@ êêò÷ý·ã*À
-l XlÀÔ²¿AÖáËw{9_fÀùÇç¿ÿL^ÆËÊ âàýýÏûåW~#£Íòâÿú¤¥¼ ¾l<¼ 6n>. @àÿ¿Yþ«ÿ?Úÿ´jÁ÷ÆùOB%µ@è/ /g÷OãßÃøß
-êN/£0þ3ùo9ù8-_¾¸þ?Ïÿ!ÿÿÆþ,ÿoÿwwpøÓÍø§ÿÿÇ
-t;xÿMxdwèËV¨9½ìäÿRßþÚd5ØÝñÿz ÀíØ8ü÷Ánò`/&jiû×ýç^Ò;! M'7ðo
-óÿø^öÍÒþå=q{¹«?] uúßrK'«?ö tuz£r¾7ÀëeA@^N6â} ¼ÈóX;¹¢þq£ü| ©?L!A ì CíôâSÿ/äphÿ ½0ÿ ¦Åß²trxø/ïGÇ"þPÎaõ/Èà ýò 8lþ_âmÿ_$ÿ_ê9ü
-8ÿ\/
ÿ/
þiì
ûò|ÿËý¢Òù÷K¬óË
-q YCÿ±rýmýkÒÿ}éÒõ_ð¥K·A~ Ç?äÛåz:ýËý"Âã_ð¥1Ï ÷KIïxáú\ÿþá°tw}éúçú¾LÎð/4ä²Du² µ«ý|[+EæÉ¶ýMlnûMï¼k§û=&r*SMvðªëµTêH/öÒ¦ãäå£ïA[#rD{²VÇo¿³DíÉíÔß '¤(PÈÙt%wü]üôìáÛ`»éò\Ü15ðn=û¼ÊÇÂg·µvjøUÐʧØbõbÞÎÐå[äü ¦F²Q¼bÆ=õ¹ºÆÍx¦TNdAõ?å)ö5Zã»ûá³\©ËíÖMBKbDL
;6Iï+½¦L4ç[V¼ê:þ°s|Ý1
ËaÑg[]ûÖuÿÜnB_é}Ìj»bc)UoÎéòªÒ¹@
«FøYÃA OMh»ç>·Ág Þ9BÛ µÒÇAÛ@Y¸m3ôK´òvÈryt¿©UÓ\¢3pÃ&»Þ3hYjdÉkXiæLÙg*ÒcÙÿôÒ2Ëi°kgÜÍÊÄ6®©)Xl¯¶=5W
ì=aC
ûµP"i,Mjvf^O&ÚIýöSVÍ^Ç'êmäÀ¯Mür½òg©ª<Ál"Eäø¸»¸õqwB
ïë²+¸ëÊqOáoªz/Æ¿\²q²ÛèHc¡«;¤à}ÔHP=Îã#3jìÃ.UigFô;G
-}öí,DÏʱ®|üíòH¼ÓÓ4Ýë ^kàÁ oÿèÝ~XÔg0 ú·Ñæ´a³ Pü¹îçóîk® ýZXÿø!áîrà
§mÿï»w¢H?¸=ÆrÓîà ÂløàÓO`PïBÈÉmc&.fDyt&1¬º*àû`fT_»0¿¿ê¢#ÛõdàÊsº0Uõ(lùÍ®Ðߨùìetr\Dè3õ=Gç}²Ú%%Sø¢èHḴǣæ´m (Ù¶ÛrQGÿ°ü{mßæ¡ÅÝ")üö99)ÿô7F®£fÃýf<=7¿¯¹³õ¬-VÑÍÄ6r,áÑæBbâm:råæÙë: ý̲)"¯©,б%3¸dT½çÖ~ºÀR¯V=a/\¿QÿSúSi£V?ÿúO%¤ à6l6Ü$5¥gáÙhkæË¯ «eéý4ü)¡$R wóTIý¤éVK¹9Rüa&û>8%$æ2¢W
-ºpOáÎÒÄ¡¿öîÍжP@Í÷}è¾Þ=U¹ C«Äo fkÊÕ[¿×r
-=]è8û¬ =ÐÑBô@¡ÆµxßʦòÇ©\¦ß2*"ûQ:*ñ3)ô¢úĽObù®SN[µsõnZÏñè8?·á%3¤±e}ªÄK*=Ky1Ò®S-ÙPjÃ+êÀWh÷èÃéJP9ĪÍWNrÛàiì-²ãéö$ß7{N$¿ch/yµ¦o/`ºaõñÓ²H¥%ªzw
-óÆ|¬ywIÑÚ¼_VÒLßëH½¢gËñêÕ=Ì2wëÉüS¶üÆ(Üó«Mßs^Syè]fn8|Öô£cÒjÅt<m«È¡ÀÅ£ÿDÝ$¼TësË5£(«Oúè÷nÔÏW;¸ ¿¿ñãhºtz¼Ò
-)rQDàpw:éc?ê¡ý9CRMòà/cùgv1ØcÀ8¥ùÇ)[çÊ©M¯Tqÿðz÷c8
-³<8²ÂéÁ¦ÍñMùÓ¹ Ìôm¼gÎ?]7¼bÖù@ð¯óâMm±²ì%ÏtÌÆâ¶)eLMÆüÙ\$Û'WAÏ+(uO%Èy-~ÑjÑ®ÉøB«[Eí;kDRË9[xÓµ;ø¾TM"Ínë5̱Êû3/
ÄÂãUF)·£0CÔuпSÑW!â%oоóûqãH'®Û9a_»þjßÕ=¬ÖPR
-Ýâþí9) Å¥§
-EàÈg4«b¤Ö%Q'qÒ6îGôd½õ+÷nþÙ÷t¤ºWÚ1C¤vS0¹N³\jåÕ§xÓda§&1óÉÝéÜé¸mÞÖ¸Æ
-eTÌPiô÷côÀµ(Rïl8 ´RH.DWDÒ{øñ#Ï(ÌoIBc]ÂcÄ×Gâªèj_\z¤îøs5
-Á:THÕ¨,TÂRòã¼JK3IîÁfɼ_«sH¼4ã'¸`H#9øÎ³dnϬÞÌXýÉäc?öO6ãF¹ªC)e*7aD³TÁ¯¥Â1tD£§òa9·FõÉÇFËïågììwâè½ÓçÙâZ]ômdiC^ÕÛcm>Ì®Èp{²Zk7ló©!ü.QNÈÌÎ,ì×6vFy®¯m¡dñß$x¹¡ógóÞôdò¨<E¯](O0j;äÙÕ¦1}?dJqBî-ª%<úñÕ¿±(§nÖà
-ðÓçÑfýNEóÆýEãu3Q!
-¹´«e×ÝJE¹ Þ£¯ÀÜÉõ©ÈQpê¡6%ªºÔÆ.Âóð3¢2Àúâ)³®:i;>gÇòòqXT«?2~¸WYìåÙîÄ9;߯ªÐ°PúÙðYÜ´WÈ#w:ÁAÉÚ:]-l¥Ns\¢:M¶ÔöÊë£
-{°¢êÔFMÉzÙÄ|Ôµ%´G¤S= k
gÿ³4ɶö^ÿl(¼ÜÆëoËJ\QTtíW¬R*fÕhAægX+&YÀq(h ÏB
-}W×øE¼@ãAÕÐýøJ±
J¹©Åè·Á*JgIÏÜä{sà§;t¾£( ¶ødYÕF>3×yÅíý*àÒ×®»¥ÁØ{6ã5tÉï½ V¿ºÒº½òf¤-2FÛ'òC
?Þ:ÅZGH©ÝkZƳA#ök I&4MÅQ6ô#Ó ²ô*¬½4>+¼If
-9¾:=]Û{e.¡23&Ø»1Zg¬ÌÁ
-l1ÆVµ84ë¿OÒpÎZÊ·ÿÈÛàÌ믬ä«4b`ØOäRÎDcB'ÁK
HÈ9ÇÅ]p
[TRUNCATED]
To get the complete diff run:
svnlook diff /svnroot/datatable -r 398
More information about the datatable-commits
mailing list