ess/0000775000175000017500000000000012632537307007734 5ustar eddeddess/VERSION0000664000175000017500000000001012632537307010773 0ustar eddedd15.09-2 ess/etc/0000775000175000017500000000000012632537307010507 5ustar eddeddess/etc/in-string-bug-ex.Rnw0000664000175000017500000000105612423756516014303 0ustar eddedd% From: Richard Morrisroe % To: % Subject: Re: [ESS] noweb file and assignment key % Date: Tue, 30 Oct 2012 20:57:32 +0000 \documentclass{article} \begin{document} <>= i.can.haz.assginment <- TRUE @ Now, we will introduce an extraneous apostrophe, for no reason ' <>= aa <- _2 #ess-smart-underscore-no-longer-works @ ' <>= nowitdoes <- cat("Note the apostrophe above which closes the earlier one\n") @ \end{document} ess/etc/C-cC-c-probl.R0000664000175000017500000001134112423756516012676 0ustar eddeddfoobar <- function(...) {} rm(list=ls()) ##--------> consequence of the above experiments: ## the 2nd form is numerically "uniformly better" than the first ##--------> 2011-05-27: Change Frank's psiInv() to ## psiInv = function(t,theta) ## -log1p(exp(-theta)*expm1((1-t)*theta)/expm1(-theta)) ##--- In the following block, in the first line, C-c C-c did *NOT* behave th <- 48 # now do ls() and see what happened ... the horror !!! d <- 3 cpF <- list("Frank", list(th, 1:d)) cop <- acF <- cpF$copula ### Here, the bug (12.09-2, e.g.) has been that ### the function beginning is not found reliably: ### C-M-q -> should go to end; then C-M-a should go back to beginning (here) mplot4 <- function(x, vList, xvar, cvar, rvar, log = "", verbose=FALSE, show.layout=verbose) { dn <- dimnames(x) ## the variable displayed in one plot (with different colors): v <- setdiff(names(dn), c(xvar, cvar, rvar)) stopifnot(length(v) == 1, 1 <= (nv <- length(dn[[v]])), nv <= length(pcol), length(pspc) == 2, length(spc) == 2, length(axlabspc) == 2, length(labspc) == 2, length(auxcol) == 4) v.col <- colorRampPalette(pcol, space="Lab")(nv) # colors for v ## permute to know the component indices: x <- aperm(x, perm=c(rvar, cvar, v, xvar)) if(is.null(xlab)) # default: the expression from varlist xlab <- vList[[xvar]]$expr z <- as.numeric(vList[[xvar]]$value) # pick out different x values zrange <- range(z) # for forcing the same x axis limits per row ## set up the grid layout nx <- length(dn[[cvar]]) # number of plot columns nx. <- nx+1+(nx-1)+1 # +1: for y axis label; +(nx-1): for gaps; +1: for row labels ny <- length(dn[[rvar]]) # number of plot rows ny. <- ny+1+(ny-1)+1 # +1: for column labels; +(ny-1): for gaps; +1: for x axis label ## plot settings, restored on exit opar <- par(no.readonly=TRUE); on.exit(par(opar)) plot.new() # start (empty) new page with 'graphics' gl <- grid.layout(nx., ny., ## units in npc as for pdf(); no square plotting region otherwise: default.units="npc", widths=c(axlabspc[1], rep(c(pspc[1], spc[1]), nx-1), pspc[1], labspc[1]), heights=c(labspc[2], rep(c(pspc[2], spc[2]), ny-1), pspc[2], axlabspc[2])) if(show.layout) grid.show.layout(gl, vp=viewport(width=1.25, height=1.25)) pushViewport(viewport(layout=gl)) # use this layout in a viewport ## --- plot data --- for(i in 1:nx) { # rows i. <- 2*i # column index in layout (for jumping over gaps) if(verbose) cat(sprintf("plot row %d (%d): [columns:] ", i, i.)) yrange <- range(x[i,,,]) # for forcing the same y axis limits per row for(j in 1:ny) { # columns j. <- 2*j # row index in layout (for jumping over gaps) if(verbose) cat(sprintf("%d (%d) ", j, j.)) pushViewport(viewport(layout.pos.row=i., layout.pos.col=j.)) ## plot grid.rect(gp=gpar(col=NA, fill=auxcol[3])) # background ## start a 'graphics' plot par(plt = gridPLT()) ## Hmm, this is not really useful for debugging: ## rp <- tryCatch(par(plt=gridPLT()), error = function(e)e) ## if(inherits(rp, "error")) { ## cat("\n *** ERROR in mplot() :\n", rp$message,"\n"); return(gl) ## } par(new=TRUE) # always do this before each new 'graphics' plot ## set up coordinate axes: plot(zrange, yrange, log=log, type="n", ann=FALSE, axes=FALSE) ## background grid: grid(col=auxcol[4], lty="solid", lwd=grid.lwd, equilogs=FALSE) ## plot corresponding points/lines for(k in 1:nv) points(z, x[i,j,k,], type="b", col=v.col[k]) ## axes c1 <- auxcol[1] if(i == nx) # x axes axis(1, lwd=ax.lwd, col=NA, col.ticks=c1, col.axis=c1) if(j == 1) { # y axes if(packageVersion("sfsmisc") >= "1.0-21") ## allow for adjusting colors of small ticks eaxis(2, lwd=ax.lwd, col=NA, col.ticks=c1, col.axis=c1, small.args=list(col=NA, col.ticks=c1, col.axis=c1)) else eaxis(2, lwd=ax.lwd, col=NA, col.ticks=c1, col.axis=c1) } upViewport() ## column labels if(i == 1) { pushViewport(viewport(layout.pos.row=1, layout.pos.col=j.)) grid.rect(gp=gpar(col=NA, fill=auxcol[2])) grid.text(parse(text=dn[[cvar]][j]), x=0.5, y=0.5, gp=gpar(cex=tx.cex)) upViewport() } ## row labels if(j == 2) { pushViewport(viewport(layout.pos.row=i., layout.pos.col=nx.)) grid.rect(gp=gpar(col=NA, fill=auxcol[2])) grid.text(parse(text=dn[[rvar]][i]), x=0.5, y=0.5, gp=gpar(cex=tx.cex), rot=-90) upViewport() } }## for(j ..) if(verbose) cat("\n") }## for(i ..) ## legend pushViewport(viewport(layout.pos.row=ny., layout.pos.col=2:(ny.-1))) ll <- 0.01 # line length ## [... ... made example smaller ... ESS-bug still shows ....] upViewport() invisible(gl) } ess/etc/ess-sp3.S0000664000175000017500000000302012423756516012126 0ustar eddedd#### S-mode session functions. #### assign(..., where=0) makes them last only for the current session. #### Well, turns out we have two slightly different versions of the S code. #### This is the one that I think gets used with S-Plus; I'll send along #### the other version as well, but morally they should be equivalent, there #### are just a couple of changes I seem to have made for S4. /John ### Martin Maechler: see also ./ess-s4.S ### which does *not* use assign (why?) assign(".SmodeObs", function(where, pattern) { if(pattern == "") objects(where) else objects(where, pattern) }, where=0) assign(".SmodeLoad", function(x) ## source function for S-mode { assign(".SmodeTmp", options(error=dump.calls), where=0, i=T) on.exit({options(.SmodeTmp); remove(".SmodeTmp",where=0)}) source(x) }, where = 0) assign(".SmodeDump", function(x, name) ## dump function for S-mode { assign(".SmodeTmp", options(error=dump.calls), where=0, i=T) on.exit({options(.SmodeTmp); remove(".SmodeTmp",where=0)}) dump(x, file=name) }, where = 0) assign(".SmodePaths", function() ## the paths for the directories in the search list { temp <- search() value <- character(length(temp)) for(i in seq(along.with = temp)) { obj <- database.object(i) if(is.character(obj) && length(obj) == 1) value[[i]] <- obj } value }, where = 0) ess/etc/R-oxygen-ex.R0000664000175000017500000000224012423756516012755 0ustar eddedd### Go inside the "preamble" section and type C-e C-e C-r (ess-roxy-preview-Rd) ### to get an R error message about 'col(m)' --> there's a buglet somewhere ##' Computes different parameter estimates for foo bars and variations ##' ##' @title Estimation procedures for Foo Bar ##' @param x data matrix ##' @param op object to be estimated ##' @param method estimation method; can be ##' "mle" MLE ##' "smle" SMLE ##' "dmle" MLE based on the diagonal ##' "mde.normal" minimum distance estimation based on the chisq distribution and CvM distance ##' "mde.log" minimum distance estimation based on the Erlang distribution and CvM distance ##' "tau.tau.mean" averaged pairwise Kendall's tau estimator ##' "tau.theta.mean" average of Kendall's tau estimators ##' "beta" multivariate Blomqvist's beta estimator ##' @return estimated value/vector according to the chosen method ##' @author Foo Bar estimateFoo <- function(x, op, method=c("mle", "smle", "dmle", "mde.normal", "mde.log", "tau.tau.mean", "tau.theta.mean", "beta")) { .... } ess/etc/checkTriple.Rd0000664000175000017500000000430512423756516013240 0ustar eddedd\name{checkTriple} \title{Check Consistency of Conditional Independence for a Triple of Nodes} \usage{ "An Rd file exposing an ESS bug in (ess-next-code-line) : Jump to '\examples{' and the first code line (= all '##...') and use C-c C-n to send it to R. It works, *but* point does not advance to the next line; but rather jumps backward to the 50'percent' line. Adding a percent 'o/o' sign here ``fixes'' this bug (so I don't do it) " checkTriple(version.unf = c(NA, NA), maj.rule = FALSE, verbose = FALSE) } \arguments{ \item{version.unf}{ (integer) vector of length two: .............} \item{maj.rule}{logical indicating that the following majority rule is applied: if \code{b} is in less than 50\% of the checked sepsets, we say that \code{b} is in \bold{no} sepset. If \code{b} is in more than 50\% of the checked sepsets, we say that \code{b} is in \bold{all} sepsets. If \code{b} is in exactly 50\% of the checked sepsets, the triple is considered \sQuote{ambiguous}.} \item{verbose}{Logical asking for detailed output of intermediate steps.} } \description{ For each subset ......... } \references{ D. Colombo and M.H. Maathuis (2013). Order-independent constraint-based causal structure learning, (arXiv:1211.3295v2). } \examples{ ################################################## ## Using Gaussian Data ################################################## ## Load predefined data data(gmG) n <- nrow(gmG8$x) p <- ncol(gmG8$x) ## define independence test (partial correlations), and test level indepTest <- gaussCItest alpha <- 0.01 ## define sufficient statistics suffStat <- list(C = cor(gmG8$x), n = n) ## estimate CPDAG pc.fit <- pc(suffStat, indepTest, p=p, alpha=alpha, verbose = TRUE) if (require(Rgraphviz)) { ## show estimated CPDAG par(mfrow=c(1,2)) plot(pc.fit, main = "Estimated CPDAG") plot(gmG8$g, main = "True DAG") } checkTriple(a = 6, b = 1, c = 8, nbrsA = c(1,5,7), nbrsC = c(1,5), sepsetA = pc.fit@sepset[[a]][[c]], sepsetC = pc.fit@sepset[[c]][[a]], suffStat=suffStat, indepTest=indepTest, alpha=alpha, version.unf = c(2,2), verbose = TRUE) } \keyword{manip} ess/etc/sas-keys.doc0000664000175000017500000004100012423756516012733 0ustar eddedd╨╧рб▒с;■  ■                                                                                                                                                                                                                                                                                                                                                                                                                                                   ¤       ■   ■    ■   ■                                                                                                                                                                                                                                                                                                                                                                                                   Root Entry            ■               ■               ■               ■   ■   ■     !"#$%&'()■   +,-./■                                                                                                                                                                                                                                                                                                                                   ■       └FMicrosoft Word-Dokument MSWordDocWord.Document.8Ї9▓q                                                                   [fё fDefault$a$A$1$ ╞*$/B*OJQJCJmH sH PJnH ^JaJ_H tH BA@Є бBAbsatz-StandardschriftartH■Є ёHWW-Absatz-StandardschriftartJ■Є JWW-Absatz-Standardschriftart1B■Є BWW-Default Paragraph Font.B". Text body ддx /!2 List^J@■B@Caption дxдx $CJ6^JaJ]&■R&Index $^J4■!b4Table Contents $>■ar> Table Heading  $$a$65М(    h╓╥F▄┌ъ 2 т N  *3?JVW_kt~ИШй┤╡▐чє¤(34=M^ijЧго║╗├╧╪туьэ$.78DLXcdmnушьЁЇї∙¤ qvz~ВГЗЛПУФШЭвзиМ""""""""""""""╢""""""""""""""╢""""""""""╢""""""""""╢""""""""""""""╢""""""""""""""╢МPGРTimes New Roman5РSymbol3&РArial=РLucidasansBН╨hiм√Eiм√E╨pГРp╨pp'0■ рЕЯЄ∙OhлС+'│┘04 p x Д Р Ь и┤╨ь° $щ¤3@╝аe@ыw╔ьф├@Vwpm╬└@Д-m╬└Rodney SparapaniRodney Sparapani Normal.dotHelpье┬M ┐0Caolan70/(М       lццц·4. :\wЇЦk bЦ╠┘Unix key definitions for PC/Mac keyboard F1 Help F2 Refresh F3 Submit F4 Program F5 Log F6 Listing F7 Text F8 Shell F9 View F10 Log-Toggle F11 File-type-2 F12 Graph PC key definitions for PC/Mac keyboard F1 Help F2 Refresh F3 Shell F4 Text F5 Program F6 Log F7 Listing  F8 Submit F9 View F10 Log-Toggle F11 File-type-2 F12 Graph Unix key definitions for Thinkpad keyboard F2 Refresh F3 Submit F4 Program F5 Log F6 Listing F7 Text F8 Shell F9 View PC key definitions for Thinkpad keyboard F2 Refresh F3 Shell F4 Text F5 Program F6 Log F7 Listing F8 Submit F9 View Unix key definitions for Sun keyboard (cut out the numbered boxes and leave the dividers between F4/F5 and F8/F9) F1  F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Help Refresh Submit Program Log Listing Text Shell Viewtable Log-Toggle File-type-2 Viewgraph PC key definitions for Sun keyboard (cut out the numbered boxes and leave the dividers between F4/F5 and F8/F9) F1  F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Help Refresh Shell Text Program Log Listing Submit Viewtable Log-Toggle File-type-2 Viewgraph dtxИ¤¤CJRTfn~Фмо╛╓ш№■0:Rh¤√їїїїїїїїїїїїїїїїїї$$a$hjl║╝╬╓ECA?99$$a$╣$$TФ_4╓8RЪэ H_▒ _ ╗$ў&I+д/Ў3B84╓4╓4╓4╓╓ц· &6PfhpzДЪд╝╥∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙$$a$╥╘╓,.6FECA?99$$a$╣$$TФ_4╓8RЪэ H_▒ _ ╗$ў&I+д/Ў3B84╓4╓4╓4╓F\tvЖЮ░─╞╬╪┌▄∙∙∙∙∙∙∙∙∙∙kiН$$TФ_4╓р 5j б∙.e"к(р.2B84╓4╓4╓4╓$$a$ ▄.08H\npxИШ░╞╚╨┌¤√їїїїїїїїїїїїї$$a$┌▄▐┬ ─ ╞ ╬ ╨ ╪ р ш ъ qomkic`cccc$$$a$Н$$TФ_4╓р 5j б∙.e"к(р.2B84╓4╓4╓4╓ ъ Є ·    ( 2 ∙∙∙∙∙∙∙∙∙$$a$ 2 4 № ■ ▐ р т ECA?=;╣$$TФ.4╓8RЪэ H_▒ _ ╗$ў&I+д/Ў3B84╓4╓4╓4╓т ъ ь Ї №      & ( 0 : D N ∙Ў∙∙∙∙∙∙∙∙∙∙∙∙∙$$$a$N P EC╣$$TФ.4╓8RЪэ H_▒ _ ╗$ў&I+д/Ў3B84╓4╓4╓4╓-0░р= ░╨/!░╨"░╨#Р╨$Р╨2P1Рh3P(20                                                                                                                                                                                                                                                                                                                                                             Root Entry         └F CompObj    jOle         1Table            Л SummaryInformation(        *dWordDocument             /(            ■               ■   ess/etc/sas-keys.rtf0000664000175000017500000006256412423756516013003 0ustar eddedd{\rtf1\ansi\deff0\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fprq2\fcharset0 Times New Roman;}{\f3\fnil\fprq2\fcharset0 Bitstream Vera Sans;}{\f4\fnil\fprq2\fcharset0 Lucidasans;}{\f5\fnil\fprq0\fcharset0 Lucidasans;}} {\colortbl;\red0\green0\blue0;\red128\green128\blue128;} {\stylesheet{\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033\snext1 Default;} {\s2\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031\sbasedon1\snext2 Text body;} {\s3\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031\sbasedon2\snext3 List;} {\s4\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs20\lang255\ai\ltrch\dbch\af3\afs20\langfe255\ai\loch\f0\fs20\lang1031\i\sbasedon1\snext4 Caption;} {\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031\sbasedon1\snext5 Index;} {\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031\sbasedon2\snext6 Table Contents;} {\s7\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\ai\ab\loch\f0\fs24\lang1031\i\b\sbasedon6\snext7 Table Heading;} {\*\cs9\cf0\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031 WW-Absatz-Standardschriftart;} {\*\cs10\cf0\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031 WW-Absatz-Standardschriftart1;} {\*\cs11\cf0\rtlch\af4\afs24\lang255\ltrch\dbch\af3\afs24\langfe255\loch\f0\fs24\lang1031 WW-Default Paragraph Font;} } {\info{\title Help}{\author Rodney Sparapani}{\creatim\yr2001\mo4\dy26\hr10\min22}{\operator Rodney Sparapani}{\revtim\yr2001\mo4\dy26\hr10\min25}{\printim\yr2004\mo1\dy27\hr10\min21}{\comment StarWriter}{\vern6450}}\deftab720 {\*\pgdsctbl {\pgdsc0\pgdscuse195\lndscpsxn\pgwsxn15840\pghsxn12240\marglsxn720\margrsxn720\margtsxn720\margbsxn720\pgdscnxt0 Default;}} {\*\pgdscno0}\landscape\paperh12240\paperw15840\margl720\margr720\margt720\margb720\sectd\sbknone\lndscpsxn\pgwsxn15840\pghsxn12240\marglsxn720\margrsxn720\margtsxn720\margbsxn720\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 Unix key definitions for PC/Mac keyboard} \par \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \par \trowd\trqr\trrh863\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1105\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx2201\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3308\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4423\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4958\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx6064\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7180\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8285\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9401\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9973\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11079\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12194\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx13300\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F1\line Help} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \par {\loch\f2\fs20\lang1033\i0\b0 Refresh} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3\line Submit} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4\line Program} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5\line Log} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6\line Listing} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7\line Text} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8\line Shell} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \par {\loch\f2\fs20\lang1033\i0\b0 View} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F10} \par {\loch\f2\fs20\lang1033\i0\b0 Log-Toggle} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F11} \par {\loch\f2\fs20\lang1033\i0\b0 File-type-2} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F12\line Graph} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \par {\loch\f2\fs20\lang1033\i0\b0 PC key definitions for PC/Mac keyboard} \par \par \trowd\trqr\trrh863\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1105\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx2201\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3308\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4423\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4958\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx6064\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7180\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8285\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9401\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9973\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11079\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12194\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx13300\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F1\line Help} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \par {\loch\f2\fs20\lang1033\i0\b0 Refresh} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3\line Shell} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4\line Text} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5\line Program} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6\line Log} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7\line Listing } \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8\line Submit} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \par {\loch\f2\fs20\lang1033\i0\b0 View} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F10} \par {\loch\f2\fs20\lang1033\i0\b0 Log-Toggle} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F11} \par {\loch\f2\fs20\lang1033\i0\b0 File-type-2} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F12\line Graph} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \par {\loch\f2\fs20\lang1033\i0\b0 Unix key definitions for Thinkpad keyboard} \par \par \trowd\trqr\trrh863\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1588\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3177\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4768\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx5624\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7212\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8803\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx10408\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11998\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12823\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \par {\loch\f2\fs20\lang1033\i0\b0 Refresh} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3\line Submit} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4\line {\fs18 Program}} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5\line Log} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6\line Listing} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7\line Text} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8\line Shell} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \par {\loch\f2\fs20\lang1033\i0\b0 View} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \par {\loch\f2\fs20\lang1033\i0\b0 PC key definitions for Thinkpad keyboard} \par \par \trowd\trqr\trrh863\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1588\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3177\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4768\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx5624\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7212\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8803\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx10408\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11998\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12823\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \par {\loch\f2\fs20\lang1033\i0\b0 Refresh} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3\line Shell} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4\line Text} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5} \par \pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs18\langfe255\loch\f2\fs18\lang1033 {\loch\f2\fs18\lang1033\i0\b0 Program} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6\line Log} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7\line Listing} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8\line Submit} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \par {\loch\f2\fs20\lang1033\i0\b0 View} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \par {\loch\f2\fs20\lang1033\i0\b0 Unix key definitions for Sun keyboard (cut out the numbered boxes and leave the dividers between F4/F5 and F8/F9)} \par \par \par \trowd\trqr\trrh1070\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1105\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx2201\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3308\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4423\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4958\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx6064\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7180\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8285\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9401\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9973\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11079\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12194\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx13300\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F1} \par \pard\plain \intbl\ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F10} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F11} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F12} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 Help Refresh Submit Program Log Listing Text Shell Viewtable Log-Toggle File-type-2 Viewgraph} \par \par {\loch\f2\fs20\lang1033\i0\b0 PC key definitions for Sun keyboard (cut out the numbered boxes and leave the dividers between F4/F5 and F8/F9)} \par \par \par \trowd\trqr\trrh1070\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx1105\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx2201\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx3308\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4423\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx4958\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx6064\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx7180\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx8285\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9401\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx9973\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx11079\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx12194\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clvertalt\cellx13300\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\clvertalt\cellx14400 \pard\intbl\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F1} \par \pard\plain \intbl\ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F2} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F3} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F4} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F5} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F6} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F7} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F8} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F9} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F10} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F11} \cell\pard\plain \intbl\ltrpar\s1\qc\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 \line F12} \cell\row\pard \pard\plain \ltrpar\s1\ql\rtlch\af2\afs20\lang255\ltrch\dbch\af2\afs20\langfe255\loch\f2\fs20\lang1033 {\loch\f2\fs20\lang1033\i0\b0 Help Refresh Shell Text Program Log Listing Submit Viewtable Log-Toggle File-type-2 Viewgraph} \par }ess/etc/backbugs0000775000175000017500000000116212423756516012221 0ustar eddedd#!/bin/sh # ESS[BUGS]: 02/18/2004 # runs BUGS taking commands from command file # case `config.guess` in i?86-pc-cygwin) BUGS=bugs0603.exe;; i?86-*-linux*) BUGS=bugs0600.linux;; sparc-sun-solaris*) BUGS=bugs603.sparc;; mips-sgi-irix*) BUGS=bugs06.sgi;; esac case $# in 1) $BUGS 32 bugs $1 2>> bugs.log cp -fp bugs.log bugs.bog chmod -w bugs.bog ;; 2) $BUGS 32 $1 $2 2>> $1.log cp -fp $1.log $1.bog chmod -w $1.bog ;; 3) $BUGS $1 $2 $3 2>> $2.log cp -fp $2.log $2.bog chmod -w $2.bog ;; *) echo "usage: $0 [[number_of_bins] default_output_name] command_file";; esac ess/etc/pkg1/0000775000175000017500000000000012423756516011354 5ustar eddeddess/etc/pkg1/DESCRIPTION0000664000175000017500000000032612423756516013063 0ustar eddeddPackage: pkg1 Type: Package Title: A sample package for testing ESS Version: 1.0 Date: 2014-01-20 Author: ESS Core Maintainer: Description: A sample package for testing ESS License: GPL-2 ess/etc/pkg1/NAMESPACE0000664000175000017500000000001512423756516012567 0ustar eddeddexport(D1tr) ess/etc/pkg1/man/0000775000175000017500000000000012423756516012127 5ustar eddeddess/etc/pkg1/man/D1tr.Rd0000664000175000017500000000201512423756516013226 0ustar eddedd\name{D1tr} \alias{D1tr} \title{Numerical Derivatives of (x,y) Data} \description{ Compute the numerical derivatives of \eqn{f()} given observations \code{(x[i], y ~= f(x[i]))}. \code{D1tr} is the \emph{\bold{tr}ivial} discrete first derivative using simple difference ratios. This is \bold{far} from optimal and only kept here for reference. } \usage{ D1tr(y, x = 1) } \arguments{ \item{x,y}{numeric vectors of same length, supposedly from a model \code{y ~ f(x)}. For \code{D1tr()}, \code{x} can have length one and then gets the meaning of \eqn{h = \Delta x}.} } \value{ \code{D1tr()} returns a numeric vector of the length of \code{y}. } \author{Martin Maechler, in 1992 (for S).} \seealso{\code{\link[sfsmisc]{D1D2}} which directly uses the 2nd derivative of the smoothing spline; \code{\link{smooth.spline}}. } \examples{ set.seed(330) x <- sort(runif(500, 0,10)) y <- sin(x) + rnorm(500)/100 f1 <- D1tr(x=x,y=y) plot(x,f1, ylim = range(c(-1,1, f1))) curve(cos(x), col=3, add= TRUE) } \keyword{smooth} ess/etc/pkg1/R/0000775000175000017500000000000012423756516011555 5ustar eddeddess/etc/pkg1/R/D1tr.R0000664000175000017500000000154412423756516012516 0ustar eddeddD1tr <- function(y, x = 1) { ## Purpose: discrete trivial estimate of 1st derivative. ## ---------------------------------------------------------------------- ## Arguments: x is optional; let's say we don't like "'" ## ---------------------------------------------------------------------- ## Author: Martin Maechler, ~ 1990 n <- length(y) if(length(x) == 1) c(y[2] - y[1], 0.5 * (y[-(1:2)] - y[-((n-1):n)]), y[n] - y[n-1])/x else { ## Here, already using non-matching apostrophes, but developer mode ## still seems to work .. if(n != length(x)) stop("lengths' of x & 'y' must equal") if(is.unsorted(x)) stop("'x' must be sorted !") c(y[2] - y[1], 0.5 * (y[-(1:2)] - y[-((n-1):n)]), y[n] - y[n-1]) / c(x[2] - x[1], 0.5 * (x[-(1:2)] - x[-((n-1):n)]), x[n] - x[n-1]) } } ess/etc/TODO.org0000664000175000017500000001733512506744203011771 0ustar eddedd* COMPLETION ** DONE make eldoc automatically pick available sub-process :13_09: :LOGBOOK: - State "DONE" from "DONE" [2013-06-26 Wed 16:51] :END: ** TODO make eldoc (actually ess--fun.start) work from withing strings * TRACEBUG ** DONE put back ess-debug-goto-input-event-marker :LOGBOOK: - State "DONE" from "TODO" [2013-06-21 Fri 01:18] :END: [2013-06-18 Tue] [[gnus:nnfolder%2Barchive:sent-2013-June#87sj0fulny.fsf@gmail.com][Email to Marius Hofert: Re: {ESS} A suggestion for deb]] ** TODO make ess-selection-mode-map or just use ess-debug-mode-map When recover mode is on, it would be very convenient to exit it with M-Q. [2013-06-12 Wed] ** DONE tracebug detects only english error messages. :LOGBOOK: - State "DONE" from "TODO" [2013-06-21 Fri 01:18] :END: Try to solve with gettext R's functionality. Partially solved (for most important cases) by relaxing regular expressions. ** DONE C-c C-c with ess-inject-source=t deletes files faster than R can process - State "DONE" from "TODO" [2013-06-26 Wed 16:46] ** DONE tramp references not found :LOGBOOK: - State "DONE" from "TODO" [2013-08-12 ma 23:40] :END: [2013-07-08 ma] [[file:~/works/pbm/R/hierarchy.R::..st_is_old..%20<-][file:~/works/pbm/R/hierarchy.R::..st_is_old.. <-]] ** DONE watch window behaves unexpectedly :LOGBOOK: - State "DONE" from "TODO" [2014-03-31 Mon 20:13] :END: [2013-06-27 Thu] * DEVELOPER ** DONE [#A] Eval in developer is broken :LOGBOOK: - State "DONE" from "TODO" [2013-06-26 Wed 16:51] :END: ** TODO "initialize" method is not injected ** DONE don't ask on C-t l for package if already in a package and dev is active :LOGBOOK: - State "DONE" from "TODO" [2013-08-12 ma 23:42] :END: It interrupts the workflow unnecessarily and feels differently from C-c C-l [2013-07-10 wo] * SAS ** DONE remote M-x ess-sas-interactive via shell with ssh :LOGBOOK: - State "DONE" from "TODO" [2013-08-12 ma 23:38] :END: sets ess-process-name-list to (("shell")) This prevents iESS[SAS] evaluation since a value of (("SAS")) would be necessary for that. * INDENTATION ** TODO closing ) match the function keyword foo(a, b ) instead of current: foo(a, b ) And foo( a, b ) instead of foo( a, b ) * EVALUATION ** TODO implement block-based evaluation >>>>> Peter Meilstrup on Fri, 10 Jan 2014 23:25:01 -0800 wrote: >> >>> Over both eval-function (which doesn't usually do what I want when I >>> have inner functions) and eval-paragraph (which doesn't when I put a >>> line break in a function definition), I would prefer a command that >>> did "evaluate all lines that include the top-level bracket enclosing >>> point." That would be easy to implement using parse-partial-sexp and >>> cover the case discussed here. >> I would be happy to implement this. Then we would be able to inject the >> source code reliably. >> >> A bit of an issue is the paragraph evaluation. A common pattern in R >> interactive code is to have a bunch of one-liners to be evaluated at >> once. Top-level-form evaluation will break this pattern unless we expand >> the evaluated region to the whole paragraph containing the form. >> >> Sometimes I need to evaluate an inner form as well. A natural thing >> would be to put it on C-u, but C-u is historically taken for a not very >> useful visual evaluation toggling. >> >> Any ideas/proposals are welcome. >> >> Vitalie >> * MISC ** TODO [#A] populate ess-autoload.el and call it from ess-site.el :13_09: This will ensure that very quick start both for (require "ess-start") and MELPA users. ** TODO [#B] build ert based unit test suit :13_09: ** TODO split ess-mode into specialized derived modes ** DONE set PAGER="cat" environment variable for tramp process if unset? :LOGBOOK: - State "DONE" from "TODO" [2014-03-31 Mon 20:13] :END: ** TODO cleanup ESS namespace [2013-06-27 Thu] ** DONE remove reference to ssh.el from manual + add tramp workflow :LOGBOOK: - State "DONE" from "TODO" [2013-10-16 Wed 19:17] :END: [2013-07-10 wo] [[gnus:nnimap%2BSpinuVit:INBOX#51DD58EF.1010702@yahoo.de][Email from Jannis: Re: {ESS} ess-eldoc via ssh re]] ** TODO check Rodney's report on bastard symlinks [2013-07-11 do] ** DONE check if ess-remote works :LOGBOOK: - State "DONE" from "TODO" [2013-10-16 Wed 19:17] :END: [2013-08-12 ma] ** CANCELLED Help focus does not honor focus-follows-mouse/mouse-autoselect-window :CANCELLED: :LOGBOOK: - State "CANCELLED" from "TODO" [2013-10-16 Wed 19:16] \\ was not a bug: said users may want to consider setting ess-help-pop-to-buffer to nil :END: If you have focus-follows-mouse and mouse-autoselect-window set to t, then ask for help in an *R* buffer, i.e. > ?setwd The help buffer steals focus permanently instead of surrendering it to mouse movement; you need to physically click in the *R* buffer to restore the focus following the mouse. C-c C-d C-d behaves similarly. Ideally, we should respect the user's settings of focus-follows-mouse/mouse-autoselect-window in this common help/*R* buffer arrangement. ** TODO Make an option to remember eval-and-go code in comint history ** DONE DESCRIPTION file is killed if set to R-mode :LOGBOOK: - State "DONE" from "TODO" [2013-10-16 Wed 18:15] :END: ** TODO eldoc should ignore some functions Some functions have no useful argument information to report and they should simply be ignored. Ideally, this feature would be customizable so that each user could add their unfavorite functions. To start, I would put suggest: (), c(), list(), sqrt(), t() ** TODO ess-doc-map, ess-extra-map, and ess-dev-map are present "everywhere" notably in ess-help, inferior-ess, and ess-mode. It would be *really* user friendly if we have a "submenu" for each of these maps, and them in both ESS and iESS (or all 4: ESS, iESS, ESS-help, ESS-transcript, ..). ** DONE ess-execute-screen-options wrong in terminal :LOGBOOK: - State "DONE" [2014-03-31 Mon 20:11] :END: [2013-12-19 Thu] [[gnus:nnimap%2BSpinuVit:ESS#CAD%3D7RJZ4EHETKF4LPJpzuw0uO9AuzOtWDYVnV1cZAVQxAotVxg@mail.gmail.com][Email from Ali Tofigh: {ESS} ess-execute-screen-optio]] ** TODO Implement "Extract Function" functionality Proposed by Andreas Leha: ,---- | RStudio can analyze a selection of code from within the source editor | and automatically convert it into a re-usable function. Any "free" | variables within the selection (objects that are referenced but not | created within the selection) are converted into function arguments `---- ** DONE > a + b + c is not cleaned correctly with C-u C-u C-y :LOGBOOK: - State "DONE" from "TODO" [2014-03-31 Mon 20:05] :END: While you are in this part of the code, can you add C-u C-u C-y to the ESS menu item, although maybe it belongs on the Edit menu. Not clear to me which would be better. Thanks Rich [2014-02-20 Thu] [[gnus:nnimap%2BSpinuVit:ESS/ESS-core#CAGx1TMCSfK3XK6YghxomP03R_tFD2AiC4X%3D0NDcvoje%3D%2B9vMWw@mail.gmail.com][Email from Richard M. Heiberger: bug in ess-transcript-clean-re]] * RStudio (excerpts from Hadley's R-packages book) ** TODO Build & reload Available in RStudio via Cmd + Shift + B. This in- stalls the package, restarts R, and then reloads the package with library() (doing this by hand is painful). ** TODO Jump to github file view. If lines are selected jump to those lines. This is probably there in projectile. ess/etc/sas-keys.ps0000664000175000017500000017030312423756516012621 0ustar eddedd%!PS-Adobe-3.0 %%BoundingBox: (atend) %%Creator: OpenOffice.org 1.1.0 %%For: rsparapa %%CreationDate: Tue Jan 27 10:21:57 2004 %%Title: Help %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: (atend) %%PageOrder: Ascend %%EndComments %%BeginProlog %%BeginResource: procset PSPrint-Prolog 1.0 0 /ISO1252Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /unused /Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused /unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def /psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding 3 -1 roll def currentdict end exch pop definefont pop } def /pathdict dup 8 dict def load begin /rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit } { pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1 add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10 eq 3 1 roll exch } def /rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0 get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3 -1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul } for 256 div exch pop exch { neg } if } def /xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add 1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end /readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def systemdict /languagelevel known not { /xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1 roll show moveto 0 rmoveto } for pop pop } def /rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /rectfill { rectangle fill } def /rectstroke { rectangle stroke } def } if /psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def /psp_ascii85filter { currentfile /ASCII85Decode filter } def /psp_lzwstring { psp_lzwfilter 1024 string readstring } def /psp_ascii85string { psp_ascii85filter 1024 string readstring } def /psp_imagedict { /psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def /psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get } def 7 dict dup /ImageType 1 put dup /Width 7 -1 roll put dup /Height 5 index put dup /BitsPerComponent 4 index psp_bitspercomponent put dup /Decode 5 -1 roll psp_decodearray put dup /ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup /DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put } def %%EndResource %%EndProlog %%BeginSetup % %%BeginResource: font TimesNewRomanPSMTHGSet2 %!PS-AdobeFont-1.0-2.32768 % Creator: SunTypeTools-TT 1.0 gelf % Original font name: TimesNewRomanPSMT 30 dict begin /PaintType 0 def /FontType 3 def /StrokeWidth 0 def /FontName (TimesNewRomanPSMTHGSet2) cvn def /XUID [103 0 0 16#38DA7935 51 16#AA10B483 16#F0A3C008] def /FontMatrix [.001 0 0 .001 0 0] def /FontBBox [-166 -306 1008 1006] def /Encoding 256 array def 0 1 255 {Encoding exch /.notdef put} for Encoding 0 /glyph0 put Encoding 5 /glyph1 put Encoding 48 /glyph2 put Encoding 50 /glyph3 put Encoding 46 /glyph4 put Encoding 17 /glyph5 put Encoding 45 /glyph6 put Encoding 23 /glyph7 put Encoding 27 /glyph8 put Encoding 30 /glyph9 put Encoding 34 /glyph10 put Encoding 36 /glyph11 put Encoding 38 /glyph12 put Encoding 39 /glyph13 put Encoding 41 /glyph14 put Encoding 42 /glyph15 put Encoding 16 /glyph16 put Encoding 22 /glyph17 put Encoding 47 /glyph18 put Encoding 24 /glyph19 put Encoding 37 /glyph20 put Encoding 18 /glyph21 put Encoding 15 /glyph22 put Encoding 28 /glyph23 put Encoding 31 /glyph24 put Encoding 40 /glyph25 put Encoding 1 /glyph26 put Encoding 43 /glyph27 put Encoding 19 /glyph28 put Encoding 21 /glyph29 put Encoding 20 /glyph30 put Encoding 9 /glyph31 put Encoding 7 /glyph32 put Encoding 10 /glyph33 put Encoding 35 /glyph34 put Encoding 29 /glyph35 put Encoding 3 /glyph36 put Encoding 6 /glyph37 put Encoding 25 /glyph38 put Encoding 33 /glyph39 put Encoding 2 /glyph40 put Encoding 12 /glyph41 put Encoding 26 /glyph42 put Encoding 14 /glyph43 put Encoding 13 /glyph44 put Encoding 11 /glyph45 put Encoding 32 /glyph46 put Encoding 49 /glyph47 put Encoding 44 /glyph48 put Encoding 4 /glyph49 put Encoding 8 /glyph50 put /CharProcs 52 dict def CharProcs begin /.notdef {} def /glyph0 { 777 0 125 0 625 625 setcachedevice 125 0 moveto 125 625 lineto 625 625 lineto 625 0 lineto 125 0 lineto closepath 140 15 moveto 609 15 lineto 609 609 lineto 140 609 lineto 140 15 lineto closepath fill } bind def /glyph1 { 250 0 0 0 0 0 setcachedevice } bind def /glyph2 { 333 0 41 -213 310 694 setcachedevice 310 -195 moveto 310 -213 lineto 261 -188 220 -160 187 -126 curveto 141 -79 104 -23 79 40 curveto 54 104 41 170 41 239 curveto 41 340 65 432 115 516 curveto 165 599 230 658 310 694 curveto 310 673 lineto 270 651 237 621 211 583 curveto 186 544 167 496 154 437 curveto 142 378 135 316 135 252 curveto 135 183 140 119 151 62 curveto 159 18 169 -18 182 -45 curveto 194 -72 210 -98 230 -123 curveto 250 -148 277 -172 310 -195 curveto closepath fill } bind def /glyph3 { 333 0 22 -213 291 694 setcachedevice 22 673 moveto 22 694 lineto 71 670 113 641 145 607 curveto 192 560 228 504 253 440 curveto 279 376 291 310 291 240 curveto 291 140 267 48 217 -35 curveto 168 -118 103 -177 22 -213 curveto 22 -195 lineto 62 -173 95 -143 121 -104 curveto 147 -66 166 -17 179 41 curveto 191 100 197 162 197 226 curveto 197 295 192 358 181 416 curveto 173 460 163 497 151 523 curveto 139 550 123 577 102 602 curveto 82 626 56 650 22 673 curveto closepath fill } bind def /glyph4 { 333 0 40 187 292 261 setcachedevice 40 261 moveto 292 261 lineto 292 187 lineto 40 187 lineto 40 261 lineto closepath fill } bind def /glyph5 { 277 0 1 -13 280 694 setcachedevice 280 694 moveto 40 -13 lineto 1 -13 lineto 241 694 lineto 280 694 lineto closepath fill } bind def /glyph6 { 500 0 36 -11 464 675 setcachedevice 36 327 moveto 36 402 47 467 70 522 curveto 93 576 123 617 161 644 curveto 190 665 220 675 251 675 curveto 302 675 348 650 388 598 curveto 438 534 464 447 464 337 curveto 464 260 453 195 431 141 curveto 409 88 381 49 346 24 curveto 312 0 279 -11 247 -11 curveto 184 -11 131 25 89 100 curveto 54 163 36 238 36 327 curveto closepath 131 314 moveto 131 224 143 149 165 91 curveto 184 43 211 19 248 19 curveto 266 19 284 26 303 42 curveto 322 58 336 84 346 122 curveto 361 178 368 256 368 358 curveto 368 434 361 497 345 547 curveto 333 585 318 611 299 627 curveto 286 638 270 643 251 643 curveto 229 643 209 633 192 613 curveto 169 586 153 544 144 486 curveto 136 428 131 371 131 314 curveto closepath fill } bind def /glyph7 { 500 0 117 0 377 675 setcachedevice 117 597 moveto 278 675 lineto 294 675 lineto 294 116 lineto 294 80 295 56 299 47 curveto 302 38 308 31 318 26 curveto 328 21 348 19 377 18 curveto 377 0 lineto 128 0 lineto 128 18 lineto 160 18 180 21 189 26 curveto 198 30 205 37 208 45 curveto 211 53 213 77 213 116 curveto 213 474 lineto 213 522 212 553 208 566 curveto 207 577 203 584 196 589 curveto 190 594 183 597 174 597 curveto 163 597 146 592 124 582 curveto 117 597 lineto closepath fill } bind def /glyph8 { 500 0 21 0 458 675 setcachedevice 458 127 moveto 412 0 lineto 21 0 lineto 21 18 lineto 136 123 217 208 264 274 curveto 311 341 334 401 334 457 curveto 334 499 321 533 295 560 curveto 270 587 239 601 203 601 curveto 171 601 142 591 116 572 curveto 90 553 71 525 58 488 curveto 40 488 lineto 48 548 69 595 103 627 curveto 137 659 179 675 229 675 curveto 283 675 328 658 364 624 curveto 399 589 417 549 417 501 curveto 417 468 410 435 394 401 curveto 370 349 331 292 277 233 curveto 196 145 145 92 125 73 curveto 298 73 lineto 333 73 358 75 372 77 curveto 386 80 399 85 410 93 curveto 421 101 432 112 440 127 curveto 458 127 lineto closepath fill } bind def /glyph9 { 500 0 40 -11 416 675 setcachedevice 50 536 moveto 69 580 93 615 122 639 curveto 151 663 187 675 229 675 curveto 283 675 323 658 352 624 curveto 373 598 384 571 384 541 curveto 384 493 354 443 293 392 curveto 333 376 364 353 385 323 curveto 406 294 416 259 416 219 curveto 416 162 398 112 362 70 curveto 314 16 246 -11 155 -11 curveto 111 -11 81 -6 64 4 curveto 48 16 40 27 40 40 curveto 40 49 44 58 52 65 curveto 59 72 68 76 79 76 curveto 87 76 96 75 104 72 curveto 109 70 122 64 142 54 curveto 161 44 175 38 182 36 curveto 194 32 207 30 221 30 curveto 254 30 283 43 308 69 curveto 332 95 344 125 344 160 curveto 344 186 339 211 327 235 curveto 319 253 310 268 299 277 curveto 286 290 267 302 242 312 curveto 218 323 193 328 167 328 curveto 151 328 lineto 151 343 lineto 177 346 203 355 229 371 curveto 255 386 273 404 285 426 curveto 297 447 303 471 303 497 curveto 303 530 292 557 271 578 curveto 250 599 225 609 193 609 curveto 143 609 101 582 66 528 curveto 50 536 lineto closepath fill } bind def /glyph10 { 500 0 15 0 465 675 setcachedevice 465 244 moveto 465 174 lineto 376 174 lineto 376 0 lineto 295 0 lineto 295 174 lineto 15 174 lineto 15 237 lineto 322 675 lineto 376 675 lineto 376 244 lineto 465 244 lineto closepath 295 244 moveto 295 572 lineto 63 244 lineto 295 244 lineto closepath fill } bind def /glyph11 { 500 0 47 -11 434 662 setcachedevice 434 662 moveto 395 579 lineto 196 579 lineto 153 490 lineto 239 478 308 445 358 394 curveto 401 350 423 297 423 237 curveto 423 203 416 170 402 141 curveto 388 111 370 86 348 65 curveto 327 44 303 28 276 15 curveto 239 -2 201 -11 161 -11 curveto 122 -11 93 -4 75 8 curveto 57 21 47 37 47 53 curveto 47 62 51 70 59 77 curveto 66 84 76 87 87 87 curveto 95 87 103 86 109 83 curveto 116 81 126 75 142 63 curveto 166 47 191 38 216 38 curveto 254 38 288 53 316 82 curveto 345 110 359 145 359 187 curveto 359 227 347 264 321 299 curveto 295 333 260 360 214 379 curveto 179 394 131 402 69 404 curveto 196 662 lineto 434 662 lineto closepath fill } bind def /glyph12 { 500 0 42 -11 461 675 setcachedevice 448 675 moveto 448 657 lineto 405 653 370 645 343 632 curveto 316 619 289 600 262 573 curveto 236 547 214 518 196 485 curveto 179 453 165 414 152 369 curveto 199 401 246 417 293 417 curveto 339 417 378 399 411 363 curveto 444 327 461 280 461 222 curveto 461 167 444 117 411 71 curveto 371 16 317 -11 250 -11 curveto 206 -11 167 3 135 33 curveto 74 91 42 166 42 259 curveto 42 318 54 375 78 428 curveto 102 481 136 529 180 570 curveto 224 612 266 640 307 654 curveto 347 668 385 675 419 675 curveto 448 675 lineto closepath 144 333 moveto 139 290 135 254 135 227 curveto 135 196 141 162 153 125 curveto 164 89 181 60 204 38 curveto 221 23 241 15 265 15 curveto 293 15 318 28 341 55 curveto 363 82 374 120 374 169 curveto 374 225 363 273 341 314 curveto 319 354 288 375 247 375 curveto 234 375 221 373 207 367 curveto 193 362 172 351 144 333 curveto closepath fill } bind def /glyph13 { 500 0 37 -13 455 662 setcachedevice 100 662 moveto 455 662 lineto 455 643 lineto 234 -13 lineto 180 -13 lineto 377 582 lineto 195 582 lineto 159 582 133 578 117 569 curveto 90 554 68 531 51 500 curveto 37 505 lineto 100 662 lineto closepath fill } bind def /glyph14 { 500 0 60 -11 442 675 setcachedevice 191 333 moveto 139 376 105 411 90 437 curveto 75 462 67 490 67 518 curveto 67 561 84 598 117 629 curveto 150 660 194 675 250 675 curveto 303 675 346 661 378 632 curveto 411 603 427 570 427 533 curveto 427 508 419 483 401 457 curveto 384 432 347 401 291 366 curveto 348 322 386 288 405 262 curveto 430 229 442 194 442 157 curveto 442 110 424 71 389 38 curveto 354 5 307 -11 249 -11 curveto 187 -11 138 7 102 47 curveto 74 79 60 113 60 150 curveto 60 180 70 209 90 238 curveto 109 267 143 298 191 333 curveto closepath 268 385 moveto 307 420 332 448 342 469 curveto 353 489 358 512 358 538 curveto 358 572 349 599 329 618 curveto 310 637 284 647 250 647 curveto 218 647 190 638 169 618 curveto 149 599 138 577 138 551 curveto 138 534 143 517 151 500 curveto 160 483 172 467 188 452 curveto 268 385 lineto closepath 214 314 moveto 187 292 167 267 154 240 curveto 142 213 135 185 135 153 curveto 135 111 146 78 169 52 curveto 192 27 221 14 257 14 curveto 292 14 320 24 341 44 curveto 362 64 373 88 373 116 curveto 373 140 367 161 354 179 curveto 332 214 285 259 214 314 curveto closepath fill } bind def /glyph15 { 500 0 39 -13 457 675 setcachedevice 52 -13 moveto 52 4 lineto 95 4 134 15 170 34 curveto 207 53 242 86 276 133 curveto 310 181 334 233 347 290 curveto 296 257 250 241 208 241 curveto 162 241 123 259 89 295 curveto 56 331 39 378 39 438 curveto 39 496 56 547 89 593 curveto 129 648 181 675 246 675 curveto 300 675 347 653 385 608 curveto 433 553 457 484 457 402 curveto 457 329 439 260 402 196 curveto 367 133 316 80 251 38 curveto 199 3 142 -13 80 -13 curveto 52 -13 lineto closepath 355 326 moveto 361 369 364 402 364 428 curveto 364 459 359 494 348 530 curveto 337 567 322 595 302 614 curveto 283 634 260 644 235 644 curveto 206 644 181 631 159 604 curveto 137 579 126 540 126 488 curveto 126 420 141 366 169 327 curveto 190 299 217 285 248 285 curveto 263 285 280 289 301 296 curveto 321 303 339 313 355 326 curveto closepath fill } bind def /glyph16 { 666 0 36 -15 632 677 setcachedevice 602 677 moveto 617 452 lineto 602 452 lineto 582 519 553 567 515 597 curveto 478 627 433 642 380 642 curveto 337 642 297 631 261 608 curveto 226 586 198 551 178 501 curveto 158 453 147 392 147 319 curveto 147 260 157 208 176 164 curveto 195 120 224 86 263 62 curveto 301 40 345 27 395 27 curveto 437 27 476 37 508 55 curveto 541 73 577 110 617 165 curveto 632 155 lineto 599 96 560 53 516 25 curveto 472 0 419 -15 358 -15 curveto 249 -15 164 25 103 106 curveto 59 167 36 238 36 320 curveto 36 386 50 447 80 502 curveto 110 558 150 601 203 631 curveto 254 662 311 677 373 677 curveto 420 677 468 666 514 642 curveto 528 635 538 631 543 631 curveto 552 631 560 634 566 640 curveto 575 649 581 661 584 677 curveto 602 677 lineto closepath fill } bind def /glyph17 { 556 0 16 0 515 662 setcachedevice 204 625 moveto 204 365 lineto 325 365 lineto 353 365 373 372 386 384 curveto 398 396 407 420 411 456 curveto 429 456 lineto 429 232 lineto 411 232 lineto 411 258 408 276 401 289 curveto 395 301 386 310 375 316 curveto 364 322 347 325 325 325 curveto 204 325 lineto 204 117 lineto 204 83 206 62 210 50 curveto 214 42 221 36 231 29 curveto 245 22 260 18 276 18 curveto 300 18 lineto 300 0 lineto 16 0 lineto 16 18 lineto 39 18 lineto 66 18 86 25 99 41 curveto 106 52 110 77 110 117 curveto 110 544 lineto 110 578 108 600 104 611 curveto 101 619 94 626 84 632 curveto 70 640 55 644 39 644 curveto 16 644 lineto 16 662 lineto 508 662 lineto 515 516 lineto 498 516 lineto 489 547 479 570 468 584 curveto 457 599 443 609 427 616 curveto 411 622 385 625 350 625 curveto 204 625 lineto closepath fill } bind def /glyph18 { 722 0 35 -15 708 677 setcachedevice 613 677 moveto 630 468 lineto 613 468 lineto 596 520 574 559 546 585 curveto 507 624 457 643 395 643 curveto 311 643 247 609 202 542 curveto 166 486 147 419 147 341 curveto 147 278 159 221 184 168 curveto 208 117 240 79 280 54 curveto 319 30 360 18 401 18 curveto 426 18 449 20 472 27 curveto 495 33 517 42 538 54 curveto 538 246 lineto 538 279 536 301 531 311 curveto 526 321 518 329 507 334 curveto 497 340 478 342 451 342 curveto 451 361 lineto 708 361 lineto 708 342 lineto 695 342 lineto 670 342 653 334 643 317 curveto 637 305 633 281 633 246 curveto 633 43 lineto 596 23 559 8 522 0 curveto 486 -9 446 -15 401 -15 curveto 273 -15 176 25 109 107 curveto 60 169 35 240 35 320 curveto 35 378 49 435 77 488 curveto 110 551 155 600 213 634 curveto 262 663 319 677 385 677 curveto 409 677 431 675 451 671 curveto 471 667 499 659 535 645 curveto 553 639 565 635 571 635 curveto 578 635 583 638 587 644 curveto 592 649 594 660 595 677 curveto 613 677 lineto closepath fill } bind def /glyph19 { 722 0 17 0 701 662 setcachedevice 205 354 moveto 513 354 lineto 513 544 lineto 513 578 511 600 506 611 curveto 503 619 497 626 486 632 curveto 472 640 458 644 441 644 curveto 418 644 lineto 418 662 lineto 701 662 lineto 701 644 lineto 678 644 lineto 663 644 647 640 633 632 curveto 623 627 616 620 612 609 curveto 609 599 606 577 606 544 curveto 606 117 lineto 606 83 608 62 613 50 curveto 616 42 623 36 633 29 curveto 647 22 662 18 678 18 curveto 701 18 lineto 701 0 lineto 418 0 lineto 418 18 lineto 441 18 lineto 468 18 488 25 500 41 curveto 509 52 513 77 513 117 curveto 513 318 lineto 205 318 lineto 205 117 lineto 205 83 207 62 211 50 curveto 215 42 222 36 232 29 curveto 246 22 261 18 276 18 curveto 300 18 lineto 300 0 lineto 17 0 lineto 17 18 lineto 40 18 lineto 67 18 87 25 100 41 curveto 107 52 111 77 111 117 curveto 111 544 lineto 111 578 109 600 105 611 curveto 102 619 95 626 85 632 curveto 71 640 56 644 40 644 curveto 17 644 lineto 17 662 lineto 300 662 lineto 300 644 lineto 276 644 lineto 261 644 246 640 232 632 curveto 222 627 215 620 211 609 curveto 208 599 205 577 205 544 curveto 205 354 lineto closepath fill } bind def /glyph20 { 610 0 20 0 589 662 setcachedevice 573 183 moveto 589 179 lineto 532 0 lineto 20 0 lineto 20 18 lineto 44 18 lineto 72 18 92 27 104 45 curveto 111 55 115 80 115 117 curveto 115 544 lineto 115 586 110 612 101 622 curveto 89 636 70 644 44 644 curveto 20 644 lineto 20 662 lineto 319 662 lineto 319 644 lineto 285 644 260 641 246 634 curveto 231 627 222 619 216 608 curveto 211 598 208 573 208 533 curveto 208 117 lineto 208 90 211 72 216 62 curveto 220 55 226 50 234 46 curveto 243 43 268 41 311 41 curveto 359 41 lineto 410 41 445 45 466 53 curveto 486 60 505 74 522 93 curveto 539 112 556 142 573 183 curveto closepath fill } bind def /glyph21 { 889 0 16 0 868 662 setcachedevice 409 0 moveto 153 557 lineto 153 114 lineto 153 74 157 48 166 38 curveto 178 25 197 18 223 18 curveto 247 18 lineto 247 0 lineto 16 0 lineto 16 18 lineto 40 18 lineto 67 18 87 26 99 43 curveto 106 53 110 77 110 114 curveto 110 547 lineto 110 576 107 597 100 610 curveto 96 620 87 628 75 634 curveto 63 641 43 644 16 644 curveto 16 662 lineto 204 662 lineto 444 144 lineto 680 662 lineto 868 662 lineto 868 644 lineto 845 644 lineto 817 644 797 635 785 618 curveto 778 608 774 584 774 547 curveto 774 114 lineto 774 74 778 48 788 38 curveto 800 25 819 18 845 18 curveto 868 18 lineto 868 0 lineto 586 0 lineto 586 18 lineto 610 18 lineto 638 18 658 26 669 43 curveto 677 53 680 77 680 114 curveto 680 557 lineto 425 0 lineto 409 0 lineto closepath fill } bind def /glyph22 { 556 0 16 0 520 662 setcachedevice 205 310 moveto 205 117 lineto 205 75 209 49 218 39 curveto 230 25 250 18 274 18 curveto 300 18 lineto 300 0 lineto 16 0 lineto 16 18 lineto 41 18 lineto 69 18 89 27 101 45 curveto 107 55 111 79 111 117 curveto 111 544 lineto 111 586 107 612 98 622 curveto 85 636 66 644 41 644 curveto 16 644 lineto 16 662 lineto 259 662 lineto 318 662 365 656 399 644 curveto 433 631 462 611 485 582 curveto 509 553 520 519 520 479 curveto 520 425 503 381 467 347 curveto 432 313 381 296 316 296 curveto 300 296 283 297 264 299 curveto 246 302 226 305 205 310 curveto closepath 205 337 moveto 222 334 237 332 250 330 curveto 264 329 275 328 285 328 curveto 318 328 348 341 373 367 curveto 397 393 409 427 409 469 curveto 409 498 404 524 392 549 curveto 380 573 364 592 342 604 curveto 321 616 296 622 269 622 curveto 252 622 231 619 205 613 curveto 205 337 lineto closepath fill } bind def /glyph23 { 666 0 17 0 675 662 setcachedevice 675 0 moveto 499 0 lineto 274 309 lineto 258 309 245 308 234 308 curveto 230 308 226 308 220 309 curveto 216 309 210 309 205 309 curveto 205 117 lineto 205 75 209 49 219 39 curveto 231 25 250 18 274 18 curveto 300 18 lineto 300 0 lineto 17 0 lineto 17 18 lineto 41 18 lineto 69 18 89 27 102 45 curveto 108 55 112 79 112 117 curveto 112 544 lineto 112 586 107 612 98 622 curveto 86 636 67 644 41 644 curveto 17 644 lineto 17 662 lineto 258 662 lineto 328 662 380 657 414 646 curveto 447 636 475 618 499 590 curveto 521 562 533 530 533 491 curveto 533 451 520 416 494 385 curveto 467 355 426 334 370 322 curveto 507 132 lineto 538 88 565 60 587 45 curveto 610 31 639 22 675 18 curveto 675 0 lineto closepath 205 340 moveto 211 340 217 340 221 340 curveto 226 340 229 339 232 339 curveto 295 339 343 353 375 380 curveto 407 408 423 442 423 485 curveto 423 526 411 560 385 586 curveto 359 612 325 625 282 625 curveto 263 625 238 622 205 615 curveto 205 340 lineto closepath fill } bind def /glyph24 { 556 0 62 -15 502 677 setcachedevice 458 677 moveto 458 448 lineto 440 448 lineto 435 492 424 527 409 553 curveto 394 579 372 600 344 615 curveto 316 630 287 638 257 638 curveto 223 638 195 628 173 607 curveto 151 586 140 563 140 536 curveto 140 516 146 498 161 481 curveto 181 457 229 424 305 383 curveto 367 351 409 325 432 307 curveto 454 290 472 269 484 244 curveto 496 220 502 195 502 168 curveto 502 119 483 76 444 39 curveto 405 3 355 -15 293 -15 curveto 274 -15 256 -13 239 -10 curveto 229 -9 208 -2 177 7 curveto 145 17 125 22 116 22 curveto 108 22 102 20 97 15 curveto 93 10 89 0 86 -15 curveto 68 -15 lineto 68 211 lineto 86 211 lineto 95 164 106 129 121 105 curveto 135 82 157 62 187 46 curveto 216 31 248 22 283 22 curveto 324 22 356 33 380 55 curveto 403 76 415 102 415 131 curveto 415 147 411 164 402 180 curveto 393 197 379 212 360 227 curveto 348 236 313 257 256 289 curveto 200 321 159 346 135 365 curveto 111 384 93 404 81 427 curveto 68 450 62 475 62 502 curveto 62 550 80 591 117 625 curveto 153 660 200 677 256 677 curveto 291 677 328 668 368 651 curveto 386 643 399 639 406 639 curveto 415 639 422 641 427 646 curveto 433 651 437 662 440 677 curveto 458 677 lineto closepath fill } bind def /glyph25 { 610 0 30 0 585 662 setcachedevice 578 662 moveto 585 506 lineto 567 506 lineto 563 534 559 553 552 565 curveto 542 584 529 598 512 607 curveto 496 616 474 620 446 620 curveto 353 620 lineto 353 114 lineto 353 74 357 48 366 38 curveto 378 25 397 18 423 18 curveto 446 18 lineto 446 0 lineto 165 0 lineto 165 18 lineto 188 18 lineto 216 18 236 26 248 43 curveto 255 53 259 77 259 114 curveto 259 620 lineto 179 620 lineto 148 620 126 618 113 613 curveto 97 607 82 596 70 578 curveto 58 561 51 537 48 506 curveto 30 506 lineto 38 662 lineto 578 662 lineto closepath fill } bind def /glyph26 { 722 0 5 -15 711 662 setcachedevice 477 644 moveto 477 662 lineto 711 662 lineto 711 644 lineto 686 644 lineto 660 644 640 633 626 611 curveto 620 601 616 578 616 541 curveto 616 272 lineto 616 206 609 154 596 118 curveto 583 81 557 50 519 23 curveto 480 -1 428 -15 361 -15 curveto 289 -15 234 -2 196 21 curveto 159 46 133 80 117 123 curveto 106 151 101 206 101 286 curveto 101 544 lineto 101 585 96 612 84 625 curveto 73 637 55 644 30 644 curveto 5 644 lineto 5 662 lineto 291 662 lineto 291 644 lineto 266 644 lineto 239 644 219 635 207 618 curveto 199 606 195 582 195 544 curveto 195 256 lineto 195 230 197 201 202 167 curveto 207 135 215 109 228 90 curveto 240 72 258 56 281 44 curveto 304 32 333 26 367 26 curveto 410 26 449 35 483 54 curveto 517 73 541 97 553 127 curveto 565 156 572 206 572 276 curveto 572 544 lineto 572 586 567 612 558 622 curveto 546 636 527 644 501 644 curveto 477 644 lineto closepath fill } bind def /glyph27 { 722 0 8 -15 709 662 setcachedevice 709 662 moveto 709 644 lineto 687 640 668 632 656 621 curveto 639 605 624 581 610 548 curveto 379 -15 lineto 361 -15 lineto 113 555 lineto 101 584 92 603 86 609 curveto 79 619 69 627 57 633 curveto 45 638 29 642 8 644 curveto 8 662 lineto 279 662 lineto 279 644 lineto 249 641 229 636 219 628 curveto 210 621 206 611 206 599 curveto 206 583 213 558 228 523 curveto 396 135 lineto 553 518 lineto 568 556 576 582 576 597 curveto 576 606 571 615 562 624 curveto 552 632 537 639 514 642 curveto 512 643 510 643 505 644 curveto 505 662 lineto 709 662 lineto closepath fill } bind def /glyph28 { 443 0 35 -9 441 460 setcachedevice 284 64 moveto 239 29 210 8 198 2 curveto 181 -4 162 -9 142 -9 curveto 111 -9 85 1 65 22 curveto 45 43 35 71 35 105 curveto 35 127 40 146 50 162 curveto 63 184 86 205 120 225 curveto 152 244 208 268 284 296 curveto 284 313 lineto 284 358 277 389 263 405 curveto 249 422 229 430 201 430 curveto 181 430 165 425 152 414 curveto 140 403 134 390 134 375 curveto 135 347 lineto 135 333 131 321 124 312 curveto 116 305 106 300 93 300 curveto 82 300 72 305 64 313 curveto 57 321 52 333 52 348 curveto 52 375 66 401 95 425 curveto 124 448 164 460 216 460 curveto 255 460 288 454 313 440 curveto 333 430 347 415 356 393 curveto 362 379 365 350 365 307 curveto 365 155 lineto 365 112 366 86 367 77 curveto 369 67 372 61 375 57 curveto 379 54 383 52 388 52 curveto 394 52 398 53 402 56 curveto 409 60 422 72 441 91 curveto 441 64 lineto 405 16 371 -8 337 -8 curveto 321 -8 309 -3 299 7 curveto 290 19 285 37 284 64 curveto closepath 284 96 moveto 284 266 lineto 235 247 204 233 189 225 curveto 164 210 145 196 134 180 curveto 123 165 117 147 117 128 curveto 117 105 124 86 138 70 curveto 152 55 168 47 187 47 curveto 211 47 244 63 284 96 curveto closepath fill } bind def /glyph29 { 500 0 -2 -13 465 694 setcachedevice 153 370 moveto 197 430 243 460 293 460 curveto 339 460 379 441 414 401 curveto 448 362 465 309 465 240 curveto 465 161 439 97 386 48 curveto 341 7 291 -13 234 -13 curveto 208 -13 182 -8 155 0 curveto 128 9 101 23 73 42 curveto 73 506 lineto 73 557 72 588 69 600 curveto 67 611 63 619 58 624 curveto 53 628 46 630 38 630 curveto 29 630 18 627 4 622 curveto -2 639 lineto 131 694 lineto 153 694 lineto 153 370 lineto closepath 153 338 moveto 153 71 lineto 170 55 187 42 205 34 curveto 223 26 241 21 259 21 curveto 289 21 316 38 342 70 curveto 368 103 380 150 380 212 curveto 380 270 368 314 342 345 curveto 317 375 288 391 255 391 curveto 238 391 221 387 203 377 curveto 190 371 174 358 153 338 curveto closepath fill } bind def /glyph30 { 443 0 34 -13 411 460 setcachedevice 411 169 moveto 399 111 375 65 340 34 curveto 305 2 266 -13 223 -13 curveto 173 -13 128 7 90 50 curveto 53 92 34 150 34 223 curveto 34 293 55 350 97 394 curveto 138 438 188 460 247 460 curveto 291 460 327 449 355 425 curveto 384 402 398 378 398 353 curveto 398 340 395 331 386 323 curveto 378 315 367 311 353 311 curveto 333 311 319 317 309 330 curveto 304 336 300 350 298 369 curveto 297 388 290 402 278 413 curveto 267 422 251 427 231 427 curveto 199 427 172 416 152 391 curveto 126 359 113 317 113 265 curveto 113 211 126 165 152 124 curveto 178 83 214 62 258 62 curveto 290 62 319 73 344 95 curveto 362 110 379 137 396 176 curveto 411 169 lineto closepath fill } bind def /glyph31 { 500 0 33 -13 502 694 setcachedevice 347 50 moveto 325 27 304 11 283 1 curveto 262 -8 240 -13 215 -13 curveto 167 -13 124 6 87 47 curveto 51 88 33 141 33 205 curveto 33 269 53 328 93 381 curveto 134 434 186 460 249 460 curveto 289 460 321 448 347 423 curveto 347 505 lineto 347 557 346 588 343 600 curveto 341 611 337 619 332 624 curveto 327 628 320 630 312 630 curveto 304 630 292 627 278 622 curveto 272 639 lineto 405 694 lineto 427 694 lineto 427 177 lineto 427 125 429 93 431 81 curveto 434 70 437 62 443 57 curveto 448 52 454 50 461 50 curveto 470 50 482 53 497 58 curveto 502 41 lineto 369 -13 lineto 347 -13 lineto 347 50 lineto closepath 347 84 moveto 347 314 lineto 345 336 339 357 329 375 curveto 320 393 307 407 291 416 curveto 274 426 259 430 243 430 curveto 215 430 189 417 166 392 curveto 137 358 122 309 122 243 curveto 122 178 136 127 165 92 curveto 194 58 226 40 261 40 curveto 291 40 319 54 347 84 curveto closepath fill } bind def /glyph32 { 443 0 37 -13 415 460 setcachedevice 106 278 moveto 106 212 122 160 154 122 curveto 187 84 225 65 269 65 curveto 298 65 324 74 346 90 curveto 367 106 385 133 400 172 curveto 415 163 lineto 409 118 389 78 355 41 curveto 323 4 282 -13 232 -13 curveto 179 -13 133 7 94 49 curveto 56 90 37 146 37 217 curveto 37 294 56 354 96 396 curveto 135 439 184 460 243 460 curveto 293 460 334 444 367 411 curveto 399 378 415 334 415 278 curveto 106 278 lineto closepath 106 307 moveto 313 307 lineto 312 335 308 355 303 367 curveto 295 385 283 400 267 410 curveto 250 420 234 426 216 426 curveto 189 426 165 416 144 395 curveto 123 374 110 344 106 307 curveto closepath fill } bind def /glyph33 { 333 0 38 0 434 693 setcachedevice 206 412 moveto 206 118 lineto 206 76 210 50 219 39 curveto 231 24 248 17 268 17 curveto 308 17 lineto 308 0 lineto 41 0 lineto 41 17 lineto 61 17 lineto 74 17 86 20 97 27 curveto 107 33 115 42 119 53 curveto 123 64 125 86 125 118 curveto 125 412 lineto 38 412 lineto 38 447 lineto 125 447 lineto 125 476 lineto 125 520 132 559 146 589 curveto 161 620 183 645 212 665 curveto 242 684 275 693 312 693 curveto 346 693 377 682 406 660 curveto 425 645 434 629 434 610 curveto 434 601 430 592 421 583 curveto 413 575 404 570 394 570 curveto 387 570 379 573 371 578 curveto 362 583 352 595 340 613 curveto 328 630 317 642 307 648 curveto 297 655 286 658 273 658 curveto 258 658 246 654 235 646 curveto 225 638 217 626 212 609 curveto 208 592 206 549 206 479 curveto 206 447 lineto 321 447 lineto 321 412 lineto 206 412 lineto closepath fill } bind def /glyph34 { 500 0 29 -215 481 460 setcachedevice 150 163 moveto 124 176 103 195 87 219 curveto 73 243 65 269 65 298 curveto 65 342 82 380 116 412 curveto 149 444 191 460 244 460 curveto 286 460 323 450 354 429 curveto 449 429 lineto 463 429 471 429 474 428 curveto 476 427 478 426 479 423 curveto 480 421 481 416 481 408 curveto 481 399 481 394 479 390 curveto 479 389 477 388 474 386 curveto 472 386 463 385 449 385 curveto 391 385 lineto 409 362 418 332 418 295 curveto 418 253 403 218 371 188 curveto 339 159 296 144 242 144 curveto 220 144 198 147 174 153 curveto 160 141 151 130 145 121 curveto 141 112 138 104 138 97 curveto 138 92 141 86 146 81 curveto 151 76 162 72 177 70 curveto 187 69 209 68 246 66 curveto 312 65 356 63 376 60 curveto 406 56 431 44 449 26 curveto 467 8 476 -14 476 -41 curveto 476 -77 458 -111 424 -144 curveto 374 -191 307 -215 225 -215 curveto 163 -215 109 -201 66 -173 curveto 42 -157 29 -140 29 -122 curveto 29 -114 31 -106 35 -99 curveto 40 -86 52 -70 69 -48 curveto 71 -45 88 -28 119 3 curveto 102 14 90 22 83 31 curveto 76 39 72 47 72 58 curveto 72 69 77 83 86 98 curveto 96 113 117 135 150 163 curveto closepath 235 437 moveto 211 437 191 427 175 408 curveto 159 389 150 359 150 319 curveto 150 268 162 229 184 200 curveto 201 179 222 167 248 167 curveto 273 167 293 177 309 195 curveto 325 214 333 243 333 283 curveto 333 334 322 375 299 404 curveto 283 426 262 437 235 437 curveto closepath 145 0 moveto 130 -16 119 -31 111 -45 curveto 104 -60 99 -73 99 -85 curveto 99 -101 108 -114 127 -126 curveto 160 -146 207 -157 269 -157 curveto 327 -157 371 -146 398 -125 curveto 426 -105 440 -83 440 -60 curveto 440 -42 432 -31 415 -23 curveto 398 -16 365 -12 314 -11 curveto 242 -9 185 -5 145 0 curveto closepath fill } bind def /glyph35 { 500 0 6 0 493 694 setcachedevice 162 694 moveto 162 367 lineto 198 406 227 432 248 443 curveto 269 455 291 460 312 460 curveto 337 460 359 453 377 439 curveto 395 425 409 403 417 373 curveto 424 353 427 314 427 259 curveto 427 101 lineto 427 73 429 53 434 42 curveto 437 35 442 29 450 24 curveto 458 20 472 17 493 17 curveto 493 0 lineto 273 0 lineto 273 17 lineto 284 17 lineto 305 17 319 20 327 27 curveto 335 33 341 42 344 55 curveto 345 60 346 75 346 101 curveto 346 259 lineto 346 308 344 340 338 355 curveto 333 370 325 382 314 390 curveto 303 397 290 401 274 401 curveto 258 401 242 397 224 388 curveto 207 380 187 363 162 337 curveto 162 101 lineto 162 70 164 51 167 43 curveto 171 36 177 30 187 25 curveto 196 20 211 17 234 17 curveto 234 0 lineto 13 0 lineto 13 17 lineto 33 17 48 20 60 26 curveto 66 30 71 36 75 45 curveto 79 54 81 73 81 101 curveto 81 505 lineto 81 557 80 588 78 600 curveto 75 611 72 619 66 624 curveto 62 628 55 630 46 630 curveto 40 630 28 627 13 622 curveto 6 639 lineto 140 694 lineto 162 694 lineto closepath fill } bind def /glyph36 { 277 0 29 0 253 694 setcachedevice 145 694 moveto 158 694 170 689 180 680 curveto 189 670 194 659 194 645 curveto 194 631 189 620 180 609 curveto 170 600 159 595 145 595 curveto 131 595 120 600 109 609 curveto 100 619 95 631 95 645 curveto 95 658 100 670 109 680 curveto 119 689 130 694 145 694 curveto closepath 185 460 moveto 185 101 lineto 185 73 187 54 191 45 curveto 195 36 201 29 209 24 curveto 217 20 232 17 253 17 curveto 253 0 lineto 36 0 lineto 36 17 lineto 58 17 72 19 80 23 curveto 87 28 93 35 98 44 curveto 102 54 104 73 104 101 curveto 104 273 lineto 104 321 103 353 100 367 curveto 98 377 94 385 89 389 curveto 84 393 78 395 69 395 curveto 60 395 49 393 36 388 curveto 29 405 lineto 164 460 lineto 185 460 lineto closepath fill } bind def /glyph37 { 500 0 8 0 505 694 setcachedevice 163 694 moveto 163 249 lineto 277 353 lineto 301 375 315 389 319 395 curveto 321 398 323 402 323 406 curveto 323 413 320 418 315 423 curveto 310 428 301 431 288 431 curveto 288 447 lineto 482 447 lineto 482 431 lineto 456 431 434 427 416 419 curveto 398 412 379 398 357 379 curveto 243 273 lineto 357 128 lineto 389 88 411 63 422 52 curveto 437 37 451 27 463 22 curveto 471 19 485 17 505 17 curveto 505 0 lineto 288 0 lineto 288 17 lineto 300 18 309 20 313 23 curveto 318 26 320 31 320 37 curveto 320 44 313 57 300 73 curveto 163 249 lineto 163 100 lineto 163 71 165 52 169 43 curveto 173 34 179 28 187 23 curveto 194 20 210 18 235 17 curveto 235 0 lineto 8 0 lineto 8 17 lineto 31 17 48 20 59 25 curveto 66 29 71 35 75 42 curveto 80 53 82 71 82 98 curveto 82 505 lineto 82 557 81 588 79 600 curveto 77 611 73 620 67 624 curveto 62 628 56 630 47 630 curveto 41 630 30 628 16 622 curveto 8 639 lineto 141 694 lineto 163 694 lineto closepath fill } bind def /glyph38 { 277 0 29 0 257 694 setcachedevice 185 694 moveto 185 101 lineto 185 73 187 54 191 45 curveto 195 36 201 29 209 24 curveto 218 20 234 17 257 17 curveto 257 0 lineto 38 0 lineto 38 17 lineto 58 17 72 19 80 23 curveto 87 28 93 35 97 44 curveto 102 54 104 73 104 101 curveto 104 507 lineto 104 557 103 588 100 600 curveto 98 611 95 619 89 624 curveto 84 628 78 630 70 630 curveto 62 630 51 627 38 622 curveto 29 639 lineto 163 694 lineto 185 694 lineto closepath fill } bind def /glyph39 { 777 0 8 0 773 460 setcachedevice 164 365 moveto 196 397 215 416 221 421 curveto 236 433 251 443 269 450 curveto 286 457 302 460 319 460 curveto 347 460 371 452 391 436 curveto 411 419 425 396 432 365 curveto 465 404 494 430 517 442 curveto 540 454 563 460 588 460 curveto 612 460 633 454 651 442 curveto 669 430 684 410 695 382 curveto 702 363 706 333 706 293 curveto 706 101 lineto 706 73 708 54 712 43 curveto 715 36 721 30 730 25 curveto 739 20 753 17 773 17 curveto 773 0 lineto 552 0 lineto 552 17 lineto 562 17 lineto 581 17 596 21 606 28 curveto 614 34 619 42 623 53 curveto 624 59 625 75 625 101 curveto 625 293 lineto 625 330 621 355 611 370 curveto 599 391 579 401 550 401 curveto 533 401 516 397 499 389 curveto 481 380 460 364 435 340 curveto 434 335 lineto 435 314 lineto 435 101 lineto 435 70 437 51 440 43 curveto 444 36 450 30 459 25 curveto 469 20 485 17 508 17 curveto 508 0 lineto 282 0 lineto 282 17 lineto 307 17 324 20 333 26 curveto 342 32 349 41 352 52 curveto 354 58 354 74 354 101 curveto 354 293 lineto 354 330 350 355 338 372 curveto 324 393 304 403 278 403 curveto 261 403 244 398 226 389 curveto 199 375 179 358 164 340 curveto 164 101 lineto 164 72 166 53 170 43 curveto 174 35 180 28 188 24 curveto 196 20 212 17 236 17 curveto 236 0 lineto 15 0 lineto 15 17 lineto 36 17 50 20 58 24 curveto 66 28 72 35 77 45 curveto 81 54 83 73 83 101 curveto 83 271 lineto 83 321 82 353 79 367 curveto 77 377 73 385 68 389 curveto 63 393 57 395 48 395 curveto 39 395 28 393 15 388 curveto 8 405 lineto 143 460 lineto 164 460 lineto 164 365 lineto closepath fill } bind def /glyph40 { 500 0 5 0 495 460 setcachedevice 161 365 moveto 213 428 264 460 311 460 curveto 335 460 356 454 374 442 curveto 392 430 406 410 416 381 curveto 423 362 427 332 427 291 curveto 427 101 lineto 427 73 429 53 434 43 curveto 437 35 443 29 451 24 curveto 459 20 474 17 495 17 curveto 495 0 lineto 274 0 lineto 274 17 lineto 283 17 lineto 304 17 319 20 327 27 curveto 335 33 341 42 344 55 curveto 346 60 346 75 346 101 curveto 346 284 lineto 346 324 341 354 331 373 curveto 320 391 302 400 277 400 curveto 238 400 200 379 161 336 curveto 161 101 lineto 161 71 163 52 166 44 curveto 171 35 177 28 186 24 curveto 193 20 209 17 234 17 curveto 234 0 lineto 13 0 lineto 13 17 lineto 22 17 lineto 45 17 61 23 69 35 curveto 77 46 81 68 81 101 curveto 81 267 lineto 81 320 80 353 77 365 curveto 75 376 71 384 66 389 curveto 61 393 54 395 45 395 curveto 37 395 26 393 13 388 curveto 5 405 lineto 140 460 lineto 161 460 lineto 161 365 lineto closepath fill } bind def /glyph41 { 500 0 33 -13 465 460 setcachedevice 250 460 moveto 317 460 372 435 413 383 curveto 447 339 465 289 465 231 curveto 465 192 456 151 436 110 curveto 417 69 391 38 357 17 curveto 323 -2 286 -13 244 -13 curveto 177 -13 124 13 83 66 curveto 50 112 33 163 33 219 curveto 33 260 43 301 64 341 curveto 84 382 111 412 144 431 curveto 177 450 212 460 250 460 curveto closepath 234 428 moveto 217 428 200 423 183 413 curveto 166 403 151 385 140 359 curveto 130 333 124 300 124 260 curveto 124 195 137 139 163 91 curveto 189 44 223 20 265 20 curveto 297 20 323 34 343 60 curveto 364 85 374 130 374 194 curveto 374 273 357 336 323 381 curveto 300 413 270 428 234 428 curveto closepath fill } bind def /glyph42 { 500 0 -3 -213 465 460 setcachedevice 0 402 moveto 136 458 lineto 155 458 lineto 155 354 lineto 178 393 201 420 225 437 curveto 248 452 272 460 298 460 curveto 343 460 380 443 410 407 curveto 447 365 465 309 465 239 curveto 465 163 443 99 399 48 curveto 363 7 317 -13 261 -13 curveto 237 -13 217 -10 199 -3 curveto 186 1 171 11 155 25 curveto 155 -110 lineto 155 -140 157 -160 161 -168 curveto 164 -176 171 -183 180 -187 curveto 189 -192 206 -195 230 -195 curveto 230 -213 lineto -3 -213 lineto -3 -195 lineto 8 -195 lineto 26 -195 41 -192 54 -185 curveto 61 -182 65 -176 69 -167 curveto 72 -160 74 -140 74 -107 curveto 74 315 lineto 74 344 73 362 70 370 curveto 67 378 63 384 58 388 curveto 52 392 44 394 34 394 curveto 27 394 17 392 4 387 curveto 0 402 lineto closepath 155 325 moveto 155 158 lineto 155 122 156 98 159 86 curveto 164 68 175 51 193 37 curveto 210 22 233 15 260 15 curveto 292 15 319 28 339 53 curveto 365 86 378 133 378 193 curveto 378 262 364 314 333 351 curveto 313 376 288 389 259 389 curveto 244 389 229 386 213 377 curveto 202 372 182 354 155 325 curveto closepath fill } bind def /glyph43 { 333 0 6 0 339 460 setcachedevice 162 460 moveto 162 359 lineto 199 426 237 460 277 460 curveto 295 460 310 455 321 444 curveto 333 433 339 420 339 406 curveto 339 394 335 383 326 374 curveto 318 365 308 360 296 360 curveto 285 360 272 366 258 377 curveto 244 389 233 394 226 394 curveto 221 394 214 391 207 384 curveto 193 371 178 349 162 318 curveto 162 104 lineto 162 80 165 61 171 48 curveto 175 40 183 32 193 26 curveto 204 20 220 17 240 17 curveto 240 0 lineto 11 0 lineto 11 17 lineto 34 17 50 20 62 28 curveto 70 33 75 41 79 53 curveto 80 58 81 74 81 100 curveto 81 273 lineto 81 326 81 356 78 367 curveto 76 376 72 384 66 388 curveto 61 393 54 395 45 395 curveto 35 395 24 393 11 388 curveto 6 405 lineto 141 460 lineto 162 460 lineto closepath fill } bind def /glyph44 { 389 0 48 -13 354 460 setcachedevice 320 460 moveto 320 308 lineto 304 308 lineto 291 355 276 388 256 405 curveto 237 422 212 431 182 431 curveto 160 431 141 425 127 413 curveto 113 401 106 388 106 373 curveto 106 355 111 339 122 326 curveto 132 313 152 299 183 284 curveto 254 249 lineto 320 217 354 175 354 122 curveto 354 81 338 48 308 23 curveto 277 0 243 -13 204 -13 curveto 177 -13 146 -8 110 0 curveto 100 4 91 5 84 5 curveto 77 5 71 1 66 -6 curveto 50 -6 lineto 50 152 lineto 66 152 lineto 76 107 93 73 119 49 curveto 145 26 173 15 205 15 curveto 228 15 246 21 260 35 curveto 274 48 281 63 281 82 curveto 281 104 274 124 258 139 curveto 242 154 210 173 163 197 curveto 116 220 85 241 70 260 curveto 56 279 48 302 48 331 curveto 48 367 61 398 86 423 curveto 111 448 144 460 184 460 curveto 202 460 223 457 248 449 curveto 265 444 276 441 281 441 curveto 287 441 291 442 293 445 curveto 296 447 300 452 304 460 curveto 320 460 lineto closepath fill } bind def /glyph45 { 277 0 9 -7 279 594 setcachedevice 161 594 moveto 161 447 lineto 265 447 lineto 265 413 lineto 161 413 lineto 161 123 lineto 161 94 165 74 173 64 curveto 182 54 192 49 205 49 curveto 216 49 226 52 236 59 curveto 247 65 254 75 260 88 curveto 279 88 lineto 268 57 251 33 230 17 curveto 210 0 188 -7 166 -7 curveto 151 -7 137 -2 122 5 curveto 108 13 98 25 90 41 curveto 84 56 80 80 80 112 curveto 80 413 lineto 9 413 lineto 9 429 lineto 27 436 45 448 64 465 curveto 83 482 100 502 114 526 curveto 122 538 132 561 145 594 curveto 161 594 lineto closepath fill } bind def /glyph46 { 500 0 0 -13 498 447 setcachedevice 423 447 moveto 423 176 lineto 423 125 424 93 427 81 curveto 429 70 433 62 438 57 curveto 444 52 450 50 457 50 curveto 467 50 479 53 491 58 curveto 498 41 lineto 364 -13 lineto 342 -13 lineto 342 81 lineto 304 39 275 13 254 2 curveto 234 -7 213 -13 190 -13 curveto 166 -13 144 -6 125 8 curveto 107 22 94 41 87 63 curveto 80 86 76 119 76 160 curveto 76 360 lineto 76 381 74 395 69 404 curveto 65 412 59 418 49 423 curveto 41 427 24 429 0 429 curveto 0 447 lineto 157 447 lineto 157 147 lineto 157 106 165 79 179 65 curveto 193 53 211 46 231 46 curveto 246 46 261 50 279 59 curveto 297 68 318 84 342 109 curveto 342 363 lineto 342 388 338 405 329 415 curveto 319 423 300 428 270 429 curveto 270 447 lineto 423 447 lineto closepath fill } bind def /glyph47 { 500 0 8 -13 490 447 setcachedevice 8 447 moveto 218 447 lineto 218 429 lineto 205 429 lineto 192 429 183 426 176 419 curveto 169 414 166 405 166 395 curveto 166 383 169 370 176 354 curveto 280 107 lineto 384 363 lineto 392 381 395 395 395 405 curveto 395 409 395 413 392 416 curveto 388 421 384 424 378 426 curveto 373 428 361 429 344 429 curveto 344 447 lineto 490 447 lineto 490 429 lineto 474 428 462 424 455 418 curveto 444 409 434 393 424 370 curveto 266 -13 lineto 246 -13 lineto 86 363 lineto 79 381 72 394 65 401 curveto 59 409 51 415 41 420 curveto 35 423 24 426 8 429 curveto 8 447 lineto closepath fill } bind def /glyph48 { 722 0 6 -13 712 447 setcachedevice 6 447 moveto 193 447 lineto 193 429 lineto 176 428 165 425 160 419 curveto 154 415 151 408 151 398 curveto 151 389 154 376 160 362 curveto 255 104 lineto 352 314 lineto 326 380 lineto 319 399 309 413 295 420 curveto 289 425 275 428 255 429 curveto 255 447 lineto 468 447 lineto 468 429 lineto 445 428 429 424 418 416 curveto 412 411 409 403 409 391 curveto 409 385 410 378 413 371 curveto 514 114 lineto 608 362 lineto 615 379 618 394 618 404 curveto 618 410 615 416 609 420 curveto 603 425 590 428 571 429 curveto 571 447 lineto 712 447 lineto 712 429 lineto 685 425 664 406 650 371 curveto 500 -13 lineto 480 -13 lineto 369 271 lineto 238 -13 lineto 220 -13 lineto 77 362 lineto 67 386 58 402 49 410 curveto 40 418 26 424 6 429 curveto 6 447 lineto closepath fill } bind def /glyph49 { 500 0 13 0 487 447 setcachedevice 13 447 moveto 223 447 lineto 223 429 lineto 210 429 201 427 195 422 curveto 190 417 187 412 187 404 curveto 187 396 193 384 204 368 curveto 208 363 213 354 220 343 curveto 252 292 lineto 289 343 lineto 312 375 324 396 324 404 curveto 324 411 321 417 315 422 curveto 310 426 301 429 289 429 curveto 289 447 lineto 440 447 lineto 440 429 lineto 424 428 411 424 398 416 curveto 383 405 361 381 333 343 curveto 272 262 lineto 383 102 lineto 411 62 430 39 442 31 curveto 454 23 469 19 487 17 curveto 487 0 lineto 276 0 lineto 276 17 lineto 291 17 302 20 311 27 curveto 317 31 320 38 320 45 curveto 320 52 310 71 289 102 curveto 223 197 lineto 151 102 lineto 129 72 118 55 118 49 curveto 118 41 122 34 129 28 curveto 137 21 147 18 162 17 curveto 162 0 lineto 16 0 lineto 16 17 lineto 28 19 38 23 47 29 curveto 59 39 80 63 109 102 curveto 203 226 lineto 118 349 lineto 94 384 76 406 62 416 curveto 49 424 33 429 13 429 curveto 13 447 lineto closepath fill } bind def /glyph50 { 500 0 5 -215 494 447 setcachedevice 5 447 moveto 214 447 lineto 214 429 lineto 204 429 lineto 189 429 178 426 171 419 curveto 164 413 160 405 160 395 curveto 160 383 165 366 176 343 curveto 285 117 lineto 385 364 lineto 390 377 393 391 393 404 curveto 393 410 392 414 390 417 curveto 387 420 383 423 377 426 curveto 372 428 362 429 348 429 curveto 348 447 lineto 494 447 lineto 494 429 lineto 482 428 473 425 466 421 curveto 459 417 453 410 444 399 curveto 442 395 436 382 428 361 curveto 246 -84 lineto 229 -127 206 -160 177 -182 curveto 148 -204 121 -215 94 -215 curveto 75 -215 60 -209 47 -198 curveto 35 -187 28 -175 28 -161 curveto 28 -147 33 -136 42 -127 curveto 51 -119 63 -115 79 -115 curveto 89 -115 104 -119 123 -126 curveto 136 -130 144 -133 147 -133 curveto 157 -133 167 -128 179 -118 curveto 190 -108 202 -88 214 -60 curveto 246 17 lineto 85 354 lineto 81 365 73 377 62 392 curveto 54 403 47 411 41 415 curveto 34 420 22 425 5 429 curveto 5 447 lineto closepath fill } bind def end /BuildGlyph { exch /CharProcs get exch 2 copy known not {pop /.notdef} if get exec } bind def /BuildChar { 1 index /Encoding get exch get 1 index /BuildGlyph get exec } bind def currentdict end (TimesNewRomanPSMTHGSet2) cvn exch definefont pop %%EndResource %%DocumentSuppliedResources: font TimesNewRomanPSMTHGSet2 /#copies 1 def << /NumCopies null /Policies << /NumCopies 1 >> >> setpagedevice %%EndSetup %%Page: 1 1 %%PageBoundingBox: 18 18 594 774 %%BeginPageSetup % [{ %%BeginFeature: *PageSize Letter <> setpagedevice %%EndFeature } stopped cleartomark gsave [ 0 0.24 0.24 0 18 18] concat gsave %%EndPageSetup 76 112 moveto 0 0 0 setrgbcolor (TimesNewRomanPSMTHGSet2) cvn findfont 42 -42 matrix scale makefont setfont <01020304050607080509070A0302030B030C020D050A0C0E050F101112131405060708150C130E 09> [29 21 10 21 10 21 18 20 10 21 18 14 11 21 10 12 11 20 21 16 10 14 20 13 10 23 27 11 37 18 18 10 21 18 20 21 20 18 14 0] xshow 170 250 moveto <1617> [23 0] xshow 151 296 moveto <1807191A> [29 18 12 0] xshow 399 250 moveto <161B> [23 0] xshow 357 296 moveto <1C070A0E070D1D> [28 18 13 14 18 15 0] xshow 629 250 moveto <161E> [22 0] xshow 591 296 moveto <1F201521030B> [23 21 20 31 11 0] xshow 860 250 moveto <1622> [23 0] xshow 811 296 moveto <0F0E0C230E1321> [22 14 20 20 14 18 0] xshow 1203 250 moveto <1624> [23 0] xshow 1191 296 moveto <250C23> [25 20 0] xshow 1434 250 moveto <1626> [22 0] xshow 1398 296 moveto <25030D0B030223> [25 12 15 12 11 21 0] xshow 1666 250 moveto <1627> [22 0] xshow 1650 296 moveto <2807040B> [25 17 22 0] xshow 1897 250 moveto <1629> [23 0] xshow 1876 296 moveto <1F1D071919> [22 21 18 12 0] xshow 2248 250 moveto <162A> [23 0] xshow 2225 296 moveto <2B03072C> [30 11 18 0] xshow 2469 250 moveto <16172D> [22 20 0] xshow 2404 296 moveto <250C232E280C23231907> [25 20 20 14 25 20 20 20 12 0] xshow 2701 250 moveto <161717> [23 19 0] xshow 2641 296 moveto <160319072E0B081A072E1B> [23 10 12 18 14 12 19 21 18 13 0] xshow 2930 250 moveto <16171B> [23 20 0] xshow 2910 296 moveto <2F0E131A1D> [29 14 18 20 0] xshow 76 430 moveto <0F10050607080509070A0302030B030C020D050A0C0E050F101112131405060708150C130E09> [23 27 10 21 18 20 10 21 18 14 10 21 11 12 11 20 21 16 10 14 20 13 10 23 27 11 37 18 18 10 21 18 20 21 20 18 14 0] xshow 170 568 moveto <1617> [23 0] xshow 151 614 moveto <1807191A> [29 18 12 0] xshow 399 568 moveto <161B> [23 0] xshow 357 614 moveto <1C070A0E070D1D> [28 18 13 14 18 15 0] xshow 629 568 moveto <161E> [22 0] xshow 608 614 moveto <1F1D071919> [23 21 18 11 0] xshow 860 568 moveto <1622> [23 0] xshow 844 614 moveto <2807040B> [25 17 22 0] xshow 1203 568 moveto <1624> [23 0] xshow 1154 614 moveto <0F0E0C230E1321> [22 14 20 20 14 17 0] xshow 1434 568 moveto <1626> [22 0] xshow 1423 614 moveto <250C23> [25 20 0] xshow 1666 568 moveto <1627> [22 0] xshow 1624 614 moveto <25030D0B03022305> [25 11 15 12 11 21 20 0] xshow 1897 568 moveto <1629> [23 0] xshow 1860 614 moveto <1F201521030B> [23 20 20 32 11 0] xshow 2248 568 moveto <162A> [23 0] xshow 2225 614 moveto <2B03072C> [30 11 18 0] xshow 2469 568 moveto <16172D> [22 20 0] xshow 2404 614 moveto <250C232E280C23231907> [25 20 20 14 25 20 20 20 12 0] xshow 2701 568 moveto <161717> [23 19 0] xshow 2641 614 moveto <160319072E0B081A072E1B> [23 10 12 18 14 12 19 21 18 13 0] xshow 2930 568 moveto <16171B> [23 20 0] xshow 2910 614 moveto <2F0E131A1D> [29 14 18 20 0] xshow 76 748 moveto <01020304050607080509070A0302030B030C020D050A0C0E05281D0302061A130905060708150C 130E09> [29 21 10 21 10 21 18 20 10 21 18 14 11 21 10 12 11 20 21 16 10 14 20 13 10 25 21 11 20 21 21 18 20 10 21 18 20 21 20 18 14 0] xshow 220 886 moveto <161B> [23 0] xshow 178 932 moveto <1C070A0E070D1D> [28 18 13 14 18 15 0] xshow 551 886 moveto <161E> [23 0] xshow 514 932 moveto <1F201521030B> [22 21 20 32 11 0] xshow 882 886 moveto <1622> [23 0] xshow 839 929 moveto (TimesNewRomanPSMTHGSet2) cvn findfont 38 -38 matrix scale makefont setfont <0F0E0C230E1321> [21 12 19 19 12 17 0] xshow 1392 886 moveto (TimesNewRomanPSMTHGSet2) cvn findfont 42 -42 matrix scale makefont setfont <1624> [23 0] xshow 1380 932 moveto <250C23> [25 20 0] xshow 1723 886 moveto <1626> [23 0] xshow 1687 932 moveto <25030D0B030223> [25 11 15 13 10 21 0] xshow 2056 886 moveto <1627> [23 0] xshow 2040 932 moveto <2807040B> [25 17 22 0] xshow 2389 886 moveto <1629> [23 0] xshow 2368 932 moveto <1F1D071919> [23 21 18 11 0] xshow 2890 886 moveto <162A> [22 0] xshow 2868 932 moveto <2B03072C> [30 11 18 0] xshow 76 1066 moveto <0F10050607080509070A0302030B030C020D050A0C0E05281D0302061A130905060708150C130E 09> [23 27 10 21 18 20 10 21 18 14 10 21 11 12 11 20 21 16 10 14 20 13 10 25 21 10 21 21 21 18 20 10 21 18 20 20 21 18 14 0] xshow 220 1204 moveto <161B> [23 0] xshow 178 1250 moveto <1C070A0E070D1D> [28 18 13 14 18 15 0] xshow 551 1204 moveto <161E> [23 0] xshow 530 1250 moveto <1F1D071919> [22 21 18 11 0] xshow 882 1204 moveto <1622> [23 0] xshow 866 1250 moveto <2807040B> [24 18 21 0] xshow 1392 1204 moveto <1624> [23 0] xshow 1348 1247 moveto (TimesNewRomanPSMTHGSet2) cvn findfont 38 -38 matrix scale makefont setfont <0F0E0C230E1321> [22 12 19 19 12 17 0] xshow 1723 1204 moveto (TimesNewRomanPSMTHGSet2) cvn findfont 42 -42 matrix scale makefont setfont <1626> [23 0] xshow 1712 1250 moveto <250C23> [25 20 0] xshow 2056 1204 moveto <1627> [23 0] xshow 2020 1250 moveto <25030D0B030223> [25 11 15 12 11 21 0] xshow 2389 1204 moveto <1629> [23 0] xshow 2351 1250 moveto <1F201521030B> [22 21 20 32 11 0] xshow 2890 1204 moveto <162A> [22 0] xshow 2868 1250 moveto <2B03072C> [30 11 18 0] xshow 76 1384 moveto <01020304050607080509070A0302030B030C020D050A0C0E051F200205060708150C130E090530 14200B050C200B050B1D070502202115070E070905150C04070D05130209051907133107050B1D07 050903310309070E0D0515070B2C0707020516221116240513020905162911162A32> [29 21 10 21 10 21 18 20 10 21 18 14 11 21 10 12 11 20 21 16 10 14 20 13 10 23 20 20 10 21 18 20 20 20 18 14 21 10 14 18 21 11 10 20 20 12 10 12 20 18 10 20 21 31 20 18 14 18 20 10 20 20 22 18 15 10 18 21 20 10 12 18 18 20 19 10 11 21 18 10 21 11 20 11 21 18 14 16 10 20 18 12 29 18 18 20 10 23 21 11 22 20 10 18 21 20 10 23 20 10 23 21 0] xshow 170 1568 moveto <1617> [23 0] xshow 399 1568 moveto <161B> [23 0] xshow 629 1568 moveto <161E> [22 0] xshow 860 1568 moveto <1622> [23 0] xshow 1203 1568 moveto <1624> [23 0] xshow 1434 1568 moveto <1626> [22 0] xshow 1666 1568 moveto <1627> [22 0] xshow 1897 1568 moveto <1629> [23 0] xshow 2248 1568 moveto <162A> [23 0] xshow 2469 1568 moveto <16172D> [22 20 0] xshow 2701 1568 moveto <161717> [23 19 0] xshow 2930 1568 moveto <16171B> [23 20 0] xshow 76 1745 moveto <0505050505050505> [10 10 10 10 10 10 10 0] xshow 156 1745 moveto <1807191A0505050505050505050505051C070A0E070D1D05050505050505050505051F20152103 0B050505050505050505050F0E0C230E132105050505050505050505050505050505050505050505 0505250C23050505050505050505050505050525030D0B0302230505050505050505050505050528 07040B0505050505050505050505050505051F1D0719190505050505050505050505050505050505 050505050505052B03072C0B131519070505050505250C232E280C2323190705050505160319072E 0B> [30 18 12 20 10 10 10 10 10 10 10 10 10 10 10 10 27 18 14 13 18 15 21 10 10 10 10 10 10 10 10 10 10 10 23 21 19 32 11 12 10 10 10 10 10 10 10 10 10 10 23 13 20 20 14 18 32 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 25 20 20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 25 12 15 12 11 21 20 10 10 10 10 10 10 10 10 10 10 10 10 10 25 17 22 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 23 21 17 12 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 30 11 18 29 12 18 20 13 18 10 10 10 10 10 25 20 20 14 25 20 20 20 11 18 10 10 10 10 24 10 12 18 13 0] xshow 2730 1745 moveto <081A072E1B05050505052B03072C230E131A1D> [20 21 17 14 20 10 10 10 10 10 30 11 18 29 20 14 18 21 0] xshow 76 1837 moveto <0F10050607080509070A0302030B030C020D050A0C0E051F200205060708150C130E0905301420 0B050C200B050B1D070502202115070E070905150C04070D05130209051907133107050B1D070509 03310309070E0D0515070B2C0707020516221116240513020905162911162A32> [23 27 10 21 18 20 10 21 18 14 10 21 11 12 11 20 21 16 10 14 20 13 10 23 20 20 10 21 18 20 20 20 18 14 21 10 14 18 21 11 10 20 20 12 10 12 20 18 10 20 21 32 19 18 14 18 20 10 20 20 22 18 15 10 18 21 20 10 12 18 18 20 19 10 12 20 18 10 21 11 20 11 21 18 14 16 10 20 18 12 29 18 18 20 10 23 21 11 22 20 10 18 20 21 10 23 20 11 22 21 0] xshow 170 2021 moveto <1617> [23 0] xshow 399 2021 moveto <161B> [23 0] xshow 629 2021 moveto <161E> [22 0] xshow 860 2021 moveto <1622> [23 0] xshow 1203 2021 moveto <1624> [23 0] xshow 1434 2021 moveto <1626> [22 0] xshow 1666 2021 moveto <1627> [22 0] xshow 1897 2021 moveto <1629> [23 0] xshow 2248 2021 moveto <162A> [23 0] xshow 2469 2021 moveto <16172D> [22 20 0] xshow 2701 2021 moveto <161717> [23 19 0] xshow 2930 2021 moveto <16171B> [23 20 0] xshow 76 2198 moveto <0505050505050505> [10 10 10 10 10 10 10 0] xshow 156 2198 moveto <1807191A0505050505050505050505051C070A0E070D1D0505050505050505050505051F1D0719 190505050505050505050505050505052807040B0505050505050505050505050505050505050505 050505050F0E0C230E132105050505050505050505050505250C2305050505050505050505050505 0525030D0B0302230505050505050505050505051F201521030B0505050505050505050505050505 050505050505052B03072C0B131519070505050505250C232E280C2323190705050505160319072E 0B> [30 18 12 20 10 10 10 10 10 10 10 10 10 10 10 10 27 18 14 13 18 15 21 10 10 10 10 10 10 10 10 10 10 10 10 23 21 18 11 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 25 17 22 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 22 14 20 20 14 18 32 10 10 10 10 10 10 10 10 10 10 10 10 10 25 20 20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 25 12 15 12 11 21 20 10 10 10 10 10 10 10 10 10 10 10 10 23 20 20 32 11 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 30 11 18 29 12 18 20 13 18 10 10 10 10 10 25 20 20 14 25 20 20 20 11 18 10 10 10 10 24 10 12 18 13 0] xshow 2730 2198 moveto <081A072E1B05050505052B03072C230E131A1D> [20 21 17 14 20 10 10 10 10 10 30 11 18 29 20 14 18 21 0] xshow 305 168 1 178 rectfill 534 168 1 178 rectfill 764 168 1 178 rectfill 997 168 1 178 rectfill 1108 168 1 178 rectfill 1339 168 1 178 rectfill 1571 168 1 178 rectfill 1801 168 1 178 rectfill 2034 168 1 178 rectfill 2153 168 1 178 rectfill 2384 168 1 178 rectfill 2616 168 1 178 rectfill 2846 168 1 178 rectfill 305 486 1 178 rectfill 534 486 1 178 rectfill 764 486 1 178 rectfill 997 486 1 178 rectfill 1108 486 1 178 rectfill 1339 486 1 178 rectfill 1571 486 1 178 rectfill 1801 486 1 178 rectfill 2034 486 1 178 rectfill 2153 486 1 178 rectfill 2384 486 1 178 rectfill 2616 486 1 178 rectfill 2846 486 1 178 rectfill 406 804 1 178 rectfill 737 804 1 178 rectfill 1069 804 1 178 rectfill 1247 804 1 178 rectfill 1578 804 1 178 rectfill 1909 804 1 178 rectfill 2244 804 1 178 rectfill 2575 804 1 178 rectfill 2747 804 1 178 rectfill 406 1122 1 178 rectfill 737 1122 1 178 rectfill 1069 1122 1 178 rectfill 1247 1122 1 178 rectfill 1578 1122 1 178 rectfill 1909 1122 1 178 rectfill 2244 1122 1 178 rectfill 2575 1122 1 178 rectfill 2747 1122 1 178 rectfill 305 1486 1 221 rectfill 534 1486 1 221 rectfill 764 1486 1 221 rectfill 997 1486 1 221 rectfill 1108 1486 1 221 rectfill 1339 1486 1 221 rectfill 1571 1486 1 221 rectfill 1801 1486 1 221 rectfill 2034 1486 1 221 rectfill 2153 1486 1 221 rectfill 2384 1486 1 221 rectfill 2616 1486 1 221 rectfill 2846 1486 1 221 rectfill 305 1939 1 221 rectfill 534 1939 1 221 rectfill 764 1939 1 221 rectfill 997 1939 1 221 rectfill 1108 1939 1 221 rectfill 1339 1939 1 221 rectfill 1571 1939 1 221 rectfill 1801 1939 1 221 rectfill 2034 1939 1 221 rectfill 2153 1939 1 221 rectfill 2384 1939 1 221 rectfill 2616 1939 1 221 rectfill 2846 1939 1 221 rectfill 75 168 1 178 rectfill 75 167 3000 1 rectfill 75 346 3000 1 rectfill 3074 168 1 178 rectfill 75 486 1 178 rectfill 75 485 3000 1 rectfill 75 664 3000 1 rectfill 3074 486 1 178 rectfill 75 804 1 178 rectfill 75 803 3000 1 rectfill 75 982 3000 1 rectfill 3074 804 1 178 rectfill 75 1122 1 178 rectfill 75 1121 3000 1 rectfill 75 1300 3000 1 rectfill 3074 1122 1 178 rectfill 75 1486 1 221 rectfill 75 1485 3000 1 rectfill 75 1707 3000 1 rectfill 3074 1486 1 221 rectfill 75 1939 1 221 rectfill 75 1938 3000 1 rectfill 75 2160 3000 1 rectfill 3074 1939 1 221 rectfill showpage grestore grestore %%PageTrailer %%Trailer %%BoundingBox: 0 0 612 792 %%Pages: 1 %%EOF ess/etc/backbug50000664000175000017500000000145212423756516012122 0ustar eddedd#!/bin/sh # ESS[BUGS]: 02/18/2004 # runs BUGS taking commands from command file # case `config.guess` in alpha*-dec-*) BUGS=bugs05.decalpha;; hppa*-hp-hpux*) BUGS=bugs05.hp;; i?86-pc-cygwin) BUGS=bugs05.exe;; i?86-*-freebsd*) BUGS=bugs05.freebsd;; powerpc*-*-*) BUGS=bugs05.rs6000;; sparc-sun-solaris*) BUGS=bugs05.sparc;; mips-sgi-irix*) BUGS=bugs05.sgi;; mips-dec-*) BUGS=bugs05.decmips;; esac case $# in 1) test -f bugs.bog && rm -f bugs.bog || true $BUGS bugs.buf bugs.bog bugs.out bugs.ind bugs1.out bugs1.ind $1 chmod -w bugs.bog ;; 2) test -f $1.bog && rm -f $1.bog || true $BUGS $1.buf $1.bog $1.out $1.ind ${1}1.out ${1}1.ind $2 chmod -w $1.bog ;; *) echo "usage: $0 [default_output_name] command_file";; esac ess/etc/slow-long-output.R0000664000175000017500000000437612613523406014115 0ustar eddedd### Example modified from Paul Johnson's post to ESS-help, Nov.25, 2013 op <- options("max.print") ##' construct (random) character vector of length n, of about 10 characters each mkCh <- function(n) { if(getOption("max.print") <= n) options(max.print = n + 1) ## <- if(n == 10) stop("error's message with apostrophe - work's in developer mode") N <- pmin(26,pmax(1, rpois(n, 10))) cbind(vapply(N, function(m) paste(sample(letters, m), collapse=""), "")) } set.seed(1) y <- mkCh(9999) system.time(print(y)) ## R CMD BATCH slow-long-output.R && grep -A 1 -B 1 '^ *user *sys' slow-long-output.Rout ## user system elapsed ## 0.059 0.010 0.070 -- MM@lynne R CMD BATCH ## 0.040 0.014 12.762 -- MM@lynne(2015) ESS 15.09-1 [git: dd226e2027..] ## 0.027 0.027 1.945 -- MM@lynne(2015) ESS 14.09 [svn: 6041] ## 0.120 0.138 3.225 -- MM@lynne(2013-12) ESS 13.09-1 [svn: 5930] ##--- ## 0.124 0.097 52.540 -- MM@lynne ESS svn r 5909; incl font-locking, tracebug ## 0.128 0.080 57.305 ditto ## 0.139 0.088 54.770 -- sfs@lynne ESS 13.09 (emacs 24.3.1 GTK+) ## -- ## 0.102 0.075 4.685 -- MM@lynne ESS 5.14 (emacs 24.3.1 incl font-lock!) ## 0.091 0.078 4.683 -- " ESS 12.04-4 [rev. 4896 (2012-06-07)] ## 0.123 0.063 4.638 -- " ESS 12.09-2 [rev. 5395 (2013-01-10)] ## 0.117 0.118 3.358 -- " ESS 13.05 [rev. 5574 (2013-05-14)] ## ^^^^^ clearly a bit faster ! set.seed(23456) y <- mkCh(50000) system.time(print(y)) ## user system elapsed ## 0.255 0.089 0.345 -- BATCH MM@lynne ## 0.035 0.138 27.935 -- MM@lynne(2015) ESS 15.09-1 [git: dd226e2027..] ## .... but sometimes also fast, or considerably slower: ## 0.049 0.112 1.037 ## 0.036 0.129 103.253 ## 0.157 0.107 11.356 -- MM@lynne(2015) ESS 14.09 [svn: 6041] ## 0.685 0.369 1664.557 -- MM@lynne ESS svn r 5909 ... ## 0.760 0.398 1643.608 -- ..@lynne ESS 13.09 ## 0.590 0.510 33.349 -- " ESS 13.05 [rev. 5574 (2013-05-14)] ## 0.565 0.548 28.251 " " ## 0.598 0.450 27.804 " " ## Don't even think of trying this with ESS, currently: y <- mkCh(200000) system.time(print(y)) ## user system elapsed ## 1.013 0.284 1.300 -- BATCH MM@lynne options(op) ess/etc/ess-roxy-tests.R0000664000175000017500000001511412577152666013576 0ustar eddedd##' \code{loadings(object)} and then design your own plotting method. ##' @title Side by side scores and loadings plot ##' @usage slplot(object, pcs=c(1,2), scoresLoadings=c(TRUE, TRUE), ##' sl="def", ll="def", hotelling=0.95, rug=TRUE, sub=NULL,...) ##' @param object ##' @param pcs ##' @param tjo ##' @return None, used for side effect. ##' @export ##' @author Henning Redestig setMethod("slplot", "pcaRes", function(object, pcs=c(1,2), tjo) { #(ess-roxy-get-function-args) opar <- par(no.readonly=TRUE) cl <- match.call() }) ##' .. content for \description{} (no empty lines) .. ##' ##' .. content for \details{} .. ##' @title ##' @param a ##' @param b ##' @param d ##' @param asd ##' @return ##' @author Henning Redestig trickyInArgsComments <- function(a,#comment b,#hejhopp trams d,asd) { print("hello") } ##' .. content for \description{} (no empty lines) .. ##' ##' .. content for \details{} .. ##' @title ##' @param a ##' @param b ##' @param cc ##' @return ##' @author Henning Redestig withdef <- function(a, b=c("asd","ffd", "asd", "ffd", "asd", "ffd","asd", "ffd"), cc) { print("hello") } setClass(Class="inference", representation=representation(model="character" , sample.size="numeric" , robust.se="logical" , two.sided="logical" , ci.level="numeric"), contains=c("matrix")) ##' .. content for \description{} (no empty lines) ##' ##' .. content for \details{} .. ##' @title asd ##' @param a ##' @param asdsd ##' @param sd ##' @param ... ##' @return s ##' @author Henning Redestig tempFixNasFunction <- function(a,asdsd, sd, ...) { asds } setGeneric("updateMu", function(respM, gamma, ...) standardGeneric("updateMu")) ## (make-local-variable 'adaptive-fill-regexp) ## (setq adaptive-fill-regexp (concat ess-roxy-str adaptive-fill-regexp)) ## (make-local-variable 'adaptive-fill-first-line-regexp) ## (setq adaptive-fill-first-line-regexp (concat ess-roxy-str adaptive-fill-first-line-regexp)) ## (make-local-variable 'paragraph-start) ## (setq paragraph-start (concat "\\(" ess-roxy-str "\\)*" paragraph-start)) ## (make-local-variable 'paragraph-separate) ## (setq paragraph-separate (concat "\\(" ess-roxy-str "\\)*" paragraph-separate)) ## (auto-fill-mode) asd ##' aqdasd lksa odnsl dlsakdn lsakdn sladn asijdi j 1. asdsd alksnd ##' lasdn ldnad ##' ##' ##' alkdnal dl lakd lasdnladna ld aldan lda dlakd nladn a amd lakdn ##' ajdn asjdns ##' ##' lajnsd jasdn aksjdnaksjnd asjdnaksdnajsdnajsd aksdn askdjn ##' akjdn aksdnkasjdnka ##' ##' 1. aldn adlnsald ladn saldnlaksd naskl ##' 2. ad asdjnksadn adjn skajan kda dksadkas dkjan dkasndkadn ##' ajsd nkj dakjd sd ##' @title hej ##' @param fitta asdadsd ##' 1. ##' 2. asd ##' @param diagonals pung asa as a sad s dsa da das d asd asd add ##' @param tjo asd ##' @param asdasd ##' @return me ##' @author Henning Redestig tempFixNas <- function(fitta, diagonals, tjo, asdasd) { for(i in index) { data <- otherdata[i] } } ##' Simply replace completely ajksbdkjsa djskbdkajbd ##' ##' ksdb skdb skasdaj ahd (ess-roxy-beg-of-field) (newline-and-indent) ##' aksndlsakndlksdn jkahd ksn dkjands ##' @title Temporary fix for missing values ##' @param diagonals The diagonal to be replaced, i.e. the first, ##' second and so on when looking at the fat version of the matrix ##' @param tjo asdsdsdw ##' @return The original matrix with completely missing rows/cols ##' filled with zeroes. oasndsnd aksdnkasdnskans dkas ndkjasndksdn ##' skandkand ksjandknsd ##' @export ##' @examples ##' tempFixNas(iris) ##' pi <- 1 ##' plot(x) ##' @author Henning Redestig tempFixNas <- function(diagonals, tjo) { (ess-roxy-delete-args) wilcox.test (ess-roxy-goto-end-of-entry) badRows <- apply(mat, 1, function(x) all(is.na(x))) badCols <- apply(mat, 2, function(x) all(is.na(x))) mat[ badRows,] <- 0 (ess-roxy-get-args-list-from-def) mat[,badCols ] <- 0 (ess-roxy-get-args-list-from-entry) mat } ##' ##' ##'
##' @title asdsd ##' @param asd asd ##' @param test1 asd ##' @param asdsd ##' @param tjo asdasd ##' @return aa ##' @author Henning Redestig tempFixNas <- function(asd,test1,asdsd,tjo=c("asd", "asdasd")) { ## (ess-roxy-goto-end-of-entry) ## (setq fun (ess-roxy-get-args-list-from-def)) ## (setq ent (ess-roxy-get-args-list-from-entry)) ## (ess-roxy-merge-args fun ent) ## (ess-roxy-mrg-args fun ent) ## (ess-roxy-get-args-list-from-entry) ## (ess-roxy-get-function-args) ## (ess-roxy-goto-end-of-entry) ## (setq here (ess-roxy-delete-args)) ## (ess-roxy-insert-args (ess-roxy-get-args-list-from-def) here) badRows <- apply(mat, 1, function(x) all(is.na(x))) badCols <- apply(mat, 2, function(x) all(is.na(x))) mat[ badRows,] <- 0 mat[,badCols ] <- 0 mat } ##' ##' ##'
##' @title my title ##' @param test1 ##' @param tjo ##' @param pung ##' @param str ##' @return value ##' @author Henning Redestig tempFixNasBad <- function(test1,tjo=c("asd", "asdasd"), pung, str) { asdsd# (car (cdr (ess-end-of-function nil t))) } ##' Provides Bayesian PCA, Probabilistic PCA, Nipals PCA, Inverse ##' Non-Linear PCA and the conventional SVD PCA. A cluster based ##' method for missing value estimation is included for comparison. ##' BPCA, PPCA and NipalsPCA may be used to perform PCA on incomplete ##' data as well as for accurate missing value estimation. A set of ##' methods for printing and plotting the results is also provided. ##' All PCA methods make use of the same data structure (pcaRes) to ##' provide a unique interface to the PCA results. Developed at the ##' Max-Planck Institute for Molecular Plant Physiology, Golm, ##' Germany, RIKEN Plant Science Center Yokohama, Japan, and CAS-MPG ##' Partner Institute for Computational Biology (PICB) Shanghai, ##' P.R. China ##' ##' @name pcaMethods ##' @aliases pcaMethods ##' @docType package ##' @title pcaMethods ##' @useDynLib pcaMethods ##' @author Wolfram Stacklies, Henning Redestig NULL #' Title #' #' @param par Lorem ipsum dolor sit amet, consectetur adipiscing #' elit. Vivamus ligula purus, ultricies quis odio non, vulputate #' finibus risus. Donec eleifend quis dolor ut rhoncus. #' @param par2 Lorem ipsum dolor sit amet, consectetur adipiscing #' elit. Vivamus ligula purus, ultricies quis odio non. #' @examples #' # This long comment line can be paragraph-filled without squashing #' # the following lines of code into the comment #' fun(arg) #' print(object) ess/etc/R-ESS-bugs.R0000664000175000017500000006625212632537307012434 0ustar eddedd#### File showing off things that go wrong or *went* wrong in the past #### -- with R-mode (mostly coded in ../lisp/ess-mode.el ) ### NOTE: this file is indented with RRR style !!!!! ### but do not change indentations anymore of anything in here: ### expressions are written as we *want* them, not as ESS currently puts them options(keep.source = FALSE) # so we see R's deparse() + print() indentation ### --- 1 --------- extraneous comment chars : This seems fixed ## From: Robert Gentleman ## To: Martin Maechler ## Subject: ESS buglet ## Date: Sun, 01 Jul 2007 21:41:24 -0700 ## Hi Martin, ## It seems that the following buglet exists (at least in what ever ## version I am using) ##a silly comment ##and a second one foo <- function(x=a, abc = list("def", a=1,3,3), more.args, and, bla, blu, bl, another, plus, yet.another, and_mbasd, lots = NULL, more = NULL, args = NULL) { x } ##- when the line before a function def is a comment, and adding args, ##- then new lines, when generated have a comment char at the beginning of ##- the line. It is slightly annoying as I have to remove the comment char. ##- ##- If I add a blank line after the comment line, then the problem does not ##- occur. ## and another ''anonymous'' function: function(x=a, abc = list("def", a=c(1,3,3)), more.args, and, bla, blu, blo, Abc, def, another, and_another, and_this) { ...; ... } ## This is a "TRUE" example (from Matrix/tests/ ): NA.or.True <- function(x) is.na(x) | x abc <- function(x, y, ...) this.is.just.a.one.liner(x,y, z=TRUE, ...) ## A more-liner function with no "{...}" -- this one even works (but not all!) mindiff <- function(df) df[which.min(df$diff), which.max(df$daff)] ## Two functions in one line - can I "send" just one of them? {no, not "simply"} f1 <- function(x) be.friendly(x, force=TRUE); f2 <- function(x,y) x*sin(pi*x) ### --- 2 ---------------------------------------------------------------- ### --- Suggestion (Jenny Brian): --> Create a (defun ess-eval-multiline .) ## Here is useful valid R "test code": ## From 'example(plot.default)' : Speed <- cars$speed Distance <- cars$dist plot(Speed, Distance, panel.first = grid(8,8), pch = 0, cex = 1.2, col = "blue") pp <- plot(Speed, Distance, panel.first = grid(8,8), pch = 0, cex = 1.2, col = "blue") plot(Speed, Distance, panel.first = lines(lowess(Speed, Distance), lty = "dashed"), pch = 0, cex = 1.2, col = "blue") ## Note: We now at least C-c C-c {ess-eval-function-or-paragraph-and-step} ### --- 3 ---------------------------------------------------------------- ###--- This one (from the Matrix package) is for testing ess-roxy..., ## i.e., C-c C-o ## not exported but used more than once for "dimnames<-" method : ## -- or do only once for all "Matrix" classes ?? dimnamesGets <- function (x, value) { d <- dim(x) if (!is.list(value) || length(value) != 2 || !(is.null(v1 <- value[[1]]) || length(v1) == d[1]) || !(is.null(v2 <- value[[2]]) || length(v2) == d[2])) stop(gettextf("invalid dimnames given for '%s' object", class(x))) x@Dimnames <- list(if(!is.null(v1)) as.character(v1), if(!is.null(v2)) as.character(v2)) x } ### --- 4 ---------------------------------------------------------------- ### continued statements a <- function(ch) { if(ch == Inf) { E.cond <- numeric(nb) } else { indic <- ifelse(jinf+1 <= 1 & jsup >= 1,1,0) E.cond <- ch*(-pbinom(jinf,ni,prb) + 1-pbinom(js.n,ni,prb)) + ifelse(ni == 1, prb*indic, mu*(pbinom(js.n-1,pmax(ni-1,1),prb) - pbinom(jinf-1,pmax(ni-1,1),prb))) / sV - ### ^-- now here (better) mu/sV*(pbinom(js.n,ni,prb) - pbinom(jinf,ni,prb)) ### ^-- now here (ok; more indentation would also be ok) indic2 <- ifelse(jinf+1 <= 1 & jsup >= 1 & ni == 2,1,0) } } ### --- 5 ---------------------------------------------------------------- ### The beginning of function is not found correctly, and hence ### all "ess-*-function" (C-M-a, C-M-e, ...) fail: setMeneric <- ## It is clearly allowed to have comments here. ## S version 4, and John Chambers in particular like it. ## ## BUG: M-C-e or M-C-a fails from ``here'' -- ## --- effectively because of ess-beginning-of-function fails ## and that really relies on finding ess-function-pattern; ## i.e., ess-R-function-pattern in ~/emacs/ess/lisp/ess-cust.el ## function(name, def = NULL, group = list(), valueClass = character(), where = topenv(parent.frame()), genericFunction = NULL) { ## comments in here are at least kept via "source" attribute if(exists(name, "package:base") && typeof(get(name, "package:base")) != "closure") { FALSE } "ABC" } ### --- 6 ---------------------------------------------------------------- ## In one-liners without "{ ... }" body, the end-of-function is also ## not correctly found: ## Use C-M-e to see: In these two, the "end-of-function" is after ## 'class' : ## ---- these all work now (ESS version 5.3.8) : ## no it doesn't VS[10-03-2012|ESS 12.03]: onelinerFails <- function(x, ...) class(x) onelinerFailsToo <- function(x, ...) class(x) onelinerWorks <- function(x, ...) { class(x) } onelinerWorksToo <- function(x, ...) { class(x) } ### --- 7 ---------------------------------------------------------------- ## idem: ## this has one line more before 'function' than "typically:" setMethod("[", signature(x = "dgTMatrix", i = "numeric", j = "missing", drop = "logical"), function (x, i, j, ..., drop) { ## select rows storage.mode(i) <- "integer" xi <- x@i + 1:1 # 1-indexing ## ................... if (drop && any(nd == 1)) drop(as(x,"matrix")) else x }) ### --- 8 ---------------------------------------------------------------- ## idem: ## all bellow are ok VS[10-03-2012|ESS 12.03]: "dimnames<-.data.frame" <- function(x, value) { d <- dim(x) if(!is.list(value) || length(value) != 2 || d[[1]] != length(value[[1]]) || d[[2]] != length(value[[2]])) stop("invalid 'dimnames' given for data frame") row.names(x) <- as.character(value[[1]]) # checks validity names(x) <- as.character(value[[2]]) x } '[.foo' <- function(x, i, value) { ### y <- x y[i] <- value y } '[[.bar' <- function(x, i, value) { ## bla bla bla y <- as.foo(x) ; y[[i]] <- value y } "[<-.foobar" <- function(x,i,j,value) { ## just something x } "names<-.foobar" <- function(x, value) { ## just something else x } `[<-.data.frame` <- function(x, i, j, value) { nA <- nargs() # value is never missing, so 3 or 4. ###.......... class(x) <- cl x } "[[<-.data.frame"<- function(x, i, j, value) { cl <- oldClass(x) ## delete class: Version 3 idiom ## to avoid any special methods for [[<- class(x) <- NULL ###........... class(x) <- cl x } "$<-.data.frame" <- function(x, i, value) { cl <- oldClass(x) ## delete class: Version 3 idiom ## to avoid any special methods for [[<- ###........... class(x) <- cl return(x) } ## swanky functions: `swank:quit-inspector` <- function(slimeConnection, sldbState) { resetInspector(slimeConnection) FALSE } 'swank:quit-inspector' <- function(slimeConnection, sldbState) { resetInspector(slimeConnection) FALSE } ### --- 9 ---------------------------------------------------------------- ## VS[03-2012|12.03]:FIXED: ## From: "Sebastian P. Luque" ## To: ess-bugs@stat.math.ethz.ch ## Subject: [ESS-bugs] ess-mode 5.12; `ess-indent-line' error ## Date: Tue, 17 Aug 2010 13:08:25 -0500 ## With the following input, and point on the line with "Table 8.3": ## it was the parenthetical expression at the beg of line if (require(lme4)) { ## Model in p. 213 (fm1 <- lmer(logFEV1 ~ age + log(height) + age0 + log(height0) + (age | id), data=fev1, subset=logFEV1 > -0.5)) ## Table 8.3 VarCorr(fm1)$id * 100 ## Model in p. 216 (fm2 <- update(fm1, . ~ . - (age | id) + (log(height) | id))) } ### ----- ## hitting TAB (`ess-indent-command'), which calls `ess-indent-line' I get ## the following trace: ## ....: (scan-error "Containing expression ends prematurely" 20 20) ## scan-sexps(177 -2) ## forward-sexp(-2) ## ... ## ess-continued-statement-p() ## ...... ## Interestingly, if the lines 2-4 are absent, then the problem is gone. ## The problem is also there in ESS 5.11. ## I'll try to find out what is going on in `ess-continued-statement-p' but ## given that I'm not very familiar with the stuff in ess-mode.el, I'm ## submitting the report in case somebody can detect the issue sooner. ## another example: hitting Tab at }else line .essDev_differs <- function(f1, f2){ if (is.function(f1) && is.function(f2)){ !(identical(body(f1), body(f2)) && identical(args(f1), args(f2))) }else !identical(f1, f2) } ### --- 10 --------------------------------------------------------------- ## indent at 0 after }else: ## VS:[03-2012|12.03]:FIXED: if (is.function(f1) && is.function(f2)){ !(identical(body(f1), body(f2)) && identical(args(f1), args(f2))) }else !identical(f1, f2) ### --- 11 --------------------------------------------------------------- ## --------------- C-c C-c was finding the wrong "beginning of function" ## [:FIXED:, 2011-05-28] foobar <- function(...) {} rm(list=ls()) ##--------> consequence of the above experiments: ## the 2nd form is numerically "uniformly better" than the first ##--------> 2011-05-27: Change Frank's psiInv() to ## psiInv = function(t,theta) ## -log1p(exp(-theta)*expm1((1-t)*theta)/expm1(-theta)) ### --- 12 --------------------------------------------------------------- ##--- In the following block, in the first line, C-c C-c does *NOT* behave ## VS[10-03-2012|ESS 12.03]: works fine for me: th <- 48 # now do ls() and see what happened ... the horror !!! d <- 3 cpF <- list("Frank", list(th, 1:d)) cop <- acF <- cpF$copula ### --- 13 --------------------------------------------------------------- ## VS[05-05-2012|ESS 12.04]: looks like :FIXED: ## From: Aleksandar Blagotic ## To: ## Subject: [ESS] R-mode: forward-sexp: Scan error: "Unbalanced parentheses" ## Date: Tue, 6 Dec 2011 01:24:11 +0100 # ## Let's presuppose that I have a function like this: # fn <- function(x, ...){ re <- "^#{1,6} [[:print:]]+$" grepl(re, x, ...) } ## As soon as I put my cursor at the end of the line with regexp, and ## press RET, I get this error: ## forward-sexp: Scan error: "Unbalanced parentheses" ## ##------- ## Rodney S: I can reproduce it ... ## Martin M: I can NOT reproduce it, neither with 'emacs -Q'; ## tried both ESS 5.14 and ESS from svn ## VS[03-2012|12.03]: Cannot reproduce it either, solved? ### --- 14 --------------------------------------------------------------- ## check the behavior of ess-arg-function-offset-new-line a <- some.function( arg1, arg2) ## ^--- RRR has ess-arg-function-offset-new-line (4) ==> should indent here a <- some.function(arg1, arg2) ## ^--- here ### --- 15 -------------------------------------------------------------- ## VS[05-05-2012|ESS 12.04]:FIXED: ## indentation of the 3rd line is wrong for(s in seq(10, 50, len = 5)) for(a in seq(.5, 1, len = 5)) pt_dif_plot(s, a) ## ^-- here ### --- 16 ---- ## VS[05-05-2012|ESS 12.04]:FIXED: ## MM[2014-04-28]: added '}' before else (=> "{" after if(.)) ## so parse() works at all! ## Gives error unbalanced para at else lines and indentation is wrong ## error: Point is not in a function according to 'ess-function-pattern'. getOrCreateForm <- function(bindName, whereEnv) if(exists(bindName, envir = get(".forms", envir = whereEnv))) { get(bindName, envir = whereEnv) ### ^-- here } else new("protoForm") ### ^-- here parentContainer <- if(is.null(.getPrototype(.Object@host))) { emptyenv() } else sdf ### ^-- here parentContainer <- if(is.null(.getPrototype(.Object@host))) emptyenv() else sdf ### ^-- here ### --- 17 --- ## Indentation ----- "expression" is special expremmion <- c(1, 3, 9876)# was always ok ## Had wrong indentation here: expression <- c(2343, 23874, 239487) ## or here: foo <- function(x) { expression <- c(2343, 23874, 239487) 10 + expression } ## Where as here, we *do* want the indentation to ## *NOT* go all the way to the right: { my.long.Expression <- expression( x[a[j]] == exp(theta[1] + theta[2]^2), x[b[i]] == sin(theta[3] ~~ theta[4]) ) ausdruck <- expression my.long.Expr...... <- ausdruck( x[a[j]] == exp(theta[1] + theta[2]^2), ) } ## VS[18-08-2012]: redundant feature. This is a feature for long subexpressions ## imidiately folowing new line. Documented in ess-arg-function-offset-new-line ### --- 18 --- ## M-C-a (beginning of function) ## ----- anywhere inside the following function, M-C-a must go to beginning Ops.x.x <- function(e1, e2) { d <- dimCheck(e1,e2) if((dens1 <- extends(c1 <- class(e1), "denseMatrix"))) gen1 <- extends(c1, "generalMatrix") if((dens2 <- extends(c2 <- class(e2), "denseMatrix"))) gen2 <- extends(c2, "generalMatrix") if(dens1 && dens2) { ## both inherit from ddense* geM <- TRUE if(!gen1) { if(!gen2) { ## consider preserving "triangular" / "symmetric" geM <- FALSE le <- prod(d) isPacked <- function(x) length(x@x) < le } } ## now, in all cases @x should be matching & correct {only "uplo" part is used} r <- callGeneric(e1@x, e2@x) if(geM) new(paste0(.M.kind(r), "geMatrix"), x = r, Dim = d, Dimnames = dimnames(e1)) else new(paste0(.M.kind(r), Mclass), x = r, Dim = d, .....) } else { r <- .... ## criterion "2 * nnz(.) < ." as in sparseDefault() in Matrix() [./Matrix.R] : if(2 * nnzero(r, na.counted = TRUE) < prod(d)) as(r, "sparseMatrix") else r } } ### --- 19 --- ## indentation with regexp (bug in ess-backward-to-noncomment) parse_roc <- function(lines, match = "^\\s*+\' ?") { lines <- lines[str_detect(lines, match)] if (length(lines) == 0) return(NULL) ### ^-- here (2014-11: fixed) } ### --- 20 --- ## continuation indentation must be consistent in/out {}: { a <- ggplot(data = overtime.by.month, aes(x="", y=Percent, fill = Overtime)) + geom_bar(width = 1) + xlab('') + ylab(sub.txt) + labs(title = title.txt) + facet_wrap(~Year.Month) } a <- ggplot(data = overtime.by.month, aes(x="", y=Percent, fill = Overtime)) + geom_bar(width = 1) + xlab('') + ylab(sub.txt) + labs(title = title.txt) + facet_wrap(~Year.Month) ### ^-- face_wrap must be here ### --- 20b --- ## From https://github.com/emacs-ess/ESS/issues/120 mean(rnorm(100, mean = runif(1, 1, 10)), na.rm =TRUE) + 2 ## ^--- 2 is here mean(rnorm(100, mean = runif(1, 1, 10)), na.rm =TRUE) + 2 ## ^--- 2 is here mean(rnorm(100, mean = runif(1, 1, 10)), na.rm=TRUE) + 2 ## ^--- 2 is here ### --- 21 --- ## From: Marius Hofert ## Date: Fri, 15 Mar 2013 21:00:45 +0100 ## Hi, ## The following bug happens in ESS 12.09-2 [rev. 5395 (2013-01-10)]. Put the ## cursor in the line before the function head and hit C-c C-c. foo <- function(x) x # bar x <- 1:10 ## I'll see ## > + > [1] 1 2 3 4 5 6 7 8 9 10 ## ESS 15.03: Error in eval(expr, .... : object 'x' not found foo <- function(x) x*x bar <- function(y) y ## via C-c C-c leads to "Error: object 'bar' not found". -- fixed ### --- 22 ---- ## now correct indentation (inspite of # {was same reason as 19}) if (!grepl("#", x)) return(res) ### --- 23 ---- ### three ways to indent closing parent depending on context: foo <- function_call( a, b, c ) ### ^-- ) is here now foo <- function_call( a, b, c ) ### ")" is at column 0 foo <- function_call(a, b, c ) ### ^-- ) is here ### --- 24 --- ### shift comma in function calls foo <- function_call(a , b , c ### ^-- c is here ) ### ^-- ) is here ### --- 25 --- ## if/else in function calls and nested function_call(abc = if (test) do_something else do_something_else) function_call( abc = if (test) do_something else do_something_else) function_call(abc = if (test) do_something else do_something_else) ## real example is smooth.spline() source code [still (2015-04-08) wrong / bug!] ss <- function (x, all.knots, nknots, ...) { if (all.knots) { if (!missing(nknots) && !is.null(nknots)) warning("'all.knots' is TRUE; 'nknots' specification is disregarded") nknots <- nx } else if (is.null(nknots)) # <- for back compatibility nknots <- .nknots.smspl(nx) else { ### ^ want 'else' there if (is.function(nknots)) nknots <- nknots(nx) else if (!is.numeric(nknots)) stop("'nknots' must be numeric (in {1,..,n})") if (nknots < 1) stop("'nknots' must be at least 1") else if (nknots > nx) stop("cannot use more inner knots than unique 'x' values") } ### ^-- want '}' there } ## "if" conditional is an exception of the continuation rules: ## Here, we do not want subsequently further indentation of the c1 || c2 || c3 ## part: t2 <- function(x) { if(long.expression.of.some.size(x, pi) || another.longish.expression(sin(x)*exp(x)) || a.third.condition.under.which.A.is.chosen) ### ^-- here A else B } r <- (some.function (x, 2342) + another.f (x^3) + sdfsdf - sdfsdf + and(x) + the(x) - last(x)*part(3)) ### --- 26 ---- ## This is formally correct R, though help(parse) mentions the line-length limit of ## 4095 __when reading from the console__ ## ESS gives syntax errors ("Error: unexpected ','" ...) when evaluating this ## because line length >= 4096 : ## x <- c(1, 3.075819, 1.515999, 2.156169, 1.480742, 1.765485, 1.460206, 1.603707, 1.427429, 1.504712, 1.334528, 1.48297, 1.355308, 1.383867, 1.319241, 1.36065, 1.307467, 1.365596, 1.255259, 1.352741, 1.239381, 3.15342, 1.799889, 2.258497, 1.688312, 1.906779, 1.548203, 1.724785, 1.500873, 1.573442, 1.417137, 1.540805, 1.395945, 1.472596, 1.394247, 1.377487, 1.337394, 1.369354, 1.333378, 1.3181, 1.313813, 1.315528, 2.12777, 2.718898, 1.993509, 2.220433, 1.820585, 1.97782, 1.672455, 1.770151, 1.587478, 1.685352, 1.539295, 1.584536, 1.499487, 1.50702, 1.41952, 1.449058, 1.393042, 1.432999, 1.369964, 1.400997, 1.333824, 2.950549, 2.145387, 2.382224, 1.927077, 2.032489, 1.8371, 1.877833, 1.710891, 1.756053, 1.620778, 1.657761, 1.558978, 1.56257, 1.508633, 1.534406, 1.46709, 1.468734, 1.432529, 1.455283, 1.386975, 1.417532, 2.229573, 2.494447, 2.016117, 2.190061, 1.877996, 1.978964, 1.767284, 1.836948, 1.677372, 1.743316, 1.616383, 1.655964, 1.55484, 1.594831, 1.502185, 1.543723, 1.467005, 1.491123, 1.44402, 1.446915, 1.401578, 2.580264, 2.109121, 2.240741, 1.944719, 2.043397, 1.821808, 1.89725, 1.748788, 1.786988, 1.659333, 1.697012, 1.610622, 1.616503, 1.538529, 1.562024, 1.499964, 1.529344, 1.474519, 1.483264, 1.441552, 1.434448, 2.165233, 2.320281, 2.007836, 2.086471, 1.884052, 1.950563, 1.76926, 1.843328, 1.708941, 1.741039, 1.627206, 1.644755, 1.580563, 1.593402, 1.527312, 1.568418, 1.501462, 1.502542, 1.464583, 1.467921, 1.431141, 2.340443, 2.048262, 2.161097, 1.926082, 1.995422, 1.81446, 1.853165, 1.738533, 1.784456, 1.679444, 1.696463, 1.612931, 1.629483, 1.548186, 1.580026, 1.52198, 1.531111, 1.482914, 1.484824, 1.442726, 1.447838, 2.093386, 2.185793, 1.948989, 2.02804, 1.867137, 1.907732, 1.771923, 1.800413, 1.691612, 1.720603, 1.642705, 1.649769, 1.589028, 1.598955, 1.539759, 1.55096, 1.503965, 1.50703, 1.471349, 1.469791, 1.436959, 2.218315, 1.997369, 2.041128, 1.887059, 1.928524, 1.79626, 1.827538, 1.716748, 1.735696, 1.658329, 1.664211, 1.599286, 1.611511, 1.553925, 1.562637, 1.516805, 1.529894, 1.476064, 1.482474, 1.453253, 1.458467, 2.0247, 2.07899, 1.921976, 1.949376, 1.824629, 1.851671, 1.744713, 1.765647, 1.683525, 1.685592, 1.625113, 1.624961, 1.571921, 1.581223, 1.535257, 1.537464, 1.497165, 1.504879, 1.468682, 1.469319, 1.448344, 2.092315, 1.941412, 1.969843, 1.844093, 1.866133, 1.766145, 1.783829, 1.703613, 1.709714, 1.646078, 1.654264, 1.594523, 1.598488, 1.545105, 1.555356, 1.514627, 1.521353, 1.483958, 1.487677, 1.449191, 1.459721, 1.958987, 1.985144, 1.87739, 1.879643, 1.786823, 1.799642, 1.720015, 1.724688, 1.663539, 1.662997, 1.609267, 1.615124, 1.56746, 1.562026, 1.520586, 1.52503, 1.493008, 1.502496, 1.471983, 1.468546, 1.435064, 1.994706, 1.880348, 1.894254, 1.805827, 1.815965, 1.744296, 1.743389, 1.665481, 1.681644, 1.624466, 1.626109, 1.584028, 1.5818, 1.54376, 1.547237, 1.504878, 1.515087, 1.479032, 1.47936, 1.450758, 1.45073, 1.892685, 1.91087, 1.825301, 1.827176, 1.745363, 1.746115, 1.693373, 1.701692, 1.648247, 1.637112, 1.594648, 1.592013, 1.554849, 1.55013, 1.522186, 1.520901, 1.492606, 1.493072, 1.460868, 1.46733, 1.440956, 1.92771, 1.835696, 1.841979, 1.775991, 1.766092, 1.703807, 1.708791, 1.654985, 1.655917, 1.602388, 1.611867, 1.570765, 1.573368, 1.53419, 1.529033, 1.506767, 1.503596, 1.481126, 1.471806, 1.444917, 1.451682, 1.850262, 1.855034, 1.778997, 1.789995, 1.718871, 1.717326, 1.667357, 1.666291, 1.619743, 1.631475, 1.582624, 1.58766, 1.546302, 1.545063, 1.512222, 1.517888, 1.489127, 1.487271, 1.466722, 1.463618, 1.444137, 1.8709, 1.794033, 1.80121, 1.736376, 1.740201, 1.673776, 1.682541, 1.638153, 1.642294, 1.604417, 1.597721, 1.559534, 1.559108, 1.533942, 1.529348, 1.499517, 1.501586, 1.473147, 1.473031, 1.457615, 1.452348, 1.805753, 1.812952, 1.746549, 1.747222, 1.696924, 1.694957, 1.652157, 1.650568, 1.607807, 1.613666, 1.577295, 1.570712, 1.543704, 1.538272, 1.515369, 1.517113, 1.487451, 1.491593, 1.464514, 1.464658, 1.439359, 1.823222, 1.758781, 1.767358, 1.70872, 1.712926, 1.666956, 1.667838, 1.62077, 1.621445, 1.592891, 1.58549, 1.55603, 1.559042, 1.521501, 1.523342, 2, 3, 4) ### --- 27 ---- ## Indentation after open brace .a.lst <- list(ex1 = function(p) { cMah <- qchisq(0.975, p) function(d) as.numeric(d < cMah) ### ^--- now here (less indented than prev.) }, ex2 = function(p) { cM <- qchisq(0.95, p) function(d) as.numeric(d < cM) ### ^--- here }) ### ^--- '}' here .a.lst <- list(ex1 = function(p) { cMah <- qchisq(0.975, p) function(d) as.numeric(d < cMah) }, ## <- now at column 0 {also the next line} ex2 = function(p) { cM <- qchisq(0.95, p) function(d) as.numeric(d < cM) }) .a.lst <- list(list(aa = { bbb ### ^--- here }, aaa = function(p) { qchisq(0.95, p) ### ^--- here }, aaaa = { cccc ### ^--- here })) list(function(p){ abc ### ^-- here }) ### at column 0 (ab) { sfdsf ### ^-- here } ### --- 27b --- [new, 2015-04-09] print.MethodsFunction <- function(x, byclass = attr(x, "byclass"), ...) { info <- attr(x, "info") values <- if (byclass) { unique(info$generic) } else { visible <- ifelse(info$visible, "", "*") paste0(rownames(info), visible) ### ^-- both lines above should start here } ### ^-- "}" here ## 2nd version: val <- if (byclass) { unique(info$generic) } else { visible <- ifelse(info$visible, "", "*") paste0(rownames(info), visible) ### ^-- both lines above should start here } ### ^-- "}" here invisible(x) } ### --- 28 --- [2015-02-17; still unfixed, 2015-11-21] ## Indentation of end-line comments (to column 40 = 'indent-column') ## {this is part of "real" code in Rmpfr/R/hjk.R}: hjk <- function(x,n) { # <--- C-M-q "on {" -- does *no longer* indent the "# .." ##-- Setting steps and stepsize ----- nsteps <- floor(log2(1/tol)) # number of steps steps <- 2^c(-(0:(nsteps-1))) # decreasing step size dir <- diag(1, n, n) # orthogonal directions x <- par # start point fx <- f(x) # smallest value so far fcount <- 1 # counts number of function calls if (info) cat(sprintf("step nofc %-12s | %20s\n", "fmin", "xpar")) ##-- Start the main loop ------------ ns <- 0 while (ns < nsteps && fcount < maxfeval && abs(fx) < target) { ns <- ns + 1 hjs <- .hjsearch(x, f, steps[ns], dir, fcount, maxfeval, target) } hjs } ### --- 29 --- foreach(a = 1:3) %do% { a^2 ### ^--- here } foreach(a = 1:3) %:% foreach(b = 10:13) %dopar% { ### ^--- here a + b ### ^---- here } ### ^--- here read.csv('file.csv') %>% mutate(X = X+2, Y = Y/2) %>% ### ^--- here filter(X < 5) ### ^-- here (*was* indented earlier) ### --- 30 --- ## a) ok: { r <- array(if (d[3L] == 3L) rgb(t(x[,,1L]), t(x[,,2L]), t(x[,,3L]), maxColorValue = max) else if (d[3L] == 4L) rgb(t(x[,,1L]), t(x[,,2L]), t(x[,,3L]), t(x[,,4L]), maxColorValue = max) else stop("foo"), dim = d[1:2]) } ## b) ok : { obj <- obj && (condition1 || class2 %in% .BasicClasses || condition3) } ## c) ok: { if (any(abs(d) < .001*abs(dd) | (is.na(d) & x == y))) TRUE } ### --- 31 -------- ## C-s "recog"; M-C-a -- should go to beginning of function, does not glmmTMB <- function (formula, data = NULL) { ## glFormula <- function(formula, data=NULL, family = gaussian, ## subset, weights, na.action, offset, ## contrasts = NULL, mustart, etastart, ## control = glmerControl(), ...) { ## FIXME: check for offsets in ziformula/dispformula, throw an error call <- mf <- mc <- match.call() if (is.null(family$family)) { print(family) stop("'family' not recognized") } } ### --- 32 --- 2015-11-07 --- indentation again! -------- { yl <- if(strictlim) { ylim } else { range(y, ylim) } ## room below for weights dy <- 4*dy } ## -- 32 b) { yl <- if(strictlim) { ylim } else range(y, ylim) ## continue } ## -- 32 c) { U <- if(is.matrix(x)) apply(x, 2, foo) / (nrow(x) + 1) else foo(x) / (length(x) + 1) } ## 'else' now aligns with 'if' (and their code too) ### --- 33 -- Treat `<<-` as `<-` { f(X <- callme(arg)) f(X <<- callme(arg)) } ## the 2nd callme() now indents like the first ### Local Variables: ### page-delimiter: "^### --- [1-9]" ### End: ess/etc/ess-sas-sh-command0000775000175000017500000000433612423756516014050 0ustar eddedd#!/bin/sh ### (C) 1997, Richard M. Heiberger. ### This file is part of ESS. ## This file is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2, or (at your option) ## any later version. ## This file is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## A copy of the GNU General Public License is available at ## http://www.r-project.org/Licenses/ # For executing SAS, and running it in the proper manner for ESS # (feeding output back into appropriate ESS buffers). #echo $0 $@ #sas $1 2>$2 $3 set -x stdout=$1 stderr=$2 shift 2 set +x echo sas \$stdout 2\>$stderr $@ sas $stdout 2>$stderr $@ ## From the SAS online tech support: ## ## Redirecting the SAS Log and Output under UNIX. ## ## There are several ways of redirecting the SAS Log and Output under ## UNIX. ## ## To redirect the SAS Log, follow one of these steps: ## ## 1. ## In the source code, place the following line: ## ## proc printto log=stdout; ## ## to make a duplicate copy of the log in a file in addition ## to redirecting it to stdout, use this command to invoke ## SAS: ## ## sas -altlog doit.log doit.sas ## ## 2.Execute SAS in the background and use the UNIX 'tail' command ## to copy lines to stdout as they are added to the log. Use the ## command: ## ## sas doit.sas &; tail -f doit.log ## ## To redirect the SAS Log and Output under the Korn shell, use the ## following command: ## ## sas -stdio < doit.sas > doit.lst 2> doit.log ## ## To redirect the SAS Log and Output under the C-Shell, use the ## following command: ## ## (sas -stdio < doit.sas > doit.lst) >& doit.log ## From WWW.SAS.COM: ## How can I make SAS in batch mode behave like interactive SAS, ## continue running my SAS job, and not enter syntax check mode when ## it encounters an error? ## ## You can specify the NOSYNTAXCHECK option when you invoke your SAS ## program. ess/etc/backbug5.sparc0000664000175000017500000000062612423756516013233 0ustar eddedd#!/bin/sh # ESS[BUGS]: 02/17/2004 # runs BUGS taking commands from command file # case $# in 1) bugs05.sparc 32 bugs $1 cp -fp bugs.log bugs.bog chmod -w bugs.bog ;; 2) bugs05.sparc 32 $1 $2 cp -fp $1.log $1.bog chmod -w $1.bog ;; 3) bugs05.sparc $1 $2 $3 cp -fp $2.log $2.bog chmod -w $2.bog ;; *) echo "usage: $0 [[number_of_bins] default_output_name] command_file";; esac ess/etc/chol2inv-ex.Rd0000664000175000017500000000126712423756516013145 0ustar eddedd\title{chol2inv} \name{chol2inv-methods} \description{ Invert a symmetric, positive definite square matrix from its Choleski decomposition. Equivalently, compute \eqn{(X'X)^{-1}}{(X'X)^(-1)} from the (\eqn{R} part) of the QR decomposition of \eqn{X}. } \seealso{ \code{\link[base]{chol2inv}} (from the \pkg{base} package), \code{\link{solve}}. } %%-- In Rd preview (after C-c C-p), "se" ([s]kip to [e]xamples): %%-- "l" works at the 1st line, but does not go further from the 2nd \examples{ (M <- cbind(1, 1:3, c(1,3,7))) (cM <- chol(M)) # a "Cholesky" object... chol2inv(cM) \%*\% M # the identity stopifnot(all(chol2inv(cM) \%*\% M - Diagonal(nrow(M))) < 1e-10) } \keyword{algebra} ess/etc/Rnw-ess-bugs.Rnw0000664000175000017500000000114112423756516013473 0ustar eddedd <>= ## reported by Terry Therneau coxph <- function(formula, data, weights, subset, na.action, init, control, ties= c("efron", "breslow", "exact"), singular.ok =TRUE, robust=FALSE, model=FALSE, x=FALSE, y=TRUE, tt, method=ties, ...) { ties <- match.arg(ties) Call <- match.call() ... (20 lines omitted) timetrans <- attr(Terms, "specials")$tt if (length(timetrans)) { <> } ## next lines should not be ofsetted <> <> <> <> } @ ess/etc/backbugs.sparc0000664000175000017500000000063112423756516013325 0ustar eddedd#!/bin/sh # ESS[BUGS]: 02/17/2004 # runs BUGS taking commands from command file # case $# in 1) bugs603.sparc 32 bugs $1 cp -fp bugs.log bugs.bog chmod -w bugs.bog ;; 2) bugs603.sparc 32 $1 $2 cp -fp $1.log $1.bog chmod -w $1.bog ;; 3) bugs603.sparc $1 $2 $3 cp -fp $2.log $2.bog chmod -w $2.bog ;; *) echo "usage: $0 [[number_of_bins] default_output_name] command_file";; esac ess/etc/Extract.factor.Rd0000664000175000017500000000321612423756516013672 0ustar eddedd%% ESS BUG: Indentation ([Tab]) does not work if point is after \arguments{..} %% ------- almost surely because of the (non-escaped) "[". %% and this, all below is original from the R sources (R-devel, 2014-03-05) % File src/library/base/man/Extract.factor.Rd % Part of the R package, http://www.R-project.org % Copyright 1995-2010 R Core Team % Distributed under GPL 2 or later \name{Extract.factor} \title{Extract or Replace Parts of a Factor} \alias{[.factor} \alias{[<-.factor} \alias{[[.factor} \alias{[[<-.factor} \description{ Extract or replace subsets of factors. } \usage{ \method{[}{factor}(x, \dots, drop = FALSE) \method{[[}{factor}(x, \dots) \method{[}{factor}(x, \dots) <- value \method{[[}{factor}(x, \dots) <- value } \arguments{ \item{x}{a factor} \item{\dots}{a specification of indices -- see \code{\link{Extract}}.} \item{drop}{logical. If true, unused levels are dropped.} \item{value}{character: a set of levels. Factor values are coerced to character.} } \value{ A factor with the same set of levels as \code{x} unless \code{drop = TRUE}. } \details{ When unused levels are dropped the ordering of the remaining levels is preserved. If \code{value} is not in \code{levels(x)}, a missing value is assigned with a warning. Any \code{\link{contrasts}} assigned to the factor are preserved unless \code{drop = TRUE}. The \code{[[} method supports argument \code{exact}. } \seealso{ \code{\link{factor}}, \code{\link{Extract}}. } \examples{ ## following example(factor) (ff <- factor(substring("statistics", 1:10, 1:10), levels = letters)) ff[, drop = TRUE] factor(letters[7:10])[2:3, drop = TRUE] } \keyword{category} ess/etc/other/0000775000175000017500000000000012423756516011633 5ustar eddeddess/etc/other/S-spread/0000775000175000017500000000000012423756516013311 5ustar eddeddess/etc/other/S-spread/sprd-spr.s0000664000175000017500000001515612423756516015257 0ustar eddedd#-*-Fundamental-*- # Spreadsheet written in S # The spreadsheet may be called anything. # References to cells in the spreadsheet must be called "x". # Updating is in column order. # Version 3 classes and methods technology. as.spread <- function(x) { if (is.spread(x)) return(x) x <- as.array(x) attr(x,"expr") <- as.expr(x, length=0) attr(x,"macro") <- as.expr(x, length=0) attr(x,"before") <- as.expr(x, length=0) attr(x,"after") <- as.expr(x, length=0) class(x) <- c("spread", class(x)) x } is.spread <- function(x) inherits(x,"spread") print.spread <- function(x, ..., quote=F) { if (inherits(x, "data.frame")) print.data.frame(x) else { class(x) <- class(x)[-match("spread",class(x))] print.array(x, ..., quote=quote) } invisible(x) } "[.spread"<- function(x, ..., drop = F) { # Note: We do not retain the spread class! # If we did, the subscripts on the expr() and macros() would be wrong # NextMethod("[", drop=drop) } "[.expr" <- function(x, ... , drop=F) { # Note: We do retain the expr class. # The primary use is for printing, so we want the original subscripting. z <- NextMethod("[", drop=drop) class(z) <- class(x) z } update.spread <- function(object, ..., force=F) { if (force) object <- eval.spread(object, NULL, force=force) if (length(before(object))) object <- eval.spread(object, before(object)) if (length(expr(object))) object <- eval.spread(object, force=force) if (length(after(object))) object <- eval.spread(object, after(object)) object } eval.spread <- function(object, e, force=F) { x <- object class(x) <- class(x)[-match("spread",class(x))] if (force) { .Options$warn <- -1 tmp <- as.numeric(as.matrix(x)) if (!any(is.na(tmp))) x <- tmp } if (missing(e)) { if (inherits(x,"data.frame")) { e <- expr(object) if (force) for (j in 1:ncol(x)) for (i in 1:nrow(x)) x[[i,j]] <- eval(e[i,j]) else for (j in 1:ncol(x)) for (i in 1:nrow(x)) { eij <- e[i,j] if(is.language(eij)) x[[i,j]] <- eval(eij) } } else { i <- 0 if (force) for (ei in expr(object)) {i <- i+1; x[i] <- eval(ei)} else for (ei in expr(object)) {i <- i+1; if(is.language(ei)) x[i] <- eval(ei)} } } else eval(e) class(x) <- class(object) x } #usage: x <- macro.eval(x, i) macro.eval <- function(object, i) eval.spread(object, macro(x)[i]) "[[<-.spread" <- function(...) do.call("[<-.spread", list(...)) "[<-.spread" <- function(object, ..., value) { x <- object expr(x) <- expression() class(x) <- NULL e <- expr(object) l.e <- length(e) i.a.v <- is.atomic(substitute(value)) n.cells <- prod(dim(x[..., drop=F])) if (l.e == 0) { if (n.cells != 1 || i.a.v ) x[...] <- eval(substitute(value)) else { e <- as.expr(object) l.e <- length(e) } } if (l.e != 0) { if (n.cells != 1) { e.s.v <- eval(substitute(value, sys.parent())) x[...] <- e.s.v e[...] <- e.s.v } else { e[[...]] <- substitute(value) x[[...]] <- eval(e[[...]]) } } attributes(x) <- attributes(object) class(x) <- class(object) expr(x) <- e update.spread(x) } print.expr <- function(e, ..., replace.string=F) { replace <- as.logical(replace.string) if (length(e) == 0) { if (replace) cat(replace.string, "<- ") print(expression()) } else if (is.null(dim(e))) { ne <- names(e) for (i in 1:length(e)) { nei <- index.value(ne, i) if (replace) cat(replace.string) cat(paste("[", nei, "] ", sep="")) if (replace) cat("<- expression(") cat(e[i]) if (replace) cat(")") cat("\n") } } else { dn <- dimnames(e) if (is.null(dn)) dn <- list() for (i in 1:length(dim(e))) { if (is.null(dn[[i]])) dn[[i]] <- 1:dim(e)[i] } dnn <- outer(dn[[1]], dn[[2]], paste, sep=",") if (length(dn) > 2) for (i in 3:length(dn)) dnn <- outer(dnn, dn[[i]], paste, sep=",") for (i in seq(length=length(e))) { if (replace) cat("x") cat(paste("[", dnn[i], "] ", sep="")) if (replace) cat("<-") cat(paste(" ", e[i], "\n", sep="")) } } invisible(e) } as.expr <- function(x, ...) UseMethod("as.expr") as.expr.default <- function(x, length.x=prod(dim(x))) { e <- vector(mode="expression", length=length.x) x <- unclass(x) if (length.x > 0) { e <- array(e, dim(x), dimnames(x)) e[] <- x[] # for (i in 1:length(e)) e[i] <- x[i] } class(e) <- "expr" e } as.expr.data.frame <- function(x, length.x=prod(dim(x))) { e <- vector(mode="expression", length=length.x) if (length.x > 0) { e <- array(e, dim(x), dimnames(x)) u.x <- unclass(x) for (j in 1:ncol(x)) { uxj <- as.matrix(u.x[[j]]) for (i in 1:nrow(x)) e[i,j] <- uxj[i,1] } } class(e) <- "expr" e } expr <- function(x) attr(x,"expr") # "expr<-" is used only when value is a matrix the size of x, or to update # a subscripted piece of x. It is not a user function. # Currently used only in "[<-.spread". "expr<-" <- function(x, value) { attr(x,"expr") <- value x } "before<-" <- function(x, value) { attr(x,"before") <- value class(attr(x,"before")) <- "expr" x } "macro<-" <- function(x, value) { attr(x,"macro") <- value class(attr(x,"macro")) <- "expr" x } "after<-" <- function(x, value) { attr(x,"after") <- value class(attr(x,"after")) <- "expr" x } before <- function(x) attr(x,"before") macro <- function(x) attr(x,"macro") after <- function(x) attr(x,"after") expr.rc <- function(x, ...) UseMethod("expr.rc") expr.rc.default <- function(x, acpab) { subs <- paste("[", paste(acpab, collapse=","), "]") if (length(expr(x))==0) { x.expr <- paste("x.value(x",subs,")",sep="") value <- eval(parse(text=x.expr)) } else { e.expr <- paste("expr.value(expr(x)", subs, ", x", subs, ")") value <- eval(parse(text=e.expr)) } paste("x", subs, " <- ", value, sep="") } x.value <- function(x) { value <- if (length(x)==1) as.vector(as.matrix(x[[1]])) else if (inherits(x,"data.frame")) lapply(x, function(x) as.vector(as.matrix(x))) else as.vector(x) deparse(value) } expr.value <- function(e, x) { if (inherits(x,"data.frame") && (dim(e)[2]>1 || inherits(x[[1]],"factor"))) value <- deparse(lapply(e, function(x) as.vector(as.matrix(x)))) else { value <- paste(e, collapse=",") if (length(e) > 1) value <- paste("c(", value, ")", sep="") } value } index.value <- function(dn, i, deparse.result=T) { if (i==0) {i <- 0; mode(i) <- "missing"} if (is.numeric(i) && i>0 && length(dn)) i <- dn[i] if (deparse.result) deparse(as.vector(i)) else as.vector(i) } as.numeric.spread <- function(x) { .Options$warn <- -1 tmp <- as.numeric(unclass(x)) tmp <- ifelse(is.na(tmp), 0, tmp) attributes(tmp) <- attributes(x) tmp } all.numeric <- function(x) { .Options$warn <- -1 !any(is.na(as.numeric(x))) } ess/etc/other/S-spread/sprd-txt.s0000664000175000017500000000632012423756516015263 0ustar eddedd# prspread is based on prmatrix prspread <- function(x, rowlab = character(0), collab = character(0), quote = T, right = F, spread.name=deparse(match.call()[["x"]]) ) { d <- dim(x) dnames <- dimnames(x) if(is.null(dnames)) dnames <- list(rowlab, collab) else { if(!missing(rowlab)) dnames[[1]] <- as.character(rowlab) if(!missing(collab)) dnames[[2]] <- as.character(collab) } if(length(dnames[[1]]) == 0) dnames[[1]] <- paste("[", 1:d[1], ",]", sep = "") else if(length(dnames[[1]]) != d[1]) stop("rowlab is wrong length") if(length(dnames[[2]]) == 0) dnames[[2]] <- paste("[,", 1:d[2], "]", sep = "") else if(length(dnames[[2]]) != d[2]) stop("collab is wrong length") cbind(c(spread.name,dnames[[1]]), rbind(dnames[[2]], as.matrix(x))) } row.ch <- function(x, d=dim(x)) array(1:d[1], d, dimnames(x)) col.ch <- function(x, d=dim(x)) array(rep.int(1:d[2], rep.int(d[1], d[2])), d, dimnames(x)) print.text <- function(x, screen.n, cex=1, spread.name=deparse(match.call()[["x"]]), clear=T, ...) { x.pr <- prspread(x, spread.name=spread.name) if (!missing(screen.n)) screen(screen.n) usr <- c(0, ncol(x.pr), 0, nrow(x.pr)) - .5 par(usr=usr) par(plt=c(0,1,0,1)) if (clear) polygon(usr[c(1,2,2,1)],usr[c(3,3,4,4)], den=-1,col=0,xaxt="s",yaxt="s") text(x=as.vector(col.ch(x.pr)-1), y=as.vector(nrow(x.pr)-row.ch(x.pr)), x.pr, cex=cex, ...) box() invisible(x) } text.update.spread <- function(xij, row.i, col.j, screen.n, cex=1, x) { if (!missing(screen.n)) {screen(screen.n, new=F); par(plt=c(0,1,0,1))} y <- nrow(x)-row.i clear.text(x=col.j, y=y) text(x=col.j, y=y, xij, cex=cex) box() invisible(x) } cell.rc.text <- function(nrow.x, n=1, type="n") { xy <- locator(n, type) c(row=nrow.x-round(xy$y), col=round(xy$x)) } clear.text <- function(x,y) polygon(x-.5+c(0,1,1,0), y-.5+c(0,0,1,1), den=-1, col=0, border=F, xaxt="s", yaxt="s") print.update.text <- function(x, ..., x.old, screen.n, cex=1, spread.name=deparse(match.call()[["x"]])) { if(missing(x.old)) return(invisible(print.text(x, screen=screen.n, cex=cex, spread.name=spread.name))) if (!missing(screen.n)) {screen(screen.n, new=F); par(plt=c(0,1,0,1))} diff.x <- as.vector(x != x.old) xx <- col(x)[diff.x] yy <- nrow(x)-row(x)[diff.x] for (i in seq(along=xx)) clear.text(xx[i], yy[i]) box() text(x=xx, y=yy, as.vector(unlist(x))[diff.x], cex=cex) invisible(x) } control.text <- function(x, screen.n, cex=1, spread.name=deparse(match.call()[["x"]])) { #This is a real function that does its own work if (!missing(screen.n)) {screen(screen.n, new=F); par(plt=c(0,1,0,1))} x.old <- x[,] rc <- cell.rc.text(nrow(x)) command <- expr.rc(x, rc) cat("> ", command, "\n", sep="", file="") eval(parse(text=readline())) if (!missing(screen.n)) {screen(screen.n, new=F); par(plt=c(0,1,0,1))} print.update.text(x, x.old=x.old, cex=cex, spread.name=spread.name) # print.text(x, cex=cex, spread.name=spread.name) invisible(x) } #text usage # device() # for example, x11(), or motif(), or win.graph() # x <- my.spread # copy my.spread to x ##loop # print.text(x) # work with x # x <- control.text(x, screen) # screen is optional ##end loop # my.spread <- x # copy revised x back to my.spread ess/etc/other/S-spread/sprd-int.el0000664000175000017500000002521412423756516015377 0ustar eddedd;; spreadsheet in S ;; Richard M. Heiberger ;; 1995 ;; Load this file from the dired window in which .Data exists. ;; This file does not work with S-mode. Use S-spread.el for S-mode. (set-variable 'buffers-menu-max-size nil) (defvar spread-directory (concat "/tmp/" (make-temp-name "spr")) "Directory in which to store ascii spreadsheet displays.") (defvar spread-command-file (concat spread-directory "/*command*") "File through which S will communicate with emacs.") (defvar spread-directory-p nil "predicate value non-nil when directory has been defined.") (defun print-find-emacs nil "display spread.frame from minibuffer" (interactive) (spread-print-find (read-string "spread.frame: ") t)) (define-key global-map "\C-cr" 'print-find-emacs) (defun emacs-rc nil "" (interactive) (emacs-cell "1") ) (defun emacs-macro nil "" (interactive) (emacs-cell "2") ) (defun emacs-macro-control-text nil "" (interactive) (emacs-cell "4") ) (defun emacs-macro-print-text nil "" (interactive) (emacs-cell "5") ) (defun emacs-cell (result-type) "" (interactive) (setq spread-name (buffer-name)) (setq r (count-lines 1 (point))) (setq c (current-column)) (set-buffer S-buffer) (spread-insert (format "emacs.cell('%s', %s, %s, %s)" spread-name r c result-type ) ) (save-excursion (set-buffer "*command*") (revert-t-t) (goto-char (point-min)) (setq beg (point)) (end-of-line) (if (equal result-type "4") (progn (setq command (buffer-substring beg (point))) (set-buffer S-buffer) (spread-insert command) ) (setq command (read-string "> " (buffer-substring beg (point)))) (set-buffer S-buffer) (spread-insert command) (spread-insert "invisible(assign(.Active, x))") (spread-print-find spread-name nil) (goto-line r)(forward-char c) )) ) (defun spread-insert (spread-command) "" (interactive) (goto-char (point-max)) (insert spread-command) (comint-send-input) (accept-process-output spread-process) ) (defun revert-t-t nil "revert-buffer with no questions asked" (interactive) (revert-buffer t t) ) (defun revert-t-t-read-only nil "revert-buffer, no questions, read-only" (interactive) (revert-buffer t t) (setq buffer-read-only t) ) (define-key global-map "\C-cv" 'revert-t-t) (defvar spread-mode-map nil "Keymap for Spread mode.") (if spread-mode-map nil (setq spread-mode-map (make-sparse-keymap)) (define-key spread-mode-map "\C-cv" 'revert-t-t-read-only) (define-key spread-mode-map "\C-m" 'emacs-rc) (define-key spread-mode-map "\C-cc" 'emacs-macro) (define-key spread-mode-map "\C-cs" 'emacs-macro-control-text) (define-key spread-mode-map "\C-cp" 'emacs-macro-print-text) (define-key spread-mode-map "f" 'emacs-print-find-emacs) (define-key spread-mode-map [mouse-2] 'spread-mouse-print-find-emacs) (define-key spread-mode-map [mouse-3] 'spread-mouse-rc) ;; (define-key spread-mode-map [double-mouse-1] 'spread-mouse-rc) ;doesn't work (define-key spread-mode-map [menu-bar spread] (cons "Spread" (make-sparse-keymap "Spread"))) ; (define-key spread-mode-map [menu-bar spread spread-macro] ; '("macro" . spread-macro)) (define-key spread-mode-map [menu-bar spread spread-before] '("before" . spread-before)) (define-key spread-mode-map [menu-bar spread spread-after] '("after" . spread-after)) (define-key spread-mode-map [menu-bar spread spread-macro] (cons "Macro" (make-sparse-keymap "sprdtwo"))) (define-key spread-mode-map [menu-bar spread spread-macro display] '("after" . spread-display)) ; (define-key spread-mode-map [mouse-2] 'emacs-menu-print-find-ww) ) (defun spread-mouse-rc (event) "move point then enter" (interactive "e") (mouse-set-point event) (emacs-rc) ) (defun spread-mouse-print-find-emacs (event) "move point then find file" (interactive "e") (mouse-set-point event) (emacs-print-find-emacs) ) (defun spread-mode () "Major mode for spreadsheets.\\{spread-mode-map}" (interactive) (kill-all-local-variables) (make-local-variable 'beg) (make-local-variable 'command) (use-local-map spread-mode-map) (setq mode-name "Spread") (setq major-mode 'spread-mode) (if (equal (buffer-name) ".Registry") (spread-highlight-macro)) (setq buffer-read-only t) ) ;; from dired.el L547 ; (put-text-property (point) ; (save-excursion ; (dired-move-to-end-of-filename) ; (point)) ; 'mouse-face 'highlight) ; ;; (put-text-property (point) (mark) 'mouse-face 'highlight) (defun spread-highlight-macro nil "highlight spread.frame names for mouse access" (interactive) (save-excursion (goto-char (point-min)) (search-forward "**macro**")(forward-char) (toggle-read-only -1) (while (progn (setq beg (point))(end-of-line) (not (= beg (point))) ) (put-text-property beg (1-(point)) 'mouse-face 'highlight) (forward-char) ) (toggle-read-only 1) ) (save-buffer) ) (defun emacs-print-find-emacs nil "" (interactive) (beginning-of-line) (setq beg (point)) (end-of-line) (backward-char) (setq spread-name (buffer-substring beg (point))) (spread-print-find spread-name nil) ) (defun find-spread-frame-directory nil "Locate directory in which spread.frame functions are stored." (list-command-history) (set-buffer "*Command History*") (goto-char (point-min)) (search-forward "(load-file ") (goto-char (1+ (match-end 0)))(setq beg (point)) (end-of-line)(search-backward "/") (goto-char (match-end 0)) (setq spread-frame-directory (expand-file-name (buffer-substring beg (point)))) ) (defun inferior-spread-mode () "Major mode for running spread.frames under S/Splus." (comint-run S-program) (setq comint-prompt-regexp shell-prompt-pattern) (setq major-mode 'inferior-spread-mode) (setq mode-name "Inferior Spread") (setq mode-line-process '(":%s")) (setq spread-process (get-buffer-process (current-buffer))) (set-process-filter spread-process 'comint-output-filter) (set-variable 'comint-output-filter-functions '(spread-output-filter comint-postoutput-scroll-to-bottom) ) (set-variable 'comint-scroll-to-bottom-on-output "this") (set-variable 'comint-scroll-show-maximum-output t) (if (not(file-writable-p ".Data/.Audit")) (accept-process-output spread-process)) (accept-process-output spread-process) ) (defun spread-output-filter (str) "detect errors in S output" (if (or (string-match "Dumped" str) (string-match "Error" str) ) (progn (switch-to-buffer-other-window S-buffer) (comint-show-maximum-output) (set-variable 'quit-flag t); beeps and writes "quit" in the message area ) ) ) ;(put 'spread-region 'menu-enable 'mark-active) ;(put 'spread-validate-region 'menu-enable 'mark-active) ;(put 'spread-print 'menu-enable '(stringp spread-print-file)) ;(put 'spread-alt-print 'menu-enable '(stringp spread-print-file)) ;(put 'spread-view 'menu-enable '(stringp spread-print-file)) ;(put 'spread-recenter-output-buffer 'menu-enable '(get-buffer "*spread-shell*")) ;(put 'spread-kill-job 'menu-enable '(spread-shell-running)) (defun emacs-menu-print-find (spread-name) "" (interactive) (spread-print-find spread-name nil) ) (defun spread-print-find (spread-name update-Registry) "Place SPREAD-NAME in foreground of S-buffer (*S* or *Splus*), update .Registry and revert buffer when UPDATE-REGISTRY is t, print all views of spread.frame associated with SPREAD-NAME in .Registry to /tmp/spr***** directory, and find or revert all views into emacs buffers." (interactive) (set-buffer S-buffer) (spread-insert (format "print.find.emacs('%s', update.Registry=%s)" spread-name (if update-Registry "T" "F"))) (if update-Registry (save-excursion (spread-find-file ".Registry"))) (spread-print-sprds) (switch-to-buffer spread-name) ) (defun spread-print-sprds () "Display in buffers all views of spread.frame" (interactive) (save-excursion (set-buffer "*command*") (revert-t-t) (goto-char (point-min)) (while (< (point) (point-max)) (set-buffer "*command*") (setq beg (point)) (end-of-line) (setq spread-name-i (buffer-substring beg (point))) (save-excursion (spread-find-file spread-name-i)) (forward-line))) ) (defun spread-find-file (spread-name) "Display one view of spread.frame" (interactive) (switch-to-buffer spread-name) (if (buffer-file-name) (revert-t-t-read-only) (kill-buffer spread-name) (find-file (concat spread-directory "/" spread-name)) ) (spread-mode) ) (define-key spread-mode-map [menu-bar spread ww] '("ww" . emacs-menu-print-find-ww)) (defun emacs-menu-print-find-ww () "" (interactive) (emacs-menu-print-find "ww")) (define-key spread-mode-map [menu-bar spread ww2] '("ww2" . "\e\e (emacs-menu-print-find \"ww\")")) (define-key spread-mode-map [menu-bar spread ww3] '("ww3" . "\M-x eval-expression\C-m (emacs-menu-print-find \"ww\")")) (defun spread-start () "load emacs spread.frame handler" (if (not (equal major-mode 'dired-mode)) (set-variable 'quit-flag t)) (setq spread-home-directory (dired-current-directory)) (find-spread-frame-directory) (kill-buffer "*Command History*") (if (not spread-directory-p) (progn (make-directory spread-directory) (setq spread-directory-p t))) (setq S-program (read-string "Splus or S? " "Splus")) (setq S-buffer (concat "*" S-program "*")) (if (not (get-buffer S-buffer)) (get-buffer-create S-buffer)) (if (get-buffer-process S-buffer) (set-variable 'quit-flag t)) (set-buffer S-buffer) (cd spread-home-directory) (inferior-spread-mode) (spread-insert (format "attach('%s.Data')" spread-frame-directory)) (spread-insert (format "emacs.start('%s')" spread-directory)) (find-file spread-command-file) (spread-find-file ".Registry") ) ;; start it up (spread-start) ess/etc/other/S-spread/asaprc.ps0000664000175000017500001025302112423756516015132 0ustar eddedd%!PS-Adobe-2.0 %%Creator: dvips 5.47 Copyright 1986-91 Radical Eye Software %%Title: asaprc.dvi %%Pages: 6 1 %%BoundingBox: 0 0 612 792 %%EndComments %%BeginProcSet: tex.pro /TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{ isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale Resolution VResolution vsize neg mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@letter{/vsize 10 N}B /@landscape{/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{ /vsize 15.5531 N}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 N}B /@manualfeed{ statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail} B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image} imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto}N /eop{clear SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for}N /p /show load N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval(Display)eq}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /a{ moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{ S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w }B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{clear SS restore}B end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N /p 3 def}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{ @scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X} B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{ itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{ PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if} ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if} if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{ DVImag dup scale}if}N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults}N /@setspecial{CLIP{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{grestore clear SpecialSave restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 1000 300 300 @start /Fa 18 118 df<701C783C783C703CF038F038F038E0 78E070E070E0700E0B799816>34 D<0C1E3F1F0F070E1E7CF860080B7A8416>44 D<00FC0003FF0007FF800E03C01E01C00E01C00001C00001C0000380000F0001FE0003FC0001FE 00000F00000380000380000380000380600380F00780E00700F01E007FFC003FF8000FE0001219 7D9816>51 D<07FF0007FF800FFF000E00000E00000E00000E00000E00001C00001C00001C0000 1C00001C00001C0000380000380000380000380000380000380000700000700000700000700000 700000700000E00000E00000E00000FFE000FFF000FFE0001120789C16>91 D<07FF0007FF8007FF00000700000700000700000700000700000E00000E00000E00000E00000E 00000E00001C00001C00001C00001C00001C00001C000038000038000038000038000038000038 00007000007000007000FFF000FFF000FFE00011207F9C16>93 D<07F0001FFC001FFE001C0F00 08070000070000070003FF001FFF003F0E00780E00E00E00E00E00E01E00F03E007FFFC03FCFC0 1F07C012127D9116>97 D<00FE0003FF0007FF800F07001C0200380000700000700000700000E0 0000E00000F000007006007807003C1E001FFC000FF80007E00011127C9116>99 D<0007C0000FE00007E00000E00001C00001C00001C001F1C007FDC00FFFC01F07803C03803803 80700380700380700380E00700E00700F00700700F00700F00783F003FFFC01FEFE00787C01319 7E9816>I<01F80007FC000FFE001E0F003C07003803807003807FFF807FFF80FFFF00E00000E0 00007006007007003C1E003FFE000FF80007E00011127C9116>I<0003C0000FE0001FF0003CE0 0070400070000070003FFF803FFFC03FFF8000E00000E00000E00000E00000E00000E00001C000 01C00001C00001C00001C00001C0007FFE00FFFE007FFE0014197E9816>I<0030007800780030 00000000000000001FE03FF01FF000E000E000E000E000E000E001C001C001C001C001C001C0FF FEFFFEFFFE0F1A7C9916>105 D<0FF8000FFC000FFC00001C0000380000380000380000380000 380000380000700000700000700000700000700000700000E00000E00000E00000E00000E00000 E0007FFF80FFFF807FFF8011197E9816>108 D<1E78F03FFDF81FFFF80F9F380F1E380E1C380E 1C380E1C380E1C381C38701C38701C38701C38701C38701C3870FE7CF8FF7EFCFE3C7816128091 16>I<1F1F003FBF801FFFC007E1C00781C00701C00701C00701C00701C00E03800E03800E0380 0E03800E03800E0380FF8FE0FFCFF0FF8FE014127F9116>I<1FC1F01FE7F81FEFFC01DC1801F8 0001E00001E00001C00001C0000380000380000380000380000380000380007FFC00FFFE007FFC 0016127F9116>114 D<01F90007FF800FFF801E07003807003803003C00001FE0000FF80001FE 00000E00300700700700700700781E00FFFC00FFF80047E00011127D9116>I<03000380070007 000700FFFEFFFFFFFE0E000E000E000E000E000E001C001C041C0E1C0E1C1C1C3C1FF80FF007C0 10177C9616>I<7C1F00FE3F807E1F801C07001C07001C07001C07001C07001C0700380E00380E 00380E00380E00381E00383E003FFF801FFFC00F8F8012127D9116>I E /Fb 1 25 df<07C000040FF0000C3FFC000C3FFE000C783F001CF00FC03CE003F078C001FFF0C0 00FFF0C0003FC040000F801E0B7D8F25>24 D E /Fc 32 122 df 45 D<060F0F06000000000000000000003078F06008127C910D>58 D<00001800000018000000 38000000380000007800000078000000B8000001B800000138000002380000023C0000041C0000 041C0000081C0000181C0000101C0000201C0000201C00007FFC0000401C0000801C0001801C00 01001C0002001C0002001C0004000E000C000E001C001E00FF00FFC01A1D7E9C1F>65 D<01FFFE00003C0780003801C0003801C0003800E0003800E0007000F000700070007000700070 00F000E000F000E000F000E000F000E000F001C001E001C001E001C001E001C001C0038003C003 800380038007800380070007000E0007001C0007003800070070000E01C000FFFF00001C1C7D9B 1F>68 D<01FFFFE0003C00E0003800600038004000380040003800400070004000700040007020 400070200000E0400000E0400000E0C00000FFC00001C0800001C0800001C0800001C080000381 0100038001000380020003800200070004000700040007000C00070018000E007800FFFFF0001B 1C7D9B1C>I<0003F020001E0C60003002E000E003C001C001C0038001C0070000C00E0000801E 0000801C0000803C0000803C000000780000007800000078000000F0000000F0000000F001FFC0 F0001E00F0001C00F0001C00F0001C00F0001C00700038007000380038003800180078000C0090 000707100001F800001B1E7A9C20>71 D<01FFE0003C0000380000380000380000380000700000 700000700000700000E00000E00000E00000E00001C00001C00001C00001C00003800803800803 80080380100700100700300700600700E00E03C0FFFFC0151C7D9B1A>76 D<01FE0007F8003E000780002E000F00002E001700002E001700002E002700004E002E00004E00 4E00004E004E00004E008E00008E011C00008E011C00008E021C00008E021C0001070438000107 043800010708380001071038000207107000020720700002072070000207407000040740E00004 0780E000040700E0000C0700E0001C0601E000FF861FFC00251C7D9B25>I<01FC03FE001C0070 003C0060002E0040002E0040002E00400047008000470080004700800043808000838100008381 00008181000081C1000101C2000101C2000100E2000100E2000200E40002007400020074000200 74000400380004003800040038000C0018001C001000FF8010001F1C7D9B1F>I<01FFFC00003C 070000380380003801C0003801C0003801C0007003C0007003C0007003C00070038000E0078000 E0070000E00E0000E0380001FFE00001C0000001C0000001C00000038000000380000003800000 03800000070000000700000007000000070000000F000000FFE000001A1C7D9B1C>80 D<000F8400304C00403C00801801001803001803001806001006001006000007000007000003E0 0003FC0001FF00007F800007C00001C00001C00000C00000C02000C02000C06001806001806003 00600200F00400CC180083E000161E7D9C17>83 D<1FFFFFC01C0701C0300E00C0200E0080600E 0080400E0080401C0080801C0080801C0080001C00000038000000380000003800000038000000 70000000700000007000000070000000E0000000E0000000E0000000E0000001C0000001C00000 01C0000001C0000003C000007FFE00001A1C799B1E>I<03CC063C0C3C181C3838303870387038 E070E070E070E070E0E2C0E2C0E261E462643C380F127B9115>97 D<01F007080C08181C383830 0070007000E000E000E000E000E000E008E010602030C01F000E127B9113>99 D<001F80000380000380000700000700000700000700000E00000E00000E00000E0003DC00063C 000C3C00181C00383800303800703800703800E07000E07000E07000E07000E0E200C0E200C0E2 0061E4006264003C3800111D7B9C15>I<01E007100C1018083810701070607F80E000E000E000 E000E000E0086010602030C01F000D127B9113>I<0003C0000670000C70001C60001C00001C00 00380000380000380000380000380003FF8000700000700000700000700000700000E00000E000 00E00000E00000E00001C00001C00001C00001C00001C000038000038000038000030000030000 070000C60000E60000CC00007800001425819C0D>I<00F3018F030F06070E0E0C0E1C0E1C0E38 1C381C381C381C383830383038187818F00F700070007000E000E0C0C0E1C0C3007E00101A7D91 13>I<0FC00001C00001C0000380000380000380000380000700000700000700000700000E7800 0E8C000F0E000E0E001C0E001C0E001C0E001C0E00381C00381C00381C00383800703880703880 707080707100E03200601C00111D7D9C15>I<0180038001000000000000000000000000000000 1C002600470047008E008E000E001C001C001C0038003800710071007100720072003C00091C7C 9B0D>I<1F800380038007000700070007000E000E000E000E001C001C001C001C003800380038 0038007000700070007000E400E400E400E40068003800091D7C9C0B>108 D<3C1E0780266318C04683A0E04703C0E08E0380E08E0380E00E0380E00E0380E01C0701C01C07 01C01C0701C01C070380380E0388380E0388380E0708380E0710701C0320300C01C01D127C9122 >I<3C3C002646004687004707008E07008E07000E07000E07001C0E001C0E001C0E001C1C0038 1C40381C40383840383880701900300E0012127C9117>I<01E007180C0C180C380C300E700E70 0EE01CE01CE01CE018E038E030E06060C031801E000F127B9115>I<07870004D98008E0C008E0 C011C0E011C0E001C0E001C0E00381C00381C00381C00381800703800703000707000706000E8C 000E70000E00000E00001C00001C00001C00001C00003C0000FF8000131A7F9115>I<3C3C26C2 468747078E068E000E000E001C001C001C001C0038003800380038007000300010127C9112> 114 D<01F006080C080C1C18181C001F001FC00FF007F0007800386030E030C030806060C01F00 0E127D9111>I<00C001C001C001C00380038003800380FFE00700070007000E000E000E000E00 1C001C001C001C00384038403840388019000E000B1A7D990E>I<1E0300270700470700470700 870E00870E000E0E000E0E001C1C001C1C001C1C001C1C003838803838801838801839001C5900 078E0011127C9116>I<1E06270E470E4706870287020E020E021C041C041C041C081808380818 1018200C4007800F127C9113>I<1E01832703874703874703838707018707010E07010E07011C 0E021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C018127C911C>I<1E0327 0747074707870E870E0E0E0E0E1C1C1C1C1C1C1C1C38383838183818381C7007F00070007000E0 E0C0E1C0818047003C00101A7C9114>121 D E /Fd 1 33 df<02000000000400000000040000 0000080000000010000000002000000000FFFFFFFFF0FFFFFFFFF0200000000010000000000800 000000040000000004000000000200000000240E7D902A>32 D E /Fe 67 126 df34 D<0387000387000387000387000387000387007FFFC0FFFFE0FFFFE0070E00070E00070E000E1C 000E1C000E1C000E1C00FFFFE0FFFFE07FFFC01C38001C38001C38001C38001C38001C38001319 7F9816>I<30787C3C1C1C1C1C3878F0E040060D789816>39 D<00E001E0038007000E001C001C 0038003800700070007000E000E000E000E000E000E000E000E000E00070007000700038003800 1C001C000E000700038001E000E00B217A9C16>II<01C00001C00001C00001C00071C700F9CF807FFF001FFC 0007F00007F0001FFC007FFF00F9CF8071C70001C00001C00001C00001C00011127E9516>I<01 C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF8001C00001C00001 C00001C00001C00001C00001C00001C00011137E9516>I<387C7E7E3E0E1E1C78F060070B7984 16>II<70F8F8F8700505788416>I<000180000380000380 000700000700000E00000E00001C00001C0000380000380000700000700000E00000E00001C000 01C0000380000380000700000700000E00000E00001C00001C0000380000380000700000700000 E00000E00000C0000011207E9C16>I<03E0000FF8001FFC001E3C00380E00780F007007007007 00E00380E00380E00380E00380E00380E00380E00380E00380F00780700700700700780F003C1E 001E3C001FFC000FF80003E00011197E9816>I<01800380038007800F807F80FF807380038003 800380038003800380038003800380038003800380038003807FF87FFC7FF80E197C9816>I<07 E0001FF8003FFC00783E00E00700F00780F00380600380000380000380000700000700000E0000 1C0000380000700000E00001C0000380000F00001E03803803807FFF80FFFF807FFF8011197E98 16>I<07E0001FF8003FFC00781E00780700300700000700000700000E00003E0007FC0007F000 07FC00001E00000700000300000380000380600380F00380E00700781E003FFC001FF80007E000 11197E9816>I<007C0000FC0000DC0001DC00039C00039C00071C000F1C000E1C001E1C003C1C 00381C00781C00F01C00FFFFE0FFFFE0FFFFE0001C00001C00001C00001C00001C0001FFC001FF C001FFC013197F9816>I<3FFE003FFE003FFE0038000038000038000038000038000038000038 00003BF0003FFC003FFE003C0F00300700000380000380600380F00380F00380E00700781E003F FC001FF80007E00011197E9816>I<00F80003FC0007FE000F07001C0F00380F00780600700000 700000E3F800EFFC00FFFE00F80F00F00700F00380E00380E00380700380700380700780380700 3C1E001FFC000FF80003E00011197E9816>II<07F0001FFC003FFE007C1F00F0 0780E00380E00380E003807007007C1F001FFC0007F0001FFC003C1E00700700F00780E00380E0 0380E00380F007807007007C1F003FFE001FFC0007F00011197E9816>I<03E0000FF8001FFC00 3C1E00700E00700700E00700E00780E00380E00380E00780700780780F803FFF801FFB800FE380 000700000700300700780E00781C007078003FF0001FE0000F800011197E9816>I<70F8F8F870 000000000000000070F8F8F8700512789116>I<000180000780001F80003E0000F80001F00007 C0000F80003E0000FC0000F00000FC00003E00000F800007C00001F00000F800003E00001F8000 078000018011157E9616>60 D<7FFF00FFFF80FFFF80000000000000000000000000000000FFFF 80FFFF807FFF00110B7E9116>II<00E00001F00001F00001B00001B00003B80003B80003B800031800071C00071C00 071C00071C00071C000E0E000E0E000FFE000FFE001FFF001C07001C07001C07007F1FC0FF1FE0 7F1FC013197F9816>65 D<7FF800FFFE007FFF001C0F001C07801C03801C03801C03801C07801C 07001FFF001FFE001FFE001C1F001C03801C03C01C01C01C01C01C01C01C01C01C03C01C07807F FF80FFFF007FFC0012197F9816>I<01F18007FB800FFF801F0F803C0780380380700380700380 F00000E00000E00000E00000E00000E00000E00000E00000F000007003807003803803803C0700 1F0F000FFE0007FC0001F00011197E9816>I<7FF800FFFE007FFF001C0F001C07801C03C01C01 C01C01C01C01E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C03 C01C07801C0F807FFF00FFFE007FF8001319809816>I<7FFFC0FFFFC07FFFC01C01C01C01C01C 01C01C01C01C00001C00001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C00001C00E01C 00E01C00E01C00E01C00E07FFFE0FFFFE07FFFE013197F9816>II<7E1FC0FF3FE07F1F C01D07001D87001D87001D87001DC7001DC7001CC7001CC7001CE7001CE7001CE7001C67001C67 001C77001C77001C37001C37001C37001C17007F1F00FF9F007F0F0013197F9816>78 D<7FE000FFF8007FFC001C1E001C0F001C07001C07001C07001C07001C0F001C1E001FFC001FF8 001FFC001C1C001C0E001C0E001C0E001C0E001C0E201C0E701C0E707F07E0FF87E07F03C01419 7F9816>82 D<07E3001FFF003FFF00781F00F00700E00700E00700E00000F000007800003F8000 1FF00007FC0000FE00000F00000700000380000380600380E00380E00700F80F00FFFE00FFFC00 C7F00011197E9816>I<7FFFE0FFFFE0FFFFE0E0E0E0E0E0E0E0E0E0E0E0E000E00000E00000E0 0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00007FC 000FFE0007FC0013197F9816>I<7F1F807F3F807F1F800E1E000E1C00073C0007380003B80003 F00001F00001E00000E00001E00001F00003F00003B80007B800071C00071C000E0E000E0E001C 07007F1FC0FF1FE07F1FC013197F9816>88 DI<7FFF80FFFF80FFFF80E00700E00F00E0 1E00E01C00003C0000780000700000F00001E00001C00003C0000780000700000F00001E03801C 03803C0380780380700380FFFF80FFFF80FFFF8011197E9816>II93 D<03000F803FE0FDF8F07840100D067C9816>I<1FE0003FF000 7FF800783C00300E00000E00000E0003FE001FFE003E0E00700E00E00E00E00E00E00E00783E00 7FFFE03FE7E00F83E013127E9116>97 D<7E0000FE00007E00000E00000E00000E00000E00000E 3E000EFF000FFF800F83C00F00E00E00E00E00700E00700E00700E00700E00700E00700E00E00F 01E00F83C00FFF800EFF00063C001419809816>I<03F80FFC1FFE3C1E780C7000E000E000E000 E000E000F000700778073E0E1FFC0FF803F010127D9116>I<003F00007F00003F000007000007 0000070000070003C7000FF7001FFF003C1F00780F00700700E00700E00700E00700E00700E007 00E00700700F00700F003C1F001FFFE00FE7F007C7E014197F9816>I<03E00FF81FFC3C1E780E 7007E007FFFFFFFFFFFFE000E000700778073C0F1FFE0FFC03F010127D9116>I<001F00007F80 00FF8001E78001C30001C00001C0007FFF00FFFF00FFFF0001C00001C00001C00001C00001C000 01C00001C00001C00001C00001C00001C00001C0003FFE007FFF003FFE0011197F9816>I<03E3 C007F7E00FFFE01C1CC0380E00380E00380E00380E00380E001C1C000FF8001FF0001BE0003800 001800001FFC001FFF003FFF807803C0E000E0E000E0E000E0E000E07001C07C07C03FFF800FFE 0003F800131C7F9116>I<7E0000FE00007E00000E00000E00000E00000E00000E3C000EFE000F FF000F87800F03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03807F C7F0FFE7F87FC7F01519809816>I<018003C003C0018000000000000000007FC07FC07FC001C0 01C001C001C001C001C001C001C001C001C001C001C07FFFFFFF7FFF101A7D9916>I<00300078 0078003000000000000000001FF81FF81FF8003800380038003800380038003800380038003800 38003800380038003800380038003800386070F0F0FFE07FC03F800D237E9916>I<7E0000FE00 007E00000E00000E00000E00000E00000E7FE00E7FE00E7FE00E0F000E1E000E3C000E78000EF0 000FF0000FF8000FBC000F1E000E0E000E07000E07807F87F0FFCFF07F87F01419809816>III<7E3C00FEFE007FFF000F87800F03 800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87FC7 F01512809116>I<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E00380E0 0380F00780700700780F003C1E001FFC000FF80003E00011127E9116>I<7E3E00FEFF007FFF80 0F83C00F00E00E00E00E00700E00700E00700E00700E00700E00700E00E00F01E00F83C00FFF80 0EFF000E3C000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000141B809116> I114 D<0FEC3FFC7FFCF03CE01CE01C7000 7F801FF007F8003C600EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<03000007000007000007 00000700007FFF00FFFF00FFFF0007000007000007000007000007000007000007000007010007 038007038007038007870003FE0001FC0000F80011177F9616>I<7E1F80FE3F807E1F800E0380 0E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E0F800FFFF007FBF8 03E3F01512809116>I<7F1FC0FF1FE07F1FC01C07001E0F000E0E000E0E000E0E00071C00071C 00071C00071C0003B80003B80003B80001F00001F00000E00013127F9116>I<7F1FC07F3FC07F 1FC00F1C00073C0003B80003F00001F00000E00001E00001F00003B800073C00071C000E0E007F 1FC0FF3FE07F1FC013127F9116>120 D<7F1FC0FF9FE07F1FC01C07000E07000E0E000E0E0007 0E00071C00071C00039C00039C0003980001B80001B80000F00000F00000F00000E00000E00000 E00001C00079C0007BC0007F80003F00003C0000131B7F9116>I<3FFFC07FFFC07FFFC0700780 700F00701E00003C0000780001F00003E0000780000F00001E01C03C01C07801C0FFFFC0FFFFC0 FFFFC012127F9116>I<001F80007F8000FF8001E00001C00001C00001C00001C00001C00001C0 0001C00001C00001C00003C0007F8000FF0000FF00007F800003C00001C00001C00001C00001C0 0001C00001C00001C00001C00001C00001E00000FF80007F80001F8011207E9C16>I<7C0000FF 0000FF800003C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001E00000 FF00007F80007F8000FF0001E00001C00001C00001C00001C00001C00001C00001C00001C00001 C00003C000FF8000FF00007C000011207E9C16>125 D E /Ff 67 123 df<007E1F0001C1B180 0303E3C00703C3C00E03C1800E01C0000E01C0000E01C0000E01C0000E01C0000E01C000FFFFFC 000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01 C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0007F87FC001A1D809C18>11 D<007E0001C1800301800703C00E03C00E01800E00000E00000E00000E00000E0000FFFFC00E01 C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 C00E01C00E01C07F87F8151D809C17>I<003F07E00001C09C18000380F018000701F03C000E01 E03C000E00E018000E00E000000E00E000000E00E000000E00E000000E00E00000FFFFFFFC000E 00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C00 0E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C 007FC7FCFF80211D809C23>14 D<60F0F8680808081010204080050C7C9C0C>39 D<004000800100020006000C000C0018001800300030007000600060006000E000E000E000E000 E000E000E000E000E000E000E000E000600060006000700030003000180018000C000C00060002 000100008000400A2A7D9E10>I<800040002000100018000C000C000600060003000300038001 800180018001C001C001C001C001C001C001C001C001C001C001C001C001800180018003800300 0300060006000C000C00180010002000400080000A2A7E9E10>I<60F0F0701010101020204080 040C7C830C>44 DI<60F0F06004047C830C>I<00010003000600060006 000C000C000C0018001800180030003000300060006000C000C000C00180018001800300030003 00060006000C000C000C00180018001800300030003000600060006000C000C00010297E9E15> I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E007E007E007E007E007 E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<030007003F00C70007000700 070007000700070007000700070007000700070007000700070007000700070007000700070007 000F80FFF80D1C7C9B15>I<07C01830201C400C400EF00FF80FF807F8077007000F000E000E00 1C001C00380070006000C00180030006010C01180110023FFE7FFEFFFE101C7E9B15>I<07E018 30201C201C781E780E781E381E001C001C00180030006007E00030001C001C000E000F000F700F F80FF80FF80FF00E401C201C183007E0101D7E9B15>I<000C00000C00001C00003C00003C0000 5C0000DC00009C00011C00031C00021C00041C000C1C00081C00101C00301C00201C00401C00C0 1C00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC0121C7F9B15>I<03E00C 301008200C20066006600660067006780C3E083FB01FE007F007F818FC307E601E600FC007C003 C003C003C00360026004300C1C1007E0101D7E9B15>56 D<03C00C301818300C700C600EE006E0 06E007E007E007E007E0076007700F300F18170C2707C700060006000E300C780C781870102030 30C00F80101D7E9B15>I<60F0F0600000000000000000000060F0F06004127C910C>I<00060000 0006000000060000000F0000000F0000000F00000017800000178000001780000023C0000023C0 000023C0000041E0000041E0000041E0000080F0000080F0000180F8000100780001FFF8000300 7C0002003C0002003C0006003E0004001E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F >65 DI<001F808000E0618001801980070007800E0003801C0003 801C00018038000180780000807800008070000080F0000000F0000000F0000000F0000000F000 0000F0000000F0000000F0000000700000807800008078000080380000801C0001001C0001000E 000200070004000180080000E03000001FC000191E7E9C1E>IIII<001F808000E0618001801980070007800E0003801C000380 1C00018038000180780000807800008070000080F0000000F0000000F0000000F0000000F00000 00F0000000F000FFF0F0000F80700007807800078078000780380007801C0007801C0007800E00 078007000B800180118000E06080001F80001C1E7E9C21>III<1FFF00F80078007800780078007800780078007800780078007800 7800780078007800780078007800787078F878F878F878F0F040E021C01F00101D7F9B15>I76 DII<003F800000E0E0000380380007001C000E000E001C0007003C0007803800038078 0003C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0 F00001E0700001C0780003C0780003C0380003803C0007801C0007000E000E0007001C00038038 0000E0E000003F80001B1E7E9C20>II<003F800000E0E0000380 380007001C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F0 0001E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C0 380003803C0E07801C1107000E208E000720DC0003A0F80000F0E020003FE02000006020000070 60000078E000003FC000003FC000001F8000000F001B257E9C20>II<07E0801C19 80300580700380600180E00180E00080E00080E00080F00000F800007C00007FC0003FF8001FFE 0007FF0000FF80000F800007C00003C00001C08001C08001C08001C0C00180C00180E00300D002 00CC0C0083F800121E7E9C17>I<7FFFFFC0700F01C0600F00C0400F0040400F0040C00F002080 0F0020800F0020800F0020000F0000000F0000000F0000000F0000000F0000000F0000000F0000 000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00 00001F800003FFFC001B1C7F9B1E>IIII<7FF0FFC00FC03E000780180003C018 0003E0100001E0200001F0600000F0400000788000007D8000003D0000001E0000001F0000000F 0000000F8000000F80000013C0000023E0000021E0000041F00000C0F8000080780001007C0003 003C0002001E0006001F001F003F80FFC0FFF01C1C7F9B1F>I<1FC000307000783800781C0030 1C00001C00001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F 870012127E9115>97 DI<07E00C301878307870306000E0 00E000E000E000E000E00060007004300418080C3007C00E127E9112>I<003F00000700000700 00070000070000070000070000070000070000070000070003E7000C1700180F00300700700700 600700E00700E00700E00700E00700E00700E00700600700700700300700180F000C370007C7E0 131D7E9C17>I<03E00C301818300C700E6006E006FFFEE000E000E000E0006000700230021804 0C1803E00F127F9112>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<0003 8003C4C00C38C01C3880181800381C00381C00381C00381C001818001C38000C300013C0001000 003000001800001FF8001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E 0007F800121C7F9215>II<18003C003C00180000000000 00000000000000000000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C 001C001C00FF80091D7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000 E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 60E0F0C0F1C061803E000B25839C0D>IIII< FC7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C0380 1C03801C03801C03801C0380FF9FF014127F9117>I<03F0000E1C001806003003007003806001 80E001C0E001C0E001C0E001C0E001C0E001C06001807003803003001806000E1C0003F0001212 7F9115>II<03C1000C3300180B00300F00700700700700E00700E00700E00700 E00700E00700E00700600700700700300F00180F000C370007C700000700000700000700000700 000700000700000700003FE0131A7E9116>II<1F9030704030C010C010E010F8007F80 3FE00FF000F880388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C00 1C003C00FFE01C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003 C00C1A7F9910>IIII<7F8FF00F03800F030007020003840001C80001D80000F00000 700000780000F800009C00010E00020E000607000403801E07C0FF0FF81512809116>II<7FFC70386038407040F040E041C003C0038007000F040E041C043C0C380870087038FF F80E127F9112>I E /Fg 31 121 df<00180000780001F800FFF800FFF80001F80001F80001F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C >49 D<03FC000FFF003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F8 0003F00003F00007E00007C0000F80001F00003E0000380000700000E01801C018038018070018 0E00380FFFF01FFFF03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03 F03F03F03F81F83F81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007 C00001F00001F80000FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07 F00FFFC001FE0017207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE000 37E00077E000E7E001C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FF FFFEFFFFFE0007E00007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I< 000070000000007000000000F800000000F800000000F800000001FC00000001FC00000003FE00 000003FE00000003FE00000006FF000000067F0000000E7F8000000C3F8000000C3F800000183F C00000181FC00000381FE00000300FE00000300FE00000600FF000006007F00000E007F80000FF FFF80000FFFFF800018001FC00018001FC00038001FE00030000FE00030000FE000600007F0006 00007F00FFE00FFFF8FFE00FFFF825227EA12A>65 D68 DI72 DI75 D82 D<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC 000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00 003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA1 1F>I<07FC001FFF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F0 3F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 DI<00FF8007FFE00F83 F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00 007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE000001FE0000003E0000 003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00 01FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E 00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83 BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC 00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003 FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F8000 0F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F8000 0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800 13237FA211>I104 D<1C003E007F007F007F003E001C000000000000000000000000000000FF00FF001F001F001F00 1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B247EA310 >I 108 DII<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007E FC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>II114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0 007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F0 0011167E9516>I<0180000180000180000180000380000380000780000780000F80003F8000FF FF00FFFF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F 81800F81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>III120 D E /Fh 52 122 df<78FCFCFEFE7A0202040408083040070E7D850D>44 D<78FCFCFCFC7806067D850D>46 D<00600001E0000FE000FFE000F3E00003E00003E00003E000 03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 03E00003E00003E00003E0007FFF807FFF80111B7D9A18>49 D<07F8001FFE00383F80780FC0FC 07C0FC07E0FC03E0FC03E07803E00007E00007C00007C0000F80001F00001E0000380000700000 E0000180600300600600600800E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131B7E9A18>I<03F800 1FFE003C1F003C0F807C07C07E07C07C07C03807C0000F80000F80001E00003C0003F800001E00 000F800007C00007C00007E03007E07807E0FC07E0FC07E0FC07C0780F80781F001FFE0007F800 131B7E9A18>I<000180000380000780000F80001F80003F80006F8000CF80008F80018F80030F 80060F800C0F80180F80300F80600F80C00F80FFFFF8FFFFF8000F80000F80000F80000F80000F 80000F8001FFF801FFF8151B7F9A18>I<1801801FFF001FFE001FFC001FF8001FC00018000018 000018000018000019F8001E0E00180F801007800007C00007E00007E00007E07807E0F807E0F8 07E0F807C0F007C0600F80381F001FFE0007F000131B7E9A18>I<78FCFCFCFC78000000000000 78FCFCFCFC7806127D910D>58 D<00038000000380000007C0000007C0000007C000000FE00000 0FE000001FF000001BF000001BF0000031F8000031F8000061FC000060FC0000E0FE0000C07E00 00C07E0001803F0001FFFF0003FFFF8003001F8003001F8006000FC006000FC00E000FE00C0007 E0FFC07FFEFFC07FFE1F1C7E9B24>65 D<001FE02000FFF8E003F80FE007C003E00F8001E01F00 00E03E0000E03E0000607E0000607C000060FC000000FC000000FC000000FC000000FC000000FC 000000FC000000FC0000007C0000607E0000603E0000603E0000C01F0000C00F80018007C00300 03F80E0000FFFC00001FE0001B1C7D9B22>67 DIII<000FF008007FFE3801FC07F807 E001F80F8000781F0000783F0000383E0000387E0000187C000018FC000000FC000000FC000000 FC000000FC000000FC000000FC007FFFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001 F80F8001F807E001F801FC07F8007FFE78000FF818201C7D9B26>III75 DIII<003FE00001F07C0003C01E000F800F 801F0007C01E0003C03E0003E07E0003F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC00 01F8FC0001F8FC0001F8FC0001F8FC0001F87C0001F07E0003F07E0003F03E0003E03F0007E01F 0007C00F800F8003C01E0001F07C00003FE0001D1C7D9B24>II82 D<07F8201FFEE03C07E07801E07000E0F000E0F0 0060F00060F80000FE0000FFE0007FFE003FFF003FFF800FFFC007FFE0007FE00003F00001F000 00F0C000F0C000F0C000E0E000E0F001C0FC03C0EFFF0083FC00141C7D9B1B>I<7FFFFFE07FFF FFE0781F81E0701F80E0601F8060E01F8070C01F8030C01F8030C01F8030C01F8030001F800000 1F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 001F8000001F8000001F8000001F8000001F800007FFFE0007FFFE001C1C7E9B21>IIII89 D<0FF8001C1E003E0F803E07803E07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807 C0F807C0F807C0780BC03E13F80FE1F815127F9117>97 D I<03FC000E0E001C1F003C1F00781F00780E00F80000F80000F80000F80000F80000F800007800 007801803C01801C03000E0E0003F80011127E9115>I<000FF0000FF00001F00001F00001F000 01F00001F00001F00001F00001F00001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F8 01F0F801F0F801F0F801F0F801F07801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I< 01FC000F07001C03803C01C07801C07801E0F801E0F801E0FFFFE0F80000F80000F80000780000 7C00603C00601E00C00F038001FC0013127F9116>I<007F0001E38003C7C00787C00F87C00F83 800F80000F80000F80000F80000F8000FFF800FFF8000F80000F80000F80000F80000F80000F80 000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800121D809C0F>I<03 F8F00E0F381E0F381C07303C07803C07803C07803C07801C07001E0F000E0E001BF80010000018 00001800001FFF001FFFC00FFFE01FFFF07801F8F00078F00078F000787000707800F01E03C007 FF00151B7F9118>II<1E003F003F003F003F001E000000 00000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F 001F00FFE0FFE00B1E7F9D0E>I<007800FC00FC00FC00FC007800000000000000000000000003 FC03FC007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C 707CF87CF878F8F070E01F800E26839D0F>IIIII<01FC000F07801C01C03C01E07800F0 7800F0F800F8F800F8F800F8F800F8F800F8F800F87800F07800F03C01E01E03C00F078001FC00 15127F9118>II114 D<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E12 7E9113>I<0300030003000300070007000F000F003FFCFFFC1F001F001F001F001F001F001F00 1F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913>IIII121 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300 TeXDict begin %%EndSetup %%Page: 1 1 bop 399 28 a Fh(DESIGN)15 b(OF)h(A)g(SPREADSHEET)g(INTERF)-5 b(A)o(CE)17 b(F)o(OR)e(S)276 97 y(Ric)o(hard)f(M.)i(Heib)q(erger)f(and)g (Magn)o(us)g(Mengelbier,)e(T)l(emple)h(Univ)o(ersit)o(y)76 147 y(Ric)o(hard)g(M.)i(Heib)q(erger,)f(T)l(emple)f(Univ)o(ersit)n(y)l(,)g (Departmen)o(t)f(of)i(Statistics,)e(Philadelp)o(hi)o(a,)g(P)l(A)0 293 y(Key)j(W)l(ords:)21 b(Splus)0 391 y Fg(Abstract)42 472 y Ff(W)m(e)14 b(ha)o(v)o(e)h(designed)h(and)f(constructed)i(an)e(in)o (teractiv)o(e)0 521 y(spreadsheet)k(in)o(terface)f(to)f(S)g(\(Bec)o(k)o(er,)i (Cham)o(b)q(ers,)e(and)0 571 y(Wilks)12 b(1988\))f(that)i(main)o(tains)d(the) k(complete)e(p)q(o)o(w)o(er)h(and)0 621 y(generalit)o(y)e(of)f(the)i(S)f (language.)16 b(A)o(t)c(user)g(lev)o(el,)f(the)g(in)o(ter-)0 671 y(face)k(b)q(eha)o(v)o(es)g(lik)o(e)f(the)h(p)q(opular)g(spreadsheet)i (programs)0 721 y(a)o(v)n(ailable)8 b(for)i(p)q(ersonal)g(computers:)17 b(one)10 b(or)g(more)g(S)g(data)0 770 y(ob)r(jects)k(\(matrices)f(or)f (three-w)o(a)o(y)i(arra)o(ys\))f(are)g(displa)o(y)o(ed)0 820 y(on)h(the)h(screen.)22 b(The)15 b(user)h(graphically)d(\(with)h(mouse)f(or)0 870 y(cursor)j(motion\))e(iden)o(ti\014es)h(a)g(cell)h(for)f(review,)g(and)g (p)q(os-)0 920 y(sible)f(up)q(dating,)f(of)h(its)g(con)o(ten)o(ts.)20 b(The)14 b(user)h(can)g(graph-)0 970 y(ically)d(iden)o(tify)g(one)h(of)g(the) g Fe(spread.frame)p Ff('s)e(asso)q(ciated)0 1019 y(macros,)19 b(con)o(taining)f(an)h(arbitrary)g(S)g(expression,)i(and)0 1069 y(then)13 b(either)h(up)q(date)f(the)g(macro's)f(de\014nition)g(or)h (execute)0 1119 y(it.)42 1169 y(The)23 b(curren)o(t)i(v)o(ersion,)g(a)o(v)n (ailable)d(on)h(statlib)f(\(send)0 1219 y(spread)17 b(from)d(S\),)h(uses)i (the)f(classes)h(and)e(metho)q(ds)h(tec)o(h-)0 1269 y(nology)k(in)o(tro)q (duced)i(in)e(S)h(V)m(ersion)g(3)g(\(Cham)o(b)q(ers)g(and)0 1318 y(Hastie,)11 b(1992\).)k(The)c(spreadsheet)h(is)e(designed)h(in)e(a)h (mo)q(d-)0 1368 y(ular)g(fashion)g(with)h(device-sp)q(eci\014c)i(metho)q(ds)d (for)g(the)i(dis-)0 1418 y(pla)o(y)17 b(and)i(up)q(dating)f(of)f(spreadsheet) k(ob)r(jects.)33 b(W)m(e)18 b(in-)0 1468 y(clude)c(metho)q(ds)e(for)h(t)o(w)o (o)g(devices:)19 b(the)14 b(generic)g(S)f(graph-)0 1518 y(ics)20 b(device)h(and)e(a)h(c)o(haracter)h(based)g(device)f(using)g(the)0 1567 y(emacs)14 b(en)o(vironmen)o(t.)19 b(The)d(goal)d(is)h(an)h(S)f(V)m (ersion)h(4)g(im-)0 1617 y(plemen)o(tation)c(that)i(tak)o(es)h(full)e(adv)n (an)o(tage)g(of)g(the)i(ev)o(en)o(t-)0 1667 y(driv)o(en)g(readers)h(to)f(b)q (e)h(made)d(a)o(v)n(ailable.)42 1717 y(W)m(e)i(discuss)h(the)g(design)g (decisions)g(mandated)f(b)o(y)g(the)0 1767 y(join)o(t)h(constrain)o(ts)i(of)f (pro)o(viding)f(complete)g(spreadsheet)0 1816 y(capabilit)o(y)i(along)g(with) h(the)i(full)d(p)q(o)o(w)o(er)i(of)e(S,)i(and)f(the)0 1866 y(p)q(ortabilit)o(y)f(considerations)i(for)f(w)o(orking)g(with)g(sev)o(eral)0 1916 y(di\013eren)o(t)d(screen)h(handling)c(tec)o(hnologies.)0 2050 y Fg(1)56 b(In)n(tro)r(duction)42 2130 y Ff(A)16 b(spreadsheet)i(in)o (terface)f(to)f(S,)f(as)i(in)e(Figure)h(1,)g(can)0 2180 y(simplify)11 b(sev)o(eral)k(situations.)j(W)m(e)c(use)h(it)f(for)f(sim)o(ultane-)0 2230 y(ous)j(data)f(collection,)g(displa)o(y)m(,)f(and)i(summarizatio)o(n.)k (It)0 2280 y(is)15 b(useful)f(for)h(data)f(handling)g(and)g(cleaning)h(op)q (erations,)0 2330 y(exp)q(ecially)i(when)g(w)o(orking)g(with)f(m)o(ultiple)f (link)o(ed)i(\014les.)0 2379 y(It)e(can)g(pro)o(vide)f(in)o(teractiv)o(e)h(m) o(ultiple)d(views)j(of)f(a)h(single)0 2429 y(data)d(\014le.)17 b(It)c(is)f(also)g(useful)g(for)g(statisticians)h(w)o(orking)e(in)0 2479 y(en)o(vironmen)o(ts)j(where)h(other)g(p)q(eople)g(exp)q(ect)h(data)f (to)f(b)q(e)0 2529 y(spreadsheet)i(compatible.)42 2579 y(A)21 b(spreadsheet)i(in)e(S)g(di\013ers)h(in)f(sev)o(eral)g(imp)q(ortan)o(t)0 2629 y(w)o(a)o(ys)13 b(from)e(an)i(ordinary)g(spreadsheet.)20 b(Data)13 b(is)g(en)o(tered)0 2678 y(directly)18 b(as)g(an)g(S)g(ob)r(ject,)i (hence)f(the)g(data)e(con)o(v)o(ersion)1086 293 y(Figure)d(1.)k(Cell)13 b(Up)q(date)h(F)m(orces)h(Re-ev)n(aluation)1013 376 y(a.)i(The)c(en)o(tire)h Fe(spread.frame)c Ff(is)j(displa)o(y)o(ed)f(in)g(a)h(screen)1013 426 y(bu\013er.)k(The)12 b(user)f(iden)o(ti\014es)g(one)g(cell)g(for)f(up)q (dating,)h(usu-)1013 476 y(ally)g(b)o(y)h(mo)o(ving)e(a)j(p)q(oin)o(ting)e (device)j(or)f(cursor.)18 b(The)13 b(for-)1013 525 y(m)o(ula)g(asso)q(ciated) j(with)f(the)h(cell)f(is)g(displa)o(y)o(ed)g(in)g(a)g(win-)1013 575 y(do)o(w.)1013 579 y 14800896 6364380 1184071 1184071 28286156 12959006 startTexFig 1013 579 a %%BeginDocument: sl1.ps gsave 18.000000 197.000000 translate /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 412.000000 -179.000000 scale /picstr 561 string def 561 244 8 [561 0 0 -244 0 244] {currentfile picstr readhexstring pop} image 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89e3ed8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d89e3ed8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d8d89e3effffff00ffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffff00000000ffffff000000ffffffffffffffffffffffffff ffffffffffff00000000000000000000ffff00000000000000000000ffff0000000000 0000000000ffff00000000000000000000ffff00000000000000000000ffff00000000 000000000000ffff00000000000000000000ffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffff 00000000ff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d89e3e3effffff0000ffffffffffffffffffffffffffffffff ffffffffffffff0000ffffff00000000ffffffff000000ffffffffffffffffffffffff ffffffffffffff00000000000000000000ffff00000000000000000000ffff00000000 000000000000ffff00000000000000000000ffff00000000000000000000ffff000000 00000000000000ffff00000000000000000000ffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffffff 000000000000000000ffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e3effffff00000000ffffffffffffffffffffffffff ffffffffffffffffff0000ffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff000000 00ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff0000 0000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 00000000000000000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89e3e3effffffffff00000000ffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00 000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff 00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff00000000ffff00000000ffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e3effffffffffffff00000000ffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffff00000000ffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffff00000000ffffffffffff0000000000000000 0000ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89e3e3effffffffffffffffff00000000ffffffff ffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffff00000000ffffffffffffffffff00000000ffffffffff ffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffff ffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffff00000000ffffffffffffffff00000000000000 000000ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89e3effffffffffffff00000000ffffffffff ffffffffffffffffffffffffffff00000000ffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffff00000000ffffff ffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffff ffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d89e3e3effffffffff00000000ffffffffffff ffffffffffffffffffffffffffff000000000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d8d89e3effffff00000000ffffffffffffff ffffffffffffffffffffffffffffff000000ff000000ffffffffff000000ffffffffff ffffff0000ffffff0000ffffffffffffffff00000000ffffffffffffffffffff000000 00ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff0000 0000ffffffffffffffff00000000ffffffffffffffff00000000ffffff0000ffffff00 00ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffff0000 00ffffffffffff000000ffff00000000ffffff0000ffffff0000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89e3e3effffff0000ffffffffffffffff ffffffffffffffffffffffffffffff00000000ffff000000ffffffff000000ffffffff ffffffff0000ffffff0000ffffffffffffffffff000000ffffffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffffff0000ffffff 0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffff00 0000ffffffffffff000000000000000000ffffff0000ffffff0000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e3effffff00ffffffffffffffff ffffffffffffffffffffffffffffff00000000ffffffff000000ffffff000000ffffff ffffffffff0000ffffff0000ffffffffffffffffffff000000ffffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffff000000000000 00000000ffff00000000000000000000ffff00000000000000000000ffffff0000ffff ff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffff 000000ffffffffffffff00000000ff000000ffffff0000ffffff0000ffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffff0000ffffff0000ffffffffffffffffffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffff ff000000ffffffffffffffffffffffff000000ffffff0000ffffff0000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00000000ffffff0000ffffff0000ffffffff00000000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff00 0000000000ffffffffffffffffffffffff000000ffffff0000ffffff0000ffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffff0000ffffff0000ffffffff00000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff 000000000000ffffffffffffffffffffffff000000ffffff0000ffffff0000ffffffff 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000ffffd8d89e3e3effff00 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffff0000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffd8d8d89e3effff 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffff0000000000000000000000000000ffffff00000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000ffff000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffd8d89e3e3eff ff00000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000ffffffff0000000000000000000000000000ffffff000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000ffffffff000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000ffffd8d8d89e3e ffff000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000ffffff00000000000000000000000000000000ffffff0000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000ffffffff000000000000000000000000 0000000000000000000000000000000000000000000000000000000000ffffd8d89e3e 3effff00000000000000000000000000000000000000000000000000ffff0000000000 ffffffff00ffff0000000000ffffffff00000000000000000000000000ffffffffffff ffffffff00ffffff00ffffff00ffffff00000000ffffffff0000ffffff00000000ffff ffffffffff00000000ffffffffffff00000000000000ffffff00000000000000000000 00000000000000000000ffffffffffff00000000000000ffffffffffffff0000000000 ffffffffffffff00000000000000ffffffffff00000000000000ffffff000000000000 ffffffffff000000000000ffffff000000ffffff0000000000ffffff00000000000000 ffffffffffffffffff0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000ffffff0000000000ffffffffffffff0000000000ffffff00ffffff ff0000000000ffffff0000000000000000000000ffffffffffffff00000000ffffffff 0000ffffff000000ffffffff00ffffff0000000000ffffffff00000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffd8d8d8 9e3effff0000000000000000000000000000000000000000000000000000ffff000000 ffffffffffff00ffff000000ffffffffffff000000000000000000000000ffffffffff ffffffffff00ffffff00ffffff00ffffff000000ffffffffffffffffffff000000ffff ffffffffffff000000ffffffffffffffff000000000000ffffff000000000000000000 00000000000000000000ffffffffffffffff0000000000ffffffffffffffffff000000 ffffffffffffffff000000000000ffffffffffff00000000000000ffffff0000000000 ffffffffffffffff00000000ffffff000000ffffff0000000000ffffff000000000000 00ffffffffffffffffff00000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000ffffff000000000000ffffffffffffffffff000000ffffffffffff ffffff00000000ffffff00000000000000000000ffffffffffffffffff0000ffffffff ffffffffffff0000ffffffffffffffffff000000000000ffffff000000000000000000 00000000000000000000000000000000000000000000000000000000000000ffffd8d8 9e3e3effff0000000000000000000000000000000000000000000000000000ffffff00 00ffff0000ffff00ffffff0000ffff0000ffff000000000000000000000000ffffff00 00000000000000ffffff00ffffff00ffffff0000ffffff000000ffffffff000000ffff ffff0000000000000000ff0000000000ffffff0000000000ffffff0000000000000000 0000000000000000000000ff0000000000ffffff000000ffffffff0000000000ff0000 ffffffff00000000000000000000ffffff0000000000000000000000ffffff00000000 ffffff000000ffffff00000000ffffff000000ffffff0000000000ffffff0000000000 0000000000ffffff000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffff00000000000000ff0000000000ffffffff0000ffffffff00 00ffffff00000000ffffff000000000000000000ffffffff0000000000ff00ffffff00 0000ffffffff0000ffffffffffffffffffff000000000000ffffffff00000000000000 0000000000000000000000000000000000000000000000000000000000000000ffffd8 d8d89e3effff000000000000000000000000000000000000000000000000000000ffff 0000ffff0000ffff0000ffff0000ffff0000ffff000000000000000000000000ffffff 0000000000000000ffffff00ffffff00ffffff0000ffffff00000000ffffff0000ffff ffff000000000000000000000000000000ffffff000000000000000000000000000000 000000000000000000000000000000000000ffffff0000ffffffff0000000000000000 ffffffff0000000000000000000000ffffff0000000000000000000000ffffff000000 ffffff0000000000ffffff000000ffffff000000ffffff000000000000000000000000 000000000000ffffff0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffff0000000000000000000000000000ffffff0000ffffff00 000000ffffff000000ffffff0000000000000000ffffffff0000000000000000ffffff 00000000ffffff0000ffffffff0000ffffffff00000000000000ffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000ffff d8d89e3e3effff00ffffffffffffffffffff0000ffffffffffffffffffff0000000000 ffff00ffff0000ffff000000ffff00ffff0000ffffffffffffffffffffffff0000ffff ff0000000000000000ffffff00ffffff00ffffff0000ffffff00000000ffffff0000ff ffff00000000000000000000000000ffffffffffff0000000000000000000000000000 00000000000000000000000000000000ffffffffffff0000ffffff0000000000000000 00ffffff000000000000000000000000ffffff0000000000000000000000ffffff0000 00ffffff0000000000ffffff000000ffffff000000ffffff0000000000000000000000 00000000000000ffffff00000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000ffffff0000000000000000000000000000ffffff0000ffffff 00000000ffffff000000ffffff0000000000000000ffffff000000000000000000ffff ff00000000ffffff0000ffffff00000000ffffff00000000000000ffffff00000000ff ffffffffffffffffff0000ffffffffffffffffffff0000ffffffffffffffffffff00ff ffd8d8d89e3effff00ffffffffffffffffffff0000ffffffffffffffffffff00000000 00ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff0000ff ffff0000000000000000ffffff00ffffff00ffffff000000ffffffffffffffffff0000 ffffff0000000000000000000000ffffffffffffff0000000000000000000000000000 000000000000000000000000000000ffffffffffffff000000ffffffffffffffffffff ff00ffffff000000000000000000000000ffffff0000000000000000000000ffffff00 0000ffffff0000000000ffffff000000ffffff000000ffffff00000000000000000000 0000000000000000ffffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000ffffff000000000000000000000000ffffffffff0000ffff ff00000000ffffff000000ffffff0000000000000000ffffffffffffffffffffff0000 ffffffffffffffffff0000ffffff00000000ffffff00000000000000ffffff00000000 ffffffffffffffffffff0000ffffffffffffffffffff0000ffffffffffffffffffff00 ffffd8d89e3e3effff0000000000000000000000000000000000000000000000000000 000000ffff00ffffffff0000000000ffff00ffffffff00000000000000000000000000 ffffffffffffffff000000ffffff00ffffff00ffffff00000000ffffffffffffffff00 00ffffff00000000000000000000ffffffffffff000000000000000000000000000000 000000000000000000000000000000ffffffffffff0000000000ffffffffffffffffff ffff00ffffff000000000000000000000000ffffff0000000000000000000000ffffff 000000ffffff0000000000ffffff000000ffffff000000ffffff000000000000000000 000000000000000000ffffff0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffff00000000000000000000ffffffffffff000000ff ffff00000000ffffff000000ffffff0000000000000000ffffffffffffffffffffff00 0000ffffffffffffffff0000ffffff00000000ffffff00000000000000ffffff000000 0000000000000000000000000000000000000000000000000000000000000000000000 00ffffd8d8d89e3effff00000000000000000000000000000000000000000000000000 ffffffff00ffff0000000000ffffffff00ffff00000000000000000000000000000000 00ffffffffffffffff000000ffffff00ffffff00ffffff000000000000000000ffffff 0000ffffff00000000000000000000ffffffff00000000000000000000000000000000 00000000000000000000000000000000ffffffff00000000000000ffffff0000000000 ffffff00ffffff000000000000000000000000ffffff0000000000000000000000ffff ff000000ffffff0000000000ffffff000000ffffffff0000ffffff0000000000000000 00000000000000000000ffffff00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000ffffff000000000000000000ffffffffffff00000000 ffffffff0000ffffffff000000ffffffff000000ffff0000ffffff0000000000ffffff 0000000000000000ffffff0000ffffff00000000ffffff00000000000000ffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000ffffd8d89e3e3effff000000000000000000000000000000000000000000000000 ffffffffffffffffff000000ffffffffffffffffff0000000000000000000000000000 0000ffffff0000000000000000ffffffffffffffffffffff000000ff00000000ffffff ff000000ffffffff00000000ff000000ffffff00000000ff000000000000ffffff0000 0000000000000000000000000000000000ffffff00000000ff00000000ffffff000000 00ffff000000ffffffff00000000ff0000000000ffffff0000000000000000000000ff ffff00000000ffffff000000ffffff00000000ffffffffffffffffff00000000000000 0000000000000000000000ffffff000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000ffffffff000000000000ffffffffffff0000000000 00ffffffffffffffffffff000000ffffffffffffffffff000000ffffff00000000ffff 000000ff00000000ffffffff000000ffffff0000ffffffff000000000000ffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 000000ffffd8d8d89e3effff0000000000000000000000000000000000000000000000 00ffff0000ffff00ffff000000ffff0000ffff00ffff00000000000000000000000000 000000ffffff0000000000000000ffffffffffffffffffffff000000ffffffffffffff ff0000000000ffffffffffffffff00000000ffffffffffffff000000000000ffffff00 00000000000000000000000000000000000000ffffffffffffff0000000000ffffffff ffffffff00000000ffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffff00000000ffffffffffffffffff00000000ffffffffffffffffff000000000000 000000000000000000000000ffffff0000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000ffffff000000000000ffffffff000000000000 0000ffffff00ffffffffff00000000ffffff00ffffffffff00000000ffffffffffffff ff000000ffffffffffffffff00000000ffffffffffffffffff000000000000ffffff00 0000000000000000000000000000000000000000000000000000000000000000000000 00000000ffffd8d89e3e3effff00000000000000000000000000000000000000000000 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000000000000000000000 00000000ffffff0000000000000000ffffff00ffff0000ffff0000000000ffffffffff ff00000000000000ffffffffffffff0000000000ffffffffffff000000000000ffffff 000000000000000000000000000000000000000000ffffffffffff000000000000ffff ffffff00000000000000ffffffffffffff000000ffffffffffffffffff000000ffffff ffffffff000000000000ffffffffff000000000000ffffff00ffffffff000000000000 00000000000000000000000000ffffff00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000ffffffff0000000000ffffff000000000000 000000ffffff00ffffffff0000000000ffffff0000ffffffff0000000000ffffffffff 000000000000ffffffffffff000000000000ffffffff00ffffff0000000000ffffff00 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffffd8d8d89e3effff000000000000000000000000000000000000000000 000000ffff0000ffff0000ffffff00ffff0000ffff0000ffffff000000000000000000 0000000000ffffff000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000ffffff000000000000000000 0000ffffff000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000ffffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000ffffffff00000000ffffff0000000000 ff00000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffff00000000ffffffff 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffd8d89e3e3effff0000000000000000000000000000000000000000 00000000ffffffffffff000000ffff00ffffffffffff000000ffff0000000000000000 000000000000ffffffffffffffffff0000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffff0000000000000000 000000ffffff0000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffffffffff0000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffffffff000000ffffffffffff ffff000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000ffffff0000ffffffff00 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000ffffd8d8d89e3effff00000000000000000000000000000000000000 000000000000ffffffff0000000000ffff00ffffffff0000000000ffff000000000000 00000000000000ffffffffffffffffff00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000ffffff00000000000000000000000000000000000000000000000000000000 00000000000000000000000000ffffffffffff00000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffff00000000ffffffff ffffff0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffff0000ffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000ffffd8d89e3e3effff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffd8d8d89e3effff0000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000ffffd8d89e3e3effff00000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000ffffd8d8d89e3effff000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000ffffd8d89e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d89e3e3effff000000ff000000ff000000ffffffff00000000ffff 000000ff000000ffffffff00000000ffffffffffff000000ffffff000000ff000000ff 000000ffffff00000000ff000000ffff000000ff000000ff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffff000000000000000000ffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffff000000000000000000ffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffff000000000000000000ffffffff0000000000ffff ffffffffffffffffffffffffffffffff000000000000000000ffffffff0000000000ff ffffffffffffffffffffffffffffffffff000000000000000000ffffffff0000000000 ffffffffffffffffffffffffffffffffffff000000000000000000ffffffff00000000 00ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d8d89e3effff000000ff000000ff000000ffffff000000000000 00000000ffff0000ffffff00000000ffffffffffffff000000ffffff000000ff000000 ff000000ffff000000000000000000ffff000000ff000000ff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffff000000000000000000ffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffff000000000000000000ffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 ffffffffffffffffffffffffffffffff000000000000000000ffffff00000000000000 ffffffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 00ffffffffffffffffffffffffffffffffff000000000000000000ffffff0000000000 0000ffffffffffffffffffffffffffffffffff000000000000000000ffffff00000000 000000ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d89e3e3effff000000ff000000ff000000ffff000000ffffff 00000000ffffffff0000ffff000000ffffffffffffffff000000ffffff000000ff0000 00ff000000ffff000000000000000000ffff000000ff000000ff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff00000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff00 0000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff 000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffff000000ffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e3effff000000ff000000ff000000ffff000000ffff ffff000000ffffffff00000000000000ffffffffffffffff000000ffffff000000ff00 0000ff000000ffff000000ffff00000000ffff000000ff000000ff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffff000000ffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff0000 00ffffffffffffffffffffffffffffffffffff000000ffffffffffff0000ffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffffff0000ffffffff ff0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff0000ffffff ffff0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff0000ff ffffffff0000ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89e3e3effff000000ff000000ff000000ffff000000ff ffffff000000ffffffffff0000000000ffffffffffffffffff000000ffffff000000ff 000000ff000000ffff000000ffffff000000ffff000000ff000000ff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 ffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e3effff000000ff000000ff000000ffffff0000 00000000000000ffffffffffff000000ffffffffffffffffffff000000ffffff000000 ff000000ff000000ffff000000ffffff000000ffff000000ff000000ff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 00ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff00000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89e3e3effff000000ff000000ff000000ffffffff 0000000000000000ffffffffff00000000ffffffffffffffffffff000000ffffff0000 00ff000000ff000000ffff000000ffffff000000ffff000000ff000000ff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 0000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff 00000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00000000ff ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89e3effff000000ff000000ff000000ffffff ffffffffffff000000ffffffff000000000000ffffffffffffffffff000000ffffff00 0000ff000000ff000000ffff000000ffffff000000ffff000000ff000000ff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff0000 00ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff00000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d89e3e3effff0000000000000000000000ffff ff00ffffffff00000000ffffffff000000ff000000ffffffffffffffff000000ffffff 0000000000000000000000ffff000000ffffff000000ffff0000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff00 0000ffffffffffffffffffffffffffffffffffffffffffff000000ffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff 00000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ff000000ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d8d89e3effff0000000000000000000000ff ffff0000000000000000ffffffff00000000ffff000000ffffff00000000000000ffff ff0000000000000000000000ffff000000ffffff000000ffff00000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff 000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000ff000000ffffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffff ffff000000ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89e3e3effff000000ff0000ffff0000ff ffffffff000000000000ffffffff00000000ffffffff000000ffff00000000000000ff ffff000000ff0000ffff0000ffffff000000ffffff000000ffff000000ff0000ffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffff ff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff000000ffffff ffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff000000ffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff000000ff ffffffff0000ffffffffff0000ffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffff00ffffffff00000000ffffff0000 00ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000ffffff00ffffffffffffffffffffffffffffffffffffff000000ffffffffff ff00000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffff000000ffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffff000000000000ffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffff000000000000ffff ffffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000ff ffffffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000 ffffffffffff00000000000000ffffffffffffffffffffffffffffffffff0000000000 00ffffffffffff00000000000000ffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffff000000000000ffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000ffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffff0000000000ffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3e ffffff00000000000000000000ffff00000000000000000000ffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff00000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e 3effffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffff000000000000 00000000ffff00000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 9e3effffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffff ffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffff000000ffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 9e3e3effffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff000000 00ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffff0000000000ffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d8d89e3effffffffff000000ffffffffffffffffff00000000ffffffffffffffff0000 0000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00 000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d89e3e3effffffffff00000000ffffffffffffffffff00000000ffffffffffffffff 00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d8d89e3effffffffffff000000ffffffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffff ffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d89e3e3effffffffffffff000000ffffffffffffffffffff00000000ffffffff ffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffff ffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d8d89e3effffffffffffff00000000ffffffffffffffffffff00000000ffff ffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89e3e3effffffffffffffff000000ffffffff00000000000000000000ff ff00000000000000000000ffff00000000000000000000ffff00000000000000000000 ffff00000000000000000000ffff00000000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffff00ffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d8d89e3effffffffffffffffff000000ffffff00000000000000000000 ffff00000000000000000000ffff00000000000000000000ffff000000000000000000 00ffff00000000000000000000ffff00000000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffff0000000000ffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d89e3e3effffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffff000000ffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d8d89e3effffff00000000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d89e3e3effffff00000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffff00000000000000ffffffffff00000000000000ffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffff0000000000000000ffffffff0000000000000000ffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff ffffff00ffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffff00000000ffffffff00ffffff00000000ffffffff00ff ffff00000000ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff0000000000000000ffffffff0000000000000000 ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffff00000000000000ffffffffff000000000000 00ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000000000ffffffff0000000000000000ffffffff0000000000000000 ffffffff0000000000000000ffffffff0000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffff0000000000ffff ffffffffffffffffffffffffffffffff000000000000000000ffffff00000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000ffffff000000000000000000ffffff00000000000000 0000ffffff000000000000000000ffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffff000000000000000000ffffff00000000000000 ffffffffffffffffffffffffffffffffff000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff00000000ffff00000000ffff000000ffffff00000000ffff 000000ffffff00000000ffff000000ffffff00000000ffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff000000 00ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ff00000000ffffff000000ffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffff000000ffff000000ffffffff000000ffff000000ffff ffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff0000ffffffff ff0000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffff000000ffffff0000ffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffff000000ffff000000ffffffff000000ffff000000ff ffffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffff00000000ffff000000ffffffff000000ffff000000 ffffffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000ffffff000000ffffffff000000ffff0000 00ffffffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff00 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000ffff00000000ffff00000000ffff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffff00000000ffff00000000ffff00 000000ffff00000000ffff00000000ffff00000000ffff00000000ffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffff00000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffff000000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffff000000ffffffff00000000000000000000ffff 00000000000000000000ffff00000000000000000000ffff00000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff00 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ff00000000ffffffff000000ff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffff000000ff0000000000ffff ff000000ff0000000000ffffff000000ff0000000000ffffff000000ff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffff000000ffff000000ffff ffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffff0000ffffffffffffffffffffffffffffffffffffff000000ffffffff ff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffff000000ffffffffffff ffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff00 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000ffffff00ffffffff00000000ffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffff000000ffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000ffff ffffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000ff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000000000ffffffff000000ffffffff ffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3eff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff00 0000ffffff00000000ffff000000ffffff00000000ffff000000ffffff00000000ffff 000000ffffff00000000ffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff 000000ffff00000000000000000000ffff00000000000000000000ffff000000000000 00000000ffff00000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e 3effffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff 000000ffff000000ffffff00000000ffff000000ffffff00000000ffff000000ffffff 00000000ffff000000ffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 9e3effffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00000000ffff000000ffffffff000000ffff000000ffffffff000000ffff000000ffff ffff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 9e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000000000ffff000000ffffffff000000ffff000000ffffffff000000ffff000000ff ffffff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffff000000ffffffff000000000000000000ffffff000000000000000000ffffff0000 00000000000000ffffff000000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffff000000ffffffffff0000000000000000ffffffff0000000000000000ffffffff 0000000000000000ffffffff0000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffff000000ffffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ff000000ffffffffff00ffffffff00000000ffffff00ffffffff00000000ffff ff00ffffffff00000000ffffff00ffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ff000000ffffffffff0000000000000000ffffffff0000000000000000ffff ffff0000000000000000ffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffff000000000000ffffffffffff000000000000ffff ffffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000000000ffffffff00000000ff ff000000ffffffffffffffffffffffffffff000000000000000000ffff000000000000 0000ffffffffffffffffffffffffffffffffff000000000000000000ffffffffff0000 0000000000ffffffffffffffffffffffffffffff000000000000000000ffffffff0000 0000ff000000ffffffffffffffffffffffffffffff000000000000000000ffffffffff 00000000000000ffffffffffffffffffffffffffffff000000000000000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffffff ff00000000ff000000ffffffffffffffffffffffffffffff000000000000000000ffff ff000000ffffff000000ffffffffffffffffffffffffffff000000000000000000ffff ffffff00000000ffff000000ffffffffffffffffffffffffff000000000000000000ff ffff0000000000000000ffffffffffffffffffffffffffffffff000000000000000000 ffffffffffff00000000000000ffffffffffffffffffffffffffffffff000000000000 ffffffffff00000000ff000000ffff000000ff000000ff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffff0000000000 0000000000ffffffffffffffffffffffffffff000000000000000000ffff0000000000 00000000ffffffffffffffffffffffffffffffff000000000000000000ffffffff0000 000000000000ffffffffffffffffffffffffffffff000000000000000000ffffff0000 00000000000000ffffffffffffffffffffffffffffff000000000000000000ffffffff 000000000000000000ffffffffffffffffffffffffffff000000000000000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffff ff0000000000ff000000ffffffffffffffffffffffffffffff000000000000000000ff ffff000000ffffff000000ffffffffffffffffffffffffffff000000000000000000ff ffffff00000000000000000000ffffffffffffffffffffffffff000000000000000000 ffffff000000000000000000ffffffffffffffffffffffffffffff0000000000000000 00ffffffffff0000000000000000ffffffffffffffffffffffffffffff000000000000 0000ffffff000000000000000000ffff000000ff000000ff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ff00000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00000000 ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffffff0000 0000ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 0000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff 00000000ffffffffff00ffffffffffffffffffffffffffffffffff000000ffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffff000000000000000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffff000000ffffff000000ffffffffffffffffffffffffffff000000ffffffffffff ffffff000000ffffff00000000ffffffffffffffffffffffffffff000000ffffffffff ffffffff00000000ffff000000ffffffffffffffffffffffffffffff000000ffffffff ffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff00ffffffff ff000000ffff000000000000000000ffff000000ff000000ff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff0000 0000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 000000ffff00000000ffffffffffffffffffffffffffffffffffff000000ffffffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff00000000ffff00000000ffffffffffffffffffffffffffffffffffff000000ffff ffffffff000000ffffff000000ffffffffffffffffffffffffffffff000000ffffffff ffffffff000000ffffffff000000ffffffffffffffffffffffffffffff000000ffffff ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffff000000ffff ffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffff000000ffff00000000ffff000000ff000000ff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ff ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff000000ffff ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffff000000ff ffffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffff000000 ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffff000000ffffff000000ffff000000ff000000ff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff00 0000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ffff0000000000000000000000ffffffffffffffffffffffffffffffffff000000ffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff000000 ffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffff0000 00ffffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffff00 0000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff00 000000000000ffffff000000ffffff000000ffff000000ff000000ff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ff0000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffff ffffff0000000000000000000000ffffffffffffffffffffffffffffffffff000000ff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff0000 00ffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff00 0000ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffff000000ffffff000000ffff000000ff000000ff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff ff00000000ffff00000000ffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff000000 ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff00 0000ffffffffffff00000000ffff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffff000000ffffffff00000000ffff00000000ffffffffffffffffffffffffffffffff ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffff 00000000ffffffffffffff000000ffffff000000ffff000000ff000000ff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffff00ffffffff00000000ffffffffffffffffffffffffffffffffffff000000ffffff ffff00000000000000000000ffffffffffffffffffffffffffffffffffff000000ffff ffffffff00000000ffffffff00ffffffffffffffffffffffffffffffffffff000000ff ffffffffff000000ffff00000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000ffffffff0000ffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffff000000ffff00000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffff ffffff000000ffffffff00ffffffff00000000ffffffffffffffffffffffffffffffff ffffffff000000ffffff00000000000000000000ffffffffffffffffffffffffffffff ffffffffff000000ffffffff00000000ffffffff00ffffffffffffffffffffffffffff ff000000ffffffff00ffffff000000ffffff000000ffff0000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ff0000000000ffffffffffffffffffffffffffffffffffffff000000ff ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff0000 00ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff00 0000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffff ff000000ffffffffffff000000ff0000000000ffffffffffffffffffffffffffffffff ffffffff000000ffffffff0000000000000000ffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ff0000000000ffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff0000000000000000ffffffffffffffffffffffffff ffffff00000000000000ffffff000000ffffff000000ffff0000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff0000 00ffffffffffffff00000000ff000000ffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffff ff000000ffffffffffffff00000000ffff0000ffffffffffffffffffffffffffffffff ffff000000ffffffffffff000000ffff000000ffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000ffff000000ffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffff00000000000000ffffffffffffffffffffffff ffffffffff000000000000ffffff000000ffffff000000ffff000000ff0000ffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffff000000ffffffff00ffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffff 00ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffff00000000ffffff000000ffffffffffffffffffffffffffffffffffffff ffff00ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffff0000000000000000ffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffff ff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000000000ffffffff000000ffffffffffffffffffffffffffffffffffff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffff00000000000000ffffffffffffffffffffffffff ff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d8d89e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d89e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e0000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000d89e3e009e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e00d8d89e00d89e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3ed83e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e3ed89e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3ed83e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed8 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e3e3e00d8d89e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e00000000000000000000 0000009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e 3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e0000000000000000000000 000000009e9e3e3e00d8d89e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e9e9e 9e9e9e00009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e 9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e 9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e00009e9e9e00009e9e00009e9e9e00000000 9e9e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d8 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e 9e9e9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e9e9e000000000000000000000000 0000009e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e00009e9e00009e00009e9e9e00009e9e 00009e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed8 9e9e9e9e9e9e9e9e9e000000009e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e 9e9e9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e00000000000000000000000000 000000009e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e00009e009e9e00009e9e9e00009e 9e9e9e9e9e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d8d89e9e9e9e9e9e9e00000000009e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e 9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e009e9e9e9e9e9e9e9e9e9e9e 9e9e9e00009e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e0000009e9e9e00009e9e0000 9e9e9e9e9e9e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e 3ed89e9e9e9e9e9e9e9e009e9e00009e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e 9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e009e9e9e9e9e9e9e9e9e9e 9e9e9e9e009e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e0000009e9e9e00009e9e9e 0000000000009e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e3ed8d89e9e9e9e9e9e9e009e9e00009e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e 9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e00000000000000000000 0000000000009e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e009e00009e9e9e00009e 9e00009e9e9e00009e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e3e3ed89e9e9e9e9e9e9e9e000000009e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e 9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e00009e9e00009e9e0000 9e9e9e00009e9e00009e9e00000000009e0000009e0000009e00009e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e00 9e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e00000000 0000009e9e000000009e9e9e00009e00009e00009e00009e0000009e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e 009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e 9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e00d8d89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e 9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89e3e00d89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e 9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e009e9e9e3e3e00d8d89e00d8d89e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8 d89e9e9e00000000000000000000000000009e9e9e9e3e00d89e3e00d89e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e00d8d89e00d8d89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed8d8d89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e 9ed8d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed800d89e3e00d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d89e0000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000d89e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9ed89e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e grestore %%EndDocument 1013 579 a endTexFig 1013 1050 938 2 v 1013 1100 a Ff(b.)j(The)c(user)h(c)o(hanges)f(the)h(cell)f (form)o(ula.)1013 1112 y 14800896 888048 1184071 1184071 27891466 2828615 startTexFig 1013 1112 a %%BeginDocument: sl2.ps gsave 18.000000 43.000000 translate /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 406.000000 -25.000000 scale /picstr 553 string def 553 34 8 [553 0 0 -34 0 34] {currentfile picstr readhexstring pop} image 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d89effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d8ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8ffffffffffffff ffffffffffffffffffffffffffff000000ffffffff00000000ffffff000000ffffffff ffffffffffffffffffffffffffffff00000000000000000000ffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff00000000 0000000000ffffffff00000000ff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89effffffffffffffffffffffffffff ffffffffffffffff0000ffffff00000000ffffffff000000ffffffffffffffffffffff ffffffffffffffff00000000000000000000ffff00000000000000000000ffff000000 00000000000000ffff00000000000000000000ffff00000000000000000000ffff0000 0000000000000000ffff00000000000000000000ffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffff ff000000000000000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d800ffffffffffffffffffffffffffffffffffffffff ffff0000ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffff ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff00000000000000 000000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89e000000ffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff00000000ffff00000000ffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 ff00000000ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffff000000ffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffff00000000ffff ffffffff00000000000000000000ffffffffffffffffffffffffffff00000000000000 000000ff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89effffff00000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffff00000000ffffffffffffffff000000 00000000000000ffffffffffffffffffffffffffff00000000000000000000ff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d8ff00000000ffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffff00000000ffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000000000ff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89e000000ffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffff00000000ffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffff000000ffffff000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d800ffffffffffffffffffffffffffffffffffffffffffff000000ff00 0000ffffffffff000000ffffffffffffffff0000ffffff0000ffffffffffffffff0000 0000ffffffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffff0000ffffff0000ffffffffffffffffffffffffffffffffff0000 ffffff0000ffffffffffffffff000000ffffffffffff000000ffff00000000ffffff00 00ffffff0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e ffffffffffffffffffffffffffffffffffffffffffff00000000ffff000000ffffffff 000000ffffffffffffffff0000ffffff0000ffffffffffffffffff000000ffffffff00 000000000000000000ffff00000000000000000000ffff00000000000000000000ffff 00000000000000000000ffff00000000000000000000ffff00000000000000000000ff ffff0000ffffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffff ffffffffffff000000ffffffffffff000000000000000000ffffff0000ffffff0000ff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000 00ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8ffffffffffffff ffffffffffffffffffffffffffff00000000ffffffff000000ffffff000000ffffffff ffffffff0000ffffff0000ffffffffffffffffffff000000ffffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffffff0000ffffff 0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffff00 0000ffffffffffffff00000000ff000000ffffff0000ffffff0000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff0000ff ffff0000ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff ffffffffffffffffffffffff0000ffffff0000ffffffffffffffff000000ffffffffff ffffffffffffff000000ffffff0000ffffff0000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d8ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000000000ffffff0000ffffff0000ffffff ff00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffffffffff ffffffffff0000ffffff0000ffffffffff000000000000ffffffffffffffffffffffff 000000ffffff0000ffffff0000ffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000ffffff000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000000000ffffff0000ffffff0000ffffffff000000000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffff0000 ffffff0000ffffffffff000000000000ffffffffffffffffffffffff000000ffffff00 00ffffff0000ffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d8ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d800000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffd8d89e 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffff0000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000ffffd8d8d800000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000ffff 0000000000000000000000000000ffffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000ffff0000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000ffffd8d89e0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffff00000000000000 00000000000000ffffff00000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000ffffff ff00000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffd8d8d8000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000ffffff00000000000000000000000000000000 ffffff0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffff00000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000ffffd8d89e grestore %%EndDocument 1013 1112 a endTexFig 1013 1218 938 2 v 1013 1268 a Ff(c.)25 b(The)17 b(system)f(ev)n(aluates)h (the)g(new)g(cell)f(form)o(ula,)e(and)1013 1318 y(then)25 b(reev)n(aluates)h (the)g(en)o(tire)f Fe(spread.frame)p Ff(.)50 b(The)1013 1368 y Fe(sum)25 b Ff(column)g(of)h(ro)o(w)g Fe(Zzzzzzz)f Ff(has)h(b)q(een)i(up)q (dated.)1013 1380 y 14800896 6512388 1184071 1184071 28417720 13222133 startTexFig 1013 1380 a %%BeginDocument: sl3.ps gsave 18.000000 201.000000 translate /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 413.999969 -183.000000 scale /picstr 564 string def 564 249 8 [564 0 0 -249 0 249] {currentfile picstr readhexstring pop} image 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e 4e4e4e4e4e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3ed8d83e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3ed8d83e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e4e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e3e d8d83e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e3ed8d83e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e4e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e4e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e4e9ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e4e3ed8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d89e9e4e9e3ed8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d89ed89e4e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e d89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89ed84e9e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89ed8d84e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d83e3e4e9e3effff000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffd8d89ed89e4e3e3eff ff00000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffff000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000ffffd8d8d89e9e 4e9e3effff000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000ffff0000000000000000000000000000ffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000ffff00000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000ffffd8 d89ed89e4e3e3effff0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000ffffffff0000000000000000000000000000ff ffff000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000ffffffff00000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00ffffd8d8d89e9e4e9e3effff00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000ffffff00000000000000000000000000 000000ffffff0000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffffff00 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffffd8d89ed89e4e3e3effff000000000000000000000000000000000000 00000000000000ffff0000000000ffffffff00ffff0000000000ffffffff0000000000 0000000000000000ffffffffffffffffffff00ffffff00ffffff00ffffff00000000ff ffffff0000ffffff00000000ffffffffffffff00000000ffffffffffff000000000000 00ffffff0000000000000000000000000000000000000000ffffffffffff0000000000 0000ffffffffffffff0000000000ffffffffffffff00000000000000ffffffffff0000 0000000000ffffff000000000000ffffffffff000000000000ffffff000000ffffff00 00000000ffffff00000000000000ffffffffffffffffff000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000ffffff0000000000ffffffffff ffff0000000000ffffff00ffffffff0000000000ffffff0000000000000000000000ff ffffffffffff00000000ffffffff0000ffffff000000ffffffff00ffffff0000000000 ffffffff00000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffd8d8d89e9e4e9e3effff0000000000000000000000000000 000000000000000000000000ffff000000ffffffffffff00ffff000000ffffffffffff 000000000000000000000000ffffffffffffffffffff00ffffff00ffffff00ffffff00 0000ffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffff00 0000000000ffffff00000000000000000000000000000000000000ffffffffffffffff 0000000000ffffffffffffffffff000000ffffffffffffffff000000000000ffffffff ffff00000000000000ffffff0000000000ffffffffffffffff00000000ffffff000000 ffffff0000000000ffffff00000000000000ffffffffffffffffff0000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000ffffff000000000000ff ffffffffffffffff000000ffffffffffffffffff00000000ffffff0000000000000000 0000ffffffffffffffffff0000ffffffffffffffffffff0000ffffffffffffffffff00 0000000000ffffff000000000000000000000000000000000000000000000000000000 00000000000000000000000000ffffd8d89ed89e4e3e3effff00000000000000000000 00000000000000000000000000000000ffffff0000ffff0000ffff00ffffff0000ffff 0000ffff000000000000000000000000ffffff0000000000000000ffffff00ffffff00 ffffff0000ffffff000000ffffffff000000ffffffff0000000000000000ff00000000 00ffffff0000000000ffffff00000000000000000000000000000000000000ff000000 0000ffffff000000ffffffff0000000000ff0000ffffffff00000000000000000000ff ffff0000000000000000000000ffffff00000000ffffff000000ffffff00000000ffff ff000000ffffff0000000000ffffff00000000000000000000ffffff00000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000ffff00000000 000000ff0000000000ffffffff0000ffffffff0000ffffff00000000ffffff00000000 0000000000ffffffff0000000000ff00ffffff000000ffffffff0000ffffffffffffff ffffff000000000000ffffffff00000000000000000000000000000000000000000000 0000000000000000000000000000000000ffffd8d8d89e9e4e9e3effff000000000000 000000000000000000000000000000000000000000ffff0000ffff0000ffff0000ffff 0000ffff0000ffff000000000000000000000000ffffff0000000000000000ffffff00 ffffff00ffffff0000ffffff00000000ffffff0000ffffffff00000000000000000000 0000000000ffffff000000000000000000000000000000000000000000000000000000 000000000000ffffff0000ffffffff0000000000000000ffffffff0000000000000000 000000ffffff0000000000000000000000ffffff000000ffffff0000000000ffffff00 0000ffffff000000ffffff000000000000000000000000000000000000ffffff000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000ffffff 0000000000000000000000000000ffffff0000ffffff00000000ffffff000000ffffff 0000000000000000ffffffff0000000000000000ffffff00000000ffffff0000ffffff ff0000ffffffff00000000000000ffffff000000000000000000000000000000000000 000000000000000000000000000000000000000000ffffd8d89ed89e4e3e3effff00ff ffffffffffffffffff0000ffffffffffffffffffff0000000000ffff00ffff0000ffff 000000ffff00ffff0000ffffffffffffffffffffffff0000ffffff0000000000000000 ffffff00ffffff00ffffff0000ffffff00000000ffffff0000ffffff00000000000000 000000000000ffffffffffff0000000000000000000000000000000000000000000000 00000000000000ffffffffffff0000ffffff000000000000000000ffffff0000000000 00000000000000ffffff0000000000000000000000ffffff000000ffffff0000000000 ffffff000000ffffff000000ffffff000000000000000000000000000000000000ffff ff00000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00ffffff0000000000000000000000000000ffffff0000ffffff00000000ffffff0000 00ffffff0000000000000000ffffff000000000000000000ffffff00000000ffffff00 00ffffff00000000ffffff00000000000000ffffff00000000ffffffffffffffffffff 0000ffffffffffffffffffff0000ffffffffffffffffffff00ffffd8d8d89e9e4e9e3e ffff00ffffffffffffffffffff0000ffffffffffffffffffff0000000000ffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffff0000ffffff00000000 00000000ffffff00ffffff00ffffff000000ffffffffffffffffff0000ffffff000000 0000000000000000ffffffffffffff0000000000000000000000000000000000000000 000000000000000000ffffffffffffff000000ffffffffffffffffffffff00ffffff00 0000000000000000000000ffffff0000000000000000000000ffffff000000ffffff00 00000000ffffff000000ffffff000000ffffff00000000000000000000000000000000 0000ffffff000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffffff000000000000000000000000ffffffffff0000ffffff00000000ff ffff000000ffffff0000000000000000ffffffffffffffffffffff0000ffffffffffff ffffff0000ffffff00000000ffffff00000000000000ffffff00000000ffffffffffff ffffffff0000ffffffffffffffffffff0000ffffffffffffffffffff00ffffd8d89ed8 9e4e3e3effff0000000000000000000000000000000000000000000000000000000000 ffff00ffffffff0000000000ffff00ffffffff00000000000000000000000000ffffff ffffffffff000000ffffff00ffffff00ffffff00000000ffffffffffffffff0000ffff ff00000000000000000000ffffffffffff000000000000000000000000000000000000 000000000000000000000000ffffffffffff0000000000ffffffffffffffffffffff00 ffffff000000000000000000000000ffffff0000000000000000000000ffffff000000 ffffff0000000000ffffff000000ffffff000000ffffff000000000000000000000000 000000000000ffffff0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffff00000000000000000000ffffffffffff000000ffffff00 000000ffffff000000ffffff0000000000000000ffffffffffffffffffffff000000ff ffffffffffffff0000ffffff00000000ffffff00000000000000ffffff000000000000 000000000000000000000000000000000000000000000000000000000000000000ffff d8d8d89e9e4e9e3effff00000000000000000000000000000000000000000000000000 ffffffff00ffff0000000000ffffffff00ffff00000000000000000000000000000000 00ffffffffffffffff000000ffffff00ffffff00ffffff000000000000000000ffffff 0000ffffff00000000000000000000ffffffff00000000000000000000000000000000 00000000000000000000000000000000ffffffff00000000000000ffffff0000000000 ffffff00ffffff000000000000000000000000ffffff0000000000000000000000ffff ff000000ffffff0000000000ffffff000000ffffffff0000ffffff0000000000000000 00000000000000000000ffffff00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000ffffff000000000000000000ffffffffffff00000000 ffffffff0000ffffffff000000ffffffff000000ffff0000ffffff0000000000ffffff 0000000000000000ffffff0000ffffff00000000ffffff00000000000000ffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000ffffd8d89ed89e4e3e3effff000000000000000000000000000000000000000000 000000ffffffffffffffffff000000ffffffffffffffffff0000000000000000000000 0000000000ffffff0000000000000000ffffffffffffffffffffff000000ff00000000 ffffffff000000ffffffff00000000ff000000ffffff00000000ff000000000000ffff ff00000000000000000000000000000000000000ffffff00000000ff00000000ffffff 00000000ffff000000ffffffff00000000ff0000000000ffffff000000000000000000 0000ffffff00000000ffffff000000ffffff00000000ffffffffffffffffff00000000 0000000000000000000000000000ffffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000ffffffff000000000000ffffffffffff0000 00000000ffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000 00ffff000000ff00000000ffffffff000000ffffff0000ffffffff000000000000ffff ff00000000000000000000000000000000000000000000000000000000000000000000 000000000000ffffd8d8d89e9e4e9e3effff0000000000000000000000000000000000 00000000000000ffff0000ffff00ffff000000ffff0000ffff00ffff00000000000000 000000000000000000ffffff0000000000000000ffffffffffffffffffffff000000ff ffffffffffffff0000000000ffffffffffffffff00000000ffffffffffffff00000000 0000ffffff0000000000000000000000000000000000000000ffffffffffffff000000 0000ffffffffffffffff00000000ffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffff00000000ffffffffffffffffff00000000ffffffffffffffffff 000000000000000000000000000000000000ffffff0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000ffffff000000000000ffffffff 0000000000000000ffffff00ffffffffff00000000ffffff00ffffffffff00000000ff ffffffffffffff000000ffffffffffffffff00000000ffffffffffffffffff00000000 0000ffffff000000000000000000000000000000000000000000000000000000000000 00000000000000000000ffffd8d89ed89e4e3e3effff00000000000000000000000000 0000000000000000000000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000 00000000000000000000000000ffffff0000000000000000ffffff00ffff0000ffff00 00000000ffffffffffff00000000000000ffffffffffffff0000000000ffffffffffff 000000000000ffffff000000000000000000000000000000000000000000ffffffffff ff000000000000ffffffffff00000000000000ffffffffffffff000000ffffffffffff ffffff000000ffffffffffffff000000000000ffffffffff000000000000ffffff00ff ffffff00000000000000000000000000000000000000ffffff00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffffff0000000000 ffffff000000000000000000ffffff00ffffffff0000000000ffffff0000ffffffff00 00000000ffffffffff000000000000ffffffffffff000000000000ffffffff00ffffff 0000000000ffffff000000000000000000000000000000000000000000000000000000 0000000000000000000000000000ffffd8d8d89e9e4e9e3effff000000000000000000 000000000000000000000000000000ffff0000ffff0000ffffff00ffff0000ffff0000 ffffff0000000000000000000000000000ffffff000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 ffffff0000000000000000000000ffffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffff000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000ffffffff 00000000ffffff0000000000ff00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00ffffff00000000ffffffff0000000000000000000000000000000000000000000000 000000000000000000000000000000000000ffffd8d89ed89e4e3e3effff0000000000 00000000000000000000000000000000000000ffffffffffff000000ffff00ffffffff ffff000000ffff0000000000000000000000000000ffffffffffffffffff0000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000ffffff0000000000000000000000ffffff0000000000000000000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00ffffffffff000000ffffffffffffffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffffff0000ffffffff000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000ffffd8d8d89e9e4e9e3effff00 000000000000000000000000000000000000000000000000ffffffff0000000000ffff 00ffffffff0000000000ffff00000000000000000000000000ffffffffffffffffff00 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000ffffff00000000000000000000 00000000000000000000000000000000000000000000000000000000000000ffffffff ffff000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000ffffff00000000ffffffffffffff0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffffff0000ffff00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000ffffd8d89ed89e4e3e 3effff0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000ffffd8d8d8 9e9e4e9e3effff00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000ff ffd8d89ed89e4e3e3effff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000ffffd8d8d89e9e4e9e3effff0000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000ffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e 9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 9ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e 4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff000000ff000000ff00 0000ffffffff00000000ffff000000ff000000ffffffff00000000ffffffffffff0000 00ffffff000000ff000000ff000000ffffff00000000ff000000ffff000000ff000000 ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffff000000000000000000ffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffff000000000000000000ff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffff0000000000000000 00ffffffff0000000000ffffffffffffffffffffffffffffffffffff00000000000000 0000ffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000 000000ffffffff0000000000ffffffffffffffffffffffffffffffffffff0000000000 00000000ffffffff0000000000ffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effff000000ff00 0000ff000000ffffff00000000000000000000ffff0000ffffff00000000ffffffffff ffff000000ffffff000000ff000000ff000000ffff000000000000000000ffff000000 ff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffff000000000000000000 ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffff000000000000 000000ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff00000000 0000000000ffffff00000000000000ffffffffffffffffffffffffffffffffff000000 000000000000ffffff00000000000000ffffffffffffffffffffffffffffffffff0000 00000000000000ffffff00000000000000ffffffffffffffffffffffffffffffffff00 0000000000000000ffffff00000000000000ffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff00 0000ff000000ff000000ffff000000ffffff00000000ffffffff0000ffff000000ffff ffffffffffff000000ffffff000000ff000000ff000000ffff000000000000000000ff ff000000ff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff000000ffff ffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffff00000000ffffffffffffffffffffffffffffffffff ff000000ffffffffffff000000ffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffff000000ffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffff000000ffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e 3effff000000ff000000ff000000ffff000000ffffffff000000ffffffff0000000000 0000ffffffffffffffff000000ffffff000000ff000000ff000000ffff000000ffff00 000000ffff000000ff000000ff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff 000000ffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffff000000ffffffffffffffffffffffffff ffffffffff000000ffffffffffff0000ffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffffffff ffffffffffffff000000ffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffff000000ffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffff000000ffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffff000000ffffffffff0000ffffffffff0000ffffff0000ffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e d89e4e3e3effff000000ff000000ff000000ffff000000ffffffff000000ffffffffff 0000000000ffffffffffffffffff000000ffffff000000ff000000ff000000ffff0000 00ffffff000000ffff000000ff000000ff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000000000ffffffffffffffffffffff ffffffffff000000ffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffff ffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d8d89e9e4e9e3effff000000ff000000ff000000ffffff000000000000000000ff ffffffffff000000ffffffffffffffffffff000000ffffff000000ff000000ff000000 ffff000000ffffff000000ffff000000ff000000ff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000000000ffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff00000000ffffff ffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff0000 00ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89ed89e4e3e3effff000000ff000000ff000000ffffffff0000000000 000000ffffffffff00000000ffffffffffffffffffff000000ffffff000000ff000000 ff000000ffff000000ffffff000000ffff000000ff000000ff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000ffff00000000ffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffffff ffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff00000000ff ffffffffffffffffffffffffffffffffff000000ffffffffff00000000ffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 ffffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffff ffff000000ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d8d89e9e4e9e3effff000000ff000000ff000000ffffffffff ffffffff000000ffffffff000000000000ffffffffffffffffff000000ffffff000000 ff000000ff000000ffff000000ffffff000000ffff000000ff000000ff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff000000ff ffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000ffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89ed89e4e3e3effff0000000000000000000000ff ffff00ffffffff00000000ffffffff000000ff000000ffffffffffffffff000000ffff ff0000000000000000000000ffff000000ffffff000000ffff00000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff0000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff 000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ff00000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000ffffffffffffffffffffffffffffffffffffffff000000ffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffff ffff000000ffffffffff000000ff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effff0000000000000000 000000ffffff0000000000000000ffffffff00000000ffff000000ffffff0000000000 0000ffffff0000000000000000000000ffff000000ffffff000000ffff000000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000ff000000ffffffffffffffffffffffffffffffffffffff000000ff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000 ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff0000 00ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff00 0000ffffffff000000ffffffffff000000ff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff000000ff 0000ffff0000ffffffffff000000000000ffffffff00000000ffffffff000000ffff00 000000000000ffffff000000ff0000ffff0000ffffff000000ffffff000000ffff0000 00ff0000ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff0000 00ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffff 000000ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffff ff000000ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffff000000ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffff000000ffffffffff0000ffffffffff0000ffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000ffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff00ffffff ff00000000ffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffff00ffffffffffffffffffffffffffffffffff ffff000000ffffffffffff00000000ffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffff000000ffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffff000000ffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff 0000000000000000ffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffff000000000000ffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffff000000000000ffffffffffff00000000000000ffffffffffffffffffffff ffffffffffff000000000000ffffffffffff00000000000000ffffffffffffffffffff ffffffffffffff000000000000ffffffffffff00000000000000ffffffffffffffffff ffffffffffffffff000000000000ffffffffffff00000000000000ffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffff000000000000ffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffff000000000000ffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffff0000000000ffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e 4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d8d89e9e4e9e3effffff00000000000000000000ffff000000000000000000 00ffff00000000000000000000ffff00000000000000000000ffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d89ed89e4e3e3effffff00000000000000000000ffff0000000000 0000000000ffff00000000000000000000ffff00000000000000000000ffff00000000 000000000000ffff00000000000000000000ffff00000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d89e9e4e9e3effffff00000000ffffffffffffffff00 000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff 00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffff00000000ffffffff ffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffff ffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffff000000 ffffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff0000 0000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffff ff00000000ffffffffffffffffff00000000ffffffffffffffff00000000ffffffffff ffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffff ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3e ffffffffffff000000ffffffffffffffffffff00000000ffffffffffffffff00000000 ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff000000 00ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed8 9e4e3e3effffffffffffff000000ffffffffffffffffffff00000000ffffffffffffff ff00000000ffffffffffffffff00000000ffffffffffffffff00000000ffffffffffff ffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffff0000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d8d89e9e4e9e3effffffffffffff00000000ffffffffffffffffffff00000000ffff ffffffffffff00000000ffffffffffffffff00000000ffffffffffffffff00000000ff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffff00ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89ed89e4e3e3effffffffffffffff000000ffffffff0000000000000000 0000ffff00000000000000000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffff00ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffff000000ffffff00000000 000000000000ffff00000000000000000000ffff00000000000000000000ffff000000 00000000000000ffff00000000000000000000ffff00000000000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffff0000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffff00000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 9e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffff00000000000000ffffffffff000000000000 00ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e 9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000ffffffff0000000000000000ffffffff000000 0000000000ffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 9ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffffffff00ffffff00000000ffffffffffffffff 00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffff00000000ffffffffff ffffff00000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff000000ffff ffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff00 0000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffff00000000ffffffff00ffffff00000000ffffffff00ffff ff00000000ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffff0000000000000000ffffffff000000000000 0000ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e 4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffff00000000000000ffffffffff00 000000000000ffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000ffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e 9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000000000ffffffff0000000000000000ffffff ff0000000000000000ffffffff0000000000000000ffffffff0000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffff0000000000ffffffffffffffffffffffffffffffffffff000000000000000000ff ffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000000000ffffff00000000000000 0000ffffff000000000000000000ffffff000000000000000000ffffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffffff00000000000000 0000ffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000 000000ffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffff00000000ffff000000 00ffff000000ffffff00000000ffff000000ffffff00000000ffff000000ffffff0000 0000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000ffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffff00000000ffffff000000ffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ff000000ffffffff000000ffff000000ffffffff000000ffff000000ffffffff000000 ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffff000000ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffff000000ffffff0000ffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e 3effffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffff000000ffffffff000000ffff000000ffffffff000000ffff000000ffffff ff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffff000000ffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff000000ffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89e d89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff00000000ffff000000ffffffff000000ffff000000ffffffff000000ffff0000 00ffffffff000000ffff000000ffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000ff000000ffffffffffff ffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ffff00 0000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000000000ffffff000000ffffffff000000ffff000000ffffffff000000 ffff000000ffffffff000000ffff000000ffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000ffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff000000 00ffff00000000ffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffff00000000ffff00000000ffff00000000ffff 00000000ffff00000000ffff00000000ffff00000000ffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff0000 0000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00000000ffffff000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffff000000ffffffff00000000000000000000ffff0000 0000000000000000ffff00000000000000000000ffff00000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ff00000000ffffffff000000ff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffff000000ff0000000000ff ffff000000ff0000000000ffffff000000ff0000000000ffffff000000ff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffff000000ffff00 0000ffffffff000000ffff000000ffffffff000000ffff000000ffffffff000000ffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffff0000ffffffffffffffffffffffffffffffffffffff000000 ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff0000 00ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000ffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000ffff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000ffffff00ffffffff00000000ffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff ffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffff000000000000ffffffffffff00000000000000ffffffffffffffffffffffffffff ffffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e 3e3effffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 0000ffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e 4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffff000000ffffff00000000ffff000000ffffff00000000ffff000000ff ffff00000000ffff000000ffffff00000000ffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffff000000ffff00000000000000000000ffff00000000000000 000000ffff00000000000000000000ffff00000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffff000000ffff000000ffffff00000000ffff000000ff ffff00000000ffff000000ffffff00000000ffff000000ffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000000000ffff000000ffffffff000000ffff 000000ffffffff000000ffff000000ffffffff000000ffff000000ffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000000000ffff000000ffffffff00 0000ffff000000ffffffff000000ffff000000ffffffff000000ffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff000000ffffffff000000 000000000000ffffff000000000000000000ffffff000000000000000000ffffff0000 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff000000ffffff ffff0000000000000000ffffffff0000000000000000ffffffff0000000000000000ff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff0000 00ffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed8 9e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ff000000ffffffffff00ffffffff00000000ffffff00ffffffff00000000ffffff00ff ffffff00000000ffffff00ffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff d8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ff000000ffffffffff0000000000000000ffffffff0000000000000000ffff ffff0000000000000000ffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffff000000000000ffffffffffff0000000000 00ffffffffffff000000000000ffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e 3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8 9e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffff00000000ffff000000ffffffffffffffffffffffffffff000000000000000000ff ff0000000000000000ffffffffffffffffffffffffffffffffff000000000000000000 ffffffffff00000000000000ffffffffffffffffffffffffffffff0000000000000000 00ffffffff00000000ff000000ffffffffffffffffffffffffffffff00000000000000 0000ffffffffff00000000000000ffffffffffffffffffffffffffffff000000000000 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff0000000000 00000000ffffffff00000000ff000000ffffffffffffffffffffffffffffff00000000 0000000000ffffff000000ffffff000000ffffffffffffffffffffffffffff00000000 0000000000ffffffffff00000000ffff000000ffffffffffffffffffffffffff000000 000000000000ffffff0000000000000000ffffffffffffffffffffffffffffffff0000 00000000000000ffffffffffff00000000000000ffffffffffffffffffffffffffffff ff000000000000ffffffffff00000000ff000000ffff000000ff000000ff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 0000ffffff00000000000000000000ffffffffffffffffffffffffffff000000000000 000000ffff000000000000000000ffffffffffffffffffffffffffffffff0000000000 00000000ffffffff0000000000000000ffffffffffffffffffffffffffffff00000000 0000000000ffffff000000000000000000ffffffffffffffffffffffffffffff000000 000000000000ffffffff000000000000000000ffffffffffffffffffffffffffff0000 00000000000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff00 0000000000000000ffffff0000000000ff000000ffffffffffffffffffffffffffffff 000000000000000000ffffff000000ffffff000000ffffffffffffffffffffffffffff 000000000000000000ffffffff00000000000000000000ffffffffffffffffffffffff ff000000000000000000ffffff000000000000000000ffffffffffffffffffffffffff ffff000000000000000000ffffffffff0000000000000000ffffffffffffffffffffff ffffffff0000000000000000ffffff000000000000000000ffff000000ff000000ff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e 9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffff00000000ffffffffffffffffffffffffffffffffff ff000000ffffffffff00000000ffff000000ffffffffffffffffffffffffffffffffff ffff000000ffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffff00000000000000000000ffffffffffffffffffffffffffff ffffffff000000ffffffffffff00000000ffffffffff00ffffffffffffffffffffffff ffffffffff000000ffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffff000000000000000000ffffffffffffffffffffff ffffffffffffff000000ffffffffffff000000ffffff000000ffffffffffffffffffff ffffffff000000ffffffffffffffffff000000ffffff00000000ffffffffffffffffff ffffffffff000000ffffffffffffffffff00000000ffff000000ffffffffffffffffff ffffffffffff000000ffffffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffff00ffffffffff000000ffff000000000000000000ffff000000ff00 0000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8 9ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffff000000ffffffff000000ffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffff000000ffffffffffffffffffffffff ffffffffffff000000ffffffffff00000000ffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff00000000ffff00000000ffffffffffffffffffff ffffffffffffffff000000ffffffffff00000000ffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff00000000ffff00000000ffffffffffffff ffffffffffffffffffffff000000ffffffffffff000000ffffff000000ffffffffffff ffffffffffffffffff000000ffffffffffffffff000000ffffffff000000ffffffffff ffffffffffffffffffff000000ffffffffffffffff000000ffffffff000000ffffffff ffffffffffffffffffffff000000ffffffffffffffff00000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffff000000ffff00000000ffff00 0000ff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffff000000ffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffff000000ffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffff000000ffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffff000000ffffff ffffffffffffffffffffffffffffff000000ffffffffffff000000ffffff000000ffff ffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffff000000ff ffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffff000000 ffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffff000000ffffff0000 00ffff000000ff000000ff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffff000000000000000000ffffffffff ffffffffffffffffffffffffff000000ffffffffff000000ffffffff000000ffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff000000ffff ffffffffffffffffffffffffffffffff000000ffffffffff0000000000000000000000 ffffffffffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff0000 00ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffff00 0000ffffffffffffffffffffffffffffffffff000000ffffffffffffff000000000000 000000ffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffffff ff000000ffffffffffffffffffffffffffffffffff000000ffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff000000ff ffff000000ffff000000ff000000ff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff000000 ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff00 0000ffffffffffffffffffffffffffffffffffff000000ffffffffff00000000000000 00000000ffffffffffffffffffffffffffffffffff000000ffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffffff00 00000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff 000000ffffff000000ffff000000ff000000ff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffffff00000000ffff 00000000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffff000000ffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff ff00000000ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffff ffff00000000ffff00000000ffffffffffffffffffffffffffffffffffffff000000ff ffffff000000ffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffff000000ffffff000000ffff000000ff000000ff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff00ff ffffff00000000ffffffffffffffffffffffffffffffffffff000000ffffffffff0000 0000000000000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff 00000000ffffffff00ffffffffffffffffffffffffffffffffffff000000ffffffffff ff000000ffff00000000ffffffffffffffffffffffffffffffffffff000000ffffffff ffff000000ffffffff0000ffffffffffffffffffffffffffffffffffff000000ffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffff000000ffff00000000ffffffffffffffffffffffffffffffffffff000000ff ffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff00 0000ffffffff00ffffffff00000000ffffffffffffffffffffffffffffffffffffffff 000000ffffff00000000000000000000ffffffffffffffffffffffffffffffffffffff ff000000ffffffff00000000ffffffff00ffffffffffffffffffffffffffffff000000 ffffffff00ffffff000000ffffff000000ffff0000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffff0000000000000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ff0000000000ffffffffffffffffffffffffffffffffffffff000000ffff ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff000000ff ffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff000000 ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff0000 00ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff00 0000ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffff000000ff0000000000ffffffffffffffffffffffffffffffffff ffffff000000ffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffff000000ffffff000000ff0000000000ffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff0000000000000000ffffffffffffffffffffffffffff ffff00000000000000ffffff000000ffffff000000ffff0000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3eff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffff00000000ff000000ffffffffffffffffffffffffffffffffff ff000000ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffff000000ffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffff000000ffffffffffffff00000000ffff0000ffffffffffffffffffffffffffff ffffffff000000ffffffffffff000000ffff000000ffffffffffffffffffffffffffff ffffffffffffff000000ffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffff000000ffffff000000ffff000000ffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffff00000000000000ffffffffffffffffffff ffffffffffffff000000000000ffffff000000ffffff000000ffff000000ff0000ffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed89e 4e3e3effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffff000000ffffffff00ffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffff000000ffffffffffffffffffffffffffffff ffffffffff00ffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffff00000000ffffff000000ffffffffffffffffffffffffffff ffffffffffffff00ffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8 d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffff0000000000000000ffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffff000000ffffffffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000000000ffffffff000000ffffffffffffffffffff ffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffff00000000000000ffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffd8d89ed89e4e3e3effffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffd8d8d89e9e4e9e3effffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d89ed8d84e3e3e ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8d8 d84e9e0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00d89e3e3e4e3e009e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e3e3e3e3e3e3e3e 3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e9e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e 3e3e3e3e00d8d89e3e4e9e00d89e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3ed83e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e3ed89e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3ed83e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e00d89ed89e4e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d8 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e3e3e00d8d89e9e4e9e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e00 0000000000000000000000009e9e9e3e00d89ed89e4e3e00d89e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e 9e0000000000000000000000000000009e9e3e3e00d8d89e9e4e9e00d8d89e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d8d89e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89ed89e4e3e00d89e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e9e4e9e 00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89e d89e4e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e 9e9e9e9e9e9e00009e9e9e00009e9e00009e9e9e000000009e9e9e00009e9e9e9e0000 9e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e 3e00d8d89e9e4e9e00d8d89e9e9e9e0000000000000000000000000000009e9e3ed8d8 9e9e9e9e9e9e9e9e9e9e9e00009e9e00009e00009e9e9e00009e9e00009e9e00009e9e 9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e 9e000000009e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00 009e9e9e3e00d89ed89e4e3e00d89e9e9e00000000000000000000000000000000009e 3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e00009e009e9e00009e9e9e00009e9e9e9e9e9e 9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e 9e9e9e9e00000000009e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e9e 9e9e9e00009e9e3e3e00d8d89e9e4e9e00d8d89e9e009e9e9e9e9e9e9e9e9e9e9e9e9e 9e00009e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e0000009e9e9e00009e9e00009e9e 9e9e9e9e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed8 9e9e9e9e9e9e9e9e009e9e00009e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e 9e9e9e9e9e9e9e00009e9e9e3e00d89ed89e4e3e00d89e9e9e009e9e9e9e9e9e9e9e9e 9e9e9e9e9e009e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e0000009e9e9e00009e9e 9e0000000000009e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e3ed8d89e9e9e9e9e9e9e009e9e00009e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e 9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e9e4e9e00d8d89e9e000000000000 000000000000000000009e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e009e00009e9e 9e00009e9e00009e9e9e00009e9e00009e9e9e9e00009e9e00009e9e00009e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e000000009e9e9e9e9e9e9e9e9e9e9e3ed8d89e 9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89ed89e4e3e00d89e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e00009e 9e00009e9e00009e9e9e00009e9e00009e9e00000000009e0000009e0000009e00009e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e 3ed89e9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8d89e9e4e9e00d8d8 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e 9e00009e9e9e000000000000009e9e000000009e9e9e00009e00009e00009e00009e00 00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e3e00d89ed89e4e 3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e3e3e00d8 d89e9e4e9e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e00009e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e009e9e9e9e9e9e9e9e9e9e9e9e00009e9e 9e3e00d89ed89e4e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed8 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e9e009e9e9e9e9e9e9e9e9e9e9e9e 009e9e9e3e3e00d8d89e9e4e9e00d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e3ed89e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e000000000000000000 00000000009e9e9e9e3e00d89ed89e4e3e00d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3e00d8d89e9e4e9e00d8d89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed8d8d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e9ed8d89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed800d89ed89e4e3e00d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8 d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d800d8d89e9e4e9e000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000d89ed89e4e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9ed89e9e 4e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e 9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e3e9e 3e9ed89e4e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e3ed89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e4e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3e d8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e3ed8d89e9e9e9e9e9e9e9e9e9e9e9e9e9e9e 9e9e9e9e9e9e9e9e9e9e9e9e4ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89e3e3ed8d8d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89ed89e d89ed89ed89ed89ed89ed89ed89ed89ed89ed89e3e3ed8d8d89ed89ed89ed89ed89ed8 9ed89ed89ed89ed89ed89ed89ed89ed8 grestore %%EndDocument 1013 1380 a endTexFig 1013 1842 938 2 v 1013 1943 a Ff(step)15 b(can)g(b)q(e)h(a)o(v)o(oided.)j(An) o(y)c(S)g(function)f(can)h(b)q(e)h(asso)q(ci-)1013 1992 y(ated)g(with)f(the)h (en)o(tire)h(spreadsheet)h(or)d(an)o(y)g(of)g(its)h(cells.)1013 2042 y(The)c(full)f(analytic)g(and)h(displa)o(y)f(p)q(o)o(w)o(er)i(of)e(S)i (is)f(a)o(v)n(ailable.)1054 2092 y(W)m(e)25 b(pro)o(vide)h(spreadsheet)i(b)q (eha)o(vior)d(b)o(y)h(in)o(tro)q(duc-)1013 2142 y(ing)21 b(a)h(new)h(class)f (of)g(S)g(ob)r(jects,)j(the)e Fe(spread.frame)p Ff(,)1013 2192 y(and)16 b(sev)o(eral)i(supp)q(orting)f(metho)q(ds.)26 b(A)17 b Fe(spread.frame)1013 2242 y Ff(is)k(an)h(ob)r(ject)h(of)e(class)i Fe("spread")n Ff(,)h(deriv)o(ed)e(from)e(the)1013 2291 y Fe("array")27 b Ff(class,)33 b(with)c(one)h(or)f(more)f(attributes)j(of)1013 2341 y(mo)q(de)16 b Fe("expression")n Ff(.)30 b(The)18 b(default)f(structure) j(main-)1013 2391 y(tains)c(four)g(t)o(yp)q(es)h(of)f(expressions:)24 b Fe("expr")o Ff(,)16 b Fe("before")n Ff(,)1013 2441 y Fe("after")n Ff(,)g(and)g Fe("macro")n Ff(.)25 b(The)16 b(arra)o(y)g Fe("expr")f Ff(and)g(the)1013 2491 y(v)o(ectors)h Fe("before")e Ff(and)i Fe("after")e Ff(are)i(ev)n(aluated)f(ev)o(ery)1013 2540 y(time)i(the)j Fe(spread.frame)d Ff(ob)r(ject)j(is)f(up)q(dated.)35 b(When)1013 2590 y(an)o(y)13 b(cell)i(of)f(the)h Fe(spread.frame)d Ff(is)i(c)o(hanged,)g (an)o(y)g(other)1013 2640 y(cell)j(whose)h(v)n(alue)f(is)h(dep)q(enden)o(t)h (on)f(that)f(cell)h(is)f(auto-)1013 2690 y(matically)11 b(up)q(dated.)p eop %%Page: 2 2 bop 42 65 a Ff(An)o(y)10 b(v)n(alid)f(S)i(expression)g(ma)o(y)e(b)q(e)i(asso) q(ciated)h(with)e(the)0 114 y Fe(spread.frame)p Ff(.)k(Since)d(the)f Fe(spread.frame)e Ff(ob)r(ject)j(is)f(an)0 164 y Fe(array)15 b Ff(with)h(additional)e(attributes,)j(it)e(can)h(b)q(e)h(used)g(in)0 214 y(ordinary)c(calculations.)0 348 y Fg(2)56 b(Spreadsheet)18 b(Kernel)0 428 y Fh(2.1)48 b Fe(spread.frame)13 b Fh(Ob)s(ject)42 508 y Ff(The)37 b Fe(spread.frame)e Ff(ob)r(ject)j(inherits)g(from)e(an)0 558 y(ordinary)e(matrix,)i(data.frame,)h(or)d(three-w)o(a)o(y)h(ar-)0 608 y(ra)o(y)m(.)103 b(An)o(y)42 b(pre-existing)h(ob)r(ject)g(can)f(b)q(e)h (co-)0 658 y(erced)33 b(to)e(a)h Fe(spread.frame)d Ff(b)o(y)i(the)h(S)g (statemen)o(t)0 708 y Fe(x)22 b(<-)f(as.spread\(x\))m Ff(.)33 b(The)19 b Fe(spread.frame)d Ff(ob)r(ject)k Fe(x)0 758 y Ff(has)c(the)g (follo)o(wing)d(four)j(new)g(attributes)g(\(an)o(y)g(or)g(all)e(of)0 807 y(whic)o(h)k(ma)o(y)e(b)q(e)j(empt)o(y\))e(in)h(whic)o(h)g(executable)h (expres-)0 857 y(sions)14 b(are)g(stored.)0 948 y Fe(attr\(x,"expr"\))k Ff(An)37 b(arra)o(y)f(of)g(expressions)i(with)83 998 y(shap)q(e)14 b(iden)o(tical)e(to)h(that)g(of)f(the)i(data)e(arra)o(y)h(within)83 1048 y(the)23 b Fe(spread.frame)c(x)j Ff(itself.)42 b(Eac)o(h)23 b(elemen)o(t)e(of)83 1098 y Fe("expr")15 b Ff(ma)o(y)f(b)q(e)j(an)f (arbitrary)g(S)g(expression)h(that)83 1148 y(ev)n(aluates)d(to)g(a)g(scalar.) 20 b(The)14 b(expression)i(ma)o(y)c(b)q(e)j(a)83 1198 y(constan)o(t,)g(or)g (b)q(e)g(dep)q(enden)o(t)h(on)f(other)g(cells)g(of)f(the)83 1247 y Fe(spread.frame)p Ff(,)k(or)i(b)q(e)g(dep)q(enden)o(t)h(on)f(other)g (ob-)83 1297 y(jects)d(in)e(the)h Fe(search\(\))e Ff(path.)24 b(The)16 b(v)n(alue)f(of)g(eac)o(h)83 1347 y(expression)21 b(is)e(assigned)g(to)g(the)h(matc)o(hing)e(cell)h(of)83 1397 y(the)c(data)g(arra)o(y)m(.)k(The)c(en)o(tire)h Fe("expr")d Ff(is)i(ev)n(aluated)83 1447 y(ev)o(ery)f(time)d(an)o(y)h(cell)h(of)f(the)h Fe(spread.frame)e Ff(ob)r(ject)83 1496 y(is)j(mo)q(di\014ed.)0 1579 y Fe(attr\(x,"before"\))j Ff(A)f(v)o(ector)h(of)e(arbitrary)g(S)h (expres-)83 1629 y(sions.)51 b(The)25 b(en)o(tire)g(v)o(ector)h(is)e(ev)n (aluated)h(ev)o(ery)83 1679 y(time)15 b(an)o(y)h(cell)g(of)f(the)i Fe(spread.frame)d Ff(is)i(mo)q(di\014ed)83 1729 y(and)22 b(b)q(efore)h(the)g (cell-b)o(y-cell)e(expressions)j(in)e(the)83 1779 y Fe("expr")16 b Ff(arra)o(y)m(.)29 b(A)17 b(t)o(ypical)g(application)f(w)o(ould)h(b)q(e)83 1829 y(to)22 b(mo)q(dify/up)q(date)e(one)j(or)f(more)f(v)n(alues)h(of)g(the) 83 1878 y Fe(spread.frame)12 b Ff(in)h(resp)q(onse)j(to)e(c)o(hanges)h(in)f (an)g(as-)83 1928 y(so)q(ciated)h(v)n(ariable)d(.)0 2011 y Fe(attr\(x,"after"\))18 b Ff(A)i(v)o(ector)h(of)e(arbitrary)h(S)g(expres-)83 2061 y(sions.)e(The)13 b(en)o(tire)g(v)o(ector)g(is)g(ev)n(aluated)f(ev)o (ery)i(time)83 2111 y(an)o(y)k(cell)g(of)f(the)i Fe(spread.frame)d Ff(is)i(mo)q(di\014ed)f(and)83 2161 y(after)g(the)g(cell-b)o(y-cell)f (expressions)j(in)d Fe("expr")o Ff(.)26 b(A)83 2210 y(t)o(ypical)16 b(application)g(w)o(ould)g(b)q(e)i(to)f(summarize)e(in-)83 2260 y(formation)20 b(in)i(the)h(up)q(dated)g Fe(spread.frame)p Ff(.)40 b(It)83 2310 y(could)16 b(also)f(b)q(e)i(used)g(to)f(up)q(date)h (another)g(S)f(ob)r(ject)83 2360 y(or)e(a)f(graphical)g(displa)o(y)m(.)0 2443 y Fe(attr\(x,"macro"\))18 b Ff(A)i(v)o(ector)h(of)e(arbitrary)h(S)g (expres-)83 2493 y(sions.)35 b(An)o(y)19 b(individual)f(expression)i(is)g(ev) n(aluated)83 2543 y(on)14 b(request)h(from)d(the)j(user.)1013 65 y Fh(2.2)47 b(Infrastructure:)18 b Fe("spread")c Fh(Metho)q(ds)1054 145 y Ff(The)i(fundamen)o(tal)d(metho)q(d)h(that)h(driv)o(es)g(the)h(pro)q (cess)1013 195 y(is)i(subscripted)i(assignmen)o(t)d Fe([)p Fd( )p Ff(.)31 b(The)19 b(simplest)e(case,)1013 244 y(scalar)c(assignmen)o(t) g(to)h(a)g(single)f(cell,)g(is)1054 327 y Fe("[)p Fd( )p Fe(.spread")19 b Fd( )1119 377 y Fe(function\(object,)g(...,)i(value\))1054 427 y({)1119 477 y(x)h Fd( )f Fe(object[,])1119 527 y(e)h Fd( )f Fe(attr\(object,"expr"\))1119 576 y(e[[...]])g Fd( )g Fe(substitute\(value\)) 1119 626 y(x[[...]])g Fd( )g Fe(eval\(e[[...]]\))1119 676 y(attributes\(x\))e Fd( )j Fe(attributes\(objec)o(t\))1119 726 y(attr\(x,"expr"\))d Fd( )j Fe(e)1119 776 y(update\(x\))1054 826 y(})1054 909 y Ff(The)15 b Fe("expr")e Ff(attribute)h(is)g(remo)o(v)o(ed)g(from)e(the)j(ob)r (ject)1013 958 y(and)9 b(up)q(dated)i(with)f(the)h Fc(formula)e Ff(of)h(the)h(assignmen)o(t,)e(not)1013 1008 y(the)15 b Fc(value)p Ff(.)22 b(Then)15 b(the)h(form)o(ula)c(for)j(the)g(up)q(dated)h(cell)f(is) 1013 1058 y(ev)n(aluated)j(in)g(the)h(frame)e(of)h(the)h Fe("[)p Fd( )p Fe(.spread")d Ff(func-)1013 1108 y(tion.)34 b(This)19 b(has)h(the)g(implication)c(that)k(other)g(cells)f(in)1013 1158 y(the)c Fe(spread.frame)e Ff(m)o(ust)h(b)q(e)h(referenced)j(b)o(y)d(the) g(name)1013 1207 y Fe(x[,])o Ff(.)35 b(Finally)m(,)18 b(the)i Fe(update\(\))e Ff(function)h(is)h(called)f(to)1013 1257 y(ev)n(aluate)i(the) h Fe("before")f Ff(expressions,)j(cycle)f(through)1013 1307 y(the)15 b(en)o(tire)g(set)g(of)f Fe("expr")f Ff(expressions,)j(and)f(then)g (ev)n(al-)1013 1357 y(uate)f(the)g Fe("after")f Ff(expressions.)1054 1407 y(The)h(b)q(eha)o(vior)g(is)g(illustrated)f(in)h(Figure)g(2.)1013 1524 y Fh(2.3)47 b(Design)14 b(Decisions)1054 1604 y Ff(Our)h(initial)e (design)i(of)g(the)g Fe("spread")e Ff(class)j(included)1013 1654 y(just)29 b(t)o(w)o(o)f(t)o(yp)q(es)i(of)e(expressions,)34 b(the)29 b Fe("expr")f Ff(and)1013 1703 y Fe("macro")n Ff(.)33 b(These)20 b(t)o(w)o(o)e(t)o(yp)q(es)h(are)h(all)d(w)o(e)i(need)h(to)e(ob-) 1013 1753 y(tain)f(the)h(b)q(eha)o(vior)g(of)f(the)i(p)q(opular)f(PC)g (spreadsheets.)1013 1803 y(W)m(e)13 b(added)h(the)g(other)h(t)o(w)o(o)e(t)o (yp)q(es)i(for)e(t)o(w)o(o)g(reasons:)19 b(exe-)1013 1853 y(cution)13 b(e\016ciency)i(and)f(simplicit)o(y)m(.)1054 1903 y(Simple)k(matrix)g (summaries,)h(suc)o(h)i(as)f(a)g(set)h(of)e(ro)o(w)1013 1952 y(sums,)g(are)g(e\016cien)o(t)g(in)g(S)g(when)g(executed)i(as)e(a)f(single) 1013 2002 y(statemen)o(t.)43 b(The)23 b(iden)o(tical)f(arithmetic)f(executed) j(on)1013 2052 y(a)19 b(cell-b)o(y-cell)h(basis)g(do)q(es)h(not)f(use)h(the)f (generic)h(arra)o(y)1013 2102 y(structure)15 b(of)d(S)h(and)f(hence)j(b)q (ears)f(a)e(hea)o(vy)h(p)q(erformance)1013 2152 y(p)q(enalt)o(y)m(.)k(F)m(or) d(example,)e(the)j(gradesheet)h(application)c(in)1013 2201 y(Section)k(4.1)f(has)g(essen)o(tially)h(one)g(summary)e(op)q(eration,)1013 2251 y(computing)e(a)j(set)g(of)f(ro)o(w)h(sums.)k(In)c(an)g(arra)o(y)f (language)1013 2301 y(suc)o(h)h(as)f(S,)h(doing)e(this)i(with)f(a)g(single)h (statemen)o(t)f(in)g(the)1013 2351 y Fe("after")d Ff(v)o(ector)i(mak)o(es)f (more)g(sense)i(and)f(is)g(faster)g(than)1013 2401 y(the)i(cell-b)o(y-cell)e (metho)q(d)h(with)g(individual)f(summations)1013 2451 y(for)g(eac)o(h)h(cell) g(in)g(the)g Fe("sum")f Ff(column.)1054 2500 y(Ha)o(ving)18 b(b)q(oth)i Fe("before")e Ff(and)h Fe("after")f Ff(v)o(ectors)j(al-)1013 2550 y(lo)o(ws)d(symmetry)f(in)h(linking)f Fe(spread.frame)p Ff(s)g(to)h(other)1013 2600 y(S)d(ob)r(jects)i(or)f(external)g(information)d (resources)18 b(suc)o(h)f(as)1013 2650 y(databases)d(and)g(real-time)e (sensor)j(arra)o(ys.)p eop %%Page: 3 3 bop 393 70 a Ff(Figure)14 b(2.)k(Simple)12 b Fe(spread.frame)f Ff(with)j(F)m(orm)o(ula)d(Assigned)j(to)g(Cells)p 117 103 1717 2 v 117 113 V 116 1194 2 1081 v 125 1194 V 150 148 a Fe(>)22 b(tmp)609 b(#)22 b(ordinary)e(matrix)281 198 y(1)h(2)h(3)g(4)f(sum)150 248 y(Aaaaa)g(0)g(0)h(0)g(0)65 b(0)150 298 y(Bbbbb)21 b(0)g(0)h(0)g(0)65 b(0)172 347 y(Cccc)21 b(0)g(0)h(0)g(0)65 b(0)150 447 y(>)22 b(x)f(<-)h(as.spread\(tmp\))258 b(#)22 b(turn)f(it)g(into)g(a)h(spread.frame) 150 497 y(>)g(x[1,"sum"])d(<-)j(sum\(x[1,-5]\))106 b(#)22 b(assign)e(formula) h(to)g(cells)150 547 y(>)h(expr\(x\)[[1,"sum)o("]])280 b(#)22 b(formula)e(is)h(stored)150 596 y(sum\(x[1,)f(-5]\))150 696 y(>)i(x[1,1:4])e(<-)h(c\(10,)g(20,)g(30,)g(40\))43 b(#)22 b(assign)e(values) 150 746 y(>)i(x)303 796 y(1)43 b(2)g(3)h(4)21 b(sum)150 845 y(Aaaaa)g(10)g(20)h(30)f(40)g(100)261 b(#)22 b(sum)f(column)f(uses)h(formula) 150 895 y(Bbbbb)43 b(0)g(0)g(0)h(0)65 b(0)172 945 y(Cccc)43 b(0)g(0)g(0)h(0)65 b(0)150 1045 y(>)22 b(names\(attribute)o(s\(x\)\))150 1095 y([1])f("dim")130 b("dimnames")20 b("expr")107 b("macro")150 1144 y([5])21 b("before")64 b("after")86 b("class")p 1824 1194 V 1833 1194 V 117 1196 1717 2 v 117 1206 V 0 1312 a Fh(2.4)48 b(Multipl)o(e)13 b Fe(spread.frame)p Fh(s)42 1392 y Ff(The)27 b(curren)o(t)h(implemen)o(tati)o(on)c(supp)q(orts)k(m)o(ultiple)0 1442 y Fe(spread.frame)p Ff(s)d(and)j(m)o(ultiple)d(views)i(of)g(the)h(same)0 1492 y Fe(spread.frame)13 b Ff(through)i(a)g(single)g(S)g(session.)23 b(W)m(e)15 b(ha)o(v)o(e)0 1541 y(in)o(tro)q(duced)g(sev)o(eral)g(ob)r(jects)g (to)f(simplify)e(the)j(switc)o(hing)0 1591 y(b)q(et)o(w)o(een)22 b Fe(spread.frame)p Ff(s.)35 b(The)21 b Fe(spread.frame)d Ff(k)o(er-)0 1641 y(nel)12 b(assumes)f(the)h Fe(spread.frame)e Ff(is)h(an)g(S)h(ob)r(ject) h(named)0 1691 y Fe(x)18 b Ff(as)h(describ)q(ed)h(in)e(Section)h(2.2.)31 b(The)19 b(switc)o(hing)f(task)0 1741 y(is)f(essen)o(tially)g(a)f(mec)o (hanism)f(for)h(k)o(eeping)h(trac)o(k)h(of)e(the)0 1791 y(user's)k(name)f (for)g(the)g(activ)o(e)h Fe(spread.frame)p Ff(.)32 b(W)m(e)19 b(do)0 1840 y(this)11 b(with)g(a)g(foreground)h(function)f Fe(fg\(\))f Ff(and)h(t)o(w)o(o)g(frame-)0 1890 y(0)i(v)n(ariables)f Fe(.Active)f Ff(and)i Fe(.Active.buffer)m Ff(.)18 b Fe(.Active)0 1940 y Ff(con)o(tains)f(the)g(name)f(of)g(the)i(activ)o(e)f Fe(spread.frame)d Ff(ob-)0 1990 y(ject)i(and)f Fe(.Active.buffer)d Ff(con)o(tains)j(the)g(name)f(of)h(the)0 2040 y(curren)o(t)21 b(t)o(w)o(o-dimensional)16 b(slice.)35 b(When)19 b(the)h(name)e(of)0 2089 y(a)23 b Fe(spread.frame)p Ff(,)f(sa)o(y)g Fe("section1")n Ff(,)j(is)d(assigned)i(to)0 2139 y Fe(.Active)o Ff(,)d(its)f(v)n(alue)f(is)h (duplicated)g(in)g(the)g(S)h(v)n(ariable)0 2189 y Fe(x)15 b Ff(and)f(the)i(screen)h(displa)o(y)c(is)i(up)q(dated.)22 b(Up)q(on)15 b(comple-)0 2239 y(tion)h(of)g(the)h(up)q(date,)h(the)f(resulting)f(ob)r (ject)i(is)e(assigned)0 2289 y(bac)o(k)e(in)o(to)f(the)i(original)d(name)g (stored)j(in)f Fe(.Active)n Ff(.)42 2339 y(The)20 b(ob)r(ject)h Fe(.Registry)e Ff(is)h(a)g(data)g(structure)j(used)0 2388 y(to)h(k)o(eep)h (trac)o(k)g(of)f(the)h Fe(spread.frame)p Ff(s)d(in)i(the)h(cur-)0 2438 y(ren)o(t)d Fe(.Data)o Ff(.)40 b(In)21 b(the)g(curren)o(t)i(v)o(ersion)e Fe(.Registry)f Ff(is)0 2488 y(itself)d(a)h Fe(spread.frame)d Ff(whose)j(macro)e(names)h(are)h(the)0 2538 y(names)12 b(of)g(the)h Fe(spread.frame)p Ff(s.)j(Our)d(in)o(ten)o(t)g(is)f(to)h(mak)o(e)0 2588 y Fe(.Registry)h Ff(a)i(more)f(general)i(nested)h(list.)24 b(Its)17 b(function)0 2637 y(will)e(b)q(e)j(to)e(k)o(eep)i(trac)o(k)f(of)f Fe(spread.frame)p Ff(-sp)q(eci\014c)g(for-)0 2687 y(mat)c(information.)i (Curren)o(tly)m(,)f(the)h(displa)o(y)e(app)q(earance)1013 1312 y(is)d(that)h(of)f(the)h(default)g Fe(print\(\))e Ff(command.)14 b(Ev)o(en)o(tually)m(,)1013 1362 y(the)f(displa)o(y)e(will)h(b)q(e)h (formatted)e(according)i(to)g(the)g(infor-)1013 1411 y(mation)c(stored)k(in)f Fe(.Registry)n Ff(.)18 b(The)12 b(ob)r(ject)h Fe(.Registry)1013 1461 y Ff(is)g(retained)i(across)g(login)d(sessions.)1054 1511 y(All)d(this)g(o)q(ccurs)i(transparen)o(t)g(to)f(the)g(user)g(and,)g(ideally) m(,)1013 1561 y(the)i(user)g(will)e(w)o(ork)i(en)o(tirely)f(through)h (spreadsheet)i(st)o(yle)1013 1611 y(in)o(terfaces,)g(or)h(similar)c (bu\013ers,)16 b(and)e(will)f(nev)o(er)i(need)g(to)1013 1661 y(in)o(teract)f(directly)g(with)g(an)f(S)h(session.)1013 1795 y Fg(3)56 b(Device)16 b(Handler)i(Structure)1054 1875 y Ff(The)c(simplicit)o (y)e(of)h(the)i(spreadsheet)h(is)e(that)g(the)h(user)1013 1925 y(graphically)f(iden)o(ti\014es)i(a)f(cell)h(for)f(review,)h(and)g(p)q (ossible)1013 1974 y(up)q(dating,)11 b(of)g(its)h(form)o(ula.)j(F)m(or)c (discussion)h(purp)q(oses)i(w)o(e)1013 2024 y(will)c(use)j(the)g(terminology) d(of)h Fc(placing)j(the)f(cursor)g(on)h(the)1013 2074 y(c)n(el)r(l)p Ff(.)22 b(When)15 b(the)h(cursor)h(is)e(placed)h(on)f(a)g(cell)h(en)o(try)m (,)f(the)1013 2124 y(cell)i(form)o(ula)e(is)i(displa)o(y)o(ed)g(for)g(up)q (date.)30 b(The)18 b(underly-)1013 2174 y(ing)c(structure)j(of)d(a)h Fe(spread.frame)d Ff(is)j(sp)q(eci\014ed)i(b)o(y)d(the)1013 2224 y(de\014nition)e(of)g(the)i(class)f Fe("spread")o Ff(.)k(Details)c(of)f (iden)o(tify-)1013 2273 y(ing)j(the)i(cell)g(and)f(of)g(displa)o(ying)e(a)i (form)o(ula)e(for)i(up)q(date)1013 2323 y(are)g(device)h(sp)q(eci\014c.)27 b(The)16 b(idea)g(of)g(de\014ning)g(a)g(series)i(of)1013 2373 y Fe(spread.frame)c Ff(devices)19 b(is)e(similar)e(to)i(S)h(supp)q(orting)f (a)1013 2423 y(series)e(of)e(graphics)h(devices.)1054 2473 y(The)j(curren)o(t)i(emacs)d(device)i(w)o(orks)f(b)o(y)g(constructing)1013 2522 y(S)g(command)e(sequences)20 b(and)e(app)q(ending)f(them)g(to)g(the)1013 2572 y(end)c(of)e(the)j(S)e(session)i(bu\013er,)f(essen)o(tially)f(the)i (same)d(as)i(if)1013 2622 y(a)h(user)i(had)f(t)o(yp)q(ed)h(it.)21 b(F)m(uture)16 b(dev)o(elopmen)o(t)e(will)f(mak)o(e)1013 2672 y(the)i(b)q(eha)o(vior)f(more)g(lik)o(e)g(that)h(of)f(a)g(smart)g(graphics)h (de-)p eop %%Page: 4 4 bop 0 29 a Ff(vice)11 b(with)f(a)g(spreadsheet)j(mo)q(de.)j(The)11 b(end)g(result)g(will)e(b)q(e)0 79 y(a)16 b(spreadsheet)i(st)o(yle)f(in)o (terface)g(whic)o(h)f(is)g(a)g(natural)f(ex-)0 128 y(tension)h(of)g(the)g (parser)h(en)o(vironmen)o(t.)23 b(An)16 b(ev)o(en)o(t-based)0 178 y(in)o(terface)e(is)g(under)h(construction)f(to)g(b)q(e)g(used)h(with)e (V)m(er-)0 228 y(sion)h(4)f(of)g(S.)0 345 y Fh(3.1)48 b Fe(emacs)15 b Fh(device:)20 b Fe(Spread)15 b Fh(mo)q(de)42 425 y Ff(W)m(e)e(are)i(w)o (orking)e(with)g(Emacs)h(19.28.)i(In)e(this)g(imple-)0 475 y(men)o(tation)j(of)i(the)g Fe(emacs)f Ff(in)o(terface,)j(the)e(emacs)g(en)o (vi-)0 525 y(ronmen)o(t)12 b(is)g(in)g(c)o(harge)h(and)g(S)f(is)h(a)f(sub)q (ordinate)h(pro)q(cess.)0 575 y(The)18 b(details)f(are)h(based)g(on)g(the)g Fe(comint)e Ff(\(compiler)g(in-)0 624 y(terface\))h(mo)q(de)d(in)o(tro)q (duced)j(with)e(Emacs)g(19.)22 b(W)m(e)16 b(ha)o(v)o(e)0 674 y(de\014ned)e(a)e(new)i(read-only)e(ma)r(jor)f(mo)q(de,)g Fe(Spread)h Ff(mo)q(de,)0 724 y(whic)o(h)i(p)q(ermits)g(cursor)i(mo)o(v)o(emen)o(t)11 b(\(cursor)16 b(arro)o(ws)f(and)0 774 y(page-up)e(and)g(page-do)o(wn)g (commands\),)e(the)j Fe(ENTER)e Ff(k)o(ey)m(,)0 824 y(and)g(sev)o(eral)g Fe(^C)o Ff(-pre\014x)h(k)o(eys.)k(On)c(X-windo)o(ws)e(terminals)0 873 y Fe(Spread)i Ff(mo)q(de)f(accepts)k(mouse)d(clic)o(ks.)42 923 y(The)h(e\013ect)h(of)f(the)g Fe(ENTER)f Ff(k)o(ey)h(is)g(to:)30 1006 y(1.)20 b(place)d(in)f(the)h(minibu\013er)e(an)i(S)f(assignmen)o(t)g (state-)83 1056 y(men)o(t)h(that)h(will)e(re-create)k(the)e(curren)o(t)h (cell)f(v)n(alue)83 1106 y(from)12 b(the)j(curren)o(t)g(cell)f(expression.)30 1189 y(2.)20 b(w)o(ait)13 b(for)h(a)f(minibu\013er)g(en)o(try)m(.)0 1272 y(Once)e(the)g(user)g(has)f(mo)q(di\014ed)e(the)j(minibu\013er)d(en)o (try)j(with)0 1322 y(a)j(replacemen)o(t)f(expression,)i(emacs)f(will)30 1413 y(3.)20 b(prin)o(t)14 b(the)h(mo)q(di\014ed)e(statemen)o(t)h(in)g(the)g Fe(*S*)g Ff(bu\013er,)83 1463 y(tell)9 b(S)h(to)g(execute)i(it,)d(and)h (\014nally)f(prin)o(t)g(the)i(up)q(dated)83 1513 y Fe(spread.frame)g Ff(to)j(the)h(spreadsheet)h(bu\013er.)42 1604 y(The)d(emacs)g(in)o(terface)h (is)f(built)g(on)g(the)h Fe(comint)e Ff(mo)q(de.)0 1654 y(The)k(user)g(m)o (ust)f(\014rst)h(create)h(a)e Fe(.Data)f Ff(directory)i(in)f(the)0 1704 y(appropriate)c(directory)m(.)18 b(Then)11 b Fe(Spread)f Ff(mo)q(de)g(is)h(en)o(tered)0 1753 y(b)o(y)i(loading)e(an)i(emacs)g(lisp)f (\014le)h Fe(sprd-int.el)n Ff(.)18 b(The)13 b(lisp)0 1803 y(\014le)g(creates) j(a)d(new)h(bu\013er)g Fe(*Splus*)e Ff(and)h(runs)i Fe(Splus)d Ff(in)0 1853 y(it.)31 b(If)18 b Fe(.Registry)e Ff(already)i(exists)h(in)f Fe(.Data)f Ff(it)h(is)g(dis-)0 1903 y(pla)o(y)o(ed)12 b(in)g Fe(Spread)f Ff(mo)q(de,)g(otherwise)i(a)g(new)f Fe(.Registry)0 1953 y Ff(is)18 b(created)i(and)e(displa)o(y)o(ed.)31 b(Existing)18 b Fe(spread.frame)p Ff(s)0 2003 y(are)i(displa)o(y)o(ed)f(b)o(y)g(t)o(yping)g Fe("f")g Ff(or)g Fe([mouse-2])f Ff(on)h(the)0 2052 y(name)d(of)h(the)h Fe(spread.frame)d Ff(in)i Fe(.Registry)n Ff(.)28 b(Once)19 b(a)0 2102 y Fe(spread.frame)8 b Ff(has)k(b)q(een)g(displa)o(y)o(ed,)e(all)g (further)i(review)0 2152 y(or)21 b(c)o(hange)f(can)h(b)q(e)g(made)f(en)o (tirely)h(in)f Fe(Spread)f Ff(mo)q(de.)0 2202 y(Cursor)13 b(or)f(mouse)g (motion)e(is)i(used)i(to)e(select)h(a)g(cell.)k(The)0 2252 y Fe(ENTER)12 b Ff(k)o(ey)h(or)g Fe([mouse-3])e Ff(is)i(used)h(to)f(op)q(en)g (a)g(cell's)g(for-)0 2301 y(m)o(ula)d(for)h(displa)o(y)g(or)h(revision.)17 b(Macros)12 b(asso)q(ciated)h(with)0 2351 y(the)g Fe(spread.frame)c Ff(can)k(b)q(e)f(displa)o(y)o(ed,)g(c)o(hanged,)g(or)g(ex-)0 2401 y(ecuted)j(b)o(y)f(t)o(yping)f(or)h(clic)o(king.)42 2451 y(The)f(mec)o(hanics)f(of)g(the)i(in)o(terface)f(are)g(simple)e(in)i(prin-)0 2501 y(ciple.)35 b(Eac)o(h)20 b(k)o(ey)g(or)f(mouse)g(action)g(causes)i (emacs)f(to)0 2550 y(generate,)25 b(t)o(yp)q(e,)f(and)e(execute)i(one)f(or)f (more)f(S)h(com-)0 2600 y(mands)d(in)h(the)h Fe(*Splus*)f Ff(bu\013er.)38 b(Execution)21 b(is)g(initi-)0 2650 y(ated)15 b(b)o(y)g(the)h(emacs)e Fe(\(comint-send-input)o(\))e Ff(function.)0 2700 y(Emacs)d(w)o(aits)g(for)f (the)i(S)g(command)c(to)j(complete)g(with)g(the)1013 29 y Fe (\(accept-process)o(-outp)o(ut\))21 b Ff(function.)47 b(The)24 b(emacs)1013 79 y Fe(\(comint-output-)o(filte)o(r\))14 b Ff(function)j (detects)j(an)o(y)c(er-)1013 128 y(rors)e(in)g(the)h(excution)f(of)g(the)h(S) f(command.)j(When)d(an)g(S)1013 178 y(error)j(is)f(detected)i(in)e(one)g(of)g (a)g(series)h(of)f(S)g(commands,)1013 228 y(all)11 b(further)j(generated)h(S) e(commands)e(are)i(cancelled)h(and)1013 278 y(the)g(displa)o(y)f(shifts)h(to) g(the)g Fe(*Splus*)f Ff(bu\013er.)1054 328 y(All)h(generated)i(command)d (sequences)k(end)f(with)e(an)h(S)1013 378 y(command)h(to)j(prin)o(t)g(the)h (revised)g Fe(spread.frame)c Ff(to)j(a)1013 427 y(temp)q(orary)e(\014le,)i (follo)o(w)o(ed)e(b)o(y)h(an)g(emacs)g(command)d(to)1013 477 y(read)f(that)g(\014le)g(and)f(displa)o(y)g(it)h(in)f Fe(Spread)g Ff(mo)q(de.)1054 527 y(The)e Fe(*Splus*)d Ff(bu\013er)k(is)e(alw)o(a)o(ys)f (a)o(v)n(ailable)f(for)i(the)h(user)1013 577 y(to)k(en)o(ter)h(S)g(commands)c (man)o(ually)m(.)19 b(Tw)o(o)c(common)e(uses)1013 627 y(are)e(for)h(the)g (initial)d(creation)j(of)f(a)h Fe(spread.frame)d Ff(and)i(to)1013 676 y(in)o(v)o(estigate)i(S)h(execution)h(errors.)1054 726 y(A)i(ma)r(jor)e(adv)n(an)o(tage)h(of)h(the)g(emacs)g(in)o(terface)h(is)e (the)1013 776 y(lac)o(k)e(of)h(dep)q(endence)i(on)e(w)o(orkstation)g (graphics)g(displa)o(y)1013 826 y(tec)o(hnology)m(.)20 b(It)c(will)d(will)h (w)o(ork)h(w)o(ell)f(on)h(an)o(y)g(c)o(haracter-)1013 876 y(based)c(terminal) d(for)i(whic)o(h)h(a)f Fe(termcap)f Ff(de\014nition)h(exists.)1013 925 y(In)h(particular,)g(the)h(emacs)f(device)h(in)o(terface)g(can)g(b)q(e)g (used)1013 975 y(o)o(v)o(er)h(slo)o(w)h(telephone)h(connections.)1013 1092 y Fh(3.2)47 b(Graphics)14 b(Device)1054 1172 y Ff(The)21 b(graphics)g(device)h(in)o(terface)f(is)g(still)f(in)g(the)i(ex-)1013 1222 y(istence)27 b(demonstration)d(phase.)54 b(The)26 b(screen)i(is)e(di-) 1013 1272 y(vided)10 b(with)h(the)h Fe(split.screen\(\))c Ff(functions)j(in)o (to)f(small)1013 1322 y(pieces,)i(one)g(p)q(er)h(cell)f(of)f(the)h Fe(spread.frame)p Ff(.)j(The)d(en)o(tire)1013 1372 y Fe(spread.frame)c Ff(is)i(plotted)h(with)f(the)h Fe(text\(\))e Ff(command.)1013 1421 y Fe(spread.frame)i Ff(cells)j(are)g(iden)o(ti\014ed)g(b)o(y)f(a)g(con)o (trol)h(func-)1013 1471 y(tion)c(based)i(on)f(the)h Fe(locator\(\))e Ff(function.)17 b(Once)12 b(the)g(cell)1013 1521 y(has)i(b)q(een)h(lo)q (cated)f(with)f(the)i(mouse,)d(the)j(function)e(will:)1042 1604 y(1.)21 b(place)c(in)h(the)g(S)g(windo)o(w)f(an)g(S)h(assignmen)o(t)e (state-)1096 1654 y(men)o(t)g(that)i(will)e(re-create)k(the)f(curren)o(t)g (cell)f(v)n(alue)1096 1704 y(from)12 b(the)i(curren)o(t)i(cell)d(expression.) 1042 1787 y(2.)21 b(w)o(ait)13 b(for)g(an)h(S)g(en)o(try)m(.)1013 1870 y(Once)i(the)g(user)g(has)g(mo)q(di\014ed)e(the)i(constructed)h(assign-) 1013 1920 y(men)o(t)k(statemen)o(t,)k(using)d(w)o(orkstation-sp)q(eci\014c)i (screen)1013 1969 y(editing,)f(and)g(en)o(tered)h(the)g(mo)q(di\014ed)d (statemen)o(t,)j(the)1013 2019 y(con)o(trol)13 b(function)h(will)1042 2102 y(3.)21 b(execute)f(the)g(mo)q(di\014ed)e(statemen)o(t)h(and)f(prin)o(t) h(the)1096 2152 y(up)q(dated)14 b Fe(spread.frame)d Ff(to)j(the)h(graphics)f (device.)1054 2235 y(P)o(oten)o(tial)21 b(adv)n(an)o(tages)h(of)f(the)i (graphics)f(device)h(in-)1013 2285 y(clude)10 b(the)h(abilit)o(y)e(to)h (place)g(one)h(or)f(more)f(graphs)i(in)e(other)1013 2335 y(windo)o(ws)17 b(of)g(the)i(same)e(graphics)h(device)h(in)e(whic)o(h)h(the)1013 2384 y Fe(spread.frame)11 b Ff(itself)i(is)h(displa)o(y)o(ed.)1013 2501 y Fh(3.3)47 b(F)l(uture)14 b(Dev)o(elopmen)o(t)1054 2581 y Ff(V)m(ersion)h(4)g(of)f(S)h(has)h(facilities)e(for)g(ev)o(en)o(t)i (monitoring.)1013 2631 y(The)i Fe(spread.frame)p Ff(s)e(will)g(b)q(e)j(able)f (to)g(send)h(their)f(up-)1013 2681 y(dating)h(information)e(directly)j(to)g (a)g(FIF)o(O)h(running)e(in)p eop %%Page: 5 5 bop 0 29 a Ff(the)16 b(bac)o(kground)f(of)g(the)h(S)f(session.)24 b(Curren)o(tly)16 b(this)f(in-)0 79 y(formation)c(is)j(sen)o(t)h(to)f(the)g Fe(tty)f Ff(in)h(whic)o(h)f(S)h(is)g(running.)42 128 y(W)m(e)29 b(will)g(extend)i(the)g(infrastructure)g(to)f(include)0 178 y(higher-dimensional)16 b(arra)o(ys)j(and,)g(more)e(generally)m(,)i(ar-)0 228 y(bitrary)12 b(subsets)i(of)d(data)h(ob)r(jects.)19 b(W)m(e)12 b(will)e(supp)q(ort)j(Im-)0 278 y(p)q(ort/Exp)q(ort)e(of)f(p)q(opular)g (spreadsheet)i(\014le)e(formats.)16 b(W)m(e)0 328 y(will)d(ha)o(v)o(e)i(SQL)g (capabilit)o(y)f(and)h(b)q(e)g(able)g(to)g(displa)o(y)f(ar-)0 378 y(bitrary)g(views)g(of)f(database)h(formats.)42 427 y(W)m(e)e(ha)o(v)o(e) g(outlined)g(a)g(tcl/tk)h(in)o(terface)g(that)g(will)e(w)o(ork)0 477 y(on)k(b)q(oth)g(Windo)o(ws)g(and)g(Unix)g(v)o(ersion)g(of)g(S-Plus.)22 b(The)0 527 y(curren)o(t)f(emacs)d(in)o(terface)i(requires)g(a)f(Unix)g (host.)34 b(Al-)0 577 y(though)15 b(the)g(graphics)g(device)h(in)o(terface)g (w)o(orks)f(on)f(b)q(oth)0 627 y(v)o(ersions,)g(it)f(is)h(still)f(v)o(ery)h (rudimen)o(tary)m(.)0 761 y Fg(4)56 b(Examples)0 841 y Fh(4.1)48 b(Gradesheet)42 921 y Ff(I)18 b(frequen)o(tly)g(collect)h(data)f(on)g(sev)o (eral)h(v)n(ariables)f(for)0 971 y(a)g(group)g(of)g(studen)o(ts)h(and)f(need) i(to)e(construct)i(a)e(sum-)0 1021 y(mary)23 b(of)g(the)i(results)h(\(for)e (example,)h(a)f(grade)g(sheet)0 1070 y(sho)o(wing)15 b(the)h(p)q(oin)o(ts)f (earned)h(b)o(y)f(eac)o(h)h(studen)o(t)h(on)e(eac)o(h)0 1120 y(exam)h(question,)h(and)g(the)g(total)g(score\).)28 b(I)17 b(construct)i(a)0 1170 y Fe(spread.frame)d Ff(with)i(the)h(studen)o(t)h (names)d(as)i(the)g(ro)o(w)0 1220 y(iden)o(ti\014er,)13 b(the)g(question)f(n) o(um)o(b)q(ers)g(as)h(the)g(column)e(iden-)0 1270 y(ti\014er.)18 b(I)c(construct)i(an)d Fe("after")g Ff(expression)65 1320 y Fe(after\(x\)["sum"])19 b(<-)i(expression\()87 1369 y(x[,)g(12])h(<-)f (apply\(x[,)f(-12],)h(1,)g(sum\))g(\))0 1419 y Ff(that)e(sums)g(the)h(v)n (alues)e(for)h(the)h(questions)g(and)f(places)0 1469 y(them)13 b(in)h(the)g Fe("sum")f Ff(column.)42 1519 y(The)e Fe(spread.frame)d Ff(after)j(one)g(studen)o(t's)h(scores)h(ha)o(v)o(e)0 1569 y(b)q(een)g(en)o(tered)i(app)q(ears)e(in)f(Figure)g(1a.)17 b(Note)c(that)f(I)h(ha)o(v)o(e)0 1618 y(placed)g(the)g(maxim)n(um)8 b(scores)14 b(for)e(eac)o(h)h(sub-question)g(in)0 1668 y(the)19 b Fe(spread.frame)p Ff(.)28 b(This)18 b(functions)h(b)q(oth)f(as)g(an)g(aid)0 1718 y(when)e(en)o(tering)h(the)f(data)g(and)f(as)h(a)g(p)q(ermanen)o(t)f (record)0 1768 y(when)g(the)f(\014lled)g(out)g Fe(spread.frame)e Ff(is)i(prin)o(ted)g(for)g(m)o(y)0 1818 y(class)g(notes)h(b)q(o)q(ok.)42 1868 y(I)c(\014nd)i(it)e(easiest)i(to)f(record)h(grades)g(b)o(y)f(en)o (tering)g(a)g(stu-)0 1917 y(den)o(t's)j(en)o(tire)g(set)g(of)f(question)h (scores)h(at)e(once.)20 b(I)14 b(there-)0 1967 y(fore)i(created)h(a)e (sub-class)h Fe("grade")e Ff(that)h(inherits)h(from)0 2017 y Fe("spread")n Ff(.)i(The)12 b Fe("grade")e Ff(class)i(has)g(one)g (de\014ning)f(c)o(har-)0 2067 y(acteristic,)h(when)g(the)g(cursor)h(is)e (placed)g(on)h(the)f(studen)o(t's)0 2117 y(name,)g(the)i(en)o(tire)g(ro)o(w)f (except)i(for)e(the)h Fe("sum")e Ff(column)g(is)0 2166 y(op)q(ened)k(for)f (data)f(en)o(try)m(.)19 b(\(Normally)m(,)10 b(when)15 b(a)e(ro)o(w)h(lab)q (el)0 2216 y(is)i(en)o(tered,)h(the)f(whole)g(ro)o(w)f(is)g(op)q(ened.\))25 b(F)m(or)15 b(example,)0 2266 y(when)d(I)f(en)o(ter)i(studen)o(t)f Fe(Bbbbb)f Ff(b)o(y)g(clic)o(king)f(on)i(the)g Fe(Bbbbb)0 2316 y Ff(cell)i(in)f(Figure)h(1a,)f(the)i(en)o(try)f(panel)g(displa)o(ys)p 0 2348 922 2 v 0 2358 V -1 2448 2 91 v 8 2448 V 33 2392 a Fe(x["Bbbbb",-12]) 19 b Fd( )186 2442 y Fe(c\(0,0,0,0,0,0,0,)o(0,0,0)o(,0\))p 912 2448 V 921 2448 V 0 2450 922 2 v 0 2460 V 0 2510 a Ff(I)j(mo)q(dify)d (this)j(to)f(the)i(appropriate)e(v)n(alues)h(from)e(the)0 2560 y(mark)o(ed)13 b(exam:)p 0 2584 V 0 2594 V -1 2684 2 91 v 8 2684 V 33 2629 a Fe(x["Cccc",-12])19 b Fd( )164 2679 y Fe(c\(1,2,3,4,5,6,7,8) o(,9,10)o(,11\))p 912 2684 V 921 2684 V 0 2686 922 2 v 0 2696 V 1013 29 a Ff(Figure)k(3.)47 b Fe(after\(\))22 b Ff(Changes)i(Graphs)g(as)f (P)o(oin)o(t)g(is)1013 79 y(Mo)o(v)o(ed.)35 b(Changing)19 b(the)h(v)n(alue)f (of)g(a)h(single)f(p)q(oin)o(t)g(au-)1013 128 y(tomatically)12 b(c)o(hanges)17 b(the)g(graph)e(of)h(the)g(data.)24 b(On)16 b(the)1013 178 y(left)h(graph,)g(the)h(p)q(oin)o(t)f Fe(x[11,"y"])j(=)h (0.379)o Ff(.)29 b(On)17 b(the)1013 228 y(righ)o(t)c(graph,)g(the)i(p)q(oin)o (t)e Fe(x[11,"y"])20 b(=)i(4.379)o Ff(.)1013 315 y 14208860 9946202 1184071 1184071 50454609 35982622 startTexFig 1013 315 a %%BeginDocument: regr.ps gsave 18.000000 547.000000 translate /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 749.000000 -529.000000 scale /picstr 1019 string def 1019 720 8 [1019 0 0 -720 0 720] {currentfile picstr readhexstring pop} image 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0ec8c8c880808030006969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696900c880c8803080300e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0ec8c880c88030800069696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696900c8c8808080 30300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000006969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696969696969696900c8 80c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e00c8303030303030303030303030303030303030303030303030 303030303030c8c8303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030c8c830303030303030303030 3030303030303030303030303030303069696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c880308030803080308030803080308030803080 30803080308030803030c8c83080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 803080308030803080308030803080308030803080308030803030c8c8308030803080 3080308030803080308030803080308030803080696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c88080808080808080808080808080 8080808080808080808080808030c8c880808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080808080808080808030c8c88080 8080808080808080808080808080808080808080808080806969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080808080808080808080 808080808080808080808080808080808030c880808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808030 c880808080808080808080808080808080808080808080808080808069696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c8803080c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c8808080 30c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 8069696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696900c880c8803080300e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8 80c880308030c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c880c8696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696900c8c880808030300e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c8806969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696969696900c880c880 3080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c869696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696900 c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c880696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c86969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88069696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8806969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c8696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696900c8c880808030300e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c8806969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696900c880c880308030 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c869696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696900c8c880 808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c880696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 00c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c86969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88069696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c8696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8806969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c869 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c8806969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696900c880c8803080300e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c869696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696900c8c880808030 300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c880696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696900c880 c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c86969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88069696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c8696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c8c880803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c8806969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c8c8c8308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c869696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00303030308030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c830 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696900c880c8803080300e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e003080 3080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c869696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696900c8c880808030300e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c880696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696900c880c88030 80300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c86969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696969696969696900c8 c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88069696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c8696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c8806969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c869696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c869696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696900c8c880808030300e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c880696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696900c880c8803080300e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c86969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696969696900c8c88080 8030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88069696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696900 c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c8696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c8806969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c869696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c86969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c880696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696900c880c8803080300e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c86969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696900c8c88080803030 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88069696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696900c880c8 803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c8696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 00c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c8806969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c869696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c880696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c86969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ff0000ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffff0000ffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffff0000ffff00000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff00 00ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffff0000ffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffff0000ffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffff0000ffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ff0000ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffff0000ffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffff0000ffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88069 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff 0000ffffff0000ff0000ffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ff0000ffffff0000ffff0000ff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ff0000ffffff0000ff0000ffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffff0000ffff0000ff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffff0000ff0000ffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ff0000ffffff0000ff0000ffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ff0000ffffff0000ffff0000ff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff 0000ffffff0000ff0000ffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffff0000ffff0000ff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff0000ff0000 ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c86969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696900c8c880808030300e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffff0000ffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff 0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffffffff0000ffffff0000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88069696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696900c880c8803080 300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffff0000ffffffffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ff ffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffff0000ffffffffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff0000ffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c8696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696969696900c8c8 80808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ff0000ffffff0000ffffffffffffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000 ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffff0000ffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ff0000ffffff0000ffffffffff ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ff0000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffff0000ffffffffffffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff0000 ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c8806969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffff0000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffff0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffff0000ffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffff0000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c869696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffff ff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffff0000ffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffff0000ffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ff0000ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c880696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000 ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff0000ffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c86969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffff0000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffff0000ffffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff00 00ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffff0000ffffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffff0000ffffffffff0000ffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88069696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000ff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ff0000ffffffffffffff0000ff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ff0000ffffffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff ffffffff0000ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000ffffffffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ff0000ffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ff0000ffffffffffffff0000ff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000ff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000ffffffffffffffff0000ff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88069696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696900c880c8803080300e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c8696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696969696900c8c8808080 30300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c8806969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696969696969696969696969696969696900c8 80c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c869696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c880696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c86969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88069696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696900c880c8803080300e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 69696969696969696969696969696969696900c8c880808030300e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8069696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696900c880c8803080300e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c8696969696969696969696969696969696969696969696969696969696969 6969696969696969696969696969696969696969696969696969696969696969696969 696969696969696969696969696969696969696969696969696900c8c880808030300e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e 0e0e00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c8800000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c830303030303030303030303030303030303030303030 303030303030c8c8303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303000c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c880803080308030803080308030803080308030 80308030803080308030c8c88030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 308030803080308030803080308000c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c88080808080808080808080808080 8080808080808080808080803030c8c880808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808000c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080808080808080808080 808080808080808080808080808080808030c880808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808000c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c800c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 80c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c800c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c800 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffff00ffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffff00000000ffffff000000ffffffffffffffff000000000000000000ffffff000000 000000000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffffffff ff000000000000ffffffffffffff000000ffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffff0000ffffffffffffffffffffffffffffffffffffffffffffff 0000ffffff00000000ffffffff000000ffffffffffffffff000000000000000000ffff ff000000000000000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffff ffffffffff00000000000000ffffffffffff000000ffffffffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffff00000000ffffffffffffffffffffffffffffffffff ffffffffff0000ffff000000ffffffffff000000ffffffffffffffffffffff000000ff ffffffffffffffff000000ffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff00 0000ffffffffffffff00ffffff00000000ffffffffff000000ffffffffffffffff00ff ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffff00000000ffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffff000000ffffffffffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffff0000ffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffff00000000ffffff ffffff00000000000000000000ffffffffffffffffffffffffffff0000000000000000 0000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000ff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000ff0000ffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff00000000ff ffffffffffffff00000000000000000000ffffffffffffffffffffffffffff00000000 000000000000ffffffffffffffffffffffffffffffffffffff00000000ffffffffffff ff0000ffffffffffffffff00000000ff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff00 000000ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff0000 00ffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffff0000ffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000000000ffffffffffffffffffffffffffffffff000000000000ffffff ffffffffff000000ffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ff00000000ffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffff000000ffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff000000 ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffff000000ffffffffffffffffffffffffffffffffffff00000000ff ffffffffffffffffffff0000ffffffffff00000000ffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffff00000000ffffffffffffffffffffffffffffffffffffffffffff000000ff0000 00ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff000000ffff ffff0000ffffff0000ffffff0000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ff000000ffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffff000000ffffffff000000ffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffff0000ffffffffffffffffffffffffffffffffffffffffffffff000000 00ffff000000ffffffff000000ffffffffffffffffffffff000000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffff00 0000ffffffff0000ffffff0000ffffff0000ffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ff000000ffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffff00ffffffffffffffffffffffffffffffffffffffffffffff 00000000ffffffff000000ffffff000000ffffffffffffffffffffff000000ffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffff0000ffffff0000ffff ffff000000ffffffffffff0000ffff0000ffffff0000ffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff000000 ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff0000ffffff 0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffff00ffffff00000000ffffffffffffffffffff000000ffff0000 0000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffff0000 00000000ffffffffffff000000000000ffffffffffffffffffffffffffffffffffff00 00ffffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffff00000000000000ffffffffff000000000000000000 ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff ffff000000000000ffffffffffff000000000000ffffffffffffffffffffffffffffff ffffff0000ffffff0000ffffffffffffffffffffffffffffffffff0000ffffff0000ff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffff0000000000ffffffffffff0000000000 00000000ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8c8803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880303080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffff00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000ffffff000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffff0000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000ffff ffff000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffff00000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000ffff00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffff000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000ffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffff0000000000000000 0000000000000000000000000000000000ffff0000000000ffffffff00ffff00000000 00ffffffff00000000000000000000000000ffffffffffffffffffff00ffffff00ffff ff00ffffff00000000ffffffff0000ffffff00000000ffffffffffffff00000000ffff ffffffff00000000000000ffffff000000000000000000000000000000000000ffffff 00000000ffffffff0000000000ffffff00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff00000000 00000000000000000000000000000000000000000000ffff000000ffffffffffff00ff ff000000ffffffffffff000000000000000000000000ffffffffffffffffffff00ffff ff00ffffff00ffffff000000ffffffffffffffffffff000000ffffffffffffffff0000 00ffffffffffffffff000000000000ffffff0000000000000000000000000000000000 0000ffff000000ffffffff000000000000ffffff000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff 0000000000000000000000000000000000000000000000000000ffffff0000ffff0000 ffff00ffffff0000ffff0000ffff000000000000000000000000ffffff000000000000 0000ffffff00ffffff00ffffff0000ffffff000000ffffffff000000ffffffff000000 0000000000ff0000000000ffffff0000000000ffffff00000000000000000000000000 00000000000000ffff0000ffffff00000000000000ffffff0000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffff000000000000000000000000000000000000000000000000000000ffff0000 ffff0000ffff0000ffff0000ffff0000ffff000000000000000000000000ffffff0000 000000000000ffffff00ffffff00ffffff0000ffffff00000000ffffff0000ffffffff 000000000000000000000000000000ffffff0000000000000000000000000000000000 0000000000000000000000ffffffffffffff000000000000ffffffffff000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffff00ffffffffffffffffffff0000ffffffffffffffffffff00000000 00ffff00ffff0000ffff000000ffff00ffff0000ffffffffffffffffffffffff0000ff ffff0000000000000000ffffff00ffffff00ffffff0000ffffff00000000ffffff0000 ffffff00000000000000000000000000ffffffffffff00000000000000000000000000 00000000000000000000000000000000ffffffffff00000000000000ffffffffff0000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffff00ffffffffffffffffffff0000ffffffffffffffffffff 0000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ff0000ffffff0000000000000000ffffff00ffffff00ffffff000000ffffffffffffff ffff0000ffffff0000000000000000000000ffffffffffffff00000000000000000000 000000000000000000000000000000000000000000ffffff00000000000000ffffffff 00ffff0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffff00000000000000000000000000000000000000 00000000000000000000ffff00ffffffff0000000000ffff00ffffffff000000000000 00000000000000ffffffffffffffff000000ffffff00ffffff00ffffff00000000ffff ffffffffffff0000ffffff00000000000000000000ffffffffffff0000000000000000 000000000000000000000000000000000000000000000000ffffffff00000000000000 ffffff0000ffff00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffff000000000000000000000000000000 00000000000000000000ffffffff00ffff0000000000ffffffff00ffff000000000000 0000000000000000000000ffffffffffffffff000000ffffff00ffffff00ffffff0000 00000000000000ffffff0000ffffff00000000000000000000ffffffff000000000000 000000000000000000000000000000000000000000000000000000ffffffffffff0000 000000ffffffff0000ffffff0000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffff0000000000000000000000 00000000000000000000000000ffffffffffffffffff000000ffffffffffffffffff00 000000000000000000000000000000ffffff0000000000000000ffffffffffffffffff ffff000000ff00000000ffffffff000000ffffffff00000000ff000000ffffff000000 00ff000000000000ffffff0000000000000000000000000000000000000000ffffff00 ffffff00000000ffffff00000000ffff00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffff00000000000000 0000000000000000000000000000000000ffff0000ffff00ffff000000ffff0000ffff 00ffff00000000000000000000000000000000ffffff0000000000000000ffffffffff ffffffffffff000000ffffffffffffffff0000000000ffffffffffffffff00000000ff ffffffffffff000000000000ffffff00000000000000000000000000000000000000ff ffffff0000ffffff000000ffffff00000000ffff000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff000000 000000000000000000000000000000000000000000ffff0000ffff0000ffff0000ffff 0000ffff0000ffff000000000000000000000000000000ffffff0000000000000000ff ffff00ffff0000ffff0000000000ffffffffffff00000000000000ffffffffffffff00 00000000ffffffffffff000000000000ffffff00000000000000000000000000000000 0000ffffffff00000000ffffff00ffffff000000000000ffff00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ff000000000000000000000000000000000000000000000000ffff0000ffff0000ffff ff00ffff0000ffff0000ffffff0000000000000000000000000000ffffff0000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffff000000000000000000000000000000000000000000000000ffffffffffff 000000ffff00ffffffffffff000000ffff0000000000000000000000000000ffffffff ffffffffff000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffff00000000000000000000000000000000000000000000000000ff ffffff0000000000ffff00ffffffff0000000000ffff00000000000000000000000000 ffffffffffffffffff0000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffff00000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffff000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffff0000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffff00000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffff00ff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffff ffffffffffffffffffffffffffffffff00ffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffff000000ffffffffffffffffff0000000000ffffffffffff000000 ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffff0000ffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffff00ffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffff000000ffffffffffffffff000000000000ffffffffff ff000000ffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffff00ffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffff000000ffffffffffffff000000ffffffffff ffffffffff000000ffffffffffff00000000ffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffff0000ffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffff00ffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffff000000ff ffffffffffffffffff000000ffffffffff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000000000ffffffffffffffffffffffffffffff00000000000000ffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffff 000000ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffff ff00ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffffff ffffffff000000ffffffffffffffffffff000000ffffffffff00000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff0000 00ffffffffffffff000000ffffffffffffffffffff000000ffffffffff000000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffff000000ffffffffffffff000000ffffffffffffffffffff000000ffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffff0000ffffff0000ffffffffffffff000000ffffffffff ffffffffffff000000ffffffffffffff000000ffffffffffffffffffff000000ffffff ffffff000000ffffffff0000ffffff0000ffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffff0000ffffff0000ffffffffff000000000000 000000ffffff00000000000000ffffffffff000000000000000000ffffffffffff0000 00ffffffffffffff0000000000000000ffffff0000ffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffff0000ffffff0000ffffffffff0000 00000000000000ffffff00000000000000ffffffffff000000000000000000ffffffff ffff000000ffffffffffffffff0000000000ffffffffff0000ffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffff0000ffffff0000ffffff ffffffff000000ffffffffffffffffffffff000000ffffffffffffff000000ffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff0000ffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff0000ffffff00 00ffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffff000000 ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff0000ffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff0000 ffffff0000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff 0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffff000000ff00000000ffffffffffffffff000000ffff ffffffffff0000000000ffffffffffffffffffff0000000000ffffffffff000000ffff ffffffff000000ff00000000ffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffff000000000000000000ffffffffffffff00 0000ffffffffffff0000000000000000ffffffffffffff000000000000ffffffffff00 0000ffffffffffff000000000000000000ffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffff00000000ffff000000ffffffff ffffff000000ffffffffff000000ffffff000000ffffffffffff000000ffffffffffff ffffff000000ffffffffffff00000000ffff000000ffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000000000000000000000ffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffff000000ffffffff0000 00ffffffffffff000000ffffffff000000ffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000000000000000ffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff000000ffff ffff000000ffffffffffff000000ffffffff000000ffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff00 0000ffffffff000000ffffffffffff000000ffffffff000000ffffffffff000000ffff ffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffff000000ffffffff000000ffffffffffff000000ffffffff000000ffffffffff00 0000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffff00000000ffff00000000ffffffffffff000000ffffffff000000ffff ffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000 00ffff00000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00000000000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff 0000ffffff0000ffffffff00000000000000000000ffffffffffff000000ffffffffff 000000ffffff000000ffffffffffff000000ffffffffffffffffffffffffffffffffff ff00000000000000000000ffffffffff000000ffffffffffffff0000ffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000000000000000ffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffff0000ffffff0000ffffffff000000ff0000000000ffffffffffffff000000ff ffffffff000000000000000000ffffffff000000000000000000ffffffffffffffffff ffffffffff000000ff0000000000ffffffff000000000000000000ffffff0000ffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffff0000ffffff0000ffffffff000000ff00000000ffffffffffffffff 000000ffffffffffffff0000000000ffffffffffff000000000000000000ffffffffff ffffffffffffffffff000000ff00000000ffffffffff000000000000000000ffffff00 00ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000000000ffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffff0000ffffff0000ffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000ffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffff0000ffffff0000ffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffff0000ffffff0000ffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffff00000000ffff000000ff0000000000000000ffffffffffffffff000000ffffff ffffffffffffff000000ffffffffff000000ffffff000000ffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffff00000000000000000000ff000000000000000000ffffffffffffff0000 00ffffffffffffffffffff000000ffffffffff000000ffffff000000ffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffff000000ffffff00000000ffff00000000ffff000000ffffffffff ffff000000ffffffffffffffffffff000000ffffffffff000000ffffff000000ffffff 00000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffff000000ffffffff000000ffff000000ffffffff000000 ffffffffffff000000ffffffffffffffffffff000000ffffffffff000000ffffff0000 00ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffff000000ffffffff000000ffff000000ffffff ff000000ffffffffffff000000ffffffffffffffffffff000000ffffffffff000000ff ffff000000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffff000000000000000000ffff0000 00ffffffff000000ffffffffffff000000ffffffffffffffffffff000000ffffffffff 000000ffffff000000ffff0000000000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffff0000000000000000 ffff000000ffffffff000000ffffffffffff000000ffffffffffffffffffff000000ff ffffffff000000ffffff000000ffff0000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffff ff000000ffff00000000ffff00000000ffffffffffff000000ffffffffffffffffffff 000000ffffffffff00000000ffff000000ffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffff0000ffffff0000ffffffffff00 ffffffff00000000ffff00000000000000000000ffffffffffff000000ffffffffffff ffffffff000000ffffffffff000000000000000000ffffff000000ffffffff0000ffff ff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffff0000ffffff0000ffff ffffff0000000000000000ffffff000000ff0000000000ffffffffffffff000000ffff ffffffff00000000000000ffffffffff000000000000000000ffffffff000000000000 0000ffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff0000ffffff 0000ffffffffffff000000000000ffffffff000000ffff000000ffffffffffffffff00 0000ffffffffffff00000000000000ffffffffff000000ff00000000ffffffffffff00 00000000ffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff00 00ffffff0000ffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffff000000ffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffff0000ffffff0000ffffffffffffffffffffffffffffffff000000ffffffffffff ffffff00000000000000ffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffff0000ffffff0000ffffffffffffffffffffffffffffffff000000ffff ffffffffffffff00000000000000ffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffff000000ff00000000ffffffff ffffffff000000ffffffffffffff0000000000ffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffff0000000000000000 00ffffffffffffff000000ffffffffffff0000000000000000ffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff00000000 ffff000000ffffffffffffff000000ffffffffff000000ffffff000000ffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff 000000ffffffff000000ffffffffffff000000ffffffff000000ffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffff000000ffffffff000000ffffffffffff000000ffffffff000000ffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffff000000ffffffff000000ffffffffffff000000ffffffff000000ff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 00ffffffffffffffffffffffffffffffffffffff00ffff000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffff000000ffffffff000000ffffffffffff000000ffffffff 000000ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 0000000000ffffffffffffffffffffffffffffffffffffff00ffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffff00000000ffff00000000ffffffffffff000000 ffffffff000000ffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffff0000ffffff0000ffffffff00000000000000000000ffffffffff ff000000ffffffffff000000ffffff000000ffffffffffff000000ffffffffffffff00 00ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffff0000ffffff0000ffffffff000000ff0000000000ffff ffffffffff000000ffffffffff000000000000000000ffffffff000000000000000000 ffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffff0000ffffff0000ffffffff000000ff000000 00ffffffffffffffff000000ffffffffffffff0000000000ffffffffffff0000000000 00000000ffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffff0000ffffff0000ffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffff0000ffffff0000ffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffff0000ffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff0000ffffff00 00ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffffffff000000ffffffff000000ff000000ff000000ffffff ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff 000000ffffffff00000000ffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffffffff000000ffffffff000000ff000000ff0000 00ffffffffff000000ffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffff0000ffffff00000000ffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffffffffffff000000ffffffff000000ff0000 00ff000000ffffffffff0000ffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffff0000ffff000000ffffffffffffff00000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffffffffffff000000ffffffff0000 00ff000000ff000000ffffffff000000ffffffffffffffffffff0000000000ffffffff 0000ffffffff000000ffffffffff00000000000000ffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff000000ffff ffff000000ff000000ff000000ffffffff000000ffffffffffffffffffff0000000000 ffffffff0000ffffff00000000ffffffffffff0000000000ffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffff00 0000ffffffff000000ff000000ff000000ffffffff000000ffffffffffffffffff0000 0000ff0000ffffff0000ff00000000ff0000ffffffffffff000000ffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff ffffff000000ffffffff000000ff000000ff000000ffffffff000000ffffffffffffff ffff000000ffff0000ffffffff00000000ffffff0000ffffffffff00000000ffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffffffffffff000000ffffffff000000ff000000ff000000ffffffff000000ffffff ffffffffff00000000ffff000000ffffff000000ffffffff0000ffffffff0000000000 00ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff0000ffff ff0000ffffffffffffffff000000ffffffff0000000000000000000000ffffffff0000 0000ffffffffffffff000000ffffffff0000ffffffffffffffffffffffffffffffff00 0000ff000000ffffffffffffff000000ffffffffffff0000ffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff 0000ffffff0000ffffffffffffffff000000ffffffff0000000000000000000000ffff ffffff000000ffffffffffffff000000ffffffff0000ffffffffffffffffffffffffff ffff00000000ffff000000ffffffffffff000000ffffffffffff0000ffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffff0000ffffff0000ffffffffffffffff000000ffffffff000000ff0000ffff00 00ffffffffffff00000000ffffffffff000000ffffffffffff0000ffffffffffffffff ffffffffff00000000ffffffff000000ffffffff000000ffffffffffffff0000ffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffff0000ffffff0000ffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff00 00ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffff0000ffffff0000ffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff ffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffff0000ffffff0000ffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000ff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00 000000ffff000000ffffffff000000ffffffffffffffffffffff0000000000ffffffff ff00000000000000ffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffff00000000000000000000ffffffff000000ffffffffffffffffffff000000000000 ffffffff000000000000000000ffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffff000000ffffff00000000ffffffffff000000ffffffffffffffffff000000 ffffffffffffff00000000ffffffffff00ffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffffffffffff ff000000ffffffffffff00000000ffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffff ffffffffff000000ffffffffffff000000ffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffff000000000000000000ffffffffff000000 ffffffffffffffffff000000ffffffffffff0000000000000000000000ffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffff0000000000000000ffffffff ff000000ffffffffffffffffff000000ffffffffffff0000000000000000000000ffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffff000000ffffffffffff000000ffffffffff00 0000ffff00000000ffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff00ffffffff 00000000ffffffffff000000ffffffffffffffffff000000ffffffffffffff000000ff ffffff0000ffffff000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff00 00000000000000ffffffff000000000000000000ffffff000000000000000000ffffff ff0000000000000000ffffff000000ff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffff000000000000ffffffffff000000000000000000ffffff0000000000000000 00ffffffffff0000000000ffffffffff000000ffff00000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffff00ffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffff0000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffff00000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff00 00ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffffff0000ffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffffff0000ff00ffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffffff0000ff00ffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffff0000ffff00ffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffff0000ffff00ffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffff000000ffffff00ffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000ffffff000000ffffff00ffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffff00ffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff 00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000ffffffffff00ffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff ffffffff00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffff0000000000000000ffffffffffffff00000000000000ffffffffff0000 00ffffffffffffffff0000000000ffffffffffff000000ffffffffffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffff000000000000000000ffffffffff000000000000000000ffff ffff000000ffffffffffffff0000000000000000ffffffff000000ffffffffffffffff ffff000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffff00000000ffff000000ffffffff00000000ffffffff ff00ffffffff000000ffffffffffff000000ffffff000000ffffffff000000ffffffff ffffffffff00000000ffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffff000000ffffffff000000ffff00000000ff ffffffffffffffffffff000000ffffffffff000000ffffffffff000000ffffff000000 ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffff000000ffffffff000000ffff00 0000ffffffffffffffffffffffff000000ffffffffff000000ffffffffff000000ffff ff000000ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffff000000ffffffff0000 00ffff0000000000000000000000ffffffff000000ffffffffff000000ffffffffff00 0000ffffff000000ffffffffffffffff0000000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff000000ffff ffff000000ffff0000000000000000000000ffffffff000000ffffffffff000000ffff ffffff000000ffffff000000ffffffffffffffff0000000000000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff00 000000ffff00000000ffff000000ffffffffff000000ffffffff000000ffffffffff00 0000ffffffffff000000ffffff00000000ffffff0000ffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffff00000000000000000000ffffff000000ffffffff0000ffffffffff000000ffff ffffffff000000ffffff000000ffffffff000000000000000000ffffff000000ffffff ff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffff000000ff0000000000ffffffffff0000000000000000ffffff000000 000000000000ffff000000000000000000ffffffff000000ff0000000000ffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ffffffffffffffffffffff000000ffff000000ffffffffffffff0000000000ffffffff ff000000000000000000ffffffff0000000000ffffffffffff000000ffff00000000ff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffff000000ff000000ff000000ffffffff00000000ffff 000000ffffffff00000000000000ffffff000000ffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffff000000ff000000ff000000ffffff000000 00000000000000ffffff0000000000000000ffffff000000ffffffffffffffffff0000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffff000000ff000000ff000000ffff 000000ffffff00000000ffffff00000000ffffffffffffffff000000ffffffffffffff ff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffff000000ff000000ff00 0000ffff000000ffffffff000000ffff00000000ffffffffffffffffff000000ffffff ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff000000ff00 0000ff000000ffff000000ffffffff000000ffff000000ffffffffffffffffffff0000 00ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff00 0000ff000000ff000000ffffff000000000000000000ffff000000ffffffffffffffff ffff000000ffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffff000000ff000000ff000000ffffffff0000000000000000ffff000000ffffffff ffffffffffff000000ffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffff000000ff000000ff000000ffffffffffffffffff000000ffff000000 ffffffffffffffffffff00000000ffffff0000ff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffff0000000000000000000000ffffff00ffffffff00000000ff ffff00000000ffffffff00ffffff000000000000000000ffff000000ffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffff0000000000000000000000ffffff000000000000 0000ffffffffff0000000000000000ffffff000000ff0000000000ffff000000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffff000000ff0000ffff0000ffffffffff00 0000000000ffffffffffffff00000000000000ffffff000000ffff00000000ffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffff00ffffffff00ffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff00ffffffff 00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffff00ffffffff00ffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff00 ffffffff00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffff00ffffffff00ffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffff00ffffffff00ffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000000000000000ffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff000000 00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000ff00000000ffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffff000000ffffffffffffffff000000000000000000ff ff000000000000000000ffffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffff000000ffffffffffffffff000000000000ffffffffffffff0000000000 ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffff000000ffffffffffffffff000000ff ffffffffffffffff000000ffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffff000000ffffffffffffffff000000000000 000000ffff000000000000000000ffffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffffff000000ffffffffffffff0000000000000000ffffffffff0000 0000000000ffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffff000000ffffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffff000000ffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffff000000ffffffffffff000000ffffffffffff00000000ffffff000000ffff ff000000ffff00000000ffffff00ffffff00000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffff00000000ffffffffffff000000ffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffff00ffffff00000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffff000000ffffffffffff ffffffffff000000ffffffffffff000000ffffffffffffffffffffff000000ffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffffffffffffffffff000000ffffffff00 0000ffffff0000ffffffff000000ffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffff0000ffffffffffffffffffff0000ffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff000000ffff ffffffffffffffffff000000ffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff000000ff ffffff000000ffff000000ffffffff000000ffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff00 0000ffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff 000000ffffff00000000ffff000000ffffffff000000ffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff0000ffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffff000000ffffffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffff0000000000000000ffffff00000000ffff00000000ffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff00 0000ffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffff00000000ffffffffff000000000000000000ffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff ffffffff0000ffffffffffff000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffff000000ffffffffffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffff000000000000ffffffff000000ff00000000ffffff ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffff000000ffffffffff00000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffff000000ffffffffffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffffffffffffffffff00000000ff000000ffffff000000ffffffff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffff000000ffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffff000000ffffffffffffffffffffff0000 00ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffffffffffffffffffffffff000000ffff000000ffffffff0000 00ffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffff000000ffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffff000000ffffffffffffffffff ffff000000ffffffffff00ffffffff00000000ffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffffffffffffffffffffffff000000ffff000000ffff ffff00000000ffffff00ffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffff0000000000000000 ffffff000000000000ffffffffff0000000000000000ffffffffffffffffffffffffff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffff00000000000000ffffffff0000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff ffffffffffffffff000000000000000000ffffff000000000000000000ffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff00000000 00000000ffffff000000000000ffffffffffff000000000000ffffffffffffffffffff ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff 00000000ffffffffffffffffff0000000000ffffffff0000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff ffffffffffffffffffffffff000000000000000000ffffff000000000000000000ffff ff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffff0000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffff00000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ff000000ffffffffffffffff000000000000000000ffffff000000000000000000ffff ffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000000000ffffffffff000000ffffffff ffffffff000000000000ffffffff000000000000000000ffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff000000 ffff00ffffffff000000ffffffffffffff000000000000ffffffffffffff000000ffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffff000000ffffffffffffffff000000000000000000ffffff00000000000000 0000ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffff000000 ffffffffffffff0000000000000000ffffff000000000000000000ffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ff000000ffff00ffffffff000000ffffffffffffff00000000000000ffffffffffff00 0000ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ff000000ffffffffffff00000000ffffff000000ffff000000ffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffff000000ffff00ffffffff000000ffffffffffffff00ffffff00000000ffff ffffff000000ffffffffffffffff00ffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffff000000ffffffffffffffffffffff000000ffffffffff ffffffff000000ffffffffffffffff000000ffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffff000000ffffffff000000ffffff000000ffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffff000000ffff00ffffffffffffffffffffffffffffffffffffff00 0000ffffffffffff0000ffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffff000000ffffffffffffffffffffff000000ff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffff000000 ffffffffffffff00000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff ffffff000000ffffffffffff000000ffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffff000000ffffffffffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffff000000ffffff00000000ffffff ffff000000ffffffffffff00000000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffff ffffffffffff00000000ffffffffffffff0000ffffffffffffffff00000000ff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff0000000000000000 ffffffffffffff000000ffffffffff00000000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffff ffffffffffffff000000000000ffffffffffffffff000000ffffffffffff0000000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff0000 0000ffffffffffffffffffff000000ffffffffff0000ffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ff0000ffff000000ffff00ffffffff ffffffffffffffffffffff00000000ffffffffffffffffffffff0000ffffffffff0000 0000ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff0000 00ffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ff000000000000ffffffffffffffffffff000000ffffffff000000ff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ff000000ff000000ffff00 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffff ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffff000000ffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffff00000000ff000000ffffffffffffffffff000000ffffffffff0000ff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000ff0000 00ffff00ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffff000000ffff000000ffffffffffffffffff000000ffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff 0000000000ffff00ffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffff000000ffffff000000ffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffff000000ffff000000ffffff00ffffffff00000000ffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffff0000000000ffff00ffffffffffffffffffffffffffff00ffffff00000000ff ffffffffffffffffff000000ffff00000000ffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000ffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffff0000000000000000ffffff000000000000ffffffff ffff000000000000ffffffffffffffffffffffffffffffffff0000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffff ffffffffffffffffffffffffffffffffff00000000000000ffffff0000000000000000 ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffff00000000ffff00ffffffffffffffffffffffffffff0000000000 0000ffffffffff000000000000000000ffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffff0000000000000000ffffff000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffff000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff000000 000000ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffff000000ffff00ffffffffffffffffffffffffffffff 0000000000ffffffffffff000000000000000000ffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff00ffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffff00ffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff00ff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000ffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffff00ffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffff00ffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000000000ffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffff00ffffffffffffffffffffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000000000000000ffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffff0000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffffffff0000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000000000000000ffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffff0000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffff000000ffffffffffffffff00 0000000000000000ffffffff0000000000ffffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffff000000ffffffffffffff000000000000000000ff ffff0000000000ffffffffffff000000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffff000000ffffff ffffffff000000000000ffffffffff000000000000000000ffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffff000000ffffffffff ffffff000000000000000000ffffff00000000000000ffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffff000000ffffffffffffff000000000000 000000ffffff00000000000000ffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff0000 00ffffffffffffff00000000000000ffffffff000000000000000000ffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff000000ff ffffffffffffffffffff000000ffffffffff000000ffffff000000ffffffffffff0000 00ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffffff ff000000ffffffffffff00ffffff00000000ffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffffff ffff000000ffffffffffffff00ffffff00000000ffffff000000ffffffffffffffffff ff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff 000000ffffffffffffffffffffff000000ffffffffff0000ffffffffff0000ffffffff ffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffff000000ffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffff000000ffffffff000000ffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffff000000ffffffffffffffffffffff000000ffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffff000000ffffffffffffffffffffff000000ffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000ffffffffffffffffffffffffffffffffffffffff00000000ffffff ffffff000000ffffffffffffffff00000000ff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffff000000ffffffffffffffffffffff000000ffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff00000000ffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffffffff000000ffffffffffff000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffff000000ffffffffffffffffffffff000000ffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff0000000000 00ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff0000 0000ffffffffffffffffffffff000000ffffffff00000000ffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffff000000ffffffffffffffffffffff00 0000ffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff00 000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffff000000ffffff000000ffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffff000000ffffffffffffffff ffffff000000ffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffff ffffff0000ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000ffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff000000ffffffff ffffffffffffff000000ffffffffff0000ffffffffff0000ffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffff0000 00ffffffffffff0000ffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff000000 ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff000000 ffffffffffffffffffffff000000ffffffffff000000ffffff000000ffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffff000000ffffffffffff000000ffffffffffffffff00ffffffff00000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffff00000000ffffff ffffffffffffffffffffffffff00ffffff00000000ffffff00ffffffff00000000ffff ff00000000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ff0000000000000000ffffff000000000000ffffffffffff00000000000000ffffffff ffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffff000000000000ffffffffffff0000000000000000ffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000 00ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffff0000000000000000ffffff000000000000ffffffffffffff0000000000ff ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffff000000000000ffffffffffff0000000000000000ffffffff00000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff0000 00000000ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 0000000000000000000000ffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000000000ffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff 0000ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000000000ffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffff ffffffff000000ffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000000000000000ffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff0000 000000ffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffff000000ffffffffffffff000000000000000000ffff000000000000000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000000000ffffffffff000000ffffffffffffffff000000000000ffff ffffff0000000000ffffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffff ffff00000000000000ffffffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffffff000000ffffffffffffff000000000000000000ffff0000000000000000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000000000ffffffffff000000ffffffffffffff0000000000 000000ffffffff00000000000000ffffffff000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 00000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffff ffffffffffff00ffffff00000000ffffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff ff000000ffffffffffff000000ffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffff0000 0000ffffff000000ffffff00ffffff00000000ffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000000000000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffff000000ffffffffffff000000ffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00ffffffffff0000ffffffffffffffffffffffffffffffffffffff000000ffffffffff ff000000ffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffff000000ffffffff000000ffffffffffffffff000000ffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000000000ffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff ffffffffffff000000ffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffff000000ffffffff000000ffffffffffffffffff000000ffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000000000000000000000ffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffffff000000ffffffffffffffffff00000000ff000000ffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffff000000ffffffffffffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffff000000ffffff00000000ffffffff00000000ff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000000000000000000000ffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffffffff000000ffffffffffffffff000000000000000000ffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffff0000000000000000ffffffff0000000000000000 00ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffffffff000000ffffffffffffff00000000ffff00000000 ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffff000000ffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffff00000000ffffffffff00000000ff ff00000000ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffff ff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffff000000000000ffffffff00 0000ffffffff000000ffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffff0000 00ffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffff00000000ff000000 ffffff000000ffffffff000000ffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffffffff ffff000000ffffffff0000ffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff00 00ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff ff000000ffffff000000ffffffff0000ffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ff ffffffffffff00000000ffff000000ffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff00ffff ffff00000000ffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff 000000ffff000000ffffff00000000ffff000000ffffff00ffffffff00000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff 0000000000000000ffffff00000000000000ffffffffffffffffffffffffffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffff000000000000ffffffff ff0000000000000000ffffffffff000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffff00000000000000ffffffff00000000000000ffffffff0000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffff0000000000000000ffffffff0000000000ffffffffffffffffffffffffffff ffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000 ffffffffffff000000000000ffffffffffff000000000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffff0000000000ffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffff0000ffffffffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ff0000000000000000ffffffffffffffffffffffffffffffffff000000ffffffffffff 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffff000000ffffffffffffffffff000000000000ffffffffffffff00 0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffff000000ffffffffffff0000 00000000000000ffffffff0000000000ffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffffff000000ffffffffffffffffffffff000000ffffffff000000000000000000ffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffff000000ffffffffffffffff0000000000000000ffffff ffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffff000000ffffffff ffff000000000000000000ffffffff00000000000000ffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 0000ffffffffff000000ffffffffffffffffffffff000000ffffffff00000000000000 0000ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffffffff000000ffffffffffffff00000000ffffff00 0000ffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000 ffffffffffff000000ffffffffffffffffffff00ffffff00000000ffffffff00ffffff 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffff000000ffffffffffffffffffffff000000ffffffff000000 ffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ff ffffff000000ffffffffff000000ffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffff000000ffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffff00000000000000000000ff000000ffffffffff000000 ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff0000 00ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffff00000000000000 000000ffffffff000000ffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffff ffffffff000000ffffff00000000ffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffff00000000000000000000ff000000ffffffff ff000000ffffffffffffffffffffffffffffffffff000000ffffffffffffffff000000 00ff000000ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff000000 00000000000000ffffffffff000000ffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff0000 00ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffffff 000000000000000000ffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ff00000000000000000000ffffffffffff000000ffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff000000ff ffffff00000000ffff00000000ffffff000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffff0000ffff000000ffffffffffffffffff000000ffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffffffff000000ffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ff000000ffffff000000ffffffff000000ffffff00000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffff000000ff000000ffffffffffffffffffff000000ffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffffffff000000ffffffffffffffff00000000ff000000ffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffff000000ffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffff0000ff000000ffffffffffffffffffff000000ff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffffffff000000ffffffffffffffff000000ffff000000ffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffff0000ffffffff0000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff 000000ffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffffffff000000ffffffffffffffff000000ffff00 0000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffff ffffffffffffff00ffffffff00000000ffffff00000000ffff000000ffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffff0000000000ffffffff00ff ffffff00000000ffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffffffffff0000000000000000ffffffff00 000000000000ffffffffffffffffffffffffffffff0000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffff0000000000000000ffffffffff00000000000000ffffffff ff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffff00000000ffff ffff0000000000000000ffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffffffffffffffffffffffffffff0000000000000000ff ffffffff00000000ffffffffffffffffffffffffffffffffff0000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffff000000000000ffffffffffffff0000000000ff ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff000000000000ffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff00 00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffff0000ffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffffff000000ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000ffffff000000ffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff ffffffffffffffffff0000ffffffffffffff0000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000ff00ffffffffff00ffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000ff00ffffffffff00ffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffff0000000000000000ffffffff ffffffffffffffffffffffffff000000ffffffffffff0000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffff00ffffffffff00ffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffff00ffffffffff00ffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffff0000ffffff0000ffffffffffffffffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000ffffff0000ffffff0000ffff ffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ff ffffffffffffffff000000ffffffffffffffffffff000000ffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffff000000ffffffffffff000000000000000000ffffffffff00 00000000ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffffffffff 0000000000ffffffffffffff000000000000000000ffffff000000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffff000000000000ffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000000000 00ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00000000000000ffffffffffffff000000ffffffffffff000000000000000000ffff ffff00000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffff ffffffff00000000000000ffffffffff000000000000000000ffffff00000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffff00000000ffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff 00000000ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffff000000ffffffffffff000000ffffffffffff000000ffffffff ffffffffff000000ffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff0000 00ffffffffffffff00ffffff00000000ffffffffffffff000000ffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffff0000ffffffffffffffffffff0000 00ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff0000 00ffffffffffffffff0000ffffffffff0000ffffffffffff0000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffff000000ffffffffffff000000ffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 00ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff0000ffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffff000000ffffffffff000000ffffffffff000000ffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff 000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffff000000ffffffff000000ffffffffff000000ffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffff ffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffffff000000 ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffff000000ffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffff000000ffff000000ffffffff ff000000ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ff000000ffffffffffffffffffffffffffffffffff000000 00ffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ffffffffffffffffffffffffffffffffffffffff000000ffff000000 ffffffffff000000ffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ff000000ffffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffff000000ff ffff0000ffffffffff0000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffff0000ffffffffffffffffffffffffff000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffffffffffffffffffffffffff00ffffffff00 000000ffffff000000ffffff000000ffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffffffff0000000000000000ffffff000000000000000000ffffffffffff ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff0000 000000000000ffffffffff00000000000000ffffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff ffffffffffffffffffffffffff0000000000000000ffffffff000000000000ffffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ffffffffffffffffffffffffff0000000000000000ffffff000000000000000000ffff ffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffff000000000000ffffffffffffff0000000000ffffffffffff0000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffff0000000000000000ffffffff000000000000 ffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff0000ffff ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff 000000ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffff0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff00000000 00ffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff0000 00ffffffffffffffff0000000000ffffffffffff0000000000ffffffffffffff000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffff000000ffffffffffffff0000000000ffffffffffffffff ff0000000000ffffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff00 000000000000ffffffffffff000000ffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffff000000ffffffffffffff00000000000000ffffffffff00000000000000ffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffff000000ffffffffffffff00000000000000ffff ffffffff00000000000000ffffffff000000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffff ffff000000ffff00000000ffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000 ffffffffffff000000ffffffffffff000000ffffff000000ffffffff00ffffff000000 00ffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffff000000ffffffffffff000000ffffffffffffff00ffffff00 000000ffffffff000000ffff00000000ffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffff ffffffffffff0000ffffffff000000ffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff ffff0000ffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffff ffffffff000000ffffffff0000ffffffff000000ffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00 0000ffffffffffffff000000ffffffff000000ffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffff00000000000000000000ff0000 00ffffffffff000000ffffffffffffffffffffffffff000000ffffffffff000000ffff ffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffff000000ffff000000ffffffff000000ffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffff000000ffffffffffffff000000ffffffff000000ffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffff000000000000000000 00ff000000ffffffffff000000ffffffffffffffffffffffffff000000ffffffffff00 0000ffffffffffffffff000000ffffffffffffffff00000000ffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffff00000000ff000000ffff000000ffffffff000000ffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffffff000000ffffffffffffff00000000ffff00000000ffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff000000ffff ffffff000000ffffffffffff00000000ffffffffffff000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffff000000000000000000ffff00000000ffff00000000ffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffffffff000000ffffffffffffff000000000000000000ffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff00 0000ffffffffff000000ffffff000000000000ffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffff00000000ffff00000000ffff000000000000000000 ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffffffff000000ffffffffffffff000000ff00000000ffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffff000000ffffffffff000000ffffff00000000ffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffff000000ffffffff000000ffff000000ff00 000000ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffff ffffffffffffff000000ffffffffff000000ffffff0000ffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffff000000ffffffff000000ffff00 0000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffff ffffffffffffffffffffffff0000ffffffffff0000ffffffff0000ffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffff0000ffffffffffffffffffffffffffffff000000ffffffff0000 ffffffff000000ffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffffffff ffffff00000000ffffff00ffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff0000 00ffffffffffffffffffffffffffffff000000ffffff000000ffffffff000000ffffff ffffffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000ffffffffffffffffffffffffffffff00000000ff ff000000ffffffff00000000ffffff00ffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00000000 00000000ffffffff00000000000000ffffffffffffffffffffffffffffff0000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffff00000000000000ffffffffff0000 000000000000ffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffff 00000000000000ffffffffffff00000000000000ffffffff000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff 0000000000000000ffffffffffff0000000000ffffffffffffffffffffffffffffff00 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffff0000000000ffffffff ffff0000000000000000ffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffff0000000000ffffffffffffffffff0000000000ffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00000000000000 00ffffffffffffffffffffffffffffffffff0000ffffffffffffff0000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000 0000000000ffffffffffffffffffffffffffffffffff000000ffffffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffff000000ffffffffffffffff0000000000ffffffffffffffffff000000ffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffff000000ffffffffffffff0000000000 00ffffffffffffffffffff000000ffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffff00 0000ffffffffffffff0000000000ffffffffffffff0000000000ffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffff000000ffffffffffffffff00000000000000ffffffffffffff00 0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffff000000ffffffffffffff00 000000000000ffffffffffffffffff000000ffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000ffff ffffff000000ffffffffffffff00000000000000ffffffffff00000000000000ffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffff000000ffffffffffffffff00ffffff00000000ffffff ffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffff ffffff00ffffff00000000ffffffffffffffff000000ffffffffff000000ffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffffffffffffff000000ffffffffffffff00ffffff00000000ffffffff00ffffff0000 0000ffffffff00ffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff0000 00ffffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffff0000ffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffffffff000000ffffff00000000000000000000ffff00 0000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffff000000ffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffff00000000ffffff000000000000000000 00ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff00 0000ffffffffff00000000ff000000ffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffff000000000000ffffffff0000000000 0000000000ffff00000000ffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ff00000000ffffffffff000000000000000000ffffffffffff00000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff0000 00ffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffff00000000ffffffffffffff 0000ffff000000ffffffff000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffff000000000000ffffffffff00000000ffff00000000ffffff000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff ffff000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff000000ff ffffffff000000ff000000ffffffff000000ff00000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffff00000000ffffffffffffff000000ffffffff000000ffffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffffffff000000ffffffffffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff ff000000ffffffffff0000ff000000ffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffff0000ffffffffffffffffff000000ffffffff000000ffffff00 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffffffff000000ffffffffffffffff0000ffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffff0000000000ffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffff0000ffffffffffffffffff000000ffffffff0000ff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffff ffffffff00ffffff00000000ffffffffffff0000000000ffffffffff00000000ffffff 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffffffff00000000ffff 000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffffffff0000000000000000ffffff000000000000 0000ffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffff00000000000000ffffffffffffffff00000000ffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000ffffffffffffffffffffffffffffffffffff0000000000000000ffffffff00 000000000000ffffffffff0000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffffffffff0000000000000000ffffff0000 000000000000ffffffffffffffffffffffffffffff0000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffff0000000000ffffffffffffffffffff000000ffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000000000ffffffffffffffffffffffffffffffffffff0000000000000000ff ffffffff0000000000ffffffffffff0000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000000000ffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff ffffffffff0000ffffffffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff ffffffffffffffffff000000ffffffffffff0000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff00ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffff000000ffffffffffffff000000ffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ff ffffffffffffff000000ffffffffffffffff000000000000ffffffff00000000000000 0000ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffff000000ffffffffffffff00000000 00ffffffffffffffffffffff000000ffffffff000000000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000000000ffffffffffffffffffffffffffffffffff ffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffffff000000ffffffffffffff000000ffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00000000ffffffffffffff000000ffffffffffffff0000000000000000ffffff000000 000000000000ffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00000000000000ffffffffffffff000000ffffffffffffff 00000000000000ffffffffffffffffff000000ffffffff000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000ffff00ffffffff00ffffffffffffffffffffffffff ffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff00ffffff ff00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffffff000000ffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffff000000ffffffffffff00000000ffffff000000ff ff000000ffffffffffffffffffff00ffffff00000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffff000000ffffffffffff000000ffffff ffffffff00ffffff00000000ffffffffffffffff000000ffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffff00ffffffffff00ffffffffffffffffff ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff00 ffffffffff00ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffffff000000ffffffffffffff000000ffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff000000ffffffff 000000ffffff000000ffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ffffff00ffffffffff00ffffffffff ffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffff00ffffffffff00ffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffff000000ffffffffffffff00000000000000000000ffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff00000000 000000000000ff000000ffffffffff000000ffffffffffffffffffffffffffff000000 ffffffff000000ffffffff000000ffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffff00000000000000000000ff000000ffffffffff000000ffffff ffffffffffffffffffffffffffffffffff000000ffffff00000000000000000000ffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000ff00000000000000ff ffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000ff00000000000000ffffffffffffffffffffffffffffffffffffffff00 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffffffffffffffffffffff00ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffff000000ffffffffffffff00000000000000000000ffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff 00000000000000000000ff000000ffffffffff000000ffffffffffffffffffffffffff ff000000ffffff00000000ffffffffff000000ffffffffffffffff00000000ff000000 ffffffffffffffffffffffffffff00000000000000000000ff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffff000000ffffff0000000000000000 0000ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff000000 0000ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000ffff0000000000ffffffffffffffffffffffffffffffffffff ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000ffffffffffffffffffffffffffffffffff00ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffff000000ffffffffffffff000000000000000000 00ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffff0000000000000000ffffffffffffff000000ffffffffffff0000000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffff00000000ffffffff00000000 000000000000ffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff0000ffff 000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffff00000000ffffffffffffffffffff000000ffffffff0000 0000ffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffff000000000000ffffffffff ff0000ffff000000ffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff 000000ff000000ffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffff000000000000ffffffffffffffffffff000000ff ffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffff00000000ffffff ffffffffff000000ff000000ffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffffff ffffffffff0000ff000000ffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffffffffffffffffffffffffffff00000000ff000000ffffffffffffffffff 000000ffffff000000ffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffff0000ff ffffffffffffffffffff0000ff000000ffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffff000000ffff000000ffffffffff ffffffff000000ffffff000000ffffffff0000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffffff0000000000ffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffff000000ffffffffffffffffffffffffffffffff000000ffff000000ff ffff00ffffffff00000000ffffff00000000ffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffff ffffffffff000000ffffffffffffffffffffff0000000000ffffffff00ffffffff0000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffffffff0000000000000000ffffffffffff00000000ffffffffffffffffffffffff ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff00000000 000000ffffff0000000000000000ffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffff00000000ffffffff000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffffffff0000000000000000ffffffffffffff000000ffffffffffffffff ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ff00000000ffffffffffff000000000000ffffffffffffff0000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffffffffffffffffffffffff0000000000000000ffffffffffffffff000000ffffff ffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffff0000000000000000ffffffffffffffffffffffffffffffffff0000ffffffffffff ff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff000000ff ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ff0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffff000000ffffffffffffffff000000000000ffffffff ffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff0000000000ffffffffffffffff000000ffffff ffffffff000000000000000000ffffffff000000000000ffffffffffff0000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 000000ffffffffff000000ffffffffffffffff000000ffffffffffffffffff00000000 0000ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffff000000ffffffffffffffff000000000000 00ffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff0000 00ffffffffffffff000000000000000000ffffff0000000000000000ffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00000000000000ffffffffff000000ffffffffffffffff000000ffffffffffffffff00 00000000000000ffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff00ff ffff00000000ffffffffffff000000ffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffffff ffff000000ffffffffffffffffffff000000ffffffffff00000000ffffff000000ffff 000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000ffffffffffffffff000000ffffffffffffffff000000ffffffffff ffff00000000ffffff000000ffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffff000000ffffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff0000 ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff00 0000ffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff0000ff ffffffffffff000000ffffffff000000ffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffff00000000000000000000ff000000ffffff ffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffff000000ff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ff000000ffffffffffff000000ffffffff000000ffff00000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffff00000000000000000000ff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ffffffffff 000000ffffff00000000ff000000ffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffff0000ffffffffffff000000ffffff00000000ffff000000000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffff000000ffffffffffffffffff000000000000ffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff000000ff ffffffffff0000000000000000ffff000000ffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffff0000000000000000ffffff0000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffffff000000ffffffffffffffffff00000000ffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffffffffffff 000000ffffffffffffffff00000000ffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffff0000ffffffffffffffff00000000ffffffffffff 0000ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffffff ffffffff000000ffffffffffffff000000000000ffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffffff000000000000ff ffffffff000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffff ffffffffffffffff000000ffffffffffff00000000ff000000ffff000000ffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff00000000 ff000000ffffffffff0000ff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffff ffffffffffffffffffffffff000000ffffffffffff000000ffff000000ffffff0000ff ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff 000000ffff000000ffffffffffff0000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff00 ffffff00000000ffffffffffffffffffffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffff000000ffffff ffffffffffffffffffffffffffffffff000000ffffffffffff000000ffff000000ffff ff000000ffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffff000000ffff000000ffffffffffff0000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffff0000000000000000 ffffff00000000000000ffffffffffffffffffffffffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffff000000000000ffffffffffffff0000000000 0000ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff00000000 0000000000ffffffff00000000000000ffffffffffffff00000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00000000 00000000ffffffff0000000000ffffffffffffffffffffffffffffffffff0000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 000000ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff 00000000ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffff00000000ffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c880c880803030ffffffffffffffffffffffffffffffffff0000000000000000ffffff ffffffffffffffffffffffffffff0000ffffffffffffff0000000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff00000000000000 00ffffffffffffffffffffffffffffffffff000000ffffffffffff0000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffff ff000000ffffffffffffff000000000000000000ffffffffffff000000ffffffffffff ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff0000000000ffffffffffffffff000000ffffffffffffffff000000ffffffffff ffffffff000000000000ffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff000000ffff ffffffffff0000000000ffffffffffffffffffffff000000ffffffff00000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffff ffffffffff000000ffffffffffffff000000000000000000ffffffffffff000000ffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffff000000ffffffffffffffff000000ff ffffffffffffff0000000000000000ffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff00 0000ffffffffffffff00000000000000ffffffffffffffffff000000ffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffff ffffffffffffffffff000000ffffffffffffff000000ffffffffffffffffffffffff00 0000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffffffff 000000ffffffffffffff00000000ffffff000000ffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffff000000ffffffffffffff00ffffff00000000ffffffffffffffff000000ffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffff ffffffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffff ffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffff ffffffffff0000ffffffffffffff000000ffffffff000000ffffffffff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030 ffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffff ffffffffffffffffff000000ffffffffffff000000ffffffff000000ffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000000000ffffffffffffffffffffffffffffffffffffffffff000000ffff000000 00000000000000ffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c8803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8 80803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffff ffffffffffffffffffffffffffff0000ffffffffffff000000ffffff00000000ffffff ffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000000000ffffffffffffffffffffffffffffffff00000000ff000000ff ff00000000000000000000ffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8 8080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000 ffffffffffffffffffffffffffffffffffff000000ffffffffffff0000000000000000 ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000000000ffffffffffffffffffffffffffffff000000000000 000000ffff00000000000000000000ffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffff ffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ff000000ffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff0000 0000ffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff0000ffff000000ffffffffffffffffffffffffffffffff000000 00ffff00000000ffffff0000ffff000000ffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffff000000ffffffffffffffffffffffffffffffffffffff000000ffffffffff ff000000000000ffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ff000000ffffffffffffffffffffffffffffff ff000000ffffffff000000ffffff000000ff000000ffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff000000 ffffffff00000000ff000000ffffffffffffffffff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000ff000000ffffffffffffffffffffff ffffffffff000000ffffffff000000ffffffff0000ff000000ffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffff ff000000ffffffff000000ffff000000ffffffffffffffffff000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffffffffffffffff000000ffffffff0000ffffffffffff0000000000ffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffff ffffffffffffffffffff000000ffffffffffffff00ffffffff00000000ffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffff000000ffffff000000ffff000000ffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff ffffffffffffffffffffffffff00000000ffff000000ffffffffffff0000000000ffff ffff00ffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffff ffffffffffffffffffffffffffff0000000000000000ffff0000000000000000ffffff ffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffff000000000000000000ffffffff00000000000000ffffffff00000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff0000 0000ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8808030 30ffffffffffffffffffffffffffffffffff0000000000000000ffffff000000000000 ffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff ffffffffffffffff000000000000000000ffffffffff00000000ffffffffffff000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffff0000000000ffffffffffffff ffffff000000ffffffffff000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8808080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8 8080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 80c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffff ffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff ff0000ffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffff ffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff ffffffffff000000ffffffffffff0000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8808030 8030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffff ffffffffffffffffffff0000ffffffffffffffffffffff000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880 308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 80c880803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff00 0000000000000000ffffffffff000000ffffffffffffffffffffff000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff ffffff000000ffffffffffffff000000000000ffffffffffff000000000000ffffffff ffffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff0000000000ffffffffffffffff000000ffffffffffffffff0000000000ffff ffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffff ffffff000000000000000000ffffffffff000000ffffffffffffffffffffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 ffffffffffffff000000ffffffffffffff00000000000000ffffffffff000000000000 00ffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffff000000ffffffffffffff00000000 000000ffffffffffffffffff000000ffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ff ffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffffffffffff 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ff ffff000000ffffffffffff000000ffffffffffffff00ffffff00000000ffffffff00ff ffff00000000ffffff00000000ffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffff000000ffffffffffff000000ffffffffffff00 0000ffffff000000ffffffffffffffff000000ffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff 000000ffffffffffffffffffffff000000ffffffffffffffff000000ffffffffffffff ffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0000ffffffffff0000ffffffffffffffffffffffffffffffffffffffffff000000ffff ffffffffffffff000000ffffff000000ffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffff0000ffffffffff0000ffffffffffffffffffffffff ffffff0000ffffffffff0000ffffffffffffffff000000ffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffff ffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffffffffffffff0000000000000000 0000ff000000ffffffffff000000ffffffffffffffffffffffffffffffffffffffff00 0000ffffffffffffffffff000000ffffff000000ffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffff ffffffffffff000000ffffffffff000000ffff00000000000000000000ffff00000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffff ffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff00000000 000000000000ff000000ffffffffff000000ffffffffffffffffffffffffffffffffff ffff00000000ffffffffffffffff00000000ffffff000000ffffff00000000ffffffff ffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffff ffffffffffffffffffff000000ffffffffff000000ffff00000000000000000000ffff 00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffffffffffff ffffff000000000000ffffffffffff000000000000ffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff0000 00ffffffffffffffffffffffffff000000ffffffffff000000ffff0000000000000000 0000ffff00000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffff00000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ff ffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff000000ffff ffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffffffffffff ffffffffffffff00000000ffffffffffffffff00000000ffffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff ffff000000ffffffffffffffffffffffffff000000ffffffffff000000ffffff0000ff ff000000ffffffffff0000ffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff000000000000000000000000ffffffffffffffff000000000000 0000ffffffffffffff00000000000000000000000000ffffffffffffffffffffff0000 0000000000ffffffffffffffffffffffffffffffffffff000000000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000ffffffffffff0000000000000000ffffffffffffff0000000000000000000000 0000ffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffff000000000000000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880 803030ffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffff00 0000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffff000000ffffffffffff 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffff000000ffffffffffffffffffffffffff000000ffffffffff000000ffff ff000000ff000000ffffffffff000000ff000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880 80803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000000000000000000000000000ffffffffffff0000 000000000000ffffffffffff00000000000000000000000000000000ffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffff00000000000000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00000000000000ffffffffffff0000000000000000ffffffffffff0000000000000000 0000000000000000ffffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffff000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8 c8c88080308030ffffffffffffffffffffffffffffffffff000000ffffffffffffffff ffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffff000000ff ffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff000000ff ffffff00000000ff000000ffffffffffffffffffffffffffffffffffffffffffffffff ffff000000ffffffffff000000ffffffffffffffffffffffffff000000ffffffffff00 0000ffffffff0000ff000000ffffffffffff0000ff000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffff ffff0000000000000000ffffffffff000000000000000000000000000000000000ffff ffffffffffff0000000000000000ffffffffffffffffffffffffffff00000000000000 000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffff0000000000000000ffffffffff0000000000 00000000000000000000000000ffffffffffffffff0000000000000000ffffffffffff ffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffc8c880c880803030ffffffffffffffffffffffffffffffffff000000ffffffff ffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffff 0000ffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff 000000ffffffff000000ffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000ffffffffff0000ffffffffffffffffffffffffffffff0000ffff ffffff0000ffffffffffff0000000000ffffffffffffff0000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000 00ffffffffff0000000000000000ffffffff0000000000000000000000000000000000 0000ffffffffffffffff0000000000000000ffffffffffffffffffffffffffff000000 0000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000ffffffffffff0000000000000000ffffffff0000 0000000000000000000000000000000000ffffffffffffffff0000000000000000ffff ffffffffffffffffffffffff0000000000000000000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffff000000 ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 ffffff000000ffffffffffffffffffffffffffffffff00ffffff00000000ffffffff00 ffffff00000000ffffffff000000ffff000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffff000000ffffffffffffffffffffffffffffff 000000ffffff000000ffffffffffff0000000000ffffffffffffff0000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000 000000000000ffffffff0000000000000000ffffffff00000000000000000000000000 00000000000000ffffffffffffffff00000000000000ffffffffffffffffffffffffff 00000000000000000000000000000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00000000000000ffffffffffff0000000000000000ffff ffff0000000000000000000000000000000000000000ffffffffffffffff0000000000 0000ffffffffffffffffffffffffff00000000000000000000000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffff ff0000000000000000ffffff000000000000ffffffffffffffffffffffffffffffffff 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffff00000000000000ffff ffffff00000000000000ffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffff00000000ffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff ffffff00000000000000ffffffff0000000000000000ffffff0000000000000000ffff ffffff0000000000000000ffffffffffffffff00000000000000ffffffffffffffffff ffffffff00000000000000ffffffffff0000000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000ffffffffffff000000000000 0000ffffff0000000000000000ffffffffff0000000000000000ffffffffffffffff00 000000000000ffffffffffffffffffffffffff00000000000000ffffffffff00000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffff ffffffffff0000000000000000ffffff000000000000ffffffffffffffffffffffffff ffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffff00000000 00ffffffffffffff0000000000ffffffffffffffff00000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffff0000000000ffffffffffffffffffff000000ffffffffffffff ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffff00000000000000ffffffffff000000000000ffffffff000000000000 00ffffffffffffff0000000000000000ffffffffffffff00000000000000ffffffffff ffffffffffffffff00000000000000ffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000000000000000000000000000000000ffffffff00 0000000000ffffffff00000000000000ffffffffffffff0000000000000000ffffffff ffffff00000000000000ffffffffffffffffffffffffff00000000000000ffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffff00000000000000ffffffffffffffffffffffffffff0000 0000000000ffffffffffffffff00000000000000ffffffffffffff0000000000000000 ffffffffffffffffffffffff000000000000ffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff0000000000000000000000000000000000000000000000 ffffffffffffffffffffffffff00000000000000ffffffffffffffff00000000000000 ffffffffffffff0000000000000000ffffffffffffffffffffffff000000000000ffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000000000ffffffffffffff00000000000000ffffffffffffffffffffffff ffff00000000000000ffffffffffffffff00000000000000ffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000 00000000ffffffffffffffffffffffffff00000000000000ffffffffffffffff000000 00000000ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c880808030 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffff00000000000000ffffffffffffffff ffffffffffff00000000000000ffffffffffffffff00000000000000ffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000 0000000000000000ffffffffffffffffffffffffff00000000000000ffffffffffffff ff00000000000000ffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880 80308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880 c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffff00000000000000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffff000000000000 00ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000 000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00000000000000ffffffffffffffff00000000000000ffffffffffffffff ffffffffffffffffff00000000000000ffff00000000000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff c8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00000000000000ffffffffffffffff00000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 00ffffffffffffffffff00000000000000ffffffffffffffffffffffffffff00000000 000000000000ff00000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000 00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffff0000000000000000ffffffffffffffffff00000000000000ffffff ffffffffffffffffffffff00000000000000000000ff00000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00000000000000ffffffffffffffff000000 00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 0000000000ffffffffffffffffff00000000000000ffffffffffffffffffffffffff00 000000000000000000000000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 000000ffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000000000000000ffffffffffffffffff000000000000 00ffffffffffffffffffffffffff00000000000000000000000000000000000000ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffffffff ff00000000000000ffffffffffffffffffffffffffffffffffffffffffff0000000000 0000000000000000ffffffffffffffffffff0000000000000000ffffffffffffffffff ffff0000000000000000000000000000000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000ffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000000000000000ffffffffffffffffffff0000 000000000000ffffffffffffffffffffff000000000000000000000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffff ffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff00 0000000000000000000000ffffffffffffffffffffffff00000000000000ffffffffff ffffffffff000000000000000000000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000000000ffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffff ffffff00000000000000ffffffffffffffffffff000000000000000000000000000000 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff ffffff0000000000000000000000ffffffffffffffffffffffffff0000000000000000 ffffffffffffffffff000000000000000000000000000000000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff0000000000ffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000000000000000ffffffffffff ffffffffffffff0000000000000000ffffffffffffffffff0000000000000000000000 00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff000000ffffffff00000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 0000000000ffffffffffffffff00000000000000ffffffffffffffffffffffffffffff ffffffffffffff00000000000000000000ffffffffffffffffffffffffffffff000000 00000000ffffffffffffffff0000000000000000ffffffffffff0000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000ffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000ffffff ffffffffffffffffffffffff00000000000000ffffffffffffffff0000000000000000 ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffff0000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffff00000000000000ffffffffffffffffffffff ffffffffffffffffffffff0000000000000000000000ffffffffffffffffffffffffff ffff00000000000000ffffffffffffff0000000000000000ffffffffffff0000000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff000000000000ffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 0000ffffffffffffffffffffffffffffff00000000000000ffffffffffffff00000000 00000000ffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c880803080 30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c88030 8030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00000000000000ffffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffff ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffffff 00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff000000000000ffffff0000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff0000000000 00000000000000ffffffffffffffffffffffffffff00000000000000ffffffffffffff 00000000000000ffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880 c880803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8 c88080803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00000000000000ffffffffffffffff00000000000000ffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff ffffffffffffffffffffff00000000000000ffffffffffff00000000000000ffffffff ffffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff00000000000000ffffffffffffffffffffffffffffff00000000000000ffff ffffffff00000000000000ffffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffff00c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00000000000000ffffffffffffffff000000000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 00ffffffffffffffffffffffffffff00000000000000ffffffffffff00000000000000 ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 00000000ffff00000000000000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffff00000000000000ffffffffffffffffffffffffffff0000000000 0000ffffffffffff00000000000000ffffffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffff00000000ff0000ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffff0000 0000000000ffffffffffffffffffffffffffff00000000000000ffffffffffffff0000 0000000000ffffffffffffffffffffffffffffff00000000000000ffffffffff000000 00000000ffffffffffffffff00000000000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff000000000000ff00000000000000ffffffffffffffffffffffffffffffffff00 000000000000ffffffffffffff00000000000000ffffffffffffffffffffffffffffff 00000000000000ffffffffff00000000000000ffffffffffffffff00000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffff0000 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffffff ffff00000000000000ffffffffffffffffffffffffffff00000000000000ffffffffff ffff00000000000000ffffffffffffffffffffffffffffffff00000000000000ffffff ff00000000000000ffffffffffffffff00000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffff00000000000000000000000000ffffffffffffffffffffffffffff ffffff00000000000000ffffffffffffff00000000000000ffffffffffffffffffffff ffffffffff00000000000000ffffffff00000000000000ffffffffffffffff00000000 000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 ffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ff ffffffffff00000000000000ffffffffffffffffffffffffffffff00000000000000ff ffffffffffff00000000000000ffffffffffffffffffffffffffffffffff0000000000 0000ffffff00000000000000ffffffffffffff00000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffff ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff ffffffffffffffffffff00000000000000ffffff00000000000000ffffffffffffff00 000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff000000ff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 000000ffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 00000000ffffffffff00000000000000ffffffffffffffffffffffffffffffff000000 00000000ffffffffff0000000000000000ffffffffffffffffffffffffffffffffff00 000000000000ffffff0000000000000000ffffffffffff00000000000000ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffff ffffffffffffffffffffffff00000000000000ffffffffff0000000000000000ffffff ffffffffffffffffffffffffffff00000000000000ffffff0000000000000000ffffff ffffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffff000000ffffffff0000ffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff0000000000000000ffffff0000000000000000ffffffffffffffffffffffffffffff ff0000000000000000ffffff000000000000000000ffffff0000000000000000000000 0000000000000000000000ffffff000000000000000000ffff000000000000000000ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000ffff ffffffffffffffffffffffffffffffff0000000000000000ffffff0000000000000000 00ffffff00000000000000000000000000000000000000000000ffffff000000000000 000000ffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff ff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff000000ffffffffffff0000ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff00c880c880308030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000000000000000000000ffffffffffffffffffffffff ffffffffff00000000000000000000000000000000000000ffffffff00000000000000 00000000000000000000000000000000ffff0000000000000000000000000000000000 0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 0000ffffffffffffffffffffffffffffffffffff000000000000000000000000000000 00000000ffffffff0000000000000000000000000000000000000000000000ffff0000 0000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c88080 3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c88080 803030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000000000000000000000000000ffffffffffffffff ffffffffffffffffffff000000000000000000000000000000000000ffffffff000000 0000000000000000000000000000000000000000ffffff000000000000000000000000 0000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000 000000000000ffffffffffffffffffffffffffffffffffffff00000000000000000000 0000000000000000ffffffff0000000000000000000000000000000000000000000000 ffffff0000000000000000000000000000000000ffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8 c88080308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 c880c880308030ffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff000000000000000000000000000000ffffffffff ffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffff ff0000000000000000000000000000000000000000000000ffffffff00000000000000 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ff000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000 0000000000000000000000ffffffffff00000000000000000000000000000000000000 00000000ffffffff000000000000000000000000000000ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffc8c880c880803030ffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffff00c8c88080803030ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000ffff ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000ff ffffffffff0000000000000000000000000000000000000000000000ffffffffff0000 0000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffff000000000000000000ffffffffffffffffffffffffffffffffffffffffff 0000000000000000000000000000ffffffffffff000000000000000000000000000000 0000000000000000ffffffffff00000000000000000000000000ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffc8c8c88080308030ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffff00c880c880308030ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000 ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000 00ffffffffffffffff0000000000000000000000000000000000000000000000ffffff ffffffff00000000000000000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff ffffffffffff00000000000000000000ffffffffffffffff0000000000000000000000 000000000000000000000000ffffffffffffff00000000000000000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffc8c880c880803030ffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff00c8c88080803030ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00000000000000ffffffffffffffffffffffffff ffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffc8c8c88080308030ffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffff00c880c880308030ffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffc8c880c880803030ffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffff00c8c88080803030ffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffc8c8c88080308030ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffff00c8c8c880308030ffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffc8c880c8c8803030ff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffff00c8c8c8c8803030 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8c830 3080000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000303030 3030800000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 c880308080300080303030303030303030303030303030303030303030303080303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 0080308080803000803030303030303030303030303030303030303030303030803030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030303030303030303030303030 3030303030303030303030303030303030303030303030308030303030303030303030 3030303030303030303030303030803030303030303030303030303030303030303030 30303000c8c88080308000c88080308030803080308030803080308030803080308030 c830803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308000c880c880308000c880803080308030803080308030803080308030803080 30c8308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 30803080308030803080308030803080308030803080308030803030c8803080308030 803080308030803080308030803080308030c830803080308030803080308030803080 3080308030803000c880c880803000c880808080808080808080808080808080808080 80803030c8808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808000c8c88080803000c8808080808080808080808080808080808080 8080803030c88080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808030c8c880 80808080808080808080808080808080808080803030c8808080808080808080808080 808080808080808080303000c8c88080308000c8c88080808080808080808080808080 8080808080808030c8c880808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808000c880c880308000c8c880808080808080808080808080 808080808080808030c8c8808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808030 30c8808080808080808080808080808080808080808080808030c8c880808080800000 00000000000000000000008080803000c880c880803000c88080808080808080808080 808080808080808080803030c880808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808000c8c88080803000c880808080808080808080 80808080808080808080803030c8808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808030c8c88080808080808080808080808080808080808080803030c880808080 0000000000000000000000000000008080303000c8c88080308000c8c8808080808080 80808080808080808080808080808030c8c88080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808000c880c880308000c8c88080808080 8080808080808080808080808080808030c8c880808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080800000 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080803030c8808080808080808080808080808080808080808080808030c8 c88080800080808080808080808080808000008080803000c880c880803000c8808080 8080808080808080808080808080808080803030c88080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080808000c8c88080803000c88080 808080808080808080808080808080808080803030c880808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080000080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808030c8c88080808080808080808080808080808080808080 803030c8808080800080808080808080808080808000008080303000c8c88080308000 c8c880808080808080808080808080808080808080808030c8c8808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808000c880c8803080 00c8c880808080808080808080808080808080808080808030c8c88080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808000008080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080803030c88080808080808080808080808080808080 80808080808030c8c88080800080808080808080808080808000008080803000c880c8 80803000c88080808080808080808080808080808080808080803030c8808080808080 8080808080000080808000008080000080808000000000808080000080808080000080 8000008080000080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808080808080808080808080808000c8c8 8080803000c88080808080808080808080808080808080808080803030c88080808080 8080808080808080000000000000808080808080808080800000000080008080000080 8080808000000080000080000080000000808080000080808000008080000080808000 0000008080808000000000808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808030c8c8808080808080808080808080 8080808080808080803030c88080808000808080808080808080808080000080803030 00c8c88080308000c8c880808080000000000000000000000000000000808030c8c880 8080808080808080808000008080000080000080808000008080000080800000808080 8000008080000080800000808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8000c880c880308000c8c880808080000000000000000000000000000000808030c8c8 8080808080808080808080000080808080000080808080808080800000808000000080 8000008080808000008080000080800000000080000080800000808080000080800000 8080000080800000808000008080000080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080803030c8808080808080808080 000000008080808080808080808030c8c8808080008080808080808080808080800000 8080803000c880c880803000c880808000000000000000000000000000000000008030 30c8808080808080808080808080800000800080800000808080000080808080808080 0000808080800000808000008080000080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808000c8c88080803000c8808080000000000000000000000000000000000080 3030c88080808080808080808080800000808080808000008080808080800000808080 8000008080800000808080000080808000008080000080808000008080000080808000 0080800000800000808080000080000080808000008080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808030c8c880808080 80808000000000008080808080808080803030c8808080800080808080808080808080 808000008080303000c8c88080308000c8c88080008080808080808080808080808080 0000808030c8c880808080808080808080808080000000808080000080800000808080 8080808000008080808000008080000080800000808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808000c880c880308000c8c880800080808080808080808080808080 800000808030c8c8808080808080808080808080808080808080000080808080808000 0080808080800000808000008080808000008080000080800000808080000080800000 8080800000808000008000008080808080808080808080000080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808080808080808080808080803030c880 8080808080808000808000008080808080808080808030c8c880808000808080808080 80808080808000008080803000c880c880803000c88080800080808080808080808080 808080800080803030c880808080808080808080808080800000008080800000808080 0000000000008080000080808080000080800000808000008080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808000c8c88080803000c880808000808080808080808080 80808080800080803030c8808080808080808080808080808080808080000000808080 8080800000808080808000008080000080808080800000000000808000008080808000 0080000080808000008080000080800000808080808080808000000080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8030c8c88080808080808000808000008080808080808080803030c880808080008080 8080808080808080808000008080303000c8c88080308000c8c8808000000000000000 00000000000000000080808030c8c88080808080808080808080808000800000808080 0000808000008080800000808000008080808000008080000080800000808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808000c880c880308000c8c88080000000000000 0000000000000000000080808030c8c880808080808080808080808080808080000000 8080808080808000008080808000000000808000008080808080808080000080000000 8080800000808000008080800000808000008000008080800000808000008080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080803030c8808080808080808000000000808080808080808080808030c8c88080 800080808080808080808080808000008080803000c880c880803000c8808080808080 8080808080808080808080808080803030c88080808080808080808080808000008080 0000808000008080800000808000008080000000000080000000800000008000008080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808000c8c88080803000c88080808080 808080808080808080808080808080803030c880808080808080808080808080808000 0000008080808080808080800000808080808080808080000000000080000080800000 8080000000808000008080000000800000008080000080800000808000008080000080 8000008080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808030c8c88080808080808080808080808080808080808080803030 c8808080800080808080808080808080808000008080303000c8c88080308000c8c880 808080808080808080808080808080808080808030c8c8808080808080808080808080 0000808080000000000000008080000000008080800000800000800000800000800000 0080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808000c880c880308000c8c8 80808080808080808080808080808080808080808030c8c88080808080808080808080 8080000000808080808080808080808000008080808080808080800000800000808000 0000008080800000800000008080800000800000008080800000808080000000008080 8080000000008080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080803030c88080808080808080808080808080808080808080 80808030c8c88080800080808080808080808080808000008080803000c880c8808030 00c88080808080808080808080808080808080808080803030c8808080808080808080 8080808080808080808080808000008080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808080808080808080808000c8c8808080 3000c88080808080808080808080808080808080808080803030c88080808080808080 8080808080800000808080800000808080808080800000808080808000008080808080 8080808080808080808080808080808080808000008080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808030c8c8808080808080808080808080808080 8080808080803030c8808080800080808080808080808080808000008080303000c8c8 8080308000c8c880808080808080808080808080808080808080808030c8c880808080 8080808080808080808080808080808080000080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080808080808080808080808000c8 80c880308000c8c880808080808080808080808080808080808080808030c8c8808080 8080808080808080808080000080808000008080808080808080000000808000008080 8080808080808080808080808080808080808080808080800000808080808080800000 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080803030c8808080808080808080808080 808080808080808080808030c8c8808080008080808080808080808080800000808080 3000c880c880803000c88080808080808080808080808080808080808080803030c880 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808000c8c88080803000c88080808080808080808080808080808080808080803030c8 8080808080808080808080808080808000000000008080808080808080808080000000 0080808080808080808080808080808080808080808080808080808000008080808080 8080000080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808030c8c880808080808080 80808080808080808080808080803030c8808080800080808080808080808080808000 808080303000c8c88080308000c8c88080808080808080808080808080808080808080 8030c8c880808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808000c880c880308000c8c880808080808080808080808080808080808080 808030c8c8808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080808080808080808080803030c880808080 8080808080808080808080808080808080808030c8c880808000000000000000000000 00000000808080803000c880c880803000c88080808080808080808080808080808080 808080808030c880808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808000c8c88080803000c880808080808080808080808080808080 80808080808030c8808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080808080808080808080808030c8 c88080808080808080808080808080808080808080808030c880808080808080808080 8080808080808080808080803000c8c88080308000c8c880c880c880c880c880c880c8 80c880c880c880c880c8c8c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c88000c880c880308000c8c880c880c880c880c880c880 c880c880c880c880c880c8c8c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880 c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c880c8 80c880c880c880c880c880c880c880c880c880c880c880c880c88080c8c880c880c880 c880c880c880c880c880c880c880c880c800c880c880803000c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c800c8c88080803000c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c800c8c88080308000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000c880c8803080000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000c880c8808030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 803080308030803080308030803080308030803080308030803000c8c8808080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 80308030803080308030803080308030803080308030803080308030803080c8808030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 30803080308030803080308030803080308030803080308030803080308000c880c880 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 8030803080308030803080308030803080308030803080308030803080308030803080 3080308030803080308030803080308030803080308030803080308030803080308030 80c880808080808080808080808080808080808080808080808080808030c880808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808000 c8c88080808080808080808080808080808080808080808080808080808030c8808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808080808080808080808030c8808080808080808080808080808080808080808080 80808080808080808080808080808080808080808080808080808080808080808030c8 c880808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 80808000c880c880808080808080808080808080808080808080808080808080808030 c8c8808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808030c8c880808080808080808080808080808080 80808080808080808080 grestore %%EndDocument 1013 315 a endTexFig 1013 1028 938 2 v 1013 1129 a Ff(On)14 b(en)o(try)m(,)g(the)h Fe(spread.frame)d Ff(up)q(dates)j(itself)f(and)g(cal-)1013 1178 y(culates)d(the)g(sum)f(for)g(that)h(studen)o(t.)18 b(It)11 b(w)o(ould)f(b)q(e)h(easy)g(to)1013 1228 y(up)q(date)j(the)h(stem-and-leaf)e (displa)o(y)g(or)h(other)g(summary)1013 1278 y(graphic)k(of)g(the)h(sums,)g (as)g(eac)o(h)g(individual)d(studen)o(t)k(is)1013 1328 y(added)14 b(to)f(the)i Fe(spread.frame)p Ff(.)1013 1445 y Fh(4.2)47 b(Linking)13 b(S)j(Ob)s(jects)1054 1525 y Ff(The)21 b(names)e(of)g(the)i(macros)e(of)h (the)g Fe(spread.frame)1013 1575 y(.Registry)12 b Ff(\(describ)q(ed)k(in)e (section)h(2.4\))f(are)h(the)g(names)1013 1625 y(of)j(other)i Fe(spread.frame)p Ff(s)d(\(for)i(example,)g Fe(section.1)n Ff(,)1013 1674 y Fe(section.2)n Ff(,)k Fe(section.3)d Ff(for)h(an)h (instructor)h(teac)o(hing)1013 1724 y(three)16 b(sections)g(of)e(a)h (course\).)22 b(Execution)16 b(of)e(one)h(of)f(the)1013 1774 y(macros)h(causes)j(the)e(named)g Fe(spread.frame)d Ff(to)j(b)q(e)h(dis-)1013 1824 y(pla)o(y)o(ed.)f(The)11 b(screen)i(displa)o(y)d(of)g Fe(.Registry)f Ff(is)h(therefore)1013 1874 y(a)j(men)o(u)g(in)o(to)g(the)i (other)f Fe(spread.frame)p Ff(s.)1013 1990 y Fh(4.3)47 b(Outliers)13 b(in)i(Regression)1054 2071 y Ff(In)e(Figure)f(3)h(w)o(e)g(ha)o(v)o(e)f (created)i(a)f Fe(spread.frame)d Ff(that)1013 2120 y(con)o(tains)h(t)o(w)o(o) g(columns)f(of)h(data,)h Fe(X)f Ff(and)g Fe(Y)p Ff(.)17 b(W)m(e)12 b(ha)o(v)o(e)f(cre-)1013 2170 y(ated)18 b(an)f Fe("after")g Ff(expression)i(that)f(regresses)i Fe(Y)i Fb(\030)g Fe(X)o Ff(,)1013 2220 y(plots)13 b(the)h(data)f(with)g(emphasis)f(on)h(the)h (\014rst)h(p)q(oin)o(t,)d(and)1013 2270 y(then)18 b(dra)o(ws)f(the)i (regression)f(line.)29 b(Ev)o(ery)18 b(time)e(a)h(data)1013 2320 y(p)q(oin)o(t)e(is)h(c)o(hanged)h(the)g(plot)f(is)g(redra)o(wn.)25 b(The)17 b(applica-)1013 2369 y(tion)10 b(is)g(to)h(illustrate)g(the)g (e\013ect)i(of)d(c)o(hanging)g(the)h(v)n(alue)g(of)1013 2419 y(one)i(p)q(oin)o(t)f(on)g(the)i(regression)g(line.)j(W)m(e)12 b(create)j(an)d(arra)o(y)1013 2469 y(of)g(plots)h(and)g(then)h (systematically)d(c)o(hange)i(the)h(v)n(alue)f(of)1013 2519 y(the)18 b(\014rst)g(p)q(oin)o(t)f(in)g(the)h(data.)29 b(The)18 b(resulting)g(series)h(of)1013 2569 y(plots)c(sho)o(ws)i(that)f(a)g(data)g(p) q(oin)o(t)f(on)h(the)h(edge)g(of)e(the)i Fe(X)1013 2619 y Ff(range)c(has)h(a) g(stronger)g(e\013ect)i(on)d(the)h(slop)q(e)g(than)g(a)f(data)1013 2668 y(p)q(oin)o(t)g(in)g(the)i(cen)o(ter)g(of)f(the)g(range.)p eop %%Page: 6 6 bop 0 29 a Ff(Figure)22 b(4.)42 b(Three-w)o(a)o(y)22 b Fe(spread.frame)p Ff(:)32 b(Gradesheet)0 79 y(with)14 b Fe(sum)f Ff(and)g Fe(course)g Ff(macros.)258 170 y(a.)18 b Fa(sec3[,,"midterm"])p 8 182 922 2 v 8 192 V 7 525 2 334 v 16 525 V 237 276 a Fe(1)44 b(2)f(3)h(4)21 b(sum)85 326 y(Aaaaa)g(19)g(20)g(18)h(21)43 b(78)85 376 y(Bbbbb)21 b(24)g(24)g(19)h(21)43 b(88)107 426 y(Cccc)21 b(13)g(46)g(83)44 b(0)21 b(142)41 475 y(maximum)g(25)g(30)g(20)h(25)f(100)p 920 525 V 929 525 V 8 527 922 2 v 8 537 V 279 606 a Ff(b.)d Fa(sec3[,,"final"])p 8 617 V 8 627 V 7 961 2 334 v 16 961 V 237 712 a Fe(1)44 b(2)f(3)h(4)21 b(sum)p 75 724 138 2 v 75 774 2 51 v 89 762 a(Aaaaa)p 211 774 V 75 776 138 2 v 27 w(20)h(18)f(30)h(15)43 b(83)85 811 y(Bbbbb)f(0)i(0)f(0)h (0)65 b(0)107 861 y(Cccc)42 b(0)i(0)f(0)h(0)65 b(0)41 911 y(maximum)21 b(25)g(25)g(35)h(15)f(100)p 920 961 2 334 v 929 961 V 8 963 922 2 v 8 973 V 303 1041 a Ff(c.)d Fa(sec3[,"sum",])p 8 1053 V 8 1063 V 7 1397 2 334 v 16 1397 V 216 1147 a Fe(midterm)i(final)h(course)85 1197 y(Aaaaa)130 b(78)86 b(83)h(161)85 1247 y(Bbbbb)130 b(88)108 b(0)h(88)107 1297 y(Cccc)f(142)g(0)87 b(142)41 1347 y(maximum)108 b(100)65 b(100)86 b(200)p 920 1397 V 929 1397 V 8 1398 922 2 v 8 1408 V 0 1472 938 2 v 0 1622 a Fh(4.4)48 b(Multipl)o(e)13 b(Views)j(of)f(a)h Fe(spread.frame)42 1702 y Ff(The)24 b(in)o(terface)g(can)g (displa)o(y)f(m)o(ultiple)e(co)q(ordinated)0 1752 y(views)g(of)g(a)g(single)g Fe(spread.frame)p Ff(.)37 b(Figure)21 b(4)g(sho)o(ws)0 1802 y(three)d(views)e(of)g(a)g(three-w)o(a)o(y)h(grade)g(sheet.)27 b(Tw)o(o)16 b(slices)0 1851 y(corresp)q(ond)f(to)f(t)o(w)o(o)f(exams)f(and)i (a)f(third)h(slice,)f(orthogo-)0 1901 y(nal)f(to)g(the)h(\014rst)g(t)o(w)o (o,)e(sho)o(ws)i(the)g(course)g(summary)m(.)i(The)0 1951 y Fe(spread.frame)i Ff(has)j(t)o(w)o(o)g Fe(after)f Ff(macros)g(to)g(caclulate) 0 2001 y(the)h(ro)o(w)e(sums)h(for)f(eac)o(h)i(exam)d(and)i(the)h(course)g (sums)0 2051 y(across)f(exams.)28 b(On)18 b(an)f(X-terminal,)g(eac)o(h)h (slice)g(migh)o(t)0 2101 y(app)q(ear)h(in)g(its)g(o)o(wn)g(windo)o(w)f(b)o(y) h(taking)f(adv)n(an)o(tage)g(of)0 2150 y(emacs)d(19's)g(abilit)o(y)f(to)h (con)o(trol)g(m)o(ultiple)f(windo)o(ws)h(in)g(a)0 2200 y(single)f(emacs)g (session.)21 b(On)15 b(a)f(text-based)h(terminal,)e(the)0 2250 y(di\013eren)o(t)i(bu\013ers)g(app)q(ear)f(in)g(the)g(same)f(emacs)h(windo)o (w.)42 2300 y(The)f(follo)o(wing)d(commands)g(are)k(generated)g(from)d(eac)o (h)0 2350 y(graphical)i(in)o(teraction:)30 2433 y(1.)20 b(The)14 b(commands)p 83 2438 852 2 v 83 2448 V 82 2592 2 144 v 91 2592 V 116 2483 a Fe(>)22 b(attach\()116 2533 y(+)44 b('/disk5/rmh/spre)o(ad/s)o (prd3d)o(/.Dat)o(a'\))116 2583 y(>)22 b(emacs.start\('/tmp)o(/spr)o(a0079)o (2'\))p 925 2592 V 934 2592 V 83 2594 852 2 v 83 2604 V 83 2637 a Ff(are)j(issued)g(when)g(the)g Fe(spread.frame)d Ff(in)o(terface)83 2687 y(is)j(started.)53 b(They)25 b(attac)o(h)g(the)h(S)f(library)f(con-)1096 29 y(taining)d(the)j Fe(spread.frame)c Ff(functions)j(and)g(call)1096 79 y Fe(emacs.start\(\))11 b Ff(with)i(the)h(name)f(of)g(the)h(directory)1096 128 y(where)h(temp)q(orary)e(\014les)h(will)e(b)q(e)j(stored.)1042 211 y(2.)21 b(The)14 b(command)p 1096 217 V 1096 227 V 1095 321 2 94 v 1104 321 V 1129 262 a Fe(>)21 b(print.find.emacs\('s)o(ec3[,)o (,"fin)o(al"])o(',)1129 312 y(+)43 b(update.Registry=F\))p 1938 321 V 1947 321 V 1096 323 852 2 v 1096 333 V 1096 366 a Ff(is)12 b(generated)j(when)e(the)h(user)g(places)f(the)h(cursor)g(on)1096 416 y(the)h Fe(sec3[,,"final"])d Ff(line)j(in)f Fe(.Registry)n Ff(.)22 b(This)1096 465 y(line)10 b(prin)o(ts)h(all)f(kno)o(wn)g(views)h(of)g (the)g Fe(sec3)f Ff(ob)r(ject)i(to)1096 515 y(temp)q(orary)f(\014les)h(and)f (then)i(reads)f(them)f(in)o(to)g(emacs)1096 565 y(bu\013ers.)1042 648 y(3.)21 b(The)14 b(command)p 1096 653 V 1096 663 V 1095 712 2 50 v 1104 712 V 1129 697 a Fe(>)21 b(emacs.cell\('sec3[,,)o("fina)o (l"]',)o(2,1,)o(1\))p 1938 712 V 1947 712 V 1096 714 852 2 v 1096 724 V 1096 757 a Ff(is)12 b(generated)j(when)e(the)h(user)g(places)f (the)h(cursor)g(on)1096 807 y(a)9 b(ro)o(w)g(lab)q(el)g(in)g(the)h Fe(sec3[,,"final"])d Ff(bu\013er.)18 b(The)1096 857 y(S)13 b(function)g(places)h(in)f(the)h(minibu\013er)e(an)h(S)g(assign-)1096 906 y(men)o(t)i(statemen)o(t)h(that)h(will)e(re-create)j(the)f(curren)o(t) 1096 956 y(cell)c(v)n(alue)h(from)e(the)i(curren)o(t)i(cell)d(expression.) 1042 1039 y(4.)21 b(The)14 b(commands)p 1096 1045 V 1096 1055 V 1095 1199 2 144 v 1104 1199 V 1129 1090 a Fe(>)21 b(x[)h("Aaaaa",-5,"fina)o (l")d(])i(<-)1129 1140 y(+)370 b(c\(20,)21 b(18,)g(30,)g(15\))1129 1190 y(>)g(invisible\(assign\(.A)o(ctive)o(,)e(x\)\))p 1938 1199 V 1947 1199 V 1096 1200 852 2 v 1096 1210 V 1096 1243 a Ff(are)42 b(generated)i(when)f(the)g(user)g(edits)g(the)1096 1293 y(minibu\013er.)38 b(The)22 b(execution)g(of)e(the)i(revised)g(as-)1096 1343 y(signmen)o(t)11 b(up)q(dates)i(the)g(en)o(tire)f Fe(spread.frame)e Ff(and)1096 1393 y(causes)17 b(all)e(views)i(of)f(the)g(up)q(dated)h Fe(spread.frame)1096 1443 y Ff(to)k(b)q(e)i(displa)o(y)o(ed)e(in)h(their)g (emacs)g(bu\013ers.)44 b(The)1096 1492 y(assignmen)o(t)38 b(of)h(the)g(v)n (alue)g(of)g(the)h(w)o(orking)1096 1542 y Fe(spread.frame)7 b(x)j Ff(to)g(the)h Fe(spread.frame)c Ff(named)i(in)1096 1592 y Fe(.Active)15 b Ff(k)o(eeps)i(S's)g(idea)f(of)g(the)i Fe(spread.frame)p Ff('s)1096 1642 y(v)n(alue)13 b(sync)o(hronized)i(with)e(the)i(user's)g (idea.)1013 1759 y Fh(4.5)47 b(Y)l(our)15 b(F)l(a)o(v)o(orite)f(Spreadsheet)f (Application)1054 1839 y Ff(An)o(y)j(spreadsheet)j(should)d(b)q(e)h(able)f (to)h(b)q(e)g(written)f(in)1013 1889 y(the)j(S)f(setting.)32 b(This)18 b(giv)o(es)h(the)g(double)f(adv)n(an)o(tage)g(of)1013 1939 y(the)i(famili)o(ar)d(and)i(p)q(o)o(w)o(erful)g(S)h(analysis)e(and)i (graphics)1013 1988 y(op)q(erations)13 b(coupled)g(with)g(the)h(ease)g(of)f (data)g(en)o(try)h(from)1013 2038 y(w)o(orking)e(in)i(spreadsheet)i(mo)q(de.) 1013 2172 y Fg(References)1033 2252 y Ff(Bec)o(k)o(er,)j(R.)d(A.,)i(J.)e(M.)h (Cham)o(b)q(ers,)g(and)g(A.)g(R.)f(Wilks)1096 2302 y(\(1988\),)e Fc(The)i(New)g(S)h(L)n(anguage:)23 b(A)16 b(Pr)n(o)n(gr)n(amming)1096 2352 y(Envir)n(onment)j(for)f(Data)h(A)o(nalysis)f(and)i(Gr)n(aphics)p Ff(,)1096 2402 y(W)m(adsw)o(orth,)12 b(Mon)o(terey)m(,)i(CA.)1033 2485 y(Cham)o(b)q(ers,)e(J.)h(M.,)f(and)h(T.)f(J.)h(Hastie)g(\(1992\),)f Fc(Statisti-)1096 2535 y(c)n(al)i(Mo)n(dels)h(in)g(S)p Ff(,)f(W)m(adsw)o (orth,)f(Mon)o(terey)m(,)h(CA.)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF ess/etc/other/S-spread/S-spread.el0000664000175000017500000002431312423756516015314 0ustar eddedd;; spreadsheet in S, S-mode or stand-alone ;; Richard M. Heiberger ;; 1996 ;; S-mode ;; Load this file from a running *S* window after starting S/Splus with M-x S ;; or ;; stand-alone ;; Load this file from the dired window in which .Data exists. ;(set-variable 'buffers-menu-max-size nil) (defvar spread-directory (concat "/tmp/" (make-temp-name "spr")) "Directory in which to store ascii spreadsheet displays.") (defvar spread-command-file (concat spread-directory "/*command*") "File through which S will communicate with emacs.") (defvar spread-directory-p nil "predicate value non-nil when directory has been defined.") (defun print-find-emacs nil "display spread.frame from minibuffer" (interactive) (spread-print-find (read-string "spread.frame: ") t)) (defun emacs-rc nil "" (interactive) (emacs-cell "1") ) (defun emacs-macro nil "" (interactive) (emacs-cell "2") ) (defun emacs-macro-control-text nil "" (interactive) (emacs-cell "4") ) (defun emacs-macro-print-text nil "" (interactive) (emacs-cell "5") ) (defun emacs-cell (result-type) "" (interactive) (setq spread-name (buffer-name)) (setq r (count-lines 1 (point))) (setq c (current-column)) (set-buffer S-buffer) (spread-insert (format "emacs.cell('%s', %s, %s, %s)" spread-name r c result-type ) ) (save-excursion (set-buffer "*command*") (revert-t-t) (goto-char (point-min)) (setq beg (point)) (end-of-line) (if (equal result-type "4") (progn (setq command (buffer-substring beg (point))) (set-buffer S-buffer) (spread-insert command) ) (setq command (read-string "> " (buffer-substring beg (point)))) (set-buffer S-buffer) (spread-insert command) (spread-insert "invisible(assign(.Active, x))") (spread-print-find spread-name nil) (goto-line r)(forward-char c) )) ) (defun spread-insert (spread-command) "" (interactive) (goto-char (point-max)) (insert spread-command) (comint-send-input) (accept-process-output spread-process) ) (defun revert-t-t nil "revert-buffer with no questions asked" (interactive) (revert-buffer t t) ) (defun revert-t-t-read-only nil "revert-buffer, no questions, read-only" (interactive) (revert-buffer t t) (setq buffer-read-only t) ) (defvar spread-mode-map nil "Keymap for Spread mode.") (if spread-mode-map nil (setq spread-mode-map (make-sparse-keymap)) (define-key spread-mode-map "\C-cv" 'revert-t-t-read-only) (define-key spread-mode-map "\C-m" 'emacs-rc) (define-key spread-mode-map "\C-cc" 'emacs-macro) (define-key spread-mode-map "\C-cs" 'emacs-macro-control-text) (define-key spread-mode-map "\C-cp" 'emacs-macro-print-text) (define-key spread-mode-map "f" 'emacs-print-find-emacs) (define-key spread-mode-map [mouse-2] 'spread-mouse-print-find-emacs) (define-key spread-mode-map [mouse-3] 'spread-mouse-rc) ) (defun spread-mouse-rc (event) "move point then enter" (interactive "e") (mouse-set-point event) (emacs-rc) ) (defun spread-mouse-print-find-emacs (event) "move point then find file" (interactive "e") (mouse-set-point event) (emacs-print-find-emacs) ) (defun spread-mode () "Major mode for spreadsheets.\\{spread-mode-map}" (interactive) (kill-all-local-variables) (make-local-variable 'beg) (make-local-variable 'command) (use-local-map spread-mode-map) (setq mode-name "Spread") (setq major-mode 'spread-mode) (if (equal (buffer-name) ".Registry") (spread-highlight-macro)) (setq buffer-read-only t) ) ;; from dired.el L547 ; (put-text-property (point) ; (save-excursion ; (dired-move-to-end-of-filename) ; (point)) ; 'mouse-face 'highlight) ; ;; (put-text-property (point) (mark) 'mouse-face 'highlight) (defun spread-highlight-macro nil "highlight spread.frame names for mouse access" (interactive) (save-excursion (goto-char (point-min)) (search-forward "**macro**")(forward-char) (toggle-read-only -1) (while (progn (setq beg (point))(end-of-line) (not (= beg (point))) ) (put-text-property beg (1-(point)) 'mouse-face 'highlight) (forward-char) ) (toggle-read-only 1) ) (save-buffer) ) (defun emacs-print-find-emacs nil "" (interactive) (beginning-of-line) (setq beg (point)) (end-of-line) (backward-char) (setq spread-name (buffer-substring beg (point))) (spread-print-find spread-name nil) ) (defun find-spread-frame-directory nil "Locate directory in which spread.frame functions are stored." (list-command-history) (set-buffer "*Command History*") (goto-char (point-min)) (search-forward "(load-file ") (goto-char (1+ (match-end 0)))(setq beg (point)) (end-of-line)(search-backward "/") (goto-char (match-end 0)) (setq spread-frame-directory (expand-file-name (buffer-substring beg (point)))) (kill-buffer "*Command History*") ) (defvar inferior-spread-mode nil "Non-nil if using inferior-spread-mode as a minor mode of some other mode.") (make-variable-buffer-local 'inferior-spread-mode) (put 'inferior-spread-mode 'permanent-local t) (or (assq 'inferior-spread-mode minor-mode-alist) (setq minor-mode-alist (append minor-mode-alist (list '(inferior-spread-mode " spread"))))) (defvar inferior-spread-mode-map nil) (if inferior-spread-mode-map nil (setq inferior-spread-mode-map (make-sparse-keymap)) (define-key inferior-spread-mode-map "\C-cv" 'revert-t-t) (define-key inferior-spread-mode-map "\C-cr" 'print-find-emacs)) (or (assq 'inferior-spread-mode minor-mode-map-alist) (setq minor-mode-map-alist (cons (cons 'inferior-spread-mode inferior-spread-mode-map) minor-mode-map-alist))) (defun inferior-spread-mode (&optional arg) "Toggle Inferior Spread mode. With arg, turn Inferior Spread mode on if arg is positive, off otherwise." (interactive "P") (setq inferior-spread-mode (if (null arg) (not inferior-spread-mode) (> (prefix-numeric-value arg) 0))) (if inferior-spread-mode (progn (set-process-filter spread-process 'comint-output-filter) (set-variable 'comint-output-filter-functions '(spread-output-filter comint-postoutput-scroll-to-bottom)) (set-variable 'comint-scroll-to-bottom-on-output "this") (set-variable 'comint-scroll-show-maximum-output t) (force-mode-line-update)) (message "Don't know how to turn off Inferior Spread mode"))) (defun spread-process () "Start stand-alone S process to run spread." (comint-run S-program) (setq spread-process (get-buffer-process (current-buffer))) (setq comint-prompt-regexp shell-prompt-pattern) (if (not(file-writable-p ".Data/.Audit")) (accept-process-output spread-process)) (accept-process-output spread-process) spread-process ) (defun spread-output-filter (str) "detect errors in S output" (if (or (string-match "Dumped" str) (string-match "Error" str) ) (progn (switch-to-buffer-other-window S-buffer) (comint-show-maximum-output) (set-variable 'quit-flag t); beeps and writes "quit" in the message area ) ) ) (defun spread-print-find (spread-name update-Registry) "Place SPREAD-NAME in foreground of S-buffer (*S* or *Splus*), update .Registry and revert buffer when UPDATE-REGISTRY is t, print all views of spread.frame associated with SPREAD-NAME in .Registry to /tmp/spr***** directory, and find or revert all views into emacs buffers." (interactive) (set-buffer S-buffer) (spread-insert (format "print.find.emacs('%s', update.Registry=%s)" spread-name (if update-Registry "T" "F"))) (if update-Registry (save-excursion (spread-find-file ".Registry"))) (spread-print-sprds) (switch-to-buffer spread-name) ) (defun spread-print-sprds () "Display in buffers all views of spread.frame" (interactive) (save-excursion (set-buffer "*command*") (revert-t-t) (goto-char (point-min)) (while (< (point) (point-max)) (set-buffer "*command*") (setq beg (point)) (end-of-line) (setq spread-name-i (buffer-substring beg (point))) (save-excursion (spread-find-file spread-name-i)) (forward-line))) ) (defun spread-find-file (spread-name) "Display one view of spread.frame" (interactive) (switch-to-buffer spread-name) (if (buffer-file-name) (revert-t-t-read-only) (kill-buffer spread-name) (find-file (concat spread-directory "/" spread-name)) ) (spread-mode) ) (defun spread-start () "load emacs spread.frame handler" (if (equal major-mode 'inferior-S-mode) (progn (setq spread-mode "S-mode") (setq S-buffer (current-buffer))) (if (equal major-mode 'dired-mode) (progn (setq spread-mode "stand-alone") (setq S-program (read-string "Splus or S? " "Splus")) (setq S-buffer (concat "*" (file-name-nondirectory S-program) "*")) (if (not (get-buffer S-buffer)) (get-buffer-create S-buffer)) (if (get-buffer-process S-buffer) (set-variable 'quit-flag t))) (set-variable 'quit-flag t))) (setq spread-home-directory default-directory) (find-spread-frame-directory) (if (not spread-directory-p) (progn (make-directory spread-directory) (setq spread-directory-p t))) (set-buffer S-buffer) (cd spread-home-directory) (setq spread-process (if (equal spread-mode "stand-alone") (spread-process) (get-buffer-process (current-buffer)))) (inferior-spread-mode 1) (spread-insert (format "assign('.spread.Data',attach('%s.Data'),frame=0)" spread-frame-directory)) (spread-insert (format "emacs.start('%s')" spread-directory)) (find-file spread-command-file) (spread-find-file ".Registry") ) ;; start it up (spread-start) ess/etc/other/S-spread/gradexmp.s0000664000175000017500000000041712423756516015306 0ustar eddeddwho <- c( "Aaaaa", "Bbbbb", "Cccc", "Zzzzzzz", "maximum") what <- c("1a","1b","1c","1d","1e","1f","1g", "1h","2a","2b","2c") x <- matrix(0, length(who), length(what), dimnames=list(who,what)) x["maximum",] <- c(5,5,6,4,20,6,16,8,10,10,10) section.7 <- as.grade(x) ess/etc/other/S-spread/sprd-grd.s0000664000175000017500000000226712423756516015226 0ustar eddeddas.grade <- function(x) { if (inherits(x,"grade")) return(x) if (match("sum",dimnames(x)[[2]],0) == 0) { dx <- dim(x) dnx <- dimnames(x) if (length(dim(x)) == 2) { if (length(dnx) != 2) dimnames(x) <- list(NULL, 1:dx[2]) tmp <- cbind(x,sum=0) } if (length(dim(x)) == 3) { dimnames(x) <- NULL tmp <- aperm(x,c(1,3,2)) dim(tmp) <- c(dim(tmp)[1]*dim(tmp)[3], dim(tmp)[2]) tmp <- cbind(tmp, sum=0) dim(tmp) <- (dx + c(0,1,0))[c(1,3,2)] tmp <- aperm(tmp,c(1,3,2)) if (length(dnx) != 3) dnx <- list(NULL, 1:dx[2], NULL) dnx[[2]] <- c(dnx[[2]], "sum") dimnames(tmp) <- dnx } if (length(dim(x)) > 3) stop("grade requires 2d or 3d") } x <- as.spread(tmp) sum.col <- match("sum",dimnames(x)[[2]],0) tmp.expr <- paste( "x[,", sum.col, if (length(dim(x))==3) ",", "] <- apply(x[,", -sum.col, if (length(dim(x))==3) ",", "],", deparse(if (length(dim(x))==3) c(1,3) else 1), ",sum)" ) after(x)["sum"] <- parse(text=tmp.expr) class(x) <- c("grade", class(x)) update.spread(x) } expr.rc.grade <- function(x, acpab) { if (sapply(acpab,nchar)[[2]] == 0) { j <- -match("sum", dimnames(x)[[2]], 0) acpab[2] <- j } expr.rc.default(x,acpab) } ess/etc/other/S-spread/README0000664000175000017500000000512712423756516014176 0ustar eddeddspread We have designed and constructed an interactive spreadsheet interface to S/Splus that maintains the complete power and generality of the S language. At user level, the interface behaves like the popular spreadsheet programs available for personal computers: one or more S data objects (matrices or three-way arrays) are displayed on the screen. The user graphically (with mouse or cursor motion) identifies a cell for review, and possible updating, of its contents. Macros containing arbitrary S expressions can be associated with the entire spread.frame or one of its cells. The spreadsheet is designed in a modular fashion with device-specific methods for the display and updating of spreadsheet objects. We include methods for two devices: the generic S graphics device and a character based device using the emacs 19 environment. Richard M. Heiberger (rmh@astro.ocis.temple.edu) Magnus Mengelbier (magnus@astro.ocis.temple.edu) The interface is described in \item Heiberger, Richard M., and Magnus Mengelbier (1995, to appear) ``Design of a Spreadsheet Interface for S,'' {\it Proceedings of the American Statistical Association}, Section on Statistical Graphics. This is placeholder announcement. The files will be available on statlib after one more level of testing. Files in this distribution: README Abstract, file listing, and setup instructions. sprd3d.how Instructions for spread.frame users. sprd-emc.s S for emacs driver sprd-grd.s S for class="grade" sprd-spr.s S for class="spread" This is the primary set of functions. sprd-txt.s S for graphics device driver based on text() command. sprd-int.el emacs lisp file Load this file into emacs 19 each time you start a spread.frame session. gradexmp.s S example Setup Instructions The emacs spreadsheet interface for S consists of four S files "sprd-*.s" and one emacs lisp file "sprd-int.el". 1. Create a new directory to store the four S files "sprd-*.s" and one emacs lisp file "sprd-int.el". I use "/disk5/rmh/sprd3d/". You might wish to place it under the directory where you store other S/Splus libraries. 2. Make a new .Data, "/disk5/rmh/sprd3d/.Data", start S/Splus, and source the four sprd-*.s files: > source("sprd-emc.s") > source("sprd-grd.s") > source("sprd-spr.s") > source("sprd-txt.s") > q() 3. The directory /disk5/rmh/sprd3d/ should now be treated as a library directory and should not be further touched. All further work using the spread.frames should be done in a different directory. 4. See the file sprd3d.how for user instructions. You may look at the file "gradexmp.s" for an example. ess/etc/other/S-spread/sprd-emc.s0000664000175000017500000001657112423756516015221 0ustar eddedd#-*-Fundamental-*- col.spacing <- function(x) { rn.w <- if (length(dimnames(x)[[1]]) > 0) max(nchar(dimnames(x)[[1]])) else nchar(as.character(nrow(x)))+3 col.w <- apply(x, 2, function(x) nchar(format(x))[1]) dn.w <- if (length(dimnames(x)[[2]]) > 0) nchar(dimnames(x)[[2]]) else nchar(as.character(ncol(x)))+3 col.w <- ifelse( col.w > dn.w , col.w, dn.w) cumsum(c(rn.w,col.w)+1) } emacs.expr <- function(x, i, j=i[2], result.type) # 1. emacs.rc # 2. emacs.macro # 3. emacs.macro.text(deparse.result=T) #default for index.value # 4. emacs.macro.text(deparse.result=F) # 1. assign expression to cell or to macro # 2. evaluate macro expression # 3. retrieve macro expression # 4. construct control.text() expression from macro name # 5. construct print.text() expression from macro name { # i and j are integer scalars if (missing(j)) {j <- i[2] ; i <- i[1]} if ((.Active == .Active.buffer) && (length(dim(x)) > 2)) stop("Must use rectangular slice, not 3d buffer") if (i <= nrow(x) && result.type==1) return(expr.rc(x, c(i, j))) if (!inherits(x, "spread")) stop("Not a spread.frame") mm <- (nrow(x)+1):(nrow(x)+2+length(macro(x))) bb <- mm[length(mm)]+(1:(2+length(before(x)))) aa <- bb[length(bb)]+(1:(2+length(after(x)))) find.expr <- function(type.x, kk, type, result.type) { if (kk>0) { iv <- index.value(names(type.x), kk, !((result.type == 4) || (result.type == 5))) switch(result.type, paste(type, "(x)[", iv, "] <- expression(", expr.value(type.x[kk],1), ")"), paste("x <- eval.spread(x, ", type, "(x)[", iv, "] )" ), deparse(eval(parse(text=paste(type, "(x)[", iv, "]")))[[1]]), paste(iv, "<- control.text(", iv, ")"), paste(iv, "<- print.text(", iv, ")") ) } else if (result.type==1) paste(type, "(x)[\"\"] <- expression()") else NULL } k <- match(i, mm, 0) if (k) return(find.expr(macro(x), k-2, "macro", result.type)) k <- match(i, bb, 0) if (k) return(find.expr(before(x), k-2, "before", result.type)) k <- match(i, aa, 0) if (k) return(find.expr(after(x), k-2, "after", result.type)) } cell.rc.emacs <- function(x, e.r, e.c) { x.r <- ifelse(e.c == 0, e.r, e.r-1) x.c <- sum(e.c >= col.spacing(x)) c(row=x.r, col=x.c) } print.update.emacs <- function(x, ..., file=paste(.spread.directory, .Active.buffer, sep="/")) { sink(file) print(x, ...) xs <- get(.Active) if (inherits(xs, "spread")) { print.spread.macro(xs, macro) print.spread.macro(xs, before) print.spread.macro(xs, after) } sink() invisible(x) } print.spread.macro <- function(x, macro) { cat("\n**", as.character(substitute(macro)), "**\n", sep="") ne <- names(macro(x)) if (length(ne)) for (i in 1:length(ne)) cat(index.value(ne,i,F),"\n") } as.two.way.array <- function(x, subs=parse(text=.Active.buffer)[[1]][-(1:2)]) { if (length(dim(x))==2) return(x) # This is designed for 3 way arrays with # two missing and one specified dimension. # If the drop parameter exists, it is over-ridden. subs$drop <- NULL which.subs <- (sapply(subs,length)==0) dnx <- dimnames(x)[which.subs] dimnames(x) <- NULL dim(x) <- dim(x)[which.subs] dimnames(x) <- dnx x } fg <- function( sprdname=.Active ) # sprdname = character name, possibly subscripted { if (is.na(match(sprdname, names(macro(.Registry))))) { macro(.Registry)[sprdname] <- sprdname assign(".Registry", .Registry, where=1 ) } assign(".Active.buffer", sprdname, frame=0 ) assign(".Active", find.names(sprdname), frame=0 ) assign("x", eval(parse(text=.Active)), where=1 ) assign("x.buffer", where=1, if (.Active.buffer==.Active) x else as.two.way.array(eval(parse(text=.Active.buffer)))) invisible(sprdname) } control.emacs <- function(x) { #this is a fake function #emacs does the work # control.emacs never gets called when emacs is in control. # RET in spread window puts old command in minibuffer: # emacs sends # emacs.cell('spreadname', e.r, e.c, result.type) # emacs reads the file written by the above and # asks the user to revise it in the minibuffer. # RET in minibuffer puts revised command in S buffer, # and causes the revised command to be executed, updating the spreadsheet. # emacs issues # invisible(assign(.Active, x)) # to place the object in x into the object named in .Active # emacs issues # print.find.emacs('spreadname', update.Registry=F) # to update all buffers showing views of the object named in .Active # When S gets control back, the command has been executed and the # spreadsheet has been updated } #emacs usage #load-file S-spread.el #In the *S* buffer, type ^Cr to place a spread.frame or 2-way or 3-way array # into a spread.frame buffer. #In the spread.frame buffer, type RET to update a cell. #In the minibuffer, revise the cell and type RET to update the object and # the display. #If there is a timing problem and the display is not updated, # then type ^Cv in the spread buffer. find.sprds <- function(sprdname, reg.names=names(macro(.Registry))) { reg.names[find.names(reg.names) == find.names(sprdname)] } find.names <- function(reg.names) { prn <- parse(text=reg.names) for (i in 1:length(prn)) if (mode(prn[[i]]) != "name") reg.names[i] <- prn[[i]][[2]] reg.names } print.sprds.emacs <- function(sprdname) { fssn <- find.sprds(sprdname) fssn2 <- fssn for(i in fssn2) { fg(i) print.update.emacs(x.buffer) } cat(paste(fssn, collapse="\n"), "\n", sep="", file=.spread.command.file) invisible(fg(sprdname)) } print.update.emacs.3d <- function(object) { object.name <- as.character(substitute(object)) dobject <- dim(object) if (length(dobject) != 3) stop("3-way array required") fg(object.name) n3 <- dimnames(object)[[3]] if (is.null(n3)) n3 <- seq(length=dobject[3]) else n3 <- paste("\"", n3, "\"", sep="") for (i in n3) { fg(paste( object.name, "[,,", i, "]", sep="" )) print.update.emacs(x.buffer) } invisible(object) } emacs.start <- function(spread.directory) { assign('.spread.directory', spread.directory, frame=0) if (!exists('.Registry', 1)) assign(".Registry", where=1, as.spread(matrix(".Registry"))) assign(".spread.command.file", frame=0, paste(spread.directory, "*command*", sep="/")) fg(".Registry") print.update.emacs(.Registry) invisible(".Registry") } print.find.emacs <- function(spread=.Active, update.Registry=T) { fg(spread) if (update.Registry) { fg(".Registry") print.update.emacs(.Registry) fg(spread) } print.sprds.emacs(spread) invisible(spread) } emacs.cell <- function(spread, e.r, e.c, result.type) { fg(spread) cell.rc <- cell.rc.emacs(x.buffer, e.r, e.c) .Options$width <- 1000 if (result.type==1 && cell.rc[1] <= nrow(x.buffer)) { cell.rc <- cell.sub.emacs(x, cell.rc) cell.expr <- expr.rc(x, cell.rc) } else cell.expr <- emacs.expr(x, cell.rc, result.type=result.type) cat(cell.expr, '\n', sep='', file=.spread.command.file) } cell.sub.emacs <- function(x, i, j=i[2]) { # i and j are integer scalars if (missing(j)) {j <- i[2] ; i <- i[1]} if (i==0 && j==0) stop("non-zero row or column required") if ((length(dim(x)) == 2)) { acpab <- c("","") positions <- 1:2 } else if (.Active == .Active.buffer) stop("Must use rectangular slice, not 3d buffer") else { pab <- parse(text=.Active.buffer) acpab <- as.character( pab[[1]][-(1:2)] ) positions <- (1:length(acpab))[sapply(acpab, nchar) == 0] } di <- index.value(dimnames(x)[[positions[1]]], i) dj <- index.value(dimnames(x)[[positions[2]]], j) acpab[positions[1]] <- di acpab[positions[2]] <- dj acpab } ess/etc/other/S-spread/sprd3d.how0000664000175000017500000002047112423756516015233 0ustar eddedd The emacs spread.frame device handler Richard M. Heiberger There are two variants in the usage of this emacs spread.frame device handler. Both use the same command file: S-spread.el. One variant is stand-alone. The other works with S-mode. Both are written in emacs 19.29 to use the comint.el package. They will not work in emacs 18. A. Stand-alone Usage 1. Create a .Data subdirectory in the directory you will be using, say `myclass' and `myclass/.Data'. Get into the dired buffer of the directory `myclass'. Any other buffer will cause the terminal to beep. 2. From the dired buffer enter (on my computer): M-x load-file /disk5/rmh/sprd3d/S-spread.el Edit the pathname for your computer. Any other buffer than the dired buffer will cause the terminal to beep. You will be prompted "S or Splus? ". "Splus" has been filled in as the default. Edit the command name if necessary, inserting a full pathname if appropriate, then hit carriage return. This leaves the window showing the .Registry buffer in Spread mode. If you previously had a .Registry in that directory, it appears in the buffer. If you have never used the spread.frame handler in that directory, then a new .Registry has been created for you. You also have a buffer called *Splus* (or *S*) in Inferior Spread mode in which Splus (or S) is running. NOTES for Stand-alone Version If you were previously running Splus in buffer *Splus* in Inferior Spread mode and accidentally killed the Splus process (for example, with the q() command), you are still using that buffer and the Splus process has been restarted. If you have a buffer named *Splus* not associated with a process, for example a file you are editing, emacs will use that buffer for the Inferior Spread mode. If you have a running Inferior Spread process, a shell process, or any other process, in a buffer named *Splus*, the terminal will beep. B. S-mode Usage 1. Create a .Data subdirectory in the directory you will be using, say `myclass' and `myclass/.Data'. Get into the dired buffer of the directory `myclass' and start S-mode with M-x S. 2. From the *S* buffer that S-mode has started enter (on my computer): M-x load-file /disk5/rmh/sprd3d/S-spread.el Edit the pathname for your computer. Any other buffer than the *S* buffer will cause the terminal to beep. This leaves the window showing the .Registry buffer in Spread mode. If you previously had a .Registry in that directory, it appears in the buffer. If you have never used the spread.frame handler in that directory, then a new .Registry has been created for you. NOTES FOR BOTH VERSIONS S/Splus thinks it is in charge and does not know about emacs. Emacs with comint attempts to coordinate its timing with Splus by sending commands to Splus with (comint-send-input) and waiting for their completion with (accept-process-output). If for any reason an out-of-date display of a buffer appears, use ^Cv to bring up the current display. If things still look wrong, go to the *Splus* buffer and force a current display with ^Cr. You will be requested to type the name of the object to be displayed in the minibuffer. All buffers displaying views of that object, and the .Registry buffer will be updated. Either usage of the spread.frame functions and the command file S-spread.el works with S Version 3, S Version 4, or Splus 3.3. 3. Start working in the .Registry buffer. Move to the macro section. a. Do "f" or [mouse-2] on the name of the spread.frame you want to see. Spread.frame names are listed in the macro section of the display. b. If no names appear, then you must add them. 4. To add more spread.frames, for example the "xy" spread.frame, where the "xy" spread.frame already exists in the .Data: a. Move to the *Splus* buffer. Enter "^Cr". b. The minibuffer will ask you for the name of a spread.frame. c. Enter the name of the object (for example xy (no quotes)) or an expression for a 2-way rectangular slice (xy[,,2]) of a 3-way object. d. The "xy" spread.frame will appear in the buffer. 5. To add a three-way spread.frame to the display from the *Splus* buffer a. Create a 3-way array and make it a spread.frame: xs <- as.spread(array(1:12,dim=c(2,3,2))) b. Print it to the /tmp/spraxxxxx directory with: print.update.emacs.3d(xs) c. Move the cursor to the .Registry buffer. Place the cursor on the .Registry entry and press RETURN twice. The names for the slices will now appear in the **macro** section (if not, use ^Cv). d. Place the cursor on each of the slices' names and press f. e. The entire spread.frame can also be displayed by pressing "f" or [mouse-2] on its name. The window displaying the entire spread.frame is not active. Pressing RETURN will beep. f. The slices are active. Pressing RETURN on a cell entry will update the entire spread.frame and the display of the slices. Pressing RETURN on a macro keyword or a macro name in a slice buffer will activate the display and update of the macro for the entire spread.frame. 6. Move between spread.frames with ^X o. 7. To edit a spread.frame, place the cursor on a cell and press ENTER or [mouse-3]. The expression associated with the cell will be displayed in the mini-buffer. Edit it and press ENTER. The spread.frame in Splus will be updated, and all views of the object in emacs buffers will be updated. 8. To execute a macro, place the cursor on the macro name and enter ^Cc. Don't use print() or cat() in macros; sink() is in use. The graphics device can be used for rectangular spread.frames, but does not yet work with three-way spread.frames. To use a graphics device for the spread.frame display (but no macros yet). 9. Open a graphics device: x11(), iris4d(), motif(), etc. 10. Add the names of the spread.frames to .Registry as described above. 11. To place a spread.frame in the graphics device, put the cursor on the spread.frame name in the **macro** listing in .Registry, and press ^Cp The minibuffer will display > xy <- print.text( xy ) Press ENTER and the device will show the xy spread.frame. 12. To change a value in a spread.frame in the graphics device, put the cursor on the spread.frame name in the **macro** listing in .Registry, and press ^Cs The minibuffer will display > xy <- control.text( xy ) Press ENTER, move the cursor into the graphics window, and click when the crosshair is on the cell you wish to change. Place the cursor in the *Splus* buffer, move to the end of the buffer by pressing ESC > . You will see the expression to be edited (prefixed with a ">") on the next to the last line. Move the cursor to that line, edit the value, and press ENTER. The graphics window will be updated. 13. You can edit any emacs buffer spread.frame by switching to its buffer and pressing ENTER or [mouse-3] on the appropriate entry. You can edit any spread.frame in the graphics device, by switching to the .Registry buffer, confirming that the spread.frame is in the graphics window (or putting it there with ^Cp), and then entering ^Cs on the macro name in the .Registry buffer that matches the spread.frame. 14. There is an additional feature in the spread.frame interface that is very useful for numerical rows or columns. When the cursor is placed on the dimnames row or column, the entire column or row is made available in the mini-buffer. Warning: expr() in the row or column will be evaluated and will no longer be expr(). 15. Character data. Character matrices work well as spread.frames. 16. Warning: character or factor columns in data.frames. S likes to coerce character columns in data.frames to factors. Updating an entire factor column, or an entire row containing factor columns, may be dangerous because the revised values may not be in the levels(). The entire column may be replaced with NA values. Updating of individual character values is fine in character arrays that are not data.frames, or in data.frames where the length(expr(x)) == prod(dim(x)). To get a character column into a data frame use my.frame$char <- character.value # remains character Using either my.frame[,"char"] <- character.value # coerced to factor my.frame <- cbind(my.frame,character.value) # coerced to factor won't work. Either of those forms coerces the values to factor. ess/etc/other/test0000664000175000017500000000006312423756516012534 0ustar eddeddmodify the test with a change. SJE: simple change. ess/etc/ess-s4.S0000664000175000017500000000303112423756516011751 0ustar eddedd#### This is a dump of the S library used by S-mode with Version 4 of S. #### (from John Chambers ??) #### S-mode session functions. #### assign(..., where=0) makes them last only for the current session. ### Martin Maechler: see also ./ess-sp3.S ### which uses assign(.., wh=0) which seems better ".SmodeDump" <- function(x, name) { ## dump function for S-mode assign(".SmodeTmp", options(error = dump.calls), where = 0, i = T) on.exit( { options(.SmodeTmp) remove(".SmodeTmp", where = 0) } ) dump(x, file = name) } ".SmodeLoad" <- function(x) { ## skeleton of a dump.calls interface, enough to keep s-mode ## informed that an error took place. pseudo <- function() cat(get.message(), "Dumped\n", sep = "", file = "|stderr") ## source function for S-mode assign(".SmodeTmp", options(error = pseudo), where = 0, i = T) on.exit( { options(.SmodeTmp) remove(".SmodeTmp", where = 0) } ) invisible(source(x)) } ".SmodeObs" <- function(where, pattern) { if(pattern == "") objects(where) else objects(where, pattern) } ".SmodePaths" <- function() { ## the paths for the directories in the search list temp <- search() value <- character(length(temp)) for(i in seq(along.with = temp)) { obj <- database.object(i) if(is.character(obj) && length(obj) == 1) value[[i]] <- obj } value } "smode.lvsave" <- c(".Last.value", ".SmodeDump", ".SmodeLoad", ".SmodeObs", ".SmodePaths", "smode.lvsave") ess/etc/BACKBUG5.BAT0000664000175000017500000000102212423756516012160 0ustar eddedd@echo off rem ESS[BUGS]: 02/18/2004 rem runs BUGS taking commands from command file if not "%2"=="" goto 20 if not "%1"=="" goto 10 echo usage: backbug5 [default_output_name] command_file goto 40 :10 if exist bugs.bog attrib -r bugs.bog bugs05.exe bugs.buf bugs.bog bugs.out bugs.ind bugs1.out bugs1.ind %1 copy /y bugs.log bugs.bog attrib +r bugs.bog goto 40 :20 set one=1 if exist %1.bog attrib -r %1.bog bugs05.exe %1.buf %1.bog %1.out %1.ind %1%one%.out %1%one%.ind %2 copy /y %1.log %1.bog attrib +r %1.bog goto 40 :40 ess/etc/R-pager.R0000664000175000017500000000071312423756516012133 0ustar eddeddmypager <- function(files, header, title, delete.file) { tfile <- tempfile(paste(basename(files[1]),"__", sep="")) Tf <- file(tfile, open="w+") stopifnot(file.append(tfile, files)) system(paste("emacsclient -n", tfile)) } file.show(file.path(R.home("doc"), "COPYRIGHTS"), pager = mypager) options(pager = mypager) ## test : file.show(file.path(R.home("doc"), "COPYRIGHTS")) ## or RShowDoc('NEWS') ## using a suboptimal file name ess/etc/pkg-Maintainers0000664000175000017500000000023312423756516013464 0ustar eddeddXemacs: Rodney Sparapani -- no longer Debian: Dirk Eddelbuettel RPM: Tom Moertel SuSe: Detlef Steuer ess/etc/BACKBUGS.BAT0000775000175000017500000000107212423756516012226 0ustar eddedd@echo off rem ESS[BUGS]: 02/13/2003 rem runs BUGS taking commands from command file if not "%3"=="" goto 30 if not "%2"=="" goto 20 if not "%1"=="" goto 10 echo usage: backbugs [[number_of_bins] default_output_name] command_file goto 40 :10 bugs0603.exe 32 bugs %1 if exist bugs.bog attrib -r bugs.bog copy /y bugs.log bugs.bog attrib +r bugs.bog goto 40 :20 bugs0603.exe 32 %1 %2 if exist %1.bog attrib -r %1.bog copy /y %1.log %1.bog attrib +r %1.bog goto 40 :30 bugs0603.exe %1 %2 %3 if exist %2.bog attrib -r %2.bog copy /y %2.log %2.bog attrib +r %2.bog :40 ess/etc/function-outline.S0000664000175000017500000000034612423756516014143 0ustar eddeddf <- function() { ## Purpose: ## ---------------------------------------------------------------------- ## Arguments: ## ---------------------------------------------------------------------- ## Author: $A$, Date: $D$ } ess/etc/sje-ess-notes.txt0000664000175000017500000002255712423756516013765 0ustar eddeddStephen Eglen's notes on future changes to ESS -*- org -*- * Problem with ESS infrastructure and Martin away? Email isg@math.ethz.ch * ess-history-file needs documenting and possibly updating: From: Stephen Eglen To: Erik Iverson Comments: In-reply-to Erik Iverson message dated "Wed, 20 Apr 2011 09:36:26 -0500." Date: Tue, 26 Apr 2011 09:01:29 +0100 Cc: Feng Li , ess-help@stat.math.ethz.ch Subject: Re: [ESS] ESS and .Rhistory Sender: ess-help-bounces@r-project.org Dear Erik, Feng, Thanks for this -- I was blissfully unaware about this persistence of history across R sessions. Howabout if we change the semantics of ess-history-file to be: nil -- do not attempt to read/write a history file t -- use the default naming scheme for loading the history "some.string" -- use this value as the filename. Stephen > Feng, > > On 04/20/2011 09:00 AM, Feng Li wrote: > > Dear list, > > > > I tried to change the ESS default R history to a permanent file so > > that ESS does not generate .Rhistory everywhere. I tried both > > > > (setq ess-history-directory "~/.R/history") > > > > and > > > > (setq ess-history-file "~/.R/history/.Rhistory") > > If I recall correctly, it's because of the way the ess-history-file > variable is set in the ESS code. The following works for me: > > (defun ei-no-rhistory () > (setq ess-history-file "/dev/null")) > > (add-hook 'inferior-ess-mode-hook 'ei-no-rhistory) * completion of functions within buffers From: Stephen Eglen To: ESS-help@stat.math.ethz.ch Date: Tue, 22 Jun 2010 14:00:25 +0100 Cc: Stephen Eglen Subject: [ESS] request for comments: completion within .R buffers Sender: ess-help-bounces@stat.math.ethz.ch Rodney recently kindly polled ess-help, and a summary of the results can be seen in the SVN sources at: https://svn.r-project.org/ESS/trunk/rsn.txt One thing that came up was (thanks Ista Zhan): Function/variable completion in script files (maybe this already is supposed to work, but for me completion only works in interactive sessions). Below is some suggested code to implement this, based on a hint from Deepayan. If you press TAB at the start of the line, you still get standard indentation, but if you are already typing something, e.g. write.t then hitting TAB will complete to write.table Hitting TAB again, will then bring up a *Completions* window showing (for me): Possible completions are: write.table write.table0 I don't like the *Completions* window hanging around, but apart from that, is that the sort of completion people would like? Erik Iverson mentioned something related: I think ESS is very feature complete at this point. The only thing I've looked at that seems interesting is some sort of 'intellisense' feature that uses R's built-in completion mechanism to temporarily display available completions using something like company-mode, autocomplete, or completion-ui. I had at one point something that almost worked, but I believe the library it was built in, company-mode, has now changed significantly. but I've not explored those options. Code/ideas welcome! Stephen ---------------------------------------------------------------------- (defun ess-indent-or-complete (&optional whole-exp) (interactive "P") "Function bound to TAB key in R mode buffers. If at the start of the line, or numeric prefix provided, call `ess-indent-command', otherwise try to complete object at point." (if (or whole-exp (save-excursion (skip-chars-backward " \t") (bolp))) (ess-indent-command whole-exp) (ess-complete-object-name))) (add-hook 'ess-mode-hook '(lambda () (local-set-key "\t" 'ess-indent-or-complete))) * ess-eldoc.el ** Switch to use R-mode-hook, rather than ess-mode-hook ** Document in the info node. * Debugger Would like to implement a debugger akin to Norm Matloff's work: http://cran.r-project.org/web/packages/edtdbg/index.html http://www.stats.uwo.ca/faculty/murdoch/software/debuggingR/ Norm posted that he had started work on ESS, but had to abandon it. * Comint so slow? ess-eval-visibly-p should be t again. Why is comint so slow when passing code line by line? Markus Triska recently looked at this: To: ess-help@stat.math.ethz.ch connect(): No such file or directory From: Markus Triska Date: Sun, 16 May 2010 13:59:57 +0200 Subject: Re: [ESS] ESS on Mac slower than R.app? Sender: ess-help-bounces@stat.math.ethz.ch Hi Rodney, Rodney Sparapani writes: > I think if you update to the latest version of ESS this problem will > go away. See the previous discussion of a very similar GNU Emacs bug > fix at https://stat.ethz.ch/pipermail/ess-bugs/2009q4/000584.html I think ess-eval-visibly-p should remain true by default, as it is quite useful. If you change the accept-process-output call in ess-eval-linewise to: (accept-process-output sprocess 0 timeout-ms) (the difference being that you explicitly state to wait for input from "sprocess"), the test case works instantly also with ess-eval-visibly-p. All the best, Markus * Funny indentation if semicolon follows brace: From: Stephen Eglen To: Paul Burkander Comments: In-reply-to Paul Burkander message dated "Sat, 04 Jun 2011 10:17:03 -0400." Date: Mon, 06 Jun 2011 10:35:27 +0100 Cc: ess-help@r-project.org Subject: Re: [ESS] ess-indent-exp follow OWN style? Sender: ess-help-bounces@r-project.org > I think it must be ess-electric-brace, and I think it warrants a bug report. > > The behavior is the same in R and Stata (though I don't know if it > would ever come up in R) > > Typing any line (excluding comments) that ends in { sets the > indentation of the next line to ess-indent-level > Typing any line (excluding comments) that ends in {; sets the > indentation of the next line to so that the first character is below > the preceding semicolon. > > I know basically nothing about Lisp, otherwise I'd like to try to > debug this thing. ┬аIt seems like an important replicable issue that > warrants a bug report. Thanks; I can see this behaviour in R mode. As I don't think its a common idiom in R to write something like for (i in seq) {; ... I'm afraid its not high enough on my priority list to fix right now (sorry, too many other things already need fixing in ESS), but I will make a note of it. Is this biting other users? Stephen ** is ess-electric-brace working okay? should reindent line? * Handing the *ESS* buffer Is the *ESS* buffer necessary for end users? If not, have a toggle to switch it off. From: Stephen Eglen Date: Mon, 6 Jun 2011 22:12:08 +0100 > Re: the *ESS* buffer, how much of a pain is it? I recall also > finding it a bit offputting seeing this many years ago, and in all > my years of developing ESS, I for one have yet to find reason of > inspecting it! I imagine other developers may differ -- but one > thing I could suggest to other core members is having a variable > to inhibit this buffer? This could be as simple as having a variable ess-dribble-buffer which if nil, means that the buffer is not created, otherwise, the variable contains (as a string) the name of the buffer to use, which defaults to "*ESS*". It could even be " *ESS*" so that it doesn't appear in buffer lists, but is there and will be included into reports generated by ess-submit-bug-report. * Add ess-r-versions-list Subject: Re: [ESS] Customisation of ess-r-versions or ess-r-versions-list From: John Maindonald Date: Thu, 18 Aug 2011 10:19:44 +1000 Cc: ess-help@stat.math.ethz.ch To: Stephen Eglen On 18/08/2011, at 5:38 AM, Stephen Eglen wrote: >> Yes, >> (setq ess-s-versions-list >> '( ("R64" "/usr/bin/R64") >> ("R32" "/usr/bin/R32"))) >> works. The buffer for R64 is however called *S+6*. No doubt there is >> some variable that one can set that will fix this; I have not >> investigated. > I don't recall ever doing this for R, but this was quite a few years > ago. Did it ever work for you in earlier versions of ESS? The lines that I had commented out had 'ess-r-versions-list'. If this variable has never been available, this would be something that I tried by analogy with 'ess-s-versions-list' and never did work. If 'ess-s-versions-list' is to stay, it would seem to be cleanest to have a matching 'ess-r-versions-list' also, following the precedent of 'ess-s-versions' and 'ess-r-versions'. An advantage of this way of doing things (an 'ess-r-versions-list'), for some users at least, is that it is explicit about the command line statement that is invoked. > One can have defvar in place of setq. Does it matter which one uses? > Better to use setq -- as it will always update the value. By contrast: > > (defvar apple 1) > (defvar apple 2) > > Evaluate both lines above, in order, and check "apple" -- it has the > value 1. > > Stephen John Maindonald email: john.maindonald@anu.edu.au phone : +61 2 (6125)3473 fax : +61 2(6125)5549 Centre for Mathematics & Its Applications, Room 1194, John Dedman Mathematical Sciences Building (Building 27) Australian National University, Canberra ACT 0200. http://www.maths.anu.edu.au/~johnm * Toolbar is missing from file.Rt transcript buffers Add toolbar? ess/etc/gpl-check0000775000175000017500000000266312423756516012304 0ustar eddedd#!/bin/sh if [ $# -eq 0 -o "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] then echo "usage: gpl-check [-h|-help|--help|-2|-3|-u|-n] file1 [file2 ...]" echo " -h|-help|--help print this help" echo " -2 print file names found with GPLv2+" echo " -3 print file names found with GPLv3+" echo " -u print file names found with a GPL of unknown version" echo " -n print file names with no GPL found" echo " file1 [file2 ...] list of files to check" else GPLV2=0 GPLV3=0 GPLVUNK=0 NOGPL=0 for i do case $i in -2) GPLV2=1;; -3) GPLV3=1;; -23) GPLV2=1;GPLV3=1;; -u) GPLVUNK=1;; -n) NOGPL=1;; -nu|-un) GPLVUNK=1;NOGPL=1;; *) if [ $GPLV2 -eq 0 -a $GPLV3 -eq 0 -a $GPLVUNK -eq 0 -a $NOGPL -eq 0 ] then GPLV2=1 GPLV3=1 GPLVUNK=1 NOGPL=1 fi if grep -l 'either version 2, or' $i > /dev/null then if [ $GPLV2 -eq 1 ] then echo "$i GPLv2+" fi elif grep -l 'either version 3' $i > /dev/null then if [ $GPLV3 -eq 1 ] then echo "$i GPLv3+" fi elif grep -l 'GNU General Public License' $i > /dev/null then if [ $GPLVUNK -eq 1 ] then echo "$i GPLv unknown" fi else if [ $NOGPL -eq 1 ] then echo "$i no GPL" fi fi;; esac done fi ess/etc/ESSR/0000775000175000017500000000000012506744203011256 5ustar eddeddess/etc/ESSR/VERSION0000664000175000017500000000000512506744203012321 0ustar eddedd1.1.8ess/etc/ESSR/LOADREMOTE0000664000175000017500000000146412423756516012651 0ustar eddedd## -*- mode: R -*- ## loading code which is first sent to R on remote sessions local({ curver <- '%s' ## MM: ok for Windows? ## VS: Should be fine (who is using win remote anyways?) .c.dir <- '~/.config/ESSR' verfile <- file.path(.c.dir, 'VERSION') envfile <- file.path(.c.dir, 'ESSR.rda') ver <- if(file.exists(verfile)) scan(verfile, what = "string") else "0.0" tryCatch({ if(ver < curver) { url <- paste('http://vitalie.spinu.info/ESSR/ESSR_', curver, '.rda', sep = '') if(!file.exists(.c.dir)) dir.create(.c.dir, recursive = TRUE) utils::download.file(url, envfile) cat(curver, file = verfile) } load(envfile) attach(ESSR) print(TRUE) } , error = function(e) print(FALSE)) }) ess/etc/ESSR/BUILDESSR0000775000175000017500000000105112423756516012545 0ustar eddedd#!/usr/bin/Rscript ## -*- mode: R -*- ## code to build ESSR environemnt. ## Assume that current directory is etc/ESSR ## run "./BUILDESSR destdir" to create ESSR_.rda in destdir ## where is picked form ./VERSION file args <- commandArgs(TRUE) dir <- if(length(args)) args[[1]] else "." ver <- scan("./VERSION", what = "character", quiet = TRUE) rda_file <- sprintf("%s/ESSR_%s.rda", dir, ver) ## exactly as in ess--R-load-ESSR in ess-r-d.el source('./R/.load.R', local=TRUE) ESSR <- load.ESSR('./R/') save(ESSR, file = rda_file) ess/etc/ESSR/R/0000775000175000017500000000000012577152666011475 5ustar eddeddess/etc/ESSR/R/.load.R0000664000175000017500000000333112423756516012607 0ustar eddedd## Do not use _ in names, nor :: as they cannot be parsed in old R versions ## load .base.R and all other files into ESSR environment; then attach ESSR load.ESSR <- function(dir){ .source <- if(any("keep.source" == names(formals(sys.source)))) sys.source else function(..., keep.source) sys.source(...) Rver <- if(exists("getRversion", mode="function")) getRversion() else paste(R.version$major, R.version$minor, sep=".") oldR <- Rver <= "1.3.0" ESSR <- if(oldR) ## really old library() revert order a bit attach(NULL, name = "ESSR") else if(length(nn <- names(formals(new.env))) && any(nn == "parent")) new.env(parent = if(Rver >= "1.9.0") getNamespace("utils") else .BaseNamespaceEnv) else new.env() assign(".ess.Rversion", Rver, envir = ESSR) ESSRver <- scan(paste(dirname(dir), "/VERSION", sep = ""), what = "character", quiet = TRUE) assign(".ess.ESSRversion", ESSRver, envir = ESSR) ## .basic.R: try(.source(paste(dir,'/.basic.R', sep = ""), envir = ESSR, keep.source = FALSE)) ## all others try(*) as it will fail in old R if(!oldR) # no sense if(oldR) for( f in dir(dir, pattern='\\.R$', full.names=TRUE) ) try(.source(f, envir = ESSR, keep.source = FALSE)) if(Rver >= "2.4.0") attach(ESSR) else if(!oldR) { ## borrow from older library() e <- attach(NULL, name = "ESSR") .Internal(lib.fixup(ESSR, e)) } else { ## if(oldR), use as in that old library(): .Internal(lib.fixup(ESSR, .GlobalEnv)) } ## BUILDESSR needs this: invisible(ESSR) } ess/etc/ESSR/R/completion.R0000664000175000017500000000746112577152666014001 0ustar eddedd## Do *NOT* use 1L -- it gives parse errors in historical versions of R .ess_funargs <- function(funname) { if(.ess.Rversion > '2.14.1') { comp <- compiler::enableJIT(0) op <- options(error=NULL) on.exit({ options(op); compiler::enableJIT(comp) }) } ## don't remove; really need eval(parse( here!! fun <- tryCatch(eval(parse(text=funname)), error=function(e) NULL) ## also works for special objects containing @:$ etc if(is.function(fun)) { special <- grepl('[:$@[]', funname) args <- if(!special){ fundef <- paste(funname, '.default',sep='') do.call('argsAnywhere', list(fundef)) } if(is.null(args)) args <- args(fun) if(is.null(args)) args <- do.call('argsAnywhere', list(funname)) fmls <- formals(args) fmls_names <- names(fmls) fmls <- gsub('\"', '\\\"', gsub("\\", "\\\\", as.character(fmls),fixed = TRUE), fixed=TRUE) args_alist <- sprintf("'(%s)", paste("(\"", fmls_names, "\" . \"", fmls, "\")", sep = '', collapse = ' ')) allargs <- if(special) fmls_names else tryCatch(gsub('=', '', utils:::functionArgs(funname, ''), fixed = TRUE), error=function(e) NULL) allargs <- sprintf("'(\"%s\")", paste(allargs, collapse = '\" "')) envname <- environmentName(environment(fun)) if(envname == "R_GlobalEnv") envname <- "" cat(sprintf('(list \"%s\" %s %s)\n', envname, args_alist, allargs)) } } .ess_get_completions <- function(string, end){ if(.ess.Rversion > '2.14.1'){ comp <- compiler::enableJIT(0) op <- options(error=NULL) on.exit({ options(op); compiler::enableJIT(comp) }) } utils:::.assignLinebuffer(string) utils:::.assignEnd(end) utils:::.guessTokenFromLine() utils:::.completeToken() c(get('token', envir=utils:::.CompletionEnv), utils:::.retrieveCompletions()) } .ess_arg_help <- function(arg, func){ op <- options(error=NULL) on.exit(options(op)) fguess <- if(is.null(func)) get('fguess', envir=utils:::.CompletionEnv) else func findArgHelp <- function(fun, arg){ file <- help(fun, try.all.packages=FALSE)[[1]] hlp <- utils:::.getHelpFile(file) id <- grep('arguments', tools:::RdTags(hlp), fixed=TRUE) if(length(id)){ arg_section <- hlp[[id[[1]]]] items <- grep('item', tools:::RdTags(arg_section), fixed=TRUE) ## cat('items:', items, fill=TRUE) if(length(items)){ arg_section <- arg_section[items] args <- unlist(lapply(arg_section, function(el) paste(unlist(el[[1]][[1]], TRUE, FALSE), collapse=''))) fits <- grep(arg, args, fixed=TRUE) ## cat('args', args, 'fits', fill=TRUE) if(length(fits)) paste(unlist(arg_section[[fits[1]]][[2]], TRUE, FALSE), collapse='') } } } funcs <- c(fguess, tryCatch(methods(fguess), warning=function(w) {NULL}, error=function(e) {NULL})) if(length(funcs) > 1 && length(pos <- grep('default', funcs))){ funcs <- c(funcs[[pos[[1]]]], funcs[-pos[[1]]]) } i <- 1; found <- FALSE out <- 'No help found' while(i <= length(funcs) && is.null(out <- tryCatch(findArgHelp(funcs[[i]], arg), warning=function(w) {NULL}, error=function(e) {NULL}) )) i <- i + 1 cat('\n\n', as.character(out), '\n') }; ess/etc/ESSR/R/developer.R0000664000175000017500000003276412577152666013621 0ustar eddedd## COMMENT ON S3 METHODS: New S3 methods are not automatically registered. You can ## register them manually after you have inserted method_name.my_class into your ## package environment using ess-developer, like follows: ## ## registerS3method("method_name", "my_class", my_package:::method_name.my_class) ## ## If an S3 methods already exists in a package, ESS-developer will do the right ## thing. ## evaluate the STRING by saving into a file and calling .essDev_source .essDev.eval <- function(string, package, file = tempfile("ESSDev")){ cat(string, file = file) on.exit(file.remove(file)) .essDev_source(file,, package = package) } ## sourcing SOURCE file into an environment. After having a look at each new ## object in the environment, decide what to do with it. Handles plain objects, ## functions, existing S3 methods, S4 classes and methods. . .essDev_source <- function(source, expr, package = "") { ## require('methods') oldopts <- options(warn = 1) on.exit(options(oldopts)) MPattern <- methods:::.TableMetaPattern() CPattern <- methods:::.ClassMetaPattern() allPlainObjects <- function() allObjects[!(grepl(MPattern, allObjects) | grepl(CPattern, allObjects))] allMethodTables <- function() allObjects[grepl(MPattern, allObjects)] allClassDefs <- function() allObjects[grepl(CPattern, allObjects)] pname <- paste("package:", package, sep = "") envpkg <- tryCatch(as.environment(pname), error = function(cond) NULL) if(is.null(envpkg)){ library(package, character.only = TRUE) envpkg <- tryCatch(as.environment(pname), error = function(cond) NULL) } if (is.null(envpkg)) stop(gettextf("Can't find an environment corresponding to package name '%s'", package), domain = NA) envns <- tryCatch(asNamespace(package), error = function(cond) NULL) if (is.null(envns)) stop(gettextf("Can't find a namespace environment corresponding to package name '%s\"", package), domain = NA) ## evaluate the SOURCE into new ENV env <- .essDev_evalSource(source, substitute(expr), package) envPackage <- getPackageName(env, FALSE) if (nzchar(envPackage) && envPackage != package) warning(gettextf("Supplied package, %s, differs from package inferred from source, %s", sQuote(package), sQuote(envPackage)), domain = NA) allObjects <- objects(envir = env, all.names = TRUE) allObjects <- allObjects[!(allObjects %in% c(".cacheOnAssign", ".packageName"))] ## PLAIN OBJECTS and FUNCTIONS: funcNs <- funcPkg <- newFunc <- newNs <- newObjects <- newPkg <- objectsNs <- objectsPkg <- character() for (this in allPlainObjects()) { thisEnv <- get(this, envir = env) thisNs <- NULL ## NS if (exists(this, envir = envns, inherits = FALSE)){ thisNs <- get(this, envir = envns) if(is.function(thisNs) || is.function(thisEnv)){ if(is.function(thisNs) && is.function(thisEnv)){ if(.essDev_differs(thisEnv, thisNs)){ environment(thisEnv) <- environment(thisNs) .essDev_assign(this, thisEnv, envns) funcNs <- c(funcNs, this) if(exists(".__S3MethodsTable__.", envir = envns, inherits = FALSE)){ S3_table <- get(".__S3MethodsTable__.", envir = envns) if(exists(this, envir = S3_table, inherits = FALSE)) .essDev_assign(this, thisEnv, S3_table) } } }else{ newNs <- c(newNs, this) } }else{ if(!identical(thisEnv, thisNs)){ .essDev_assign(this, thisEnv, envns) objectsNs <- c(objectsNs, this)} } }else{ newNs <- c(newNs, this) } ## PKG if (exists(this, envir = envpkg, inherits = FALSE)){ thisPkg <- get(this, envir = envpkg) if(is.function(thisPkg) || is.function(thisEnv)){ if(is.function(thisPkg) && is.function(thisEnv)){ if(.essDev_differs(thisPkg, thisEnv)){ environment(thisEnv) <- environment(thisPkg) .essDev_assign(this, thisEnv, envpkg) funcPkg <- c(funcPkg, this)} }else{ newPkg <- c(newPkg, this)} }else{ if(!identical(thisPkg, thisEnv)){ .essDev_assign(this, thisEnv, envpkg) objectsPkg <- c(objectsPkg, this)}} }else{ newPkg <- c(newPkg, this)} } ## deal with new plain objects and functions for(this in intersect(newPkg, newNs)){ thisEnv <- get(this, envir = env, inherits = FALSE) if(exists(this, envir = .GlobalEnv, inherits = FALSE)){ thisGl <- get(this, envir = .GlobalEnv) if(.essDev_differs(thisEnv, thisGl)){ if(is.function(thisEnv)){ environment(thisEnv) <- envns newFunc <- c(newFunc, this) }else{ newObjects <- c(newObjects, this) } .essDev_assign(this, thisEnv, .GlobalEnv) } }else{ if(is.function(thisEnv)){ environment(thisEnv) <- envns newFunc <- c(newFunc, this) }else{ newObjects <- c(newObjects, this) } .essDev_assign(this, thisEnv, .GlobalEnv) } } if(length(funcNs)) objectsNs <- c(objectsNs, sprintf("FUN[%s]", paste(funcNs, collapse = ", "))) if(length(funcPkg)) objectsPkg <- c(objectsPkg, sprintf("FUN[%s]", paste(funcPkg, collapse = ", "))) if(length(newFunc)) newObjects <- c(newObjects, sprintf("FUN[%s]", paste(newFunc, collapse = ", "))) ## CLASSES classesPkg <- classesNs <- newClasses <- character() for(this in allClassDefs()){ newPkg <- newNs <- FALSE thisEnv <- get(this, envir = env) if(exists(this, envir = envpkg, inherits = FALSE)){ if(!.essDev_identicalClass(thisEnv, get(this, envir = envpkg))){ .essDev_assign(this, thisEnv, envir = envpkg) classesPkg <- c(classesPkg, this) } }else{ newPkg <- TRUE } if(exists(this, envir = envns, inherits = FALSE)){ if(!.essDev_identicalClass(thisEnv, get(this, envir = envns))){ .essDev_assign(this, thisEnv, envir = envns) classesNs <- c(classesNs, this) } }else{ newNs <- TRUE } if(newNs && newPkg){ if(exists(this, envir = .GlobalEnv, inherits = FALSE)){ if(!.essDev_identicalClass(thisEnv, get(this, envir = .GlobalEnv))){ .essDev_assign(this, thisEnv, envir = .GlobalEnv) newClasses <- c(newClasses, this) } }else{ .essDev_assign(this, thisEnv, envir = .GlobalEnv) newClasses <- c(newClasses, this) } } } if(length(classesPkg)) objectsPkg <- gettextf("CLS[%s]", sub(methods:::.ClassMetaPattern(), "", paste(classesPkg, collapse = ", "))) if(length(classesNs)) objectsNs <- gettextf("CLS[%s]", sub(methods:::.ClassMetaPattern(), "", paste(classesNs, collapse = ", "))) if(length(newClasses)) newObjects <- gettextf("CLS[%s]", sub(methods:::.ClassMetaPattern(), "", paste(newClasses, collapse = ", "))) ## METHODS: ## Method internals: For efficiency reasons setMethod() caches ## method definition into a global table which you can get with ## 'getMethodsForDispatch' function, and when a method is dispatched that ## table is used. When ess-developer is used to source method definitions the ## two copies of the functions are identical up to the environment. The ## environment of the cached object has namespace:foo as it's parent but the ## environment of the object in local table is precisely namspace:foo. This ## does not cause any difference in evaluation. methodNames <- allMethodTables() methods <- sub(methods:::.TableMetaPrefix(), "", methodNames) methods <- sub(":.*", "", methods) methodsNs <- newMethods <- character() for (i in seq_along(methods)){ table <- methodNames[[i]] tableEnv <- get(table, envir = env) if(exists(table, envir = envns, inherits = FALSE)){ inserted <- .essDev_insertMethods(tableEnv, get(table, envir = envns), envns) if(length(inserted)) methodsNs <- c(methodsNs, gettextf("%s{%s}", methods[[i]], paste(inserted, collapse = ", "))) }else if(exists(table, envir = .GlobalEnv, inherits = FALSE)){ inserted <- .essDev_insertMethods(tableEnv, get(table, envir = .GlobalEnv), envns) if(length(inserted)) newMethods <- c(newMethods, gettextf("%s{%s}", methods[[i]], paste(inserted, collapse = ", "))) }else{ .essDev_assign(table, tableEnv, envir = .GlobalEnv) newMethods <- c(newMethods, gettextf("%s{%s}", methods[[i]], paste(objects(envir = tableEnv, all.names = T), collapse = ", "))) } } if(length(methodsNs)) objectsNs <- c(objectsNs, gettextf("METH[%s]", paste(methodsNs, collapse = ", "))) if(length(newMethods)) newObjects <- c(newObjects, gettextf("METH[%s]", paste(newMethods, collapse = ", "))) if(length(objectsPkg)) cat(sprintf("%s PKG: %s ", package, paste(objectsPkg, collapse = ", "))) if(length(objectsNs)) cat(sprintf("NS: %s ", paste(objectsNs, collapse = ", "))) if(length(newObjects)) cat(sprintf("GlobalEnv: %s\n", paste(newObjects, collapse = ", "))) if(length(c(objectsNs, objectsPkg, newObjects)) == 0) cat(sprintf("*** Nothing explicitly assigned ***\n")) invisible(env) } .essDev_insertMethods <- function(tableEnv, tablePkg, envns) { inserted <- character() for(m in ls(envir = tableEnv, all.names = T)){ if(exists(m, envir = tablePkg, inherits = FALSE)){ thisEnv <- get(m, envir = tableEnv) thisPkg <- get(m, envir = tablePkg) if(is(thisEnv, "MethodDefinition") && is(thisPkg, "MethodDefinition") && .essDev_differs(thisEnv@.Data, thisPkg@.Data)){ environment(thisEnv@.Data) <- envns ## environment of cached method in getMethodsForDispatch table is still env ## not a problem as such, but might confuse users .essDev_assign(m, thisEnv, tablePkg) inserted <- c(inserted, m) }}} inserted } .essDev_evalSource <- function (source, expr, package = "") { envns <- tryCatch(asNamespace(package), error = function(cond) NULL) if(is.null(envns)) stop(gettextf("Package \"%s\" is not attached and no namespace found for it", package), domain = NA) env <- new.env(parent = envns) env[[".packageName"]] <- package methods:::setCacheOnAssign(env, TRUE) if (missing(source)) eval(expr, envir = env) else if (is(source, "character")) for (text in source) sys.source(text, envir = env, keep.source = TRUE) else stop(gettextf("Invalid source argument: got an object of class \"%s\"", class(source)[[1]]), domain = NA) env } .essDev_assign <- function (x, value, envir) { if (exists(x, envir = envir, inherits = FALSE) && bindingIsLocked(x, envir)) { unlockBinding(x, envir) assign(x, value, envir = envir, inherits = FALSE) op <- options(warn = -1) on.exit(options(op)) lockBinding(x, envir) } else { assign(x, value, envir = envir, inherits = FALSE) } invisible(NULL) } .essDev_identicalClass <- function(cls1, cls2, printInfo = FALSE){ slots1 <- slotNames(class(cls1)) slots2 <- slotNames(class(cls2)) if(identical(slots1, slots2)){ vK <- grep("versionKey", slots1) if(length(vK)) slots1 <- slots2 <- slots1[-vK] out <- sapply(slots1, function(nm) identical(slot(cls1, nm), slot(cls2, nm))) if(printInfo) print(out) all(out) } } .essDev_differs <- function(f1, f2) { if (is.function(f1) && is.function(f2)){ !(identical(body(f1), body(f2)) && identical(args(f1), args(f2))) }else !identical(f1, f2) } ess/etc/ESSR/R/.basic.R0000664000175000017500000000563112423756516012756 0ustar eddedd#### Essential functionality needed by ESS ## Should work on *all* vesions of R. ## Do not use _ in names, nor :: , nor 1L etc, as they ## cannot be parsed in old R versions ## loading ESSR.rda might fail, so re-assign here: .ess.Rversion <- if( exists("getRversion", mode="function") ){ getRversion() } else { paste(R.version$major, R.version$minor, sep=".") } .ess.R.has.utils <- (.ess.Rversion >= "1.9.0") .ess.utils.name <- paste("package", if(.ess.Rversion >= "1.9.0") "utils" else "base", sep = ":") ## Instead of modern utils::help use one that works in R 1.0.0: .ess.findFUN <- get("find", .ess.utils.name) .ess.sourceFUN <- get("source", pos="package:base") .ess.helpFUN <- get("help", envir=.GlobalEnv)# so it also works with d..tools ### HELP .ess.help <- function(..., help.type = getOption('help_type')) { if (.ess.Rversion > '2.10')# abbreviating 'help_type' on purpose: .ess.helpFUN(..., help = help.type) else # not using identical(), and working also for NULL: .ess.helpFUN(..., htmlhelp = (length(help.type) && help.type=='html')) } .ess.getHelpAliases <- function(){ readrds <- if(.ess.Rversion >= '2.13.0') readRDS else .readRDS rds.files <- paste(searchpaths(), "/help/aliases.rds", sep = "") unlist(lapply(rds.files, function(f){ if( file.exists(f) ) try(names(readrds(f))) }), use.names = FALSE) } ### SOURCING .ess.eval <- function(string, echo = TRUE, print.eval = TRUE, max.deparse.length = 300, file = tempfile("ESS"), local = if (.ess.Rversion > '2.13') parent.frame() else FALSE) { ## create FILE, put string into it. Then source. ## arguments are like in source and .ess.source cat(string, file = file) on.exit(file.remove(file)) .ess.source(file, echo = echo, print.eval = print.eval, max.deparse.length = max.deparse.length, local = local) } .ess.source <- function(file, echo = TRUE, print.eval = TRUE, max.deparse.length = 300, local = if (.ess.Rversion > '2.13') parent.frame() else FALSE) { ss <- # drop 'keep.source' for older versions if(.ess.Rversion >= "2.8") .ess.sourceFUN else function(..., keep.source) .ess.sourceFUN(...) invisible(ss(file, echo = echo, local = local, print.eval = print.eval, max.deparse.length = max.deparse.length, keep.source = TRUE)$value) ## return value for org-babel } if(.ess.Rversion < "1.8") ## (works for "1.7.2"): bquote() was new in 1.8.0 bquote <- function(expr, where=parent.frame()){ unquote <- function(e) if (is.pairlist(e)) as.pairlist(lapply(e, unquote)) else if (length(e) <= 1) e else if (e[[1]] == as.name(".")) eval(e[[2]], where) else as.call(lapply(e, unquote)) unquote(substitute(expr)) } ess/etc/ESSR/R/misc.R0000664000175000017500000000767012423756516012557 0ustar eddedd.ess_weave <- function(command, file, encoding = NULL){ cmd_symb <- substitute(command) if(grepl('knit|purl', deparse(cmd_symb))) require(knitr) od <- getwd() on.exit(setwd(od)) setwd(dirname(file)) frame <- parent.frame() if(is.null(encoding)) eval(bquote(.(cmd_symb)(.(file))), envir = frame) else eval(bquote(.(cmd_symb)(.(file), encoding = .(encoding))), envir = frame) } .ess_knit <- function(file, output = NULL){ library(knitr) frame <- parent.frame() od <- getwd() on.exit(setwd(od)) setwd(dirname(file)) ## this bquote is really needed for data.table := operator to work correctly eval(bquote(knit(.(file), output = .(output))), envir = frame) } .ess_sweave <- function(file, output = NULL){ od <- getwd() frame <- parent.frame() on.exit(setwd(od)) setwd(dirname(file)) eval(bquote(Sweave(.(file), output = .(output))), envir = frame) } ## Users might find it useful. So don't prefix with .ess. htsummary <- function (x, hlength = 4, tlength = 4, digits = 3) { ## fixme: simplify and generalize snames <- c("mean", "sd", "min", "max", "nlev", "NAs") d <- " " num_sumr <- function(x){ c(f(mean(x, na.rm = TRUE)), f(sd(x, na.rm = TRUE)), f(min(x, na.rm = TRUE)), f(max(x, na.rm = TRUE)), d, f(sum(is.na(x), na.rm = TRUE))) } f <- function(x) format(x, digits = digits) if (is.data.frame(x) | is.matrix(x)) { if (nrow(x) <= tlength + hlength){ print(x) } else { if (is.matrix(x)) x <- data.frame(unclass(x)) ## conversion needed, to avoid problems with derived classes suchs as data.table h <- as.data.frame(head(x, hlength)) t <- as.data.frame(tail(x, tlength)) for (i in 1:ncol(x)) { h[[i]] <- f(h[[i]]) t[[i]] <- f(t[[i]]) } ## summaries sumr <- sapply(x, function(c){ if(is.logical(c)) ## treat logical as numeric; it's harmless c <- as.integer(c) if(is.numeric(c)) num_sumr(c) else if(is.factor(c)) c(d, d, d, d, nlevels(c), sum(is.na(c))) else rep.int(d, length(snames)) }) sumr <- as.data.frame(sumr) row.names(sumr) <- snames dots <- rep("...", ncol(x)) empty <- rep.int(" ", ncol(x)) lines <- rep.int(" ", ncol(x)) df <- rbind(h, ...= dots, t, `_____` = lines, sumr, ` ` = empty) print(df) } } else { cat("head(", hlength, "):\n", sep = "") print(head(x, hlength)) if(length(x) > tlength + hlength){ cat("\ntail(", tlength, "):\n", sep = "") print(tail(x, tlength)) } cat("_____\n") if(is.numeric(x) || is.logical(x)) print(structure(num_sumr(x), names = snames), quote = FALSE) else if(is.factor(x)){ cat("NAs: ", sum(is.na(x), na.rm = TRUE), "\n") cat("levels: \n") print(levels(x)) } } invisible(NULL) } .ess_vignettes <- function(){ vs <- unclass(browseVignettes()) vs <- vs[sapply(vs, length) > 0] mat2elist <- function(mat){ if(!is.null(dim(mat))){ apply(mat, 1, function(r) sprintf("(list \"%s\")", paste0(gsub("\"","\\\\\"", as.vector(r[c("Title", "Dir", "PDF", "File", "R")])), collapse = "\" \""))) } } cat("(list \n", paste0(mapply(function(el, name) sprintf("(list \"%s\" %s)", name, paste0(mat2elist(el), collapse = "\n")), vs, names(vs)), collapse = "\n"), ")\n") } ess/etc/ESSR/R/debug.R0000664000175000017500000001642212423756516012705 0ustar eddedd ### BREAKPOINTS .ESSBP. <- new.env() ### DEBUG/UNDEBUG .ess_find_funcs <- function(env) { objs <- ls(envir = env, all.names = TRUE) objs[sapply(objs, exists, envir = env, mode = 'function', inherits = FALSE)] } .ess_all_functions <- function(packages = c(), env = NULL) { if(is.null(env)) env <- parent.frame() empty <- emptyenv() coll <- list() for(p in packages){ ## package might not be attached try({objNS <- .ess_find_funcs(asNamespace(p)) objPKG <- .ess_find_funcs(as.environment(paste0('package:', p))) coll[[length(coll) + 1]] <- paste0(p, ':::`', setdiff(objNS, objPKG), '`') }, silent = TRUE) } while(!identical(empty, env)){ coll[[length(coll) + 1]] <- .ess_find_funcs(env) env <- parent.env(env) } grep('^\\.ess', unlist(coll, use.names = FALSE), invert = TRUE, value = TRUE) } .ess_dbg_getTracedAndDebugged <- function(packages = c()) { tr_state <- tracingState(FALSE) on.exit(tracingState(tr_state)) generics <- methods::getGenerics() all_traced <- c() for(i in seq_along(generics)){ genf <- methods::getGeneric(generics[[i]], package=generics@package[[i]]) if(!is.null(genf)){ ## might happen !! v.2.13 menv <- methods::getMethodsForDispatch(genf) traced <- unlist(eapply(menv, is, 'traceable', all.names=TRUE)) if(length(traced) && any(traced)) all_traced <- c(paste(generics[[i]],':', names(traced)[traced],sep=''), all_traced) tfn <- getFunction(generics[[i]], mustFind=FALSE, where = .GlobalEnv) if(!is.null(tfn ) && is(tfn, 'traceable')) # if the default is traced, it does not appear in the menv :() all_traced <- c(generics[[i]], all_traced) } } debugged_pkg <- unlist(lapply(packages, function(pkgname){ ns <- asNamespace(pkgname) funcs <- .ess_find_funcs(ns) dbged <- funcs[unlist(lapply(funcs, function(f){ isdebugged(get(f, envir = ns, inherits = FALSE)) }))] if(length(dbged)) paste0(pkgname, ':::`', dbged, '`') })) env <- parent.frame() ## traced function don't appear here. Not realy needed and would affect performance. all <- .ess_all_functions(packages = packages, env = env) which_deb <- lapply(all, function(nm){ ## if isdebugged is called with string it doess find tryCatch(isdebugged(get(nm, envir = env)), error = function(e) FALSE) ## try(eval(substitute(isdebugged(nm), list(nm = as.name(nm)))), silent = T) }) debugged <- all[which(unlist(which_deb, recursive=FALSE, use.names=FALSE))] unique(c(debugged_pkg, debugged, all_traced)) } .ess_dbg_UntraceOrUndebug <- function(name, env = parent.frame()) { tr_state <- tracingState(FALSE) on.exit(tracingState(tr_state)) if( grepl('::', name) ){ ## foo:::bar name eval(parse(text = sprintf('undebug(%s)', name))) }else{ ## name is a name of a function to be undebugged or has a form ## name:Class1#Class2#Class3 for traced methods name <- strsplit(name, ':', fixed = TRUE)[[1]] if( length(name)>1 ){ ## a method fun <- name[[1]] sig <- strsplit(paste(name[-1], collapse=''), '#', fixed=TRUE)[[1]] untrace(fun, signature = sig) }else{ ## function if( is(getFunction(name, where = parent.frame()), 'traceable') ) untrace(name) else if(grepl(":", name)) undebug(name) else undebug(get(name, envir = env)) }} } .ess_dbg_UndebugALL <- function(funcs) { tr_state <- tracingState(FALSE) on.exit(tracingState(tr_state)) env <- parent.frame() invisible(lapply(funcs, function( nm ) { ## ugly tryCatch, but there might be several names pointing to the ## same function, like foo:::bar and bar. An alternative would be ## to call .ess_dbg_getTracedAndDebugged each time but that might ## be ery slow try(.ess_dbg_UntraceOrUndebug(nm, env = env), TRUE) })) } ### WATCH .ess_watch_expressions <- list() .ess_watch_eval <- function() { env <- as.environment("ESSR") exps <- get('.ess_watch_expressions', envir = env) if(length(exps) == 0) { ## using old style so this can be parsed by R 1.9.1 (e.g): cat('\n# Watch list is empty!\n', '# a append new expression', '# i insert new expression', '# k kill', '# e edit the expression', '# r rename', '# n/p navigate', '# u/d,U move the expression up/down', '# q kill the buffer', sep="\n") } else { .parent_frame <- parent.frame() .essWEnames <- allNames(exps) len0p <- !nzchar(.essWEnames) .essWEnames[len0p] <- seq_along(len0p)[len0p] for(i in seq_along(exps)) { cat('\n@---- ', .essWEnames[[i]], ' ', rep.int('-', max(0, 35 - nchar(.essWEnames[[i]]))), '-@\n', sep = '') cat(paste('@---:', deparse(exps[[i]][[1]])), ' \n', sep = '') tryCatch(print(eval(exps[[i]], envir = .parent_frame)), error = function(e) cat('Error:', e$message, '\n' ), warning = function(w) cat('warning: ', w$message, '\n' )) } } } .ess_watch_assign_expressions <- function(elist){ assign(".ess_watch_expressions", elist, envir = as.environment("ESSR")) } .ess_log_eval <- function(log_name) { env <- as.environment("ESSR") if(!exists(log_name, envir = env, inherits = FALSE)) assign(log_name, list(), envir = env) log <- get(log_name, envir = env, inherits = FALSE) .essWEnames <- allNames(.ess_watch_expressions) cur_log <- list() .parent_frame <- parent.frame() for(i in seq_along(.ess_watch_expressions)) { capture.output( { cur_log[[i]] <- tryCatch(eval(.ess_watch_expressions[[i]]), envir = .parent_frame, error = function(e) paste('Error:', e$message, '\n'), warning = function(w) paste('warning: ', w$message, '\n')) if(is.null(cur_log[i][[1]])) cur_log[i] <- list(NULL) }) } names(cur_log) <- .essWEnames assign(log_name, c(log, list(cur_log)), envir = env) invisible(NULL) } .ess_package_attached <- function(pack_name){ as.logical(match(paste0("package:", pack_name), search())) } ess/etc/completion_ideas.R0000664000175000017500000000136312613523406014145 0ustar eddedd ## inspired by: ## https://github.com/rstudio/rstudio/pull/191 ## nested calls should work df[a][, |] ## matrix, list, environments l <- list(aaaa = 1111, bbbb = 2222) l[a|] ## -> "aaaa" (quoted!) ## data table dt <- data.table(aaaa = 1111, bbbb = 22222) dt[, a|] # -> aaaa (unquoted!) ## attributes x <- "" attr(x, "foo") <- function(alpha, beta) {} attr(x, "foo")(al| # -> "alpha" ## chains mtcars %>% dplyr::select(mp| #-> mpg (unquoted)) ## models lm(mpg ~ cy| , data = mtcars) #-> cyl ## "by" keyword in data.table, inner_join, etc inner_join(foo, bar, by = c(| # provides completions for variables in foo when # on the left side of an =, and bar when on the # right side of an =. ess/etc/R-ESS-bugs.el0000664000175000017500000000614112423756516012625 0ustar eddedd;;;; Things that go wrong or *went* wrong in the past ;;;; (from list side) see R-ESS-bugs.R for the R's side. ;;;; 1 ess-get-words-from-vector stumbles over \" (ess-get-words-from-vector "c('aaa','bbb\"ccc', 'dddd')\n") ;;-> (" " "ccc" "dddd"): SOLVED ;;;; 2 ess-get-words-from-vector disregards max.print ;; options(max.print=1000) (warning added to the docs) (length (ess-get-words-from-vector "as.character(1:10000)\n")) ;;-> 1001 with "max.print" at the end; added a comment in the function doc ;;;; 3 Inferior-ess-primary-prompt does not capture "+ + > " ;; this hangs emacs; SOLVED (ess-command "tf<-function(N){ N}\n") ;;;; 4 ess-command detects the prompt prematurely ;; this outputs str(iris) in the inferior buffer; SOLVED (ess-command " lm_test <- function (formula, data, subset, weights, na.action, method = 'qr', model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) { cl <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c('formula', 'data', 'subset', 'weights', 'na.action', 'offset'), names(mf), 0L) mf <- mf[c(1L, m)] mf$drop.unused.levels <- TRUE mf[[1L]] <- as.name('model.frame') mf <- eval(mf, parent.frame()) if (method == 'model.frame') return(mf) else if (method != 'qr') warning(gettextf('method is not supported. Using', method), domain = NA) mt <- attr(mf, 'terms') y <- model.response(mf, 'numeric') w <- as.vector(model.weights(mf)) if (!is.null(w) && !is.numeric(w)) stop('weights must be a numeric vector') offset <- as.vector(model.offset(mf)) if (!is.null(offset)) { if (length(offset) != NROW(y)) stop(gettextf('number of offsets is %d, should equal %d (number of observations)', length(offset), NROW(y)), domain = NA) } if (is.empty.model(mt)) { x <- NULL z <- list(coefficients = if (is.matrix(y)) matrix(, 0, 3) else numeric(0L), residuals = y, fitted.values = 0 * y, weights = w, rank = 0L, df.residual = if (!is.null(w)) sum(w != 0) else if (is.matrix(y)) nrow(y) else length(y)) if (!is.null(offset)) { z$fitted.values <- offset z$residuals <- y - offset } } else { x <- model.matrix(mt, mf, contrasts) z <- if (is.null(w)) lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) else lm.wfit(x, y, w, offset = offset, singular.ok = singular.ok, ...) } class(z) <- c(if (is.matrix(y)) 'mlm', 'lm') z$na.action <- attr(mf, 'na.action') z$offset <- offset z$contrasts <- attr(x, 'contrasts') z$xlevels <- .getXlevels(mt, mf) z$call <- cl z$terms <- mt if (model) z$model <- mf if (ret.x) z$x <- x if (ret.y) z$y <- y if (!qr) z$qr <- NULL z } str(iris) ") ;;;; 5 double prompt > > used to stall emacs; SOLVED (ess-command "\n\n\n") ess/etc/config.guess0000775000175000017500000013210012423756516013027 0ustar eddedd#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2013-12-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ # # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd | genuineintel) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ess/etc/R_error_patterns.R0000664000175000017500000000450112423756516014167 0ustar eddedd ## 1 Error: chunk 7 (label = OP4) Error in disp.Rnw:656:31: unexpected symbol 655: par(mgp = c(2.5, 1, 1), mar = c(0, 0, 0, 0), 656: plt= c(0.08, 0.9, 0.25, 0.p9 )) ## 2 Browse[2]> Error in x %*% y (from models.R#46) : Cholmod error 'X and/or Y have wrong dimensions' at file ../MatrixOps/cholmod_sdmult.c, line 90 ## 3 Error in source("~/works/protoClasses/R/funcs.R") (from hierarchy.R#6) : ~/works/protoClasses/R/funcs.R:1797:5: unexpected '[[' 1796: b[[2]] <- quote(browser()) 1797: [[ ^ ## 4 source("basicModel.R") Error in source("basicModel.R") : basicModel.R:95:1: unexpected symbol 94: 95: ixQ ^ ## 5.a > + Error in source(file = "/home/vitoshka/works/pbm/R/S4.R") (from #1) : /home/vitoshka/works/pbm/R/S4.R:36:62: unexpected ')' 35: }, list(vname = as.name(".pix_v")), 36: pname = as.name(".pix_p")))) ^ ## 5.b > + Error in source(file = "/home/vitoshka/works/pbm/R/S4.R") (from #1) : c:/home/vitoshka/works/pbm/R/S4.R:36:62: unexpected ')' 35: }, list(vname = as.name(".pix_v")), 36: pname = as.name(".pix_p")))) ^ > ## 6 first line is not a pattern! + . + Error in base::source(file = file, echo = echo, local = local, print.eval = print.eval, (from #95) : /tmp/model_mixture.R@4:5:13: unexpected symbol 4: Mq$DATA$ixs$clust <- data$ixQ 5: Mq ## 7 don't highlight dates id lat lon obs_date Min. : 1.00 Min. :21.57 Min. :-179.88 01/02/1997 04:16:53: 1 1st Qu.: 99.25 1st Qu.:24.36 1st Qu.:-147.38 01/02/1997 05:56:25: 1 Median :197.50 Median :25.64 Median :-119.64 01/04/1997 17:41:54: 1 Mean :197.50 Mean :27.21 Mean : -21.52 01/05/1997 17:20:07: 1 3rd Qu.:295.75 3rd Qu.:27.41 3rd Qu.: 153.66 01/06/1997 04:31:13: 1 Max. :394.00 Max. :39.84 Max. : 179.93 01/06/1997 06:12:56: 1 (Other) :388 ess/etc/icons/0000775000175000017500000000000012423756516011625 5ustar eddeddess/etc/icons/rbuffer.xpm0000664000175000017500000000142412423756516014007 0ustar eddedd/* XPM */ static char *rbuffer[]={ "24 24 3 1", ". c None s backgroundToolBarColor", "a c #000000", "# c #1532ed", "........................", "...............#........", "...............##.......", ".....#############......", ".....##############.....", ".....#############......", "...............##.......", "...............#........", "........................", "........................", "........................", "...aaaaaaaaaaaaaaaaaa...", "........................", "........................", "...aaaaaaaaaaaaaaaaaa...", "........................", "........................", "...aaaaaaaaaaaaaaaaaa...", "........................", "........................", "...aaaaaaaaaaaaaaaaaa...", "........................", "........................", "...aaaaaaaaaaaaaaaaaa..."}; ess/etc/icons/spluslogo.xpm0000664000175000017500000000160012423756516014377 0ustar eddedd/* XPM */ static char *spluslogo[]={ "24 24 10 1", "a c None s backgroundToolBarColor", "g c #000000", "h c #838383", "# c #ce3000", "f c #ce3062", "e c #ce6262", ". c #ce629b", "b c #cecece", "d c #ffcece", "c c #ffceff", ".##aaaa###aa#aab#a#ba.##", "#a#caaa#db#a#aab#a#bd#a#", "##caaaa#b#.a#aad#a#ba##c", "a.#a##a##.ca#aab#a#daa.#", "ea#aaaa#daaa#aab#a#bbea#", "##.aaaa#daaa###a.f#ac##.", "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaggga###ahhhaaaaaaaa", "aaaaaggga###ahhhaaaaaaaa", "aaaaaggga###ahhhaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaa###ahhhaaaahhhaaaaa", "aaaaa###ahhhaaaahhhaaaaa", "aaaaa###ahhhaaaahhhaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaahhhaaaahhha###aaaaa", "aaaaahhhaaaahhha###aaaaa", "aaaaahhhaaaahhha###aaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaahhha###agggaaaaa", "aaaaaaaahhha###agggaaaaa", "aaaaaaaahhha###agggaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaa"}; ess/etc/icons/splus_letter_small.xpm0000664000175000017500000000667112423756516016302 0ustar eddedd/* XPM */ static char *dummy[]={ "25 19 151 2", "Qt c None s backgroundToolBarColor", "#M c #044b83", "#R c #044c86", "#t c #044c87", "ae c #044d87", "an c #044e7f", ".o c #044e81", "#l c #044e8d", "ak c #044f84", ".B c #044f88", "#m c #044f8e", "am c #045188", ".j c #04518b", ".O c #045191", "#6 c #04528f", "#O c #045388", ".k c #04538c", "#U c #04538e", "#Y c #045392", ".l c #045489", "## c #04548c", "#i c #045490", "#v c #045492", "#. c #04558e", "#C c #045593", "#k c #04568d", "#B c #045695", "#G c #045698", ".Y c #045795", ".R c #045890", "#j c #04598f", ".4 c #045995", "aj c #054e7b", "al c #054e89", "#h c #054e8d", "#S c #055188", "#V c #05518d", ".m c #055282", ".K c #055284", ".5 c #055583", ".t c #055791", "#u c #055894", ".n c #064e86", "#s c #074d76", ".p c #074e83", "a. c #074f89", "#a c #074f8a", "af c #075389", "#9 c #07548e", ".A c #075592", ".F c #075594", "#1 c #075a99", ".c c #094d79", ".9 c #094f89", ".J c #095681", "#A c #0b568d", ".s c #0c4f85", "#5 c #0c5188", "#w c #0d5486", ".b c #0e4e7d", ".N c #105287", ".X c #105685", "#H c #115789", "#Z c #13508a", "#2 c #135287", "#F c #195c8a", ".i c #1a5c8b", "#8 c #1b5684", "ai c #1b5a81", "ad c #1c5d87", "#P c #1d5c8c", "#r c #1d5f8a", "#N c #1f5b7d", "ao c #1f5c85", "#0 c #205a86", "#n c #206292", ".u c #216794", ".d c #245b81", ".G c #256390", ".3 c #265f85", "a# c #266287", "#x c #296286", "#b c #2a5f96", "#g c #2b6395", ".a c #2c658f", ".Q c #307195", ".E c #326897", ".S c #356f98", ".Z c #35789b", "ag c #396c94", "#I c #3a6a78", "#z c #3f7497", ".1 c #3f7c9e", "#J c #427585", "aa c #42768f", "#X c #447ca1", ".C c #457b9a", ".z c #457ba8", "ac c #48778f", ".q c #4e86b0", "#7 c #4f86b5", ".6 c #50829b", "#q c #538db5", "#D c #538eb3", ".e c #547f91", "ab c #5487a1", "#T c #58859c", "ah c #5983a7", "#c c #5a7d99", ".2 c #5b809c", ".P c #5d94bb", "#K c #6c91a0", "#4 c #6c99ba", "#L c #6c9cb7", "#o c #7097a7", "ap c #739eb3", ".v c #73a7c0", ".0 c #7cacc3", "#y c #7faac6", ".# c #82a0a8", "#Q c #84aec8", ".I c #86a8bd", ".L c #89b3cd", "#d c #8aa7b6", "as c #8db2cc", ".y c #8db9cd", ".h c #8eb5c9", ".8 c #8eb9d3", "#W c #8fb2c9", "at c #91b7c8", "#3 c #94b4cb", "ar c #95b7cb", ".T c #979798", ".U c #99999a", "#f c #99b9cd", ".g c #9b9b9b", ".V c #9c9c9c", ".r c #9cc2d4", ".w c #a7c8d0", ".x c #a9c8d1", "#p c #a9cbda", ".f c #abc5cd", "#E c #abcad6", "aq c #b1d0e0", "au c #b3d2e2", ".7 c #b8cfd6", "#e c #baced7", ".W c #d4e0e4", ".H c #d7e7ed", ".M c #dae6ef", ".D c #eef8f8", "QtQtQtQt.#.a.b.c.d.e.fQtQtQtQtQtQtQtQt.g.gQtQtQtQt", "QtQt.h.i.j.k.l.m.n.o.p.qQtQtQtQtQtQtQt.g.gQtQtQtQt", "Qt.r.s.t.u.v.w.x.y.z.A.B.CQtQtQtQtQtQt.g.gQtQtQtQt", ".D.E.F.G.HQtQtQtQtQt.I.J.K.LQtQtQtQtQt.g.gQtQtQtQt", ".M.N.O.PQtQtQtQtQtQtQt.Q.R.SQt.g.T.U.g.g.g.V.V.g.g", ".W.X.Y.ZQtQtQtQtQtQtQt.0.1.2Qt.g.g.g.g.g.g.g.g.g.g", "Qt.3.4.5.6.7QtQtQtQtQtQtQtQtQtQtQtQtQt.g.gQtQtQtQt", "Qt.8.9#.###a#b#c#d#eQtQtQtQtQtQtQtQtQt.g.gQtQtQtQt", "QtQt#f#g#h#i#j#k#l#m#n#oQtQtQtQtQtQtQt.g.gQtQtQtQt", "QtQtQtQt#p#q#r#s#t#u#v#w#xQtQtQtQtQtQt.g.gQtQtQtQt", "QtQtQtQtQtQtQtQt#y#z#A#B#C#DQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQt#E#F#G#HQtQtQtQtQtQtQtQtQtQtQt", "#I#J#KQtQtQtQtQtQtQtQt#L.B#MQtQtQtQtQtQtQtQtQtQtQt", "#N#O#PQtQtQtQtQtQtQtQt#Q#R#SQtQtQtQtQtQtQtQtQtQtQt", "#T#U#V#WQtQtQtQtQtQtQt#X#Y#ZQtQtQtQtQtQtQtQtQtQtQt", "Qt#0#1#2#3QtQtQtQtQt#4#5#6#7QtQtQtQtQtQtQtQtQtQtQt", "QtQt#8#9a.a#aaabacadaeafagQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtahaiajakalamanaoapQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtaqarasatauQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; ess/etc/icons/splus_letters_large.xpm0000664000175000017500000001743512423756516016447 0ustar eddedd/* XPM */ static char *splus_letters_large[] = { /* width height num_colors chars_per_pixel */ " 51 38 236 2", /* colors */ ".. c #043e74", ".# c #74a29c", ".a c #547a74", ".b c #bcb2b9", ".c c #0c6a9c", ".d c #045282", ".e c #bcdae8", ".f c #94c2cc", ".g c #245678", ".h c #e4e2e3", ".i c #94a2a4", ".j c #04528f", ".k c #5c8aa4", ".l c #346688", ".m c #848a8c", ".n c #04427c", ".o c #e4f4fc", ".p c #94b4b4", ".q c #cceef4", ".r c #045e99", ".s c #4c7a88", ".t c #a4d6f0", ".u c #6c8e94", ".v c #f4f2e4", ".w c #7cb2d4", ".x c #b4b2b4", ".y c #145274", ".z c #044c74", ".A c #acc2d4", ".B c #dcdddc", ".C c #34729c", ".D c #c4c6c4", ".E c #144e84", ".F c #94b4cc", ".G c #fcfaeb", ".H c #245a88", ".I c #5496b9", ".J c #044a80", ".K c #c4e6f1", ".L c #9cc6ec", ".M c #347aac", ".N c #6c96a8", ".O c #145a80", ".P c #6ca2c8", ".Q c #045a91", ".R c #d4fafc", ".S c #145e8c", ".T c #144264", ".U c #446e89", ".V c #949594", ".W c #5c7e84", ".X c #548ec4", ".Y c #e4fdfc", ".Z c #044a8c", ".0 c #e4eef2", ".1 c #a4a3a4", ".2 c #346aa0", ".3 c #dceef4", ".4 c #bcd2d4", ".5 c #f4faf9", ".6 c #74aacc", ".7 c #044669", ".8 c #246696", ".9 c #045a84", "#. c #ccdedc", "## c #9ccad8", "#a c #a4b6b7", "#b c #144a6e", "#c c #94bacc", "#d c #346288", "#e c #6c9bbc", "#f c #bcbebc", "#g c #c4e2ec", "#h c #0c548c", "#i c #7c9e9c", "#j c #f4f2f4", "#k c #14527c", "#l c #0c4c7f", "#m c #0c5379", "#n c #c4dae4", "#o c #245e7c", "#p c #6492a4", "#q c #346e94", "#r c #ecf4f2", "#s c #44829c", "#t c #b4cad0", "#u c #145a8e", "#v c #447490", "#w c #246294", "#x c #448abc", "#y c #fcfefb", "#z c #2c6f9a", "#A c #a4bacc", "#B c #bcbaba", "#C c #94a6c0", "#D c #04569c", "#E c #648aa0", "#F c #d4f6fc", "#G c #8cb2c4", "#H c #acbabc", "#I c #d4e8f0", "#J c #84aabc", "#K c #1c5b82", "#L c #7ca2c1", "#M c #5486a4", "#N c #ecebe9", "#O c #0c5fa4", "#P c #9cbdce", "#Q c #accee4", "#R c #0c4270", "#S c #6c6e6c", "#T c #a4c4cc", "#U c #0c467c", "#V c #9cb6b4", "#W c #d4eef8", "#X c #447c98", "#Y c #b4d4e8", "#Z c #6c92a4", "#0 c #0c4b6f", "#1 c #cccccc", "#2 c #2c5e8c", "#3 c #649cc0", "#4 c #cce7f1", "#5 c #a4cee8", "#6 c #4482ac", "#7 c #d4d6d4", "#8 c #648abc", "#9 c #9c9b9c", "a. c #acadac", "a# c #547a98", "aa c #34627c", "ab c #1c669c", "ac c #84badc", "ad c #bcced4", "ae c #6c8ea4", "af c #bcd4e8", "ag c #dcf6fc", "ah c #8cbad4", "ai c #7c9bb1", "aj c #9cc6dc", "ak c #3c6a84", "al c #7496a7", "am c #1c5e94", "an c #5c90b8", "ao c #b4dee4", "ap c #4c728c", "aq c #4c86ac", "ar c #dce6e9", "as c #8caebc", "at c #94aec0", "au c #7ca2a8", "av c #5c96c4", "aw c #0c5a90", "ax c #2c668c", "ay c #2c5e70", "az c #5c86a4", "aA c #ece6dc", "aB c #8c8d8f", "aC c #748c8c", "aD c #fcf6ec", "aE c #84b6cc", "aF c #1c5470", "aG c #3c7aa4", "aH c #74a6c4", "aI c #7cacc8", "aJ c #a4cbd7", "aK c #1c4e6c", "aL c #749bc1", "aM c #c4c2c4", "aN c #fcf6f5", "aO c #1c5682", "aP c #b4cbe1", "aQ c #747274", "aR c #4c7a9c", "aS c #04468c", "aT c #94b2c4", "aU c #0462a4", "aV c #84a6b4", "aW c #9ccaf4", "aX c #6c9ab4", "aY c #dcfbfc", "aZ c #14629c", "a0 c #14466c", "a1 c #ecfdfc", "a2 c #dcf2fc", "a3 c #0c5384", "a4 c #c4dcf4", "a5 c #ecf5fc", "a6 c #44749c", "a7 c #2c6ea4", "a8 c #648eac", "a9 c #8cb6d4", "b. c #7ca6cc", "b# c #eceef4", "ba c #a4c6dc", "bb c #9cb2c4", "bc c #b4daf4", "bd c #9ca29c", "be c #c4d2dc", "bf c #3c6e90", "bg c #b4babb", "bh c #4c82a4", "bi c #045a9c", "bj c #044674", "bk c #0c5a84", "bl c #4c829c", "bm c #5486b4", "bn c #044272", "bo c #bcb6b8", "bp c #045684", "bq c #bcdee7", "br c #245a7c", "bs c #e4e6e4", "bt c #045691", "bu c #5c8ea9", "bv c #04467e", "bw c #ccf2f9", "bx c #04629c", "by c #f4f6ec", "bz c #b4b6b5", "bA c #fcfeec", "bB c #245e88", "bC c #044e81", "bD c #9ccae4", "bE c #347ea4", "bF c #5c828c", "bG c #044e8d", "bH c #346e9c", "bI c #dcf2ec", "bJ c #0c6298", "bK c #f4fefc", "bL c #74aec4", "bM c #a4babc", "bN c #94bed4", "bO c #f4f6f4", "bP c #145680", /* pixels */ ".mbgbobo.bbo#Bbg#aaVa8.l#ba0.7a0br.U.N.p#abg#Bbobobo#B#Bbo.b.bbz#B#Bbg#Bbz#B.V#SaQ#SaB.x#B#B#B#Bbg#B#B", ".x.5#yaN#y#yar#a.Way#l#h#hbtaw.d#l#K.gay.uada5#ybO#j#y#yaN#yaN#y#y#y#y#y#y#y#1.V#9.V#BbO#y#y#y#y#y#y#y", "#B#y#ybKagbDaq#u.JbGbtbtbt.QbpbC#h.d.JbC.JbP.X.ta1bK#y#y#y#y#y#y#y#y#y#y#y#y.D#9#9#9#BbO#y#y#y#y#y#y#y", "bo.G#y.oas.lbj.Jbt.Qbt.J.J.9bk.JbvbG.d.dbtbvbvbf#Ta1#y#y#yaN#y#y#y#y#y#y#y#y.D.V#9.V#BbO#y#y#y#y#y#y#y", "#B#y.Yah.8bv.QbJ.j#m#K#X#palal.Na8#qaO#l#Dbt.j.J#zaja1#yaN#y#y#y#y#y#y#y#y#y.D#9#9#9#faN#y#y#y#y#y#y#y", "bg#ybqa6...jbi.J.S#3.tbw.Y.Ya1aY.Rbw.Lbm#ubGbtbC.7ap#n#y#y#yaN#y#y#y#y#y#y#y.D#9.V#9#B#y#y#y#y#y#y#y#y", "bza1b..J.ZbibC.g.F.0#y#y.G#y#y#ybK#y#yb##CaF.d.c.da3.Pa2#yaN.G#y#y#y#y#y#y#y.D#9#9.V#BbO#y#y#y#y#y#y#y", "bz#Ia6..aZ.jbG#ea1#y#y#y#y#y#y#y#y#y#y#y.oaE.y.z.rbjax#Y#yaD.v#N.h.hbsbs.hbs.x#9#9#9.x.h#Nbs.hbs.hbs#j", "#Ha4aObG#DbG#ubabK#y.G#y#y#y#y.5#yaNaNaN#y#W#s.JbxbtbC.6a1#yaAa.#9.1#9.1.1#9#9#9#9#9bd#9.1.1.1#9#9.1.B", "#H.AaObGbGbtab#5bK#y#y.G#y#y#y#y#y#yaN.G#ya1bL.zbt.dbnaz.3#y.h.1aB.V#9aB.V#9#9#9#9#9#9#9.V.V#9.V.V#9.B", "#H#AaO.Q#DbtbkaEa1#y#y.G#y#y#yaN#yaN#yaNaN#y##.O.z#m#Rap#n#ybs.1.V.1#9#9#9.1#9.Vbd#9#9#9#9#9#9.1.V.1.B", "bg#t#KbC.rbt.d#s#WbK#y#y#y#yaN#yaN#y#yaNaNbK#gaIaHaIaibb#I#y#r#1#1#1.D#1#1#1.x#9#9#9a..D#1#1#1#1#1#1b#", "bgaraabjbi.Qbp#mbuaJbI#y#y#y#y#yaNaN#y#y#y#ybK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#1#9.V#9#fbO#y#y#y#y#y#y#y", "bga5.kbCbt.rbx.z.7ak#Z#Pa4.0#y#y#y#y#y#y#y#j#y#y.5#y#y#y#yaN#y#y#y#y#y#y#y#y#f#9#9.V#B#y#y#y#y#y#y#y#y", "bo#y#Qa7.Zbt.r.Q.QbC.Z#h.2#8#C#A.4ar#r#y#y#yaNaN#y#y#y#y#y#yaN#y#y#y#y#y#y#yaM.V#9.V#fbO#y#y#y#y#y#y#y", "bo#y.YaIam..bv.Qbtbtbt#laS#Ra0aKaka#ae#c.ea2bK#y#y#yaN.G#y#y.5#y#y#y#y#y#y#y.D#9bd#9#faN#y#y#y#y#y#y#y", "bo.G#ya5at#d#UaS#D#Dbi.r.r.QbtbtbG.Z.Z.jaban.f#.bO#y#y#y#y#y.5#y#y#y#y#y#y#y.D.V#9.VbobO#y#y#y#y#y#y#y", "boaN#y#ya1bcaLax#U.JbCbGbp.Q.9bt.j.j.j.j.J.zaK.U#Pa2bK#y#y#y#y#y#yaN#y#y#y#y.D.VaBaBbzbO#y#y#y#y#y#y#y", "#B#y#y#yaNbK.oaf#Jan.C.ObCbC.d.d.j.jbi.rbi.j#l#0#KaX#I#y.5.G.G#y#y#y#y#y#y#y#1.xa..1.D#y#y#y#y#y#y#y#y", "bo#y#yaN.5#y#y#ybK#FaW.Paq#o#b.7bv.J#hbt.j.jaZawbnaFaEa1.5aN#y#y#y#y#y#y#y#y.h#7.h.B.h#y#y#y#y#y#y#y#y", "#B#y.G.G#y.G#y.G#y#y.Y#IaoaJ#GaXaq#w#0.Jbtbi#Dbibi.J.MaobK.G.G#y#y#y#y#y#y#yaN#y#yaN#y#yaN#y#y#y#y#y#y", "bg#y#y#y#y#yaN#y#y#ybKbKbKbKbKa1.3#Y.F.kbBbC.dbiaU.jbv#3.o#yaD#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#HbK#y.5#y#y.G.G.G#y#y#y#y#y#y#y#y#y#y.0#Tbha3.j#Dbibv#zaf#y.G#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#Ha1a1a1a1#y.GaN#y#y#y#y#y#y.GaN#y.G#y#y#y.K#Mbj.jbi.jbP#c#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", ".a.##i.#au#t#y#yaN#y#y#y#y#y.GaN.G.G.GbA#y#y#P.O.jbt.jbv#LbK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", ".T#0#0#0aK#EbK#y#y.G#y#y#y#y#y#y#y#y.G#y#y#y#gaG.JbC.jbn#ebK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "br#m.QbC.JaR.3#yaNaN#y#y#y#y#y#y#y#yaN.GaD.G#Wbhbv.j.Q.JaXbK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#v#0.d.j.J.8#Q#y#y.G#y#y#y#ybK#y#yaN#y#ybObK.ebHbvbtbt#l#LbK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", ".NbP.j.r.d#h#LbK#y#y#y#y#ybK#ybKbK#y#y#y#y#y#P.ObGbt.Z.Ea9#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "at.s.Jbt#D.ZaxbabO#y#y#ybK#y#y#y#y#y#y#y#y#4an.Jbt#D.n.2#Y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "bMaT#k.Z#D#O.n.UbeaN#y#y#y#y#y#y#y#y#y#y.0ai.gbC#DbibGav#F#y.G#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#B.0#Ebnbp#ObGbG.8.PbcaYa1a1.YbKbKbKaYaW#x#h.Zbibtbj.2#Q#y#yaN#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "bo#y.e#X.J.j.r#DaS#hbHbFaCau.p#V.iaC.sam.JbG.r#Dbv.HbN.5.5aNaN#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#B#ybKaPa#a0.EbC#h.d.zbC#mawaw#u.S.d.J.d.jbCbC#b#d#G.o#y#j#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "bzbObKa1.KaL#2#la3bCbC.d.j.jbGbvbGbtbt.jbCbj.yblaJ.YbKbKbK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#B#yaN#y#ya5aPaiak#o#mbj.zbC#h.j.d.d.z.7br#M#P#I#y#yaN#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "#B#y#y#yaN#y.5ag.K.t.w.I#6.Ca7a7#zbE.Iacbc.q.Y#y#y#y#y.G#y.5bK#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y", "bo#y#y#y#y.5#y#y#y#y#y#ybO#r#r.5by.5#y#y#y#y#y#y#y#y#y#y#y#ybO#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y#y" }; ess/etc/icons/splus_letters_large.png0000664000175000017500000001025512423756516016420 0ustar eddeddЙPNG  IHDR3&i║гsRGB@└}┼ pHYs──Х+tEXtSoftwareMicrosoft Officeэ5q-IDATX├╡Y pTWvm-HH`Ы@╞/  ?K╩Б├N<щ╡ ■├g lA╛°Ўd═▌▓Є4╪iш0╜^ш∙єыf2 └C╫=жЭ,v╫n`╤ЦSеёБc▓ЬTЖАИ ╝ШРЖ╝O┐@у╜6╣],a3niИмомб▌sF¤ZZl╚┘╝┐ИЩЛ~уSЁ╪╓├oB:╥││кОуJЧg╒MG+olцН·C∙╟,┬аaS5'╟.6лP╗vу&кклQHу}ЮЁх╚жMЫФёbмЧcb░ФlЛg─c┬tтЖkн¤W├╝РФJ╩@`r1=УлVuдVВ3ўншT╡ОїБ╒╚!╣├P0nГ╣гpI¤0и t8╚8R│О6╡bщ╟uШ╖їR╖├тrц└'Зq▒∙Ю ╧ЦОNЬ>є'4Ь<Й╙зOу$чУ▐m╗vэъ'╢o▀оjПя║ЖЖЬ:u їїї8{Ў,╔зЕ╘L0Ъnсх),├▀З%y=№У╓!0.П╟.@Bv5╢Ь<Пя:юую1%ПЬ*┬дtиCnqCРМdeБЇёН╗Ыё▄*_L!oЭy╒╩╢ъгeЩ:╘═f?RgLэЮ╒└kk>BhфЇJТЛЄfхJ ВGN┼┐№!3╓mEiэ9╜▄ЖF2╡юЄ░ЬлЗ▒RреВ█м6шD(√║ьsШ^0Ж╦▌╬sо eO █T!$б%9"√▀кyящ╣Є^ и\еo;▌╚jMЫ═д%гM*Е_т:Д&fбЩ╚ЮБA╤┘°з[0m╒!фUGї▐г8xю╛╣qw;яў(Ї7kЧ█f(Q╔ ╔C,Тnс╕╜▐t+|rFЖп╞╚Ўс├ЗЩkkkU╤ь-a|а >Ф`DrЫhц ┤эgЁ|r,┐ЫO)в!8A┬-A▒9ОсIэ╢Ж═├У#▐┴sуfс_зg`┬т|L╧▐К№}gQ√═=|KўЁЮ7Ї─p┤ё┼VхKЧ░б╦╞W{WtQтItЯР0ынхzOЛщ░jж├Л╖;╚▀yп╛╣б#Ч░╪нb═BаЧТ╩╤/╣ A╔ ┐ЙЬ└s"*╟х┴2Ък:Ь▐ЯЙчж#> 3й├╔╦bЄl ╞&СБ├-9х┼ь╞C*°─Й▌4-Ф╜wя^%4}щн<`Ь║ц▓{Л!▄сrю╣╨К9еЯуХйE8*¤┬)я╟JZN!╣¤УиТ╔|▒л@AЭK╡╠Ў`<Лn° _Аg╞╬└ИY╩Ь─╖mvz╩й╪Р╒Й╔╧╝1Hс.gw╝ў4NАЙ╨ФТЫЫЛ╡k╫*EрS═=╒uп└!ЭеGвPТ8°aн╞N'Ў_lD┌G╡ШФ╦╢`vЖ$╨╕┼ьoЦР╞├Я═Щ▀Д|M(@PB)&UР Kр╟▄z,К-┬шyx&qfХ╓рь═v6FБ╙аЗT╜2 АЮ`Дnwь╪БЭ;wbы╓н╩S= @╝┘;4=`ШШ2Ь\-;+╣┴mъZUDаЬчЯ╩SwЁ^ї МZ╢3eПy┴Cз├─Їg▀30f5Вуsр?Б╥Е^┬Ўс▒ЙЇ╓╨┘x:f)Vю¤JIЩvd╫)}\m▌`z╖▓-Ъы╥еKJП}¤ї╫JП∙rеgт?╥WыЇJ; {╗GГй┴fтJ1e▄─Ўўь]+Ў]╛Бк·єX╡ы(цTьCd╞№ї ╡Q ╪╠ ╡У KШOе░LмP ▄2: ╕pv_╛й║NЧгГkw[-рЯУє┬\т  │/Х_▌`мЇМГЄDз"6╦n7MwuQgQ╚Р}L3°2Ы╖н╢yЗ░╒]ёy╧▀D^M&п▐ВЧ▐HG╚╪┼╠еUlЁКЇz5╜ХK░K1нtо┌╕вЄ|¤оЧя~·O@<*╝~шgX4uo_вN╧ LЪ+==х2:Х─Ч3ЖЧЧ\цe╫ю▌╟ж#g▒мП'2Я╞S■╟W Р∙d∙!~¤N Ў^lЄЖ╬╓n{И╖╜CА9┼#ФїжA:4ьJzИZ╣":═4║р┤╢и╘КPwЧВ+ўЮhъDLF5№F╠'Adc@bI! Cb>D■Ю3\ ┼чЫПЧ▐┤√┐x╠√Ы+╡9╦▒░м)Ы*СZ╣5uї*┤\N╤_4OjЕG:3DLEуnГ@l-Ю6kЧ┴╒въИ№╩Э╞╙ьT¤вWив+ ЦВEUЗTШ┬НЯlфO¤YЮЭЬв=∙6B├▀╞2╘SQs05│BхД╟я\qзU}МP▓БАд╪I╙,CzEмЁ0╗╝E╒|¤~╖xгк;~Q╠*╦ячу▌ї{╤╓╖~єЄв═Zhlе ^ф2ОNA°┬ї╕┌╓╩dc( 5GЗкCkвЎжФ4Щn├PgпC┬░▒%╢34┐╝ceюlfод░╪f"Фj<0l!┴╘■ БI.=дЕД╧f╧d(мД?л¤Лм№; t6I<ЖЩ[>`8экПQ$@cьвп$┐d█аЧТ&╜╫IJ╒ ╝ЎЄm╝Єnй·ЖL%ФPД■сK░d╙ч▐0s?·+р Lющэg▒мъ╤л:йPнbОЕU▐ЧJp╦ў.Ч╚vЗрЁТД▌Tvў}Л╙{╛ь╨)</▀(NуD┐н─Р╚СUsv▀╒}ь!K}лйEеd!hl*Втє╒Ч╦ШL╝<-[П]AлгЫV╪Л╕h╕и+2╙N╞3@╬╓бIw+&ь █┘э║'_·:gЬNлfеl▒rХює┘╟Ы:0╗°s№эф╡x */ /* Subject: [ESS] Another indentation error */ /* To: "ess-help@r-project.org" */ /* Date: Tue, 26 Mar 2013 14:33:22 -0400 (5 minutes, 16 seconds ago) */ /* X-Boundary: ________________________________________________________________________________________________________________________________________________________________________________________________________ */ /* So I have another indentation error with ess and emacs that I have run into. For the example below: */ data example; merge lib.data lib.data2 %if val=ue %then %do; lib.data3 %end; ; by var; /* The last line produces an error if I hit tab or if I try to indent that */ /* region. Emacs produces the error */ /* "invalid search bound (wrong side of point)". The code itself is valid and runs */ /* in sas proper. Is this just me or is this a reproducible error? */ ess/etc/ess-rutils-help-start.R0000664000175000017500000000107712423756516015035 0ustar eddedd## Hacked help.start() to use with ess-rutils.el .rutils.help.start <- function (update=FALSE, remote=NULL) { home <- if (is.null(remote)) { if (tools:::httpdPort == 0L) tools::startDynamicHelp() if (tools:::httpdPort > 0L) { if (update) make.packages.html() paste("http://127.0.0.1:", tools:::httpdPort, sep="") } else stop(".rutils.help.start() requires the HTTP server to be running", call.=FALSE) } else remote paste(home, "/doc/html/index.html", sep="") } ess/etc/ess-julia.jl0000664000175000017500000000460312613523406012727 0ustar eddeddmodule ESS using Compat function all_help_topics() Base.Help.init_help() ## show all categories for (func, _ ) in Base.Help.MODULE_DICT if !isempty(Base.Help.MODULE_DICT[func]) println() show(func); end end end function help(topic::AbstractString) VERSION >= v"0.4-" ? eval(current_module(), parse("@doc $topic")) : Base.Help.help(topic) end ## modified version of function show(io::IO, m::Method) function fun_args(m::Method) tv, decls, file, line = Base.arg_decl_parts(m) io = STDOUT::IO if !isempty(tv) Base.show_delim_array(io, tv, '{', ',', '}', false) end li = m.func.code e = Base.uncompressed_ast(li) argnames = e.args[1] print(io, "(") print_joined(io, [escape_string(isempty(d[2]) ? d[1] : d[1]*"::"*d[2]) for d in decls], ",", ",") print(io, ")") end VERSION >= v"0.4-" && (Base.function_module(f::Function)=f.env.module) ## modified versionof show(io::IO, mt::MethodTable) function fun_args(f::Function) mt = f.env mod = Base.function_module(f) if mod == Main mod = "nil" end print("(list \"$mod\" nil '(") d = mt.defs while d != nothing && d != () print("\"") ## method fun_args(d) print("\" ") d = d.next end print("))") end function fun_args(s::ASCIIString) try m = eval(current_module(), parse(s)) if typeof(m) != ASCIIString fun_args(m) end catch print("(list nil nil nil)") end end function fun_args(t::DataType) print("(list nil nil '(") for d = fieldnames(t) print("\"$d\" ") end print("))") end ### OBJECT COMPLETION function components(m::Module) for v in sort(names(m)) s = string(v) if isdefined(m,v) println(rpad(s, 30), summary(eval(m,v))) end end end function components(t::DataType) for v in sort(fieldnames(t)) println(rpad(string(v), 30), "field") end end function components(v) t = typeof(v) if isa(t, DataType) return components(t) end end ### MISC function main_modules() mainmod = current_module() for nm in names(mainmod) if isdefined(mainmod, nm) mod = eval(mainmod, nm) if isa(mod, Module) print("\"$nm\" ") end end end end end ess/etc/Makefile0000664000175000017500000000375312632537307012157 0ustar eddedd### Makefile - for scripts and icons (./etc) of ESS distribution. ### ## Before making changes here, please take a look at Makeconf include ../Makeconf # In ../Makefile we already construct the ESSR-VERSION file : # ESSR_VERSION = $(shell cat ESSR-VERSION) #ETCFILES = $(wildcard BACKBUG[S5].BAT backbug[s5] *.S sas-keys.*) #ETCFILES = ESSR.R ess-developer.R SVN-REVISION *.S sas-keys.* ess-sas-sh-command ETCFILES_1 = *.S sas-keys.* ess-sas-sh-command *.jl isRELEASE=$(shell test -f .IS.RELEASE && echo 'yes') ifeq ($(isRELEASE),yes) ETCFILES = .IS.RELEASE git-ref $(ETCFILES_1) else ETCFILES = $(ETCFILES_1) endif #ICONS = $(wildcard icons/*.xpm) ICONS = icons/*.xpm ESSR_UTIL_FILES = ESSR/LOADREMOTE ESSR/VERSION ESSR_CODE_FILES = ESSR/R/*.R ESSR/R/.*.R # ESSR_tarball = ESSR_$(ESSR_VERSION).tar.gz all: #ESSR-VERSION $(ESSR_tarball) library/ESSR show-etc: @echo $(ETCFILES) ls -l $(ETCFILES) ## happens "above" as it is need also in ../lisp/ : # ESSR-VERSION: $(ESSR_FILES) # (cd .. ; make etc/ESSR-VERSION) # $(ESSR_tarball): $(ESSR_FILES) # R CMD build ESSR # library/ESSR: $(ESSR_tarball) # R CMD INSTALL -l library ESSR # rel: $(ESSR_tarball) # [ x$$USER = xmaechler ] || (echo 'must be maechler'; exit 1 ) # $(INSTALL) $(ESSR_tarball) $(UPLOAD_DIR)/pkgs/src/contrib install : $(INSTALLDIR) $(ETCDIR)/icons $(INSTALLDIR) $(ETCDIR)/ESSR/R $(INSTALL) $(ETCFILES) $(ETCDIR) $(INSTALL) $(ICONS) $(ETCDIR)/icons $(INSTALL) $(ESSR_UTIL_FILES) $(ETCDIR)/ESSR $(INSTALL) $(ESSR_CODE_FILES) $(ETCDIR)/ESSR/R chmod +x $(ETCDIR)/ess-sas-sh-command uninstall : -cd $(ETCDIR) && $(UNINSTALL) $(ETCFILES) -cd $(ETCDIR) && $(UNINSTALL) $(ICONS) -cd $(ETCDIR) && $(UNINSTALL) $(ESSR_UTIL_FILES) -cd $(ETCDIR) && $(UNINSTALL) $(ESSR_CODE_FILES) ## 'clean' shall remove *exactly* those things that are *not* in version control clean: rm -rf SVN-REVISION ## 'distclean' removes also things in VC (svn, when they are remade by "make"): # distclean: clean # rm -rf ESSR_*.tar.gz ess/install-sh0000664000175000017500000001124312423756516011741 0ustar eddedd#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" tranformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 ess/rsn.txt0000664000175000017500000002340412423756516011305 0ustar eddedd ESS User Poll Tally Stat package used with ESS R 44 SAS 7 JAGS 6 Stata 5 Splus 4 BUGS 1 Other 1 Sage? emacs used with ESS GNU Emacs 43 XEmacs 3 Aquamacs 2 Other 0 OS used with ESS Linux 38 Windows 23 Mac OS X 9 Solaris 3 Other 1 Cygwin Feature Requests Kevin Wright: I want to change the background color of code chunks in noweb buffers. Erik Iverson: I think ESS is very feature complete at this point. The only thing I've looked at that seems interesting is some sort of 'intellisense' feature that uses R's built-in completion mechanism to temporarily display available completions using something like company-mode, autocomplete, or completion-ui. I had at one point something that almost worked, but I believe the library it was built in, company-mode, has now changed significantly. Another separate point is that the manual could be slightly updated to keep up with current features. For example, the main evaluation command in R buffers, C-c C-c, is not documented. A great feature for showing R function arguments when the '(' key is pressed only shows up in the Changelog, and is claimed to be on be default (ess-r-args-electric-paren), when that no longer seems to be the case. Simple features like this can draw users to ESS who might not know why it is useful to them otherwise. Josh Wiley: This may be windows centric, but it would be minorly convenient if options("width") in R was paired with the size of the window in Emacs. Brendan Halpin: Clearer documentation - what I know how to do I found out often by trial and error, and the mailing list. Bill Venables: Better default customisation of iESS - nothing that can't be fixed with a hook, though. Felix Andrews: ESS eval seems to be very slow: when I do C-c C-b it takes a very long time and there is no visual indication that anything is happening (it says "Starting evaluation..."). I know this can be avoided using ess-eval-visibly-p but it would often be helpful to see the code echoed as well. Kjetil Halvorsen: A good cheatsheet to print and put on the wall. Andreas Kiermeier: When writing code using lattice (e.g. xyplot) and I have a panel function, then C-c C-c when pressed inside the panel function only submits the panel function rather than the whole plotting expression. I would love if this could be extended (same goes for apply functions and probably others) to cover the whole expression (or even 'paragraph') rather than just the panel function. Gray Calhoun: I'd like to be able to direct graphical output to a buffer, have graphics with multiple pages sent to multiple buffers, and have multiple graphics open at a time. Ista Zahn: Function/variable completion in script files (maybe this already is supposed to work, but for me completion only works in interactive sessions). Gerhard Schon: For consulting, I need to use SPSS 18. It would be nice, to interact with SPSS 18. Derek Eder: Easier configuration! "font lock" and "visible execution" are 2 features which I always have trouble turning off (on multiple machines) because I can never remember where they are in the configuration menus. Paul Hewson: Object browser (e.g. open another frame listing variable names of a dataframe) Deepayan Sarkar: Not have R output be fontified as if it were R code. David Carslaw: The one feature I really miss is the showing of function arguments in the R buffer. I think I saw an explanation for why this is not made available as "the source is real" paradigm. However, showing the function options in the R buffer in my view would be very useful and not take anything away from the "source is real" approach. The simple reason is it is difficult to remember what the options are! It's very useful when writing the scripts - where it is available. RKward does this too and it's useful. Gerald Jean: Having function arguments show up in the mini-buffer UNTIL the closing parenthesis is typed. By the way, in R it shows up briefly, but not at all in Splus; would be great to have it for all "S" variants. Charles Berry: Handle \Sexpr{}'s in Sweave code. How 'about ess-eval-sexpr Tangle the current contents of \Sexpr{ } and send it to the inferior ESS process. ess-eval-sexprs-in-region Tangle the contents of \Sexpr{ }'s in region and send them to the inferior ESS process. (Maybe even open a *Sexpr* buffer (say) and place the region contents in that buffer with the \Sexpr{}'s replaced by their printed results.) More than a few times, I have had Sweave terminate with an error or deliver unreadable results because of a silly error in an \Sexpr. Sven Hartenstein: I am sometimes annoyed by emacs "popup" windows, e.g. after expanding some string or when a R help buffer was opened. My request would be a simple key binding that - whatever the current window layout and active buffers are - gives me my two pane view with the latest *.R file as the active buffer in the upper 3/4 of the frame and the R process the other 1/4 of the frame. Francois Pepin: I haven't looked recently to see how hard this currently is, but I often run R on another linux machine through ssh and screen. I would love it if there was an easy way to connect ESS to the other R instance more or less seamlessly. Last time I looked, the proposed solutions seemed to be a bit clunky. Patrick Connolly and Emanuel Heitlinger: A clever way of dealing with the unbalanced quotes (to R's way of thinking) that can be returned to Emacs from a bash call. The ` character screws up the font colouring. Can't imagine how it could be done, and I realize it's really a bash issue, but I'd be very grateful if someone could work out a way of dealing with it. I invariably see colours as though it's all a string irrespective of function names or anything else. Brian Diggs: Interactive integration with SAS on Windows. I realize this is a problem with SAS, not ESS, though. Tengfei Yin: I would say, supporting more with Rsweave, especially some convenient key binding. That may require more work with AUCTeX guys, I don't know. It will be wonderful if I can just press Ctrl-C C, Rnw --> Latex->pdf viewer, and all the error messages could show up and I don't have to open another TeX file and click Ctrl-C C to see the output Keith Ponting: (Vaguely related to other comments about font locking, which I second, but probably an issue for two-mode-mode rather than for ESS) I use Sweave a lot with emacs two-mode-mode. When in an ESS block (for which I use \begin{Scode}...\end{Scode}) the font locking is often corrupted by characters in the rest of the file. It appears that the two modes are not completely isolated, so that an unbalanced $ in an ESS block will cause the LaTeX sections to be treated as in math mode, conversely unbalanced ' in the LaTeX sections causes the ESS sections to be treated as strings. There is a work-around - adding the balancing symbol as a comment in the appropriate language, but it does take a bit of finding sometimes. Jeff Arnold: I would like to see closer integration with CEDET (http://cedet.sourceforge.net/); adding the ESS languages to CEDET would open up a lot of development environment tools without reinventing the wheel. This would require writing a grammar for the parser for each language, but external parsers like etags/ctags can be used to bootstrap language support. I also find the fact that ESS includes several unrelated languages to be confusing. From what I have seen of the code, there doesn't appear to much shared code between the S/R, SAS, Stata, and BUGS/JAGS parts of ESS. I found this confusing both as a user and as a contributor, primarily because sometimes it is not immediately clear whether an ess-* function is generic to all the languages, or just a S/R related function. Refactoring the ESS package into four major modes (S, SAS, Stata, and BUGS) released by the ESS project would seem to make for a cleaner code base. Consistency among the major modes could still be enforced through conventions for the functions and key-bindings included in a major mode. John Maindonald: A GUI interface to commonly used commands, organised structured a/c the general nature of the command. There are a few Emacs commands that should also be noted, in a separate category. You might want to take a poll on which are the commands that get used, or would be used if one could remember them: 5F p n ; (with region selected) \ and x 1 r x ess-rdired x occur << RET (lines with <<) -x ess-font-lock- Commands for creating & handling transcript files: X Don MacQueen: An option to send R output to a separate window, with the commands that caused the output echoed before the output. Ross Boylan: I wish that ?foo, where foo is a non-existent command, didn't leave a *help[R](foo)* buffer lying around. ACTUALLY, IT HAS ALREADY BEEN IMPLEMENTED: JUST CUSTOMISE ess-help-kill-bogus-buffers TO t (thanks to Sam Steingold) t IS NOW THE DEFAULT IN ESS 12.03 (Rodney) Johan Sandblom: Some manner of font-lock integration with AUCTeX (I use mmm-mode) though I realize that may be more a matter for AUCTeX. Rasmus Pank: Improvements of AUCTeX integration. Sometimes results are weird. Compilation works poorly. It would be nice to easily specify new compilers to use for example pgfsweave. Mathieu Basille: Integration of Rubber as I said earlier! But I would definitely second Rasmus request of integration with AUCTeX. As I use mostly R in Sweave docs, I'd like to be able to use C-c C-c to compile, as I'm used to do for LateX documents. Well, of course it would go in two passes instead of one: 1) with Sweave, 2) with Rubber. ess/lisp/0000775000175000017500000000000012632537307010703 5ustar eddeddess/lisp/ess-custom.el0000664000175000017500000032654112632537307013342 0ustar eddedd;;; ess-custom.el --- Customize variables for ESS ;; Copyright (C) 1997--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2015 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: A.J. Rossini ;; Created: 05 June 2000 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: (require 'custom) (require 'executable) (require 'font-lock) ;; Customization Groups (defgroup ess nil "ESS: Emacs Speaks Statistics." :group 'local) (defgroup ess-edit nil "ESS: editing behavior, including coments/indentation." :group 'ess :prefix "ess-") (defgroup ess-proc nil "ESS: process control." :group 'ess :prefix "ess-") (defgroup ess-command nil "ESS: Commands for various things." :group 'ess :prefix "ess-") (defgroup ess-help nil "ESS: help functions." :group 'ess :prefix "ess-") (defgroup ess-hooks nil "ESS: hooks for customization." :group 'ess :prefix "ess-") (defgroup ess-S nil "ESS: S Languages." :group 'ess :prefix "ess-") (defgroup ess-origS nil "ESS: Original S Dialect from Bell Labs/AT&T." :group 'ess-S :prefix "ess-") (defgroup ess-SPLUS nil "ESS: S-PLUS Dialect of S." :group 'ess-S :prefix "ess-") (defgroup ess-R nil "ESS: R Dialect of S." :group 'ess-S :prefix "ess-") (defgroup ess-Julia nil "ESS: Julia." :group 'ess :prefix "julia-") (defgroup ess-sas nil "ESS: SAS." :group 'ess :prefix "ess-") (defgroup ess-Stata nil "ESS: Stata." :group 'ess :prefix "ess-") (defgroup ess-XLS nil "ESS: XLispStat." :group 'ess :prefix "ess-") (defgroup ess-OMG nil "ESS: Omegahat." :group 'ess :prefix "ess-") (defgroup ess-mouse nil ;; FIXME: this is not used yet <--> ./ess-mous.el "ESS: Mouse." :group 'ess :prefix "ess-") (defgroup ess-roxy nil "Mode for editing in-code Roxygen documentation." :group 'ess :group 'convenience :group 'ess-extras :prefix "ess-" ;; << -- added for ESS integration FIXME?? :group 'tools) (defgroup ess-sweave nil "Mode for editing Sweave (*.[SR]nw) files." :group 'ess-S :prefix "ess-") (defgroup ess-extras nil "Extra utilities for ESS" :group 'ess :prefix "ess-") ;; Variables (not user-changeable) (defvar ess-version "15.09-2" ;; updated by 'make' "Version of ESS currently loaded.") (defvar ess-revision nil ;; set "The subversion revision and date of ESS. Is set by \\[ess-version-string].") (defvar no-doc "This function is part of ESS, but has not yet been loaded. Full documentation will be available after autoloading the function." "Documentation for autoload functions.") ; User changeable variables ;;; Common user changeable variable are described and documented in ;;; ess-site.el. Please check there first! ;;;===================================================== ;;; In general: Variables with document strings starting with a * are ;;; the ones you can generally change safely, and may have to upon ;;; occasion. ;;*;; Options and Initialization ;; Menus and pulldowns. (defcustom ess-funcmenu-use-p (fboundp 'func-menu) "Non-nil means use func-menu." :group 'ess :type 'boolean) (defcustom ess-speedbar-use-p (fboundp 'speedbar) "Non-nil means use speedbar." :group 'ess :type 'boolean) (defcustom ess-imenu-use-p (fboundp 'imenu) "Non-nil means use imenu facility. This value can be overridden by mode-specific variables, such as `ess-imenu-use-S'." :group 'ess :type 'boolean) (defcustom ess-imenu-use-S ess-imenu-use-p "*Non-nil means include an Imenu menu item in S buffers." :group 'ess :type 'boolean) (defvar ess-imenu-generic-expression nil "Placeholder for imenu-generic-expression. Dialect specific.") ;; (defcustom ess-handy-commands '(("change-directory" . ess-change-directory) ("install.packages" . ess-install.packages) ("library" . ess-library) ("objects[ls]" . ess-execute-objects) ("help-apropos" . ess-display-help-apropos) ("help-index" . ess-display-package-index) ("help-object" . ess-display-help-on-object) ("search" . ess-execute-search) ("set-width" . ess-execute-screen-options) ("setRepos" . ess-setRepositories) ("sos" . ess-sos) ("vignettes" . ess-display-vignettes) ) "An alist of custom ESS commands available for call by `ess-handy-commands' and `ess-smart-comma' function." :group 'ess :type (if (featurep 'emacs) 'alist 'list)) (defvar ess--local-handy-commands nil "Store handy commands locally") (make-variable-buffer-local 'ess--local-handy-commands) (defcustom ess-describe-at-point-method nil "Whehter `ess-describe-object-at-point' should use a tooltip. If nil display in an electric buffer. If 'tooltip display in a tooltip. See also `tooltip-hide-delay' and `tooltip-delay'. " :group 'ess-utils :type '(choice (const :tag "buffer" :value nil ) (const tooltip)) ) (defcustom ess-R-describe-object-at-point-commands '(("str(%s)") ("htsummary(%s, hlength = 20, tlength = 20)") ("summary(%s, maxsum = 20)")) "A list of commands cycled by `ess-describe-object-at-point'. %s is substituted with the name at point. The value of each element is nil and is not used in current implementation." :group 'R :type 'alist) (defcustom ess-S-describe-object-at-point-commands ess-R-describe-object-at-point-commands "An alist of commands cycled by `ess-describe-object-at-point'. %s is substitute with the name at point. The value is not used as yet." :group 'S+ :type 'alist) (defcustom ess-can-eval-in-background nil "If non-nil ESS can perform caching and other background activities by calling the subprocess on idle time.") (defcustom ess-user-full-name (user-full-name) "The full name of the user." :group 'ess :type 'string) (defcustom ess-blink-region t "If t evaluated region is highlighted for a shortwhile. See also `ess-blink-delay'" :group 'ess :type 'boolean) (defcustom ess-blink-delay .3 "Number of seconds to highlight the evaluated region." :group 'ess :type 'number) (defcustom ess-ask-for-ess-directory t "Non-nil means request the process directory each time S is run." :group 'ess :type 'boolean) (defcustom ess-ask-about-transfile nil "Non-nil means ask about a transcript file before running ESS." :group 'ess :type 'boolean) (defcustom ess-display-buffer-reuse-frames t "Non-nil means \\[display-buffer] reuses existing frames; see `display-buffer-reuse-frames'." :group 'ess :type 'boolean) (defvar ess-language nil "Prefix of all ESS processes, and defines the dialect in use. Currently acceptable values are `S', `XLS', `SAS'. Can be changed, e.g., to `R'. Use `setq-default' if setting it in .emacs (also see ess-site.el).") ;; :group 'ess ;; :type '(choice (const :tag "Initial" :value nil) ;; (const :tag "S" :value "S") ;; (const :tag "XLS" :value "XLS") ;; (const :tag "SAS" :value "SAS") ;; (const :tag "R" :value "R"))) (make-variable-buffer-local 'ess-language) (defvar ess-dialect nil "String version of the dialect being run for the inferior process. This, plus `ess-language', should be able to determine the exact version of the statistical package being executed in the particular buffer. Current values could include: for `ess-dialect' = S3, S4, Sp3, Sp4, Sp5, S+, R, XLS, SAS, Stata, Julia Used to adjust for changes in versions of the program.") (make-variable-buffer-local 'ess-dialect) ;;(setq-default ess-dialect "Initial-dialect") (setq-default ess-dialect nil) ;;; SJE -- why use "Initial-dialect"? If we use nil, it matches "None" ;;; in the custom choice. ;; (defcustom ess-etc-directory ;; (expand-file-name (concat ess-lisp-directory "/../etc/")) ;; "*Location of the ESS etc/ directory. ;; The ESS etc directory stores various auxillary files that are useful ;; for ESS, such as icons." ;; :group 'ess ;; :type 'directory) (defcustom ess-directory-function nil "Function to return the directory that ESS is run from. If nil or if the function returns nil then you get `ess-directory'." :group 'ess :type '(choice (const nil) function)) (defcustom ess-setup-directory-function nil "Function to setup the directory that ESS is run from. This function can be called to set environment variables or to create a workspace." :group 'ess :type '(choice (const nil) function)) (defcustom ess-directory nil "The directory ESS is run from. It must end in a slash. Provided as a default if `ess-ask-for-ess-directory' is non-nil. A nil value means use the current buffer's default directory." :group 'ess :type '(choice (const nil) directory)) (defcustom ess-history-directory nil "Directory to pick up `ess-history-file' from. If this is nil, the history file is relative to `ess-directory'." :group 'ess :type '(choice (const nil) directory)) (defcustom ess-history-file t "File to pick up history from. nil means *no* history is read or written. t means something like \".Rhistory\". If this is a relative file name, it is relative to `ess-history-directory'. Consequently, if that is set explicitly, you will have one history file for all projects." :group 'ess :type '(choice (const :tag "Off" nil) (const :tag "On" t) file)) (defcustom ess-plain-first-buffername t "No fancy process buffname for the first process of each type (novice mode)." :group 'ess :type 'boolean) (defcustom ess-use-inferior-program-name-in-buffer-name nil "For R, use e.g., 'R-2.1.0' or 'R-devel' (the program name) for buffer name. Avoids the plain dialect name." :group 'ess :type 'boolean) (defcustom ess-use-ido t "If t ess will try to use ido completion whenever possible. By default ESS uses enables IDO flex matching. See `ido-enable-flex-matching' for details on flex matching and `ess-ido-flex-matching' on how to disable it for ESS, if you don't want it. Some useful keys for IDO completion: - C-s (next) or C-r (previous) to move through the list. - C-SPC to restrict the list to currently matched items. - TAB to display possible completion in a buffer - C-t `ido-toggle-regexp' " :group 'ess :type 'boolean) (defcustom ess-tab-complete-in-script nil "If non-nil, TAB in script buffers tries to complete if there is nothing to indent. See also `ess-first-tab-never-complete'.") (defcustom ess-first-tab-never-complete 'symbol "If t, first TAB never tries to complete in ess-mode. If 'symbol first TAB doesn't try to complete if next char is a valid symbol constituent. If 'symbol-or-paren don't complete if next char is closed paren )}] or symbol character. If 'symbol-or-paren-or-punct don't complete if next char is punctuation +-=% etc, or closed paren or symbol. If 'unless-eol - first TAB completes only at end of line. If nil first TAB always tries to complete (this might be too aggressive and dangerous). " :group 'ess :type '(choice (const nil) (const symbol) (const symbol-or-paren) (const symbol-or-paren-or-punct) (const unless-eol) (const t))) (defvaralias 'ess-first-tab-never-completes-p 'ess-first-tab-never-complete) (defcustom ess-use-eldoc t "If t, activate eldoc in ess-mode and inferior-ess-mode buffers. If 'script-only activate in ess-mode buffers only. See also `ess-eldoc-show-on-symbol'." :group 'ess-extras :type '(choice (const t) (const script-only) (const nil))) (defcustom ess-eldoc-show-on-symbol nil "If non-nil, show help string whenever the point is on a symbol. If nil show only when the point is in a function call, i.e. after (." :group 'ess-extras :type 'boolean) (defcustom ess-eldoc-abbreviation-style 'normal "How ess-eldoc string should be abbreviated when it doesn't fit into one line A symbol which can be nil: do nothing mild: Replace TRUE, FALSE with T,F normal: Try mild + shorten the default values longer than 10 characters. strong: Try normal + completely remove default values except =F,=T,=d where d is a digit. aggressive (or t): Try strong + truncate the doc string to fit into minibuffer. The default style is 'normal. Ess-eldoc also honors the value of `eldoc-echo-area-use-multiline-p'. If this variable is not t (the default), doc strings are truncated to fit into minibufer. This allows the use of different abbreviation styles with the truncation." :group 'ess :type '(choice (const nil) (const mild) (const normal) (const strong) (const aggressive) (const t))) (defcustom ess-use-auto-complete t "If t, activate auto-complete support in ess-mode and inferior-ess-mode buffers. If 'script-only activate in ess-mode buffers only. If non-nil add `ac-source-R' and `ac-source-filename' to the `ac-sources' buffer local variable. ESS defines three AC sources `ac-source-R',`ac-source-R-objects' and `ac-source-R-args'. See auto-complete package documentation (http://cx4a.org/software/auto-complete/) for how to install your custom sources." :group 'ess-extras :type '(choice (const t) (const script-only) (const nil))) (defcustom ess-use-company t "If t, activate company support in ess-mode and inferior-ess-mode buffers. If non-nil add `company-R-args' and `company-R-objects' to the `company-backends'. If 'script-only activate in ess-mode buffers only." :group 'ess-extras :type '(choice (const t) (const script-only) (const nil))) (defcustom ess-company-arg-prefix-length nil "Minimum prefix for ess company function argument completion." :group 'ess-extras :type '(choice (const :tag "Default" nil) integer)) (defcustom ess-use-tracebug t "If t, load ess-tracebug when R process starts." :group 'ess-extras :type 'boolean) (defcustom ess-ido-flex-matching t "If t, ido for ESS completion uses flex matching. See `ido-enable-flex-matching' for details. If you have an old computer, or you load lot of packages, you might want to set this to nil. " :group 'ess :type 'boolean) (defvar ess-ac-sources nil "Dialect specific, ESS specific list of ac-sources") (defvar ess-company-backends nil "Dialect specific, ESS specific list of `company-backends'") (defvar ess--completing-hist nil "Variable to store completion history. Used by `ess-completion-read' command.") (defvar ess-smart-operators () "List of smart operators to be used in ESS and IESS modes. Not to be set by users. It is redefined by mode specific settings, such as `ess-R-smart-operators'.") (make-variable-buffer-local 'ess-smart-operators) (defvar ess-R-smart-operators nil "If nil, don't use any of smart operators. If t, use all. If an axplicit list of operators, use only those operators. In current verion of ESS, it controls the behavior of ess-smart-comma only, but will be enriched in the near future.") (defvar ess-no-skip-regexp "[ \t\n]*\\'" "If `ess-next-code-line' sees this line, it doesn't jump over. Used to avoid annoying jumping by ess-eval.*-and-step to end of buffer or end chunks etc.") (defcustom ess-S-assign " <- " "String used for left assignment in all S dialects. Used by \\[ess-smart-S-assign]." :group 'ess-S :type 'string) (defcustom ess-smart-S-assign-key "_" "Key used by `ess-smart-S-assign'. By default bound to underscore, but can be set to any key. If this key is customized, you must add (ess-toggle-S-assign nil) (ess-toggle-S-assign nil) after the line that sets the customization and evaluate these lines or reboot emacs. The first call clears the default `ess-smart-S-assign' assignment and the second line re-assigns it to the customized setting. " :group 'ess-S :type 'character) ;;*;; Variables concerning editing behaviour (defcustom ess-filenames-map t "Declares if the filenames in an attached directory are the same as objects in that directory (when t). This is not true for DOS and other OS's with limited filename lengths. Even if this is set incorrectly, the right things will probably still happen, however." :group 'ess-edit :type 'boolean) ;;; SJE -- this is set in ess-site.el to be "always", so I changed ;;; value t to be "always", so that ess-site.el does not need editing. ;;; However, this is a bit messy, and would be nicer if ess-site.el ;;; value was t rather than "always". (defcustom ess-keep-dump-files 'ask "Variable controlling whether to delete dump files after a successful load. If nil: always delete. If `ask', confirm to delete. If `check', confirm to delete, except for files created with ess-dump-object-into-edit-buffer. Anything else, never delete. This variable only affects the behaviour of `ess-load-file'. Dump files are never deleted if an error occurs during the load. " :group 'ess-edit :type '(choice (const :tag "Check" :value 'check) (const :tag "Ask" :value 'ask) (const :tag "Always keep" :value "always") (const :tag "Always delete" :value nil) )) (defcustom ess-delete-dump-files nil "Non-nil means delete dump files after they are created. This applies to dump files created with `ess-dump-object-into-edit-buffer', only. Boolean flag which determines what to do with the dump files generated by \\[ess-dump-object-into-edit-buffer], as follows: If non-nil: dump files are deleted after each use, and so appear only transiently. The one exception to this is when a loading error occurs, in which case the file is retained until the error is corrected and the file re-loaded. If nil: dump files are not deleted, and backups are kept as usual. This provides a simple method for keeping an archive of S functions in text-file form. Auto-save is always enabled in dump-file buffers to enable recovery from crashes. This is useful to prevent source files being created for objects you don't actually modify. Once the buffer is modified and saved however, the file is not subsequently deleted unless `ess-keep-dump-files' is nil, and the file is successfully loaded back into S." :group 'ess-edit :type 'boolean) (defcustom ess-fill-calls t "If non-nil, refilling a paragraph inside a function or indexing call will arrange the arguments according to `fill-column' as in: fun_call(argument1, argument2, argument3, argument4) Refilling repeatedly cycles through different styles and eventually to the original formatting. The second style formats according to one argument per line: fun_call(argument1, argument2, argument3, argument4) When `ess-fill-calls-newlines' is t, the second style becomes: fun_call( argument1, argument2, argument3, argument4 ) Setting `ess-offset-arguments' to `prev-line' or `prev-call' activates a third style. It keeps one argument per line except for the first N arguments. N is controlled with a prefix. For example, calling M-q three times sets N to 1 while calling M-q twice then C-U 2 M-q sets N to 2. Here what the default produces: fun_call(argument1, argument2, argument3, argument4, argument5 ) This style is useful for refilling R6 or ggproto class definitions. The blinking of the refilled region can be disabled with `ess-blink-refilling'." :group 'ess-edit :type 'boolean) (defcustom ess-fill-continuations t "If non-nil, refilling a paragraph inside a continuation of statements (expressions separated by operators) will arrange all its elements, never going past `fill-column'. lm(outcome ~ pred1 + pred2 + pred3 + pred4, data) Refilling repeatedly cycles through different styles and eventually to the original formatting. The second style lay out the statements according to one expression per line: lm(outcome ~ pred1 + pred2 + pred3 + pred4, data) The blinking of the refilled region can be disabled with `ess-blink-refilling'." :group 'ess-edit :type 'boolean) (defcustom ess-fill-calls-newlines nil "When non-nil, the second refilling style produces newlines after and before the opening and closing delimiters. This is intended for example for dplyr-style code: fun_call( argument1, argument2, argument3, argument4 ) Note that this setting is temporary and likely to be replaced in the next ESS version by a more comprehensive and flexible way to set refill styles." :group 'ess-edit :type 'boolean) (defcustom ess-blink-refilling t "When non-nil, refilling a call or a continuation will first blink the filling region." :group 'ess-edit :type 'boolean) ;;; From ess-mode: (defcustom ess-mode-silently-save t "Non-nil means automatically save ESS source buffers before loading." :group 'ess-edit :type 'boolean) ;;*;; Variables controlling editing ;;;*;;; Edit buffer processing (defcustom ess-function-template " <- function( )\n{\n\n}\n" "If non-nil, function template used when editing nonexistent objects. The edit buffer will contain the object name in quotes, followed by this string. Point will be placed after the first parenthesis or bracket." :group 'ess-edit :type 'string) ;;; By K.Shibayama 5.14.1992 ;;; Setting any of the following variables in your .emacs is equivalent ;;; to modifying the DEFAULT style. ;;;*;;; Indentation parameters (defcustom ess-auto-newline nil "Non-nil means automatically newline before and after braces inserted in S code." :type 'boolean :group 'ess-edit) (defcustom ess-tab-always-indent t "Non-nil means TAB in S mode should always reindent the current line, regardless of where in the line point is when the TAB command is used." :type 'boolean :group 'ess-edit) (defvar ess-indent-line-function nil "Function to be used for the current dialect nil means to use R/S indentation.") (make-variable-buffer-local 'ess-indent-line-function) (defvar ess-indent-offset 2 "Main indentation offset that is commonly inherited by other offsets. See `ess-style-alist' for all available offsets.") (define-obsolete-variable-alias 'ess-indent-level 'ess-indent-offset "15.09") (defvar ess-offset-arguments 'open-delim "Indent for arguments of function calls or indexing brackets. This variables has an effect only when the ( or [ are not directly followed by a new line. See `ess-offset-arguments-newline' for indentation after closing newline. When set to `open-delim', arguments are indented relative to the opening parenthesis of the closest function call: object <- call(argument, other_call(argument, other_argument)) When set to `prev-call', arguments are indented relative to the closest function call: object <- call(argument, other_call(argument, other_argument)) When set to `prev-line', arguments are indented relative to the preceding line: object <- call(argument, other_call(argument, other_argument)) This setting can also be set to a list containing the the offset type and the offset size, such as `'(prev-call 2)'. Otherwise, `ess-indent-offset' is used as a default. See `ess-style-alist' for other offsets controlling indentation.") (defvar ess-offset-arguments-newline 'prev-call "Indent of arguments when ( or [ is followed by a new line. When set to `open-delim', arguments on a new line are indented relative to the opening parenthesis of the closest function call: object <- call(argument, other_call( argument, other_argument )) Wnen set to `prev-call', arguments on a new line are indented relative to the closest function call: object <- call(argument, other_call( argument, other_argument )) You can control the details of indentation at `prev-call' with `ess-indent-from-lhs' and `ess-indent-from-chain-start'. When set to `prev-line', arguments on a new line are indented relative to the preceding line: object <- call(argument, other_call( argument, other_argument )) This setting can also be set to a list containing the the offset type and the offset size, such as `'(prev-call 2)'. Otherwise, `ess-indent-offset' is used as a default. See `ess-style-alist' for other offsets controlling indentation.") (defvar ess-offset-block 'prev-line "Indentation for blocks. A block is usually declared with braces but a statement wrapped in anonymous parentheses is also considered a block. This offset can be either `prev-call', `prev-line' or `open-delim'. When set to `open-delim', blocks are indented relative to the opening parenthesis of the closest function call: call(argument, other_call(parameter = { stuff }, { stuff })) call(argument, lapply(data, function(x) { body })) When set to `prev-call', blocks are indented relative to the closest function call: call(argument, other_call(parameter = { stuff }, { stuff })) call(argument, lapply(data, function(x) { body })) You can control the details of indentation at `prev-call' with `ess-indent-from-lhs' and `ess-indent-from-chain-start'. When set to `prev-line', blocks are indented relative to the preceding line: call(argument, other_call(parameter = { stuff }, { stuff })) call(argument, lapply(data, function(x) { body })) This setting can also be set to a list containing the the offset type and the offset size, such as `'(prev-call 2)'. Otherwise, `ess-indent-offset' is used as a default. See `ess-style-alist' for other offsets controlling indentation.") (defvar ess-offset-continued 'straight "This setting controls indentation of continued statements, that is, consecutive statements separated by operators. When set to 'straight, continued statements are indented as follows: object %>% some_function() %>% other_function() When set to 'cascade: object %>% some_function() %>% other_function() The 'straight and 'cascade settings are actually equivalent to '(straight . t) and '(cascade . t), where `t' represents the base indent size. More generally, you can supply '(straight . N) to control the size of indentation. See `ess-style-alist' for for an overview of ESS indentation.") (defvar ess-align-nested-calls '("ifelse") "List of strings declaring function calls for which `ess-offset-arguments-newline' should be ignored. These calls will be vertically aligned instead. The default is `ifelse', resulting in the following indentation for nested ifelse calls: object <- ifelse(condition1, out1, ifelse(condition2, out2, out3)) See `ess-style-alist' for for an overview of ESS indentation.") (defvar ess-align-arguments-in-calls '("function[ \t]*(") "List of regexes specifying the calls where `ess-offset-arguments' should have no effect on function declarations. The arguments of those calls will be aligned from the opening parenthesis. By default, function declarations are overridden. If for example `ess-offset-arguments' is set to `prev-line', then function calls are normally indented as in: some_function(argument1, argument2, argument3 ) However, the parameters of function declarations will be vertically aligned: fun <- function(argument1, argument2 argument3) { body } See `ess-style-alist' for further details.") (defvar ess-align-continuations-in-calls t "Whether continuations inside calls should be indented from the opening delimiter. This produces the following indentation: 10 + (1 + 2 + 3 + 4) object[variable1 + variable2] if (test1 || test2 || test3 || test4) { any(test5 & test6) } instead of 10 + (1 + 2 + 3 + 4) object[variable1 + variable2] if (test1 || test2 || test3 || test4) { any(test5 & test6) } Definition operators (`<-', `=', `:=' and `~') still trigger an indentation in all cases. Also, operators at top level and in curly brackets are not affected by this setting and always induce an offset: { var1 + var2 } See `ess-style-alist' for for an overview of ESS indentation.") (defvar ess-align-blocks '(control-flow) "List of block types for which `ess-offset-blocks' should be ignored. The overridden blocks are vertically aligned. The list can contain either or both of the symbols `control-flow' and `fun-decl'. With `control-flow', if, else for and while blocks will always be aligned vertically. With `fun-decl', the body of a function declaration will always be aligned with the call to `function'.") (defvar ess-indent-from-lhs '(arguments fun-decl-opening) "List of syntactic elements that should be indented from the left-hand side of an assignment. The list accepts the symbol `arguments' and `fun-decl-opening'. For arguments, this setting only has an effect for offsets set to `prev-call'. When set, this indentation is produced: some_function(parameter = other_function( argument )) object <- some_function( argument1, argument2 ) instead of: some_function(parameter = other_function( argument )) object <- some_function( argument1, argument2 ) `fun-decl-opening' refers to the opening curly following a function declaration. Setting it produces: object <- function(argument) { body } instead of: object <- function(argument) { body } This is useful when (a) you have a long function name and want to break a line after `<-' so that you have room to lay out the arguments within `fill-column' characters; (b) you still want to align the function body from the LHS to save horizontal space. See `ess-style-alist' for for an overview of ESS indentation.") (defvar ess-indent-from-chain-start t "When non-nil, chained calls will be treated as if they were one call and indentation will start from the first one. This setting only has an effect for offsets set to `prev-call' or block offsets set to `opening-delim'. If `nil': some_function(other_function( argument )) If `t': some_function(other_function( argument )) See `ess-style-alist' for for an overview of ESS indentation.") ;;added rmh 2Nov97 at request of Terry Therneau (defcustom ess-indent-with-fancy-comments t "Non-nil means distiguish between #, ##, and ### for indentation. See `ess-style-alist' for for an overview of ESS indentation." :type 'boolean :group 'ess-edit) (define-obsolete-variable-alias 'ess-fancy-comments 'ess-indent-with-fancy-comments "15.09") (define-obsolete-variable-alias 'ess-arg-function-offset 'ess-indent-from-lhs "15.09") (define-obsolete-variable-alias 'ess-arg-function-offset-new-line 'ess-offset-arguments-newline "15.09") (define-obsolete-variable-alias 'ess-first-continued-statement-offset 'ess-offset-continued "15.09") (define-obsolete-variable-alias 'ess-continued-statement-offset 'ess-offset-continued "15.09") ;;;*;;; Editing styles (defvar ess-style-alist `((BSD (ess-indent-offset . 8) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . prev-call) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) (C++ (ess-indent-offset . 4) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . prev-call) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . (arguments)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) ;; CLB added rmh 2Nov97 at request of Terry Therneau (CLB (ess-indent-offset . ,(default-value 'ess-indent-offset)) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . (straight 4)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) (GNU (ess-indent-offset . ,(default-value 'ess-indent-offset)) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . (prev-call 4)) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) (K&R (ess-indent-offset . 5) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . prev-call) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) ;; added ajr 17.Feb'04 to match "common R" use (== DEFAULT apart from offset = 4) (RRR (ess-indent-offset . 4) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) (RRR+ (ess-indent-offset . 4) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . open-delim) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . (arguments)) (ess-indent-from-chain-start . nil) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments))) (RStudio (ess-indent-offset . ,(default-value 'ess-indent-offset)) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . prev-line) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . nil) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . nil) (ess-align-blocks . nil) (ess-indent-from-lhs . (arguments)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . nil)) (RStudio- (ess-indent-offset . ,(default-value 'ess-indent-offset)) (ess-offset-arguments . prev-line) (ess-offset-arguments-newline . prev-line) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . nil) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . nil) (ess-align-blocks . nil) (ess-indent-from-lhs . (arguments)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . nil)) (DEFAULT (ess-indent-offset . ,(default-value 'ess-indent-offset)) (ess-offset-arguments . ,(default-value 'ess-offset-arguments)) (ess-offset-arguments-newline . ,(default-value 'ess-offset-arguments-newline)) (ess-offset-block . ,(default-value 'ess-offset-block)) (ess-offset-continued . ,(default-value 'ess-offset-continued)) (ess-align-nested-calls . ,(default-value 'ess-align-nested-calls)) (ess-align-arguments-in-calls . ,(default-value 'ess-align-arguments-in-calls)) (ess-align-continuations-in-calls . ,(default-value 'ess-align-continuations-in-calls)) (ess-align-blocks . ,(default-value 'ess-align-blocks)) (ess-indent-from-lhs . ,(default-value 'ess-indent-from-lhs)) (ess-indent-from-chain-start . ,(default-value 'ess-indent-from-chain-start)) (ess-indent-with-fancy-comments . ,(default-value 'ess-indent-with-fancy-comments)))) "Predefined formatting styles for ESS code. Use `ess-default-style' to apply a style in all R buffers. The values of all styles except OWN are fixed. To change the value of variables in the OWN group, customize the variable `ess-own-style-list'. DEFAULT style picks default (aka global) values from ESS indentation variables. In addition, ESS provides many indentation styles, the most important being the RRR and the RStudio variants. RRR is the common R style that adheres closely to R internal standards. RRR+ is the same except it also aligns blocks in function calls with the opening delimiter, producing more indentation. The C++ style (named like this for historical reasons rather than any resemblance to existing C++ indentation schemes) is halfway between these two styles and indent block arguments from the start of the surrounding function's name. The RStudio style closely mimics the indentation of the RStudio editor. RStudio- is the same except it does not align arguments in function calls, which corresponds to the settings of some RStudio users. ESS indentation is fully specified by the following offsets and variables. See the documentation of these variables for examples. Offsets: - `ess-indent-offset': main offset inherited by other settings - `ess-offset-arguments': offset type for function and bracket arguments - `ess-offset-arguments-newline': offset type of arguments when ( or [ is followed by a new line. - `ess-offset-block': offset type for brace and anonymous parenthesis blocks - `ess-offset-continued': offset type for continuation lines in multiline statements Overrides (implies vertical alignment): - `ess-align-nested-calls': functions whose nested calls should be aligned. - `ess-align-arguments-in-calls': calls where `ess-offset-arguments' should be ignored - `ess-align-continuations-in-calls': whether to ignore `ess-offset-continued' in calls. - `ess-align-blocks': whether to ignore `ess-offset-blocks' for function declarations or control flow statements. Control variables: - `ess-indent-from-lhs': whether to indent arguments from left-hand side of an assignment or parameter declaration. - `ess-indent-from-chain-start': whether to indent arguments from the first of several consecutive calls. - `ess-indent-with-fancy-comments': whether to indent #, ## and ### comments distinctly.") (defun ess-add-style (key entries) "Add a new style to `ess-style-list', with the key KEY. Remove any existing entry with the same KEY before adding the new one." (setq ess-style-alist (assq-delete-all key ess-style-alist)) (add-to-list 'ess-style-alist (cons key entries))) (defcustom ess-own-style-list (cdr (assoc 'RRR ess-style-alist)) "Indentation variables for your own style. Set `ess-default-style' to 'OWN to use these values. To change these values, use the customize interface. See the documentation of each variable for its meaning. " :group 'ess-edit :type 'alist :initialize 'custom-initialize-set :set (lambda (symbol value) (set symbol value) (ess-add-style 'OWN value))) (defcustom ess-default-style 'RRR "The default value of `ess-indent-style'. See the variable `ess-style-alist' for how these groups (RRR, DEFAULT, GNU, BSD, ...) map onto different settings for variables. OWN style is defined in `ess-own-style-list' and you can customize it to your needs. DEFAULT style picks default (aka global) values from ESS indentation variables." :type '(choice (const OWN) (const GNU) (const BSD) (const C++) (const CLB) (const K&R) (const RRR) (const RRR+) (const RStudio) (const RStudio-) (const DEFAULT)) :group 'ess-edit) ;; the real setting of this happens via -editing-alist: (defvar ess-style ess-default-style "Current ESS indentation style, see `ess-style-alist' for more.") ;;*;; Variables controlling behaviour of dump files (defcustom ess-source-directory (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp") "Directory in which to place dump files. This can be a string (an absolute directory name ending in a slash) or a lambda expression of no arguments which will return a suitable string value. The lambda expression is evaluated with the process buffer as the current buffer. This always dumps to a sub-directory (\".Src\") of the current ess working directory (i.e. first elt of search list)." :group 'ess-edit :type 'directory) (defvar ess-dump-filename-template nil "Internal. Initialized by dialects") (defcustom ess-dump-filename-template-proto (concat (user-login-name) ".%s.S") "Prototype template for filenames of dumped objects. The ending `S' is replaced by the current \\[ess-suffix], to give `ess-dump-filename-template' when an inferior ESS process starts. By default, gives filenames like `user.foofun.S', so as not to clash with other users if you are using a shared directory. Other alternatives: \"%s.S\" ; Don't bother uniquifying if using your own directory(ies) \"dumpdir\"; Always dump to a specific filename. This makes it impossible to edit more than one object at a time, though. (make-temp-name \"scr.\") ; Another way to uniquify" ;; MM: The last 3-4 lines above suck (I don't understand them) -- FIXME -- :group 'ess-edit :type 'string) ;;*;; Hooks (defcustom ess-mode-hook nil "Hook for customizing ESS each time it is entered." :group 'ess-hooks :type 'hook) (defcustom ess-mode-load-hook nil "Hook to call when ess.el is loaded." :group 'ess-hooks :type 'hook) (defcustom ess-pre-run-hook nil "Hook to call before starting up ESS. Good for setting up your directory." :group 'ess-hooks :type 'hook) (defcustom ess-post-run-hook nil "Hook to call just after the ESS process starts up. Good for evaluating ESS code." :group 'ess-hooks :type 'hook) (defcustom inferior-ess-mode-hook nil "Hook for customizing inferior ESS mode. Called after `inferior-ess-mode' is entered and variables have been initialised." :group 'ess-hooks :type 'hook) ;;; make it possible to save an inferior-ess-mode buffer without losing ;;; the connection to the running ESS process. (put 'inferior-ess-mode 'mode-class 'special) ;; FIXME AJR: Should the above be there? I don't think so! ;; MM : the functionality should be, right? Move statement to ./ess.el ? ;; AJR: No, we should move the statement to ./ess-inf.el (defcustom ess-help-mode-hook nil "Functions to call when entering `ess-help-mode'." :group 'ess-hooks :type 'hook) (defcustom ess-send-input-hook nil "Hook called just before line input is sent to the process." :group 'ess-hooks :type 'hook) (defcustom ess-transcript-mode-hook nil "Hook for customizing ESS transcript mode." :group 'ess-hooks :type 'hook) (defcustom R-mode-hook nil "Hook run when entering R mode." :type 'hook :group 'ess-R) (defcustom Rnw-mode-hook nil "Hook run when entering Rnw mode." :type 'hook :group 'ess-R) (defcustom SAS-mode-hook nil "Hook to run when entering SAS mode." :type 'hook :group 'ess-sas) (defcustom ess-pdf-viewer-pref nil "External pdf viewer you like to use from ESS. Can be a string giving a name of the program or a list with car giving heprogram and the tail giving the arguments. For example '(\"okular\" \"--unique\")." :type '(choice (const nil) (repeat :tag "Command with arguments" string) (string :tag "Command")) :group 'ess) (defcustom ess-ps-viewer-pref nil "External PostScript viewer you like to use from ESS. If nil, ESS will try finding one from a list." :type '(choice (const nil) string) :group 'ess) ;; ---- ./ess-roxy.el : ------------ (defcustom ess-roxy-package "roxygen2" "The name of the R package to use for Roxygen." :group 'ess-roxy :type 'string) (defcustom ess-roxy-tags-noparam '("export" "noRd") "The tags used in roxygen fields that can be used alone. Used to decide highlighting and tag completion." :group 'ess-roxy :type '(repeat string)) (defcustom ess-roxy-tags-param '("author" "aliases" "concept" "details" "examples" "format" "keywords" "method" "exportMethod" "name" "note" "param" "include" "references" "return" "seealso" "source" "docType" "title" "TODO" "usage" "import" "exportClass" "exportPattern" "S3method" "inheritParams" "importFrom" "importClassesFrom" "importMethodsFrom" "useDynLib" "rdname" "section" "slot") "The tags used in roxygen fields that require a parameter. Used to decide highlighting and tag completion." :group 'ess-roxy :type '(repeat string)) (defcustom ess-roxy-template-alist (list (cons "description" ".. content for \\description{} (no empty lines) ..") (cons "details" ".. content for \\details{} ..") (cons "title" "") (cons "param" "") (cons "return" "") (cons "author" ess-user-full-name)) "The tags and defaults to insert when creating empty templates. Param is a place holder for where to enter parameters. Description and details do not use @ tags, but are instead placed at the beginning of the entry (and should therefore also be at the beginning of this template to give syntactically correct roxygen entries)" :group 'ess-roxy :type '(alist :value-type (group string))) (defcustom ess-roxy-fill-param-p nil "Non-nil causes parameter descriptions to be filled (word-wrapped) upon `ess-roxy-update-entry'." :group 'ess-roxy :type '(choice (const :tag "Off" nil) (const :tag "On" t))) (defcustom ess-roxy-hide-show-p nil "Non-nil means ess-roxy uses hs-minor-mode for block hiding with TAB." :group 'ess-roxy :type '(choice (const :tag "Off" nil) (const :tag "On" t))) (defcustom ess-roxy-start-hidden-p nil "Non-nil means all blocks should be hidden from start." :group 'ess-roxy :type '(choice (const :tag "Off" nil) (const :tag "On" t))) (defcustom ess-roxy-str "##'" "Prefix string to insert before each line in new roxygen blocks. In existing roxygen blocks, the prefix is taken from the line at point" :group 'ess-roxy :type 'string) (defcustom ess-roxy-re "^#+'" "Regular expression to recognize roxygen blocks." :group 'ess-roxy :type 'string) (defcustom ess-swv-pdflatex-commands '("texi2pdf" "pdflatex" "make") "Commands to run a version of pdflatex in \\[ess-swv-PDF]; the first entry is the default command." :group 'ess-sweave :type 'list) (defcustom ess-swv-plug-into-AUCTeX-p nil "Non-nil means add commands to AUCTeX's \\[TeX-command-list] to sweave the current noweb file and latex the result." :group 'ess-sweave :type '(choice (const :tag "Off" nil) (const :tag "On" t))) (defvar ess-roxy-insert-prefix-on-newline t "When non-nil, `ess-newline-and-indent' will make sure the new line starts with the roxy prefix.") ; System variables ;; SJE -- this should not be defcustom - user does not set it. (defvar ess-local-process-name nil "The name of the ESS process associated with the current buffer.") (put 'ess-local-process-name 'risky-local-variable t) (put 'ess-local-process-name 'permanent-local t) (make-variable-buffer-local 'ess-local-process-name) (defcustom ess-switch-to-end-of-proc-buffer t "If t, `ess-switch-to-inferior-or-script-buffer goes to end of process buffer." :group 'ess :type 'boolean) (defcustom ess-gen-proc-buffer-name-function 'ess-gen-proc-buffer-name:projectile-or-simple "Function used for generation of the buffer name of the newly created ESS process. It should accept one argument PROC-NAME, a string specifying internal process name (R, R:2, etc). Provided default options are: `ess-gen-proc-buffer-name:simple' -- *proc* `ess-gen-proc-buffer-name:directory' -- *proc:dir* `ess-gen-proc-buffer-name:abbr-long-directory' -- *proc:abbr-long-dir* `ess-gen-proc-buffer-name:projectile-or-simple' -- *proc:projectile-root* or *proc*. `ess-gen-proc-buffer-name:projectile-or-directory' -- *proc:projectile-root* or *proc:dir*. Strategies based on projectile default to built-in strategies if projectile.el is not loaded or there is no project root in the current directory. " :group 'ess :type '(choice (const :tag "*proc*" ess-gen-proc-buffer-name:simple) (const :tag "*proc:dir*" ess-gen-proc-buffer-name:directory) (const :tag "*proc:abbr-long-dir*" ess-gen-proc-buffer-name:abbr-long-directory) (const :tag "*proc:projectile-root* or *proc*" ess-gen-proc-buffer-name:projectile-or-simple) (const :tag "*proc:projectile-root* or *proc:dir*" ess-gen-proc-buffer-name:projectile-or-directory) function)) (defcustom ess-kermit-command "gkermit -T" "Kermit command invoked by `ess-kermit-get' and `ess-kermit-send'." :group 'ess :type 'string) (defcustom ess-kermit-prefix "#" "String files must begin with to use kermit file transfer." :group 'ess :type 'string) (defcustom ess-kermit-remote-directory "." "Buffer local variable that designates remote directory of file." :group 'ess :type 'string) (make-variable-buffer-local 'ess-kermit-remote-directory) ;;*;; Regular expressions ;; -- Note: Some variables not-to-customize moved to ./ess-mode.el : ;; ess-set-function-start ;; Fixme: the following is just for S dialects : (defcustom ess-dumped-missing-re "\\(<-\nDumped\n\\'\\)\\|\\(<-\\(\\s \\|\n\\)*\\'\\)" "If a dumped object's buffer matches this re, then it is replaced by `ess-function-template'." :group 'ess :type 'regexp) (defcustom ess-dump-error-re (if (string= ess-language "S") "\nDumped\n\\'" "[Ee]rror") "Regexp used to detect an error when loading a file." :group 'ess :type 'regexp) ; ess-inf: variables for inferior-ess. ;;*;; System dependent variables ;; If you need to change the *-program-name variables, do so in ;; ess-site.el. Do NOT make the changes here!! ;; Keep a copy of your revised ess-site.el to use as a starting point ;; for upgrades of ESS. (defcustom inferior-ess-own-frame nil "Non-nil means that inferior ESS buffers should start in their own frame. The parameters of this frame are stored in `inferior-ess-frame-alist'." :group 'ess-proc :type 'boolean) (defcustom inferior-ess-frame-alist default-frame-alist "Alist of frame parameters used to create new frames for iESS buffers. This defaults to `default-frame-alist' and is used only when the variable `inferior-ess-own-frame' is non-nil." :group 'ess-proc :type 'alist) (defcustom inferior-ess-same-window t "Non-nil indicates new inferior ESS process appears in current window. Otherwise, the new inferior ESS buffer is shown in another window in the current frame. This variable is ignored if `inferior-ess-own-frame' is non-nil." :group 'ess-proc :type 'boolean) (defcustom inferior-R-program-name (if ess-microsoft-p "Rterm" "R") "Program name for invoking an inferior ESS with \\[R]." :group 'ess-R :type 'string) (defcustom inferior-R-args "" "String of arguments (see 'R --help') used when starting R, including the versions of R created via variable `ess-r-versions'." :group 'ess-R :type 'string) (defcustom ess-R-readline nil "nil indicates that \"--no-readline \" should be used as argument when starting R. This has been the default since 1998 and may very slightly speedup interaction. On the other hand, readline is necessary for expansion of \"~username/\" in paths. Note that readline interprets tabs (tabular characters) in R source files as asking for file name completion. This can mess up ess evaluation completely." :group 'ess-R :type 'boolean) (defcustom inferior-STA-start-file nil "Initialization file for Stata." :group 'ess-Stata) (defcustom inferior-STA-start-args "" "String of switches used when starting stata. Don't use this to send initialization command to stata, use `inferior-STA-start-file' instead. Also see `inferior-STA-program-name'." :group 'ess-Stata :type 'string) (defcustom inferior-R-objects-command "print(objects(pos=%d, all.names=TRUE), max=1e6)\n" "Format string for R command to get a list of objects at position %d. Used in e.g., \\[ess-execute-objects] or \\[ess-display-help-on-object]." :group 'ess-command :type 'string) (defcustom ess-getwd-command nil "Command string retriving the working directory from the process.") (defcustom ess-setwd-command nil "Command string to set working directory. Should contain a formating %s to be replaced by a path (as in 'setwd(%s)\\n'.") (defcustom ess-program-files ;; 32 bit version (if ess-microsoft-p (if (getenv "ProgramW6432") (w32-short-file-name (getenv "ProgramFiles(x86)"));; always 32 on 64 bit OS (w32-short-file-name (getenv "ProgramFiles"))) ;; always 32 on 32 bit OS nil) "Safe (no embedded blanks) 8.3 name for 32-bit programs that works across internationalization." :group 'ess :type 'string) (defcustom ess-program-files-64 ;; 64 bit version (if (and ess-microsoft-p (getenv "ProgramW6432")) (w32-short-file-name (getenv "ProgramW6432")) nil) "Safe (no embedded blanks) 8.3 name for 64-bit programs that works across internationalization." :group 'ess :type 'string) (defcustom ess-directory-containing-R nil "nil (the default) means the search for all occurences of R on the machine will use the default location of the R directory (inside \"c:/Program Files\" in English locale Windows systems). Non-nil values mean use the specified location as the directory in which \"R/\" is located. For example, setting `ess-directory-containing-R' to \"c:\" will tell ESS to search for R versions with pathnames of the form \"c:/R/R-x.y.z\". Currently only used when `ess-microsoft-p'. If you change the value of this variable, you need to restart Emacs for it to take effect. It also needs to be set before you load ess-site as its value is used once only when ESS is loaded." :group 'ess :type 'directory) (defcustom ess-rterm-version-paths nil "Stores the full path file names of Rterm versions, computed via \\[ess-find-rterm]. If you have versions of R in locations other than in ../../R-*/bin/Rterm.exe or ../../rw*/bin/Rterm.exe, relative to the directory in the `exec-path' variable containing your default location of Rterm, you will need to redefine this variable with a `custom-set-variables' statement in your site-start.el or .emacs file." :group 'ess-R :type '(repeat string)) (defcustom ess-SHOME-versions ;; ess-program-files ~= "c:/progra~1" for typical locales/languages (mapcar (lambda (ch) (concat ess-program-files ch)) '("/Insightful/splus62" "/Insightful/splus61" "/MathSoft/splus6" "/spls45se" "/Insightful/splus62netclient" "/Insightful/splus62net/server" "/Insightful/splus61netclient" "/Insightful/splus61net/server" "/Insightful/splus6se" "/Insightful/splus61se" "/Insightful/splus62se" "/Insightful/splus70" "/Insightful/splus71" "/Insightful/splus8.0.1" "/Insightful/splus8.0.4" "/Insightful/splus80" "/TIBCO/splus81" "/TIBCO/splus82" )) "List of possible values of the environment variable SHOME for recent releases of S-Plus. These are the default locations for several current and recent releases of S-Plus. If any of these pathnames correspond to a directory on your machine, running the function `ess-sqpe-versions-create' will create a function, for example, \\[splus70], that will start the corresponding version Sqpe inside an emacs buffer in iESS[S] mode. If you have versions of S-Plus in locations other than these default values, redefine this variable with a `custom-set-variables' statement in your site-start.el or .emacs file. The list of functions actually created appears in the *ESS* buffer and should appear in the \"ESS / Start Process / Other\" menu." :group 'ess-SPLUS :type '(repeat string)) (defcustom ess-SHOME-versions-64 ;; ess-program-files-64 ~= "c:/progra~1" for typical locales/languages (mapcar (lambda (ch) (concat ess-program-files-64 ch)) '("/TIBCO/splus82" )) "List of possible values of the environment variable SHOME for recent releases of 64-bit S-Plus. These are the default locations for several current and recent releases of S-Plus. If any of these pathnames correspond to a directory on your machine, running the function `ess-sqpe-versions-create' will create a function, for example, \\[splus70], that will start the corresponding version Sqpe inside an emacs buffer in iESS[S] mode. If you have versions of 64-bit S-Plus in locations other than these default values, redefine this variable with a `custom-set-variables' statement in your site-start.el or .emacs file. The list of functions actually created appears in the *ESS* buffer and should appear in the \"ESS / Start Process / Other\" menu." :group 'ess-SPLUS :type '(repeat string)) (defcustom inferior-S3-program-name "/disk05/s/S" "Program name for invoking an inferior ESS with S3()." :group 'ess-S :type 'string) (defcustom inferior-S+3-program-name "Splus" "Program name for invoking an inferior ESS with S+3()." :group 'ess-SPLUS :type 'string) (defcustom inferior-S+4-program-name (concat ess-program-files "/spls45se/cmd/Splus.exe") "Program name for invoking an external GUI S+4. The default value is correct for a default installation of S-Plus 4.5 Student Edition and with bash as the shell. For any other version or location, change this value in ess-site.el or site-start.el. Use the 8.3 version of the pathname. Use double backslashes if you use the msdos shell." :group 'ess-SPLUS :type 'string) (defcustom inferior-S+4-print-command "S_PRINT_COMMAND=emacsclientw.exe" "Destination of print icon in S+4 Commands window." :group 'ess-SPLUS :type 'string) (defcustom inferior-S+4-editor-pager-command "options(editor='emacsclient.exe', pager='emacsclientw.exe')" "Programs called by the editor() and pager() functions in S+4 Commands window and in Sqpe+4 buffer." :group 'ess-S :type 'string) (defcustom inferior-Sqpe+4-program-name (concat ess-program-files "/spls45se/cmd/Sqpe.exe") "Program name for invoking an inferior ESS with Sqpe+4()." :group 'ess-SPLUS :type 'string) (defcustom inferior-Sqpe+4-SHOME-name (if ess-microsoft-p (concat ess-program-files "/spls45se" "")) "SHOME name for invoking an inferior ESS with Sqpe+4(). The default value is correct for a default installation of S-Plus 4.5 Student Edition. For any other version or location, change this value in ess-site.el or site-start.el. Use the 8.3 version of the pathname." :group 'ess-SPLUS :type 'string) ;;(if ess-microsoft-p ;; (let* ((SHOME (getenv "SHOME")) ;; (PATH (getenv "PATH")) ;; (split-PATH (split-string PATH ";")) ;; Unix uses ":" ;; (num 0) ;; pathname) ;; (if (not SHOME) ;; (while (< num (length split-PATH)) ;; (setq pathname (concat (nth num split-PATH) "/Sqpe.exe")) ;; (if (not (file-exists-p pathname)) ;; (setq num (1+ num)) ;; (progn ;; (setq num (length split-PATH)) ;; (setq SHOME (expand-file-name (concat pathname "/../.."))))))) ;; (setq-default inferior-Sqpe+4-SHOME-name SHOME))) (defcustom inferior-S-elsewhere-program-name "sh" "Program name to invoke an inferior ESS with S on a different computer." :group 'ess-proc :type 'string) (defcustom inferior-ESS-elsewhere-program-name "sh" "Program name to invoke an inferior ESS with program on a different computer." :group 'ess-proc :type 'string) (defcustom inferior-S4-program-name "S4" "Program name to invoke an inferior ESS with S4()." :group 'ess-S :type 'string) (defcustom inferior-S+5-program-name "Splus5" "Program name to invoke an inferior ESS with S+5()." :group 'ess-SPLUS :type 'string) (defvaralias 'S+6-dialect-name 'S+-dialect-name) (defcustom S+-dialect-name "S+" "Name of 'dialect' for S-PLUS 6.x and later. Easily changeable in a user's `.emacs'." :group 'ess-SPLUS :type 'string) (defvaralias 'inferior-S+6-program-name 'inferior-S+-program-name) (if ess-microsoft-p (defcustom inferior-S+-program-name (concat ess-program-files "/TIBCO/splus82/cmd/Splus.exe") "Program name to invoke an external GUI S+ for Windows. The default value is correct for a default installation of S-Plus 8.1 and with bash as the shell. For any other version or location, change this value in ess-site.el or site-start.el. Use the 8.3 version of the pathname. Use double backslashes if you use the msdos shell." :group 'ess-SPLUS :type 'string) (defcustom inferior-S+-program-name "Splus" "Program name to invoke an inferior ESS with S+ for Unix." :group 'ess-SPLUS :type 'string)) (defvaralias 'inferior-S+6-start-args 'inferior-S+-start-args) (defvaralias 'inferior-Splus-args 'inferior-S+-start-args) (defcustom inferior-S+-start-args "" "String of arguments used when starting S. These arguments are currently passed only to S+6 and higher." :group 'ess-SPLUS :type 'string) (defvaralias 'inferior-Sqpe-start-args 'inferior-Sqpe+-start-args) (defcustom inferior-Sqpe+-start-args " " "Default is empty. Can be used for license manager information, for example `(setq inferior-Sqpe+-start-args \" S_ELMHOST=@123.456.789.012 ELMTIMEOUT=60 \")'." ;; (setq inferior-Sqpe+-start-args " S_ELMHOST=@123.456.789.012 ELMTIMEOUT=60 ") ;; use this line as the model for your site-start.el :group 'ess-SPLUS :type 'string ) (defcustom inferior-Splus-objects-command "objects(where=%d)\n" "Format string for R command to get a list of objects at position %d. Used in e.g., \\[ess-execute-objects] or \\[ess-display-help-on-object]." :group 'ess-command :type 'string) (defvaralias 'inferior-S+6-print-command 'inferior-S+-print-command) (defcustom inferior-S+-print-command "S_PRINT_COMMAND=emacsclientw.exe" "Destination of print icon in S+ for Windows Commands window." :group 'ess-SPLUS :type 'string) (defvaralias 'inferior-S+6-editor-pager-command 'inferior-S+-editor-pager-command) (defcustom inferior-S+-editor-pager-command "options(editor='emacsclient.exe', pager='emacsclientw.exe')" "Programs called by the editor() and pager() functions in S+ for Windows Commands window and in Sqpe+6 for Windows buffer." :group 'ess-SPLUS :type 'string) (defvaralias 'inferior-Sqpe+6-program-name 'inferior-Sqpe+-program-name) (defcustom inferior-Sqpe+-program-name (concat ess-program-files "/TIBCO/splus82/cmd/Sqpe.exe") "Program name for invoking an inferior ESS with Sqpe+6() for Windows." :group 'ess-S :type 'string) (defvaralias 'inferior-Sqpe+6-SHOME-name 'inferior-Sqpe+-SHOME-name) (defcustom inferior-Sqpe+-SHOME-name (if ess-microsoft-p (concat ess-program-files "/TIBCO/splus82" "")) "SHOME name for invoking an inferior ESS with Sqpe+6 and higher for Windows. The default value is correct for a default installation of S-Plus 8.1. For any other version or location, change this value in ess-site.el or site-start.el. Use the 8.3 version of the pathname." :group 'ess-SPLUS :type 'string) ;;(if ess-microsoft-p ;; (let* ((SHOME (getenv "SHOME")) ;; (PATH (getenv "PATH")) ;; (split-PATH (split-string PATH ";")) ;; Unix uses ":" ;; (num 0) ;; pathname) ;; (if (not SHOME) ;; (while (< num (length split-PATH)) ;; (setq pathname (concat (nth num split-PATH) "/Sqpe.exe")) ;; (if (not (file-exists-p pathname)) ;; (setq num (1+ num)) ;; (progn ;; (setq num (length split-PATH)) ;; (setq SHOME (expand-file-name (concat pathname "/../.."))))))) ;; (setq-default inferior-Sqpe+6-SHOME-name SHOME))) (defcustom ess-S-quit-kill-buffers-p nil "Controls whether S buffers should also be killed once a process is killed. This is used only when an iESS process is killed using C-c C-q. Possible values: nil - do not kill any S buffers associated with the process. t - kill S buffers associated with the process. ask - ask the user whether the S buffers should be killed." :group 'ess-S :type '(choice (const nil) (const t) (const ask))) (defcustom inferior-XLS-program-name "xlispstat" "Program name for invoking an inferior ESS with \\[XLS]." :group 'ess-XLS :type 'string) (defcustom inferior-VST-program-name "vista" "Program name for invoking an inferior ESS with \\[ViSta]." :group 'ess-XLS :type 'string) (defcustom inferior-ARC-program-name "arc" "Program name for invoking an inferior ESS with \\[ARC]." :group 'ess-XLS :type 'string) (defcustom inferior-SAS-program-name "sas" "Program name for invoking an inferior ESS with SAS()." :group 'ess-sas :type 'string) (defcustom inferior-STA-program-name "stata" "Program name for invoking an inferior ESS with stata(). This is NOT Stata, because we need to call stata with TERM=emacs in order for it to work right. And Emacs is too smart for it." :group 'ess-Stata :type 'string) (defcustom ess-sta-delimiter-friendly nil "Non-nil means convert embedded semi-colons to newlines for Stata processing." :group 'ess-Stata :type 'string) (defcustom inferior-OMG-program-name "omegahat" "Program name for invoking an inferior ESS with omegahat()." :group 'ess-OMG :type 'string) ;;;;; names for setting the pager and editor options of the ;;;;; inferior-ess-process ;;; ;;; S-editor and S-pager, ;;; R-editor and R-pager, ;;; ess-editor and ess-pager, ;;; and inferior-ess-language-start ;;; apply in principle to the 15 files essd[s-]*.el ;;; Several of the files (ess-sp4-d.el and ess-sp6w-d.el) have more ;;; than one *-customize-alist. ;;; These variables are currently used only with the S language files for ;;; S S-Plus R. (defcustom R-editor (if ess-microsoft-p "emacsclient.exe" (if (equal system-type 'Apple-Macintosh) nil (if (featurep 'xemacs) "gnuclient" "emacsclient"))) ;; unix "Editor called by R process with 'edit()' command." :group 'ess :type 'string) (defcustom R-pager 'nil ; Usually nil is correct as ESS and page() cooperate. "Pager called by R process with 'page()' command." :group 'ess :type '(choice (const nil) string)) ;; FIXME: For GNU emacs, "emacsclient" (without ".exe") also works on Windoze ;; (if (>= emacs-major-version 22) "emacsclient" ; for all platforms (defcustom S-editor (if ess-microsoft-p "emacsclient.exe" (if (equal system-type 'Apple-Macintosh) nil ;; unix: (if (featurep 'xemacs) "gnuclient" "emacsclient"))) "Editor called by S process with 'edit()' command." :group 'ess :type 'string) (defcustom S-pager (if ess-microsoft-p "emacsclientw.exe" (if (equal system-type 'Apple-Macintosh) nil (if (featurep 'xemacs) "gnuclient" "emacsclient"))) "Pager called by S process with 'page()' command." ;; Change made to provide a better help(function) experience with ;; S+6 and xemacs ;; gnuclient -q will open a buffer with an HTML help file ;; you can view it with M-x browse-url-of-buffer :group 'ess :type 'string) (defvar ess-editor nil "*Editor by which the process sends information to an emacs buffer for editing and then to be returned to the process.") (defvar ess-pager nil "*Pager by which the process sends information to an emacs buffer.") (defvar inferior-ess-language-start nil "*Initialization commands sent to the ESS process.") (make-variable-buffer-local 'ess-editor) (make-variable-buffer-local 'ess-pager) (make-variable-buffer-local 'inferior-ess-language-start) ;;;;; names for S-Plus help files on MS-Windows (defcustom inferior-ess-help-filetype nil "S-Plus and Sqpe for Windows use the \"chm\" (compiled html) filetype for help files. The default value is nil for other systems." :group 'ess-proc :type 'string) (make-variable-buffer-local 'inferior-ess-help-filetype) (setq-default inferior-ess-help-filetype nil) ;;;;; names for communication using MS-Windows 9x/NT ddeclient mechanism (defcustom inferior-ess-ddeclient nil "ddeclient is the intermediary between emacs and the stat program." :group 'ess-proc :type 'string) (make-variable-buffer-local 'inferior-ess-ddeclient) (defcustom inferior-ess-client-name nil "Name of ESS program ddeclient talks to." :group 'ess-proc :type 'string) (make-variable-buffer-local 'inferior-ess-client-name) (defcustom inferior-ess-client-command nil "ddeclient command sent to the ESS program." :group 'ess-proc :type '(choice (const nil) string)) (make-variable-buffer-local 'inferior-ess-client-command) ;;;;; user settable defaults (defvar inferior-S-program-name inferior-S+3-program-name "*Program name for invoking an inferior ESS with S().") ;;- (setq inferior-S-program ;;- (cond ((string= S-proc-prefix "S") "Splus") ;;- ((string= S-proc-prefix "R") "R") ;;- (t "S") ;;- )) ;;(make-local-variable 'inferior-S-program) (defvar inferior-ess-program nil ;inferior-S-program-name "*Default program name for invoking inferior-ess(). The other variables ...-program-name should be changed, for the corresponding program.") (make-variable-buffer-local 'inferior-ess-program) ;; (setq-default inferior-ess-program inferior-S-program-name) (defvar inferior-R-version "R (default)" "A (short) name of the current R version. A global variable for ESS internal communication.") (defvar inferior-ess-start-args "" "String of arguments passed to the ESS process. If you wish to pass arguments to a process, see e.g. `inferior-R-args'.") (defcustom inferior-ess-start-file nil "File dumped into process, if non-nil." :group 'ess-proc :type '(choice (const nil) file)) (defcustom inferior-ess-pager "cat" "Pager to use for reporting help files and similar things." :group 'ess-proc :type 'string) ;; does it make sense to customize here, as we currently set this *directly* ;; in the FOO-BAR-cust-alist's ??? ;; VS: Right. It only confuses users. It should be set in post-run-hook if ;; desired; inferior-S-prompt should be customized instead. (defvar inferior-ess-primary-prompt "> " "Regular expression used by `ess-mode' to detect the primary prompt.") (make-variable-buffer-local 'inferior-ess-primary-prompt) ;; (setq-default inferior-ess-primary-prompt "> ") (defvar inferior-ess-secondary-prompt nil "Regular expression used by ess-mode to detect the secondary prompt. This is issued by S to continue an incomplete expression. Set to nil if language doesn't support secondary prompt.") ;; :group 'ess-proc ;; :type 'string) (make-variable-buffer-local 'inferior-ess-secondary-prompt) ;; (setq-default inferior-ess-secondary-prompt "+ ") (defvar ess-traceback-command nil "Command to generate error traceback.") ;; need to recognise + + + > > > ;; and "+ . + " in tracebug prompt (defcustom inferior-S-prompt "[]a-zA-Z0-9.[]*\\(?:[>+.] \\)*> " "Regexp used in S and R inferior and transcript buffers for prompt navigation. Customise it to make `comint-previous-prompt' quiqly navigate to interesting portions of the buffer. " :group 'ess-proc :type 'string) (defvaralias 'inferior-ess-S-prompt 'inferior-S-prompt) ;;*;; Variables controlling interaction with the ESS process (defcustom ess-execute-in-process-buffer nil "Non-nil means the ess-execute- commands output to the process buffer. Otherwise, they get their own temporary buffer." :group 'ess-proc :type 'boolean) (defcustom ess-eval-empty nil "Non-nil means `ess-eval-line*' will send empty lines to the ESS process." :group 'ess-proc :type 'boolean) (defvaralias 'ess-eval-visibly-p 'ess-eval-visibly) (defcustom ess-eval-visibly t "Non-nil means ess-eval- commands display commands in the process buffer. If t, ESS waits after each line of the command for the process output. This results in a nice sequence of input and output but stalls emacs on long output (like Sys.sleep(5) in R). If 'nowait, ESS still shows the input commands, but don't wait for the process. Thus all the output is printed after the input lines. If nil, ESS doesn't print input commands and doesn't wait for the process. This variable also affect the evaluation of input code in iESS. The effect is similar to the above. If t then ess waits for the process output, otherwise not. " :group 'ess-proc :type '(choice (const t) (const nowait) (const nil))) ;; (when (boundp 'ess-eval-visibly-p) ;; (setq ess-eval-visibly ess-eval-visibly-p)) (defcustom ess-eval-deactivate-mark (fboundp 'deactivate-mark); was nil till 2010-03-22 "Non-nil means that after ess-eval- commands the mark is deactivated, (see \\[deactivate-mark]). The default is true since ESS version 5.9, except on XEmacs which doesn't have \\[deactivate-mark] and friends: only affects the situation where `transient-mark-mode' is non-nil." :group 'ess-proc :type 'boolean) (defcustom ess-synchronize-evals nil "Non-nil means all evaluations will synchronize with the ESS process. This means ess-mode will wait for S to dent a prompt before sending the next line of code. This allows users of Emacs version 18.57 or less to evaluate large regions of code without causing an error. Users of newer Emacsen usually do not want this feature, since it locks up use of Emacs until the code has been successfully evaluated." :group 'ess-proc :type 'boolean) (defcustom ess-eval-visibly-at-end t "Non-nil means ess-eval- commands display output at end of process buffer." :group 'ess-proc :type 'boolean) (defcustom ess-use-R-completion t "Non-nil means use R-builtin completion mechanism when available." :group 'ess-proc :type 'boolean) (defcustom ess-eval-ddeclient-sleep 0.06 "If non-nil, a number specifying *seconds* to wait after certain \\[ess-eval-linewise-ddeclient] calls, such as those at startup." ;; i.e this currently only applies to (if microsoft-p ...) ! :group 'ess-proc :type '(choice (const nil) number)) (defcustom ess-sleep-for-shell (if ess-microsoft-p 5 1) "*Pause before sending output to the shell." :group 'ess-proc :type 'number) ; System variables ;;*;; Variables relating to multiple processes ;; VS[17-08-2012]: all of the occurrences in the code should should eventually ;; go away, (once we are sure this doesn't break anything) (defvaralias 'ess-current-process-name 'ess-local-process-name) (defvar ess--mode-line-process-indicator '("" ess-local-process-name) "List of ESS mode-line indicators. Local in process buffers and must start with a string. Changes of this variable are automatically reflected in mode-lines of the process and all associated with it buffers. Each symbol must evaluate ot one of the standard mode line objecst. See info node `(elisp)Mode Line Data'). Add a symbol with `add-to-list' and remove with `delq'. Note that the symbols which are part of this list should better have 'risky-local-variable property set to t, otherwise the text properties are not displayed. External utilities such as `ess-tracebug' and `ess-developer' customize this variable to indicate changes in the process status. ") (put 'ess--mode-line-process-indicator 'risky-local-variable t) (make-variable-buffer-local 'ess--mode-line-process-indicator) (defvar ess--local-mode-line-process-indicator '("") "List of local process indicators. See `ess--mode-line-process-indicator' for how to set it. This is an internal varialbe used by tools like `ess-developer' and `ess-tracebug'.") (put 'ess--local-mode-line-process-indicator 'risky-local-variable t) (make-variable-buffer-local 'ess--local-mode-line-process-indicator) (defvar ess-process-name-list nil "Alist of active ESS processes.") ;;*;; Inferior ESS commands (defvar ess-load-command "source(\"%s\")\n" "Dialect specific format-string for building the ess command to load a file. This format string should use %s to substitute a file name and should result in an ESS expression that will command the inferior ESS to load that file.") (define-obsolete-variable-alias 'inferior-ess-load-command 'ess-load-command "ESS v13.09") (defvar ess-load-visibly-command nil "Dialect specific format-string for building the ess command to load a file with echo.") (defvar ess-load-visibly-noecho-command nil "Dialect specific format-string for building the ess command to load a file with visible output but no echo.") (defvar ess-eval-command nil "Dialect specific format-string for building the command to evaluate a string. This format string should use %s as a placeholder for the string to be evaluated and, optionally, %f for the file name to be reported in the error references. The resulting command should not echo code or print any transitory output. See also `ess-eval-visibly-command' and `ess-eval-visibly-noecho-command'.") (defvar ess-eval-visibly-command nil "Dialect specific format-string for building the command to evaluate a string with visible output and code echo. See ") (defvar ess-eval-visibly-noecho-command nil "Dialect specific format-string for building the command to evaluate a string with visible output but no echo.") (defcustom inferior-ess-dump-command "dump(\"%s\",file=\"%s\")\n" "Format-string for building the ess command to dump an object into a file. Use first %s to substitute an object name Use second %s to substitute the dump file name." :group 'ess-command :type 'string) (defvar inferior-ess-help-command "help(\"%s\")\n" "Format-string for building the ESS command to ask for help on an object. This format string should use %s to substitute an object name.") (make-variable-buffer-local 'inferior-ess-help-command) (setq-default inferior-ess-help-command "help(\"%s\")\n") (defcustom inferior-ess-r-help-command ".ess.help(\"%s\", help.type=\"text\")\n" "Format-string for building the R command to ask for help on an object. This format string should use %s to substitute an object name. If set, changes will take effect when next R session is started." :group 'ess-command :type 'string) (defvar ess-get-help-topics-function nil "Dialect specific help topics retrieval") (make-variable-buffer-local 'ess-get-help-topics-function) (defcustom inferior-ess-exit-command "q()\n" "Format-string for building the ess command to exit. This format string should use %s to substitute an object name." :group 'ess-command :type 'string) (make-variable-buffer-local 'inferior-ess-exit-command) (setq-default inferior-ess-exit-command "q()\n") (defvar inferior-ess-search-list-command nil "`ess-language' command that prints out the search list; i.e. the list of directories and (recursive) objects that `ess-language' uses when it searches for objects. Really set in -customize-alist in ess[dl]-*.el") (make-variable-buffer-local 'inferior-ess-search-list-command) ;; and hence made buffer-local via that scheme... ;; ;; FIXME: this is nowhere used : ;; (defcustom inferior-ess-names-command "names(%s)\n" ;; "Format string for ESS command to extract names from an object. ;; %s is replaced by the object name -- usually a list or data frame." ;; :group 'ess-command ;; :type 'string) (defcustom inferior-ess-safe-names-command "tryCatch(base::print(base::names(%s), max=1e6), error=function(e){})\n" "Format string for ESS command to extract names from an object *safely*. %s is replaced by an \"object name\" -- usually a list or data frame, but in R also e.g., 'package:stats'." :group 'ess-command :type 'string) (defcustom inferior-ess-get-prompt-command "options()$prompt\n" "Command to find the value of the current S prompt." :group 'ess-command :type 'string) (defvar ess-cmd-delay nil "*Set to a positive number if ESS will include delays proportional to `ess-cmd-delay' in some places. These delays are introduced to prevent timeouts in certain processes, such as completion. This variable has no effect from ESS12.03 ") (make-variable-buffer-local 'ess-cmd-delay) (defvar ess-R-cmd-delay nil "Used to initialize `ess-cmd-delay'. This variable has no effect from ESS12.03 ") (defvar ess-S+-cmd-delay 1.0 "Used to initialize `ess-cmd-delay'. This variable has no effect from ESS12.03 ") ;;*;; Regular expressions (defvar inferior-ess-prompt nil "The regular expression used for recognizing prompts. It is always used in transcript mode. In inferior ess mode it is used only if `comint-use-prompt-regexp' is t. If not set in language's customise-alist it is constructed at run time from `inferior-ess-primary-prompt' and `inferior-ess-secondary-prompt'.") (make-variable-buffer-local 'inferior-ess-prompt) (defvar ess-change-sp-regexp "" "The regexp for matching the S/R/.. commands that change the search path.") (make-variable-buffer-local 'ess-change-sp-regexp) (defvar ess-S+-change-sp-regexp "\\(attach(\\([^)]\\|$\\)\\|detach(\\|collection(\\|library(\\|module(\\|source(\\)" "The regexp for matching the S-plus commands that change the search path.") (defvar ess-S-change-sp-regexp "\\(attach(\\([^)]\\|$\\)\\|detach(\\|library(\\|source(\\)" "The regexp for matching the S commands that change the search path.") (defvar ess-R-change-sp-regexp "\\(attach(\\([^)]\\|$\\)\\|detach(\\|library(\\|require(\\|source(\\)" "The regexp for matching the R commands that change the search path.") ;;*;; Process-dependent variables (defvar ess-search-list nil "Deprecated. Use (ess-search-list) or (ess-process-get 'search-list) instead.") (make-obsolete-variable 'ess-search-list nil "ESS[12.09]") (defvar ess-sl-modtime-alist nil "Alist of modification times for all ess directories accessed this session.") (make-variable-buffer-local 'ess-sl-modtime-alist) (defvar ess-sp-change nil "Variable not used. Use (ess-process-get 'sp-for-help-changed?) instead.") (make-obsolete-variable 'ess-sp-change nil "ESS[12.09]") ;; (make-variable-buffer-local 'ess-sp-change) (defvar ess-prev-load-dir/file nil "This symbol saves the (directory . file) pair used in the last `ess-load-file' command. Used for determining the default in the next one.") (make-variable-buffer-local 'ess-prev-load-dir/file) (defvar ess-object-list nil ;; This is a list of the currently known object names. It is ;; current only for one command entry; it exists under the ;; assumption that the list of objects doesn't change while entering ;; a command. "Cache of object names") (make-variable-buffer-local 'ess-object-list) (defvar ess-help-topics-list nil ;; List of currently known help topics. "Cache of help topics") (make-variable-buffer-local 'ess-help-topics-list) ;;*;; Miscellaneous system variables (defvar ess-temp-point nil "Variable used to retain a buffer position past let or let*.") ;; SJE: Wed 29 Dec 2004 - following 3 ess-object* variables can be removed ;; soon if no-one needs the completion code. (defvar ess-object-name-db-file "ess-namedb" "File containing definitions for `ess-object-name-db'.") (defvar ess-object-name-db-file-loaded '() "List of programs whose name-db file has been loaded.") (defvar ess-object-name-db nil "Alist of lists of object names, with directory names as keys. The file ess-namedb.el is loaded (if it exists) to define this variable. See also function `ess-create-object-name-db'.") (make-variable-buffer-local 'ess-object-name-db) (setq-default ess-object-name-db nil) ;; SJE: 2007-07-16 -- add to quieten byte compile. (defvar ess-loop-timeout nil "Number of loops ess-mode will wait for prompt before signalling an error.") (defcustom ess-S-loop-timeout 2000000 "Integer specifying how many loops ess-mode will wait for the prompt before signaling an error. Will be set to `ess-loop-timeout' in the S dialects' alists. Increase this, if you have a fast(er) machine." :group 'ess-proc :type 'integer) (defcustom ess-XLS-loop-timeout 50000 "Integer specifying how many loops ess-mode will wait for the prompt before signaling an error. Will be set to `ess-loop-timeout' in the XLispStat dialects' alists. Increase this, if you have a fast(er) machine." :group 'ess-proc :type 'integer) ;; NOTA BENE: Other languages/dialect currently set `ess-loop-timeout' ;; **directly** in their ess-*-d.el alist !! ;;;*;;; Font-lock support ;;; for programming, transcript, and inferior process modes. (defcustom ess-font-lock-mode global-font-lock-mode "Non-nil means we use font lock support for ESS buffers. Default is t, to use font lock support. If you change the value of this variable, restart Emacs for it to take effect." :group 'ess :type 'boolean) (defvar inferior-ess-font-lock-input t " This variable has no effect. Customize `inferior-ess-font-lock-keywords' directly. ") (make-obsolete-variable 'inferior-ess-font-lock-input nil "ESS[12.09]") ;; "Reserved Words" -- part 1 -- (defvar ess-RS-constants '("TRUE" "FALSE" "NA" "NULL" "Inf" "NaN")) (defvar ess-R-constants (append ess-RS-constants '("NA_integer_" "NA_real_" "NA_complex_" "NA_character_"))) (defvar ess-S-constants (append ess-RS-constants '("T" "F"))) (defvar ess-R-keywords ;; "Reserved Words" -- part 2 -- '("while" "for" "in" "repeat" "if" "else" "switch" "break" "next" "function" ;; note that these are *NOT* reserved words in R: "return" "message" "warning" "stop")) (defvar ess-S-keywords (append ess-R-keywords '("terminate"))) ;; only some of these keywords "look like functions but are not": (defvar ess-S-non-functions '("if" "for" "function" "while")) ;; first the common ones (defvar ess-S-modifyiers '("library" "attach" "detach" "source" "module")) (defvar ess-R-modifyiers '("library" "attach" "detach" "source" "require")) (defvar ess-R-message-prefixes '("Error:" "Error in" "Warning:" "Warning in" "Warning messages")) (defvar ess-S-message-prefixes (append ess-R-message-prefixes '("Syntax error:" "Dumped"))) ;; (defvar ess-R-assign-ops '("<<-" "<-" "->") ; don't want "=" here which is not only for assign ;; VS??: it's good to have different colour for = anyhow, ;; very helpful to read code like foo(x=xa, p=pa, x_not_na) ) (defvar ess-S-assign-ops ess-R-assign-ops) ; since "_" is deprecated for S-plus as well ;; ;; Note: \\s\" is really \s" which means match a char belonging to the ;; ;; "quote character" syntax class. ;; (defvar ess-R-function-name-regexp ;; (concat "\\s\"?\\(\\(\\sw\\|\\s_\\)+" ;; "\\(<-\\)?\\)\\s\"?\\s-*\\(<-\\)" ;; "\\(\\s-\\|\n\\)*function") ;; ) ;; VS: simpler and more general: (defvar ess-R-function-name-regexp (concat "\\(\\(?2:\\s\"\\).+\\2\\|\\sw+\\)" "\\s-*\\(<-\\)" "[ \t\n]*function")) (defvar ess-S-function-name-regexp ess-R-function-name-regexp ; since "_" is deprecated for S-plus as well ) (defvar ess-font-lock-keywords nil "Internal. Holds a name of the dialect sepcific font-lock keywords in the current buffer. See `ess-R-font-lock-keywords' for an example.") (make-variable-buffer-local 'ess-font-lock-keywords) (defvar ess-font-lock-defaults nil "Internal. Holds dialect sepcific font-lock defaults in the current buffer. Old system. From ESS[12.09] switched to new system described in `ess-font-lock-keywords'.") (make-variable-buffer-local 'ess-font-lock-defaults) (defvar ess-fl-keyword:fun-calls (cons "\\(\\sw+\\) ?(" '(1 ess-function-call-face keep)) "Font lock for function calls.") (defvar ess-fl-keyword:numbers (cons "\\b\\.?[0-9]+[.eEL]?[0-9]*\\b" 'ess-numbers-face) "Numbers") (defvar ess-fl-keyword:delimiters (cons "\\s(\\|\\s)" 'font-lock-builtin-face) "Parenthesis") (defvar ess-fl-keyword:= (cons "=" 'font-lock-constant-face) "=") (defvar ess-fl-keyword:operators (cons "[-=+>") 'font-lock-constant-face) ; modify search list or source (i.e. directives) "Font-lock keyword R modifiers") (defvar ess-S-fl-keyword:fun-defs (cons ess-S-function-name-regexp '(1 font-lock-function-name-face t) ; override ) "Font-lock function deffinitions keyword.") (defvar ess-S-fl-keyword:keywords (cons (concat "\\<" (regexp-opt ess-S-keywords 'enc-paren) "\\>") 'font-lock-keyword-face)) (defvar ess-S-fl-keyword:assign-ops (cons (regexp-opt ess-S-assign-ops) 'font-lock-constant-face) "Font-lock assign operators") (defvar ess-S-fl-keyword:constants (cons (concat "\\<" (regexp-opt ess-S-constants 'enc-paren) "\\>") 'font-lock-type-face) "Font-lock constants keyword.") (defcustom ess-S-font-lock-keywords '((ess-S-fl-keyword:modifiers . t) (ess-S-fl-keyword:fun-defs . t) (ess-S-fl-keyword:keywords . t) (ess-S-fl-keyword:assign-ops . t) (ess-S-fl-keyword:constants . t) (ess-fl-keyword:fun-calls) (ess-fl-keyword:numbers) (ess-fl-keyword:operators) (ess-fl-keyword:delimiters) (ess-fl-keyword:=) ) "An alist of available font-lock keywords for the S mode. The key of each cons cell is a name of the keyword. The value should be t or nil to indicate if the keyword is activated by default or not." :group 'ess-S :type 'alist) ;;; fl-keywords R (defvar ess-R-fl-keyword:modifiers (cons (concat "\\<" (regexp-opt ess-R-modifyiers 'enc-paren) "\\>") 'font-lock-constant-face) ; modify search list or source (i.e. directives) "Font-lock keyword R modifiers") (defvar ess-R-fl-keyword:fun-defs (cons ess-R-function-name-regexp '(1 font-lock-function-name-face t) ; override ) "Font-lock keyword - function defintions for R.") (defvar ess-R-fl-keyword:keywords (cons (concat "\\<" (regexp-opt ess-R-keywords 'enc-paren) "\\>") 'font-lock-keyword-face)) (defvar ess-R-fl-keyword:assign-ops (cons (regexp-opt ess-R-assign-ops) 'font-lock-constant-face) "Font-lock assign operators") (defvar ess-R-fl-keyword:constants (cons (concat "\\<" (regexp-opt ess-R-constants 'enc-paren) "\\>") 'font-lock-type-face) "Font-lock constants keyword.") (defvar ess-R-fl-keyword:numbers (cons "\\b[0-9]*[.eE]?[0-9]+[eEL]?\\b" 'ess-numbers-face) "Font-lock numbers") (defvar ess-R-fl-keyword:F&T (cons "\\b[FT]\\b" 'font-lock-type-face) "Highlight T and F in addition to TRUE and FALSE in R.") (defvar ess-R-fl-keyword:%op% (cons "%[^ \t]*%" 'ess-%op%-face) "Highlight %op% operators.") (defcustom ess-R-font-lock-keywords '((ess-R-fl-keyword:modifiers . t) (ess-R-fl-keyword:fun-defs . t) (ess-R-fl-keyword:keywords . t) (ess-R-fl-keyword:assign-ops . t) (ess-R-fl-keyword:constants . t) (ess-fl-keyword:fun-calls) (ess-fl-keyword:numbers) (ess-fl-keyword:operators) (ess-fl-keyword:delimiters) (ess-fl-keyword:=) (ess-R-fl-keyword:F&T) (ess-R-fl-keyword:%op%)) "An alist of available font-lock keywords for the R mode. The key of each cons cell is a name of the keyword. The value should be t or nil to indicate if the keyword is active or not." :group 'ess-R :type 'alist) (defvar inferior-ess-font-lock-keywords nil "Internal. Holds a name of the dialect sepcific font-lock keywords in the current buffer. See `inferior-R-font-lock-keywords' for an example.") (make-variable-buffer-local 'inferior-ess-font-lock-keywords) (defvar inferior-ess-font-lock-defaults nil "Internal. Holds dialect sepcific font-lock defaults in the current buffer. Old system. From ESS[12.09] switched to new system described in `inferior-ess-font-lock-keywords'.") (make-variable-buffer-local 'inferior-ess-font-lock-defaults) (defvar comint-highlight-prompt 'comint-highlight-prompt) ;; needed for proper font-lock (defvar ess-S-fl-keyword:prompt (cons (concat "^" inferior-S-prompt) 'comint-highlight-prompt) "Highlight prompts missed by comint.") ;; (defvar ess-S-fl-keyword:input-line ;; (cons "^[a-zA-Z0-9 ]*[>+]\\(.*$\\)" '(1 font-lock-variable-name-face keep t))) (defvar ess-fl-keyword:matrix-labels (cons "\\[,?[1-9][0-9]*,?\\]" 'font-lock-constant-face) "Matrix and vector numeric labels. ") ;; also matches subsetting (defvar ess-R-fl-keyword:messages (cons (regexp-opt ess-R-message-prefixes 'enc-paren) 'font-lock-warning-face) "Inferior-ess problems or errors.") (defcustom inferior-R-font-lock-keywords '((ess-S-fl-keyword:prompt . t) ;; comint does that, but misses some prompts ;; (ess-S-fl-keyword:input-line) ;; comint boguously highlights input with text props, no use for this (ess-R-fl-keyword:messages . t) (ess-R-fl-keyword:modifiers . t) (ess-R-fl-keyword:fun-defs . t) (ess-R-fl-keyword:keywords . t) (ess-R-fl-keyword:assign-ops . t) (ess-R-fl-keyword:constants . t) (ess-fl-keyword:matrix-labels . t) (ess-fl-keyword:fun-calls) (ess-fl-keyword:numbers) (ess-fl-keyword:operators) (ess-fl-keyword:delimiters) (ess-fl-keyword:=) (ess-R-fl-keyword:F&T) ;;VS[17-09-2012]: what is this matching? ;; (cons "^\\*\\*\\*.*\\*\\*\\*\\s *$" 'font-lock-comment-face); ess-mode msg ;; (cons "#" 'font-lock-comment-face) ; comment ;; (cons "^[^#]*#\\(.*$\\)" '(1 font-lock-comment-face keep t)) ; comments ) "Font-lock patterns (alist) used in inferior-R-mode buffers. The key of each cons cell is a name of the keyword. The value should be t or nil to indicate if the keyword is active or not." :group 'ess-R :type 'alist ) (defvar ess-S-common-font-lock-keywords nil " NOT used. See `inferior-S-font-lock-keywords'") (make-obsolete-variable 'ess-S-common-font-lock-keywords nil "ESS[12.09]") (defvar ess-S-fl-keyword:messages (cons (regexp-opt ess-S-message-prefixes 'enc-paren) 'font-lock-warning-face) "Inferior-ess problems or errors.") (defcustom inferior-S-font-lock-keywords '((ess-S-fl-keyword:prompt . t) (ess-S-fl-keyword:messages . t) (ess-S-fl-keyword:modifiers . t) (ess-S-fl-keyword:fun-defs . t) (ess-S-fl-keyword:keywords . t) (ess-S-fl-keyword:assign-ops . t) (ess-S-fl-keyword:constants . t) (ess-fl-keyword:fun-calls) (ess-fl-keyword:numbers) (ess-fl-keyword:operators) (ess-fl-keyword:delimiters) (ess-fl-keyword:=)) "Font-lock patterns used in inferior-S-mode buffers. The key of each cons cell is a name of the keyword. The value should be t or nil to indicate if the keyword is active by default." :group 'ess-S :type 'alist) ;; use the inferior-* ones directly in ess-trns.el ;; (defvar ess-trans-font-lock-keywords ;; inferior-ess-font-lock-keywords ;; "Font-lock patterns used in `ess-transcript-mode' buffers.") ;;;*;;; ess-help variables ; ess-help-mode ;; This will never need to be loaded independently of any of the other ;; modules, but they can all call it so we may as well put it here. ;;*;; Variables relating to ess-help-mode (defcustom ess-help-pop-to-buffer t "If non-nil ess-help buffers are given focus during the display. The default is t (except when `focus-follows-mouse' and `mouse-autoselect-window' are both t)." :group 'ess-help :type 'boolean) (defcustom ess-help-own-frame nil "Controls whether ESS help buffers should start in a different frame. Possible values are: nil: Display help in current frame. 'one: All help buffers are shown in one dedicated frame. t: Each help buffer gets its own frame. The parameters of this frame are stored in `ess-help-frame-alist'. See also `inferior-ess-own-frame'." :group 'ess-help :type '(choice (const nil) (const one) (const t))) (defcustom ess-help-reuse-window t "If t, ESS tries to display new help buffers in the existing help window" :type 'boolean :group 'ess-help) (defcustom ess-help-frame-alist special-display-frame-alist "Alist of frame parameters used to create help frames. This defaults to `special-display-frame-alist' and is used only when the variable `ess-help-own-frame' is non-nil." :group 'ess-help :type 'alist) ; User changeable variables ;;;===================================================== ;;; Users note: Variables with document strings starting ;;; with a * are the ones you can generally change safely, and ;;; may have to upon occasion. (defvar ess-function-call-face 'ess-function-call-face "Face name to use for highlighting function calls.") (defvar ess-numbers-face 'ess-numbers-face "Face name to use for highlighting numbers.") (defvar ess-%op%-face 'ess-%op%-face "Face name to use for highlighting %op% operators.") (defface ess-function-call-face '((default (:slant normal :inherit font-lock-function-name-face))) "Font Lock face used to highlight function calls in ess buffers." :group 'ess) (defface ess-numbers-face '((default (:slant normal :inherit font-lock-type-face))) "Font Lock face used to highlight numbers in ess-mode buffers." :group 'ess) (defface ess-%op%-face '((default (:slant normal :inherit font-lock-keyword-face))) "Font Lock face used to highlight %op% operators in ess-mode buffers." :group 'ess) (defcustom ess-help-kill-bogus-buffers t "Non-nil means kill ESS help buffers immediately if they are \"bogus\"." :group 'ess-help :type 'boolean) (defvar ess-help-form 'separate-buffer "*Place to show help. NOT IMPLEMENTED YET. Choices are `separate-buffer', `s-process', `www'. The latter uses `browse-url' to find the location.") (defvar ess-help-web-search-command nil "Dialect specific command web help search. Passed to `ess-execute-dialect-specific' which see. ") (make-variable-buffer-local 'ess-help-web-search-command) (defvar ess-manual-lookup-command nil "Dialect specific command manual lookup. Passed to `ess-execute-dialect-specific' which see. ") (make-variable-buffer-local 'ess-manual-lookup-command) (defvar ess-reference-lookup-command nil "Dialect specific command for reference lookup.. Passed to `ess-execute-dialect-specific' which see. ") (make-variable-buffer-local 'ess-reference-lookup-command) (defvar ess-funargs-command nil "Dialect specific command to return a list of function arguments. See `ess-function-arguments' and .ess_funargs command in R and S+ for details of the format that should be returned.") (make-variable-buffer-local 'ess-funargs-command) (defvar ess-eldoc-function nil "Holds a dialect specific eldoc function, See `ess-R-eldoc-function' and `ess-julia-eldoc-function' for examples.") (defcustom ess-r-args-noargsmsg "No args found." "Message returned if \\[ess-r-args-get] cannot find a list of arguments." :group 'ess-R :type 'string) (defcustom ess-r-args-show-prefix "ARGS: " "A prefix string that is shown before the arguments list." :group 'ess-R :type 'string) (defcustom ess-r-args-show-as 'message "How ess-r-args-show should show the argument list. Possible values are: 'message' (the default) or 'tooltip'." :group 'ess-R :type '(choice (const :tag "message" :value 'message) (const :tag "tooltip" :value 'tooltip))) (defcustom ess-r-args-keep-silent ess-S-non-functions "List of functions names which should *not* trigger \\[ess-r-args-show]; Defaults to `ess-S-non-functions'." :group 'ess-R :type '(repeat string)) (defcustom ess-r-args-electric-paren nil "Non-nil means re-assign \"(\" to \\[ess-r-args-auto-show]." :group 'ess-R :type 'boolean) ; System variables ;;;===================================================== ;;; Users note: You will rarely have to change these ;;; variables. ;;*;; Variables relating to ess-help-mode ;;-- ess-help-S-.. and ess-help-R-.. : in ess-s-l.el (are used in ess-inf). (defvar ess-help-sec-keys-alist nil "Alist of (key . string) pairs for use in section searching.") (defvar ess-help-sec-regex nil "Reg(ular) Ex(pression) of section headers in help file") (make-variable-buffer-local 'ess-help-sec-keys-alist) (make-variable-buffer-local 'ess-help-sec-regex) ; julia-mode (defcustom inferior-julia-program-name (if (executable-find "julia-basic") "julia-basic" "julia") "julia' executable. Need to be a full path if julia executable is not in the `exec-path'" :group 'ess-Julia) (defvar julia-basic-offset 4 "Offset for julia code editing") ; ess-mode: editing S source ;;; This syntax table is required by ess-mode.el, ess-inf.el and ;;; ess-trns.el, so we provide it here. (defvar ess-mode-syntax-table nil "Syntax table for `ess-mode'.") (make-variable-buffer-local 'ess-mode-syntax-table) ; Buffer local customization stuff (defvar ess-source-modes '(ess-mode) "A list of modes used to determine if a buffer contains ess source code.") ;;; If a file is loaded into a buffer that is in one of these major modes, it ;;; is considered an ess source file. The function ess-load-file uses this to ;;; determine defaults. (defcustom ess-error-buffer-name "*ESS-errors*" "Name of buffer to keep process error messages in. Created for each process." :group 'ess-proc :type 'string) (defvar ess-error-regexp-alist nil "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.") (defcustom ess-verbose nil "Non-nil means write more information to `ess-dribble-buffer' than usual." :group 'ess-proc :type 'boolean) (defvar ess-dribble-buffer (generate-new-buffer "*ESS*") "Buffer for temporary use for setting default variable values. Used for recording status of the program, mainly for debugging.") (defvar ess-customize-alist nil "Variable settings to use for proper behavior. Not buffer local!") ;; TODO: fixme We cannot make it local as yet, Not list is set on inferior startup. ;; (make-variable-buffer-local 'ess-customize-alist) ;; (defvaralias 'ess-local-customize-alist 'ess-customize-alist) (defvar ess-local-customize-alist nil "Buffer local settings for proper behavior. Used to store the values for passing on to newly created buffers.") (make-variable-buffer-local 'ess-local-customize-alist) (defvar ess-mode-editing-alist nil "Variable settings for ess-mode.") (defvar ess-transcript-minor-mode nil "Non-nil if using `ess-transcript-mode' as a minor mode of some other mode.") (make-variable-buffer-local 'ess-transcript-minor-mode) (defvar ess-listing-minor-mode nil "Non-nil if using ess-listing-minor-mode.") (make-variable-buffer-local 'ess-listing-minor-mode) (provide 'ess-custom) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-custom.el ends here ess/lisp/ess-omg-d.el0000664000175000017500000001027712423756516013032 0ustar eddedd;;; ess-omg-d.el --- Omega customization ;; Copyright (C) 1999 A. J. Rossini ;; Copyright (C) 2000--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 15 August 1999 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S-PLUS 3.x customizations for ess-mode. ;;; Code: ;;; Requires and Autoloads: (require 'ess-omg-l) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defvar OMG-dialect-name "OMG" "Name of 'dialect' for Omega.") ;easily changeable in a user's .emacs (defvar OMG-customize-alist '((ess-local-customize-alist . 'OMG-customize-alist) (ess-language . "OMG") (ess-dialect . "omegahat") (ess-suffix . "omg") (ess-loop-timeout . 5000) (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-mode-editing-alist . OMG-editing-alist) (ess-mode-syntax-table . OMG-syntax-table) (ess-change-sp-regexp . "");fixme (if omegahat ever ..) (ess-help-sec-regex . ess-help-S+-sec-regex) (ess-help-sec-keys-alist . ess-help-S+sec-keys-alist) (ess-object-name-db-file . "ess-omg-namedb.el" ) (inferior-ess-program . inferior-OMG-program-name) (inferior-ess-objects-command . "objects(%d)\n") (inferior-ess-help-command . "help(\"%s\",pager=\"cat\",window=F)\n") (inferior-ess-exit-command . "q()\n") (inferior-ess-primary-prompt . "\\[[0-9]*\\]") (inferior-ess-secondary-prompt . ".. ?") (comint-use-prompt-regexp . t) (inferior-ess-start-file . nil) ;"~/.ess-omg") (inferior-ess-start-args . "")) "Variables to customize for OMG (Omegahat)") (defun OMG (&optional start-args) ; proc-name) "Call Omegahat, from the Omega Group for Statistical Computing." (interactive "P") (setq ess-customize-alist OMG-customize-alist) (ess-write-to-dribble-buffer (format "\n(OMG): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (let ((omg-start-args (concat inferior-ess-start-args (if start-args (read-string "Starting Args [possibly -CORBA] ? ") nil)))) (inferior-ess omg-start-args))) (fset 'omegahat 'OMG) (defun OMG-mode (&optional proc-name) "Major mode for editing Omegahat source. NOT EVEN STARTED." (interactive) (setq ess-customize-alist OMG-customize-alist) (ess-mode OMG-customize-alist proc-name) ;;(java-mode) (setq major-mode 'OMG-mode)) (fset 'omegahat-mode 'OMG-mode) (defun OMG-transcript-mode () "Omegahat transcript mode." (interactive) (ess-transcript-mode OMG-customize-alist)) ; Provide package (provide 'ess-omg-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-omg-d.el ends here ess/lisp/ess-rdired.el0000664000175000017500000004352612577152666013311 0ustar eddedd;;; ess-rdired.el --- prototype object browser for R, looks like dired mode. ;; Copyright (C) 2002--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Stephen Eglen ;; Created: Thu 24 Oct 2002 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is not part of GNU Emacs. ;; ess-rdired.el is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ess-rdired.el is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; This provides a dired-like buffer for R objects. Instead of ;; operating on files, we operate on R objects in the current ;; environment. Objects can be viewed, edited, deleted, plotted and ;; so on. ;;; Commentary: ;; Installation and usage. ;; ;; Load in this library, e.g. with the command: ;; (autoload 'ess-rdired "ess-rdired" "View *R* objects in a dired-like buffer." t) ;; ;; After loading this file, do "M-x R" to start an R session, then ;; create a few variables: ;; s <- sin(seq(from=0, to=8*pi, length=100)) ;; x <- c(1, 4, 9) ;; y <- rnorm(20) ;; z <- TRUE ;; Then in Emacs, do "M-x ess-rdired" and you should see the following in ;; the buffer *R dired*: ;; mode length ;; s numeric 100 ;; x numeric 3 ;; y numeric 20 ;; z logical 1 ;; Type "?" in the buffer to see the documentation. e.g. when the ;; cursor is on the line for `s', type 'p' to plot it, or `v' to view ;; its contents in a buffer. Then type 'd' to mark it for deletion. ;; How it works. ;; Most of the hardwork is done by the R routine .rdired.objects(), ;; which, when called, produces the list of objects in a tidy format. ;; This function is stored within the lisp variable `ess-rdired-objects', ;; and can be altered to provide other information if you so need it. ;; (Martin Maechler suggested providing output from str() here.) ;; Tested on Emacs 21.2, 21.3 pretest and XEmacs 21.1.14, using R 1.6. ;; Todo - compare functionality with ess-mouse-me (ess-mous.el). ;; Todo - How to select alternative environments? Currently only ;; shows objects in the .GlobalEnv? See BrowseEnv() in 1.6.x for way ;; of browsing other environments. ;; Todo - problem with fix -- have to wait for fix() command to return ;; before *R* buffer can be used again. This can get stuck, umm. not ;; sure what is going wrong here. Maybe add a hook to the temp buffer ;; so that when buffer is killed, we send an instruction to R to ;; update the value of the variable to the contents of the buffer. ;; This way *R* doesn't have to wait. ;; Todo - small bug in .rdired.objects -- if we have a variable called ;; `my.x', its value is replaced by the value of my.x used in the ;; sapply() calls within .rdired.objects(). ;;; Code: (defvar ess-rdired-objects "{.rdired.objects <- function(objs) { if (length(objs)==0) { \"No objects to view!\" } else { mode <- sapply(objs, function(my.x) { eval( parse( text=sprintf('data.class(get(\"%s\"))', my.x))) }) length <- sapply(objs, function(my.x) { eval( parse( text=sprintf('length(get(\"%s\"))', my.x))) }) size <- sapply(objs, function(my.x) { eval( parse( text=sprintf('object.size(get(\"%s\"))', my.x))) }) d <- data.frame(mode, length, size) var.names <- row.names(d) ## If any names contain spaces, we need to quote around them. quotes = rep('', length(var.names)) spaces = grep(' ', var.names) if (any(spaces)) quotes[spaces] <- '\"' var.names = paste(quotes, var.names, quotes, sep='') row.names(d) <- paste(' ', var.names, sep='') d } }; cat('\n'); print(.rdired.objects(ls()))}\n" "Function to call within R to print information on objects. The last line of this string should be the instruction to call the function which prints the output for rdired.") (defvar ess-rdired-buffer "*R dired*" "Name of buffer for displaying R objects.") (defvar ess-rdired-mode-map (let ((ess-rdired-mode-map (make-sparse-keymap))) (if (require 'hide-lines nil t) (define-key ess-rdired-mode-map "/" 'hide-lines)) (define-key ess-rdired-mode-map "?" 'ess-rdired-help) (define-key ess-rdired-mode-map "d" 'ess-rdired-delete) (define-key ess-rdired-mode-map "u" 'ess-rdired-undelete) (define-key ess-rdired-mode-map "x" 'ess-rdired-expunge) ;; editing requires a little more work. ;;(define-key ess-rdired-mode-map "e" 'ess-rdired-edit) (define-key ess-rdired-mode-map "v" 'ess-rdired-view) (define-key ess-rdired-mode-map "V" 'ess-rdired-View) (define-key ess-rdired-mode-map "p" 'ess-rdired-plot) (define-key ess-rdired-mode-map "s" 'ess-rdired-sort) (define-key ess-rdired-mode-map "r" 'ess-rdired-reverse) (define-key ess-rdired-mode-map "q" 'ess-rdired-quit) (define-key ess-rdired-mode-map "y" 'ess-rdired-type) ;what type? (define-key ess-rdired-mode-map " " 'ess-rdired-next-line) (define-key ess-rdired-mode-map [backspace] 'ess-rdired-previous-line) (define-key ess-rdired-mode-map "\C-n" 'ess-rdired-next-line) (define-key ess-rdired-mode-map "\C-p" 'ess-rdired-previous-line) ;; (define-key ess-rdired-mode-map "n" 'ess-rdired-next-line) ;; (define-key ess-rdired-mode-map "p" 'ess-rdired-previous-line) ;; R mode keybindings. (define-key ess-rdired-mode-map "\C-c\C-s" 'ess-rdired-switch-process) (define-key ess-rdired-mode-map "\C-c\C-y" 'ess-switch-to-ESS) (define-key ess-rdired-mode-map "\C-c\C-z" 'ess-switch-to-end-of-ESS) (define-key ess-rdired-mode-map [down] 'ess-rdired-next-line) (define-key ess-rdired-mode-map [up] 'ess-rdired-previous-line) (define-key ess-rdired-mode-map "g" 'revert-buffer) (if (featurep 'xemacs) (define-key ess-rdired-mode-map [button2] 'ess-rdired-mouse-view) (define-key ess-rdired-mode-map [mouse-2] 'ess-rdired-mouse-view) ) ess-rdired-mode-map)) (defun ess-rdired-mode () "Major mode for output from `ess-rdired'. `ess-rdired' provides a dired-like mode for R objects. It shows the list of current objects in the current environment, one-per-line. You can then examine these objects, plot them, and so on. \\{ess-rdired-mode-map}" ;; (kill-all-local-variables) (make-local-variable 'revert-buffer-function) (setq revert-buffer-function 'ess-rdired-revert-buffer) (use-local-map ess-rdired-mode-map) (setq major-mode 'ess-rdired-mode) (setq mode-name (concat "RDired " ess-local-process-name)) (run-mode-hooks 'ess-rdired-mode-hook)) (defun ess-rdired-mode-hook nil "Run upon entering `ess-rdired-mode'.") (defvar ess-rdired-sort-num nil) ;silence the compiler. ;; but see following defun -- maybe it should be buffer local. (defun ess-rdired () "Run dired-like mode on R objects. This is the main function. See documentation for `ess-rdired-mode' though for more information!" (interactive) (let ((proc ess-local-process-name) (buff (get-buffer-create ess-rdired-buffer))) (ess-command ess-rdired-objects buff) (ess-setq-vars-local (symbol-value ess-local-customize-alist) buff) (with-current-buffer buff (setq ess-local-process-name proc) (ess-rdired-mode) ;; When definiting the function .rdired.objects(), a "+ " is printed ;; for every line of the function definition; these are deleted ;; here. (goto-char (point-min)) (delete-region (point-min) (1+ (point-at-eol))) ;; todo: not sure how to make ess-rdired-sort-num buffer local? ;;(set (make-local-variable 'ess-rdired-sort-num) 2) ;;(make-variable-buffer-local 'ess-rdired-sort-num) (setq ess-rdired-sort-num 1) (ess-rdired-insert-set-properties (save-excursion (goto-char (point-min)) (forward-line 1) (point)) (point-max)) (setq buffer-read-only t) ) (pop-to-buffer buff) )) (defun ess-rdired-object () "Return name of object on current line. Handle special case when object contains spaces." (save-excursion (beginning-of-line) (forward-char 2) (cond ((looking-at " ") ; First line? nil) ((looking-at "\"") ; Object name contains spaces? (let (beg) (setq beg (point)) (forward-char 1) (search-forward "\"") (buffer-substring-no-properties beg (point)))) (t ;should be a regular object. (let (beg) (setq beg (point)) (search-forward " ") ;assume space follows object name. (buffer-substring-no-properties beg (1- (point)))))))) (defun ess-rdired-edit () "Edit (fix) the object at point." (interactive) (let ((objname (ess-rdired-object))) (ess-command (concat "edit(" objname ")\n")))) (defun ess-rdired-view () "View the object at point." (interactive) (let ((objname (ess-rdired-object))) (ess-execute (ess-rdired-get objname) nil "R view" ))) (defun ess-rdired-get (name) "Generate R code to get the value of the variable name. This is complicated because some variables might have spaces in their names. Otherwise, we could just pass the variable name directly to *R*." (concat "get(" (ess-rdired-quote name) ")") ) (defun ess-rdired-quote (name) "Quote name if not already quoted." (if (equal (substring name 0 1) "\"") name (concat "\"" name "\""))) (defun ess-rdired-View () "View the object at point in its own buffer. Like `ess-rdired-view', but the object gets its own buffer name." (interactive) (let ((objname (ess-rdired-object))) (ess-execute (ess-rdired-get objname) nil (concat "R view " objname )))) (defun ess-rdired-plot () "Plot the object on current line." (interactive) (let ((objname (ess-rdired-object))) (ess-eval-linewise (format "plot(%s)" (ess-rdired-get objname))))) (defun ess-rdired-type () "Run the mode() on command at point. Named type because of similarity with the dired command bound to y key." (interactive) (let ((objname (ess-rdired-object)) ;; create a temp buffer, and then show output in echo area (tmpbuf (get-buffer-create "**ess-rdired-mode**"))) (if objname (progn (ess-command (concat "mode(" (ess-rdired-get objname) ")\n") tmpbuf ) (set-buffer tmpbuf) (message (concat objname ": " (buffer-substring (+ 4 (point-min)) (1- (point-max))))) (kill-buffer tmpbuf))))) (defun ess-rdired-delete (arg) "Mark the current (or next ARG) objects for deletion. If point is on first line, all objects are marked for deletion." (interactive "p") (ess-rdired-mark "D" arg)) (defun ess-rdired-undelete (arg) "Unmark the current (or next ARG) objects. If point is on first line, all objects will be unmarked." (interactive "p") (ess-rdired-mark " " arg)) (defun ess-rdired-mark (mark-char arg) "Mark the object, using MARK-CHAR, on current line (or next ARG lines)." ;; If we are on first line, mark all lines. (let ((buffer-read-only nil) move) (if (eq (point-min) (save-excursion (beginning-of-line) (point))) (progn ;; we are on first line, so make a note of point, and count ;; how many objects we want to delete. Then at end of defun, ;; restore point. (setq move (point)) (forward-line 1) (setq arg (count-lines (point) (point-max))))) (while (and (> arg 0) (not (eobp))) (setq arg (1- arg)) (beginning-of-line) (progn (insert mark-char) (delete-char 1) (forward-line 1))) (if move (goto-char move)))) (defun ess-rdired-expunge () "Delete the marked objects. User is queried first to check that objects should really be deleted." (interactive) (let ((objs "rm(") (count 0)) (save-excursion (goto-char (point-min)) (forward-line 1) (while (< (count-lines (point-min) (point)) (count-lines (point-min) (point-max))) (beginning-of-line) (if (looking-at "^D ") (setq count (1+ count) objs (concat objs (ess-rdired-object) ", " ))) (forward-line 1) )) (if (> count 0) ;; found objects to delete (progn (setq objs (concat (substring objs 0 (- (length objs) 2)) ")\n")) (if (yes-or-no-p (format "Delete %d %s " count (if (> count 1) "objects" "object"))) (progn (ess-eval-linewise objs nil nil nil 'wait) (ess-rdired) ))) ;; else nothing to delete (message "no objects set to delete") ))) ;; Fancy delete method, based on dired. Bit too much for our needs? ;; (defun ess-rdired-expunge () ;; "Delete the marked objects. ;; User is queried first to check that objects should really be deleted." ;; (interactive) ;; (let ((objs) ;; (cmd "rm(")) ;; (save-excursion ;; (goto-line 2) ;; (while (< (count-lines (point-min) (point)) ;; (count-lines (point-min) (point-max))) ;; (beginning-of-line) ;; (if (looking-at "^D ") ;; (progn ;; (setq objs (cons (ess-rdired-object) objs )) ;; (setq cmd (concat cmd (ess-rdired-object) ", ")) ;; )) ;; (forward-line 1) ;; )) ;; (if (> (length objs) 0) ;; ;; found objects to delete ;; (if ;; (dired-mark-pop-up "*RDired deletions*" 'delete ;; objs dired-deletion-confirmer ;; (format "delete %s " ;; (dired-mark-prompt nil objs))) ;; ;; should delete the objects. ;; (progn ;; (setq cmd (concat (substring cmd 0 (- (length cmd) 2)) ;; ")\n")) ;; (ess-command cmd) ;; (ess-rdired))) ;; ;; else nothing to delete ;; (message "no objects set to delete") ;; ))) (defun ess-rdired-quit () "Quit the R dired buffer." (interactive) (kill-buffer ess-rdired-buffer)) (defun ess-rdired-revert-buffer (ignore noconfirm) "Update the buffer list (in case object list has changed). Arguments IGNORE and NOCONFIRM currently not used." (ess-rdired)) (defun ess-rdired-help () "Show help for `ess-rdired-mode'." (interactive) (describe-function 'ess-rdired-mode)) (defun ess-rdired-sort () "Sort the rdired output according to one of the columns. Rotate between the alternative sorting methods." (interactive) (setq ess-rdired-sort-num (1+ ess-rdired-sort-num)) (let ((buffer-read-only nil) (beg (save-excursion (goto-char (point-min)) (forward-line 1) (point))) (end (point-max))) (if (> ess-rdired-sort-num 4) (setq ess-rdired-sort-num 1)) (cond ((eq ess-rdired-sort-num 1) (sort-fields 1 beg end)) ((eq ess-rdired-sort-num 2) (sort-fields 2 beg end)) ((eq ess-rdired-sort-num 3) (sort-numeric-fields 3 beg end)) ((eq ess-rdired-sort-num 4) (sort-numeric-fields 4 beg end))))) (defun ess-rdired-reverse () "Reverse the current sort order." (interactive) (let ((buffer-read-only nil) (beg (save-excursion (goto-char (point-min)) (forward-line 1) (point))) (end (point-max))) (reverse-region beg end))) (defun ess-rdired-next-line (arg) "Move down lines then position at object. Optional prefix ARG says how many lines to move; default is one line." (interactive "p") (forward-line arg) (ess-rdired-move-to-object)) (defun ess-rdired-previous-line (arg) "Move up lines then position at object. Optional prefix ARG says how many lines to move; default is one line." (interactive "p") (forward-line (- (or arg 1))) ; -1 if arg was nil (ess-rdired-move-to-object)) (defun ess-rdired-move-to-object () "Put point at start of object." (beginning-of-line) (forward-char 2) ) (defun ess-rdired-mouse-view (event) "In rdired, visit the object on the line you click on." (interactive "e") (let (window pos) (save-excursion (if (featurep 'xemacs) ;; XEmacs (setq window (event-window event) pos (event-point event)) ;; Emacs (setq window (posn-window (event-end event)) pos (posn-point (event-end event)))) (if (not (windowp window)) (error "No file chosen")) (set-buffer (window-buffer window)) (goto-char pos) (ess-rdired-view)))) (defun ess-rdired-insert-set-properties (beg end) "Add mouse highlighting to each object name in the R dired buffer." (save-excursion (goto-char beg) (while (< (point) end) (ess-rdired-move-to-object) (add-text-properties (point) (save-excursion (search-forward " ") (1- (point))) '(mouse-face highlight help-echo "mouse-2: view object in other window")) (forward-line 1)))) (defun ess-rdired-switch-process () "Switch to examine different *R* process. If you have multiple R processes running, e.g. *R*, *R:2*, *R:3*, you can use this command to choose which R process you would like to examine. After switching to a new process, the buffer is updated." (interactive) (ess-switch-process) (ess-rdired)) ;;; ess-rdired.el ends here. ess/lisp/ess-rutils.el0000664000175000017500000004213212423756516013344 0ustar eddedd;;; ess-rutils.el --- R functions and keybindings to use in iESS. ;; Author: Sebastian Luque ;; Created: Thu Nov 10 02:20:36 2004 (UTC) ;; Last-Updated: 2013-09-22T16:08:47+0000 ;; By: Sebastian P. Luque ;; Version: $Id$ ;; Compatibility: GNU Emacs >= 22.0.50.1 ;; Copyright (c) 2005-2013 Sebastian P. Luque ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This library provides key bindings for performing basic R functions, ;; such as loading and managing packages, as well as object manipulation ;; (listing, viewing, and deleting), and an alternative to RSiteSearch() ;; that uses the browse-url function. Load the library with the method you ;; prefer (e.g. M-x load-file), but the easiest is probably to: a) make ;; sure your load-path variable includes the directory where ess-rutils.el ;; resides, and b) include (require 'ess-rutils) statement in your ;; ~/.emacs. ;; ;; Usage: ;; ;; Once R is started with M-x R, you should have the key bindings defined ;; at the end of this file working in your iESS process buffers. Simply ;; type the desired key binding. ;; ;; Acknowledgements: ;; ;; I am grateful to John Fox for having written his init.el file for ;; XEmacs, which motivated this Emacs alternative. I wanted to add some ;; object management comforts and came across Stephen Eglen's ;; ess-rdired.el, which provides a lot of these. ess-rutils.el builds upon ;; on a *lot* of ideas from ess-rdired.el. ;;; Code: ;; Autoloads and requires (autoload 'ess-rdired "ess-rdired" "View *R* objects in a dired-like buffer." t) (require 'ess-site) (defvar ess-rutils-buf "*R temp*" "Name of temporary R buffer.") (defvar ess-rutils-mode-map nil "Keymap for the *R temp* buffer.") (defvar ess-rutils-rhtml-fn (expand-file-name "ess-rutils-help-start.R" ess-etc-directory) "Path to the file defining the R function .rutils.help.start(). This file is loaded into the inferior R process so that `ess-rutils-html-docs' can use .rutils.help.start().") (if ess-rutils-mode-map () (setq ess-rutils-mode-map (make-sparse-keymap)) (define-key ess-rutils-mode-map "l" 'ess-rutils-loadpkg) (define-key ess-rutils-mode-map "i" 'ess-rutils-mark-install) (define-key ess-rutils-mode-map "I" 'ess-rutils-install) (define-key ess-rutils-mode-map "u" 'ess-rutils-unmark) (define-key ess-rutils-mode-map "q" 'ess-rutils-quit) (define-key ess-rutils-mode-map "?" 'ess-rutils-help)) (defun ess-rutils-mode () "Major mode for output from `ess-rutils-local-pkgs' and `ess-rutils-repos-pkgs'. Useful bindings to handle package loading and installing. \\{ess-rutils-mode-map}" (kill-all-local-variables) (use-local-map ess-rutils-mode-map) (setq major-mode 'ess-rutils-mode) (setq mode-name (concat "R utils " ess-local-process-name))) (defun ess-rutils-local-pkgs () "List all packages in all libraries." (interactive) (if (get-buffer ess-rutils-buf) (progn (set-buffer ess-rutils-buf) (setq buffer-read-only nil))) (ess-execute "writeLines(paste(' ', sort(.packages(all.available=TRUE)), sep=''))" nil (substring ess-rutils-buf 1 (- (length ess-rutils-buf) 1))) (pop-to-buffer ess-rutils-buf) (save-excursion (beginning-of-line) (open-line 1) (insert "**Available packages in all local R libraries**")) (setq buffer-read-only t) (ess-rutils-mode) (if (featurep 'fit-frame) (fit-frame))) (defun ess-rutils-namepkg () "Return name of the package on current line." (save-excursion (beginning-of-line) (if (looking-at "*") nil (forward-char 2) (let (beg) (setq beg (point)) (end-of-line) ;assume package names are separated by newlines. (buffer-substring-no-properties beg (point)))))) (defun ess-rutils-loadpkg () "Load package from a library." (interactive) (let ((oklocal nil)) (save-excursion (goto-char (point-min)) (if (search-forward "libraries**" nil t) (setq oklocal t))) (if oklocal (progn (setq pkg (ess-rutils-namepkg)) (ess-execute (concat "library('" pkg "', character.only=TRUE)") 'buffer)) nil))) (defun ess-rutils-repos-pkgs () "List available packages from the repositories as listed by getOptions(\"repos\") in the current R session." (interactive) (if (get-buffer ess-rutils-buf) (progn (set-buffer ess-rutils-buf) (setq buffer-read-only nil))) (ess-execute (concat "writeLines(paste(' \"', " "rownames(available.packages()), '\"', sep=''))") nil (substring ess-rutils-buf 1 (- (length ess-rutils-buf) 1))) (pop-to-buffer ess-rutils-buf) (save-excursion (kill-line 5) (insert "**packages available to install**\n")) (setq buffer-read-only t) (ess-rutils-mode) (if (featurep 'fit-frame) (fit-frame))) (defun ess-rutils-mark-install (arg) "Mark the current package for installing. ARG lines to mark is passed to `ess-rutils-mark'." (interactive "p") ;; if this is not an install package buffer return nil. (let ((okmark nil)) (save-excursion (goto-char (point-min)) (if (search-forward "install**" nil t) (setq okmark t))) (if okmark (ess-rutils-mark "I" arg) nil))) (defun ess-rutils-unmark (arg) "Unmark the packages, passing ARG lines to unmark to `ess-rutils-mark'." (interactive "p") (ess-rutils-mark " " arg)) ;; The next two functions almost verbatim from ess-rdired.el. (defun ess-rutils-mark (mark-char arg) "Use MARK-CHAR to mark package on current line, or next ARG lines." ;; If we are on first line, mark all lines. (let ((buffer-read-only nil) move) (if (eq (point-min) (save-excursion (beginning-of-line) (point))) (progn ;; we are on first line, so make a note of point, and count ;; how many objects we want to delete. Then at end of defun, ;; restore point. (setq move (point)) (forward-line 1) (setq arg (count-lines (point) (point-max))))) (while (and (> arg 0) (not (eobp))) (setq arg (1- arg)) (beginning-of-line) (progn (insert mark-char) (delete-char 1) (forward-line 1))) (if move (goto-char move)))) (defun ess-rutils-install () "Install all packages flagged for installation, and return to the iESS buffer. User is asked for confirmation." (interactive) (let ((inst "install.packages(c(") (count 0)) (save-excursion (goto-line 2) ;; as long as number of lines between buffer start and point is smaller ;; than the total number of lines in buffer, go to the beginning of the ;; line, check if line is flagged, and if it is, advance the counter by ;; one, create the root of install function, add the package name, ;; insert a comma, and move forward a line. (while (< (count-lines (point-min) (point)) (count-lines (point-min) (point-max))) (beginning-of-line) (if (looking-at "^I ") (setq count (1+ count) inst (concat inst (ess-rutils-namepkg) ", " ))) (forward-line 1))) (if (> count 0) ;found packages to install (progn ;; Fix the install function created before and close it. (setq inst (concat (substring inst 0 (- (length inst) 2)) "))")) ;; (if (yes-or-no-p (format "Install %d %s " count (if (> count 1) "packages" "package"))) (progn (ess-execute inst 'buffer) (ess-rutils-quit)))) ;; else nothing to install (message "no packages flagged to install")))) (defun ess-rutils-update-pkgs (lib repos) "Update packages in library LIB and repos REPOS. Defaults are the first element returned by .libPaths() for LIB, and the repository named CRAN returned by getOption(\"repos\") for REPOS. This also uses checkBuilt=TRUE to rebuild installed packages if needed." (interactive "DPath to library to update: \nsrepos: ") (if (string= "" lib) (setq lib (car (ess-get-words-from-vector "as.character(.libPaths())\n")))) (if (string= "" repos) (setq repos (car (ess-get-words-from-vector "as.character(getOption(\"repos\")[\"CRAN\"])\n")))) (ess-execute (concat "update.packages(lib.loc='" lib "', repos='" repos "', ask=FALSE, checkBuilt=TRUE)") 'buffer)) (defun ess-rutils-apropos (string) "Search for STRING using apropos." (interactive "sApropos search for? ") (if (get-buffer ess-rutils-buf) (progn (set-buffer ess-rutils-buf) (setq buffer-read-only nil))) (ess-execute (concat "apropos('" string "')") nil (substring ess-rutils-buf 1 (- (length ess-rutils-buf) 1))) (pop-to-buffer ess-rutils-buf) (setq buffer-read-only t) (ess-rutils-mode)) (defun ess-rutils-rm-all () "Remove all R objects." (interactive) (if (y-or-n-p "Delete all objects? ") (ess-execute "rm(list=ls())" 'buffer))) (defun ess-rutils-objs () "Manipulate R objects; wrapper for `ess-rdired'." (interactive) (ess-rdired) (if (featurep 'fit-frame) (fit-frame))) (defun ess-rutils-load-wkspc (file) "Load workspace FILE into R." (interactive "fFile with workspace to load: ") (ess-execute (concat "load('" file "')") 'buffer)) (defun ess-rutils-save-wkspc (file) "Save FILE workspace. File extension not required." (interactive "FSave workspace to file (no extension): ") (ess-execute (concat "save.image('" file ".RData')") 'buffer)) (defun ess-rutils-quit () "Kill the ess-rutils buffer and return to the iESS buffer." (interactive) (ess-switch-to-end-of-ESS) (kill-buffer ess-rutils-buf)) (defun ess-rutils-html-docs (&optional remote) "Use `browse-url' to navigate R html documentation. Documentation is produced by a modified help.start(), that returns the URL produced by GNU R's http server. This function is defined in a file given by the path in variable `ess-rutils-rhtml-fn'. If called with a prefix, the modified help.start() is called with update=TRUE. The optional REMOTE argument should be a string with a valid URL for the 'R_HOME' directory on a remote server (defaults to NULL)." (interactive) (let* ((update (if current-prefix-arg "update=TRUE" "update=FALSE")) (remote (if (or (and remote (not (string= "" remote)))) (concat "remote=" remote) "remote=NULL")) (rhtml (format ".rutils.help.start(%s, %s)\n" update remote)) (tmpbuf (get-buffer-create "**ess-rutils-mode**"))) (ess-command rhtml tmpbuf) (set-buffer tmpbuf) (let* ((begurl (search-backward "http://")) (endurl (search-forward "index.html")) (url (buffer-substring-no-properties begurl endurl))) (browse-url url)) (kill-buffer tmpbuf))) (defun ess-rutils-rsitesearch (string) "Search the R archives for STRING, using default criteria, and show results using `browse-url'. If called with a prefix, options are offered (with completion) for matches per page, sections of the archives to search, displaying results in long or short formats, and sorting by any given field. Options should be separated by value of `crm-default-separator'." (interactive "sSearch string: ") (let ((site "http://search.r-project.org/cgi-bin/namazu.cgi?query=") (okstring (ess-replace-regexp-in-string " +" "+" string))) (if current-prefix-arg (let ((mpp (concat "&max=" (completing-read "Matches per page: " '(("20" 1) ("30" 2) ("40" 3) ("50" 4) ("100" 5))))) (format (concat "&result=" (completing-read "Format: " '(("normal" 1) ("short" 2)) nil t "normal" nil "normal"))) (sortby (concat "&sort=" (completing-read "Sort by: " '(("score" 1) ("date:late" 2) ("date:early" 3) ("field:subject:ascending" 4) ("field:subject:decending" 5) ("field:from:ascending" 6) ("field:from:decending" 7) ("field:size:ascending" 8) ("field:size:decending" 9)) nil t "score" nil "score"))) (restrict (concat "&idxname=" (mapconcat 'identity (completing-read-multiple "Limit search to: " '(("Rhelp02a" 1) ("functions" 2) ("docs" 3) ("Rhelp01" 4)) nil t "Rhelp02a,functions,docs" nil "Rhelp02a,functions,docs") "&idxname=")))) (browse-url (concat site okstring mpp format sortby restrict))) (browse-url (concat site okstring "&max=20&result=normal&sort=score" "&idxname=Rhelp02a&idxname=functions&idxname=docs"))))) (defun ess-rutils-help () "Show help on `ess-rutils-mode'." (interactive) (describe-function 'ess-rutils-mode)) (defun ess-rutils-help-search (string) "Search for STRING using help.search()." (interactive "sString to search for? ") (if (get-buffer ess-rutils-buf) (progn (set-buffer ess-rutils-buf) (setq buffer-read-only nil))) (ess-execute (concat "help.search('" string "')") nil (substring ess-rutils-buf 1 (- (length ess-rutils-buf) 1))) (pop-to-buffer ess-rutils-buf) (setq buffer-read-only t) (ess-rutils-mode)) ;; Customizable variable to allow ess-rutils-keys to activate default key bindings. ;; Suggested by Richard M. Heiberger. (defcustom ess-rutils-keys t "Non-nil means activate ess-rutils keybindings and menu." :group 'ess-R :type 'boolean) ;; Keybindings (defun ess-rutils-keys () "Provide key bindings." (interactive) (when ess-rutils-keys (define-key inferior-ess-mode-map [(control c) (control \.) (l)] 'ess-rutils-local-pkgs) (define-key inferior-ess-mode-map [(control c) (control \.) (r)] 'ess-rutils-repos-pkgs) (define-key inferior-ess-mode-map [(control c) (control \.) (u)] 'ess-rutils-update-pkgs) (define-key inferior-ess-mode-map [(control c) (control \.) (a)] 'ess-rutils-apropos) (define-key inferior-ess-mode-map [(control c) (control \.) (m)] 'ess-rutils-rm-all) (define-key inferior-ess-mode-map [(control c) (control \.) (o)] 'ess-rutils-objs) (define-key inferior-ess-mode-map [(control c) (control \.) (w)] 'ess-rutils-load-wkspc) (define-key inferior-ess-mode-map [(control c) (control \.) (s)] 'ess-rutils-save-wkspc) (define-key inferior-ess-mode-map [(control c) (control \.) (d)] 'ess-change-directory) (define-key inferior-ess-mode-map [(control c) (control \.) (H)] 'ess-rutils-html-docs))) (easy-menu-define ess-rutils-mode-menu inferior-ess-mode-menu "Submenu of `inferior-ess-mode' to use with RUtils." '("RUtils" ["Manage objects" ess-rutils-objs t] ["Remove objects" ess-rutils-rm-all t] "------" ["Local packages" ess-rutils-local-pkgs t] ["Packages in repositories" ess-rutils-repos-pkgs t] ["Update packages" ess-rutils-update-pkgs t] "------" ["Load workspace" ess-rutils-load-wkspc t] ["Save workspace" ess-rutils-save-wkspc t] ["Change directory" ess-change-directory t] "------" ["Browse HTML" ess-rutils-html-docs t] ["Apropos" ess-rutils-apropos t])) (when (featurep 'xemacs) (defun ess-rutils-mode-xemacs-menu () "Hook to install `ess-rutils-mode' menu for XEmacs (with easymenu)." (if 'inferior-ess-mode ;; Why does using nil for 2nd arg put menu at top level? (easy-menu-add-item inferior-ess-mode-menu nil ess-rutils-mode-menu) (easy-menu-remove-item inferior-ess-mode-menu nil ess-rutils-mode-menu))) (add-hook 'inferior-ess-mode-hook 'ess-rutils-mode-xemacs-menu t)) (unless (featurep 'xemacs) (easy-menu-add-item inferior-ess-mode-menu nil ess-rutils-mode-menu)) (add-hook 'inferior-ess-mode-hook 'ess-rutils-keys t) (add-hook 'ess-R-post-run-hook (lambda () (ess--inject-code-from-file ess-rutils-rhtml-fn)) t) (provide 'ess-rutils) ;;; ess-rutils.el ends here ess/lisp/ess-help.el0000664000175000017500000012670112601651046012745 0ustar eddedd;;; ess-help.el --- Support for viewing ESS help files ;; Copyright (C) 1989-1994 Bates, Kademan, Ritter and Smith ;; Copyright (C) 1997, A.J. Rossini ;; Copyright (C) 1998--2001 A.J. Rossini, Martin Maechler, Kurt Hornik and ;; Richard M. Heiberger . ;; Copyright (C) 2001--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: David Smith ;; Created: 7 Jan 1994 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for dealing with ESS help files. See README. where ;; is one of `S', `SAS', `Stata'or `XLispStat'. ;;; Code: ; Requires and autoloads (eval-when-compile (require 'tramp) (require 'reporter) (require 'ess-inf) (require 'info)) (require 'ess) (autoload 'ess-eval-region "ess-inf" "[autoload]" t) (autoload 'ess-eval-region-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-function "ess-inf" "[autoload]" t) (autoload 'ess-eval-function-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-line "ess-inf" "[autoload]" t) (autoload 'ess-eval-line-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-line-and-step "ess-inf" "[autoload]" t) (autoload 'ess-with-current-buffer "ess-inf" "[autoload]" t) (autoload 'ess-goto-beginning-of-function-or-para "ess-mode" "[autoload]" t) (autoload 'ess-goto-end-of-function-or-para "ess-mode" "[autoload]" t) (autoload 'ess-load-file "ess-inf" "[autoload]" t) (autoload 'ess-command "ess-inf" "(autoload)" nil) (autoload 'ess-display-temp-buffer "ess-inf" "(autoload)" nil) (autoload 'ess-switch-to-ESS "ess-inf" "(autoload)" nil) (autoload 'ess-read-object-name-default "ess-inf" "(autoload)" nil) (autoload 'ess-make-buffer-current "ess-inf" "(autoload)" nil) (autoload 'ess-search-list "ess-inf" "(autoload)" nil) (autoload 'ess-get-object-list "ess-inf" "(autoload)" nil) (autoload 'ess-ddeclient-p "ess-inf" "(autoload)" nil) (autoload 'ess-display-help-on-object-ddeclient "ess-dde" "(autoload)" nil) (autoload 'tramp-tramp-file-p "tramp" "(autoload).") (autoload 'tramp-file-name-localname "tramp" "(autoload).") (autoload 'tramp-dissect-file-name "tramp" "(autoload).") ; ess-help-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; In this section: ;;;; ;;;; * The function ess-display-help-on-object ;;;; * The major mode ess-help-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun ess--help-get-bogus-buffer-substring (buffer &optional nr-first) "Return non-nil if BUFFER looks like a bogus ESS help buffer. Return the pair (match-beg. match-end) which can be used in error message. NR-FIRST is the number of characters at the start of the buffer to examine when deciding if the buffer if bogus. If nil, the first 150 characters of the buffer are searched." (if (not nr-first) (setq nr-first 150)) (with-current-buffer buffer (let ((PM (point-min)) (case-fold-search t) searching res) (setq res (or ;; evaluate up to first non-nil (or end): (< (- (point-max) PM) 80); buffer less than 80 chars (not (setq searching t)) ;; todo: move to customize-alist (progn (goto-char PM) ;; R: (re-search-forward "Error in help" nr-first t)) (progn (goto-char PM) ;; S-plus 5.1 : (re-search-forward "^cat: .*--" nr-first t)) (progn (goto-char PM) ;; S version 3 ; R : (re-search-forward "no documentation .+" nr-first t)) (progn (goto-char PM) ;; stata (re-search-forward "^help .*not found" nr-first t)) )) (ess-write-to-dribble-buffer (format " |--> %s [searching %s]\n" res searching)) (when res (if searching (buffer-substring (match-beginning 0) (match-end 0)) (buffer-string)))))) (defvar ess-help-type nil "Type of help file, help, index, vingettes etc. Local in ess-help buffers.") (make-variable-buffer-local 'ess-help-type) (defvar ess-help-object nil "Name of the object the help is displayed for. Is name of the package for package index. Local in ess-help buffers.") (make-variable-buffer-local 'ess-help-object) (defun ess-display-help-on-object (object &optional command) "Display documentation for OBJECT in another window. If prefix arg is given, force an update of the cached help topics and query the ESS process for the help file instead of reusing an existing buffer if it exists. Uses the variable `inferior-ess-help-command' for the actual help command. Prompts for the object name based on the cursor location for all cases except the S-Plus GUI. With S-Plus on Windows (both GUI and in an inferior emacs buffer) the GUI help window is used. If COMMAND is suplied, it is used instead of `inferior-ess-help-command'." (interactive (progn (ess-force-buffer-current) (when current-prefix-arg ;update cache if prefix (ess-process-put 'sp-for-help-changed? t)) (if (ess-ddeclient-p) (list (read-string "Help on: ")) (list (ess-find-help-file "Help on"))))) (if (or (ess-ddeclient-p) (equal inferior-ess-help-filetype "chm")) (if (ess-ddeclient-p) (ess-display-help-on-object-ddeclient object) ;; ddeclient version (ess-eval-linewise (concat "help(" object ")"))) ;; "chm" version ;; else: "normal", non-DDE behavior: (let* ((hb-name (concat "*help[" ess-current-process-name "](" (replace-regexp-in-string "^\\?\\|`" "" object) ")*")) (old-hb-p (get-buffer hb-name)) (tbuffer (get-buffer-create hb-name))) (when (or (not old-hb-p) current-prefix-arg (ess--help-get-bogus-buffer-substring old-hb-p)) (ess-with-current-buffer tbuffer (setq ess-help-object object ess-help-type 'help) (ess--flush-help-into-current-buffer object command))) (unless (ess--help-kill-bogus-buffer-maybe tbuffer) (ess--switch-to-help-buffer tbuffer))))) (defun ess--flush-help-into-current-buffer (object &optional command dont-ask) (ess-write-to-dribble-buffer (format "(ess-help '%s' start ..\n" (buffer-name (current-buffer)))) ;; Ask the corresponding ESS process for the help file: (if buffer-read-only (setq buffer-read-only nil)) (delete-region (point-min) (point-max)) (ess-help-mode) (when (and (null command) (string-match "^R" ess-dialect)) ;;VS[16-12-2012]: ugly hack to avoid tcl/tk dialogues (let ((packs (ess-get-words-from-vector (format "as.character(help('%s'))\n" object)))) (when (> (length packs) 1) (setq command (format ;; crippled S3 :( "do.call(structure, c('%s', attributes(help('%s'))))\n" (if dont-ask (car packs) (ess-completing-read "Choose location" packs nil t)) object))))) (ess-command (cond ((and command (string-match-p "%s" command)) (format command object)) ;; avoid formatting commands with % in them (like %>%) (command command) (t (format inferior-ess-help-command object))) (current-buffer)) (ess-help-underline) ;;VS[03-09-2012]: todo: this should not be here: ;; Stata is clean, so we get a big BARF from this. (unless (string= ess-language "STA") (ess-nuke-help-bs)) (goto-char (point-min)) (set-buffer-modified-p 'nil) (setq buffer-read-only t) (setq truncate-lines nil)) (defun ess--help-kill-bogus-buffer-maybe (buffer) "Internal, try to kill bogus buffer with message. Return t if killed." (when ess-help-kill-bogus-buffers (let ((bog-mes (ess--help-get-bogus-buffer-substring buffer))) (when bog-mes (when (< (length bog-mes) 10) ;;no message at all, how to treat this properly? (setq bog-mes (format "No documentation found; %s" bog-mes))) (ess-write-to-dribble-buffer (format "(ess-help: kill bogus buffer %s ..\n" (buffer-name buffer))) (message "%s" (replace-regexp-in-string "\n" "" bog-mes)) ;; (ding) ;; don't ding, in julia a lot of doc strings are very short (kill-buffer buffer))))) (defun ess-display-help-in-browser () "Displaying html help where available, using \\[browse-url]." (interactive) ;; Three ways to find html help, 1) ask sub-process 2) get url/file from subproces ;; 3) call elisp function to get the file path ;; For 2 and 3 call browse-url on the output (let (com-html-help ;1) command for sub-process to trigger ;help, must contain %s for help obj com-get-file-path ;2) command for sub-process to return a ; location for the help page, must ; contain %s for help obj fun-get-file-path ;3) elisp function to return the ;location, gets one argument, help topic not-implemented ) (cond ((string-match "^R" ess-dialect) (setq com-html-help "help('%s', help_type='html')\n")) (t (setq not-implemented t)) ) (if not-implemented (message "Sorry, not implemented for %s " ess-dialect) (if (or (not ess-help-object) (not (eq ess-help-type 'help))) (message "No help topic found") (if com-html-help (ess-command (format com-html-help ess-help-object)) (require 'browse-url) (if com-get-file-path (browse-url (car (ess-get-words-from-vector (format com-get-file-path ess-help-object)))) (when (functionp fun-get-file-path) (browse-url (funcall fun-get-file-path ess-help-object)))))) ))) (defun ess--action-help-on-object (&optional button) "Provide help on object at the beginning of line. It's intended to be used in R-index help pages. Load the package if necessary. It is bound to RET and C-m in R-index pages." (interactive) (let* ((string (button-label button)) (command (when (equal ess-dialect "R") (cond ((string-match"::" string) (format "?%s\n" (ess-R--sanitize-help-topic string))) ((eq ess-help-type 'index) (concat "?" ess-help-object "::`%s`\n")) )))) (ess-display-help-on-object string command) )) (defun ess-display-package-index () "Prompt for package name and display its index." (interactive) (let ((object (buffer-name)) (alist ess-local-customize-alist) (pname ess-local-process-name) pack buff all-packs not-implemented ;; Available customization for ess languages/dialects: com-package-for-object ;command to get the package of current help object com-packages ;command to get a list of available packages (REQUIRED) com-package-index ;command to get the package index (REQUIRED) reg-keyword ;regexp used to find keywords for linking in index listing ; only (1st subexpression is used) reg-start ;regexp from where to start searching for keywords in index listing ) (cond ((string-match "^R" ess-dialect) ;; carefully using syntax to be parsed in old R versions (no '::', '_'): (setq com-package-for-object "sub('package:', '', .ess.findFUN('%s'))\n" com-packages ".packages(all.available=TRUE)\n" com-package-index ".ess.help(package='%s', help.type='text')\n" reg-keyword "^\\([-a-zA-Z0-9._@$]+\\)[^:\n]*$" reg-start "^Index:")) ((string-match "julia" ess-dialect) (setq com-packages "_ess_list_categories()\n" com-package-index "_ess_print_index(\"%s\")\n" reg-keyword "^\\(.*+\\):$*" reg-start ":" )) (t (error "Sorry, not implemented for %s " ess-dialect))) (when (and com-package-for-object ess-help-object (eq ess-help-type 'help)) (setq pack (car (ess-get-words-from-vector (format com-package-for-object ess-help-object))))) (setq all-packs (ess-get-words-from-vector com-packages)) (unless pack ;try symbol at point (setq pack (car (member (ess-read-object-name-default) all-packs)))) (setq pack (ess-completing-read "Index of" all-packs nil nil nil nil pack)) ;; (setq buff (get-buffer-create (format "*help[%s](index:%s)*" ess-dialect pack))) (ess--display-indexed-help-page (format com-package-index pack) reg-keyword (format "*help[%s](index:%s)*" ess-dialect pack) 'index nil nil reg-start pack) )) (defalias 'ess-display-index 'ess-display-package-index) (make-obsolete 'ess-display-index 'ess-display-package-index "ESS[12.09]") (defun ess--display-indexed-help-page (command item-regexp title help-type &optional action help-echo reg-start help-object) "Internal function to display help pages with linked actions ;; COMMAND to produce the indexed help page ;; ITEM-REGEXP -- first subexpression is highlighted ;; TITLE of the help page ;; HELP-TYPE to be stored in `ess-help-type' local variable ;; ACTION is a function with no argument (default is `ess--action-help-on-object') ;; HELP-ECHO ;; REG-START gives the start location from where to search linkifying" (interactive) (let ((object (buffer-name)) (alist ess-local-customize-alist) (pname ess-local-process-name) (buff (get-buffer-create title)) ) (with-current-buffer buff (setq ess-help-object help-object) (ess-setq-vars-local (eval alist)) (setq ess-help-sec-regex "\\(^\\s-.*\n\\)\\|\\(^\n\\)" ess-local-process-name pname) (setq buffer-read-only nil) (delete-region (point-min) (point-max)) (ess-help-mode) (ess-command command buff) (ess-help-underline) (set-buffer-modified-p 'nil) (goto-char (point-min)) (when reg-start ;; go to the beginning of listing (re-search-forward reg-start nil t)) (when (and item-regexp (featurep 'emacs)) ;;linkify the buffer (save-excursion (while (re-search-forward item-regexp nil t) (make-text-button (match-beginning 1) (match-end 1) 'mouse-face 'highlight 'action (or action #'ess--action-help-on-object) 'help-object (buffer-substring-no-properties (match-beginning 1) (match-end 1)) 'follow-link t 'help-echo (or help-echo "help on object"))) )) ;; (save-excursion ;; why R places all these spaces? ;; (goto-char (point-min)) ;; (while (re-search-forward " \\{10,\\} *" nil t) ;; (replace-match "\t\t\t"))) (setq buffer-read-only t) (setq ess-help-type help-type) (setq truncate-lines nil) ) (unless (ess--help-kill-bogus-buffer-maybe buff) (ess--switch-to-help-buffer buff)) )) (defun ess-display-help-apropos (&optional pattern) "Create an ess-apropos buffer with a *linked* list of apropos topics." (interactive "sPattern: ") (let (com regexp) (cond ((equal ess-dialect "R") (setq com "help.search('%s')\n" regexp "^\\([^ \t\n:]+::[^ \t\n:]+\\)[ \t\n]+")) ((equal ess-dialect "julia") (setq com "apropos(\"%s\")\n" regexp "^\\(\\(\\w\\|\\s_\\)+\\)(")) (t (error "Not implemented for dialect %s" ess-dialect))) (ess--display-indexed-help-page (format com pattern) regexp (format "*ess-apropos[%s](%s)*" ess-current-process-name pattern) 'appropos))) (defun ess-display-demos () "Create an ess-demos buffer with a *linked* list of available demos." (interactive) (let (com regexp) (cond ((equal ess-dialect "R") (setq com "demo()\n" regexp "^\\([^ \n:]+\\) +")) (t (error "Not implemented for dialect %s" ess-dialect))) (ess--display-indexed-help-page com regexp (format "*ess-demos[%s]*" ess-current-process-name) 'demos #'ess--action-demo))) (defun ess--action-demo (&optional button) "Provide help on object at the beginning of line. It's intended to be used in R-index help pages. Load the package if necessary. It is bound to RET and C-m in R-index pages." (interactive) (let* ((string (button-label button)) (command (cond ((equal ess-dialect "R") (format "demo('%s')\n" string)) (t (error "Not implemented for dialect %s" ess-dialect))))) (ess-eval-linewise command) (ess-switch-to-end-of-ESS))) (defun ess-display-vignettes () "Display vignettes if available for the current dialect." (interactive) (cond ((string-match "^R" ess-dialect) (ess-R-display-vignettes)) (t (message "Sorry, not implemented for %s" ess-dialect)))) (defun ess-R-display-vignettes () "Display R vignettes in ess-help-like buffer." (interactive) (let* ((vslist (with-current-buffer (ess-command ".ess_vignettes()\n") (goto-char (point-min)) (when (re-search-forward "(list" nil t) (goto-char (match-beginning 0)) (ignore-errors (eval (read (current-buffer))))))) (proc-name ess-current-process-name) (alist ess-local-customize-alist) (remote (file-remote-p default-directory)) (buff (get-buffer-create (format "*[%s]vignettes*" ess-dialect)))) (with-current-buffer buff (setq buffer-read-only nil) (delete-region (point-min) (point-max)) (ess-setq-vars-local (eval alist)) (setq ess-help-sec-regex "^\\w+:$" ess-help-type 'vignettes ess-local-process-name proc-name) (ess-help-mode) (set-buffer-modified-p 'nil) (goto-char (point-min)) (dolist (el vslist) (let ((pack (car el))) (insert (format "\n\n%s:\n\n" (propertize pack 'face 'underline))) (dolist (el2 (cdr el)) (let ((path (if remote (with-parsed-tramp-file-name default-directory nil (tramp-make-tramp-file-name method user host (nth 1 el2))) (nth 1 el2)))) ;; (if xemacs-p ;; (insert (format "Dir: %s \t%s\n" (concat path "/doc/") (nth 2 el2))) (insert-text-button "Pdf" 'mouse-face 'highlight 'action (if remote #'ess--action-open-in-emacs #'ess--action-R-open-vignette) 'follow-link t 'vignette (file-name-sans-extension (nth 2 el2)) 'package pack 'help-echo (concat path "/doc/" (nth 2 el2))) (insert " ") (insert-text-button "Rnw" 'mouse-face 'highlight 'action #'ess--action-open-in-emacs 'follow-link t 'help-echo (concat path "/doc/" (nth 3 el2))) (insert " ") (insert-text-button "R" 'mouse-face 'highlight 'action #'ess--action-open-in-emacs 'follow-link t 'help-echo (concat path "/doc/" (nth 4 el2))) (insert (format "\t%s\n" (nth 0 el2))) )))) (goto-char (point-min)) (insert (propertize "\t\t**** Vignettes ****\n" 'face 'bold-italic)) (unless (eobp) (delete-char 1)) (setq buffer-read-only t)) (ess--switch-to-help-buffer buff) )) (defun ess--action-open-in-emacs (pos) (display-buffer (find-file-noselect (get-text-property pos 'help-echo)))) (defun ess--action-R-open-vignette (pos) (ess-command (format "vignette('%s', package='%s')\n" (get-text-property pos 'vignette) (get-text-property pos 'package)))) (defun ess-help-quit (&optional kill) "Quit help." ;;VS: `quit-window', doesn't focus previously selected buffer, which is annoying (interactive "P") (let* ((buffer (window-buffer)) (obuffer (other-buffer buffer t))) (bury-buffer) (pop-to-buffer obuffer) (if kill (kill-buffer buffer)))) (defun ess-help-kill () "Quit and kill the help buffer" (interactive) (ess-help-quit t)) (defun ess--find-displayed-help-window () (catch 'win (dolist (f (frame-list)) (when (frame-visible-p f) (dolist (w (window-list f)) (when (eq (buffer-local-value 'major-mode (window-buffer w)) 'ess-help-mode) (throw 'win w))))))) (defun ess--switch-to-help-buffer (buff &optional curr-major-mode) "Switch to help buffer and take into account `ess-help-own-frame'. For internal use. Used in `ess-display-help-on-object', `ess-display-package-index', and `ess-display-vignettes'. CURR-MAJOR-MODE default to current major mode." (setq curr-major-mode (or curr-major-mode major-mode)) (let ((special-display-regexps (if ess-help-own-frame '(".") nil)) (special-display-frame-alist ess-help-frame-alist) (special-display-function (if (eq ess-help-own-frame 'one) 'ess-help-own-frame special-display-function)) (help-win (or (and (eq curr-major-mode 'ess-help-mode) (selected-window)) (and ess-help-reuse-window (ess--find-displayed-help-window))))) (if help-win (progn (select-window help-win 'norecord) (set-window-buffer help-win buff) ;; (switch-to-buffer buff nil 'force) <- 3rd argument appeared in emacs 24 ) (if ess-help-pop-to-buffer (pop-to-buffer buff) (ess-display-temp-buffer buff))))) (defvar ess-help-frame nil "Stores the frame used for displaying R help buffers.") (defun ess-help-own-frame (buffer &rest ignore) "Put all ESS help buffers into `ess-help-frame'." ;; SJE: Code adapted from Kevin Rodgers. (if (frame-live-p ess-help-frame) (progn (or (frame-visible-p ess-help-frame) (make-frame-visible ess-help-frame)) (raise-frame ess-help-frame) (select-frame ess-help-frame) (switch-to-buffer buffer) (selected-window)) ;; else (let ((window (special-display-popup-frame buffer))) (set-window-dedicated-p window nil) (setq ess-help-frame (window-frame window)) window))) (defun ess-help-web-search () "Search the web for documentation" (interactive) (ess-execute-dialect-specific ess-help-web-search-command "Search for: ")) (defun ess-manual-lookup () "Search manual for topic" (interactive) (ess-execute-dialect-specific ess-manual-lookup-command )) (defun ess-reference-lookup () "Search manual for topic" (interactive) (ess-execute-dialect-specific ess-reference-lookup-command)) (defvar ess-help-sec-map nil "Sub-keymap for ESS help mode.") ;; this breaks "s ?" rather than to fix any (unbroken !) thing: ;; (make-variable-buffer-local 'ess-help-sec-map) (defvar ess-doc-map (let (ess-doc-map) (define-prefix-command 'ess-doc-map) (define-key ess-doc-map "\C-e" 'ess-describe-object-at-point) (define-key ess-doc-map "e" 'ess-describe-object-at-point) (define-key ess-doc-map "\C-d" 'ess-display-help-on-object) (define-key ess-doc-map "d" 'ess-display-help-on-object) (define-key ess-doc-map "\C-i" 'ess-display-package-index) (define-key ess-doc-map "i" 'ess-display-package-index) (define-key ess-doc-map "\C-a" 'ess-display-help-apropos) (define-key ess-doc-map "a" 'ess-display-help-apropos) (define-key ess-doc-map "\C-v" 'ess-display-vignettes) (define-key ess-doc-map "v" 'ess-display-vignettes) (define-key ess-doc-map "\C-o" 'ess-display-demos) (define-key ess-doc-map "o" 'ess-display-demos) (define-key ess-doc-map "\C-w" 'ess-help-web-search) (define-key ess-doc-map "w" 'ess-help-web-search) (define-key ess-doc-map "\C-m" 'ess-manual-lookup) (define-key ess-doc-map "m" 'ess-manual-lookup) (define-key ess-doc-map "\C-r" 'ess-reference-lookup) (define-key ess-doc-map "r" 'ess-reference-lookup) ess-doc-map ) "ESS documentation map.") (defvar ess-help-mode-map (let ((map (make-keymap))); Full keymap, in order to (suppress-keymap map) ; suppress all usual "printing" characters (when (boundp 'special-mode-map) (set-keymap-parent map special-mode-map)) (define-key map "q" 'ess-help-quit) ;was 'ess-switch-to-end-of-ESS) (define-key map "\C-m" 'next-line) ;; (define-key map "s" ess-help-sec-map) (define-key map "h" 'ess-display-help-on-object) (define-key map "w" 'ess-display-help-in-browser) (define-key map "i" 'ess-display-package-index) (define-key map "a" 'ess-display-help-apropos) (define-key map "v" 'ess-display-vignettes) ;; TODO: `electric mouse-2' ;; (define-key map [mouse-2] 'ess-display-help-on-object) (define-key map "l" 'ess-eval-line-and-step) (define-key map "r" 'ess-eval-region-and-go) (define-key map "f" 'ess-eval-function-or-paragraph-and-step) (define-key map "n" 'ess-skip-to-next-section) (define-key map "p" 'ess-skip-to-previous-section) (define-key map "/" 'isearch-forward) (define-key map "x" 'ess-kill-buffer-and-go) (define-key map "k" 'kill-this-buffer) (define-key map "?" 'ess-describe-help-mode) ;;-- those should be "inherited" from ess-mode-map ( ./ess-mode.el ) (define-key map "\C-ch" 'ess-handy-commands) (define-key map "\C-c\C-s" 'ess-switch-process) (define-key map "\C-c\C-r" 'ess-eval-region) (define-key map "\C-c\M-r" 'ess-eval-region-and-go) (define-key map "\C-c\C-f" 'ess-eval-function) (define-key map "\M-\C-x" 'ess-eval-function) (define-key map "\C-c\M-f" 'ess-eval-function-and-go) (define-key map "\C-c\C-j" 'ess-eval-line) (define-key map "\C-c\C-n" 'ess-eval-line-and-step) (define-key map "\C-c\C-c" 'ess-eval-region-or-function-or-paragraph-and-step) (define-key map [(control return)] 'ess-eval-region-or-line-and-step) (define-key map "\C-c\M-j" 'ess-eval-line-and-go) (define-key map "\M-\C-a" 'ess-goto-beginning-of-function-or-para) (define-key map "\M-\C-e" 'ess-goto-end-of-function-or-para) (define-key map "\C-c\C-y" 'ess-switch-to-ESS) (define-key map "\C-c\C-z" 'ess-switch-to-end-of-ESS) (define-key map "\C-c\C-l" 'ess-load-file) (define-key map "\C-c\M-l" 'ess-load-file); alias, as in 'iESS' where C-c C-l is comint-list-* (define-key map "\C-c\C-v" 'ess-display-help-on-object) (define-key map "\C-c\C-k" 'ess-request-a-process) (define-key map "\C-c\C-d" 'ess-doc-map) (define-key map "\C-c\C-e" 'ess-extra-map) (define-key map "\C-c\C-t" 'ess-dev-map) map) "Keymap for ESS help mode.") ;; One reason for the following menu is to the user about key strokes (defvar ess-help-mode-menu (list "ESS-help" ["Search Forward" isearch-forward t] ["Next Section" ess-skip-to-next-section t] ["Previous Section" ess-skip-to-previous-section t] ["Help on Section Skipping" ess-describe-sec-map t] ["Beginning of Buffer" beginning-of-buffer t] ["End of Buffer" end-of-buffer t] "-" ["Help on ..." ess-display-help-on-object t] ["Apropos of ..." ess-display-help-apropos t] ["Index of ..." ess-display-package-index t] ["Vignettes" ess-display-vignettes t] ["Open in Browser" ess-display-help-in-browser t] "-" ["Eval Line" ess-eval-line-and-step t] ["Eval Paragraph & step" ess-eval-paragraph-and-step t] ["Eval Region & Go" ess-eval-region-and-go t] ["Switch to ESS Process" ess-switch-to-ESS t] ["Switch to End of ESS Proc." ess-switch-to-end-of-ESS t] ["Switch _the_ Process" ess-switch-process t] "-" ["Kill Buffer" kill-this-buffer t] ["Kill Buffer & Go" ess-kill-buffer-and-go t] "-" ["Handy commands" ess-handy-commands t] ["Describe ESS-help Mode" ess-describe-help-mode t] ) "Menu used in ess-help mode.") (defun ess-help-mode () ;;; Largely ripped from more-mode.el, ;;; originally by Wolfgang Rupprecht wolfgang@mgm.mit.edu "Mode for viewing ESS help files. Use SPC and DEL to page back and forth through the file. Use `n' and `p' to move to next and previous section, `s' to jump to a particular section; `s ?' for help. Use `q' to return to your ESS session; `x' to kill this buffer first. The usual commands for evaluating ESS source are available. Other keybindings are as follows: \\{ess-help-mode-map}" (interactive) (setq major-mode 'ess-help-mode) (setq mode-name "ESS Help") (use-local-map ess-help-mode-map) ;;; Keep out of the code. (make-local-variable 'indent-tabs-mode) (setq indent-tabs-mode nil) (if ess-mode-syntax-table ;;set in advance by ess-setq-local (set-syntax-table ess-mode-syntax-table)) (require 'easymenu) (easy-menu-define ess-help-mode-menu-map ess-help-mode-map "Menu keymap for ess-help mode." ess-help-mode-menu) (easy-menu-add ess-help-mode-menu-map ess-help-mode-map) ;; Add the keys for navigating among sections; this is done ;; dynamically since different languages (e.g. S vs R) have different ;; section headings. (setq ess-help-sec-map (make-sparse-keymap)) (dolist (pair ess-help-sec-keys-alist) (define-key ess-help-sec-map (char-to-string (car pair)) 'ess-skip-to-help-section)) (define-key ess-help-sec-map "?" 'ess-describe-sec-map) (define-key ess-help-sec-map ">" 'end-of-buffer) (define-key ess-help-sec-map "<" 'beginning-of-buffer) (define-key ess-help-mode-map "s" ess-help-sec-map) (run-hooks 'ess-help-mode-hook)) ;;*;; User commands defined in ESS help mode (defun ess-skip-to-help-section nil "Jump to a section heading of a help buffer. The section selected is determined by the command letter used to invoke the command, as indicated by `ess-help-sec-keys-alist'. Use \\[ess-describe-sec-map] to see which keystrokes find which sections." (interactive) (let ((old-point (point)) (case-fold-search nil)) (goto-char (point-min)) (let ((the-sec (cdr (assoc (if (featurep 'xemacs) last-command-char last-command-event) ess-help-sec-keys-alist)))) (if (not the-sec) (error "Invalid section key: %c" last-command-event) (if (re-search-forward (concat "^" the-sec) nil t) (recenter) (message "No %s section in this help. Sorry." the-sec) (goto-char old-point)))))) (defun ess-skip-to-next-section nil "Jump to next section in ESS help buffer." (interactive) (let ((case-fold-search nil)) (if (re-search-forward ess-help-sec-regex nil 'no-error) nil (message "No more sections.")))) (defun ess-skip-to-previous-section nil "Jump to previous section in ESS help buffer." (interactive) (let ((case-fold-search nil)) (if (re-search-backward ess-help-sec-regex nil 'no-error) nil (message "No previous section.")))) (defun ess-describe-help-mode nil "Display help for `ess-mode'." (interactive) (describe-function 'ess-help-mode)) (defun ess-kill-buffer-and-go nil "Kill the current buffer and switch back to the ESS process." (interactive) (kill-buffer (current-buffer)) (when (and ess-current-process-name (get-process ess-current-process-name)) (ess-switch-to-ESS nil))) (defun ess-describe-sec-map nil "Display help for the `s' key." (interactive) (let ((keys-alist ess-help-sec-keys-alist)) (describe-function 'ess-skip-to-help-section) (with-current-buffer "*Help*" (setq buffer-read-only nil) (goto-char (point-max)) (insert "\n\nCurrently defined keys are: Keystroke Section --------- -------\n") (dolist (cs keys-alist) (insert " " (car cs) " " (cdr cs) "\n")) (insert "\nFull list of key definitions:\n" (substitute-command-keys "\\{ess-help-sec-map}"))))) (defun ess-helpobjs-at-point (slist) ;;; Return a list (def obj fun) where OBJ is a name at point, FUN - name of ;;; the function call point is in. DEF is either OBJ or FUN (in that order) ;;; which has a a help file, i.e. it is a member of slist (string-list). nil ;;; otherwise (let ((obj (ess-read-object-name-default)) (fun (condition-case () (save-excursion (save-restriction (narrow-to-region (max (point-min) (- (point) 1000)) (point-max)) (backward-up-list 1) (backward-char 1) (ess-read-object-name-default))) (error nil)))) (if (and obj (not (string-match "[[:alpha:]]" obj))) ;;exclude numbers (setq obj nil)) (list (or (car (member obj slist)) (car (member fun slist))) obj fun))) ;; defunct old name: ;; (defun ess-read-helpobj-name-default (slist) ;; (car (delq nil (ess-helpobjs-at-point slist)))) (defun ess-find-help-file (p-string) "Find help, prompting for P-STRING. Note that we can't search SAS, Stata or XLispStat for additional information." (ess-make-buffer-current) (if ess-get-help-topics-function (let* ((help-files-list (funcall ess-get-help-topics-function ess-current-process-name)) (hlpobjs (ess-helpobjs-at-point help-files-list))) (ess-completing-read p-string (append (delq nil hlpobjs) help-files-list) nil nil nil nil (car hlpobjs))) ;; (string-match "\\(XLS\\)\\|\\(STA\\)\\|\\(SAS\\)" ess-language) (read-string (format "%s: " p-string)))) ;;*;; Utility functions (defun ess-get-S-help-topics-function (name) "Return a list of current S help topics associated with process NAME. If 'sp-for-help-changed?' process variable is non-nil or `ess-help-topics-list' is nil, (re)-populate the latter and return it. Otherwise, return `ess-help-topics-list'." (with-ess-process-buffer nil (ess-write-to-dribble-buffer (format "(ess-get-help-topics-list %s) .." name)) (if (or (not ess-help-topics-list) (ess-process-get 'sp-for-help-changed?)) (progn (ess-process-put 'sp-for-help-changed? nil) (setq ess-help-topics-list (ess-uniq-list (append (ess-get-object-list name 'exclude-1st) (ess-get-help-files-list) (ess-get-help-aliases-list))))) ;; else return the existing list ess-help-topics-list))) (defun ess-get-help-files-list () "Return a list of files which have help available." (apply 'nconc (mapcar (lambda (str) (let ((dirname (concat str "/.Help"))) (and (file-directory-p dirname) (directory-files dirname)))) (ess-search-list)))) (defun ess-get-help-aliases-list () "Return a list of aliases which have help available." (message "Retrieving RDS aliases...") ;; ess-command locks display, make sure the above message is visible (redisplay t) (ess-write-to-dribble-buffer "Processing RDS files ...\n") (prog1 (ess-get-words-from-vector ".ess.getHelpAliases()\n") (message "Retrieving RDS aliases...done"))) (defun ess-nuke-help-bs () "Remove ASCII underlining and overstriking performed by ^H codes." ;; This function is a modification of nuke-nroff-bs in man.el from the ;; standard emacs 18 lisp library. ;; Nuke underlining and overstriking (only by the same letter) (goto-char (point-min)) (while (search-forward "\b" nil t) (let* ((preceding (char-after (- (point) 2))) (following (following-char))) (cond ((= preceding following) ;; x\bx (delete-char -2)) ((= preceding ?\_) ;; _\b (delete-char -2)) ((= following ?\_) ;; \b_ (delete-region (1- (point)) (1+ (point))))))) (goto-char (point-min)) (while (re-search-forward "URL:" nil t) ;; quick fix for C-x f confusiong (delete-region (match-beginning 0) (match-end 0))) ;; Crunch blank lines (goto-char (point-min)) (while (re-search-forward "\n\n\n\n*" nil t) (replace-match "\n\n")) ;; Nuke blanks lines at start. (goto-char (point-min)) (skip-chars-forward "\n") (delete-region (point-min) (point))) (defun ess-help-underline () "Replace _^H codes with underline face." (save-excursion (goto-char (point-min)) (while (search-forward "_" nil t) (backward-delete-char 2) (put-text-property (point) (1+ (point)) 'face 'underline)))) ;;*;; Link to Info (defun ess-goto-info (node) "Display node NODE from ess-mode info." (require 'info) (split-window) ;;(other-window 1) (Info-goto-node (concat "(ess)" node))) ;; describe object at point (defvar ess-describe-object-at-point-commands nil "Commands cycled by `ess-describe-object-at-point'. Dialect specific.") (make-variable-buffer-local 'ess-describe-at-point-commands) (defvar ess--descr-o-a-p-commands nil) (defun ess-describe-object-at-point () "Get info for object at point, and display it in an electric buffer or tooltip. If region is active use it instead of the object at point. This is an electric command (`ess--execute-electric-command'), which means that you can use the last key to cycle through the action set (in this case `C-e'). After invocation of this command all standard emacs commands, except those containing 'window' in their names, remove the electric *ess-describe* buffer. Use `other-window' to switch to *ess-describe* window. Customize `ess-describe-at-point-method' if you wan to display the description in a tooltip. See also `ess-R-describe-object-at-point-commands' (and similar option for other dialects)." (interactive) (if (not ess-describe-object-at-point-commands) (message "Not implemented for dialect %s" ess-dialect) (ess-force-buffer-current) (let ((map (make-sparse-keymap)) (objname (or (and (use-region-p) (buffer-substring-no-properties (point) (mark))) (symbol-at-point))) bs ess--descr-o-a-p-commands) ;; used in ess--describe-object-at-point (unless objname (error "No object at point ")) (define-key map (vector last-command-event) 'ess--describe-object-at-point) ;; todo: put digits into the map (let* ((inhibit-quit t) ;; C-g removes the buffer (buf (ess--execute-electric-command map (format "Press %s to cycle" (single-key-description last-command-event)) nil nil objname)) ;; read full command (keys (read-key-sequence-vector "")) (command (and keys (key-binding keys)))) (when (and (commandp command) (bufferp buf) (or (not (symbolp command)) ;; kill on lambdas (not (string-match "window" (symbol-name command))))) (kill-buffer buf)) ;; bury does not work here :( (emacs bug?) (setq unread-command-events (append keys unread-command-events))) ))) (defun ess--describe-object-at-point (ev objname) (setq ess--descr-o-a-p-commands (or ess--descr-o-a-p-commands (symbol-value ess-describe-object-at-point-commands))) (let* ((com (format (car (pop ess--descr-o-a-p-commands)) objname)) (buf (get-buffer-create "*ess-describe*")) pos) (unless (eq ess-describe-at-point-method 'tooltip) ;; can take some time for the command to execute (display-buffer buf)) (sit-for .01) (ess-command (concat com "\n") buf) ;; erases buf (with-current-buffer buf (goto-char (point-min)) (insert (propertize (format "%s:\n\n" com) 'face 'font-lock-string-face)) (forward-line -1) (setq pos (point)) ;; set the keys that we are used to in help mode (special-mode) (local-set-key "k" 'kill-this-buffer)) (if (eq ess-describe-at-point-method 'tooltip) (ess-tooltip-show-at-point (with-current-buffer buf (buffer-string)) 0 30) (display-buffer buf) (set-window-point (get-buffer-window buf) pos) ;; don't move window point buf))) ; Bug Reporting (defun ess-submit-bug-report () "Submit a bug report on the ess-mode package." (interactive) (require 'ess-mode) (require 'reporter) (let ((reporter-prompt-for-summary-p 't)) (reporter-submit-bug-report "ess-bugs@r-project.org" (concat "ess-mode " (ess-version-string)) (list 'ess-language 'ess-dialect 'ess-ask-for-ess-directory 'ess-ask-about-transfile 'ess-directory 'ess-keep-dump-files 'ess-source-directory 'ess-use-ido 'ess-use-eldoc 'ess-use-tracebug 'ess-use-auto-complete 'ess-use-company 'ess-eval-visibly-p 'ess-can-eval-in-background 'ess-local-process-name) nil (lambda () ;;(goto-char (point-max)) (rfc822-goto-eoh) (forward-line 1) (insert "\n\n-------------------------------------------------------\n") (insert "This bug report will be sent to the ESS bugs email list\n") (insert "Press C-c C-c when you are ready to send your message.\n") (insert "-------------------------------------------------------\n\n") (insert (with-current-buffer "*ESS*" (goto-char (point-max)) (forward-line -100) (buffer-substring-no-properties (point) (point-max)))) )))) ;;; Provide (provide 'ess-help) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-help.el ends here ess/lisp/ess-pkg.el0000664000175000017500000000017312577152666012610 0ustar eddedd(define-package "ess" "0" "Emacs Speaks Statistics" '((julia-mode "0.3")) :url "http://ess.r-project.org" :keywords nil) ess/lisp/ess-lsp-l.el0000664000175000017500000000543612423756516013057 0ustar eddedd;;; ess-lsp-l.el --- Support for editing Lisp source code ;; Copyright (C) 1997 A.J. Rossini. ;; Copyright (C) 1998--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 1 Sept 1997 ;; Maintainer: ESS-core ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Configurations for editing XLispStat source code. Contains any underlying ;; changes that need to be made. ;;; Code: ; Requires and autoloads ;; Contents "translated" from lisp-mode.el (require 'lisp-mode) ; Configuration variables (defvar Lisp-editing-alist '((paragraph-start . (concat "^$\\|" page-delimiter)) (paragraph-separate . (concat "^$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (fill-paragraph-function . 'lisp-fill-paragraph) (adaptive-fill-mode . nil) (indent-line-function . 'lisp-indent-line) (indent-region-function . 'lisp-indent-region) (require-final-newline . mode-require-final-newline) (comment-start . ";") (comment-start-skip . "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *") (comment-column . 40) (comment-indent-function . 'lisp-comment-indent) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) (ess-local-process-name . nil) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . lisp-mode-syntax-table) (font-lock-defaults . '(lisp-font-lock-keywords))) "General options for editing LispStat, XLispStat, and ViSta source files.") (provide 'ess-lsp-l) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-lsp-l.el ends here ess/lisp/ess-swv.el0000664000175000017500000004070112632537307012636 0ustar eddedd;;; ess-swv.el --- Some simple functions for ESS and Sweave ;; Copyright (C) 2005 David Whiting, A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2006-2008 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: David Whiting ;; Created: 15 April 2005 ;; Maintainer: ESS-core ;; Keywords: statistics, tools ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; ;; Some simple functions for ESS and Sweave ;; david.whiting at ncl.ac.uk ;; Wed Sep 1 14:55:52 CEST 2004 ;; I have written some very simple elisp functions that I have found ;; useful and thought others might like to see. I dabble with elisp ;; occasionally at best so there are probably better ways to do what I ;; have done, but so far this seems to work for me. There are several ;; things that are hard-coded, I use Linux and I think that this would ;; probably not work in Windows (not as it is now anyway). ;; With these functions and key bindings all I need to do is open a .Rnw ;; file and, assuming R is running, I press: ;; M-n s to Sweave the file, then ;; M-n l to run latex on the results of Sweave, then ;; M-n p to make and display a postscript file , or ;; M-n P to make and display a PDF version. ;; David Whiting to Anthony Rossini, Mar 30 ;; On Wed, Mar 30, 2005 at 11:51:26AM +0200, A.J. Rossini wrote: ;; > I'm going to go ahead and add this stuff to the distribution tonight ;; > if you don't mind. I'd forgotten about it! ;; It would make me very happy indeed. ;; > (however, need permission to do so). ;; Permission granted! ;; Dave ;; -- ;; David Whiting ;; School of Clinical Medical Sciences, The Medical School ;; University of Newcastle upon Tyne, NE2 4HH, UK. ;;; TODO: ;;; ;;; 1. I want to be able to send ess-swv-latex a parameter to tell it ;;; the number of times to run LaTeX (to get references updated ;;; correctly). ;;; ;;; 2. Also need to add ess-swv-Bibtex. ;;; ;;; 3. Might be good to have a way to chain commands. ;;; ;;; 4. ADD to the ../doc/ess.texi !! ;;; Code: ;;; Autoloads and Requires (eval-when-compile (require 'ess-custom) (require 'ess) ) (require 'ess-noweb-mode) (require 'ess-r-d); for Rnw-mode (require 'easymenu) ;; currently use exactly for "Sweave", "Stangle", "knit", and "purl" (defun ess-swv-run-in-R (cmd &optional choose-process block) "Run \\[cmd] on the current .Rnw file. Utility function not called by user." (let* ((rnw-buf (current-buffer))) (if choose-process ;; previous behavior (ess-force-buffer-current "R process to load into: ") ;; else (update-ess-process-name-list) (cond ((= 0 (length ess-process-name-list)) (message "no ESS processes running; starting R") (sit-for 1); so the user notices before the next msgs/prompt (R) (set-buffer rnw-buf) ) ((not (string= "R" (ess-make-buffer-current))); e.g. Splus, need R (ess-force-buffer-current "R process to load into: ")) )) (save-excursion ;; (ess-execute (format "require(tools)")) ;; Make sure tools is loaded. (basic-save-buffer); do not Sweave/Stangle old version of file ! (let* ((sprocess (ess-get-process ess-current-process-name)) (sbuffer (process-buffer sprocess)) (rnw-file (buffer-file-name)) (Rnw-dir (file-name-directory rnw-file)) (buf-coding (symbol-name buffer-file-coding-system)) ;; could consider other encodings, but utf-8 is "R standard" for non-ASCII: (cmd-args (concat "\"" rnw-file "\"" (if (string-match "^utf-8" buf-coding) ", encoding = \"utf-8\""))) (Sw-cmd (format ess-swv-processing-command cmd cmd-args))) (message "%s()ing %S" cmd rnw-file) ;; need to block when we are running ess-swv-weave-PDF so we ;; know when to start compiling the generated .tex file (if block (progn (ess-eval-linewise (concat Sw-cmd "\n") nil nil nil t) (message "Finished %s()ing %S" cmd rnw-file)) (ess-execute Sw-cmd 'buffer nil nil) (switch-to-buffer rnw-buf) (ess-show-buffer (buffer-name sbuffer) nil)))))) (defcustom ess-swv-processing-command ".ess_weave(%s, %s)" "Command used by `ess-swv-run-in-R'. First %s is literally replaced by the processing command (for example: Sweave) second %s is replaced with a string containing a processed file and possibly additional argument encoding (example: \"path/to/foo.Rnw\", encoding='utf-8') .ess_weave changes the working directory to that of the supplied file. If you want to simply call knitr or Sweave in global environment set this command to \"%s(%s)\"." :group 'ess-R :type 'string) (defcustom ess-swv-processor 'sweave "Processor to use for weaving and tangling. Currently 'sweave or 'knitr" :group 'ess-R :type '(choice (const sweave) (const knitr))) (defun ess-swv-tangle () "Run Stangle/purl on the current .Rnw file. Depending on the `ess-swv-processor' used." (interactive) (ess-swv-run-in-R (cond ((eq ess-swv-processor 'sweave) "Stangle") ((eq ess-swv-processor 'knitr) "purl") (t (error "Not a valid processor %s" ess-swv-processor))))) (defun ess-swv-weave (&optional choose) "Run Sweave/knit on the current .Rnw file. Depending on the `ess-swv-processor' used. If CHOOSE is non-nil, offer a menu of available weavers. " (interactive "P") (let ((processor (if choose (ess-completing-read "Weaver" '("sweave" "knitr") nil t) (symbol-name ess-swv-processor)))) (ess-swv-run-in-R (cond ((string= processor "sweave") "Sweave") ((string= processor "knitr") "knit") (t (error "Not a valid processor %s" processor)))))) (defun ess-swv-sweave () "Run Sweave on the current .Rnw file." (interactive) (ess-swv-run-in-R "Sweave")) (defun ess-swv-stangle () "Run Stangle on the current .Rnw file." (interactive) (ess-swv-run-in-R "Stangle")) (defun ess-swv-knit () "Run knit on the current .Rnw file." (interactive) (ess-swv-run-in-R "knit")) (defun ess-swv-purl () "Run purl on the current .Rnw file." (interactive) (ess-swv-run-in-R "purl")) (defun ess-swv-weave-PDF (&optional choose) "Sweave/knit, compile TeX, and display PDF. Run Sweave or knit depending on `ess-swv-processor' used. If CHOOSE is non-nil, offer a menu of available weavers. " (interactive "P") (let ((processor (if choose (ess-completing-read "Weaver" '("sweave" "knitr") nil t) (symbol-name ess-swv-processor)))) (ess-swv-run-in-R (cond ((string= processor "sweave") "Sweave") ((string= processor "knitr") "knit") (t (error "Not a valid processor %s" processor))) nil t) (ess-swv-PDF nil t))) (defun ess-swv-latex () "Run LaTeX on the product of Sweave()ing the current file." (interactive) (save-excursion (let* ((namestem (file-name-sans-extension (buffer-file-name))) (latex-filename (concat namestem ".tex")) (tex-buf (get-buffer-create " *ESS-tex-output*"))) (message "Running LaTeX on '%s' ..." latex-filename) (switch-to-buffer tex-buf) (call-process "latex" nil tex-buf 1 latex-filename) (switch-to-buffer (buffer-name)) (display-buffer tex-buf) (message "Finished running LaTeX" )))) (defun ess-swv-PS () "Create a postscript file from a dvi file (name based on the current Sweave file buffer name) and display it." (interactive) (let* ((buf (buffer-name)) (namestem (file-name-sans-extension (buffer-file-name))) (dvi-filename (concat namestem ".dvi")) (psviewer (ess-get-ps-viewer))) (shell-command (concat "dvips -o temp.ps " dvi-filename)) (shell-command (concat psviewer " temp.ps & ")) (switch-to-buffer buf) )) (defun ess-swv-PDF (&optional pdflatex-cmd hide-compile-buffer) "From LaTeX file, create a PDF (via 'texi2pdf' or 'pdflatex', ...), by default using the first entry of `ess-swv-pdflatex-commands' and display it." (interactive) (setq pdflatex-cmd (or pdflatex-cmd (and (eq (length ess-swv-pdflatex-commands) 1) (car ess-swv-pdflatex-commands)) (ess-completing-read "pdf latex command" ess-swv-pdflatex-commands ; <- collection to choose from nil 'confirm ; or 'confirm-after-completion nil nil (car ess-swv-pdflatex-commands)))) (let* ((buf (buffer-name)) (namestem (file-name-sans-extension (buffer-file-name))) (latex-filename (concat namestem ".tex")) (tex-buf (get-buffer-create "*ESS-tex-output*")) (pdfviewer (ess-get-pdf-viewer)) (pdf-status) (cmdstr-win (format "start \"%s\" \"%s.pdf\"" pdfviewer namestem)) (pdffile (format "%s.pdf" namestem)) (cmd (if (stringp pdfviewer) (list pdfviewer pdffile) (append pdfviewer (list pdffile))))) ;;(shell-command (concat "pdflatex " latex-filename)) (message "Running '%s' on '%s' ..." pdflatex-cmd latex-filename) (with-current-buffer tex-buf (erase-buffer)) (setq pdf-status (call-process pdflatex-cmd nil tex-buf t (if (string= "texi2" (substring pdflatex-cmd 0 5)) ;; workaround (bug?): texi2pdf or texi2dvi *fail* to work with full path: (file-name-nondirectory latex-filename) latex-filename))) (if (not (= 0 pdf-status)) (progn (message "** OOPS: error in '%s' (%d)!" pdflatex-cmd pdf-status) (display-buffer tex-buf)) ;; else: pdflatex probably ok ;; (set-process-sentinel proc 'shell-command-sentinel) (if (and ess-microsoft-p (w32-shell-dos-semantics)) (shell-command cmdstr-win) (message (mapconcat 'identity cmd " ")) (apply 'start-process (car cmd) nil cmd)) (unless hide-compile-buffer (display-buffer tex-buf)) (message "%s finished with status %d" pdflatex-cmd pdf-status)))) (defun ess-insert-Sexpr () "Insert Sexpr{} into the buffer at point." (interactive) (insert "\\Sexpr{}") (backward-char)) ;;; back-compatible wrappers: (defun ess-makeSweave () "old *DEPRECATED* version of \\[ess-swv-weave]." (interactive) (ding) (message "** warning: ess-makeSweave is deprecated. Do use (ess-swv-weave) instead!") (ess-swv-weave)) (defun ess-makeLatex () "old *DEPRECATED* version of \\[ess-swv-latex]." (interactive) (ding) (message "** warning: ess-makeLatex is deprecated. Do use (ess-swv-latex) instead!") (ess-swv-latex)) (defun ess-makePS () "old *DEPRECATED* version of \\[ess-swv-PS]." (interactive) (ding) (message "** warning: ess-makePS is deprecated. Do use (ess-swv-PS) instead!") (ess-swv-PS)) (defun ess-makePDF () "old *DEPRECATED* version of \\[ess-swv-PDF]." (interactive) (ding) (message "** warning: ess-makePDF is deprecated. Do use (ess-swv-PDF) instead!") (ess-swv-PDF)) ;; AUCTeX integration. This is independent of this library, but it fits ;; here nonetheless since it's an alternative way of Sweave'ing without ;; starting iESS. (defun ess-swv-add-TeX-commands () "Add commands to AUCTeX's \\[TeX-command-list]." (unless (and (featurep 'tex-site) (featurep 'tex)) (error "AUCTeX does not seem to be loaded")) (add-to-list 'TeX-command-list '("Sweave" "R CMD Sweave %t" TeX-run-command nil (latex-mode) :help "Run Sweave") t) (add-to-list 'TeX-command-list '("LaTeXSweave" "%l %(mode) %s" TeX-run-TeX nil (latex-mode) :help "Run LaTeX after Sweave") t) (setq TeX-command-default "Sweave") (mapc (lambda (suffix) (add-to-list 'TeX-file-extensions suffix)) '("nw" "Snw" "Rnw"))) (defun ess-swv-remove-TeX-commands (x) "Helper function: check if car of X is one of the Sweave strings" (let ((swv-cmds '("Sweave" "LaTeXSweave"))) (unless (member (car x) swv-cmds) x))) (defun ess-swv-plug-into-AUCTeX () "Add commands to AUCTeX's \\[TeX-command-list] to sweave the current noweb file and latex the result." (if ess-swv-plug-into-AUCTeX-p (add-hook 'Rnw-mode-hook 'ess-swv-add-TeX-commands) (remove-hook 'Rnw-mode-hook 'ess-swv-add-TeX-commands) (setq TeX-command-list (mapcar 'ess-swv-remove-TeX-commands TeX-command-list) ;; this will remove the items, leaving nils, so remove them. TeX-command-list (delq nil TeX-command-list)))) ;; as ess-swv-plug-into-AUCTeX-p is customizable ... : (if ess-swv-plug-into-AUCTeX-p (eval-after-load "tex" '(ess-swv-plug-into-AUCTeX))) (defun ess-swv-toggle-plug-into-AUCTeX () "Toggle inclusion of commands to sweave noweb files and latex the results in \\[TeX-command-list] on and off. Commands are added via \\[Rnw-mode-hook]." (interactive) (unless (and (featurep 'tex-site) (featurep 'tex)) (error "AUCTeX are not available")) (setq ess-swv-plug-into-AUCTeX-p (not ess-swv-plug-into-AUCTeX-p)) (ess-swv-plug-into-AUCTeX) (TeX-normal-mode t) (if ess-swv-plug-into-AUCTeX-p (message "Sweave and LaTeXSweave are activated in AUCTeX.") (message "Sweave and LaTeXSweave are de-activated in AUCTeX."))) ;;; Now bind some keys. (define-key ess-noweb-minor-mode-map "\M-ns" 'ess-swv-weave) (define-key ess-noweb-minor-mode-map "\M-nT" 'ess-swv-tangle) (define-key ess-noweb-minor-mode-map "\M-nl" 'ess-swv-latex) (define-key ess-noweb-minor-mode-map "\M-np" 'ess-swv-PS) (define-key ess-noweb-minor-mode-map "\M-nP" 'ess-swv-PDF) (define-key ess-noweb-minor-mode-map "\M-nr" 'ess-swv-knit) (define-key ess-noweb-minor-mode-map "\M-nu" 'ess-swv-purl) (define-key ess-noweb-minor-mode-map "\M-nv" 'ess-swv-weave-PDF) (define-key ess-noweb-minor-mode-map "\M-nx" 'ess-insert-Sexpr) ;; AND add these to the noweb menu we have anyway ! : (easy-menu-define ess-swv-menu ess-noweb-minor-mode-menu "Submenu for use in `Rnw-mode'." '("Sweaving, Tangling, ..." ["Sweave" ess-swv-weave t] ["Tangle" ess-swv-tangle t] ["LaTeX" ess-swv-latex t] ["PDF(LaTeX)" ess-swv-PDF t] ["PS (dvips)" ess-swv-PS t] ["Knit" ess-swv-knit t] ["Purl" ess-swv-purl t] ["View PDF" ess-swv-weave-PDF t] ["Insert Sexpr" ess-insert-Sexpr t] ["AUCTeX Interface" ess-swv-toggle-plug-into-AUCTeX :style toggle :selected ess-swv-plug-into-AUCTeX-p] )) (if (featurep 'xemacs) (add-hook 'Rnw-mode-hook (lambda () ;; This adds to top menu: ;; (easy-menu-add ess-swv-menu ess-noweb-minor-mode-map) ;; But that's using an unnecessary extra level -- FIXME (easy-menu-add-item ess-noweb-minor-mode-menu '("Sweave");; 'nil' adds to top ess-swv-menu))) ;; normal GNU Emacs: (easy-menu-add-item ess-noweb-minor-mode-menu nil ;; <= path ess-swv-menu)) ; provides (provide 'ess-swv) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-swv.el ends here ess/lisp/ess-sta-l.el0000664000175000017500000014232012423756516013042 0ustar eddedd;;; ess-sta-l.el --- Stata customization ;; Copyright (C) 1999--2000, Thomas Lumley, A. J. Rossini, Brendan Halpin. ;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Thomas Lumley , ;; Brendan Halpin ;; Created: 2 Nov 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This is based upon Version 0.4 of Stata mode. ;; Stata modes. Emacs modes for using the Stata statistical package ;; Modified from S-mode, comint-mode ;; ;; (c) thomas lumley 1997 ;; ;; version 0.4 20/7/97 ;; ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; (for the GNU GPL see above) ;;; Code: (require 'make-regexp) ; it's now local to the directory. ;;(load-library "make-regexp") ;; this is necessary for ;; ado-set-font-lock-keywords ;; only needed in Emacs >= 22.x and newish Xemacsen: (unless (boundp 'c-emacs-features) (require 'cc-vars));; for syntax-table ;(setq max-lisp-eval-depth 500) (eval-when-compile (setq max-lisp-eval-depth (max 600 max-lisp-eval-depth))) (defconst ess-help-STA-sec-keys-alist '((?d . "Description") (?e . "Examples") (?o . "Options") (?s . "Also see") (?S . "Syntax") (?r . "Remarks") (?t . "Title")) "Help section keys. `key' indicates the keystroke to use to search for the section heading `string' in an Stata help file. `string' is used as part of a regexp-search, and so specials should be quoted. ") (defconst ess-help-STA-sec-regex "^[A-Z a-z]+:?\n-+\\|http:" "Reg(ular) Ex(pression) of section headers in help file.") (defvar STA-syntax-table (let ((tbl (make-syntax-table))) (modify-syntax-entry ?\\ "." tbl) ;nullify escape meaning (modify-syntax-entry ?\$ "." tbl) (modify-syntax-entry ?` "(\'" tbl) (modify-syntax-entry ?\' ")`" tbl) ;;--------- begin cut-and-paste from lisp/progmodes/c-langs.el (cond ;; XEmacs 19, 20, 21 ((memq '8-bit c-emacs-features) (modify-syntax-entry ?/ ". 1456" tbl) (modify-syntax-entry ?* ". 23" tbl)) ;; Emacs 19, 20, 21 ((memq '1-bit c-emacs-features) (modify-syntax-entry ?/ ". 124b" tbl) (modify-syntax-entry ?* ". 23" tbl)) ;; incompatible (t (error "CC Mode is incompatible with this version of Emacs")) ) (modify-syntax-entry ?\n "> b" tbl) ;; Give CR the same syntax as newline, for selective-display (modify-syntax-entry ?\^m "> b" tbl) ;;--------- end cut-and-paste ------------------ (modify-syntax-entry ?+ "." tbl) (modify-syntax-entry ?- "." tbl) (modify-syntax-entry ?= "." tbl) (modify-syntax-entry ?% "." tbl) (modify-syntax-entry ?< "." tbl) (modify-syntax-entry ?> "." tbl) (modify-syntax-entry ?& "." tbl) (modify-syntax-entry ?| "." tbl) (modify-syntax-entry ?~ "." tbl) tbl) "Syntax table for Stata code.") (defun ado-set-font-lock-keywords () "Create font lock keywords for Stata syntax. This is from the ado-mode of Bill Rising , and uses make-regexp." ;; (make-local-variable 'ado-font-lock-keywords) (interactive) (list ;; special highlighting ;; program definitions (eval-when-compile (make-regexps '(("^\\*!.*") font-lock-keyword-face) )) (eval-when-compile (make-regexps "^" '(( "pr" "pro" "prog" "progr" "progra" "program" ) font-lock-keyword-face) "[ \t]+" '(( "de" "def" "defi" "defin" "define" "di" "dir" "drop" "l" "li" "lis" "list" ) font-lock-type-face nil) "[ \t]+" '(("[_a-z]+[_a-z0-9]*") font-lock-keyword-face nil) )) (eval-when-compile (make-regexps '(("^[ \t]*version") font-lock-reference-face) "[ \t]*" '(("1.0 2.0 2.1 3.0 3.1 4.0 5.0 6 6.0") font-lock-type-face) )) (eval-when-compile (make-regexps "^" '(("end" "pause" ) font-lock-keyword-face) "[ /t]*.*$" )) ;; delimit command (eval-when-compile (make-regexps '(("^[ \t]*#delimit") font-lock-reference-face) "\\s-*" '(("\\(cr\\|;\\)\\s-*$") font-lock-type-face nil) )) ;; set command (with endless options!) (eval-when-compile (make-regexps '(("^[ \t]*set") font-lock-reference-face) "[ \t]+" '(("adosize" "ANSI" "b" "be" "bee" "beep" "checksum" "contents" "d" "di" "dis" "disp" "displ" "displa" "display" "g" "gr" "gra" "grap" "graph" "graphi" "graphic" "graphics" "help" "IBM" "l" "le" "lev" "leve" "level" "linesize" "lo" "log" "mat" "mats" "matsi" "matsiz" "matsize" "maxobs" "maxvar" "mem" "memo" "memor" "memory" "mo" "mor" "more" "obs" "ou" "out" "outp" "outpu" "output" "pagesize" "r" "rm" "rms" "rmsg" "se" "see" "seed" "seed0" "shell" "te" "tex" "text" "texts" "textsi" "textsiz" "textsize" "tr" "tra" "trac" "trace" "t" "ty" "typ" "type" "video" "vir" "virt" "virtu" "virtua" "virtual" ) font-lock-reference-face t) "[ \t]*" '(("[a-zA-Z0-9]*") font-lock-type-face) )) ;; the constraint commands (eval-when-compile (make-regexps "[ \t]+" '(( "cons" "const" "constr" "constra" "constrai" "constrain" "constraint" ) font-lock-reference-face) "[ \t]+" '(( "d" "de" "def" "defi" "defin" "define" "di" "dir" "drop" "l" "li" "lis" "list" ) font-lock-type-face) "\\b" )) ;; the confirm commands - could be a mess! (eval-when-compile (make-regexps "[ \t]+" '(( "conf" "confi" "confir" "confirm" ) font-lock-reference-face) "[ \t]+" '(( "e" "ex" "exi" "exis" "exist" "existe" "existen" "existenc" "existence" "f" "fi" "fil" "file" "n" "nu" "num" "numb" "numbe" "number" "v" "va" "var" "vari" "varia" "variab" "variabl" "variable" ) font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "conf" "confi" "confir" "confirm" ) font-lock-reference-face) "[ \t]+" '(( "integer" ) font-lock-type-face) "[ \t]+" '(( "n" "nu" "num" "numb" "numbe" "number" ) font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "conf" "confi" "confir" "confirm" ) font-lock-reference-face) "[ \t]+" '(( "n" "ne" "new" ) font-lock-type-face) "[ \t]+" '(( "f" "fi" "fil" "file" "v" "va" "var" "vari" "varia" "variab" "variabl" "variable" ) font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "conf" "confi" "confir" "confirm" ) font-lock-reference-face) "[ \t]+" '(( "byte" "double" "float" "int" "long" "numeric" "str" "stri" "strin" "string" ) font-lock-type-face) "[ \t]+" '(( "v" "va" "var" "vari" "varia" "variab" "variabl" "variable" ) font-lock-type-face) "\\b" )) ;;; the str# won't quite look right, but that's the breaks for using ;;; a tool like this... (eval-when-compile (make-regexps "[ \t]+" '(( "conf" "confi" "confir" "confirm" ) font-lock-reference-face) "[ \t]+" '(( "str" ) font-lock-type-face) "[1-9]+[0-9]*[ \t]+" '(( "v" "va" "var" "vari" "varia" "variab" "variabl" "variable" ) font-lock-type-face) "\\b" )) ;; the estimates commands (eval-when-compile (make-regexps "[ \t]+" '(( "est" "esti" "estim" "estima" "estimat" "estimate" "estimates" ) font-lock-reference-face) "[ \t]+" '(( "clear" "di" "dir" "dis" "disp" "displ" "displa" "display" "drop" "h" "ho" "hol" "hold" "li" "lis" "list" "loc" "loca" "local" "mat" "matr" "matri" "matrix" "post" "repost" "sca" "scal" "scala" "scalar" "u" "un" "unh" "unho" "unhol" "unhold" ) font-lock-type-face) "\\b" )) ;; the gph commands (eval-when-compile (make-regexps "[ \t]+" '(( "gph" ) font-lock-reference-face) "[ \t]+" '(( "arc" "box" "clear" "close" "font" "line" "open" "pen" "point" "text" "vline" "vpoint" "vpoly" "vtext" ) font-lock-type-face) "\\b" )) ;; some of the matrix commands (eval-when-compile (make-regexps "[ \t]+" '(("mat" "matr" "matri" "matrix") font-lock-reference-face) "[ \t]+" '(("ac" "acc" "accu" "accum" "cole" "coleq" "coln" "colna" "colnam" "cloname" "colnames" "d" "def" "defi" "defin" "define" "di" "dir" "dispCns" "drop" "drop _all" "glsa" "glsac" "glsacc" "glsaccu" "glsaccum" "l" "li" "lis" "list" "makeCns" "mlou" "mlout" "post" "rowe" "roweq" "rown" "rowna" "rownam" "rowname" "rownames" "sco" "scor" "score" "sub" "subs" "subst" "substi" "substit" "substitu" "substitut" "substitute" "svd" "syme" "symei" "symeig" "symeige" "symeigen" "veca" "vecac" "vecacc" "vecaccu" "vecaccum" ) font-lock-type-face) "\\b" )) ;; the ml commands (eval-when-compile (make-regexps "[ \t]+" '(("ml") font-lock-reference-face) "[ \t]+" '(("b" "be" "beg" "begi" "begin" "check" "count" "de" "dep" "depn" "depna" "depnam" "depname" "depnames" "di" "dis" "disp" "displ" "displa" "display" "f" "fu" "fun" "func" "funct" "functi" "functio" "function" "gr" "gra" "grap" "graph" "init" "max" "maxi" "maxim" "maximi" "maximiz" "maximize" "me" "met" "meth" "metho" "method" "ml" "mlo" "mlou" "mlout" "mo" "mod" "mode" "model" "pl" "plo" "plot" "po" "pos" "post" "q" "qu" "que" "quer" "query" "re" "rep" "repo" "repor" "report" "sa" "sam" "samp" "sampl" "sample" "se" "sea" "sear" "searc" "search" "trace") font-lock-type-face) "\\b" )) ;; the net commands (eval-when-compile (make-regexps "[ \t]+" '(("net") font-lock-reference-face) "[ \t]+" '(( "cd" "d" "de" "des" "desc" "descr" "descri" "describ" "describe" "from" "get" "install" "link" "q" "qu" "que" "quer" "query") font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(("net") font-lock-reference-face) "[ \t]+" '(("set") font-lock-reference-face) "[ \t]+" '(("ado" "other") font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(("ado") font-lock-reference-face) "[ \t]+" '(("d" "de" "des" "desc" "descr" "descri" "describ" "describe" "dir" "uninstall") font-lock-type-face) "\\b" )) ;; the reshape commands (eval-when-compile (make-regexps "[ \t]+" '(("reshape") font-lock-keyword-face) "[ \t]+" '(( "clear" "error" "i" "j" "long" "wide" "xi" "xij") font-lock-type-face) "\\b" )) ;; the return commands (eval-when-compile (make-regexps "[ \t]+" '(("ret" "retu" "retur" "return") font-lock-reference-face) "[ \t]+" '(("add" "clear" "local" "matrix" "scalar") font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(("sret" "sretu" "sretur" "sreturn") font-lock-reference-face) "[ \t]+" '(("clear" "local") font-lock-type-face) "\\b" )) ;; the sts commands (eval-when-compile (make-regexps "[ \t]+" '(("sts") font-lock-reference-face) "[ \t]+" '(( "g" "gen" "gene" "gener" "genera" "generat" "generate" "gr" "gra" "grap" "graph" "l" "li" "lis" "list" "t" "te" "tes" "test" ) font-lock-type-face) "\\b" )) ;; the sw commands (eval-when-compile (make-regexps "[ \t]+" '(("sw") font-lock-reference-face) "[ \t]+" '(( "cloglog" "cnreg" "cox" "ereg" "gamma" "glm" "gompertz" "hetprob" "llogist" "lnormal" "logistic" "logit" "ologit" "oprobit" "poisson" "probit" "qreg" "reg" "regr" "regre" "regres" "regress" "scobit" "tobit" "weibull" ) font-lock-type-face) "\\b" )) ;; the window commands (eval-when-compile (make-regexps "[ \t]+" '(( "win" "wind" "windo" "window" ) font-lock-reference-face) "[ \t]+" '(( "d" "di" "dia" "dial" "dialo" "dialog" "dir" "drop" "fo" "fop" "fope" "fopen" "fs" "fsa" "fsav" "fsave" "l" "list" "push" "stop" "stopb" "stopbo" "stopbox" ) font-lock-type-face) "\\b" )) ;; the window controls (eval-when-compile (make-regexps "[ \t]+" '(( "win" "wind" "windo" "window" ) font-lock-reference-face) "[ \t]+" '(( "c" "co" "con" "cont" "contr" "contro" "control" ) font-lock-reference-face) '(( "button" "check" "clear" "edit" "mcombo" "msimple" "radbegin" "radend" "radio" "scombo" "ssimple" "static" ) font-lock-type-face) "\\b" )) ;; the window manage commands (eval-when-compile (make-regexps "[ \t]+" '(( "win" "wind" "windo" "window" ) font-lock-reference-face) "[ \t]+" '(( "man" "mana" "manag" "manage" ) font-lock-reference-face) "[ \t]+" '(( "forward" "minimize" "prefs load" "prefs save" "prefs default" "print graph" "print log" "restore" "update variable" ) font-lock-type-face) "\\b" )) ;; the window menu commands (eval-when-compile (make-regexps "[ \t]+" '(( "win" "wind" "windo" "window" ) font-lock-reference-face) "[ \t]+" '(( "m" "me" "men" "menu" ) font-lock-reference-face) "[ \t]+" '(( "append popout" "append string" "append separator" "clear" "popout" "set" ) font-lock-type-face) "\\b" )) ;; the xwindow commands (eval-when-compile (make-regexps "[ \t]+" '(( "xwin" "xwind" "xwindo" "xwindow" ) font-lock-reference-face) "[ \t]+" '(( "de" "def" "defi" "defin" "define" "di" "dir" "drop" "l" "li" "lis" "list" ) font-lock-type-face) "\\b" )) ;; all the endless Stata keywords (not in a good order) ;; first those keywords which must start line ;; note that these will look like text if preceded by a comment ;; (but comments shouldn't be before the command, anyway) (eval-when-compile (make-regexps "^[ \t]+" '(( "cap" "capt" "captu" "captur" "capture" "char" "err" "erro" "error" "e" "ex" "exi" "exit" "par" "pars" "parse" "set" ) font-lock-reference-face) "\\b" )) ;; here are some keywords which appear in the middle of lines ;; note that the really short abbreviations could make a mess of things ;; ;; These are split to allow compiling! (eval-when-compile (make-regexps "\\b" '(( "_huber" "_qreg" "_robust" "acprplot" "adjust" "adopath" "alpha" "an" "ano" "anov" "anova" "arch" "areg" "arima" "as" "ass" "asse" "asser" "assert" "avplot" "avplots" "bcskew0" "be" "bee" "beep" "biprobit" "bitest" "bitesti" "blogit" "boxcox" "bprobit" "br" "break" "brier" "bro" "brow" "brows" "browse" "bsqreg" "bstat" "by" "canon" "cat" "cc" "cci" "cchart" "centile" "cf" "ci" "cii" "clogi" "clogit" "clogitp" "cloglog" "close" "cmdtool" "cnr" "cnre" "cnreg" "cnsreg" "codebook" "compare" "copy" "cor" "corc" "corr" "corre" "correl" "correla" "correlat" "correlate" "corrgram" "cou" "coun" "count" "cox" "cprplot" "_crcswxx" "cs" "csi" "ct" "ctset" "cttost" "cumul" "cusum") font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "d" "de" "des" "desc" "descr" "descri" "describ" "describe" "dfbeta" "dfuller" "di" "dir" "dis" "disp" "disp_res" "disp_s" "displ" "displa" "display" "do" "dotplot" "dprobit" "ds" "dstdize" "dwstat" "eivreg" "eq" "ereg" "fac" "fact" "facto" "factor" "fit" "for" "fpredict" "fracplot" "fracpoly" "fsl" ) font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "gettoken" "gladder" "glm" "glmpred" "glogit" "gnbreg" "gompertz" "gphdot" "gphpen" "graph" "gprobit" "greigen" "grmeanby" "hadimvo" "hausman" "heckman" "heckprob" "hetprob" "hettest" "hilite" "hist" "hlu" "hotel" "iqreg" "istdize" "iis" "ins" "insp" "inspe" "inspec" "inspect" "integ" "intreg" "ir" "iri" "ivreg" "kap" "kappa" "kapwgt" "kdensity" "ksm" "ksmirnov" "ktau" "kwallis" ) font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "l" "ladder" "lfit" "lincom" "linktest" "li" "lis" "list" "log" "logistic" "logi" "logit" "loneway" "lookfor" "lo" "loo" "look" "looku" "lookup" "lpredict" "lroc" "lrtest" "ls" "lsens" "lstat" "ltable" "lv" "lvr2plot" "man" "matcproc" "mcc" "mcci" "means" "mlog" "mlogi" "mlogit" "mor" "more" "mvreg" "mx_param" "n" "nbreg" "newey" "news" "nl" "nlinit" "no" "noi" "nois" "noisi" "noisil" "noisily" "note" "notes" "nptrend" "numlist" "olog" "ologi" "ologit" "ologitp" "on" "one" "onew" "onewa" "oneway" "oprob" "oprobi" "oprobit" "oprobitp" "orthog" "orthpoly" "ovtest") font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(("pac" "pchart" "pchi" "pcorr" "pergram" "pl" "plo" "plot" "pnorm" "poisgof" "poisson" "pperron" "prais" "prob" "probi" "probit" "prtest" "prtesti" "pwcorr" "pwd" "q" "qchi" "qnorm" "qqplot" "qreg" "quadchk" "quantile" "qu" "que" "quer" "query" "qui" "quie" "quiet" "quietl" "quietly" "ranksum" "rchart" "regdw" "regph" "reg" "reg3" "regr" "regre" "regres" "regress" "reshape" "rot" "rota" "rotat" "rotate" "rreg" "run" "runtest" "rvfplot" "rvpplot" ) font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "sampsi" "sconfirm" "sco" "scobit" "scor" "score" "sdtest" "sdtesti" "search" "serrbar" "sfrancia" "shell" "shelltool" "shewhart" "signrank" "signtest" "sktest" "slog" "spearman" "spikeplt" "sqreg" "st" "st_is" "st_show" "st_ct" "stcox" "stcoxkm" "stcurv" "stdes" "stem" "stereg" "stir" "stmc" "stmh" "stphplot" "stphtest" "strate" "streg" "sts" "stse" "stset" "stsum" "stvary" "stweib" "su" "sum" "summ" "summa" "summar" "summari" "summariz" "summarize" "sureg" "svydes" "svyintrg" "svyivreg" "svylc" "svylogit" "svymean" "svymean" "svymlog" "svyolog" "svyoprob" "svypois" "svyprobt" "svyprop" "svyratio" "svyreg" "svyset" "svytab" "svytest" "svytotal" "swilk" "symmetry" "symmi" "symplot" "syntax" "sysdir" ) font-lock-reference-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "ta" "tab" "tab1" "tab2" "tabdisp" "tabi" "table" "tabu" "tabul" "tabula" "tabulat" "tabulate" "te" "tes" "test" "testnl" "testparm" "tis" "tob" "tobi" "tobit" "token" "tokeni" "tokeniz" "tokenize" "touch" "tsreport" "tsset" "tsunab" "ttest" "ttesti" "ty" "typ" "type" "unab" "using" "vce" "verinst" "vif" "vwls" "weibull" "which" "who" "wntestb" "wntestq" "xchart" "xcorr" "xtclog" "xtdes" "xtgee" "xtgls" "xthaus" "xtintreg" "xtlogit" "xtnbreg" "xtpois" "xtprobit" "xtrchh" "xtreg" "xtsum" "xttab" "xttest0" "xttobit" "xttrans" "zip" "zinb" ) font-lock-reference-face) "\\b" )) ;; conditional statements ;; if might not work right ('cuz it is also a keyword) (eval-when-compile (make-regexps "^[ \t]*\\sw+[ \t]*" '(("if" ) font-lock-reference-face t t) "\\b" )) (eval-when-compile (make-regexps "^[ \t]*" '(("if" "while" ) font-lock-reference-face t t) "[ \t]+.*{" )) ;; else statement (which must just have a {) (eval-when-compile (make-regexps "^[ \t]*" '(("else" ) font-lock-reference-face) "[ \t]*{" )) ;; short version of list --- which can get fooled if used as a var (eval-when-compile (make-regexps '(("^[ \t]*l\\b" ) font-lock-reference-face) )) ;; all the Stata options ;; commonly used options (eval-when-compile (make-regexps "[ \t]+" '(("byte" "int" "long" "str[1-9]+[0-9]?" "float" "double" "width" "maxobs" "maxvar" ) font-lock-type-face) "[ \t]+" )) ;; special local variables (used in parsing) (eval-when-compile (make-regexps "^[ \t]+\\(local\\)+[ \t]+" '(("varlist" "exp" "weight" "if" "in" "using" "options" ) font-lock-type-face nil t t) "\\b" )) ;; things used with display ;; since these are often split across lines, and Stata commands are hard ;; to delimit, this will highlight even if out of context (eval-when-compile (make-regexps "[ \t]+" '(( "_c" "_co" "_con" "_cont" "_conti" "_contin" "_continu" "_continue" "_n" "_ne" "_new" "_newl" "_newli" "_newlin" "_newline" "_quote" "_r" "_re" "_req" "_requ" "_reque" "_reques" "_request" ) font-lock-type-face) "\\b" )) (eval-when-compile (make-regexps "[ \t]+" '(( "_col" "_colu" "_colum" "_column" "_d" "_du" "_dup" "_s" "_sk" "_ski" "_skip" ) font-lock-type-face) "([1-9]+[0-9]*)\\b" )) (eval-when-compile (make-regexps "\\bin[ \t]+" '(( "b" "bl" "blu" "blue" "g" "gr" "gre" "gree" "green" "r" "re" "red" "w" "wh" "whi" "whit" "white" "y" "ye" "yel" "yell" "yello" "yellow" ) font-lock-type-face) "\\b" )) ;; labels (eval-when-compile (make-regexps "[ \t]+" '(("lab" "labe" "label" ) font-lock-reference-face t) "[ \t]+" '(( "da" "dat" "data" "de" "def" "defi" "defin" "define" "di" "dir" "drop" "l" "li" "lis" "list" "save" "val" "valu" "value" "values" "var" "vari" "varia" "variab" "variabl" "variable" ) font-lock-type-face nil t t) "[ \t]" )) ;; all Stata data-altering stuff (eval-when-compile (make-regexps "\\b" '(( "_pctile" "_predict" "aorder" "append" "bcskew0" "bsample" "bs" "bstrap" "cd" "chdir" "clear" "compress" "contract" "convert" "cross" "dec" "deco" "decod" "decode" "discard" "drop" "dydx" "ed" "edi" "edit" "egen" "en" "enc" "enco" "encod" "encode" "erase" "expand" "fillin" "form" "forma" "format" "fracgen" "fracpred" "g" "ge" "gen" "gene" "gener" "genera" "generat" "generate" "gsort" "impute" "infile" "infix" "input" "insheet" "integ" "ipolate" "joinby" "keep" "lnskew0" ) font-lock-keyword-face) "\\b" )) (eval-when-compile (make-regexps "\\b" '(( "mark" "markout" "marksample" "matname" "mer" "merg" "merge" "mkdir" "mkmat" "mkspline" "mleval" "mlmatsum" "mlsum""mlvecsum" "modify" "mov" "move" "mvdecode" "mvencode" "nlpred" "nobreak" "order" "ou" "out" "outf" "outfi" "outfil" "outfile" "outs" "outsh" "outshe" "outshee" "outsheet" "pctile" "post" "postclose" "postfile" "pre" "pred" "predi" "predic" "predict" "preserve" "range" "recast" "recode" "ren" "rena" "renam" "rename" "renpfix" "replace" "restore" "rm" "sappend" "sa" "sav" "save" "sample" "sdrop" "separate" "simul" "sinfile" "smerge" "smooth" "snapspan" "so" "sor" "sort" "ssave" "ssort" "stack" "stbase" "stfill" "stgen" "stjoin" "stsplit" "sttocc" "sttoct" "suse" "svmat" "tsfill" "tsrevar" "u" "us" "use" "xi" "xi:" "xtile" "xpose" "xtdata" "xtpred" ) font-lock-keyword-face) "\\b" )) ;; assignment of macros (eval-when-compile (make-regexps "^[ \t]*" '(("global" "local" "scalar" ) font-lock-reference-face) '(("\\([ \t]+[a-zA-Z_]+[a-zA-Z_0-9]*\\b\\)?" ) font-lock-variable-name-face t) )) ;; choosing temp names (eval-when-compile (make-regexps "^[ \t]*" '(("tempname" "tempfile" "tempvar" ) font-lock-reference-face) '(("\\([ \t]+[a-zA-Z_]+[a-zA-Z_0-9`']*\\)+" ) font-lock-type-face t) )) ;; all variable/macro stuff (put late so it will override) ;; internal constants (eval-when-compile (make-regexps "[^a-zA-Z]" '(("_merge" "_n" "_pi" "_rc" "_N" ) font-lock-variable-name-face) "[^a-zA-Z]" )) ;; some generated vars (eval-when-compile (make-regexps '(("_result([1-9]+)" ) font-lock-variable-name-face) )) ;; global macros (eval-when-compile (make-regexps '(("\\$[a-zA-Z_*]+[a-zA-Z_0-9]*" ) font-lock-variable-name-face t) )) ;; local macros (eval-when-compile (make-regexps "`+" '(("[a-zA-Z_`*]+[a-zA-Z_0-9]*" ;has glitch interior ` is highlighted ) font-lock-variable-name-face t) "'+" )) ;; other macro commands (eval-when-compile (make-regexps "[ \t]*" '(( "ma" "mac" "macr" "macro" ) font-lock-reference-face) "[ \t]+" '(( "de" "def" "define" "di" "dir" "drop" "l" "li" "lis" "list" "s" "sh" "shi" "shif" "shift" ) font-lock-type-face) "[ \t]+" )) ;; stata 'functions' i.e. things which require () after them (eval-when-compile (make-regexps "\\b" '(("_caller" "abs" "acos" "asin" "atan" "autocode" "Binomial" "binorm" "chiprob" "comb" "cond" "cos" "d" "date" "digamma" "day" "dofh" "dofm" "dofq" "dofw" "dofy" "dow" "doy" "e" "exp" "float" "fprob" "gammap" "get" "group" "h" "halfyear" "halfyearly" "hofd" "ibeta" "index" "int" "invbinomial" "invchi" "invfprob" "invgammap" "invnchi" "invnorm" "invt" "length" "ln" "lnfact" "lngamma" "log" "log10" "lower" "ltrim" "m" "matrix" "max" "mdy" "min" "missing" "mod" "mofd" "month" "monthly" "nchi" "normd" "normprob" "npnchi" "q" "qofd" "quarter" "quarterly" "r" "real" "recode" "reldif" "replay" "return" "round" "rtrim" "s" "scalar" "sign" "sin" "sqrt" "string" "substr" "sum" "tan" "tprob" "trigamma" "trim" "uniform" "uniform0" "upper" "w" "week" "weekly" "wofd" "y" "year" "yearly" "yh" "ym" "yofd" "yq" "yw" ) font-lock-reference-face t) "(" )) ;; stata 'functions' i.e. things which require [] after them (eval-when-compile (make-regexps "\\b" '(("_b" "_coef" "_se") font-lock-reference-face t) "\\[" )) ;; common Stata options which require a () after them (eval-when-compile (make-regexps "[, \t]+" '(("bands" "by" "connect" "density" "gap" "iterate" "ltolerance" "margin" "psize" "saving" "tlabel" "tolerance" "xlabel" "xscale" "ylabel" "yscale") font-lock-type-face t) "(" )) ;; egen 'function' options (eval-when-compile (make-regexps "[ \t]*egen[ \t]+.*=[ \t]*" '(("count" "diff" "fill" "group" "iqr" "ma" "max" "mean" "median" "min" "mtr" "pctile" "rank" "rfirst" "rlast" "rmax" "rmean" "rmin" "rmiss" "robs" "rsd" "rsum" "sd" "std" "sum") font-lock-reference-face t) "(.*)" )) ;; All Custom ado files which are 'reliable' and which are not file killers ;; this might be a useless endeavor --- but I cannot generate tag files ;; all the s-extensions are listed under Stata's name (since they alter ;; data and will be moved tot he utils directory (eval-when-compile (make-regexps "[ \t]*" '(("addnote" "anypath" "autolab" "checkvar" "ck1icd9" "ckicd9" "datetoe" "dattomdy" "den2dem" "dishis" "dtapath" "dupclean" "echo" "exdupbil" "ezip2hsa" "getdate" "getlbl" "getnames" "getobs" "gplur" "icd9" "issorted" "isfile" "jultoe" "jultof" "jultomdy" "knowndup" "labeldir" "linker" "markit" "makewide" "missize" "mpcounts" "nodups" "notefile" "prov2zip" "qcolsum" "qorder" "random" "readraw" "readzip" "repart" "setup" "stdrate" "timeslot" "wdatetoe" "wdatomdy" "zip2ezip" "_addext" "_brclean" "_brckado" "_brdlog" "_ckbad" "_ckdunno" "_ckdupl" "_ckmiss" "_ckok" "_ckwarn" "_delimit" "_filenm" "_lookup" "_mk_ck" ) font-lock-function-name-face) "\\b" )) )) (defvar ess-STA-mode-font-lock-defaults (ado-set-font-lock-keywords) "Set the Stata mode font-lock keywords to Bill Rising's ado-mode keywords.") (defvar STA-editing-alist '((paragraph-start . (concat "[ \t\f]*$\\|" page-delimiter)) (paragraph-separate . (concat "[ \t\f]*$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (require-final-newline . mode-require-final-newline) (comment-column . 40) ;;(comment-indent-function . 'S-comment-indent) ;;(ess-comment-indent . 'S-comment-indent) ;;(ess-indent-line . 'S-indent-line) ;;(ess-calculate-indent . 'ess-calculate-indent) (indent-line-function . 'ess-indent-line) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) (ess-local-process-name . nil) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . STA-syntax-table) (font-lock-defaults . '(ess-STA-mode-font-lock-defaults nil nil ((?\. . "w"))))) "General options for editing Stata do and ado source files.") ;; YOU USED TO HAVE TO (with Thomas's version): ;;;;; Add the following to your .emacs file ;; ;;(autoload 'stata "~/ess-sta-l.el" "inferior stata mode" t ) ;;(autoload 'stata-help "stata" "stata help mode" t) ;;(autoload 'stata-mode "~/ess-sta-l.el" "stata mode" t) ;; ;;(if (assoc "\\.do$" auto-mode-alist) nil ;; (setq auto-mode-alist ;; (append ;; '(("\\.do$" . stata-mode) ;; ("\\.ado$" . stata-mode)) ;; auto-mode-alist))) ;; ;; QUESTIONS TO ASK THOMAS: ;; 1 - are 'help' and 'lookup' the same? ;; 2 - what is the point of the review buffer? ;; 3 - how to quit? ;; ;; NOTE: all of Thomas's functions have been left here, to be removed ;; or merged into real locations as we work on this. ;; ;;;;;;;;; Things to change (defvar stata-switches "-q" "*Switches to apply to stata invocation.") (defvar stata-profile "~/.stataprofile" "File to read on startup (nil for no file).") ;;;;;;;;;;;;;;; ;;(require 'comint) (defun stata-help (the-subject) "Stata help in other buffer." (interactive "sHelp on: ") (let* ((stata-process (get-process "stata")) (stata-buffer (process-buffer stata-process)) oldpf oldpb oldpm) (set-buffer stata-buffer) (setq oldpf (process-filter stata-process)) (setq oldpb (process-buffer stata-process)) (setq oldpm (marker-position (process-mark stata-process))) (save-excursion (if stata-process nil (error "Stata is not running.")) (beginning-of-line) (if (looking-at ". ") nil (error "Stata not ready.")) (save-excursion (set-process-buffer stata-process (get-buffer-create "*stata help*")) (set-buffer "*stata help*") (setq buffer-read-only nil) (set-process-filter stata-process 'inferior-ess-ordinary-filter) (erase-buffer) (process-send-string stata-process "help ") (process-send-string stata-process the-subject) (process-send-string stata-process "\n") (stata-prompt-wait stata-process) ;;(stata-help-mode) (set-buffer stata-buffer) (set-process-buffer stata-process oldpb) (set-process-filter stata-process oldpf) (set-marker (process-mark stata-process) oldpm))) (display-buffer "*stata help*"))) (defun stata-lookup (the-subject) "Stata lookup in other buffer" (interactive "sLook up: ") (let* ((stata-process (get-process "stata")) (stata-buffer (process-buffer stata-process)) oldpf oldpb oldpm) (set-buffer stata-buffer) (setq oldpf (process-filter stata-process)) (setq oldpb (process-buffer stata-process)) (setq oldpm (marker-position (process-mark stata-process))) (save-excursion (if stata-process nil (error "Stata is not running.")) (beginning-of-line) (if (looking-at ". ") nil (error "Stata not ready.")) (save-excursion (set-process-buffer stata-process (get-buffer-create "*stata help*")) (set-buffer "*stata help*") (setq buffer-read-only nil) (set-process-filter stata-process 'inferior-ess-ordinary-filter) (erase-buffer) (process-send-string stata-process "lookup ") (process-send-string stata-process the-subject) (process-send-string stata-process "\n") (stata-prompt-wait stata-process) (stata-help-mode) (set-buffer stata-buffer) (set-process-buffer stata-process oldpb) (set-process-filter stata-process oldpf) (set-marker (process-mark stata-process) oldpm))) (display-buffer "*stata help*"))) (defun stata-variables () "Stata variable list in other buffer." (interactive) (let* ((stata-process (get-process "stata")) (stata-buffer (if stata-process (process-buffer stata-process) (error "Stata is not running."))) oldpf oldpb oldpm) (set-buffer stata-buffer) (setq oldpf (process-filter stata-process)) (setq oldpb (process-buffer stata-process)) (setq oldpm (marker-position (process-mark stata-process))) (save-excursion (if stata-process nil (error "Stata is not running.")) (beginning-of-line) (if (looking-at ". ") nil (error "Stata not ready.")) (save-excursion (set-process-buffer stata-process (get-buffer-create "*stata variables*")) (set-process-filter stata-process 'inferior-ess-ordinary-filter) (set-buffer "*stata variables*") (setq buffer-read-only nil) (erase-buffer) (process-send-string stata-process "desc \n ") (stata-prompt-wait stata-process) (setq buffer-read-only t) (set-buffer stata-buffer) (set-process-buffer stata-process oldpb) (set-marker (process-mark stata-process) oldpm) (set-process-filter stata-process oldpf))) (display-buffer "*stata variables*") (goto-char (point-max)))) (defun stata-review-window () (interactive) (display-buffer "*stata review*")) (defun stata-rehelp () (interactive) (stata-help (current-word))) ;;;; ;;; This doesn't do anything at the moment. I have vague plans of ;;; implementing a menu interface using emacs ;;; (defun stata-watch-for-menu-filter (proc string) (if (string-match "^!!!window!!!" string) (stata-handle-menu-code proc string) (comint-output-filter proc string))) (defun stata-handle-menu-code (proc string) (let ((old-buffer (current-buffer))) (unwind-protect (let (moving) (set-buffer (process-buffer proc)) (setq moving (= (point) (process-mark proc))) (save-excursion ;; Insert the text, moving the process-marker. (goto-char (process-mark proc)) (insert "Handling menu code\n") (set-marker (process-mark proc) (point))) (if moving (goto-char (process-mark proc)))) (set-buffer old-buffer)))) ;;;; (defun stata-add-to-review-buffer (string) "Adds input to review buffer." (save-excursion (set-buffer (get-buffer-create "*stata review*")) (goto-char (point-max)) (insert string))) (defun stata-prompt-wait (proc &optional start-of-output) "Wait for a prompt to appear at BOL of current buffer. PROC is the stata process. Does not change point." (if start-of-output nil (setq start-of-output (point-min))) (save-excursion (while (progn ;; get output if there is some ready (accept-process-output proc 0 50) (goto-char (marker-position (process-mark proc))) (beginning-of-line) (if (< (point) start-of-output) (goto-char start-of-output)) (not (looking-at "^. ")))))) ;;(defvar inferior-stata-mode-map nil ;; "Keymap for Stata mode") ;;(setq inferior-stata-mode-map (cons 'keymap comint-mode-map)) ;;(define-key inferior-stata-mode-map "\M-\t" 'comint-replace-by-expanded-filename) ;;(define-key inferior-stata-mode-map "\C-c\C-v" 'stata-variables) ;;(define-key inferior-stata-mode-map "\C-c\C-h" 'stata-help) ;;(define-key inferior-stata-mode-map "\C-c\C-u" 'stata-lookup) ;;(define-key inferior-stata-mode-map "\C-c\C-r" 'stata-review-window) ;;(define-key inferior-stata-mode-map [menu-bar stata] ;; (cons "Stata" (make-sparse-keymap "Stata"))) ;;(define-key inferior-stata-mode-map [menu-bar stata statahelp] ;; '("Help on..." . stata-help)) ;;(define-key inferior-stata-mode-map [menu-bar stata lookup] ;; '("Look up..." . stata-lookup)) ;;(define-key inferior-stata-mode-map [menu-bar stata variables] ;; '("Variables" . stata-variables)) ;;(define-key inferior-stata-mode-map [menu-bar stata review] ;; '("Review" . stata-review-window)) ;;(defvar stata-mode-map nil ;; "Keymap for Stata mode") ;;(setq stata-mode-map (make-sparse-keymap)) ;;(define-key stata-mode-map "\C-c\C-r" 'stata-eval-region) ;;(define-key stata-mode-map "\C-c\M-r" 'stata-eval-region-and-go) ;;(define-key stata-mode-map "\C-c\C-b" 'stata-eval-buffer) ;;(define-key stata-mode-map "\C-c\M-b" 'stata-eval-buffer-and-go) ;;(define-key stata-mode-map "\C-c\C-f" 'stata-eval-function) ;;(define-key stata-mode-map "\C-c\C-n" 'stata-eval-line-and-next-line) ;;(define-key stata-mode-map "\C-c\C-j" 'stata-eval-line) ;;(define-key stata-mode-map "\C-c\C-r" 'stata-review-window) ;;(define-key stata-mode-map "\C-c\M-j" 'stata-eval-line-and-go) ;;(define-key stata-mode-map "\C-c\C-y" 'stata-switch-to-stata) ;;(define-key stata-mode-map "\C-c\C-z" 'stata-switch-to-end-of-stata) ;;;;(define-key stata-mode-map "\C-c\C-l" 'stata-load-file) ;;(define-key stata-mode-map "\C-c\C-h" 'stata-help) ;;(define-key stata-mode-map "\C-c\C-v" 'stata-variables) ;;(define-key stata-mode-map "\M-\t" 'comint-replace-by-expanded-filename) ;;(define-key stata-mode-map "\177" 'backward-delete-char-untabify) ;;(define-key stata-mode-map "\C-c\C-u" 'stata-lookup) ;;(define-key stata-mode-map [menu-bar stata] ;; (cons "Stata" (make-sparse-keymap "Stata"))) ;;(define-key stata-mode-map [menu-bar stata lookup] ;; '("Look up..." . stata-lookup)) ;;(define-key stata-mode-map [menu-bar stata statahelp] ;; '("Help on..." . stata-help)) ;;(define-key stata-mode-map [menu-bar stata variables] ;; '("Variables" . stata-variables)) ;;(define-key stata-mode-map [menu-bar stata review] ;; '("Review" . stata-review-window)) ;;(define-key stata-mode-map [menu-bar stata eval-line] ;; '("Eval line" . stata-eval-line)) ;;(define-key stata-mode-map [menu-bar stata eval-next] ;; '("Eval line and next line" . stata-eval-line-and-next-line)) ;;(define-key stata-mode-map [menu-bar stata eval-go] ;; '("Eval line and go" . stata-eval-line-and-go)) ;;(define-key stata-mode-map [menu-bar stata eval-buff] ;; '("Eval buffer" . stata-eval-buffer)) ;;(define-key stata-mode-map [menu-bar stata eval-buff-go] ;; '("Eval buffer and go" . stata-eval-buffer-and-go)) ;;(define-key stata-mode-map [menu-bar stata to-stata] ;; '("Switch to stata" . stata-switch-to-stata)) ;; ;; ;; ;(defvar stata-help-mode-map nil) ;(setq stata-help-mode-map (cons 'keymap help-mode-map)) ;(define-key stata-help-mode-map [mouse-2] 'stata-rehelp) ;(define-key stata-help-mode-map "\C-c\C-r" 'stata-rehelp) ;(define-key stata-help-mode-map "\C-c\C-h" 'stata-help) ;(define-key stata-help-mode-map [menu-bar stata] ; (cons "Stata" (make-sparse-keymap "Stata"))) ;(define-key stata-help-mode-map [menu-bar stata statahelp] ; '("Help on..." . stata-help)) ;(define-key stata-help-mode-map [menu-bar stata rehelp] ; '("rehelp (hyperlink)" . stata-rehelp)) ;; ;;(defun inferior-stata-mode () ;;"Major mode for running Stata. Based on comint-mode. ;;Features include Help (\\[stata-help]), Review (\\[stata-review-window]) and ;;Variables (\\[stata-variables]) mimicking the help, review and ;;variables windows of Stata for Windows ;;\\{inferior-stata-mode-map}" ;; (interactive) ;; (make-comint "stata" "stata" ;; (and stata-profile ;; (or (file-exists-p stata-profile) ;; (null (message "Startup file %s not found." ;; stata-profile))) stata-profile) ;; stata-switches) ;; (switch-to-buffer "*stata*" ) ;; (setq comint-process-echoes t) ;; (set-process-filter (get-process "stata") 'stata-watch-for-menu-filter) ;; (setq comint-input-filter-functions ;; (cons 'stata-add-to-review-buffer comint-input-filter-functions)) ;; (save-excursion ;; (set-buffer (get-buffer-create "*stata review*")) ;; (stata-mode)) ;; (setq major-mode 'inferior-stata-mode) ;; (setq mode-name "inferior Stata") ;; (use-local-map inferior-stata-mode-map)) ;; ;;(defun stata () ;; (interactive) ;; (inferior-stata-mode)) ;; (defun stata-help-mode () "Major mode for displaying Stata help in a read-only buffer. Active commands are Help (\\[stata-help]) and hyperlink (\\[stata-rehelp] or mouse-2)." (interactive) (setq major-mode 'stata-help-mode) (setq mode-name "Stata help") ;;(use-local-map stata-help-mode-map) (setq buffer-read-only t)) ;; ;; ;;(defun stata-mode () ;;"Major mode for editing Stata files. Commands for sending lines to ;;Stata (\\[stata-eval-line], \\[stata-eval-line-and-go], ;;\\[stata-eval-line-and-next-line]) ;;and for displaying Stata help (\\[stata-help]), variables (\\[stata-variables]) ;; and review window (\\[stata-review-window]) ;;\\{stata-mode-map}" ;; (interactive) ;; (kill-all-local-variables) ;; (setq major-mode 'stata-mode) ;; (setq mode-name "Stata") ;; (use-local-map stata-mode-map)) ;; ;; ;;(defun stata-eval-region (start end) ;; "Send the current region to the inferior stata process." ;; (interactive "r") ;; (process-send-region "stata" start end) ;; (process-send-string "stata" "\n")) ;;(defun stata-eval-buffer () ;; "Send the current buffer to the inferior stata process." ;; (interactive) ;; (stata-eval-region (point-min) (point-max))) ;;(defun stata-eval-line () ;; "Send the current line to the inferior stata process." ;; (interactive) ;; (save-excursion ;; (end-of-line) ;; (let ((end (point))) ;; (beginning-of-line) ;; (stata-eval-region (point) end)))) ;;(defun stata-eval-line-and-next-line () ;; "Evaluate the current line and move to the next line." ;; ;; From an idea by Rod Ball (rod@marcam.dsir.govt.nz) ;; (interactive) ;; (display-buffer (process-buffer (get-process "stata"))) ;; (save-excursion ;; (end-of-line) ;; (let ((end (point))) ;; (beginning-of-line) ;; ;; RDB modified to go to end of S buffer so user can see result ;; ;;(stata-eval-visibly (buffer-substring (point) end) nil t))) ;; (stata-eval-region (point) end))) ;; (next-line 1)) ;;(defun stata-eval-region-and-go (start end ) ;; "Send the current region to the inferior S and switch to the process buffer." ;; (interactive "r\nP") ;; (stata-eval-region start end) ;; (stata-switch-to-stata t)) ;;(defun stata-eval-buffer-and-go () ;; "Send the current buffer to the inferior stata and switch to the process buffer." ;; (interactive) ;; (stata-eval-buffer) ;; (stata-switch-to-stata t)) ;;(defun stata-eval-line-and-go () ;; "Send the current line to the inferior stata process and switch to the ;;process buffer." ;; (interactive) ;; (stata-eval-line) ;; (stata-switch-to-stata t)) ;;(defun stata-switch-to-stata (eob-p) ;; "Switch to the current inferior stata process buffer. ;;With argument, positions cursor at end of buffer." ;; (interactive "P") ;; (let (stata-process (get-process "stata")) ;; (if stata-process ;; (progn ;; (switch-to-buffer (process-buffer stata-process)) ;; (if eob-p (goto-char (point-max)))) ;; (progn ;; (message "No inferior stata process") ;; (ding))))) ;;(defun stata-switch-to-end-of-stata nil ;; "Switch to the end of the inferior stata process buffer." ;; (interactive) ;; (stata-switch-to-stata t)) ;;; Suggested function from Brendan Halpin: (defvar ess-STA-delimit-do-file "delimit-do.do") (defun ess-STA-delimit-do () (save-excursion (let ((commands (buffer-substring-no-properties (region-beginning) (region-end)))) (set-buffer (get-buffer-create ess-STA-delimit-do-file)) (delete-region (point-min) (point-max)) (insert "#delimit ;\n" commands "\n#delimit cr\n") (write-file ess-STA-delimit-do-file nil) (comint-send-string "Stata" (format "do %s \n" ess-STA-delimit-do-file))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (provide 'ess-sta-l) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sta-l.el ends here ess/lisp/ess-r-gui.el0000664000175000017500000002020412423756516013041 0ustar eddedd;;; ess-r-gui.el --- Run Rgui on Windows as an inferior Emacs process ;; Copyright (C) 2008 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: 10 Mar 2008 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;In Rgui: ;> library(tcltk2) ## >= 1.0-6 ;> .ess.command <- function() source("c:/temp/ess-tempfile.R", echo=TRUE) ;> tclFun(.ess.command) ;[1] "R_call 0203A04C" ;;; Code: (require 'ess-dde) ;; needed here because we override several definitions (defun ess-ddeclient-p () "Returns the name of the ddeclient iff `ess-local-process-name' is associated with an `inferior-ess-ddeclient', and nil if the ess-process is running as an ordinary inferior process. Alway nil on Unix machines." (interactive) (if ess-microsoft-p (let ((ess-ddeclient (ess-get-process-variable 'inferior-ess-ddeclient))) (if (not (equal ess-ddeclient (default-value 'inferior-ess-ddeclient))) ess-ddeclient)))) (defun ess-eval-region-execdde (start end even-empty) "Loop through lines in region and send them to ESS via execdde." (setq ;; set the following variables for the current ddeESS process. inferior-ess-ddeclient (ess-get-process-variable 'inferior-ess-ddeclient) ) (write-region start end ess-command-file nil nil 'no-message) (call-process-shell-command (concat inferior-ess-execdde ess-rgui-command)) ) (if (not (getenv "R_HOME")) (setenv "R_HOME" "c:/progra~1/R/R-2.6.1")) ;; ^^^^^^^^^ FIXME! do something better (defvar inferior-Rgui-program-name "cmd" "Rgui program name") (defvar Rgui-pager "emacsclientw.exe" "Rgui pager program") (defvar ess-command-file "c:/temp/ess-tempfile.R" "file name for communication with Rgui") (defvar inferior-ess-execdde (concat (getenv "R_HOME") "/site-library/tcltk2/bin/execdde.exe") "Full pathname to execdde executable") (defvar ess-rgui-command " -s TclEval -t R -c .ess.command > NUL" "command to inferior-ess-execdde that will make Rgui read the command file") (defvar inferior-ess-language-start-rgui "options(chmhelp=FALSE, htmlhelp=FALSE, help_type='text'); require(tcltk2)" "additional arguments to rgui") (defun ess-eval-region-ddeclient (start end even-empty) "Loop through lines in region and send them to ESS via ddeclient." (setq ;; set the following variables for the current ddeESS process. inferior-ess-ddeclient (ess-get-process-variable 'inferior-ess-ddeclient) inferior-ess-client-name (ess-get-process-variable 'inferior-ess-client-name) inferior-ess-client-command (ess-get-process-variable 'inferior-ess-client-command)) (narrow-to-region start end) (goto-char (point-min)) (if (equal inferior-ess-ddeclient "execdde") (ess-eval-region-execdde start end even-empty) (let ((beg)) (while (or (< (point) (point-max)) (and (= 1 (point-max)) even-empty)) (setq beg (point)) (end-of-line) ;; call-process-region won't send over a 0-character line. ;; We go outside the loop to create a 1-character line " " in the ;; *ESS-temporary* buffer (if (= beg (point)) ;; do empty line outside loop (ess-eval-linewise-ddeclient " " nil 'eob t) (call-process-region beg (point) inferior-ess-ddeclient nil nil nil inferior-ess-client-name inferior-ess-client-command)) (forward-line 1)))) (widen)) (defvar Rgui-customize-alist (append '((ess-local-customize-alist . 'Rgui-customize-alist) (ess-dialect . "R") (ess-suffix . "R") (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-mode-syntax-table . R-syntax-table) (ess-mode-editing-alist . R-editing-alist) (ess-change-sp-regexp . ess-R-change-sp-regexp) (ess-help-sec-regex . ess-help-R-sec-regex) (ess-help-sec-keys-alist . ess-help-R-sec-keys-alist) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-cmd-delay . ess-R-cmd-delay) (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-r-namedb.el" ) (inferior-ess-program . inferior-Rgui-program-name) (inferior-ess-objects-command . inferior-R-objects-command) (inferior-ess-font-lock-keywords . 'inferior-R-font-lock-keywords) (inferior-ess-search-list-command . "search()\n") (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . nil) ;; "chm") ;;? (inferior-ess-exit-command . "q()") (inferior-ess-exit-prompt . "Save workspace image? [y/n/c]: ") (inferior-ess-primary-prompt . "\\([A-Z/][][A-Za-z0-9./]*\\)*[>$] ") (inferior-ess-secondary-prompt . "+ ?") ;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help? (inferior-ess-start-file . nil) ;; "~/.ess-R" (inferior-ess-start-args . "") (inferior-ess-ddeclient . "execdde") (ess-STERM . "ddeSS") (ess-editor . R-editor) (ess-pager . Rgui-pager) ) S-common-cust-alist) "Variables to customize for Rgui") (defun Rgui (&optional proc-name) "Call 'Rgui for Windows'. Put R in an independent MS-Window (R persists even if the '(ddeESS [R])' window is killed in emacs). Do this by creating a comint process that calls cmd. This is a placeholder buffer with mode '(ddeESS [R])'. Commands sent from an (ESS[S] [R]) buffer to this process will be sourced into the independent Rgui R Console." (interactive) (save-excursion (setq ess-customize-alist Rgui-customize-alist) (ess-write-to-dribble-buffer (format "\n(Rgui): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (let ((default-ddeclient (default-value 'inferior-ess-ddeclient))) (cd (w32-short-file-name (directory-file-name default-directory))) ;; (setenv "S_PROJ" default-directory) (setq-default inferior-ess-ddeclient "execdde") (inferior-ess) (setq-default inferior-ess-ddeclient default-ddeclient) (sleep-for 2) ; need to wait, else working too fast! ) (setq comint-process-echoes nil) ;; *R* buffer (goto-char (point-min)) (insert "This is a placeholder buffer. You can't type anything here.\n You may ignore the 'options' error in this buffer.\n\n") (goto-char (point-max)) (set-buffer-process-coding-system 'raw-text-dos 'raw-text-unix) (setq buffer-read-only t) ; force buffer to be read-only (setq mode-name "ddeESS") ;; initialization (set-buffer (find-file-noselect ess-command-file 'nowarn)) (erase-buffer) (setq ;; set the following variables for the current ddeESS process. inferior-ess-language-start (ess-get-process-variable 'inferior-ess-language-start)) (if inferior-ess-language-start (insert inferior-ess-language-start)) (if inferior-ess-language-start-rgui (insert (concat "\n" inferior-ess-language-start-rgui))) (save-buffer 0) (call-process-shell-command (concat inferior-ess-execdde ess-rgui-command)) )) ;;; ess-r-gui.el ends here ess/lisp/ess-s4-d.el0000664000175000017500000002522212423756516012572 0ustar eddedd;;; ess-s4-d.el --- S4 customization ;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 12 Jun 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; DB contributed the changes from ess-s3-d.el to ;; ess-s4-d.el (removed the old ugly approach). ;; This file defines S4 customizations for ess-mode. Lots of thanks ;; to RMH and JMC for code and suggestions ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (require 'ess-s-l) ;; Some of this is based on files from: ;; Copyright (C) 1996, John M. Chambers. (defvar S4-customize-alist (append '((ess-local-customize-alist . 'S4-customize-alist) (ess-dialect . "S4") (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-change-sp-regexp . ess-S-change-sp-regexp) (ess-help-sec-keys-alist . ess-help-S3-sec-keys-alist) (ess-object-name-db-file . "ess-s4-namedb.el") (inferior-ess-program . inferior-S4-program-name) (inferior-ess-objects-command . ".SmodeObs(%d, pattern=\"%s\")\n") ;;(inferior-ess-objects-pattern . ".*") ; for new s4 stuff (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . nil) (inferior-ess-search-list-command . ".SmodePaths()\n") (ess-load-command . ".SmodeLoad(\"%s\")\n") (inferior-ess-dump-command . ".SmodeDump(\"%s\", \"%s\")\n") (inferior-ess-start-file . nil) ;"~/.ess-S3") (inferior-ess-start-args . "") (ess-STERM . "iESS") ) S+common-cust-alist); use S+ ones here; partly overwritten above!! "Variables to customize for S4.") ;; For loading up the S code required for the above. ;;(add-hook 'ess-post-run-hook ;; (lambda () ;; (ess-command ;; (concat ;; "if(exists(\"Sversion\")) library(emacs) else source(\"" ;; ess-mode-run-file ;; "\")\n")) ;; (if ess-mode-run-file2 ;; (ess-command ;; (concat "source(\"" ess-mode-run-file2 "\")\n"))))) (defun S4 () "Call 'S version 4', from Bell Labs. New way to do it." (interactive) (setq ess-customize-alist S4-customize-alist) (ess-write-to-dribble-buffer (format "\n(S4): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start))) (defun S4-mode (&optional proc-name) "Major mode for editing S4 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S4-customize-alist) (ess-mode S4-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) ;; From RMH: ALL THIS SHOULD BE INCORPORATED BY 5.0! ;;; s4.el startup file ;;; Richard M. Heiberger ;;; rmh@temple.edu ;; ;;(load "S") ;;(setq inferior-S-program "/disk05/s4/betaJun96/S") ;;(setq S-plus nil) ;; needed for non S-plus ;;(add-to-list 'load-path "/disk05/s4/betaJun96") ;; S-namedb.el is here ;;(S) ;;(load-file "/disk05/s4/betaJun96/library/emacs/S-modeadds.el") ;; must come after (S) ;; ;; ;;;;; S4 __Help, no longer S3 .Help ;;(load "S-help") ;; ;; Must follow S-help ;;; S-help.file line 270 ;;(defun S-get-help-files-list nil ;; (mapcar 'list ;; (apply 'append ;; (mapcar (lambda (dirname) ;; (if (file-directory-p dirname) ;; (directory-files dirname))) ;; (mapcar (lambda (str) (concat str "/__Help")) ;; (S-search-list)))))) ;; ;; ;;;;; additional font-lock-keywords for S4 ;; ;;;;*;; based on S-inf.el line 107 ;;;;(add-to-list 'S-inf-font-lock-keywords ;;;; '("\\<\\(^Problem\\|^Warning\\|^Error\\|Debug ?\\|Browsing in frame of\\|Local Variables\\)\\>" . font-lock-reference-face) ; S-inf problems ;;;;) ;;;;(add-to-list 'S-inf-font-lock-keywords ;;;; '("^R>" . font-lock-keyword-face) ; debug prompt ;;;;) ;;(inferior-S-mode) ;; ;;; S-inf.el line 150 ;;(setq inferior-S-search-list-command "searchPaths()\n") ;; ;;;; fontify S-transcript-mode ;;;; overwrites S-trans.el lines 60-69 ;;;;(setq S-trans-font-lock-keywords S-inf-font-lock-keywords) ;; ;;(load "S-mode") ;; ;; Must follow S-mode ;;;;*;; based on S-mode.el line 219 ;;(add-to-list 'S-mode-font-lock-keywords ;; '("\\<\\(setGeneric\\|removeGeneric\\|setMethod\\|unsetMethod\\|setReplaceGeneric\\|setReplaceMethod\\|standardGeneric\\|setIs\\|setClass\\|representation\\)\\>" . font-lock-function-name-face) ; S4 method functions ;;) ;; ;; ;; ;;;;; fix to S-load-file to make C-c C-l work with S4 ;; ;;;When a file sourced into S4 by C-c C-l has a syntax error ;;;without the following changes, the system ;;;freezes until it is released with ^G. The reason is that the error ;;;messages, including the `Debug ?' request, go to the *S-errors* ;;;buffer. The *S-errors* buffer is not switched to, and couldn't accept ;;;a response if it were. ;;; ;;;The fix requires three modification to S-inf.el and two to S-mode.el. ;;;The correction to S-check-source noted in smode.cmt is also necessary. ;;; ;; ;;; S-inf.el line 92 NEW variable ;;(defvar inferior-S-debug-prompt "Debug \\? (y|n): " ;; "The expression S uses to offer to initiate debug tracing.") ;; ;;; S-inf.el line 458 ;;(defun inferior-S-wait-for-prompt () ;; "Wait until the S process is ready for input." ;; (let* ((cbuffer (current-buffer)) ;; (sprocess (get-S-process S-current-process-name)) ;; (sbuffer (process-buffer sprocess)) ;; r ;; (timeout 0)) ;; (set-buffer sbuffer) ;; (while (progn ;; (if (not (eq (process-status sprocess) 'run)) ;; (S-error "S process has died unexpectedly.") ;; (if (> (setq timeout (1+ timeout)) S-loop-timeout) ;; (S-error "Timeout waiting for prompt. Check inferior-S-prompt or S-loop-timeout.")) ;; (accept-process-output) ;; (goto-char (point-max)) ;;(setq end (point)) ;; (beginning-of-line) ;;(setq e (buffer-substring (point) end)) ;;(if (equal e inferior-S-debug-prompt) ;; (S-error "Debug prompt")) ;; (setq r (looking-at inferior-S-prompt)) ;; (not (or r (looking-at ".*\\?\\s *")))))) ;; (goto-char (point-max)) ;; (set-buffer cbuffer) ;; (symbol-value r))) ;; ;; ;; ;;; S-mode.el line 204 ;;(setq S-dump-error-re "Problem") ;; ;;;; S-mode.el line 655 ;;(defun S-parse-errors (showerr) ;; "Jump to error in last loaded S source file. ;;With prefix argument, only shows the errors S reported." ;; (interactive "P") ;; (S-make-buffer-current) ;; (let ((errbuff (get-buffer S-error-buffer-name))) ;; (if (not errbuff) ;; (error "You need to do a load first!") ;; (set-buffer errbuff) ;; (goto-char (point-max)) ;; (if ;; (re-search-backward ", file \"" nil t) ;; (let* ((beg-pos (progn (re-search-forward "\"" nil t) (point))) ;; (end-pos (progn (re-search-forward "\"" nil t) (- (point) 1))) ;; (filename (buffer-substring beg-pos end-pos)) ;; (fbuffer (get-file-buffer filename)) ;; (linenum (string-to-number ;; (progn (re-search-backward "," nil t) ;; (current-word)))) ;; (end-pos (point)) ;; (beg-pos (progn (goto-char (point-min)) ;; (re-search-forward ":" nil t) ;; (1+ (point)))) ;; (errmess (buffer-substring beg-pos end-pos)) ;; ) ;; (if showerr ;; (S-display-temp-buffer errbuff) ;; (if fbuffer nil ;; (setq fbuffer (find-file-noselect filename)) ;; (save-excursion ;; (set-buffer fbuffer) ;; (S-mode))) ;; (pop-to-buffer fbuffer) ;; (goto-line linenum)) ;; (princ errmess t)) ;; (message "Not a syntax error.") ;; (S-display-temp-buffer errbuff))))) ;; ;; ;; ;;;; S-inf.el line 584 ;;(defun S-prompt-wait (proc &optional start-of-output) ;; "Wait for a prompt to appear at BOL of current buffer ;;PROC is the S process. Does not change point" ;; (if start-of-output nil (setq start-of-output (point-min))) ;; (save-excursion ;; (while (progn ;; ;; get output if there is some ready ;; (accept-process-output proc 0 500) ;; (goto-char (marker-position (process-mark proc))) ;; (beginning-of-line) ;; ;; (if (re-search-forward inferior-S-debug-prompt nil t) ;; (if (equal (get-buffer S-error-buffer-name) ;; (get-buffer S-error-buffer-name)) ;; (let* ((sprocess (get-S-process S-current-process-name)) ;; (sbuffer (process-buffer sprocess))) ;; (set-buffer sbuffer) ;; (process-send-string sprocess "n\n") ;; (accept-process-output sprocess) ;; (beginning-of-line); delete inferior-S-debug-prompt ;; (kill-line) ;; (insert "> "))) ;; ;; (if (< (point) start-of-output) (goto-char start-of-output)) ;; (not (looking-at inferior-S-primary-prompt))))))) ;; ; Provide package (provide 'ess-s4-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-s4-d.el ends here ess/lisp/ess-rd.el0000664000175000017500000004643212423756516012436 0ustar eddedd;; ess-rd.el --- Support for editing R documentation (Rd) source ;; Copyright (C) 1997--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: KH ;; Created: 25 July 1997 ;; Maintainer: ESS-core ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you may redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by the ;; Free Software Foundation; either version 2, or (at your option) any ;; later version. ;; ;; This is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ;; for more details. ;; ;; A copy of the GNU General Public License is available on the World ;; Wide Web at http://www.gnu.org/copyleft/gpl.html. You can also ;; obtain it by writing to the Free Software Foundation, Inc., 675 Mass ;; Ave, Cambridge, MA 02139, USA. ;;; Code: ;; To stave off byte compiler errors (eval-when-compile (require 'ess-help)) (defvar essddr-version "0.9-1" "Current version of ess-rd.el.") (defvar essddr-maintainer-address "ESS Core Team " "Current maintainer of ess-rd.el.") (defun Rd-active-mark () nil) ;silence compiler. (if (featurep 'xemacs) ;; Special support for XEmacs (curtesy of auctex): (defun Rd-active-mark () (and zmacs-regions (mark))) ;; else: special support for GNU Emacs (defun Rd-active-mark () (and transient-mark-mode mark-active)) ) (autoload 'ess-eval-region "ess-inf" "[autoload]" t) (autoload 'ess-eval-line-and-step "ess-inf" "[autoload]" t) (autoload 'ess-switch-process "ess-inf" "[autoload]" t) (autoload 'ess-switch-to-ESS "ess-inf" "[autoload]" t) (autoload 'ess-switch-to-end-of-ESS "ess-inf" "[autoload]" t) (autoload 'ess-help-mode "ess-help" "[autoload]" t) (autoload 'ess-help-underline "ess-help" "[autoload]" t) (defvar Rd-mode-abbrev-table nil "Abbrev table for R documentation keywords. All Rd mode abbrevs start with a grave accent (`).") (if Rd-mode-abbrev-table () (define-abbrev-table 'Rd-mode-abbrev-table ()) (define-abbrev Rd-mode-abbrev-table "`ag" "\\arguments") (define-abbrev Rd-mode-abbrev-table "`al" "\\alias") (define-abbrev Rd-mode-abbrev-table "`au" "\\author") (define-abbrev Rd-mode-abbrev-table "`bf" "\\bold") (define-abbrev Rd-mode-abbrev-table "`co" "\\code") (define-abbrev Rd-mode-abbrev-table "`de" "\\describe") (define-abbrev Rd-mode-abbrev-table "`dn" "\\description") (define-abbrev Rd-mode-abbrev-table "`dt" "\\details") (define-abbrev Rd-mode-abbrev-table "`em" "\\emph") (define-abbrev Rd-mode-abbrev-table "`en" "\\enumerate") (define-abbrev Rd-mode-abbrev-table "`ex" "\\examples") (define-abbrev Rd-mode-abbrev-table "`fi" "\\file") (define-abbrev Rd-mode-abbrev-table "`fo" "\\format") (define-abbrev Rd-mode-abbrev-table "`it" "\\item") (define-abbrev Rd-mode-abbrev-table "`iz" "\\itemize") (define-abbrev Rd-mode-abbrev-table "`kw" "\\keyword") (define-abbrev Rd-mode-abbrev-table "`li" "\\link") (define-abbrev Rd-mode-abbrev-table "`me" "\\method") (define-abbrev Rd-mode-abbrev-table "`na" "\\name") (define-abbrev Rd-mode-abbrev-table "`no" "\\note") (define-abbrev Rd-mode-abbrev-table "`re" "\\references") (define-abbrev Rd-mode-abbrev-table "`sa" "\\seealso") (define-abbrev Rd-mode-abbrev-table "`se" "\\section") (define-abbrev Rd-mode-abbrev-table "`so" "\\source") (define-abbrev Rd-mode-abbrev-table "`ss" "\\subsection") (define-abbrev Rd-mode-abbrev-table "`sy" "\\synopsis") (define-abbrev Rd-mode-abbrev-table "`ta" "\\tabular") (define-abbrev Rd-mode-abbrev-table "`ti" "\\title") (define-abbrev Rd-mode-abbrev-table "`us" "\\usage") (define-abbrev Rd-mode-abbrev-table "`va" "\\value")) (defvar Rd-mode-syntax-table nil "Syntax table for Rd mode.") (if Rd-mode-syntax-table () (setq Rd-mode-syntax-table (copy-syntax-table text-mode-syntax-table)) (modify-syntax-entry ?\\ "\\" Rd-mode-syntax-table) (modify-syntax-entry ?\{ "(}" Rd-mode-syntax-table) (modify-syntax-entry ?\} "){" Rd-mode-syntax-table) ;; Nice for editing, not for parsing ... (modify-syntax-entry ?\( "()" Rd-mode-syntax-table) (modify-syntax-entry ?\) ")(" Rd-mode-syntax-table) (modify-syntax-entry ?\[ "(]" Rd-mode-syntax-table) (modify-syntax-entry ?\] ")[" Rd-mode-syntax-table) ;; To get strings right ;; (modify-syntax-entry ?\' "\"" Rd-mode-syntax-table) (modify-syntax-entry ?\" "\"" Rd-mode-syntax-table) ;; To make abbrevs starting with a grave accent work ... (modify-syntax-entry ?\` "w" Rd-mode-syntax-table) ;; Comments (modify-syntax-entry ?\% "<" Rd-mode-syntax-table) (modify-syntax-entry ?\n ">" Rd-mode-syntax-table)) (defvar Rd-mode-parse-syntax-table nil "Syntax table for parsing Rd mode.") (if Rd-mode-parse-syntax-table () (setq Rd-mode-parse-syntax-table (copy-syntax-table Rd-mode-syntax-table)) ;; To make parse-partial-sexps do the thing we want for computing ;; indentations (modify-syntax-entry ?\( "_" Rd-mode-parse-syntax-table) (modify-syntax-entry ?\) "_" Rd-mode-parse-syntax-table) (modify-syntax-entry ?\[ "_" Rd-mode-parse-syntax-table) (modify-syntax-entry ?\] "_" Rd-mode-parse-syntax-table)) (defvar Rd-section-names '("Rdversion" "arguments" "alias" "author" "concept" "describe" "description" "details" "docType" "encoding" "enumerate" "examples" "format" "itemize" "keyword" "name" "note" "preformatted" "references" "seealso" "section" "source" "subsection" "synopsis" "tabular" "title" "usage" "value")) (defvar Rd-keywords '( ;; the next two lines: only valid in R <= 2.8.1 ;; commented out on 2011-01-14 for ESS version 5.13: ;; "Alpha" "Gamma" "alpha" "beta" "epsilon" "lambda" "mu" "pi" "sigma" ;; "ge" "le" "left" "right" ;; "CRANpkg" "R" "RdOpts" "S3method" "S4method" "Sexpr" "acronym" "bold" "cite" "code" "command" "cr" "dQuote" "deqn" "dfn" "dontrun" "dontshow" "donttest" "dots" "email" "emph" "enc" "env" "eqn" "figure" "file" "href" "if" "ifelse" "item" "kbd" "ldots" "linkS4class" "link" "method" "newcommand" "option" "out" "pkg" "sQuote" "renewcommand" "samp" "strong" "tab" "url" "var" "verb" )) ;; Need to fix Rd-bold-face problem. ;; ;; (defvar Rd-bold-face 'bold) ;(defvar Rd-bold-face nil) ;(make-face Rd-bold-face "R documentation bold face") ;(make-face-bold Rd-bold-face (defvar Rd-font-lock-keywords (list (cons (concat "\\\\\\(" (mapconcat 'identity Rd-section-names "\\|") "\\>\\)") 'font-lock-reference-face) ; Rd-bold-face (cons (concat "\\\\\\(" (mapconcat 'identity Rd-keywords "\\|") "\\>\\)") 'font-lock-keyword-face) '("^#\\(ifn?def\\)\\s-+\\(\\sw+\\)" (1 font-lock-builtin-face) (2 font-lock-variable-name-face nil t)) '("^#\\(endif\\)" 1 font-lock-builtin-face)) "Additional Rd expressions to highlight.") (defvar Rd-indent-level 2 "*Indentation of Rd code with respect to containing blocks.") (defvar Rd-mode-map (let ((map (make-sparse-keymap))) (define-key map "\t" 'indent-according-to-mode) (define-key map "\C-j" 'reindent-then-newline-and-indent) (define-key map "\C-m" 'reindent-then-newline-and-indent) (define-key map "\C-c\C-p" 'Rd-preview-help) (define-key map "\C-c\C-j" 'Rd-mode-insert-item) (define-key map "\C-c\C-e" 'Rd-mode-insert-skeleton) (define-key map "\C-c\C-f" 'Rd-font) ;; ^C^F ^E : \emph{ . } ;; ^C^F ^C : \code{ . } ;; ^C^F ^L : \link{ . } ;; ^C^F L : \code{\link{ . }} etc (define-key map "\C-c\C-s" 'Rd-mode-insert-section) (define-key map "\C-ch" 'ess-handy-commands) (define-key map "\C-c\C-n" 'ess-eval-line-and-step) (define-key map "\C-c\C-r" 'ess-eval-region) (define-key map "\C-c\C-c" 'ess-eval-region-or-function-or-paragraph-and-step) (define-key map "\C-\M-x" 'ess-eval-region-or-function-or-paragraph) (define-key map "\C-c\C-v" 'ess-display-help-on-object) (define-key map "\C-c\C-w" 'ess-switch-process); is on C-c C-s in ess-mode.. (define-key map "\C-c\C-y" 'ess-switch-to-ESS) (define-key map "\C-c\C-z" 'ess-switch-to-end-of-ESS) map) "Keymap used in Rd mode.") (defvar Rd-mode-menu (list "Rd" ["Markup [word]" Rd-font t] ["Insert Item" Rd-mode-insert-item t] ["Insert Section" Rd-mode-insert-section t] ["Insert Skeleton" Rd-mode-insert-skeleton t] "-" ["Preview" Rd-preview-help t] "-" ["Eval Line" ess-eval-line-and-step t] ["Eval Region" ess-eval-region t] ["Switch to ESS Process" ess-switch-to-ESS t] ["Switch the ESS Process" ess-switch-process t] ["Switch to end{ESS Pr}" ess-switch-to-end-of-ESS t] "-" ["Toggle Abbrev Mode" abbrev-mode t] ["Toggle Auto-Fill Mode" auto-fill-mode t] "-" ["Submit Bug Report" Rd-submit-bug-report t] "-" ["Describe Rd Mode" Rd-describe-major-mode t]) "Menu used in Rd mode.") (defvar Rd-mode-hook nil "*Hook to be run when Rd mode is entered.") (defvar Rd-to-help-command "R CMD Rd2txt" "*Shell command for converting R documentation source to help text.") (defvar Rd-font-list '((?\C-b "\\bold{" "}") (?\C-c "\\code{" "}") (?\C-e "\\emph{" "}") (?\C-l "\\link{" "}") (?l "\\code{\\link{" "}}") (?\C-m "\\email{" "}") (?\C-q "\\eqn{" "}") (?\C-u "\\url{" "}") ) "List of ``fonts'' used by Rd-font. Each entry is a list. The first element is the key to activate the font. The second element is the string to insert before point, and the third element is the string to insert after point." ) ;;;###autoload (defun Rd-mode () "Major mode for editing R documentation source files. This mode makes it easier to write R documentation by helping with indentation, doing some of the typing for you (with Abbrev mode) and by showing keywords, strings, etc. in different faces (with Font Lock mode on terminals that support it). Type \\[list-abbrevs] to display the built-in abbrevs for Rd keywords. Keybindings =========== \\{Rd-mode-map} Variables you can use to customize Rd mode ========================================== `Rd-indent-level' Indentation of Rd code with respect to containing blocks. Default is 2. Turning on Rd mode runs the hook `Rd-mode-hook'. To automatically turn on the abbrev(iate) features, add the following lines to your `.emacs' file: (add-hook 'Rd-mode-hook (lambda () (abbrev-mode 1))) " (interactive) (text-mode) (kill-all-local-variables) (ess-setq-vars-local R-customize-alist) ;same functionality is available as in R buffers (use-local-map Rd-mode-map) (setq mode-name "Rd") (setq major-mode 'Rd-mode) (setq local-abbrev-table Rd-mode-abbrev-table) (set-syntax-table Rd-mode-syntax-table) (set (make-local-variable 'indent-line-function) 'Rd-mode-indent-line) (set (make-local-variable 'fill-column) 72) (set (make-local-variable 'comment-start-skip) "\\s<+\\s-*") (set (make-local-variable 'comment-start) "% ") (set (make-local-variable 'comment-end) "") (set (make-local-variable 'font-lock-defaults) '(Rd-font-lock-keywords nil nil)) ;; (set (make-local-variable 'parse-sexp-ignore-comments) t) (require 'easymenu) (easy-menu-define Rd-mode-menu-map Rd-mode-map "Menu keymap for Rd mode." Rd-mode-menu) (easy-menu-add Rd-mode-menu-map Rd-mode-map) (turn-on-auto-fill) (message "Rd mode version %s" essddr-version) (setq ess-language "S" ess-dialect "R"); (buffer local) (run-hooks 'Rd-mode-hook)) ;; FIXME: The following should be moved to ess-utils.el, no? (MM thinks) (defun ess-point (position) "Returns the value of point at certain positions." (save-excursion (cond ((eq position 'bol) (beginning-of-line)) ((eq position 'eol) (end-of-line)) ((eq position 'boi) (back-to-indentation)) ((eq position 'bonl) (forward-line 1)) ((eq position 'bopl) (forward-line -1)) (t (error "unknown buffer position requested: %s" position))) (point))) (defun Rd-describe-major-mode () "Describe the current major mode." (interactive) (describe-function major-mode)) (defun Rd-mode-in-verbatim-p () (let ((pos (point))) (save-excursion (if (and (re-search-backward "\\\\\\(usage\\|examples\\|synopsis\\)" nil t) (re-search-forward "\\s(" nil t)) (condition-case () (progn (up-list 1) (< pos (point))) (error t)) nil)))) (defun Rd-mode-in-preprocessor-line-p () (save-excursion (beginning-of-line) (looking-at "[ \t]*#\\(ifdef\\|endif\\)"))) (defun Rd-mode-calculate-indent () "Return appropriate indentation for current line in Rd mode." (interactive) (save-excursion (beginning-of-line) (cond ((Rd-mode-in-verbatim-p) ;; Don't do anything in verbatims nil) ((Rd-mode-in-preprocessor-line-p) ;; Indent to 0 0) (t (let ((p (progn (re-search-forward "[ \t]*\\s)*" (ess-point 'eol) t) (point)))) (if (or (< (forward-line -1) 0) (Rd-mode-in-verbatim-p)) 0 (set-syntax-table Rd-mode-parse-syntax-table) (while (and (or (looking-at "[ \t]*$") (Rd-mode-in-preprocessor-line-p)) (not (bobp))) (forward-line -1)) (re-search-forward "[ \t]*\\s)*" (ess-point 'eol) t) (prog1 (+ (current-indentation) (* (car (parse-partial-sexp (point) p)) Rd-indent-level)) (set-syntax-table Rd-mode-syntax-table)))))))) (defun Rd-mode-indent-line () "Indent current line as Rd source." (interactive) (let ((ic (Rd-mode-calculate-indent)) (rp (- (current-column) (current-indentation)))) (if ic ; Not inside a verbatim (if (< ic 0) (error "Unmatched parenthesis") (indent-line-to ic) (if (> rp 0) (move-to-column (+ ic rp))))))) (defun Rd-mode-insert-item () (interactive) (reindent-then-newline-and-indent) (insert "\\item{") ) (defun Rd-mode-insert-section () (interactive) (let ((s (ess-completing-read "Insert section: " (mapcar (lambda (x) (cons x x)) Rd-section-names) nil t))) (if (string= s "") (progn (insert "\\section{}{") (backward-char 2)) (insert (format "\\%s{" s))))) (defun Rd-mode-insert-skeleton () (interactive) ;; Hmm: in theory this should be kept in sync with prompt() ;; --- maybe using prompt() [or promptClass()...] would be better anyway?! (insert "\\name{}\n") (insert "\\alias{}\n") (insert "\\title{}\n") (insert "\\description{\n}\n") (insert "\\usage{\n}\n") (insert "\\arguments{\n}\n") (insert "\\value{\n}\n") (insert "\\details{\n}\n") (insert "\\references{\n}\n") (insert "\\seealso{\n}\n") (insert "\\examples{\n}\n") (insert "\\author{}\n") (insert "\\keyword{}\n")) ;; This is an `easy' version of (defun TeX-font ..) in AUCtex's tex.el ; ;; see TeX-font-list and also LaTeX-font-list in latex.el (defun Rd-font (what) "Insert template for font command. WHAT determines the font to use, as specified by `Rd-font-list'." (interactive "c") ;;TeX had : (Rd-update-style) (let* ((entry (assoc what Rd-font-list)) (before (nth 1 entry)) (after (nth 2 entry))) (cond ((null entry) ;; help on possibilities : (let ((help (concat "Rd Markup (available from C-c C-f):\n\n\t" "KEY Rd-Markup\n\n" (mapconcat (lambda (entry) ;; A textual description of an ENTRY in TeX-font-list. (concat (format "%11s " (key-description (char-to-string (nth 0 entry)))) (format "%14s %-3s" (nth 1 entry) (nth 2 entry)))) Rd-font-list "\n")))) (with-output-to-temp-buffer "*Help*" (set-buffer "*Help*") (insert help)))) ((Rd-active-mark) (save-excursion (cond ((> (mark) (point)) (insert before) (goto-char (mark)) (insert after)) (t (insert after) (goto-char (mark)) (insert before))))) (t (insert before) (save-excursion (insert after)))))) (defun Rd-preview-help (&optional via-shell) "Preview the current Rd buffer contents as help. If optional VIA-SHELL is set, using `Rd-to-help-command'. If the current buffer is not associated with a file, create a temporary one in `temporary-file-directory'. " (interactive "P") (require 'ess-help) (let ((file buffer-file-name) (pbuf (get-buffer-create "R Help Preview")) del-p) (unless file (setq file (make-temp-file "RD_" nil ".Rd")) (write-region (point-min) (point-max) file) (setq del-p t)) (if via-shell ;; FIXME eventually get rid of this option ;; only method in ESS <= 14.09 -- calls "R" even if in "R-devel"; slower (let ((shcmd (format "%s '%s'" Rd-to-help-command file))) (set-buffer pbuf) (erase-buffer) (ess-write-to-dribble-buffer (format "Rd-preview-help: (shell-command |%s| t)" shcmd)) (shell-command shcmd t)) ;; else directly: (ess-force-buffer-current "R process to use: ") (ess-command (format "tools::Rd2txt(\"%s\")\n" file) pbuf) (set-buffer pbuf)) ;; FIXME(2): once got rid of via-shell, consider ;; (ess--flush-help-into-current-buffer file "tools::Rd2txt(\"%s\")\n") ;; instead of all this : (ess-setq-vars-local R-customize-alist) (setq ess-help-sec-regex ess-help-R-sec-regex ess-help-sec-keys-alist ess-help-R-sec-keys-alist) ;; mostly cut'n'paste from ess--flush-help* (see FIXME(2)): (ess-help-underline) (ess-help-mode) (goto-char (point-min)) (set-buffer-modified-p 'nil) (setq buffer-read-only t) (setq truncate-lines nil) (when del-p (delete-file file)) (unless (get-buffer-window pbuf 'visible) (display-buffer pbuf t)))) ;; Bug reporting (defun Rd-submit-bug-report () "Submit a bug report on Rd mode via mail." (interactive) (require 'reporter) (and (y-or-n-p "Do you want to submit a bug report? ") (reporter-submit-bug-report essddr-maintainer-address (concat "Emacs version " emacs-version) (list 'essddr-version 'Rd-indent-level)))) ;; Provide ourself (provide 'essddr) ;; ess-rd.el ends here ess/lisp/ess-sta-d.el0000664000175000017500000001440312423756516013032 0ustar eddedd;;; ess-sta-d.el --- Stata customization ;; Copyright (C) 1997--1999 A. J. Rossini, Thomas Lumley ;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 9 Sep 1998 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the Stata customizations for ess-mode. It is somewhat ;; based on Stata-mode by Thomas Lumley . ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (require 'ess-sta-l) (defvar STA-dialect-name "stata" "Name of 'dialect' for Stata.");easily changeable in a user's .emacs (defvar STA-customize-alist '((ess-local-customize-alist . 'STA-customize-alist) (ess-language . "STA") (ess-dialect . STA-dialect-name) (ess-suffix . "ado") (ess-mode-editing-alist . STA-editing-alist) (ess-mode-syntax-table . STA-syntax-table) (ess-mode-edit . 'STA-mode) (ess-help-sec-regex . ess-help-STA-sec-regex) (ess-help-sec-keys-alist . ess-help-STA-sec-keys-alist) (ess-loop-timeout . 500000 ) (ess-object-name-db-file . "ess-sta-namedb.el" ) (ess-help-web-search-command . "http://www.stata.com/search/?q=%s&restrict=&btnG=Search&client=stata&num=&output=xml_no_dtd&site=stata&ie=&oe=UTF-8&sort=&proxystylesheet=stata") (inferior-ess-font-lock-defaults . ess-STA-mode-font-lock-defaults) (inferior-ess-program . inferior-STA-program-name) (inferior-ess-objects-command . "describe\n") (inferior-ess-help-command . "help %s\n") ;; assumes set more off (inferior-ess-exit-command . "exit\n") ;; --more-- is necessary here (hangs otherwise if startup stata.msg is big) (inferior-ess-primary-prompt . "[.:] \\|--more--") (inferior-ess-secondary-prompt . "--more--") (comint-use-prompt-regexp . t) (inferior-ess-start-file . inferior-STA-start-file) ;"~/.ess-stata") (inferior-ess-start-args . inferior-STA-start-args) (ess-get-help-topics-function . 'ess-get-STA-help-topics) (inferior-ess-search-list-command . "set more off\n search()\n") (comment-start . "/\* ") (comment-end . " \*/") (comment-start-skip . "/\\*+ *") (comment-use-syntax . t) ;; needed for multiline ) "Variables to customize for Stata.") (defun STA-mode (&optional proc-name) "Major mode for editing Stata source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist STA-customize-alist) (ess-mode STA-customize-alist proc-name)) (fset 'stata-mode 'STA-mode) (fset 'Stata-mode 'STA-mode) (defun ess-sta-remove-comments (string) "Remove one-line comments before sending the STRING to process. This function is placed in `ess-presend-filter-functions'. " (replace-regexp-in-string "/\\*.*\\*/\\|^//.*$" "" string)) ;; (ess-sta-remove-comments "aaa /* sdfdsf */ bbb ;; sdfsd ;; ccc ;; // sdfsf ;; sdf /* sdfdsf */ ;; sdfsf ;; " ) (defvar ess-stata-post-run-hook nil "Functions run in process buffer after the initialization of stata process.") (defun stata (&optional start-args) "Call Stata." (interactive "P") (setq ess-customize-alist STA-customize-alist) (ess-write-to-dribble-buffer (format "(STA): ess-dialect=%s , buf=%s \n" ess-dialect (current-buffer))) (let ((sta-start-args (concat inferior-STA-start-args (when start-args (read-string "Starting Args [possibly -k####] ? "))))) (inferior-ess sta-start-args) (let ((proc (get-process ess-local-process-name))) (while (process-get proc 'sec-prompt) ;; get read of all --more-- if stata.msg is too long. (ess-send-string proc "q") (ess-wait-for-process proc t)) (ess-send-string proc "set more off") (goto-char (point-max)) (with-current-buffer (process-buffer proc) (add-hook 'ess-presend-filter-functions 'ess-sta-remove-comments nil 'local) (run-mode-hooks 'ess-stata-post-run-hook)) ) )) (defun STA-transcript-mode () "Stata transcript mode." (interactive) (ess-transcript-mode STA-customize-alist)) (defun ess--STA-retrive-topics-from-search () (with-current-buffer (ess-command inferior-ess-search-list-command) (goto-char (point-min)) (let (topics) (while (re-search-forward "(help \\(.+?\\)\\( if installed\\| for replacement.*\\)?)$" nil t) (setq topics (nconc (split-string (match-string-no-properties 1) ",\\|; +") topics))) (nreverse (delete-dups topics)) ))) (defun ess-get-STA-help-topics (&optional name) "Return a list of current STA help topics associated with process NAME." (or (ess-process-get 'help-topics) (progn (ess-process-put 'help-topics (ess--STA-retrive-topics-from-search)) (ess-process-get 'help-topics)) )) ; Provide package (provide 'ess-sta-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sta-d.el ends here ess/lisp/ess-jags-d.el0000664000175000017500000003323512632537307013170 0ustar eddedd;;; ess-jags-d.el --- ESS[JAGS] dialect ;; Copyright (C) 2008-2011 Rodney Sparapani ;; Author: Rodney Sparapani ;; Created: 13 March 2008 ;; Maintainer: ESS-help ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: (require 'ess-bugs-l) (require 'ess-utils) (require 'ess-inf) (setq auto-mode-alist (append '(("\\.[jJ][aA][gG]\\'" . ess-jags-mode)) auto-mode-alist)) (defvar ess-jags-command "jags" "Default JAGS program in PATH.") (make-local-variable 'ess-jags-command) (defvar ess-jags-monitor '("") "Default list of variables to monitor.") (make-local-variable 'ess-jags-monitor) (defvar ess-jags-thin 1 "Default thinning parameter.") (make-local-variable 'ess-jags-thin) (defvar ess-jags-chains 1 "Default number of chains.") (make-local-variable 'ess-jags-chains) (defvar ess-jags-burnin 10000 "Default burn-in.") (make-local-variable 'ess-jags-burnin) (defvar ess-jags-update 10000 "Default number of updates after burnin.") (make-local-variable 'ess-jags-update) (defvar ess-jags-system t "Default whether JAGS recognizes the system command.") (defvar ess-jags-font-lock-keywords (list ;; .jag files (cons "#.*\n" font-lock-comment-face) (cons "^[ \t]*\\(model\\|var\\)\\>" font-lock-keyword-face) (cons (concat "\\& " ess-bugs-file-root ".jog ") ;else "> " ess-bugs-file-root ".jog 2>&1 ") ; ;.txt not recognized by BOA and impractical to over-ride ; "&& (rm -f " ess-bugs-file-root ".ind; " ; "ln -s " ess-bugs-file-root "index.txt " ess-bugs-file-root ".ind; " ; "for i in " ess-jags-temp-chains "; do; " ; "rm -f " ess-bugs-file-root "$i.out; " ; "ln -s " ess-bugs-file-root "chain$i.txt " ess-bugs-file-root "$i.out; done) " ess-bugs-batch-post-command) (comint-send-input) )) (defun ess-jags-na-bug () "ESS[JAGS]: Perform Next-Action for .jag" (if (equal 0 (buffer-size)) (ess-jags-switch-to-suffix ".jag") ;else (ess-save-and-set-local-variables) (ess-jags-switch-to-suffix ".jmd" ess-jags-chains ess-jags-monitor ess-jags-thin ess-jags-burnin ess-jags-update)) ) (defun ess-jags-mode () "ESS[JAGS]: Major mode for JAGS." (interactive) (kill-all-local-variables) (ess-setq-vars-local '((comment-start . "#"))) (setq major-mode 'ess-jags-mode) (setq mode-name "ESS[JAGS]") (use-local-map ess-bugs-mode-map) (setq font-lock-auto-fontify t) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(ess-jags-font-lock-keywords nil t)) (setq ess-language "S") ; mimic S for ess-smart-underscore (run-hooks 'ess-bugs-mode-hook) (if (not (w32-shell-dos-semantics)) (add-hook 'comint-output-filter-functions 'ess-bugs-exit-notify-sh)) ) (setq features (delete 'ess-bugs-d features)) (provide 'ess-jags-d) ;;; ess-jags-d.el ends here ess/lisp/ess-noweb.el0000664000175000017500000001143112423756516013132 0ustar eddedd;;; ess-noweb.el --- support for Literate Data Analysis ;; Copyright (C) 1999 Mark Lunt ;; Copyright (C) 1999--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Mark Lunt ;; A.J. Rossini ;; Created: April 18, 1999 ;; Maintainer: ESS-core ;; Keywords: statistics, languages ;; Summary: Noweb support for ESS ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for ESS and Literate Data Analysis. ;;; Code: ; Requires and autoloads (require 'ess-noweb-mode) ;; still needed when user turns font-lock-mode *on* (from initial off): (autoload 'ess-noweb-font-lock-mode "ess-noweb-font-lock-mode") ; Variables (defvar ess-noweb-use-font-lock font-lock-mode "Set to t if you want to use font-locking in ESS noweb buffers.") ;; this helps with XEmacs barfing, sigh... ;; but is *NOT* okay to do *globally*: (setq global-font-lock-mode t) (if ess-noweb-use-font-lock (require 'ess-noweb-font-lock-mode)) ; Functions ;;*;; Code Chunk evaluation. (defun ess-eval-chunk (vis) "Tangle the current chunk and send it to the inferior ESS process. Arg has same meaning as for `ess-eval-region'." (interactive "P") (let ((process-name ess-local-process-name) new-process-name (cbuf (current-buffer)) (temp-buffer (ess-create-temp-buffer "Tangle Buffer"))) (save-excursion (ess-noweb-tangle-chunk temp-buffer) (set-buffer temp-buffer) ;; When the temp buffer is created, it does not inherit any value ;; of ess-local-process-name from the .Rnw buffer, so we have to set it ;; here. If ess-local-process-name is not set in the .Rnw buffer, ;; it will inherit the value that is chosen here. (set (make-local-variable 'ess-local-process-name) process-name) (ess-eval-region (point-min) (point-max) vis "Eval Chunk") (if process-name (kill-buffer temp-buffer) ;; if process-name was nil, source buffer did not have a local process ;; so keep value from temp buffer before killing it. (setq new-process-name ess-local-process-name) (kill-buffer temp-buffer) (set-buffer cbuf) (set (make-local-variable 'ess-local-process-name) new-process-name))))) (defun ess-eval-chunk-and-step (&optional vis) "Tangle the current chunk and send it to the inferior ESS process and step to the next chunk" (interactive) (ess-eval-chunk vis) (ess-noweb-next-code-chunk 1)) (defun ess-eval-chunk-and-go (vis) "Tangle the current chunk, send to the ESS process, and go there. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-chunk vis) (ess-switch-to-ESS t)) ;;*;; Thread code chunk evaluation ;;; ;;; Threads are code chunks which fit into the same "buffer" (I'm (AJR) ;;; abusing terminology, but what I mean is things like: ;;; <>= ;;; code for thing1 ;;; @ ;;; Documentation ;;; <>= ;;; continuing code for thing1 ;;; @ ;;; (defun ess-eval-thread (vis) "Tangle all chunks in the current chunk-thread and send to the ESS process. Arg has same meaning as for `ess-eval-region'." (interactive "P") (let ((temp-buffer (ess-create-temp-buffer "Tangle Buffer"))) (ess-noweb-tangle-current-thread temp-buffer) (set-buffer temp-buffer) (ess-eval-region (point-min) (point-max) vis "Eval buffer") (kill-buffer temp-buffer))) (defun ess-eval-thread-and-go (vis) "Tangle all chunks in the current chunk-thread, send to ESS process, and go there. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-thread vis) (ess-switch-to-ESS t)) ; Provide package (provide 'ess-noweb) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-noweb.el ends here ess/lisp/ess-sp6w-d.el0000664000175000017500000007013512423756516013146 0ustar eddedd;;; ess-sp6w-d.el --- S-PLUS 6.x for Windows customization ;;; copied and edited from ess-s4-d.el - Richard M. Heiberger, April 2001 ;; Copyright (C) 2001 Richard M. Heiberger ;; Copyright (C) 2002--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: April 2001 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S-PLUS 6.x for Windows customizations ;; for ess-mode with ddeclient. ;;; Code: ;;; Requires and Autoloads: (require 'ess-s-l) ;;NO: this is autoloaded from other places (require 'ess-dde) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defvaralias 'inferior-S+6-multipleinstances 'inferior-S+-multipleinstances) (defvar inferior-S+-multipleinstances "/MULTIPLEINSTANCES" "Default \"/MULTIPLEINSTANCES\" opens up a new instance of S+[678] in a GUI window and connects it to the '(ddeESS [S+])' window. The alternative nil uses an existing S+ GUI (if there is one) and connects it to the '(ddeESS [S+])' window.") (defvaralias 'S+6-customize-alist 'S+-customize-alist) (defvar S+-customize-alist (append '((ess-local-customize-alist . 'S+-customize-alist) (ess-dialect . S+-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-object-name-db-file . "ess-sp6-namedb.el" ) (inferior-ess-program . inferior-S+-program-name) (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . "chm") (inferior-ess-search-list-command . "searchPaths()\n") (inferior-ess-start-file . nil) ;"~/.ess-S+") (inferior-ess-start-args . (concat inferior-S+-multipleinstances " " inferior-S+-start-args " " inferior-S+-print-command " S_PROJ=" (w32-short-file-name (directory-file-name default-directory)))) ;; (inferior-ess-ddeclient . "ddeclient") ;; (inferior-ess-client-name . "S-PLUS") ;; (inferior-ess-client-command . "SCommand") (ess-STERM . "ddeESS") ) S+common-cust-alist) "Variables to customize for S+") (defvaralias 'Sqpe+6-customize-alist 'Sqpe+-customize-alist) (defvar Sqpe+-customize-alist (append '((ess-local-customize-alist . 'Sqpe+-customize-alist) (ess-dialect . S+-dialect-name) (ess-loop-timeout . 500000 );fixme: dialect specific custom.var (ess-object-name-db-file . "ess-sp6-namedb.el" ) (inferior-ess-program . inferior-Sqpe+-program-name) (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . "chm") (inferior-ess-search-list-command . "searchPaths()\n") (inferior-ess-start-file . nil) ;"~/.ess-S+") (inferior-ess-start-args . (concat ;; workaround for bug in S-Plus 6 for Windows: "ALWAYS_PROMPT=X" " " inferior-Sqpe+-start-args ;; e.g. license manager )) (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for Sqpe+.") ;;; There are extra complications in S+6 and S+7 and S+8 (compared to S+3) ;;; because ;;; ;;; (1) The StatSci supplied Splus.exe doesn't work in an emacs ;;; buffer. It works as as a GUI window and we must send commands ;;; to it through ddeclient. Nonetheless, we need to give it a ;;; process name and be sure that that there is a valid running ;;; process in the '(ddeESS [S+])' buffer. Therefore we create an ;;; ESS process in the buffer as a placeholder and start a shell ;;; in the ESS buffer. From the shell we start Splus. Once Splus ;;; finishes initializing and kills the original shell, we start ;;; another shell. We have a buffer-local variable ;;; inferior-ess-ddeclient, initialized to nil. When there is a ;;; non-nil value of inferior-ess-ddeclient we send lines to ;;; inferior-ess-ddeclient rather than to the Splus process. ;;; (2) There is no Splus process running in the '(ddeESS [S+])' ;;; buffer. Therefore inferior-ess will never see a prompt, ;;; unless we first change it to the null prompt "^". Then once ;;; the process has started, we change it back. ;;; (3) When M-x S+ starts Splus by a shell command, then Splus is an ;;; independent process and will be survive if the '(ddeESS [S+])' ;;; buffer is killed (or emacs is quit). The '(ddeESS [S+])' is ;;; made read-only and a warning is placed in it saying that "You ;;; can't type anything here." Actually, if thestandalone Splus ;;; is killed and the '(ddeESS [S+])' is made writable (C-x C-q), ;;; then '(ddeESS [S+])' becomes a shell buffer. ;;; (defalias 'S+6 'S+) (defun S+ (&optional proc-name) "Verify that `inferior-S+-program-name' points to S-Plus 6 or S-Plus 7 or S-Plus 8. Start normally for S-Plus 6.1 and later. Inform the user to start S-Plus 6.0 from the icon and then connect to it with `S+-existing'. Give an error message if `inferior-S+-program-name' doesn't point to S-Plus 6 or S-Plus 7 or S-Plus 8." (interactive) (with-current-buffer (find-file-noselect (concat (executable-find inferior-S+-program-name) "/../../versions") t) (setq buffer-read-only 1) (forward-line) (if (not (search-backward-regexp "splus\t[678].[0-9]" (point-min) t)) (error "The emacs variable `inferior-S+-program-name' does not point to S-Plus 6 or 7 or 8. Please add `splus[678]?/cmd' (expand the `[678]?' to match your setup) to your `exec-path' or specify the complete path to `Splus.exe' in the variable `inferior-S+-program-name' in your `.emacs' file.") (forward-line) (if (search-backward "splus\t6.0" (point-min) t) (error "S-Plus 6.0 for Microsoft Windows has a bug that prevents it from being started by emacs. Instead, you must start it by double-clicking an icon. Then you can connect to it with `S+-existing'. You should consider upgrading to a newer release of S-Plus.")))) (S+-initiate proc-name)) ;; normal start ; (defalias 'S+6-initiate 'S+-initiate) (defun S+-initiate (&optional proc-name) "Call 'S-PLUS [678].x for Windows', the 'GUI Thing' from StatSci. Put S-Plus in an independent MS-Window (Splus persists even if the '(ddeESS [S+])' window is killed in emacs). Do this by creating a comint process that calls sh. Send a shell command in that sh buffer to call Splus. When it completes set up a shell as a placeholder in the '(ddeESS [S+])' buffer. The S-Plus options are correctly set. In particular, the S-Plus Commands window is opened if the Options/General Settings/Startup menu says it should be. There is a startup delay of `ess-S+-startup-delay' seconds during which the screen will not be refreshed. This delay is here to allow slow disks to start the Splus program." (interactive) (save-excursion (setq ess-customize-alist S+-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-program (append ess-customize-alist '((inferior-ess-program . "sh")))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (setq ess-customize-alist ; change inferior-ess-start-args (append ess-customize-alist '((inferior-ess-start-args . "-i")))) (let ((s-proj (getenv "S_PROJ")) (use-dialog-box (not (or ess-microsoft-p (eq system-type 'cygwin)))) ) (cd (w32-short-file-name (directory-file-name default-directory))) (setenv "S_PROJ" (w32-short-file-name default-directory)) (inferior-ess) (sleep-for 2) ; need to wait, else working too fast! The Splus ; command in '(ddeESS [S+])' should follow the "$" ; prompt. If not, then increase the sleep-for time! (setenv "S_PROJ" s-proj)) (setq ess-customize-alist S+-customize-alist) (ess-setq-vars-local ess-customize-alist) ;;; the next three lines belong in customize-alist, but can't be there ;;; because of the broken ess-setq-vars-default usage in ess-inf.el (setq inferior-ess-ddeclient "ddeclient") (setq inferior-ess-client-name "S-PLUS") (setq inferior-ess-client-command "SCommand") ;;; end of what belongs in customize-alist (setq comint-process-echoes nil) (setq comint-input-sender 'comint-simple-send) (goto-char (point-max)) (insert (concat inferior-S+-program-name " " inferior-ess-start-args)) ; Note: there is no final "&". ;; Without the "&", the results of !system.command come to '(ddeESS [S+])' ;; With the "&", the results of !system.command in S get lost. (inferior-ess-send-input) (sleep-for ess-S+-startup-delay) ; Need to wait, else working too fast! ; If the ess-current-process-name doesn't appear in the ; Splus Commands window increase the sleep-for time! (setq ess-local-process-name ess-current-process-name) (ess-eval-linewise (concat "#" ess-current-process-name)) (goto-char (point-min)) (insert "This is a placeholder buffer. You can't type anything here. Use `C-x b RET' to return to your file.\n Anything sent to this process from an S-mode buffer goes directly to the associated Splus Commands window.\n The S-Plus Commands window must be visible. You may need to open the S-Plus Commands window manually (by clicking on Splus/Window/Commands Window).\n Any results of the !system.command typed at the S prompt in the Splus Commands window appear in this buffer.\n\n") (goto-char (point-max)) ; comint-mode-map makes '(ddeESS [S+])' ;; (use-local-map comint-mode-map) ;a shell buffer after Splus is finished. (set-buffer-process-coding-system 'raw-text-dos 'raw-text-unix) (setq buffer-read-only t) ; force buffer to be read-only (setq mode-name "ddeESS") ;; (ess-eval-linewise inferior-S+-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) )) (defalias 'S+6-existing 'S+-existing) (defun S+-existing (&optional proc-name) "Call 'S-PLUS [678].x for Windows', the 'GUI Thing' from StatSci. Do so by finding an existing S-Plus in an independent MS-Window (if there is one) and set up a '(ddeESS [S+])' buffer in emacs. If there is no existing S-Plus, then a new one will be opened in the default directory. The default is usually something like 'c:/Program Files/Insightful/splus70/users/yourname' for S-Plus before 8.0.4. Beginning with 8.0.4, S-Plus uses the default directory 'c:/Documents and Settings/yourname/My Documents/S-PLUS Projects/Project1'. Beginning with TIBCO Spotfire S+ Version 8.1.1 for Microsft Windows, the default directory is 'c:/DOCUME~1/yourname/MYDOCU~1/SPOTFI~1/Project1'. If you have a HOME environment variable, it will open it there." (interactive) (let* ((inferior-S+-multipleinstances " & # ") ; Note: there is a final "&". (ess-S+-startup-delay 0)) ;; No delay for existing S-Plus ;; Without the "&", there is a core dump. ;; With the "&", the results of !system.command in S get lost. ;; We are picking up an existing S-Plus process for sending to. ;; It doesn't know about us, so nothing comes back. (S+-initiate proc-name)) (with-current-buffer (car (buffer-list)) ; get the ESS buffer just created (setq buffer-read-only nil) ; permit writing in ESS buffer (goto-char (point-max)) (beginning-of-line) (forward-line -1) (insert "This is S+-existing. Results of the !system.command typed at the S prompt in the Splus Commands window blink a DOS window and you won't see them.\n\n") (setq buffer-read-only t) ; restore ESS buffer to be read-only )) ;;; There are extra complications in Sqpe+6 (compared to S+3) because ;;; (1) The StatSci supplied Sqpe.exe won't work without SHOME as an ;;; environment variable and Sqpe does not take command line ;;; arguments and ;;; (2) Sqpe.exe comes up with options(interactive=FALSE), which means it ;;; doesn't provide prompts by default, and we must change it to T so ;;; it will provide prompts. ;;; (defalias 'Sqpe+6 'Sqpe+) (defun Sqpe+ (&optional proc-name) "Call 'Sqpe' from 'S-PLUS [678].x for Windows', the 'Real Thing' from StatSci." (interactive) (setq ess-customize-alist Sqpe+-customize-alist) (let* ((shome-nil-p (equal (getenv "SHOME") nil)) (use-dialog-box (not (or ess-microsoft-p (eq system-type 'cygwin)))) ) (if shome-nil-p (setenv "SHOME" inferior-Sqpe+-SHOME-name)) (ess-write-to-dribble-buffer (format "\n(Sqpe+6): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (inferior-ess) (setq ess-customize-alist Sqpe+-customize-alist) ; restore i-e-p-p in alist (ess-setq-vars-local ess-customize-alist) ; restore i-e-p-p in buffer (setq inferior-ess-prompt ; define with correct i-e-p-p ;; Do not anchor to bol with `^' ; (copied from ess-inf.el) (concat "\\(" inferior-ess-primary-prompt "\\|" inferior-ess-secondary-prompt "\\)")) (setq comint-prompt-regexp (concat "^" inferior-ess-prompt)) ; define with correct i-e-p-p (setq comint-input-sender 'inferior-ess-input-sender) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) (goto-char (point-max)) (insert "options(interactive=TRUE)") (inferior-ess-send-input) (setq mode-name "iESS(Sqpe)") ;; (ess-eval-linewise inferior-S+-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) (if shome-nil-p (setenv "SHOME" nil)))) (defalias 'S+6-mode 'S+-mode) (defun S+-mode (&optional proc-name) "Major mode for editing S+[678] source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+-customize-alist) (ess-mode S+-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) (defalias 'S+6-transcript-mode 'S+-transcript-mode) (defun S+-transcript-mode () "S-PLUS transcript mode." (interactive) (ess-transcript-mode S+-customize-alist)) (defalias 'S+-msdos 'S+-msdos) (defun S+-msdos (&optional proc-name) "Verify that `inferior-S+-program-name' points to S-Plus 6 or S-Plus 7 or S-Plus 8. Start normally for S-Plus 6.1 and later. Inform the user to start S-Plus 6.0 from the icon and then connect to it with `S+-msdos-existing'. Give an error message if `inferior-S+-program-name' doesn't point to S-Plus 6 or S-Plus 7 or S-Plus 8." (interactive) (with-current-buffer (find-file-noselect (concat (executable-find inferior-S+-program-name) "/../../versions") t) (setq buffer-read-only 1) (forward-line) (if (not (search-backward-regexp "splus\t[678].[0-9]" (point-min) t)) (error "The emacs variable `inferior-S+-program-name' does not point to S-Plus 6 or 7 or 8. Please add `splus[678]?/cmd' (expand the `[678]?' to match your setup) to your `exec-path' or specify the complete path to `Splus.exe' in the variable `inferior-S+-program-name' in your `.emacs' file.") ;;; " This comment keeps emacs font-lock from getting out of phase. (progn (forward-line) (if (search-backward "splus\t6.0" (point-min) t) (error "S-Plus 6.0 for Microsoft Windows has a bug that prevents it from being started by emacs. Instead, you must start it by double-clicking an icon. Then you can connect to it with `S+-msdos-existing'. You should consider upgrading to a newer release of S-Plus.") (S+-msdos-initiate proc-name))) ;; normal start ; ))) (defalias 'S+6-msdos-initiate 'S+-msdos-initiate) (defun S+-msdos-initiate (&optional proc-name) "Call 'S-PLUS [678].x for Windows', the 'GUI Thing' from StatSci. Put S-Plus in an independent MS-Window (Splus persists even if the '(ddeESS [S+])' window is killed in emacs). Do this by creating a comint process that calls sh. Send a shell command in that sh buffer to call Splus. When it completes set up a shell as a placeholder in the '(ddeESS [S+])' buffer. The S-Plus options are correctly set. In particular, the S-Plus Commands window is opened if the Options/General Settings/Startup menu says it should be. There is a startup delay of `ess-S+-startup-delay' seconds during which the screen will not be refreshed. This delay is here to allow slow disks to start the Splus program." (interactive) (save-excursion (setq ess-customize-alist S+-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-program (append ess-customize-alist '((inferior-ess-program . (getenv "COMSPEC"))))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (setq ess-customize-alist ; change inferior-ess-start-args (append ess-customize-alist '((inferior-ess-start-args . "")))) (let ((s-proj (getenv "S_PROJ")) (use-dialog-box (not (or ess-microsoft-p (eq system-type 'cygwin)))) ) (cd (w32-short-file-name (directory-file-name default-directory))) (setenv "S_PROJ" (w32-short-file-name default-directory)) (inferior-ess) (sleep-for 2) ; need to wait, else working too fast! The Splus ; command in '(ddeESS [S+])' should follow the "$" ; prompt. If not, then increase the sleep-for time! (setenv "S_PROJ" s-proj)) (setq ess-customize-alist S+-customize-alist) (ess-setq-vars-local ess-customize-alist) ;;; the next three lines belong in customize-alist, but can't be there ;;; because of the broken ess-setq-vars-default usage in ess-inf.el (setq inferior-ess-ddeclient "ddeclient") (setq inferior-ess-client-name "S-PLUS") (setq inferior-ess-client-command "SCommand") ;;; end of what belongs in customize-alist (setq comint-input-sender 'comint-simple-send) (setq comint-process-echoes nil) (set-buffer-process-coding-system 'raw-text-dos 'raw-text-dos) (goto-char (point-max)) (insert (concat inferior-S+-program-name " " inferior-ess-start-args)) ; Note: there is no final "&". ;; Without the "&", the results of !system.command come to '(ddeESS [S+])' ;; With the "&", the results of !system.command in S get lost. (inferior-ess-send-input) (sleep-for ess-S+-startup-delay) ; Need to wait, else working too fast! ; If the ess-current-process-name doesn't appear in the ; Splus Commands window increase the sleep-for time! ;;; from msdos-minor-mode (setq comint-process-echoes t) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) ;;; end from msdos-minor-mode (setq ess-local-process-name ess-current-process-name) (ess-eval-linewise (concat "#" ess-current-process-name)) (goto-char (point-min)) (insert "This is a placeholder buffer. You can't type anything here. Use `C-x b RET' to return to your file.\n Anything sent to this process from an S-mode buffer goes directly to the associated Splus Commands window.\n The S-Plus Commands window must be visible. You may need to open the S-Plus Commands window manually (by clicking on Splus/Window/Commands Window).\n There is a `ess-S+-startup-delay' second delay when this program starts during which the emacs screen will be partially blank.\n Remember to 'q()' from S-Plus and then C-x C-q exit from the '(ddeESS [S+])' buffer, or take the risk of not being able to shut down your computer and suffering through scandisk.\n Any results of the !system.command typed at the S prompt in the Splus Commands window (are supposed to) appear in this buffer.\n\n") (goto-char (point-max)) ; comint-mode-map makes '(ddeESS [S+])' (use-local-map comint-mode-map) ; a shell buffer after Splus is finished. (setq buffer-read-only t) ; force buffer to be read-only (setq mode-name "ddeESS") ;; (ess-eval-linewise inferior-S+-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) )) (defalias 'S+6-msdos-existing 'S+-msdos-existing) (defun S+-msdos-existing (&optional proc-name) "Call 'S-PLUS [678].x for Windows', the 'GUI Thing' from StatSci. Do so by finding an existing S-Plus in an independent MS-Window (if there is one) and set up a '(ddeESS [S+])' buffer in emacs. If there is no existing S-Plus, then a new one will be opened in the default directory. The default is usually something like 'c:/Program Files/Insightful/splus70/users/yourname' for S-Plus before 8.0.4. Beginning with 8.0.4, S-Plus uses the default directory 'c:/Documents and Settings/yourname/My Documents/S-PLUS Projects/Project1'. Beginning with TIBCO Spotfire S+ Version 8.1.1 for Microsft Windows, the default directory is 'c:/DOCUME~1/yourname/MYDOCU~1/SPOTFI~1/Project1'. If you have a HOME environment variable, it will open it there." (interactive) (let* ((inferior-S+-multipleinstances "") (ess-S+-startup-delay 0)) ;; No delay for existing S-Plus (S+-msdos-initiate proc-name)) (with-current-buffer (car (buffer-list)) ; get the ESS buffer just created (setq buffer-read-only nil) ; permit writing in ESS buffer (goto-char (point-max)) (beginning-of-line) (forward-line -1) (insert "This is S+-msdos-existing. Results of the !system.command typed at the S prompt in the Splus Commands window blink a DOS window and you won't see them.\n\n") (setq buffer-read-only t) ; restore ESS buffer to be read-only )) (defun ess-sqpe-versions-create (ess-SHOME-versions &optional x64) "Generate the `M-x splusxy' functions for starting other versions of Sqpe. `ESS-SHOME-VERSIONS' is normally taken from `ess-sqpe-versions', a variable that contains strings that determine which functions are created. This works by creating a temp buffer where the template function `Sqpe+template' is edited by replacing the string 'Sqpe+template' by the version name. The list of functions actually created appears in the *ESS* buffer. If `X64' is not nil, then modify the function name to show \"-64bit\" in its name. The result `ess-sqpe-versions-created' will store a list of the new Sqpe defuns, if any, that were created. The defuns will normally be placed on the menubar upon ESS initialisation." (let ((beg) (versions) (version) (eval-buf (get-buffer-create "*ess-temp-sqpe-evals*")) (ess-sqpe-versions-created) ) ;; (with-current-buffer eval-buf ;; clear the buffer. (delete-region (point-min) (point-max)) ;; Find which versions of Sqpe we want. (setq x64 (if x64 "-64bit")) (setq versions (ess-uniq-list ess-SHOME-versions)) ;; Iterate over each string in VERSIONS, creating a new defun each time. (while versions (setq version (car versions) versions (cdr versions)) (if (file-executable-p version) (progn (setq beg (point)) (setq version-function-name (concat (file-name-nondirectory version) x64)) (prin1 (symbol-function 'Sqpe+template) eval-buf) (insert "\n\n") (goto-char beg) (while (search-forward "lambda" nil t 1) (replace-match (concat "defun " version-function-name) t t)) (while (search-forward "ess-SHOME" nil t) (replace-match version t t)) (goto-char (point-max)) (setq ess-sqpe-versions-created (cons version-function-name ess-sqpe-versions-created)) (ess-write-to-dribble-buffer (format "(Sqpe): ess-sqpe-versions-create making M-x defun %s for %s \n" version-function-name version)) ))) ;; buffer has now been created with defuns, so eval them! (eval-buffer) (kill-buffer eval-buf)) ess-sqpe-versions-created)) ;; template function used by ess-sqpe-versions-create (defun Sqpe+template (&optional proc-name) "Call 'Sqpe' from 'S-PLUS for Windows ess-SHOME', the 'Real Thing' from StatSci. This function was generated by `ess-sqpe-versions-create'." (interactive) (setq ess-customize-alist Sqpe+-customize-alist) (let* ((use-dialog-box) ;; MS dialog box won't return a directory (shome-old (getenv "SHOME")) (inferior-Sqpe+-SHOME-name "ess-SHOME") (inferior-Sqpe+-program-name (concat "ess-SHOME" "/cmd/sqpe.exe"))) (setenv "SHOME" "ess-SHOME") (ess-write-to-dribble-buffer (format "\n(Sqpe+template): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (inferior-ess) (setq ess-customize-alist Sqpe+-customize-alist) ; restore i-e-p-p in alist (ess-setq-vars-local ess-customize-alist) ; restore i-e-p-p in buffer (setq inferior-ess-prompt ; define with correct i-e-p-p ;; Do not anchor to bol with `^' ; (copied from ess-inf.el) (concat "\\(" inferior-ess-primary-prompt "\\|" inferior-ess-secondary-prompt "\\)")) (setq comint-prompt-regexp (concat "^" inferior-ess-prompt)) ; define with correct i-e-p-p (setq comint-input-sender 'inferior-ess-input-sender) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) (goto-char (point-max)) (insert "options(interactive=TRUE)") (inferior-ess-send-input) (setq mode-name "iESS(Sqpe)") ;; (ess-eval-linewise inferior-S+-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) (setenv "SHOME" shome-old))) ; Provide package (provide 'ess-sp6w-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sp6w-d.el ends here ess/lisp/ess-dde.el0000664000175000017500000001502212423756516012554 0ustar eddedd;;; ess-dde.el --- ESS customization for ddeclients under Windows 9x/NT ;; Copyright (C) 1998--1999 Richard M. Heiberger ;; Copyright (C) 2000--2006 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: 9 Dec 1998 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for dealing with running external processes on Windows 9x/NT ;; through ddeclient. ;;; Code: ;; *NO* Requires and autoloads ;; C-c C-r (defun ess-eval-region-ddeclient (start end even-empty) "Loop through lines in region and send them to ESS via ddeclient." (setq ;; set the following variables for the current ddeESS process. inferior-ess-ddeclient (ess-get-process-variable 'inferior-ess-ddeclient) inferior-ess-client-name (ess-get-process-variable 'inferior-ess-client-name) inferior-ess-client-command (ess-get-process-variable 'inferior-ess-client-command)) (narrow-to-region start end) (goto-char (point-min)) (let ((beg)) (while (or (< (point) (point-max)) (and (= 1 (point-max)) even-empty)) (setq beg (point)) (end-of-line) ;; call-process-region won't send over a 0-character line. ;; We go outside the loop to create a 1-character line " " in the ;; *ESS-temporary* buffer (if (= beg (point)) ;; do empty line outside loop (ess-eval-linewise-ddeclient " " nil 'eob t) ;;(call-process-region start end ;; "ddeclient" nil nil nil "S-PLUS" "SCommand") (call-process-region beg (point) inferior-ess-ddeclient nil nil nil inferior-ess-client-name inferior-ess-client-command)) (forward-line 1)) (widen))) ;; C-c C-n (defun ess-eval-linewise-ddeclient (text-withtabs &optional invisibly eob even-empty sleep-sec) (with-current-buffer (get-buffer-create "*ESS-temporary*") (ess-setq-vars-local ess-customize-alist (current-buffer)) (erase-buffer) (insert text-withtabs) (ess-eval-region-ddeclient (point-min) (point-max) even-empty)) (if (numberp sleep-sec) (sleep-for sleep-sec))); in addition to timeout-ms ;; C-c C-v (defun ess-display-help-on-object-ddeclient (object) "Display the ESS documentation for OBJECT in another window. If prefix arg is given, forces a query of the ESS process for the help file. Otherwise just pops to an existing buffer if it exists." (ess-force-buffer-current "Process to load into: ") (ess-eval-linewise-ddeclient (concat "help(" object ")"))) ;; C-c C-l (defun ess-load-file-ddeclient (filename) "Load an S source file into an inferior ESS process; alternate behavior for `ess-load-file', required with S-Plus GUI for Windows: Sends the S-Plus command source(\"filename\") to S. This version does not guarantee to save .Last.value, nor offer alternate buffers or editing capability." (let ((source-buffer (get-file-buffer filename))) (if (ess-check-source filename) (error "Buffer %s has not been saved" (buffer-name source-buffer)) ;; Find the process to load into (if source-buffer (with-current-buffer source-buffer (ess-force-buffer-current "Process to load into: ") ;; (ess-check-modifications) ;;; not possible with ddeclient ;; it calls ess-command which requires two-way communication ;; with the S-Plus process ))) (ess-eval-linewise-ddeclient (format ess-load-command filename))) (widen)) ;; C-c C-d (defun ess-dump-object-ddeclient (object filename) "Dump the ESS object OBJECT into file FILENAME." (ess-force-buffer-current "Process to load into: ") (ess-eval-linewise-ddeclient (concat "dump('" object "','" filename "')")) (sleep-for 5) (find-file filename) (widen)) (defun ess-dput-expression-ddeclient (object filename) "Dump the ESS object found by evaluating OBJECT into file FILENAME." (ess-force-buffer-current "Process to load into: ") (ess-eval-linewise-ddeclient (concat "dput(" object ",'" filename "')")) (sleep-for 2) (find-file filename)) (defun ess-command-ddeclient-proposed (com &optional buf sleep) "ddeclient version of real `ess-command'. Send the ESS process command COM and redirect its output to the temporary file named BUF. The temporary filename is constructed in emacs, not in the ESS process. The default name for the temporary buffer is \"ess-temp.st\". The function waits SLEEP (which defaults to 1) seconds and then brings the temporary file into an emacs buffer and displays it." (let (filename bufname) (if (not buf) (setq buf "ess-temp.st")) (if (not sleep) (setq sleep 1)) (setq filename (concat (file-name-as-directory (getenv "TEMP")) buf)) (ess-eval-linewise-ddeclient (concat ".old.Last.value <- .Last.value; sink('" filename "'); print(" com "); sink(); .Last.value <- .old.Last.value")) (setq bufname (ess-get-file-or-buffer filename)) ;; must follow the eval (sleep-for sleep) (if (not bufname) (find-file filename) (switch-to-buffer bufname)) (revert-buffer t t) ;; this allows the user to reuse the BUF name )) ;; previous version (ESS-5.2.12 and earlier) (defun ess-command-ddeclient (com &optional buf sleep) "ddeclient bypass of real ess-command" (ess-eval-linewise com)) (provide 'ess-dde) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-dde.el ends here ess/lisp/ess-sp5-d.el0000664000175000017500000001015712423756516012754 0ustar eddedd;;; ess-sp5-d.el --- S-plus 5 customization ;; Copyright (C) 1998 A.J. Rossini ;; Copyright (C) 1999--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 9 Nov 1998 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; AJR copied S4 to be S+5. ;; DB contributed the changes from ess-sp3-d.el to ;; ess-s4-d.el. (removed the old ugly approach). ;; This file defines Sp5 customizations for ess-mode. Lots of thanks ;; to RMH and JMC for code and suggestions ;; Thanks to MM for making this sensible. ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (require 'ess-s-l) ;; You now need to make sure you've defined if you are running 5.0 or 5.1. ;; Lots of things are broken between them, GRR... (defvar S+5-dialect-name "S+5" "Name of 'dialect' for S-PLUS 5.");easily changeable in a user's .emacs (defvar S+5-customize-alist (append '((ess-local-customize-alist . 'S+5-customize-alist) (ess-dialect . S+5-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-object-name-db-file . "ess-sp5-namedb.el") (inferior-ess-program . inferior-S+5-program-name) ;;(inferior-ess-objects-pattern . ".*") ; for new s4 stuff (inferior-ess-help-command . "help(\"%s\", pager=\"slynx -dump\", window=FALSE)\n") (inferior-ess-help-filetype . nil) (inferior-ess-search-list-command . "searchPaths()\n") (inferior-ess-start-args . inferior-S+-start-args) (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for S+5.") ;; For loading up the S code required for the above. ;;(add-hook 'ess-post-run-hook ;; (lambda () ;; (ess-command ;; (concat ;; "if(exists(\"Sversion\")) library(emacs) else source(\"" ;; ess-mode-run-file ;; "\")\n")) ;; (if ess-mode-run-file2 ;; (ess-command ;; (concat "source(\"" ess-mode-run-file2 "\")\n"))))) (defun S+5 (&optional proc-name) "Call 'Splus5', based on S version 4, from Bell Labs. New way to do it." (interactive) (setq ess-customize-alist S+5-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+5): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start))) (defun S+5-mode (&optional proc-name) "Major mode for editing S+5 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+5-customize-alist) (ess-mode S+5-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) (defun S+5-transcript-mode () "S-PLUS 5 transcript mode." (interactive) (ess-transcript-mode S+5-customize-alist)) ; Provide package (provide 'ess-sp5-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sp5-d.el ends here ess/lisp/ess-inf.el0000664000175000017500000044366712632537307012615 0ustar eddedd;;; ess-inf.el --- Support for running S as an inferior Emacs process ;; Copyright (C) 1989-1994 Bates, Kademan, Ritter and Smith ;; Copyright (C) 1997-1999 A.J. Rossini , ;; Martin Maechler . ;; Copyright (C) 2000--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: David Smith ;; Created: 7 Jan 1994 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for handling running ESS processes. ;;; Code: ; Requires and autoloads ;;*;; Requires ;; Byte-compiler, SHUT-UP! (eval-when-compile (require 'ess-utils) (require 'tramp)) (unless (featurep 'xemacs) (require 'newcomment nil t)) (require 'comint) (require 'overlay) (require 'compile) ;;; VS: These autoloads are not needed. See coments in ess-mode.el. ;;*;; Autoloads ;; (autoload 'ess-parse-errors "ess-mode" "(autoload).") ;; (autoload 'ess-dump-object-into-edit-buffer "ess-mode" "(autoload).") ;; (autoload 'ess-beginning-of-function "ess-mode" "(autoload).") ;; (autoload 'ess-end-of-function "ess-mode" "(autoload).") ;; (autoload 'ess-display-help-on-object "ess-help" "(autoload).") ;; (autoload 'ess-extract-word-name "ess-utils" "(autoload).") ;; (autoload 'ess-uniq-list "ess-utils" "(autoload).") ;; (autoload 'ess-transcript-send-command-and-move "ess-trns" "(autoload).") ;; (autoload 'ess-R-complete-object-name "ess-r-d" "(autoload).") (autoload 'ess-eval-region-ddeclient "ess-dde" "(autoload).") (autoload 'ess-eval-linewise-ddeclient "ess-dde" "(autoload).") (autoload 'ess-load-file-ddeclient "ess-dde" "(autoload).") (autoload 'ess-command-ddeclient "ess-dde" "(autoload).") (autoload 'tramp-tramp-file-p "tramp" "(autoload).") (autoload 'tramp-file-name-localname "tramp" "(autoload).") (autoload 'tramp-dissect-file-name "tramp" "(autoload).") ;; not really needed as tracebug and developer are loaded in r-d.el (autoload 'ess-tracebug-send-region "ess-tracebug" "(autoload).") (autoload 'ess-developer-send-function "ess-developer" "(autoload).") ;;*;; Process handling ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; In this section: ;;; ;;; * User commands for starting an ESS process ;;; * Functions called at startup ;;; * Process handling code ;;; * Multiple process implementation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;*;; Starting a process (defun ess-proc-name (n name) "Return name of process N, as a string, with NAME prepended. If ess-plain-first-buffername, then initial process is number-free." (concat name (if (not (and ess-plain-first-buffername (= n 1))) ; if not both first and plain-first add number (concat ":" (number-to-string n))))) (defun inferior-ess (&optional ess-start-args customize-alist no-wait) "Start inferior ESS process. Without a prefix argument, starts a new ESS process, or switches to the ESS process associated with the current buffer. With a prefix, starts the process with those args. The current buffer is used if it is an `inferior-ess-mode' or `ess-transcript-mode' buffer. If `ess-ask-about-transfile' is non-nil, you will be asked for a transcript file to use. If there is no transcript file, the buffer name will be like *R* or *R2*, determined by `ess-gen-proc-buffer-name-function'. Takes the program name from the variable `inferior-ess-program'. An initialization file (dumped into the process) is specified by `inferior-ess-start-file', and `inferior-ess-start-args' is used to accompany the call for `inferior-ess-program'. When creating a new process, the process buffer replaces the current window if `inferior-ess-same-window' is non-nil. Alternatively, it can appear in its own frame if `inferior-ess-own-frame' is non-nil. \(Type \\[describe-mode] in the process buffer for a list of commands.)" ;; Use the current buffer if it is in inferior-ess-mode or ess-trans-mode ;; If not, maybe ask about starting directory and/or transcript file. ;; If no transfile, use buffer *S* ;; ;; This function is primarily used to figure out the Process and ;; buffer names to use for inferior-ess. ;; Once, long ago, it was used for switching buffers, but we don't ;; do that any more (at least not from here). (interactive) (let* ((ess-customize-alist (or customize-alist ess-customize-alist)) (temp-ess-dialect (eval (cdr (assoc 'ess-dialect ess-customize-alist)))) (temp-ess-lang (eval (cdr (assoc 'ess-language ess-customize-alist))))) (run-hooks 'ess-pre-run-hook) (ess-write-to-dribble-buffer (format "(inf-ess 1): lang=%s, dialect=%s, tmp-dialect=%s, buf=%s\n" ess-language ess-dialect temp-ess-dialect (current-buffer))) (let* ((process-environment process-environment) (defdir (or (and ess-directory-function (funcall ess-directory-function)) ess-directory default-directory)) (temp-dialect (if ess-use-inferior-program-name-in-buffer-name ;VS[23-02-2013]: fixme: this should not be here (if (string-equal temp-ess-dialect "R") inferior-R-program-name temp-ess-dialect) ; use temp-ess-dialect ; if not R, R program name ; otherwise. temp-ess-dialect)) (temp-lang temp-ess-lang) (procname (let ((ntry 0) ;; find the next non-existent process N (*R:N*) (done nil)) (while (not done) (setq ntry (1+ ntry) done (not (get-process (ess-proc-name ntry temp-dialect))))) (ess-proc-name ntry temp-dialect))) (buf-name-str (funcall ess-gen-proc-buffer-name-function procname)) startdir buf method) (ess-write-to-dribble-buffer (format "(inf-ess 1.1): procname=%s temp-dialect=%s, buf-name=%s \n" procname temp-dialect buf-name-str)) (cond ;; 1) try to use current buffer, if inferior-ess-mode but no process ((and (not (comint-check-proc (current-buffer))) (eq major-mode 'inferior-ess-mode)) (setq startdir (if ess-ask-for-ess-directory (ess-get-directory defdir temp-dialect procname) defdir) buf (current-buffer) ;; don't change existing buffer name in this case; It is very ;; commong to restart the process in the same buffer. buf-name-str (buffer-name) method 1)) ;; 2) Take the *R:N* buffer if already exists (and contains dead proc!) ;; fixme: buffer name might have been changed, iterate over all ;; inferior-ess buffers ((get-buffer buf-name-str) (setq buf (get-buffer buf-name-str) method 2)) ;; 3) Pick up a transcript file or create a new buffer (t (setq startdir (if ess-ask-for-ess-directory (ess-get-directory defdir temp-dialect procname) defdir) buf (if ess-ask-about-transfile (let ((transfilename (read-file-name "Use transcript file (default none):" startdir ""))) (if (string= transfilename "") (get-buffer-create buf-name-str) (find-file-noselect (expand-file-name transfilename)))) (get-buffer-create buf-name-str)) method 3))) (ess-write-to-dribble-buffer (format "(inf-ess 2.0) Method #%d start=%s buf=%s\n" method startdir buf)) (set-buffer buf) ;; Now that we have the buffer, set buffer-local variables. (ess-setq-vars-local ess-customize-alist) ; buf) ;; Write out debug info (ess-write-to-dribble-buffer (format "(inf-ess 2.1): ess-language=%s, ess-dialect=%s buf=%s \n" ess-language ess-dialect (current-buffer))) ;; initialize. (if startdir (setq default-directory startdir)) ;; the following was part of ess-multi; (let* ((ess-directory (or startdir ess-directory)) (infargs (or ess-start-args inferior-ess-start-args)) (special-display-regexps nil) (special-display-frame-alist inferior-ess-frame-alist) (proc (get-process procname))) (if inferior-ess-own-frame (setq special-display-regexps '("."))) ;; If ESS process NAME is running, switch to it (if (and proc (comint-check-proc (process-buffer proc))) (progn ;; fixme: when does this happen? -> log: (ess-write-to-dribble-buffer (format "(inf-ess ..): popping to proc\n")) (pop-to-buffer (process-buffer proc))) ;; Otherwise, crank up a new process (let* ((symbol-string (concat "inferior-" inferior-ess-program "-args")) (switches-symbol (intern-soft symbol-string)) (switches (if (and switches-symbol (boundp switches-symbol)) (symbol-value switches-symbol)))) (set-buffer buf) (inferior-ess-mode) (ess-write-to-dribble-buffer (format "(inf-ess 3.0): prog=%s, start-args=%s, echoes=%s\n" inferior-ess-program infargs comint-process-echoes)) (setq ess-local-process-name procname) (goto-char (point-max)) ;; load past history ;; Set up history file (if ess-history-file (if (eq t ess-history-file) (set (make-local-variable 'ess-history-file) (concat "." ess-dialect "history")) ;; otherwise must be a string "..." (unless (stringp ess-history-file) (error "`ess-history-file' must be nil, t, or a string")))) (when ess-history-file (setq comint-input-ring-file-name (expand-file-name ess-history-file (or ess-history-directory ess-directory))) (comint-read-input-ring)) ;; create and run process. (set-buffer (if switches (inferior-ess-make-comint buf-name-str procname infargs switches) (inferior-ess-make-comint buf-name-str procname infargs))) ;; Set the process sentinel to save the history (set-process-sentinel (get-process procname) 'ess-process-sentinel) ;; Add this process to ess-process-name-list, if needed (let ((conselt (assoc procname ess-process-name-list))) (if conselt nil (setq ess-process-name-list (cons (cons procname nil) ess-process-name-list)))) (ess-make-buffer-current) (goto-char (point-max)) (setq ess-sl-modtime-alist nil) ;; Add the process filter to catch certain output. (set-process-filter (get-process procname) 'inferior-ess-output-filter) ;; (inferior-ess-wait-for-prompt) (inferior-ess-mark-as-busy (get-process procname)) (process-send-string (get-process procname) "\n") ;; to be sure we catch the prompt if user comp is super-duper fast. (unless no-wait (ess-write-to-dribble-buffer "(inferior-ess: waiting for process to start (before hook)\n") (ess-wait-for-process (get-process procname) nil 0.01)) ;; arguments cache (ess-process-put 'funargs-cache (make-hash-table :test 'equal)) (ess-process-put 'funargs-pre-cache nil) ;; set accumulation buffer name (buffer to cache output for faster display) (process-put (get-process procname) 'accum-buffer-name (format " *%s:accum*" procname)) ;; don't font-lock strings over process prompt (set (make-local-variable 'syntax-begin-function) #'inferior-ess-goto-last-prompt-if-close) (set (make-local-variable 'font-lock-fontify-region-function) #'inferior-ess-fontify-region) (run-hooks 'ess-post-run-hook) ;; EXTRAS (ess-load-extras t) ;; user initialization can take some time ... (unless no-wait (ess-write-to-dribble-buffer "(inferior-ess 3): waiting for process after hook") (ess-wait-for-process (get-process procname)))) (with-current-buffer buf (rename-buffer buf-name-str t)) (if (and inferior-ess-same-window (not inferior-ess-own-frame)) (switch-to-buffer buf) (pop-to-buffer buf))))))) (defvar inferior-ess-objects-command nil "The language/dialect specific command for listing objects. It is initialized from the corresponding inferior--objects-command and then made buffer local."); and the *--* ones are customized! (make-variable-buffer-local 'inferior-ess-objects-command) (defvar ess-save-lastvalue-command nil "The command to save the last value. See S section for more details. Default depends on the ESS language/dialect and hence made buffer local") (make-variable-buffer-local 'ess-save-lastvalue-command) (defvar ess-retr-lastvalue-command nil "The command to retrieve the last value. See S section for more details. Default depends on the ESS language/dialect and hence made buffer local") (make-variable-buffer-local 'ess-retr-lastvalue-command) ;;; A note on multiple processes: the following variables ;;; ess-local-process-name ;;; ess-sl-modtime-alist ;;; ess-prev-load-dir/file ;;; ess-directory ;;; ess-object-list ;;; are specific to each ess-process and are buffer-local variables ;;; local to the ESS process buffer. If required, these variables should ;;; be accessed with the function ess-get-process-variable (defun inferior-ess-goto-last-prompt-if-close (&optional pos) "Staging from POS go to previous primary prompt and return the position. Look only for primary or secondary prompt on the current line. If found, return the starting position of the prompt, otherwise stay at current position and return nil. POS defaults to `point'." (let* ((pos (or pos (point))) (new-pos (save-excursion (beginning-of-line) (if (looking-at inferior-ess-primary-prompt) pos (when (and inferior-ess-secondary-prompt (looking-at inferior-ess-secondary-prompt)) (re-search-backward (concat "^" inferior-ess-primary-prompt)) pos))))) (when new-pos (goto-char new-pos)))) (defvar compilation--parsed) (defvar ess--tb-last-input) (defvar compilation--parsed) (defun inferior-ess-fontify-region (beg end &optional verbose) "Fontify output by output within the beg-end region to avoid fontification spilling over prompts." (let* ((buffer-undo-list t) (inhibit-point-motion-hooks t) (font-lock-dont-widen t) (buff (current-buffer)) (pos0 (or (inferior-ess-goto-last-prompt-if-close beg) beg)) (pos1 pos0) pos2) (when (< pos0 end) (with-silent-modifications ;; fontify chunks from prompt to prompt (while (< pos1 end) (goto-char pos1) (comint-next-prompt 1) (setq pos2 (min (point) end)) (save-restriction (narrow-to-region pos1 pos2) (font-lock-default-fontify-region pos1 pos2 verbose)) (setq pos1 pos2)) ;; highlight errors (setq compilation--parsed beg) ;; emacs 23 doesn't have this function (when (fboundp 'compilation--ensure-parse) ;; this line is a workaround for occasional incomplete highlighting of ;; compilation errors on remotes, but it causes an incredible ;; slowdown. See https://github.com/emacs-ess/ESS/issues/258. ;; (compilation--ensure-parse end) ) `(jit-lock-bounds ,pos0 . ,end))))) (defun ess-gen-proc-buffer-name:simple (proc-name) "Function to generate buffer name by wrapping PROC-NAME in *proc-name*. See `ess-gen-proc-buffer-name-function'." (format "*%s*" proc-name)) (defun ess-gen-proc-buffer-name:directory (proc-name) "Function to generate buffer name by wrapping PROC-NAME in *PROC-NAME:DIR-NAME*. DIR-NAME is a short directory name. See `ess-gen-proc-buffer-name-function'." (format "*%s:%s*" proc-name (file-name-nondirectory (directory-file-name default-directory)))) (defun ess-gen-proc-buffer-name:abbr-long-directory (proc-name) "Function to generate buffer name in the form *PROC-NAME:ABBREVIATED-LONG-DIR-NAME*. PROC-NAME is a string representing an internal process name. ABBREVIATED-LONG-DIR-NAME is an abbreviated full directory name. Abbreviation is performed by `abbreviate-file-name'. See `ess-gen-proc-buffer-name-function'." (format "*%s:%s*" proc-name (abbreviate-file-name default-directory))) (defun ess-gen-proc-buffer-name:projectile-or-simple (proc-name) "Function to generate buffer name in the form *PROC-NAME:PROJECTILE-ROOT*. PROC-NAME is a string representing an internal process name. PROJECTILE-ROOT is directory name returned by `projectile-project-root' if defined. If `projectile-project-root' is undefined or no project directory has been found use `ess-gen-proc-buffer-name:simple'. See `ess-gen-proc-buffer-name-function'." (let ((proj (and (fboundp 'projectile-project-root) (projectile-project-p)))) (if proj (format "*%s:%s*" proc-name (file-name-nondirectory (directory-file-name proj))) (ess-gen-proc-buffer-name:simple proc-name)))) (defun ess-gen-proc-buffer-name:projectile-or-directory (proc-name) "Function to generate buffer name in the form *PROC-NAME:PROJECTILE-ROOT*. PROC-NAME is a string representing an internal process name. PROJECTILE-ROOT is directory name returned by `projectile-project-root' if defined. If `projectile-project-root' is undefined, or no project directory has been found, use `ess-gen-proc-buffer-name:directory'. See `ess-gen-proc-buffer-name-function'." (let ((proj (and (fboundp 'projectile-project-root) (projectile-project-p)))) (if proj (format "*%s:%s*" proc-name (file-name-nondirectory (directory-file-name proj))) (ess-gen-proc-buffer-name:directory proc-name)))) (defun inferior-ess-set-status (proc string &optional no-timestamp) "Internal function to set the satus of the PROC If no-timestamp, don't set the last-eval timestamp. Return the 'busy state." ;; todo: do it in one search, use starting position, use prog1 (let ((busy (not (string-match (concat "\\(" inferior-ess-primary-prompt "\\)\\'") string)))) (process-put proc 'busy-end? (and (not busy) (process-get proc 'busy))) (when (not busy) (process-put proc 'running-async? nil)) (process-put proc 'busy busy) (process-put proc 'sec-prompt (when inferior-ess-secondary-prompt (string-match (concat "\\(" inferior-ess-secondary-prompt "\\)\\'") string))) (unless no-timestamp (process-put proc 'last-eval (current-time))) busy)) (defun inferior-ess-mark-as-busy (proc) (process-put proc 'busy t) (process-put proc 'sec-prompt nil)) (defun inferior-ess-run-callback (proc string) ;; callback is stored in 'callbacks proc property. Callbacks is a list that ;; can contain either functions to be called with two artuments PROC and ;; STRING, or cons cells of the form (func . suppress). If SUPPRESS is non-nil ;; next process output will be suppressed. (unless (process-get proc 'busy) ;; only one callback is implemented for now (let* ((cb (car (process-get proc 'callbacks))) (listp (not (functionp cb))) (suppress (and listp (consp cb) (cdr cb))) (cb (if (and listp (consp cb)) (car cb) cb))) (when cb (when ess-verbose (ess-write-to-dribble-buffer "executing callback ...\n")) (when suppress (process-put proc 'suppress-next-output? t)) (process-put proc 'callbacks nil) (condition-case err (funcall cb proc string) (error (message "%s" (error-message-string err)))))))) (defun ess--if-verbose-write-process-state (proc string &optional filter) (ess-if-verbose-write (format "\n%s: --> busy:%s busy-end:%s sec-prompt:%s interruptable:%s <-- --> running-async:%s callback:%s suppress-next-output:%s <-- --> dbg-active:%s is-recover:%s <-- --> string:%s\n" (or filter "NORMAL-FILTER") (process-get proc 'busy) (process-get proc 'busy-end?) (process-get proc 'sec-prompt) (process-get proc 'interruptable?) (process-get proc 'running-async?) (if (process-get proc 'callbacks) "yes") (process-get proc 'suppress-next-output?) (process-get proc 'dbg-active) (process-get proc 'is-recover) (if (> (length string) 150) (format "%s .... %s" (substring string 0 50) (substring string -50)) string)))) (defun inferior-ess-output-filter (proc string) "Standard output filter for the inferior ESS process. Ring Emacs bell if process output starts with an ASCII bell, and pass the rest to `comint-output-filter'. Taken from octave-mod.el." (inferior-ess-set-status proc string) (ess--if-verbose-write-process-state proc string) (inferior-ess-run-callback proc string) (if (process-get proc 'suppress-next-output?) ;; works only for surpressing short output, for time being is enough (for callbacks) (process-put proc 'suppress-next-output? nil) (comint-output-filter proc (inferior-ess-strip-ctrl-g string)) (ess--show-process-buffer-on-error string proc))) (defun ess--show-process-buffer-on-error (string proc) (let ((case-fold-search nil)) (when (string-match "Error\\(:\\| +in\\)" string) (ess-show-buffer (process-buffer proc))))) (defun inferior-ess-strip-ctrl-g (string) "Strip leading `^G' character. If STRING starts with a `^G', ring the Emacs bell and strip it. Depending on the value of `visible-bell', either the frame will flash or you'll hear a beep. Taken from octave-mod.el." (if (string-match "^\a" string) (progn (ding) (setq string (substring string 1)))) string) (defun ess-process-sentinel (proc message) "Sentinel for use with ESS processes. This marks the process with a message, at a particular time point." (save-excursion (setq message (substring message 0 -1)) ; strip newline (set-buffer (process-buffer proc)) (comint-write-input-ring) (goto-char (point-max)) (insert-before-markers (format "\nProcess %s %s at %s\n" (process-name proc) message (current-time-string))))) (defun inferior-ess-make-comint (bufname procname infargs &rest switches) "Make an S comint process in buffer BUFNAME with process PROCNAME." ;;; This function is a modification of make-comint from the comint.el ;;; code of Olin Shivers. (let* ((buffer (get-buffer-create bufname)) (proc (get-process procname))) ;; If no process, or nuked process, crank up a new one and put buffer in ;; comint mode. Otherwise, leave buffer and existing process alone. (cond ((or (not proc) (not (memq (process-status proc) '(run stop)))) (with-current-buffer buffer (if ess-directory (setq default-directory ess-directory)) (if (eq (buffer-size) 0) nil (goto-char (point-max)) (insert "\^L\n"))) ; page boundaries = Interactive sessions (let ((process-environment (nconc (list "STATATERM=emacs" (format "PAGER=%s" inferior-ess-pager)) process-environment)) (tramp-remote-process-environment (nconc ;; it contains a pager already, so append (when (boundp 'tramp-remote-process-environment) (copy-sequence tramp-remote-process-environment)) (list "STATATERM=emacs" (format "PAGER=%s" inferior-ess-pager))))) (ess-write-to-dribble-buffer "Making Process...") (ess-write-to-dribble-buffer (format "Buf %s, :Proc %s, :Prog %s\n :Args= %s\nStart File=%s\n" buffer procname inferior-ess-program infargs inferior-ess-start-file)) (comint-exec buffer procname inferior-ess-program inferior-ess-start-file (ess-line-to-list-of-words infargs))))) buffer)) ;;*;; Requester functions called at startup (defun ess-get-directory (default dialect procname) (let ((prog-version (cond ((string= dialect "R") (concat ", " inferior-R-version)) ; notably for the R-X.Y versions (inferior-ess-program (concat ", " inferior-ess-program )) (t "")))) (ess-prompt-for-directory (directory-file-name default) (format "ESS (*%s*%s) starting data directory? " procname prog-version) ;; (format "ESS [%s {%s(%s)}: '%s'] starting data directory? " ;; ;;FIXME: maybe rather tmp-dialect (+ evt drop ess-language?)? ;; procname ess-language ess-dialect prog-version) ))) (defun ess-prompt-for-directory (default prompt) "`prompt' for a directory, using `default' as the usual." (let* ((def-dir (file-name-as-directory default)) (the-dir (expand-file-name (file-name-as-directory (read-directory-name prompt def-dir def-dir t nil))))) (if (file-directory-p the-dir) nil (error "%s is not a valid directory" the-dir)) the-dir)) ;;*;; General process handling code (defmacro with-ess-process-buffer (no-error &rest body) "Execute BODY with current-buffer set to the process buffer of ess-current-process-name. If NO-ERROR is t don't trigger error when there is not current process. Symbol *proc* is bound to the current process during the evaluation of BODY." (declare (indent 1) (debug t)) `(let ((*proc* (and ess-local-process-name (get-process ess-local-process-name)))) (if *proc* (with-current-buffer (process-buffer *proc*) ,@body) (unless ,no-error (error "No current ESS process"))))) (defmacro ess-with-current-buffer (buffer &rest body) "Like `with-current-buffer' but with transfer of some essential local ESS vars like `ess-local-process-name'" (declare (indent 1) (debug t)) (let ((lpn (make-symbol "lpn")) (alist (make-symbol "alist"))) `(let ((,lpn ess-local-process-name) (,alist ess-local-customize-alist)) (with-current-buffer ,buffer (ess-setq-vars-local (eval ,alist)) (setq ess-local-process-name ,lpn) ,@body)))) (dolist (mode '(emacs-lisp-mode lisp-interaction-mode)) (font-lock-add-keywords mode '(("(\\(ess-with-current-buffer\\)\\s +\\(\\(\\w\\|\\s_\\)+\\)" (1 font-lock-keyword-face) (2 font-lock-variable-name-face))))) (defun ess-get-process (&optional name use-another) "Return the ESS process named by NAME. If USE-ANOTHER is non-nil, and the process NAME is not running (anymore), try to connect to another if there is one. By default (USE-ANOTHER is nil), the connection to another process happens interactively (when possible)." (setq name (or name ess-local-process-name)) (if (null name) ; should almost never happen at this point (error "No ESS process is associated with this buffer now")) (update-ess-process-name-list) (if (assoc name ess-process-name-list) (get-process name) ;; else : ;; was (error "Process %s is not running" name) (ess-write-to-dribble-buffer (format "ess-get-process: process '%s' not running" name)) (if (= 0 (length ess-process-name-list)) (save-current-buffer (ess-write-to-dribble-buffer (format " .. restart proc %s for language %s (buf %s)\n" name ess-language (current-buffer))) (message "trying to (re)start process %s for language %s ..." name ess-language) (ess-start-process-specific ess-language ess-dialect) ;; and return the process: "call me again" (ess-get-process name)) ;; else: there are other running processes (if use-another ; connect to another running process : the first one (let ((other-name (car (elt ess-process-name-list 0)))) ;; "FIXME": try to find the process name that matches *closest* (message "associating with *other* process '%s'" other-name) (ess-get-process other-name)) ;; else (ding) (if (y-or-n-p (format "Process %s is not running, but others are. Switch? " name)) (progn (ess-force-buffer-current (concat ess-dialect " process to use: ") 'force) (ess-get-process ess-current-process-name)) (error "Process %s is not running" name)))))) ;; (defun inferior-ess-wait-for-prompt () ;; "Wait until the ESS process is ready for input." ;; (let* ((cbuffer (current-buffer)) ;; (sprocess (ess-get-process ess-current-process-name)) ;; (sbuffer (process-buffer sprocess)) ;; (r nil) ;; (timeout 0)) ;; (set-buffer sbuffer) ;; (while (progn ;; (if (not (eq (process-status sprocess) 'run)) ;; (ess-error "ESS process has died unexpectedly.") ;; (if (> (setq timeout (1+ timeout)) ess-loop-timeout) ;; (ess-error "Timeout waiting for prompt. Check inferior-ess-prompt or ess-loop-timeout.")) ;; (accept-process-output) ;; (goto-char (point-max)) ;; (beginning-of-line); bol ==> no need for "^" in *-prompt! (MM?) ;; ;; above, except for Stata, which has "broken" i/o, ;; ;; sigh... (AJR) ;; (setq r (looking-at inferior-ess-prompt)) ;; (not (or r (looking-at ".*\\?\\s *")))))) ;; (goto-char (point-max)) ;; (set-buffer cbuffer) ;; (symbol-value r))) ;;--- Unfinished idea (ESS-help / R-help ) -- probably not worth it... ;;- (defun ess-set-inferior-program-name (filename) ;;- "Allows to set or change `inferior-ess-program', the program (file)name." ;;- (interactive "fR executable (script) file: ") ;;- ;; "f" : existing file {file name completion} ! ;;- (setq inferior-ess-program filename)) ;; the inferior-ess-program is initialized in the customize..alist, ;; e.g. from inferior-R-program-name ... --> should change rather these. ;; However these really depend on the current ess-language! ;; Plan: 1) must know and use ess-language ;; 2) change the appropriate inferior--program-name ;; (how?) in R/S : assign(paste("inferior-",ESSlang,"-p...."), filename)) ;;*;; Multiple process handling code (defun ess-make-buffer-current nil "Make the process associated with the current buffer the current ESS process. Returns the name of the process, or nil if the current buffer has none." (update-ess-process-name-list) ;; (if ess-local-process-name ;; (setq ess-current-process-name ess-local-process-name)) ess-local-process-name) (defun ess-get-process-variable (var) "Return the variable VAR (symbol) local to ESS process called NAME (string)." (buffer-local-value var (process-buffer (ess-get-process ess-local-process-name)))) (defun ess-set-process-variable (var val) "Set variable VAR (symbol) local to ESS process called NAME (string) to VAL." (with-current-buffer (process-buffer (ess-get-process ess-local-process-name)) (set var val))) ;; emacs 23 compatibility (unless (fboundp 'process-live-p) (defun process-live-p (process) "Returns non-nil if PROCESS is alive. A process is considered alive if its status is `run', `open', `listen', `connect' or `stop'." (memq (process-status process) '(run open listen connect stop)))) (defun ess-process-live-p () "Check if the local ess process is alive. Return nil if current buffer has no associated process, or process was killed." (and ess-local-process-name (let ((proc (get-process ess-local-process-name))) (and (processp proc) (process-live-p proc))))) (defun ess-process-get (propname) "Return the variable PROPNAME (symbol) from the plist of the current ESS process." (process-get (get-process ess-local-process-name) propname)) (defun ess-process-put (propname value) "Set the variable PROPNAME (symbol) to VALUE in the plist of the current ESS process." (process-put (get-process ess-local-process-name) propname value)) (defun ess-start-process-specific (language dialect) "Start an ESS process typically from a language-specific buffer, using LANGUAGE (and DIALECT)." (unless dialect (error "The value of `dialect' is nil")) (save-current-buffer (let ((dsymb (intern dialect))) (ess-write-to-dribble-buffer (format " ..start-process-specific: lang:dialect= %s:%s, current-buf=%s\n" language dialect (current-buffer))) (cond ;; ((string= dialect "R") (R)) ;; ((string= language "S") ; ;; (message "ESS process not running, trying to start R, since language = 'S") ;; (R)) ;; ((string= dialect STA-dialect-name) (stata)) ;;general case ((fboundp dsymb) (funcall dsymb)) (t ;; else: ess-dialect is not a function ;; Typically triggered from ;; ess-force-buffer-current("Process to load into: ") ;; \--> ess-request-a-process("Process to load into: " no-switch) (error "No ESS processes running; not yet implemented to start (%s,%s)" language dialect))) ;; save excursion is not working here !!! bad bad bad !! ))) (defun ess-request-a-process (message &optional noswitch ask-if-1) "Ask for a process, and make it the current ESS process. If there is exactly one process, only ask if ASK-IF-1 is non-nil. Also switches to the process buffer unless NOSWITCH is non-nil. Interactively, NOSWITCH can be set by giving a prefix argument. Returns the name of the selected process." (interactive (list "Switch to which ESS process? " current-prefix-arg)) ; prefix sets 'noswitch (ess-write-to-dribble-buffer "ess-request-a-process: {beginning}\n") (update-ess-process-name-list) (setq ess-dialect (or ess-dialect (ess-completing-read "Set `ess-dialect'" (delete-dups (list "R" "S+" S+-dialect-name "stata" STA-dialect-name "julia" "SAS" "XLS" "ViSta"))))) (let* ((pname-list (delq nil ;; keep only those mathing dialect (append (mapcar (lambda (lproc) (and (equal ess-dialect (buffer-local-value 'ess-dialect (process-buffer (get-process (car lproc))))) (not (equal ess-local-process-name (car lproc))) (car lproc))) ess-process-name-list) ;; append local only if running (when (assoc ess-local-process-name ess-process-name-list) (list ess-local-process-name))))) (num-processes (length pname-list)) (inferior-ess-same-window nil) ;; this should produce the inferior process in other window (auto-started?)) (if (or (= 0 num-processes) (and (= 1 num-processes) (not (equal ess-dialect ;; don't auto connect if from different dialect (buffer-local-value 'ess-dialect (process-buffer (get-process (car pname-list)))))))) ;; try to start "the appropriate" process (progn (ess-write-to-dribble-buffer (concat " ... request-a-process:\n " (format "major mode %s; current buff: %s; ess-language: %s, ess-dialect: %s\n" major-mode (current-buffer) ess-language ess-dialect))) (ess-start-process-specific ess-language ess-dialect) (ess-write-to-dribble-buffer (format " ... request-a-process: buf=%s\n" (current-buffer))) (setq num-processes 1 pname-list (car ess-process-name-list) auto-started? t))) ;; now num-processes >= 1 : (let* ((proc-buffers (mapcar (lambda (lproc) (buffer-name (process-buffer (get-process lproc)))) pname-list)) (proc (if (or auto-started? (and (not ask-if-1) (= 1 num-processes))) (progn (message "using process '%s'" (car proc-buffers)) (car pname-list)) ;; else (unless (and ess-current-process-name (get-process ess-current-process-name)) (setq ess-current-process-name nil)) (when message (setq message (replace-regexp-in-string ": +\\'" "" message))) ;; <- why is this here?? ;; ask for buffer name not the *real* process name: (let ((buf (ess-completing-read message (append proc-buffers (list "*new*")) nil t nil nil))) (if (equal buf "*new*") (progn (ess-start-process-specific ess-language ess-dialect) ;; switches to proc-buff (caar ess-process-name-list)) (process-name (get-buffer-process buf)) )) ))) (if noswitch (pop-to-buffer (current-buffer)) ;; VS: this is weired, but is necessary (pop-to-buffer (buffer-name (process-buffer (get-process proc))) t)) proc))) (defun ess-force-buffer-current (&optional prompt force no-autostart ask-if-1) "Make sure the current buffer is attached to an ESS process. If not, or FORCE (prefix argument) is non-nil, prompt for a process name with PROMPT. If NO-AUTOSTART is nil starts the new process if process associated with current buffer has died. `ess-local-process-name' is set to the name of the process selected. `ess-dialect' is set to the dialect associated with the process selected. ASK-IF-1 asks user for the process, even if there is only one process running." (interactive (list (concat ess-dialect " process to use: ") current-prefix-arg nil)) ;; fixme: why the above interactive is not working in emacs 24? (setq prompt (or prompt "Process to use: ")) (let ((proc-name (ess-make-buffer-current))) (if (and (not force) proc-name (get-process proc-name)) nil ; do nothing ;; Make sure the source buffer is attached to a process (if (and ess-local-process-name (not force) no-autostart) (error "Process %s has died" ess-local-process-name) ;; ess-local-process-name is nil -- which process to attach to (let ((proc (ess-request-a-process prompt 'no-switch ask-if-1)) temp-ess-help-filetype dialect) (with-current-buffer (process-buffer (get-process proc)) (setq temp-ess-help-filetype inferior-ess-help-filetype)) (setq ess-local-process-name proc) (setq inferior-ess-help-filetype temp-ess-help-filetype)))))) (defun ess-switch-process () "Force a switch to a new underlying process." (interactive) (ess-force-buffer-current "Process to use: " 'force nil 'ask-if-1)) (defun ess-get-next-available-process (&optional dialect ignore-busy) "Return first available (aka not busy) process of dialect DIALECT. DIALECT defaults to the local value of ess-dialect. Return nil if no such process has been found." (setq dialect (or dialect ess-dialect)) (when dialect (let (proc) (catch 'found (dolist (p (cons ess-local-process-name (mapcar 'car ess-process-name-list))) (when p (setq proc (get-process p)) (when (and proc (process-live-p proc) (equal dialect (buffer-local-value 'ess-dialect (process-buffer proc))) (or ignore-busy (not (process-get proc 'busy)))) (throw 'found proc)))))))) ;;*;;; Commands for switching to the process buffer (defun ess-switch-to-ESS (eob-p) "Switch to the current inferior ESS process buffer. With (prefix) EOB-P non-nil, positions cursor at end of buffer. This function should follow the description in `ess-show-buffer' for showing the iESS buffer, except that the iESS buffer is also made current." (interactive "P") (ess-force-buffer-current) (if (and ess-current-process-name (get-process ess-current-process-name)) (progn ;; Display the buffer, but don't select it yet. (ess-show-buffer (buffer-name (process-buffer (get-process ess-current-process-name))) t) (if eob-p (goto-char (point-max)))) (message "No inferior ESS process") (ding))) (defun ess-switch-to-ESS-deprecated (eob-p) (interactive "P") (ess-switch-to-ESS eob-p) (message "C-c C-y is deprecated, use C-c C-z instead (ess-switch-to-inferior-or-script-buffer)")) (defun ess-switch-to-end-of-ESS () "Switch to the end of the inferior ESS process buffer." (interactive) (ess-switch-to-ESS t)) (defun ess-switch-to-inferior-or-script-buffer (toggle-eob) "If in script, switch to the iESS. If in iESS switch to most recent script buffer. This is a single-key command. Assuming that it is bound to C-c C-z, you can navigate back and forth between iESS and script buffer with C-c C-z C-z C-z ... If variable `ess-switch-to-end-of-proc-buffer' is t (the default) this function switches to the end of process buffer. If TOGGLE-EOB is given, the value of `ess-switch-to-end-of-proc-buffer' is toggled. " (interactive "P") (let ((map (make-sparse-keymap)) (EOB (if toggle-eob (not ess-switch-to-end-of-proc-buffer) ess-switch-to-end-of-proc-buffer))) (define-key map (vector last-command-event) (lambda (ev eob) (interactive) (if (not (eq major-mode 'inferior-ess-mode)) (ess-switch-to-ESS eob) (let ((dialect ess-dialect) (loc-proc-name ess-local-process-name) (blist (cdr (buffer-list)))) (while (and blist (with-current-buffer (car blist) (not (or (and (memq major-mode '(ess-mode ess-julia-mode)) (equal dialect ess-dialect) (null ess-local-process-name)) (and (memq major-mode '(ess-mode ess-julia-mode)) (equal loc-proc-name ess-local-process-name)) )))) (pop blist)) (if blist (ess-show-buffer (car blist) t) (message "Found no buffers for ess-dialect %s associated with process %s" dialect loc-proc-name)))))) (ess--execute-electric-command map nil nil nil EOB))) (defun ess-get-process-buffer (&optional name) "Return the buffer associated with the ESS process named by NAME." (process-buffer (ess-get-process (or name ess-local-process-name)))) (defun update-ess-process-name-list () "Remove names with no process." (let (defunct) (dolist (conselt ess-process-name-list) (let ((proc (get-process (car conselt)))) (unless (and proc (eq (process-status proc) 'run)) (push conselt defunct)))) (dolist (pointer defunct) (setq ess-process-name-list (delq pointer ess-process-name-list)))) (if (eq (length ess-process-name-list) 0) (setq ess-current-process-name nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ess-show-buffer ;; Something like this almost works, but problems with XEmacs and Emacs ;; differing implementations of the args to display-buffer make this ;; too tough to pursue. The longer version below works. ;; (defun ess-show-buffer (buf) ;; "Display the buffer BUF, a string, but do not select it. ;; Returns the window corresponding to the buffer." ;; ;; On XEmacs, I get an error if third arg to display-buffer is t and ;; ;; the BUF is in another frame. Emacs does not have this problem. ;; (if (featurep 'xemacs) ;; (display-buffer buf nil (get-frame-for-buffer buf)) ;; (display-buffer buf nil t))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defcustom ess-show-buffer-action '((display-buffer-pop-up-window display-buffer-use-some-window)) "Actions for `ess-show-buffer', passed to `display-buffer'." :group 'ess :type 'list) (defun ess-show-buffer (buf &optional visit) "Ensure the ESS buffer BUF is visible. The buffer, specified as a string, is typically an iESS (e.g. *R*) buffer. This handles several cases: 1. If BUF is visible in the current frame, nothing is done. 2. If BUF is visible in another frame, then we ensure that frame is visible (it may have been iconified). 3. If buffer is not visible in any frame, simply show it in another window in the current frame. If VISIT is non-nil, as well as making BUF visible, we also select it as the current buffer." (let ((frame)) (if (ess-buffer-visible-this-frame buf) ;;1. Nothing to do, BUF visible in this frame; just return window ;; where this buffer is. t ;; 2. Maybe BUF visible in another frame. (setq frame (ess-buffer-visible-other-frame buf)) (if frame ;; BUF is visible in frame, so just check frame is raised. (if (not (eq (frame-visible-p frame) t)) ;; frame is not yet visible, so raise it. (raise-frame frame)) ;; 3. else BUF not visible in any frame, so show it (but do ;; not select it) in another window in current frame. (display-buffer buf ess-show-buffer-action))) ;; At this stage, the buffer should now be visible on screen, ;; although it won't have been made current. (when visit ;; Need to select the buffer. ;; ;; First of all, check case 2 if buffer is in another frame ;; but that frame may not be selected. (if frame (ess-select-frame-set-input-focus frame)) (select-window (get-buffer-window buf 0))))) (defvar ess-bufs-in-frame nil) ;silence the compiler. ;; The next few functions are copied from my (SJE) iswitchb library. (defun ess-get-bufname (win) "Used by `ess-get-buffers-in-frames' to walk through all windows." (let ((buf (buffer-name (window-buffer win)))) (if (not (member buf ess-bufs-in-frame)) ;; Only add buf if it is not already in list. ;; This prevents same buf in two different windows being ;; put into the list twice. (setq ess-bufs-in-frame (cons buf ess-bufs-in-frame))))) (defun ess-get-buffers-in-frames (&optional current) "Return the list of buffers that are visible in the current frame. If optional argument CURRENT is given, restrict searching to the current frame, rather than all frames." (let ((ess-bufs-in-frame nil)) (walk-windows 'ess-get-bufname nil (if current nil 0)) ess-bufs-in-frame)) (defun ess-buffer-visible-this-frame (buf) "Return t if BUF is visible in current frame." (member buf (ess-get-buffers-in-frames t))) (defun ess-buffer-visible-other-frame (buf) "Return t if BUF is visible in another frame. Assumes that buffer has not already been in found in current frame." (if (member (buffer-name (get-buffer buf)) (ess-get-buffers-in-frames)) (window-frame (get-buffer-window buf 0)) nil)) ; Functions for evaluating code (defun ess-ddeclient-p () "Returns t iff `ess-local-process-name' is associated with an inferior-ess-ddeclient, and nil if the ess-process is running as an ordinary inferior process. Alway nil on Unix machines." (interactive) (if ess-microsoft-p (progn ;; Debug: C-c C-l fails (to start R or give good message) in Windows (ess-write-to-dribble-buffer (format "*ddeclient-p: ess-loc-proc-name is '%s'" ess-local-process-name)) (ess-force-buffer-current "Process to load into: ") (not (equal (ess-get-process-variable 'inferior-ess-ddeclient) (default-value 'inferior-ess-ddeclient)))))) ;; (defun ess-prompt-wait (proc prompt-reg &optional sleep ) ;; "Wait for a prompt to appear at the end of current buffer. ;; PROC is the ESS process. PROMPT-REG is a regexp of the process ;; prompt to look for. Does not change point. Not to be used in ;; inferior-process buffer. Use `inferior-ess-wait-for-prompt' ;; instead. " ;; (if sleep (sleep-for sleep)); we sleep here, *and* wait below ;; (save-excursion ;; (while (or (accept-process-output proc 0 100) ;; (progn ;; if no more output, check for prompt ;; (goto-char (marker-position (process-mark proc))) ;; (beginning-of-line) ;; (not (re-search-forward prompt-reg nil t)) ;; ))))) (defun ess-wait-for-process (&optional proc sec-prompt wait force-redisplay) "Wait for 'busy property of the process to become nil. If SEC-PROMPT is non-nil return if secondary prompt is detected regardless of whether primary prompt was detected or not. If WAIT is non-nil wait for WAIT seconds for process output before the prompt check, default 0.001s. When FORCE-REDISPLAY is non-nil force redisplay. You better use WAIT >= 0.1 if you need FORCE-REDISPLAY to avoid excesive redisplay." (setq proc (or proc (get-process ess-local-process-name))) (unless (eq (process-status proc) 'run) (ess-error "ESS process has died unexpectedly.")) (setq wait (or wait 0.002)) ;;xemacs is stuck if it's 0 here (let ((start-time (float-time))) (save-excursion (while (or (accept-process-output proc wait) (if (and sec-prompt (process-get proc 'sec-prompt)) nil (if force-redisplay (redisplay 'force)) (process-get proc 'busy))) (if (> (- (float-time) start-time) .5) (setq wait .5)))))) ;; (defun inferior-ess-ordinary-filter (proc string) ;; (let ((old-buffer (current-buffer))) ;; (unwind-protect ;; (let (moving) ;; (set-buffer (process-buffer proc)) ;; (setq moving (= (point) (process-mark proc))) ;; (save-excursion ;; ;; Insert the text, moving the process-marker. ;; (goto-char (process-mark proc)) ;; (insert string) ;; (set-marker (process-mark proc) (point))) ;; (if moving (goto-char (process-mark proc)))) ;; (set-buffer old-buffer)))) (defun inferior-ess-ordinary-filter (proc string) (inferior-ess-set-status proc string t) (ess--if-verbose-write-process-state proc string "ordinary-filter") (inferior-ess-run-callback proc string) (with-current-buffer (process-buffer proc) ;; (princ (format "%s:" string)) (insert string))) (defvar ess-presend-filter-functions nil "List of functions to call before sending the input string to the process. Each function gets one argument, a string containing the text to be send to the subprocess. It should return the string sent, perhaps the same string that was received, or perhaps a modified or transformed string. The functions on the list are called sequentially, and each one is given the string returned by the previous one. The string returned by the last function is the text that is actually sent to the process. You can use `add-hook' to add functions to this list either globally or locally. The hook is executed in current buffer. Before execution, the local value of this hook in the process buffer is appended to the hook from the current buffer. ") (defun ess-send-region (process start end &optional visibly message) "Low level ESS version of `process-send-region'. If VISIBLY call `ess-eval-linewise', else call `ess-send-string'. If MESSAGE is supplied, display it at the end. Run `comint-input-filter-functions' and curent buffer's and associated with PROCESS `ess-presend-filter-functions' hooks. " (if (ess-ddeclient-p) (ess-eval-region-ddeclient start end 'even-empty) ;; else: "normal", non-DDE behavior: (ess-send-string process (buffer-substring start end) visibly message))) (defvar ess-send-string-function nil) (make-variable-buffer-local 'ess-send-string-function) (defun ess-send-string (process string &optional visibly message) "ESS wrapper for `process-send-string'. STRING need not end with \\n. Run `comint-input-filter-functions' and current buffer's and PROCESS' `ess-presend-filter-functions' hooks on the input STRING. VISIBLY can be nil, t, 'nowait or a string. If string the behavior is as with 'nowait with the differences that inserted string is VISIBLY instead of STRING (evaluated command is still STRING). In all other cases the behavior is as described in `ess-eval-visibly'. " (setq string (ess--run-presend-hooks process string)) (inferior-ess--interrupt-subjob-maybe process) (inferior-ess-mark-as-busy process) (if (fboundp (buffer-local-value 'ess-send-string-function (current-buffer))) ;; overloading (funcall ess-send-string-function process string visibly) (when (and (eq visibly t) (null inferior-ess-secondary-prompt)) ; cannot evaluate visibly (setq visibly 'nowait)) (cond ((eq visibly t) ;; wait after each line (let ((ess--inhibit-presend-hooks t)) (ess-eval-linewise string))) ((or (stringp visibly) (eq visibly 'nowait)) ;; insert command and eval invisibly . (with-current-buffer (process-buffer process) (save-excursion (goto-char (process-mark process)) (insert-before-markers (propertize (format "%s\n" (replace-regexp-in-string "\n[ \t]" "\n+ " (if (stringp visibly) visibly string))) 'font-lock-face 'comint-highlight-input))) (process-send-string process (ess--concat-new-line-maybe string)))) (t (process-send-string process (ess--concat-new-line-maybe string))))) (if message (message message))) (defvar ess--inhibit-presend-hooks nil "If non-nil don't run presend hooks.") (defun ess--run-presend-hooks (process string) ;; run ess-presend-filter-functions and comint-input-filter-functions (if ess--inhibit-presend-hooks string ;;return modified string (let* ((pbuf (process-buffer process)) ;; also run proc buffer local hooks (functions (unless (eq pbuf (current-buffer)) (buffer-local-value 'ess-presend-filter-functions pbuf)))) (setq functions (append (delq t (copy-sequence functions)) ;; even in let, delq distructs ess-presend-filter-functions)) (while (and functions string) ;; cannot use run-hook-with-args here because string must be passed from one ;; function to another (if (eq (car functions) t) (let ((functions (default-value 'ess-presend-filter-functions))) (while (and functions string) (setq string (funcall (car functions) string)) (setq functions (cdr functions)))) (setq string (funcall (car functions) string))) (setq functions (cdr functions))) (with-current-buffer pbuf (run-hook-with-args 'comint-input-filter-functions string)) string))) (defun ess--concat-new-line-maybe (string) "Append \\n at the end of STRING if missing." (if (string-match "\n\\'" string (max (- (length string) 2) 0)) string (concat string "\n"))) (defvar ess--dbg-del-empty-p t "Internal variable to control removal of empty lines during the debugging. Let-bind it to nil before calling `ess-send-string' or `ess-send-region' if no removal is necessary.") (defun inferior-ess--interrupt-subjob-maybe (proc) "Internal. Interrupt the process if interruptable? process variable is non-nil. Hide all the junk output in temporary buffer." (when (process-get proc 'interruptable?) (let ((cb (cadr (process-get proc 'callbacks))) (buf (get-buffer-create " *ess-temp-buff*")) (old-filter (process-filter proc)) (old-buff (process-buffer proc))) (unwind-protect (progn (ess-if-verbose-write "interrupting subjob ... start") (process-put proc 'interruptable? nil) (process-put proc 'callbacks nil) (process-put proc 'running-async? nil) ;; this is to avoid putting junk in user's buffer on process ;; interruption (set-process-buffer proc buf) (set-process-filter proc 'inferior-ess-ordinary-filter) (interrupt-process proc) (when cb (ess-if-verbose-write "executing interruption callback ... ") (funcall cb proc)) ;; should be very fast as it inputs only the prompt (ess-wait-for-process proc) (ess-if-verbose-write "interrupting subjob ... finished") ) (set-process-buffer proc old-buff) (set-process-filter proc old-filter))))) (defun ess-async-command-delayed (com &optional buf proc callback delay) "Delayed asynchronous ess-command. COM and BUF are as in `ess-command'. DELAY is a number of idle seconds to wait before starting the execution of the COM. On interruption (by user's evaluation) ESS tries to rerun the job after next DELAY seconds, and the whole process repeats itself until the command manages to run completely. DELAY defaults to `ess-idle-timer-interval' + 3 seconds You should always provide PROC for delayed evaluation, as the current process might change, leading to unpredictable consequences. This function is a wrapper of `ess-async-command' with an explicit interrupt-callback." (unless proc (error "You must provide PROC argument to ess-async-command-delayed")) (let* ((timer (make-symbol "timer")) (delay (or delay (+ ess-idle-timer-interval 3))) (int-cb `(lambda (proc) (ess-async-command-delayed ,com ,buf proc ,callback ,delay))) (com-fun `(lambda () (when (eq (process-status ,proc) 'run) ; do nothing if not running (if (or (process-get ,proc 'busy) ; if busy, try later (process-get ,proc 'running-async?)) ;; idle timer doesn't work here (run-with-timer ,delay nil 'ess-async-command-delayed ,com ,buf ,proc ,callback ,delay)) (ess-async-command ,com ,buf ,proc ,callback ',int-cb))))) (run-with-idle-timer delay nil com-fun))) ;; ;;; VS[03-09-2012]: Test Cases: ;; (ess-command "a<-0\n" nil nil nil nil (get-process "R")) ;; (ess-async-command-delayed "Sys.sleep(5);a<-a+1;cat(1:10)\n" nil ;; (get-process "R") (lambda (proc) (message "done"))) ;; (ess-async-command-delayed "Sys.sleep(5)\n" nil (get-process "R") ;; (lambda (proc) (message "done"))) ;; (process-get (get-process "R") 'running-async?) ;; (ess-async-command "{cat(1:5);Sys.sleep(5);cat(2:6)}\n" nil (get-process "R") ;; (lambda (proc) (message "done"))) ;; (ess-async-command "{cat(1:5);Sys.sleep(5);cat(2:6)}\n" nil (get-process "R") ;; (lambda (proc) (message "done")) ;; t) ;; (ess-async-command "{cat(1:5);Sys.sleep(5);cat(2:6)}\n" nil (get-process "R") ;; (lambda (proc) (message "done")) ;; (lambda (proc2) (message "name: %s" (process-name proc2)))) (defun ess-async-command (com &optional buf proc callback interrupt-callback ) "Asynchronous version of ess-command. COM, BUF, WAIT and PROC are as in `ess-command'. CALLBACK is a function of two arguments (PROC STRING) to run after the successful execution. When INTERRUPT-CALLBACK is non-nil, user evaluation can interrupt the job. INTERRUPT-CALLBACK should be either t or a function of one argument (PROC) to be called on interruption. NOTE: Currently this function should be used only for background jobs like caching. ESS tries to suppress any output from the asynchronous command, but long output of COM will most likely end up in user's main buffer. " (let ((proc (or proc (get-process ess-local-process-name)))) (if (not (and proc (eq (process-status proc) 'run))) (error "Process %s is dead" ess-local-process-name) (if (or (process-get proc 'busy) (process-get proc 'running-async?)) (error "Process %s is busy or already running an async command." ess-local-process-name) (when (eq interrupt-callback t) (setq interrupt-callback (lambda (proc)))) (process-put proc 'callbacks (list (cons callback 'suppress-output) interrupt-callback)) (process-put proc 'interruptable? (and interrupt-callback t)) (process-put proc 'running-async? t) (ess-command com buf nil 'no-prompt-check .01 proc))))) (defun ess-command (com &optional buf sleep no-prompt-check wait proc force-redisplay) "Send the ESS process command COM and delete the output from the ESS process buffer. If an optional second argument BUF exists save the output in that buffer. BUF is erased before use. COM should have a terminating newline. Guarantees that the value of .Last.value will be preserved. When optional third arg SLEEP is non-nil, `(sleep-for (* a SLEEP))' will be used in a few places where `a' is proportional to `ess-cmd-delay'. WAIT and FORCE-REDISPLAY are as in `ess-wait-for-process' and are passed to `ess-wait-for-process'. PROC should be a process, if nil the process name is taken from `ess-local-process-name'. This command doesn't set 'last-eval process variable. Note: for critical, or error prone code you should consider wrapping the code into: local({ olderr <- options(error=NULL) on.exit(options(olderr)) ... }) " ;; Use this function when you need to evaluate some S code, and the ;; result is needed immediately. Waits until the output is ready ;; the ddeclient-p checks needs to use the local-process-name (unless buf (setq buf (get-buffer-create " *ess-command-output*"))) (if (ess-ddeclient-p) (ess-command-ddeclient com buf sleep) ;; else: "normal", non-DDE behavior: (let* ((sprocess (or proc (ess-get-process ess-local-process-name))) sbuffer primary-prompt end-of-output oldpb oldpf oldpm ) (unless sprocess ;; should hardly happen, since (ess-get-process *) already checked: (error "Process %s is not running!" ess-current-process-name)) (setq sbuffer (process-buffer sprocess)) (with-current-buffer sbuffer (unless ess-local-process-name (setq ess-local-process-name (process-name sprocess))) ; let it be here (calling functions need not set it explicitly) (setq primary-prompt inferior-ess-primary-prompt) (ess-if-verbose-write (format "n(ess-command %s ..)" com)) (unless no-prompt-check (when (process-get sprocess 'busy) ;;(looking-at inferior-ess-primary-prompt) (ess-error "ESS process not ready. Finish your command before trying again."))) (setq oldpf (process-filter sprocess)) (setq oldpb (process-buffer sprocess)) (setq oldpm (marker-position (process-mark sprocess))) ;; need the buffer-local values in result buffer "buf": (unwind-protect (progn (set-process-buffer sprocess buf) (set-process-filter sprocess 'inferior-ess-ordinary-filter) ;; Output is now going to BUF: (with-current-buffer buf (setq inferior-ess-primary-prompt primary-prompt) ;; set local value (setq buffer-read-only nil) (erase-buffer) (set-marker (process-mark sprocess) (point-min)) (inferior-ess-mark-as-busy sprocess) (process-send-string sprocess com) ;; need time for ess-create-object-name-db on PC (if no-prompt-check (sleep-for 0.020); 0.1 is noticeable! ;; else: default (ess-wait-for-process sprocess nil wait force-redisplay) (goto-char (point-max)) ;; remove prompt ;; if output is cat(..)ed this deletes the output ... (delete-region (point-at-bol) (point-max))) (ess-if-verbose-write " .. ok{ess-command}") )) (ess-if-verbose-write " .. exiting{ess-command}\n") ;; Restore old values for process filter (set-process-buffer sprocess oldpb) (set-process-filter sprocess oldpf) (set-marker (process-mark sprocess) oldpm)))) buf)) (defun ess-boolean-command (com &optional buf wait) "Like `ess-command' but expects COM to print TRUE or FALSE. If TRUE (or true) is found return non-nil otherwise nil. Example: (ess-boolean-command \"2>1\n\")" (with-current-buffer (ess-command com buf nil nil wait) (goto-char (point-min)) (let ((case-fold-search t)) (re-search-forward "true" nil t)))) (defun ess-replace-in-string (str regexp newtext &optional literal) "Replace all matches in STR for REGEXP with NEWTEXT string. Optional LITERAL non-nil means do a literal replacement. Otherwise treat \\ in NEWTEXT string as special: \\& means substitute original matched text, \\N means substitute match for \(...\) number N, \\\\ means insert one \\." (if (not (stringp str)) (error "(replace-in-string): First argument must be a string: %s" str)) (if (stringp newtext) nil (error "(replace-in-string): 3rd arg must be a string: %s" newtext)) (let ((rtn-str "") (start 0) (special) match prev-start) (while (setq match (string-match regexp str start)) (setq prev-start start start (match-end 0) rtn-str (concat rtn-str (substring str prev-start match) (cond (literal newtext) (t (mapconcat (function (lambda (c) (if special (progn (setq special nil) (cond ((eq c ?\\) "\\") ((eq c ?&) (substring str (match-beginning 0) (match-end 0))) ((and (>= c ?0) (<= c ?9)) (if (> c (+ ?0 (length (match-data)))) ;; Invalid match num (error "(replace-in-string) Invalid match num: %c" c) (setq c (- c ?0)) (substring str (match-beginning c) (match-end c)))) (t (char-to-string c)))) (if (eq c ?\\) (progn (setq special t) nil) (char-to-string c))))) newtext "")))))) (concat rtn-str (substring str start)))) ;;*;; Evaluating lines, paragraphs, regions, and buffers. ;;--- The two basic building blocks [called by all other ess-eval..] are ;; (ess-eval-linewise ....) ;; and ;; (ess-eval-region ....) (defun ess-eval-linewise (text &optional invisibly eob even-empty wait-last-prompt sleep-sec wait-sec) ;; RDB 28/8/92 added optional arg eob ;; MM 2006-08-23: added 'timeout-ms' -- but the effect seems "nil" ;; VS 2012-01-18 it was actually nil, replaced with wait-sec - 0.001 default ;; MM 2007-01-05: added 'sleep-sec' VS:? this one seems redundant to wait-last-prompt "Evaluate TEXT in the ESS process buffer as if typed in w/o tabs. Waits for prompt after each line of input, so won't break on large texts. If optional second arg INVISIBLY is non-nil, don't echo commands. If it is a string, just include that string. If optional third arg EOB is non-nil go to end of ESS process buffer after evaluation. If optional 4th arg EVEN-EMPTY is non-nil, also send empty text (e.g. an empty line). If 5th arg WAIT-LAST-PROMPT is non-nil, also wait for the prompt after the last line; if 6th arg SLEEP-SEC is a number, ESS will call '(\\[sleep-for] SLEEP-SEC) at the end of this function. If the 7th arg WAIT-SEC is set, it will be used instead of the default .001s and be passed to \\[ess-wait-for-process]. Run `comint-input-filter-functions' and `ess-presend-filter-functions' of the associated PROCESS on the TEXT." (if (ess-ddeclient-p) (ess-eval-linewise-ddeclient text invisibly eob even-empty (if wait-last-prompt ess-eval-ddeclient-sleep)) ;; else: "normal", non-DDE behavior: (unless (numberp wait-sec) (setq wait-sec 0.001)) ;;don't make it lower (0.); xemacs is stuck (ess-force-buffer-current "Process to use: ") ;; Use this to evaluate some code, but don't wait for output. (let* ((deactivate-mark); keep local {do *not* deactivate wrongly} (cbuffer (current-buffer)) (sprocess (ess-get-process ess-current-process-name)) (sbuffer (process-buffer sprocess)) (win (get-buffer-window sbuffer t)) ;; (text (ess-replace-in-string text "\t" " ")) com pos txt-gt-0) (setq text (ess--concat-new-line-maybe (ess--run-presend-hooks sprocess text))) (with-current-buffer sbuffer ;; (when (and win ;; (null eob) ;; (<= (process-mark sprocess) (point))) ;; (setq eob t)) ;; (setq wait-last-prompt t) ;; the following is required to make sure things work! (when (string= ess-language "STA") (if ess-sta-delimiter-friendly;; RAS: mindless replacement of semi-colons (setq text (ess-replace-in-string text ";" "\n"))) (setq invisibly t)) (setq text (propertize text 'field 'input 'front-sticky t)) (goto-char (marker-position (process-mark sprocess))) (if (stringp invisibly) (insert-before-markers (concat "*** " invisibly " ***\n"))) ;; dbg: ;; dbg (ess-write-to-dribble-buffer ;; dbg (format "(eval-visibly 2): text[%d]= '%s'\n" (length text) text)) (while (or (setq txt-gt-0 (> (length text) 0)) even-empty) (setq even-empty nil) (if txt-gt-0 (progn (setq pos (string-match "\n\\|$" text)) (setq com (concat (substring text 0 pos) "\n")) (setq text (substring text (min (length text) (1+ pos))))) ;; else 0-length text (setq com "\n")) (goto-char (marker-position (process-mark sprocess))) (if win (set-window-point win (process-mark sprocess))) (when (not invisibly) (insert (propertize com 'font-lock-face 'comint-highlight-input)) ;; for consistency with comint :( (set-marker (process-mark sprocess) (point))) (inferior-ess-mark-as-busy sprocess) (process-send-string sprocess com) (when (or wait-last-prompt (> (length text) 0)) (ess-wait-for-process sprocess t wait-sec))) (if eob (ess-show-buffer (buffer-name sbuffer) nil)) (goto-char (marker-position (process-mark sprocess))) (when win (with-selected-window win (goto-char (point)) ;; this is crucial to avoid reseting window-point (recenter (- -1 scroll-margin))) ))) (if (numberp sleep-sec) (sleep-for sleep-sec)))); in addition to timeout-ms ;; VS[06-01-2013]: this how far I got in investingating the emacs reseting of ;; window-point. It really happens out of the blue :( ;; (defun test () ;; (let* ((cbuffer (get-buffer "*R*")) ;; (proc (get-buffer-process cbuffer)) ;; (win (get-buffer-window cbuffer t))) ;; (with-current-buffer cbuffer ;; (proc-send-test proc win "ls()\n") ;; (ess-wait-for-process proc t 0.005) ;; ;; (goto-char (marker-position (process-mark proc))) ;; ;; (set-window-point win (point)) ;; (proc-send-test proc win "NA\n") ;; ;; (when win ;; ;; (set-window-point win (point-max))) ;; ))) ;; (defun proc-send-test (proc win com) ;; (with-current-buffer (process-buffer proc) ;; (goto-char (marker-position (process-mark proc))) ;; (inferior-ess-mark-as-busy proc) ;; (insert com) ;; (set-marker (process-mark proc) (point)) ;; (set-window-point win (point)) ;; (process-send-string proc com) ;; )) ;;;*;;; Evaluate only (defvar ess-current-region-overlay (let ((overlay (make-overlay (point) (point)))) (overlay-put overlay 'face 'highlight) overlay) "The overlay for highlighting currently evaluated region or line.") (defun ess-blink-region (start end) (when ess-blink-region (move-overlay ess-current-region-overlay start end) (run-with-timer ess-blink-delay nil (lambda () (delete-overlay ess-current-region-overlay))))) (defun ess-eval-region (start end toggle &optional message inject) "Send the current region to the inferior ESS process. With prefix argument toggle the meaning of `ess-eval-visibly'; this does not apply when using the S-plus GUI, see `ess-eval-region-ddeclient'. If INJECT is non-nil the region will be pre-processed in a dialect specific way to include source references" (interactive "r\nP") ;;(untabify (point-min) (point-max)) ;;(untabify start end); do we really need to save-excursion? (ess-force-buffer-current "Process to use: ") (unless ess-local-customize-alist ;; external applications might call ess-eval-* functions; make it easier for them (ess-setq-vars-local (symbol-value (ess-get-process-variable 'ess-local-customize-alist)))) (message "Starting evaluation...") (setq message (or message "Eval region")) (save-excursion ;; don't send new lines (avoid screwing the debugger) (goto-char start) (skip-chars-forward "\n\t ") (setq start (point)) (unless mark-active (ess-blink-region start end)) ;; don't send new lines at the end (avoid screwing the debugger) (goto-char end) (skip-chars-backward "\n\t ") (setq end (point))) (let* ((proc (get-process ess-local-process-name)) (visibly (if toggle (not ess-eval-visibly) ess-eval-visibly)) (dev-p (or ess-developer (ess-get-process-variable 'ess-developer))) (tb-p (process-get proc 'tracebug))) (cond (dev-p (ess-developer-send-region proc start end visibly message tb-p)) (tb-p (ess-tracebug-send-region proc start end visibly message inject)) (t (ess-send-region proc start end visibly message)))) (if (and (fboundp 'deactivate-mark) ess-eval-deactivate-mark) (deactivate-mark)) ;; return value (list start end)) (defun ess-eval-buffer (vis) "Send the current buffer to the inferior ESS process. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-region (point-min) (point-max) vis "Eval buffer" 'buffer)) (defun ess-eval-buffer-from-beg-to-here (vis) (interactive "P") (ess-eval-region (point-min) (point) vis "Eval buffer from the beginning of the buffer until here, i.e. 'point'")) (defun ess-eval-buffer-from-here-to-end (vis) (interactive "P") (ess-eval-region (point) (point-max) vis "Eval buffer from here ('point') until the end of the buffer")) (defun ess-eval-function (vis &optional no-error) "Send the current function to the inferior ESS process. Arg has same meaning as for `ess-eval-region'. If NO-ERROR is non-nil and the function was successfully evaluated, return '(beg end) representing the beginning and end of the current function, otherwise (in case of an error) return nil." (interactive "P") (ess-force-buffer-current "Process to use: ") (save-excursion (ignore-errors ;; evaluation is forward oriented (forward-line -1) (ess-next-code-line 1)) (let ((beg-end (ess-end-of-function nil no-error))) (if beg-end (let* ((beg (nth 0 beg-end)) (end (nth 1 beg-end)) (proc (get-process ess-local-process-name)) (tb-p (process-get proc 'tracebug)) (dev-p (or ess-developer (ess-get-process-variable 'ess-developer))) (name (progn (goto-char beg) (forward-word) ;;func names starting with . are not recognized?? (ess-read-object-name-default))) (mess (format "Eval function %s" (propertize (or name "???") 'face 'font-lock-function-name-face))) (visibly (if vis (not ess-eval-visibly) ess-eval-visibly))) (ess-blink-region beg end) (cond (dev-p (ess-developer-send-function proc beg end name visibly mess tb-p)) (tb-p (ess-tracebug-send-function proc beg end visibly mess)) (t (ess-send-region proc beg end visibly mess))) beg-end) nil)))) ;; This is from Mary Lindstrom ;; 31 Aug 1995 14:11:43 To: S-mode@stat.math.ethz.ch (defun ess-eval-paragraph (vis) "Send the current paragraph to the inferior ESS process. Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." (interactive "P") (save-excursion (forward-paragraph) (let ((end (point))) (backward-paragraph) (ess-eval-region (point) end vis "Eval paragraph")))) ;; ;; Experimental - after suggestion from Jenny Brian for an 'eval-multiline' ;; ;; 'sentence' is too much : almost like 'paragraph' ;; ;; 'sexp' is close, but too little [when point is inside function call; ;; ;; it moves all the way to the end - which is fine] ;; (defun ess-eval-sexp (vis) ;; "Send the current sexp to the inferior ESS process. ;; Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." ;; (interactive "P") ;; (save-excursion ;; (forward-sexp) ;; (let ((end (point))) ;; (backward-sexp) ;; (ess-eval-region (point) end vis "Eval sexp")))) (defun ess-eval-function-or-paragraph (vis) "Send the current function if \\[point] is inside one, otherwise the current paragraph other to the inferior ESS process. Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." (interactive "P") (let ((beg-end (ess-eval-function vis 'no-error))) (if (null beg-end) ; not a function (ess-eval-paragraph vis)))) (defun ess-eval-function-or-paragraph-and-step (vis) "Send the current function if \\[point] is inside one, otherwise the current paragraph other to the inferior ESS process. Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." (interactive "P") (let ((beg-end (ignore-errors (ess-eval-function vis 'no-error)))) ;; ignore-errors is a hack, ess-eval-function gives stupid errors sometimes (if (null beg-end) ; not a function (ess-eval-paragraph-and-step vis) (goto-char (cadr beg-end)) (if ess-eval-empty (forward-line 1) (ess-next-code-line 1))))) (defun ess-eval-region-or-function-or-paragraph (vis) "Send the current region if mark is active, if not, send function if \\[point] is inside one, otherwise the current paragraph. Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." (interactive "P") (if (and transient-mark-mode mark-active ;; xemacs doesn't have use-region-p (> (region-end) (region-beginning))) (ess-eval-region (region-beginning) (region-end) vis) (ess-eval-function-or-paragraph vis))) (defun ess-eval-region-or-function-or-paragraph-and-step (vis) "Send the current region if mark is active, if not, send function if \\[point] is inside one, otherwise the current paragraph. After evaluation step to the next code line or to the end of region if region was active. Prefix arg VIS toggles visibility of ess-code as for `ess-eval-region'." (interactive "P") (if (and transient-mark-mode mark-active ;; xemacs doesn't have use-region-p (> (region-end) (region-beginning))) (let ((end (region-end))) (ess-eval-region (region-beginning) end vis) (goto-char end)) (ess-eval-function-or-paragraph-and-step vis))) (defun ess-eval-line (vis) "Send the current line to the inferior ESS process. Arg has same meaning as for `ess-eval-region'." (interactive "P") (save-excursion (end-of-line) (let ((end (point))) (beginning-of-line) (princ (concat "Loading line: " (ess-extract-word-name) " ...") t) (ess-eval-region (point) end vis "Eval line")))) (defun ess-next-code-line (&optional arg skip-to-eob) "Move ARG lines of code forward (backward if ARG is negative). Skips past all empty and comment lines. Default for ARG is 1. Don't skip the last empty and comment lines in the buffer unless SKIP-TO-EOB is non-nil. On success, return 0. Otherwise, go as far as possible and return -1." (interactive "p") (or arg (setq arg 1)) (beginning-of-line) (let ((pos (point)) (n 0) (inc (if (> arg 0) 1 -1))) (while (and (/= arg 0) (= n 0)) (setq n (forward-line inc)); n=0 is success (if (not (fboundp 'comment-beginning)) (while (and (= n 0) (looking-at "\\s-*\\($\\|\\s<\\)")) (setq n (forward-line inc))) (comment-beginning) (beginning-of-line) (forward-comment (* inc (buffer-size))) ;; as suggested in info file ) (if (or skip-to-eob (not (looking-at ess-no-skip-regexp))) ;; don't go to eob or whatever (setq arg (- arg inc)) (goto-char pos) (setq arg 0) (forward-line 1));; stop at next empty line (setq pos (point))) (goto-char pos) n)) (defun ess-eval-line-and-step (&optional simple-next even-empty invisibly) "Evaluate the current line visibly and step to the \"next\" line. If SIMPLE-NEXT is non-nil, possibly via prefix arg, first skip empty and commented lines. If 2nd arg EVEN-EMPTY [prefix as well], also send empty lines. When the variable `ess-eval-empty' is non-nil both SIMPLE-NEXT and EVEN-EMPTY are interpreted as true." ;; From an idea by Rod Ball (rod@marcam.dsir.govt.nz) (interactive "P\nP"); prefix sets BOTH ! (ess-force-buffer-current "Process to load into: ") (save-excursion (end-of-line) (let ((end (point))) (beginning-of-line) ;; go to end of process buffer so user can see result (ess-eval-linewise (buffer-substring (point) end) invisibly 'eob (or even-empty ess-eval-empty)))) (if (or simple-next ess-eval-empty even-empty) (forward-line 1) (ess-next-code-line 1))) (defun ess-eval-region-or-line-and-step (&optional vis) "Evaluate region if there is an active one, otherwise the current line. Prefix arg VIS toggles visibility of ess-code when evaluating the region (as for `ess-eval-region') and has no effect for evaluation of the line. " (interactive "P") (if (and transient-mark-mode mark-active ;; xemacs doesn't have use-region-p (> (region-end) (region-beginning))) (ess-eval-region (region-beginning) (region-end) vis) (ess-eval-line-and-step))) (defun ess-eval-line-and-step-invisibly () "Evaluate the current line invisibly and step to the next line. Evaluate all comments and empty lines." (interactive) (ess-eval-line-and-step t t t)) ;; goes to the real front, in case you do double function definition ;; 29-Jul-92 -FER ;; don't know why David changed it. ;; FER's versions don't work properly with nested functions. Replaced ;; mine. DMS 16 Nov 92 ;;;*;;; Evaluate and switch to S (defun ess-eval-region-and-go (start end vis) "Send the current region to the inferior S and switch to the process buffer. Arg has same meaning as for `ess-eval-region'." (interactive "r\nP") (ess-eval-region start end vis) (ess-switch-to-ESS t)) (defun ess-eval-buffer-and-go (vis) "Send the current buffer to the inferior S and switch to the process buffer. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-buffer vis) (ess-switch-to-ESS t)) (defun ess-eval-function-and-go (vis) "Send the current function to the inferior ESS process and switch to the process buffer. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-function vis) (ess-switch-to-ESS t)) (defun ess-eval-line-and-go (vis) "Send the current line to the inferior ESS process and switch to the process buffer. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-line vis) (ess-switch-to-ESS t)) (defun ess-eval-paragraph-and-go (vis) "Send the current paragraph to the inferior ESS process and switch to the process buffer. Arg has same meaning as for `ess-eval-region'." (interactive "P") (ess-eval-paragraph vis) (ess-switch-to-ESS t)) (defun ess-eval-paragraph-and-step (vis) "Send the current paragraph to the inferior ESS process and move forward to the first line after the paragraph. If not inside a paragraph, evaluate next one. Arg has same meaning as for `ess-eval-region'." (interactive "P") (let ((beg-end (ess-eval-paragraph vis))) (goto-char (cadr beg-end)) (if ess-eval-empty (forward-line 1) (ess-next-code-line 1)))) ;;; Related to the ess-eval-* commands, there are the ess-load ;;; commands. Need to add appropriate stuff... (defun ess-load-file (&optional filename) "Load a source file into an inferior ESS process." (interactive (list (or (and (memq major-mode '(ess-mode ess-julia-mode)) (buffer-file-name)) (expand-file-name (read-file-name "Load source file: " nil nil t))))) (ess-force-buffer-current "Process to load into: ") (if (or ess-developer (ess-get-process-variable 'ess-developer)) (ess-developer-source-current-file filename) (let ((filename (if (and (fboundp 'tramp-tramp-file-p) (tramp-tramp-file-p filename)) (tramp-file-name-localname (tramp-dissect-file-name filename)) filename))) (if ess-microsoft-p (setq filename (ess-replace-in-string filename "[\\]" "/"))) (if (fboundp (ess-process-get 'source-file-function)) (funcall (ess-process-get 'source-file-function) filename) (let ((source-buffer (get-file-buffer filename))) (if (ess-check-source filename) (error "Buffer %s has not been saved" (buffer-name source-buffer))) ;; else (if (ess-ddeclient-p) (ess-load-file-ddeclient filename) ;; else: "normal", non-DDE behavior: ;; Find the process to load into (if source-buffer (with-current-buffer source-buffer (ess-force-buffer-current "Process to load into: ") (ess-check-modifications))) (let ((errbuffer (ess-create-temp-buffer ess-error-buffer-name)) error-occurred nomessage) (ess-eval-linewise (format ess-load-command filename)) ))))))) ;; C-c C-l *used to* eval code: (defun ess-msg-and-comint-dynamic-list-input-ring () "Display a list of recent inputs entered into the current buffer." (interactive) (message "C-c C-l no longer loads a source file in [iESS], rather use C-c M-l instead") (comint-dynamic-list-input-ring)) ; Inferior S mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; In this section: ;;;; ;;;; * The major mode inferior-ess-mode ;;;; * Process handling code ;;;; * Completion code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;*;; Major mode definition (defvar inferior-ess-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map comint-mode-map) (define-key map "\C-y" 'ess-yank) ;; Use syntax valid *both* for GNU emacs and XEmacs : (define-key map "\r" 'inferior-ess-send-input) (define-key map "\C-a" 'comint-bol) ;; 2010-06-03 SJE ;; disabled this in favour of ess-dirs. Martin was not sure why this ;; key was defined anyway in this mode. ;;(define-key map "\M-\r" 'ess-transcript-send-command-and-move) (define-key map "\C-c\M-l" 'ess-load-file);; no longer overwrites C-c C-l; ;; but for now the user deserves a message: (define-key map "\C-c\C-l" 'ess-msg-and-comint-dynamic-list-input-ring) (define-key map "\C-c`" 'ess-show-traceback) (define-key map [(control ?c) ?~] 'ess-show-call-stack) (define-key map "\C-c\C-d" 'ess-dump-object-into-edit-buffer) (define-key map "\C-c\C-v" 'ess-display-help-on-object) (define-key map "\C-c\C-q" 'ess-quit) (define-key map "\C-c\C-s" 'ess-execute-search) (define-key map "\C-c\C-x" 'ess-execute-objects) (define-key map "\C-c\034" 'ess-abort) ; \C-c\C-backslash (define-key map "\C-c\C-z" 'ess-switch-to-inferior-or-script-buffer) ; mask comint map (define-key map "\C-d" 'delete-char) ; EOF no good in S (if (and (featurep 'emacs) (>= emacs-major-version 24)) (define-key map "\t" 'completion-at-point) (define-key map "\t" 'comint-dynamic-complete) (define-key map "\M-\t" 'comint-dynamic-complete)) (define-key map "\C-c\t" 'ess-complete-object-name-deprecated) (define-key map "\M-?" 'ess-list-object-completions) (define-key map "\C-c\C-k" 'ess-request-a-process) (define-key map "," 'ess-smart-comma) (define-key map "\C-c\C-d" 'ess-doc-map) (define-key map "\C-c\C-e" 'ess-extra-map) (define-key map "\C-c\C-t" 'ess-dev-map) map) "Keymap for `inferior-ess' mode.") (easy-menu-define inferior-ess-mode-menu inferior-ess-mode-map "Menu for use in Inferior S mode" '("iESS" ["What is this? (beta)" ess-mouse-me t] ["Quit" ess-quit t] ;; ["Send and move" ess-transcript-send-command-and-move t] ["Copy command" comint-copy-old-input t] ["Send command" inferior-ess-send-input t] ["Switch to Script Buffer" ess-switch-to-inferior-or-script-buffer t] ["Get help on S object" ess-display-help-on-object t] "------" ("Process" ["Process Echoes" (lambda () (interactive) (setq comint-process-echoes (not comint-process-echoes))) :active t :style toggle :selected comint-process-echoes] ("Eval visibly " :filter ess--generate-eval-visibly-submenu )) "------" ("Utils" ;; need a toggle switch for above, AJR. ["Attach directory" ess-execute-attach t] ["Display object list" ess-execute-objects t] ["Display search list" ess-execute-search t] ["Edit S Object" ess-dump-object-into-edit-buffer t] ["Enter S command" ess-execute t] ["Jump to Error" ess-parse-errors t] ["Load source file" ess-load-file t] ["Resynch S completions" ess-resynch t] ["Recreate R and S versions known to ESS" (ess-r-s-versions-creation+menu) t] ) "------" ("start-dev" :visible nil); <-- ?? ("end-dev" :visible nil) "------" ("Font Lock" :active inferior-ess-font-lock-keywords :filter ess--generate-font-lock-submenu) "------" ["Describe" describe-mode t] ["Send bug report" ess-submit-bug-report t] ["About" (ess-goto-info "Entering Commands") t] )) (defun inferior-ess-mode-xemacs-menu () "Hook to install `ess-mode' menu for XEmacs (w/ easymenu)." (if 'inferior-ess-mode (easy-menu-add inferior-ess-mode-menu) (easy-menu-remove inferior-ess-mode-menu))) (if (string-match "XEmacs" emacs-version) (add-hook 'inferior-ess-mode-hook 'inferior-ess-mode-xemacs-menu)) (defvar ess-mode-minibuffer-map (let ((map (make-sparse-keymap))) (set-keymap-parent map minibuffer-local-map) (define-key map "\t" 'ess-complete-object-name) (define-key map "\C-\M-i" 'ess-complete-object-name) ;; doesn't work:( (define-key map "\C-c\C-s" 'ess-execute-search) (define-key map "\C-c\C-x" 'ess-execute-objects) map) "Keymap used in `ess-execute'") (defun inferior-ess-mode () "Major mode for interacting with an inferior ESS process. Runs an S interactive job as a subprocess of Emacs, with I/O through an Emacs buffer. Variable `inferior-ess-program' controls which S is run. Commands are sent to the ESS process by typing them, and pressing \\[inferior-ess-send-input]. Pressing \\[complete-dynamic-complete] completes known object names or filenames, as appropriate. Other keybindings for this mode are: \\{inferior-ess-mode-map} When editing S objects, the use of \\[ess-load-file] is advocated. `ess-load-file' keeps source files (if `ess-keep-dump-files' is non-nil) in the directory specified by `ess-source-directory', with the filename chosen according to `ess-dump-filename-template'. When a file is loaded, `ess-mode' parses error messages and jumps to the appropriate file if errors occur. The ess-eval- commands do not do this. Customization: Entry to this mode runs the hooks on `comint-mode-hook' and `inferior-ess-mode-hook' (in that order). You can send text to the inferior ESS process from other buffers containing S source. The key bindings of these commands can be found by typing C-h m (help for mode) in the other buffers. `ess-eval-region' sends the current region to the ESS process. `ess-eval-buffer' sends the current buffer to the ESS process. `ess-eval-function' sends the current function to the ESS process. `ess-eval-line' sends the current line to the ESS process. `ess-beginning-of-function' and `ess-end-of-function' move the point to the beginning and end of the current S function. `ess-switch-to-ESS' switches the current buffer to the ESS process buffer. `ess-switch-to-end-of-ESS' switches the current buffer to the ESS process buffer and puts point at the end of it. `ess-eval-region-and-go', `ess-eval-buffer-and-go', `ess-eval-function-and-go', and `ess-eval-line-and-go' switch to the S process buffer after sending their text. `ess-dump-object-into-edit-buffer' moves an S object into a temporary file and buffer for editing `ess-load-file' sources a file of commands to the ESS process. Commands: Return after the end of the process' output sends the text from the end of process to point. Return before the end of the process' output copies the sexp ending at point to the end of the process' output, and sends it. Delete converts tabs to spaces as it moves back. C-M-q does Tab on each line starting within following expression. Paragraphs are separated only by blank lines. Crosshatches start comments. If you accidentally suspend your process, use \\[comint-continue-subjob] to continue it." (interactive) (comint-mode) (set (make-local-variable 'comint-input-sender) 'inferior-ess-input-sender) (set (make-local-variable 'process-connection-type) t) ;; initialize all custom vars: (ess-setq-vars-local ess-customize-alist) ; (current-buffer)) ;; If comint-process-echoes is t inferior-ess-input-sender ;; recopies the input, otherwise not. VS[03-09-2012]: should be in customize-alist (set (make-local-variable 'comint-process-echoes) (not (member ess-language '("SAS" "XLS" "OMG" "julia")))) ;; these don't echo (when (and (member ess-dialect '("R")) ;; S+ echoes!! (not (eq ess-eval-visibly t))) ;; when 'nowait or nil, don't wait for process (setq comint-process-echoes nil)) (when comint-use-prompt-regexp ;; why comint is not setting this? bug? (set (make-local-variable 'inhibit-field-text-motion) t)) (unless inferior-ess-prompt ;; build when unset (setq inferior-ess-prompt (concat "\\(" inferior-ess-primary-prompt (when inferior-ess-secondary-prompt "\\|") inferior-ess-secondary-prompt "\\)"))) (setq comint-prompt-regexp (concat "^" inferior-ess-prompt)) (setq comint-get-old-input 'inferior-ess-get-old-input) ;; todo: this is R specific (add-hook 'comint-input-filter-functions 'ess-search-path-tracker nil 'local) ;; R and S specific (setq major-mode 'inferior-ess-mode) (setq mode-name "iESS") ;(concat "iESS:" ess-dialect)) (setq mode-line-process '(" [" ess--mode-line-process-indicator ess--local-mode-line-process-indicator "]: %s")) (use-local-map inferior-ess-mode-map) (if ess-mode-syntax-table (set-syntax-table ess-mode-syntax-table) ;; FIXME: need to do something if not set! Get from the proper place! ) (ess-write-to-dribble-buffer (format "(i-ess 1): buf=%s, lang=%s, comint..echo=%s, comint..sender=%s,\n" (current-buffer) ess-language comint-process-echoes comint-input-sender)) (when (string= ess-language "S") ;; todo: what is this doing here? (local-set-key "\M-\r" 'ess-dirs)) ;; Font-lock support ;; AJR: This (the following local-var is already the case! ;; KH sez: only in XEmacs :-(. (& Emacs 22.1, SJE). (when inferior-ess-font-lock-keywords ;; new system (setq inferior-ess-font-lock-defaults (ess--extract-default-fl-keywords inferior-ess-font-lock-keywords))) (set (make-local-variable 'font-lock-defaults) '(inferior-ess-font-lock-defaults nil nil ((?\. . "w") (?\_ . "w") (?' . ".")))) ;; SJE 2007-06-28: Emacs 22.1 has a bug in that comint-mode will set ;; this variable to t, when we need it to be nil. The Emacs 22 ;; solution to this bug is to use define-derived-mode to derive ;; inferior-ess-mode from comint-mode. Not sure if we can go down ;; that route yet. I've used the when condition so that if the var ;; is nil, don't bother setting it -- as setting it will make a new ;; local var. (when font-lock-keywords-only (setq font-lock-keywords-only nil)) ;;; Completion support ---------------- ;; SJE: comint-dynamic-complete-functions is regarded as a hook, rather ;; than a regular variable. Note order of completion (thanks David Brahm): (if (and (featurep 'emacs ) (>= emacs-major-version 24)) (progn (remove-hook 'completion-at-point-functions 'comint-completion-at-point t) ;; reset the thook (add-hook 'completion-at-point-functions 'comint-c-a-p-replace-by-expanded-history nil 'local) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local)) (add-hook 'comint-dynamic-complete-functions 'ess-complete-filename 'append 'local) (add-hook 'comint-dynamic-complete-functions ;; only for R, is it ok? 'ess-complete-object-name 'append 'local) (add-hook 'comint-dynamic-complete-functions 'comint-replace-by-expanded-history 'append 'local) ;; When a hook is buffer-local, the dummy function `t' is added to ;; indicate that the functions in the global value of the hook ;; should also be run. SJE: I have removed this, as I think it ;; interferes with our normal completion. (remove-hook 'comint-dynamic-complete-functions 't 'local)) ;; (setq comint-completion-addsuffix nil) ; To avoid spaces after filenames ;; KH: next 2 lines solve. (set (make-local-variable 'comint-completion-addsuffix) (cons "/" "")) (setq comint-input-autoexpand t) ; Only for completion, not on input. ;; timers (add-hook 'ess-idle-timer-functions 'ess-cache-search-list nil 'local) (add-hook 'ess-idle-timer-functions 'ess-synchronize-dirs nil 'local) ;;; Keep out of the code. (set (make-local-variable 'indent-tabs-mode) nil) (set (make-local-variable 'paragraph-start) (concat inferior-ess-primary-prompt "\\|\^L")) (set (make-local-variable 'paragraph-separate) "\^L") ;; SJE Tue 28 Dec 2004: do not attempt to load object name db. ;; (ess-load-object-name-db-file) ;; (sleep-for 0.5) (make-local-variable 'kill-buffer-hook) (add-hook 'kill-buffer-hook 'ess-kill-buffer-function) (run-hooks 'inferior-ess-mode-hook) (ess-write-to-dribble-buffer (format "(i-ess end): buf=%s, lang=%s, comint..echo=%s, comint..sender=%s,\n" (current-buffer) ess-language comint-process-echoes comint-input-sender)) (message (concat (substitute-command-keys "Type \\[describe-mode] for help on ESS version ") ess-version))) ;;*;; Commands used exclusively in inferior-ess-mode ;;;*;;; Main user commands (defun inferior-ess-input-sender (proc string) (inferior-ess--interrupt-subjob-maybe proc) (let ((comint-input-filter-functions nil)) ; comint runs them, don't run twise. (if comint-process-echoes (ess-eval-linewise string nil nil ess-eval-empty) (ess-send-string proc string)))) (defvar ess-help-arg-regexp "\\(['\"]?\\)\\([^,=)'\"]*\\)\\1" "Reg(ular) Ex(pression) of help(.) arguments. MUST: 2nd \\(.\\) = arg.") (defconst inferior-R--input-help (format "^ *help *(%s)" ess-help-arg-regexp)) ;; (defconst inferior-R-2-input-help (format "^ *\\? *%s" ess-help-arg-regexp)) (defconst inferior-R--input-?-help-regexp "^ *\\(?:\\(?1:[a-zA-Z ]*?\\?\\{1,2\\}\\) *\\(?2:.+\\)\\)") (defconst inferior-R--page-regexp (format "^ *page *(%s)" ess-help-arg-regexp)) (defun ess-R--sanitize-help-topic (string) ;; enclose help topics into `` to avoid ?while ?if etc hangs (if (string-match "\\([^:]*:+\\)\\(.*\\)$" string) ; treat foo::bar corectly (format "%s`%s`" (match-string 1 string) (match-string 2 string)) (format "`%s`" string))) (defun inferior-R-input-sender (proc string) (save-current-buffer (let ((help-match (and (string-match inferior-R--input-help string) (match-string 2 string))) (help-?-match (and (string-match inferior-R--input-?-help-regexp string) string)) (page-match (and (string-match inferior-R--page-regexp string) (match-string 2 string)))) (cond (help-match (ess-display-help-on-object help-match) (process-send-string proc "\n")) (help-?-match (if (string-match "\\?\\?\\(.+\\)" help-?-match) (ess--display-indexed-help-page (concat help-?-match "\n") "^\\([^ \t\n]+::[^ \t\n]+\\)[ \t\n]+" (format "*ess-apropos[%s](%s)*" ess-current-process-name (match-string 1 help-?-match)) 'appropos) (if (string-match "^ *\\? *\\([^:]+\\)$" help-?-match) ; help(foo::bar) doesn't work (ess-display-help-on-object (match-string 1 help-?-match)) ;; anything else we send to process almost unchanged (let ((help-?-match (and (string-match inferior-R--input-?-help-regexp string) (format "%s%s" (match-string 1 string) (ess-R--sanitize-help-topic (match-string 2 string)))))) (ess-display-help-on-object help-?-match "%s\n")))) (process-send-string proc "\n")) (page-match (switch-to-buffer-other-window (ess-command (concat page-match "\n") (get-buffer-create (concat page-match ".rt")))) (R-transcript-mode) (process-send-string proc "\n")) (t ;; normal command (inferior-ess-input-sender proc string)))))) (defun inferior-ess-send-input () "Sends the command on the current line to the ESS process." (interactive) (run-hooks 'ess-send-input-hook) ;; (let ((proc (get-buffer-process (current-buffer)))) ;; (if (not proc) ;; (user-error "Current buffer has no process") ;; (let ((comint-process-echoes (or comint-process-echoes ;; (< (point) (marker-position (process-mark proc)))))) ;; (comint-send-input)))) (comint-send-input) (setq ess-object-list nil)) ;; Will be reconstructed from cache if needs be (defun inferior-ess--goto-input-start:field () "Move point to the begining of input skiping all continuation lines. If in the output field, goes to the begining of previous input field. Note: inferior-ess-secondary-prompt should match exactly. " (goto-char (field-beginning)) ;; move to the begining of non-output field (while (and (not (= (point) (point-min))) (eq (field-at-pos (point)) 'output)) (goto-char (field-beginning nil t))) ;; skip all secondary prompts (let ((pos (field-beginning (point) t)) (secondary-prompt (concat "^" inferior-ess-secondary-prompt))) (while (and pos (if (eq (get-text-property pos 'field) 'output) (string-match secondary-prompt (field-string-no-properties pos)) t)) (goto-char pos) (setq pos (previous-single-property-change pos 'field))))) (defun inferior-ess--goto-input-end:field () "Move point to the end of input skiping all continuation lines. If in the output field, goes to the begining of previous input field. NOTE: to be used only with fields, see `comint-use-prompt-regexp'. " ;; this func is not used but might be useful some day (goto-char (field-end)) (let ((pos (point)) (secondary-prompt (concat "^" inferior-ess-secondary-prompt))) (while (and pos (if (eq (get-text-property pos 'field) 'output) (string-match secondary-prompt (field-string-no-properties pos)) t)) (goto-char pos) (setq pos (next-single-property-change pos 'field))))) (defun inferior-ess--get-old-input:field () "Return the ESS command surrounding point (use with fields)." (save-excursion (if (eq (field-at-pos (point)) 'output) (if (called-interactively-p 'any) (error "No command on this line") ;; else, just return "" "") (inferior-ess--goto-input-start:field) (let ((command (field-string-no-properties (point))) (pos (next-single-property-change (point) 'field )) (secondary-prompt (concat "^" inferior-ess-secondary-prompt))) (while (and pos (cond ((eq (get-text-property pos 'field) 'input) (setq command (concat command "\n" (field-string-no-properties pos)))) ((eq (get-text-property pos 'field) 'output) (string-match secondary-prompt (field-string-no-properties pos))) (t)));; just skip if unknown (setq pos (next-single-property-change pos 'field))) command)))) ;; todo: error when entering a multiline function ;; check.integer <- function(N){ ;; is.integer(N) | !length(grep("[^[:digit:]]", as.character(N))) ;; } (defun inferior-ess--goto-input-start:regexp () "Move point to the begining of input skiping all continuation lines. If in the output field, goes to the begining of previous input. " (beginning-of-line) (unless (looking-at inferior-ess-prompt) (re-search-backward (concat "^" inferior-ess-prompt))) ;; at bol (when (and inferior-ess-secondary-prompt (looking-at inferior-ess-secondary-prompt)) (while (and (> (forward-line -1) -1) (looking-at inferior-ess-secondary-prompt)))) (unless (looking-at inferior-ess-prompt) (ess-error "Beggining of input not found")) (comint-skip-prompt)) (defun inferior-ess--get-old-input:regexp () "Return the ESS command surrounding point (use regexp)." ;;VS[03-09-2012]: This should not rise errors!! Troubles comint-interrupt-subjob (save-excursion (let* ((inhibit-field-text-motion t) command) (beginning-of-line) (when (and inferior-ess-secondary-prompt (looking-at inferior-ess-secondary-prompt)) (inferior-ess--goto-input-start:regexp)) (beginning-of-line) (if (looking-at inferior-ess-prompt) ; cust.var, might not include sec-prompt (progn (comint-skip-prompt) (setq command (buffer-substring-no-properties (point) (point-at-eol))) (when inferior-ess-secondary-prompt (while (progn (forward-line 1) (looking-at inferior-ess-secondary-prompt)) (re-search-forward inferior-ess-secondary-prompt (point-at-eol)) (setq command (concat command "\n" (buffer-substring-no-properties (point) (point-at-eol)))) )) (forward-line -1) (setq ess-temp-point (point)) ;; this is ugly, used by transcript command) (message "No command at this point") "")))) (defun inferior-ess-get-old-input () "Return the ESS command surrounding point." (if comint-use-prompt-regexp (inferior-ess--get-old-input:regexp) (inferior-ess--get-old-input:field))) ;;;*;;; Hot key commands (defun ess-execute-objects (posn) "Send the objects() command to the ESS process. By default, gives the objects at position 1. A prefix argument toggles the meaning of `ess-execute-in-process-buffer'. A prefix argument of 2 or more means get objects for that position. A negative prefix argument gets the objects for that position and toggles `ess-execute-in-process-buffer' as well." (interactive "P") (ess-make-buffer-current) (let* ((num-arg (if (listp posn) (if posn -1 1) (prefix-numeric-value posn))) (the-posn (if (< num-arg 0) (- num-arg) num-arg)) (invert (< num-arg 0)) (the-command (format inferior-ess-objects-command the-posn ".*")) (the-message (concat ">>> Position " (number-to-string the-posn) " (" (nth (1- the-posn) (ess-search-list)) ")\n"))) (ess-execute the-command invert "S objects" the-message))) (defun ess-execute-search (invert) "Send the `inferior-ess-search-list-command' command to the `ess-language' process. [search(..) in S]" (interactive "P") (ess-execute inferior-ess-search-list-command invert "S search list")) ;; FIXME --- this *only* works in S / S-plus; not in R ;; ----- ("at least" is not assigned to any key by default) (defun ess-execute-attach (dir &optional posn) "Attach a directory in the `ess-language' process with the attach() command. When used interactively, user is prompted for DIR to attach and prefix argument is used for POSN (or 2, if absent.) Doesn't work for data frames." (interactive "Attach directory: \nP") (ess-execute (concat "attach(\"" (directory-file-name (expand-file-name dir)) "\"" (if posn (concat "," (number-to-string (prefix-numeric-value posn)))) ")") 'buffer) (ess-process-put 'sp-for-help-changed? t)) (defun ess-execute-screen-options (&optional invisibly) "Cause S to set the \"width\" option to 1 less than the window width. Also sets the \"length\" option to 99999. When INVISIBLY is non-nil, don't echo to R subprocess. This is a good thing to put in `ess-R-post-run-hook' or `ess-S+-post-run-hook'." (interactive) (when (string= ess-language "S") ;; We cannot use (window-width) here because it returns sizes in default ;; (frame) characters which leads to incorrect sizes with scaled fonts.To ;; solve this we approximate font width in pixels and use window-pixel-width ;; to compute the approximate number of characters that fit into line. (let* ((wedges (window-inside-pixel-edges)) (wwidth (- (nth 2 wedges) (nth 0 wedges))) (nchars (if (fboundp 'default-font-width) (floor (/ wwidth (default-font-width))) ;; emacs 24 (if (display-graphic-p) (let* ((r (/ (float (frame-char-height)) (frame-char-width))) (charh (aref (font-info (face-font 'default)) 3)) (charw (/ charh r))) (- (floor (/ wwidth charw)) 1)) ;; e.g., no X11 as in 'emacs -nw' (- (window-width) 2)))) (command (format "options(width=%d, length=99999)\n" nchars))) (if invisibly (ess-command command) (ess-eval-linewise command nil nil nil 'wait-prompt))))) (defun ess-execute (command &optional invert buff message) "Send a command to the ESS process. A newline is automatically added to COMMAND. Prefix arg (or second arg INVERT) means invert the meaning of `ess-execute-in-process-buffer'. If INVERT is 'buffer, output is forced to go to the process buffer. If the output is going to a buffer, name it *BUFF*. This buffer is erased before use. Optional fourth arg MESSAGE is text to print at the top of the buffer (defaults to the command if BUFF is not given.)" (interactive (list ;; simpler way to set proc name in mb? (let ((enable-recursive-minibuffers t) (proc-name (progn (ess-force-buffer-current) ess-local-process-name))) (with-current-buffer (get-buffer " *Minibuf-1*") ;; fixme: hardcoded name (setq ess-local-process-name proc-name)) (read-from-minibuffer "Execute> " nil ess-mode-minibuffer-map)) current-prefix-arg)) (ess-make-buffer-current) (let ((the-command (concat command "\n")) (buff-name (concat "*" (or buff "ess-output") "*")) (in-pbuff (if invert (or (eq invert 'buffer) (not ess-execute-in-process-buffer)) ess-execute-in-process-buffer))) (if in-pbuff (ess-eval-linewise the-command) (let ((buff (ess-create-temp-buffer buff-name))) (ess-command the-command buff);; sleep? (with-current-buffer buff (goto-char (point-min)) (if message (insert message) (if buff nil ;; Print the command in the buffer if it has not been ;; given a special name (insert "> " the-command))) (setq ess-local-process-name ess-current-process-name)) (ess-display-temp-buffer buff))))) ;;;*;;; Quitting (defun ess-quit () "Issue an exiting command to the inferior process, additionally also running \\[ess-cleanup]. For R, runs \\[ess-quit-r], see there." (interactive) (if (string-equal ess-dialect "R") (ess-quit-r) ;; else: non-R (ess-force-buffer-current "Process to quit: " nil 'no-autostart) (ess-make-buffer-current) (let ((sprocess (ess-get-process ess-current-process-name))) (if (not sprocess) (error "No ESS process running")) (when (y-or-n-p (format "Really quit ESS process %s? " sprocess)) (ess-cleanup) (goto-char (marker-position (process-mark sprocess))) (insert inferior-ess-exit-command) (process-send-string sprocess inferior-ess-exit-command) ;;SJE - suggest no need to rename buffer upon exit. ;;(rename-buffer (concat (buffer-name) "-exited") t) )))) (defun ess-quit-r () "Issue an exiting command to an inferior R process, and optionally clean up. This version is for killing *R* processes; it asks the extra question regarding whether the workspace image should be saved." (ess-force-buffer-current "Process to quit: " nil 'no-autostart) (ess-make-buffer-current) (let (cmd ;;Q response (sprocess (ess-get-process ess-current-process-name))) (if (not sprocess) (error "No ESS process running")) ;;Q (setq response (completing-read "Save workspace image? " ;;Q '( ( "yes".1) ("no" . 1) ("cancel" . 1)) ;;Q nil t)) ;;Q (if (string-equal response "") ;;Q (setq response "default")); which will ask again (in most situations) ;;Q (unless (string-equal response "cancel") (ess-cleanup) ;;Q (setq cmd (format "q(\"%s\")\n" response)) (setq cmd "base::q()\n") (goto-char (marker-position (process-mark sprocess))) (process-send-string sprocess cmd))) (defun ess-abort () "Kill the ESS process, without executing .Last or terminating devices. If you want to finish your session, use \\[ess-quit] instead." ;;; Provided as a safety measure over the default binding of C-c C-z in ;;; comint-mode-map. (interactive) (ding) (message "WARNING: \\[inferior-ess-exit-command] will not be executed and graphics devices won't finish properly!") (sit-for 2) (if (y-or-n-p "Still abort? ") (comint-quit-subjob) (message "Good move."))) (defun ess-cleanup () "Possibly kill or offer to kill, depending on the value of `ess-S-quit-kill-buffers-p', all buffers associated with this ESS process. Leaves you in the ESS process buffer. It's a good idea to run this before you quit. It is run automatically by \\[ess-quit]." (interactive) (let ((the-procname (or (ess-make-buffer-current) ess-local-process-name))) (unless the-procname (error "I don't know which ESS process to clean up after!")) (when (or (eq ess-S-quit-kill-buffers-p t) (and (eq ess-S-quit-kill-buffers-p 'ask) (y-or-n-p (format "Delete all buffers associated with process %s? " the-procname)))) (dolist (buf (buffer-list)) (with-current-buffer buf ;; Consider buffers for which ess-local-process-name is ;; the same as the-procname (when (and (not (get-buffer-process buf)) ess-local-process-name (equal ess-local-process-name the-procname)) (kill-buffer buf))))) (ess-switch-to-ESS nil))) (defun ess-kill-buffer-function () "Function run just before an ESS process buffer is killed." ;; This simply deletes the buffers process to avoid an Emacs bug ;; where the sentinel is run *after* the buffer is deleted (let ((proc (get-buffer-process (current-buffer)))) (if (processp proc) (delete-process proc)))) (defun ess-list-object-completions nil "List all possible completions of the object name at point." (interactive) (ess-complete-object-name)) ;;;*;;; Support functions (defun ess-extract-onames-from-alist (alist posn &optional force) "Return the object names in position POSN of ALIST. ALIST is an alist like `ess-sl-modtime-alist'. POSN should be in 1 .. (length ALIST). If optional third arg FORCE is t, the corresponding element of the search list is re-read. Otherwise it is only re-read if it's a directory and has been modified since it was last read." (let* ((entry (nth (1- posn) alist)) (dir (car entry)) (timestamp (car (cdr entry))) (new-modtime (and timestamp (ess-dir-modtime dir)))) ;; Refresh the object listing if necessary (if (or force (not (equal new-modtime timestamp))) (setcdr (cdr entry) (ess-object-names dir posn))) (cdr (cdr entry)))) (defun ess-dir-modtime (dir) "Return the last modtime if DIR is a directory, and nil otherwise." (and ess-filenames-map (file-directory-p dir) (nth 5 (file-attributes dir)))) (defun ess-object-modtime (object) "Return the modtime of the S object OBJECT (a string). Searches along the search list for a file named OBJECT and returns its modtime Returns nil if that file cannot be found, i.e., for R or any non-S language!" (let ((path (ess-search-list)) result) (while (and (not result) path) (setq result (file-attributes (concat (file-name-as-directory (car path)) object))) (setq path (cdr path))) (nth 5 result))) (defun ess-modtime-gt (mod1 mod2) "Return t if MOD1 is later than MOD2." (and mod1 (or (> (car mod1) (car mod2)) (and (= (car mod1) (car mod2)) (> (car (cdr mod1)) (car (cdr mod2))))))) (defun ess-get-object-list (name &optional exclude-first) "Return a list of current S object names associated with process NAME, using `ess-object-list' if that is non-nil. If exclude-first is non-nil, don't return objects in first positon (.GlobalEnv)." (or ess-object-list ;; <<- MM: this is now always(?) nil; we cache the *-modtime-alist (with-current-buffer (process-buffer (ess-get-process name)) (ess-make-buffer-current) (ess-write-to-dribble-buffer (format "(get-object-list %s) .." name)) (if (or (not ess-sl-modtime-alist) (ess-process-get 'sp-for-help-changed?)) (progn (ess-write-to-dribble-buffer "--> (ess-get-modtime-list)\n") (ess-get-modtime-list)) ;;else (ess-write-to-dribble-buffer " using existing ess-sl-modtime-alist\n")) (let* ((alist ess-sl-modtime-alist) (i 2) (n (length alist)) result) (ess-write-to-dribble-buffer (format " (length alist) : %d\n" n)) (unless exclude-first ;; re-read of position 1 : (setq result (ess-extract-onames-from-alist alist 1 'force))) (ess-write-to-dribble-buffer (format " have re-read pos=1: -> length %d\n" (length result))) ;; Re-read remaining directories if necessary. (while (<= i n) (setq result (append result (ess-extract-onames-from-alist alist i))) (setq i (1+ i))) (setq ess-object-list (ess-uniq-list result)))))) (defun ess-get-words-from-vector (command &optional no-prompt-check wait proc) "Evaluate the S command COMMAND, which returns a character vector. Return the elements of the result of COMMAND as an alist of strings. COMMAND should have a terminating newline. WAIT is passed to `ess-command'. To avoid truncation of long vectors, wrap your command (%s) like this, or a version with explicit options(max.print=1e6): local({ out <- try({%s}); print(out, max=1e6) })\n " (let ((tbuffer (get-buffer-create " *ess-get-words*")); initial space: disable-undo words) (ess-if-verbose-write (format "ess-get-words*(%s).. " command)) (ess-command command tbuffer 'sleep no-prompt-check wait proc) (ess-if-verbose-write " [ok] ..") (with-current-buffer tbuffer (goto-char (point-min)) ;; this is bad, only R specific test ;; (if (not (looking-at "[+ \t>\n]*\\[1\\]")) ;; (progn (ess-if-verbose-write "not seeing \"[1]\".. ") ;; (setq words nil) ;; ) (while (re-search-forward "\"\\(\\(\\\\\\\"\\|[^\"]\\)*\\)\"\\( \\|$\\)" nil t);match \" (setq words (cons (buffer-substring (match-beginning 1) (match-end 1)) words)))) (ess-if-verbose-write (if (> (length words) 5) (format " |-> (length words)= %d\n" (length words)) (format " |-> words= '%s'\n" words))) (reverse words))) (defun ess-compiled-dir (dir) "Return non-nil if DIR is an S object directory with special files. I.e. if the filenames in DIR are not representative of the objects in DIR." (or (file-exists-p (concat (file-name-as-directory dir) "___nonfile")) (file-exists-p (concat (file-name-as-directory dir) "__BIGIN")) (file-exists-p (concat (file-name-as-directory dir) "___NONFI")))) (defun ess-object-names (obj &optional pos) "Return alist of S object names in directory (or object) OBJ. If OBJ is a directory name (begins with `/') returns a listing of that dir. This may use the search list position POS if necessary. If OBJ is an object name, returns result of the command `inferior-ess-safe-names-command'. If POS is supplied return the result of the command in `inferior-ess-objects-command' If OBJ is nil or not a directory, POS must be supplied. In all cases, the value is an list of object names." (cond ((and (stringp obj) (string-match-p "ESSR" obj)) nil) ;; FIXME: in both cases below, the same fallback "objects(POS)" is used -- merge! ((and obj (file-accessible-directory-p obj)) ;; Check the pre-compiled object list in ess-object-name-db first ;; FIXME: If used at all, ess-object-name-db should not only ;; ----- be used in the directory case !! (or (cdr-safe (assoc obj ess-object-name-db)) ;; Take a directory listing (and ess-filenames-map ;; first try .Data subdirectory: ;;FIXME: move ".Data" or ``this function'' to ess-sp6-d.el etc: (let ((dir (concat (file-name-as-directory obj) ".Data"))) (if (not (file-accessible-directory-p dir)) (setq dir obj)) (and (not (ess-compiled-dir dir)) (directory-files dir)))) ;; Get objects(pos) instead (and (or (ess-write-to-dribble-buffer (format "(ess-object-names ..): directory %s not used\n" obj)) t) pos (ess-get-words-from-vector (format inferior-ess-objects-command pos))))) ((and obj ;; want names(obj) (ess-get-words-from-vector (format inferior-ess-safe-names-command obj)))) (pos (ess-get-words-from-vector (format inferior-ess-objects-command pos))))) (defun ess-slot-names (obj) "Return alist of S4 slot names of S4 object OBJ." (ess-get-words-from-vector (format "slotNames(%s)\n" obj))) ;;; SJE: Wed 29 Dec 2004 --- remove this function. ;;; rmh: Wed 5 Jan 2005 --- bring it back for use on Windows (defun ess-create-object-name-db () "Create a database of object names in standard S directories. This database is saved in the file specified by `ess-object-name-db-file', and is loaded when `ess-mode' is loaded. It defines the variable `ess-object-name-db', which is used for completions. Before you call this function, modify the S search list so that it contains all the non-changing (i.e. system) S directories. All positions of the search list except for position 1 are searched and stored in the database. After running this command, you should move ess-namedb.el to a directory in the `load-path'." (interactive) (setq ess-object-name-db nil) (let ((search-list (cdr (ess-search-list))) (pos 2) name (buffer (get-buffer-create " *ess-db*")) (temp-object-name-db nil) (temp-object-name-db-file ess-object-name-db-file)) (ess-write-to-dribble-buffer (format "(object db): search-list=%s \n " search-list)) (while search-list (message "Searching %s" (car search-list)) (setq temp-object-name-db (cons (cons (car search-list) (ess-object-names nil pos)) temp-object-name-db)) (setq search-list (cdr search-list)) (ess-write-to-dribble-buffer (format "(object db): temp-obj-name-db=%s \n pos=%s" temp-object-name-db pos)) (setq pos (1+ pos))) (with-current-buffer buffer (erase-buffer) (insert "(setq ess-object-name-db '") (prin1 temp-object-name-db (current-buffer)) (insert ")\n") (setq name (expand-file-name ess-object-name-db-file)) (write-region (point-min) (point-max) name) (message "Wrote %s" name)) (kill-buffer buffer) (setq ess-object-name-db temp-object-name-db))) (defun ess-resynch nil "Reread all directories/objects in variable `ess-search-list' to form completions." (interactive) (if (ess-make-buffer-current) nil (error "Not an ESS process buffer")) (setq ess-sl-modtime-alist nil) (setq ess-object-list nil) (setq ess-object-name-db nil) ; perhaps it would be better to reload? (ess-process-put 'sp-for-help-changed? t) (ess-get-modtime-list)) (defun ess-filename-completion () ;; > emacs 24 "Return completion only within string or comment." (save-restriction ;; explicitely handle inferior-ess (ignore-errors (when (and (eq major-mode 'inferior-ess-mode) (> (point) (process-mark (get-buffer-process (current-buffer))))) (narrow-to-region (process-mark (get-buffer-process (current-buffer))) (point-max)))) (when (ess-inside-string-or-comment-p (point)) (append (comint-filename-completion) '(:exclusive no))))) (defun ess-complete-filename () "Do file completion only within strings." (save-restriction ;; explicitely handle inferior-ess (ignore-errors (when (and (eq major-mode 'inferior-ess-mode) (> (point) (process-mark (get-buffer-process (current-buffer))))) (narrow-to-region (process-mark (get-buffer-process (current-buffer))) (point-max)))) (when (or (ess-inside-string-or-comment-p (point))) ;; usable within ess-mode as well (comint-dynamic-complete-filename)))) (defun ess-after-pathname-p nil ;; Heuristic: after partial pathname if it looks like we're in a ;; string, and that string looks like a pathname. Not the best for ;; use with unix() (or it's alias, !). Oh well. (save-excursion (save-match-data (let ((opoint (point))) (and (re-search-backward "\\(\"\\|'\\)[~/#$.a-zA-Z0-9][^ \t\n\"']*" nil t) (eq opoint (match-end 0))))))) ;;*;; Functions handling the search list (defun ess-search-list (&optional force-update) "Return the current search list as a list of strings. Elements which are apparently directories are expanded to full dirnames. Don't try to use cache if FORCE-UPDATE is non-nil. Is *NOT* used by \\[ess-execute-search], but by \\[ess-resynch], \\[ess-get-object-list], \\[ess-get-modtime-list], \\[ess-execute-objects], \\[ess-object-modtime], \\[ess-create-object-name-db], and (indirectly) by \\[ess-get-help-files-list]." (with-current-buffer (ess-get-process-buffer ess-current-process-name);to get *its* local vars (let ((result nil) (slist (ess-process-get 'search-list)) (tramp-mode nil)) ;; hack for bogus file-directory-p below (if (and slist (not force-update) (not (ess-process-get 'sp-for-help-changed?))) slist ;; else, re-compute: (ess-write-to-dribble-buffer " (ess-search-list ... ) ") (let ((tbuffer (get-buffer-create " *search-list*")) (homedir ess-directory) (my-search-cmd inferior-ess-search-list-command); from ess-buffer elt) (ess-command my-search-cmd tbuffer 0.05); <- sleep for dde only; does (erase-buffer) (with-current-buffer tbuffer ;; guaranteed by the initial space in its name: (buffer-disable-undo) (goto-char (point-min)) (ess-write-to-dribble-buffer (format "after '%s', point-max=%d\n" my-search-cmd (point-max))) (while (re-search-forward "\"\\([^\"]*\\)\"" nil t) (setq elt (buffer-substring (match-beginning 1) (match-end 1))) ;;Dbg: (ess-write-to-dribble-buffer (format " .. elt= %s \t" elt)) (if (and (string-match "^[^/]" elt) (file-directory-p (concat ess-directory elt))) (progn ;;Dbg: (ess-write-to-dribble-buffer "*IS* directory\n") (setq elt (concat homedir elt))) ;;else ;;dbg ;;- (ess-write-to-dribble-buffer "not dir.\n") ) (setq result (append result (list elt)))) (kill-buffer tbuffer))) result)))) ;;; ess-sl-modtime-alist is a list with elements as follows: ;;; * key (directory or object name) ;;; * modtime (list of 2 integers) ;;; * name, name ... (accessible objects in search list posn labeled by key) ;;; It is a buffer-local variable (belonging to e.g. *R*, *S+6*, .. etc) ;;; and has the same number of elements and is in the same order as the ;;; S search list (defun ess-get-modtime-list (&optional cache-var-name exclude-first) "Record directories in the search list, and the objects in those directories. The result is stored in CACHE-VAR-NAME. If nil, CACHE-VAR-NAME defaultst to `ess-sl-modtime-alist'. If EXCLUDE-FIRST is non-nil don't recompile first object in the search list." ;; Operation applies to process of current buffer (let* ((searchlist (if exclude-first (cdr (ess-search-list)) (ess-search-list))) (index (if exclude-first 2 1)) (cache-name (or cache-var-name 'ess-sl-modtime-alist)) pack newalist) (while searchlist (setq pack (car searchlist)) (setq newalist (append newalist (list (or (assoc pack (symbol-value cache-name)) (append (list pack (ess-dir-modtime pack)) (prog2 (message "Forming completions for %s..." pack) (ess-object-names pack index) (message "Forming completions for %s...done" pack))))))) (setq index (1+ index)) (setq searchlist (cdr searchlist))) ;;DBG: (ess-write-to-dribble-buffer (format "(%s): created new alist of length %d\n" cache-var-name (length newalist))) (set cache-name newalist))) (defun ess-search-path-tracker (str) "Check if input STR changed the search path. This function monitors user input to the inferior ESS process so that Emacs can keep the process variable 'search-list' up to date. `ess-completing-read' in \\[ess-read-object-name] uses this list indirectly when it prompts for help or for an object to dump. From ESS 12.09 this is not necessary anymore, as the search path is checked on idle time. It is kept for robustness and backward compatibility only." (when ess-change-sp-regexp (if (string-match ess-change-sp-regexp str) (ess-process-put 'sp-for-help-changed? t)))) ; Miscellaneous routines ;;;*;;; Routines for reading object names (defun ess-read-object-name (p-string) "Read an S object name from the minibuffer with completion, and return it. P-STRING is the prompt string." (let* ((default (ess-read-object-name-dump)) (object-list (ess-get-object-list ess-local-process-name)) (spec (ess-completing-read p-string object-list nil nil nil nil default))) (list (cond ((string= spec "") default) (t spec))))) (defun ess-read-object-name-default () "Return the object name at point, or nil if none." (condition-case () (save-excursion ;; The following line circumvents an 18.57 bug in following-char (if (eobp) (backward-char 1)) ; Hopefully buffer is not empty! ;; Get onto a symbol (catch 'nosym ; bail out if there's no symbol at all before point (while (/= (char-syntax (following-char)) ?w) (if (bobp) (throw 'nosym nil) (backward-char 1))) (let* ((end (progn (forward-sexp 1) (point))) (beg (progn (backward-sexp 1) (point)))) (buffer-substring-no-properties beg end)))) (error nil))) (defun ess-read-object-name-dump () "Return the object name at point, or \"Temporary\" if none." (condition-case () (save-excursion ;; The following line circumvents an 18.57 bug in following-char (if (eobp) (backward-char 1)) ; Hopefully buffer is not empty! ;; Get onto a symbol (catch 'nosym ; bail out if there's no symbol at all before point (while (/= (char-syntax (following-char)) ?w) (if (bobp) (throw 'nosym nil) (backward-char 1))) (let* ((end (progn (forward-sexp 1) (point))) (beg (progn (backward-sexp 1) (point))) (object-name (buffer-substring beg end))) (or object-name "Temporary")))) (error nil))) ;;;; start of ess-smart-operators ;;;; inspired by slime repl shortcuts (defvar ess--handy-history nil) (defun ess-handy-commands () "Request and execute a command from `ess-handy-commands' list." (interactive) (let* ((commands (or ess--local-handy-commands ess-handy-commands)) (hist (and (assoc (car ess--handy-history) commands) (car ess--handy-history)))) (call-interactively (cdr (assoc (ess-completing-read "Execute" (sort (mapcar 'car commands) 'string-lessp) nil t nil 'ess--handy-history hist) commands))))) (defun ess-smart-comma () "If comma is invoked at the process marker of an ESS inferior buffer, request and execute a command from `ess-handy-commands' list." (interactive) (let ((proc (get-buffer-process (current-buffer)))) (if (and proc (eq (point) (marker-position (process-mark proc)))) (ess-handy-commands) (if ess-smart-operators (progn (delete-horizontal-space) (insert ", ") (unless (eq major-mode 'inferior-ess-mode) (indent-according-to-mode))) (insert ","))))) ; directories (defun ess-set-working-directory (path &optional no-error) "Set the current working directory to PATH for both ESS subprocess and Emacs buffer `default-directory'." (interactive "DChange working directory to: ") (if ess-setwd-command (let* ((remote (file-remote-p path)) (path (if remote (tramp-sh-handle-expand-file-name path) path)) (lpath (if remote (with-parsed-tramp-file-name path v v-localname) path))) (ess-eval-linewise (format ess-setwd-command lpath)) ;; use file-name-as-directory to ensure it has trailing / (setq default-directory (file-name-as-directory path))) (unless no-error (error "Not implemented for dialect %s" ess-dialect)))) (defalias 'ess-change-directory 'ess-set-working-directory) (defun ess-get-working-directory (&optional no-error) "Retrive the current working directory from the current ess process." (if ess-getwd-command (car (ess-get-words-from-vector ess-getwd-command)) (unless no-error (error "Not implemented for dialect %s" ess-dialect)))) (defun ess-synchronize-dirs () "Set Emacs' current directory to be the same as the subprocess directory. Used in `ess-idle-timer-functions'." (when (and ess-can-eval-in-background ess-getwd-command) (ess-when-new-input last-sync-dirs (ess-if-verbose-write "\n(ess-synchronize-dirs)\n") (setq default-directory (car (ess-get-words-from-vector ess-getwd-command))) default-directory))) (defun ess-dirs () "Set Emacs' current directory to be the same as the *R* process." ;; Note: This function is not necessary anymore. The Emacs ;; default-directory and subprocess working directory are ;; synchronized automatically. (interactive) (let ((dir (car (ess-get-words-from-vector "getwd()\n")))) (message "(ESS / default) directory: %s" dir) (setq default-directory (file-name-as-directory dir)))) ;; (make-obsolete 'ess-dirs 'ess-synchronize-dirs "ESS 12.09") ;; search path (defun ess--mark-search-list-as-changed () "Internal. Marks all the search-list related variables as changed." ;; other guys might track their own (ess-process-put 'sp-for-help-changed? t) (ess-process-put 'sp-for-ac-changed? t)) (defun ess-cache-search-list () "Used in `ess-idle-timer-functions', to set search path related variables." (when (and ess-can-eval-in-background inferior-ess-search-list-command) (ess-when-new-input last-cache-search-list (let ((path (ess-search-list 'force)) (old-path (process-get *proc* 'search-list))) (when (not (equal path old-path)) (process-put *proc* 'search-list path) (ess--mark-search-list-as-changed) path))))) ;;*;; Temporary buffer handling ;; (defun ess-create-temp-buffer (name) ;; "Create an empty buffer called NAME, but doesn't display it." ;; (let ((buff (get-buffer-create name))) ;; (save-excursion ;; (set-buffer buff) ;; (erase-buffer)) ;; buff)) ;; Ed Kademan's version: ;; From: Ed Kademan ;; Subject: Re: ess-mode 5.1.16; search list ;; To: rossini@biostat.washington.edu (A.J. Rossini) ;; Cc: Martin Maechler , ess-bugs@stat.math.ethz.ch ;; Date: 26 Jul 2000 16:12:12 -0400 ;; Dear Tony Rossini, ;; I was having trouble looking at the search list under ess. When I ;; started up multiple inferior processes---each for a different ;; dialect---ess-mode would issue the wrong variant of the "search" ;; command when I typed C-c C-s. In case it is useful let me tell you ;; what I did to get it to work for me. ;; I added the component: ;; (inferior-ess-search-list-command . "search()\n") ;; to S+3-customize-alist and R-customize-alist, and then I redefined the ;; ess-create-temp-buffer function as follows: (defun ess-create-temp-buffer (name) "Create an empty buffer called NAME." (let ((buff (get-buffer-create name)) (elca (eval ess-local-customize-alist))) (with-current-buffer buff (erase-buffer) (ess-setq-vars-local elca buff)) buff)) ;;These two steps seem to insure that the temporary buffer in which the ;;search results appear has the correct version of the local variables. ;;I am not that well acquainted with the ess code and don't know whether ;;this is a good fundamental way of fixing the problem, or even whether ;;or not this breaks some other feature of ess-mode that I never use. ;;Thanks for listening. ;;Ed K. ;;-- ;;Ed Kademan 508.651.3700 ;;PHZ Capital Partners 508.653.1745 (fax) ;;321 Commonwealth Road ;;Wayland, MA 01778 (defun ess-display-temp-buffer (buff) "Display the buffer BUFF using `temp-buffer-show-function' and respecting `ess-display-buffer-reuse-frames'." (let ((display-buffer-reuse-frames ess-display-buffer-reuse-frames)) (funcall (or temp-buffer-show-function 'display-buffer) buff))) ;;*;; Error messages (defun ess-error (msg) "Something bad has happened. Display the S buffer, and cause an error displaying MSG." (display-buffer (process-buffer (ess-get-process ess-current-process-name))) (error msg)) ; Provide package (provide 'ess-inf) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-inf.el ends here ess/lisp/ess-omg-l.el0000664000175000017500000003551512577152666013052 0ustar eddedd;;; ess-omg-l.el --- Support for editing Omega source code ;; Copyright (C) 1999--2001 A.J. Rossini. ;; Copyright (C) 2002--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 15 Aug 1999 ;; Maintainer: ESS-core ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for general editing Omega source code. This is initially ;; based upon the similarities between Omega and S, but will need to ;; diverge to incorporate the use of Java-style coding. ;;; Code: ; Requires and autoloads ; Specialized functions (defun OMG-comment-indent () "Indentation for Omega comments." (if (looking-at "////") (current-column) (if (looking-at "///") (let ((tem (ess-calculate-indent))) (if (listp tem) (car tem) tem)) (skip-chars-backward " \t") (max (if (bolp) 0 (1+ (current-column))) comment-column)))) ;; (defun OMG-indent-line () ;; "Indent current line as Omega code. ;; Return the amount the indentation changed by." ;; (let ((indent (ess-calculate-indent nil)) ;; beg shift-amt ;; (case-fold-search nil) ;; (pos (- (point-max) (point)))) ;; (beginning-of-line) ;; (setq beg (point)) ;; (cond ((eq indent nil) ;; (setq indent (current-indentation))) ;; (t ;; (skip-chars-forward " \t") ;; (if (and ess-indent-with-fancy-comments (looking-at "////")) ;; (setq indent 0)) ;; (if (and ess-indent-with-fancy-comments ;; (looking-at "//") ;; (not (looking-at "///"))) ;; (setq indent comment-column) ;; (if (eq indent t) (setq indent 0)) ;; (if (listp indent) (setq indent (car indent))) ;; (cond ((and (looking-at "else\\b") ;; (not (looking-at "else\\s_"))) ;; (setq indent (save-excursion ;; (ess-backward-to-start-of-if) ;; (+ ess-else-offset ;; (current-indentation))))) ;; ((= (following-char) ?}) ;; (setq indent ;; (+ indent ;; (- ess-close-brace-offset ess-indent-offset)))) ;; ((= (following-char) ?{) ;; (setq indent (+ indent ess-brace-offset))))))) ;; (skip-chars-forward " \t") ;; (setq shift-amt (- indent (current-column))) ;; (if (zerop shift-amt) ;; (if (> (- (point-max) pos) (point)) ;; (goto-char (- (point-max) pos))) ;; (delete-region beg (point)) ;; (indent-to indent) ;; ;; If initial point was within line's indentation, ;; ;; position after the indentation. ;; ;; Else stay at same point in text. ;; (if (> (- (point-max) pos) (point)) ;; (goto-char (- (point-max) pos)))) ;; shift-amt)) ;; (defun OMG-calculate-indent (&optional parse-start) ;; "Return appropriate indentation for current line as Omega code. ;; In usual case returns an integer: the column to indent to. ;; Returns nil if line starts inside a string, t if in a comment." ;; (save-excursion ;; (beginning-of-line) ;; (let ((indent-point (point)) ;; (case-fold-search nil) ;; state ;; containing-sexp) ;; (if parse-start ;; (goto-char parse-start) ;; (beginning-of-defun)) ;; (while (< (point) indent-point) ;; (setq parse-start (point)) ;; (setq state (parse-partial-sexp (point) indent-point 0)) ;; (setq containing-sexp (car (cdr state)))) ;; (cond ((or (nth 3 state) (nth 4 state)) ;; ;; return nil or t if should not change this line ;; (nth 4 state)) ;; ((null containing-sexp) ;; ;; Line is at top level. May be data or function definition, ;; (beginning-of-line) ;; (if (and (/= (following-char) ?\{) ;; (save-excursion ;; (ess-backward-to-noncomment (point-min)) ;; (ess-continued-statement-p))) ;; ess-continued-statement-offset ;; 0)) ; Unless it starts a function body ;; ((/= (char-after containing-sexp) ?{) ;; ;; line is expression, not statement: ;; ;; indent to just after the surrounding open. ;; (goto-char containing-sexp) ;; (let ((bol (save-excursion (beginning-of-line) (point)))) ;; ;; modified by shiba@isac 7.3.1992 ;; (cond ((and (numberp ess-expression-offset) ;; (re-search-backward "[ \t]*expression[ \t]*" bol t)) ;; ;; This regexp match every "expression". ;; ;; modified by shiba ;; ;;(forward-sexp -1) ;; (beginning-of-line) ;; (skip-chars-forward " \t") ;; ;; End ;; (+ (current-column) ess-expression-offset)) ;; ((and (numberp ess-arg-function-offset) ;; (re-search-backward ;; "=[ \t]*\\s\"*\\(\\w\\|\\s_\\)+\\s\"*[ \t]*" ;; bol ;; t)) ;; (forward-sexp -1) ;; (+ (current-column) ess-arg-function-offset)) ;; ;; "expression" is searched before "=". ;; ;; End ;; (t ;; (progn (goto-char (1+ containing-sexp)) ;; (current-column)))))) ;; (t ;; ;; Statement level. Is it a continuation or a new statement? ;; ;; Find previous non-comment character. ;; (goto-char indent-point) ;; (ess-backward-to-noncomment containing-sexp) ;; ;; Back up over label lines, since they don't ;; ;; affect whether our line is a continuation. ;; (while (eq (preceding-char) ?\,) ;; (ess-backward-to-start-of-continued-exp containing-sexp) ;; (beginning-of-line) ;; (ess-backward-to-noncomment containing-sexp)) ;; ;; Now we get the answer. ;; (if (ess-continued-statement-p) ;; ;; This line is continuation of preceding line's statement; ;; ;; indent ess-continued-statement-offset more than the ;; ;; previous line of the statement. ;; (progn ;; (ess-backward-to-start-of-continued-exp containing-sexp) ;; (+ ess-continued-statement-offset (current-column) ;; (if (save-excursion (goto-char indent-point) ;; (skip-chars-forward " \t") ;; (eq (following-char) ?{)) ;; ess-continued-brace-offset 0))) ;; ;; This line starts a new statement. ;; ;; Position following last unclosed open. ;; (goto-char containing-sexp) ;; ;; Is line first statement after an open-brace? ;; (or ;; ;; If no, find that first statement and indent like it. ;; (save-excursion ;; (forward-char 1) ;; (while (progn (skip-chars-forward " \t\n") ;; (looking-at "//")) ;; ;; Skip over comments following openbrace. ;; (forward-line 1)) ;; ;; The first following code counts ;; ;; if it is before the line we want to indent. ;; (and (< (point) indent-point) ;; (current-column))) ;; ;; If no previous statement, ;; ;; indent it relative to line brace is on. ;; ;; For open brace in column zero, don't let statement ;; ;; start there too. If ess-indent-offset is zero, ;; ;; use ess-brace-offset + ess-continued-statement-offset instead. ;; ;; For open-braces not the first thing in a line, ;; ;; add in ess-brace-imaginary-offset. ;; (+ (if (and (bolp) (zerop ess-indent-offset)) ;; (+ ess-brace-offset ess-continued-statement-offset) ;; ess-indent-offset) ;; ;; Move back over whitespace before the openbrace. ;; ;; If openbrace is not first nonwhite thing on the line, ;; ;; add the ess-brace-imaginary-offset. ;; (progn (skip-chars-backward " \t") ;; (if (bolp) 0 ess-brace-imaginary-offset)) ;; ;; If the openbrace is preceded by a parenthesized exp, ;; ;; move to the beginning of that; ;; ;; possibly a different line ;; (progn ;; (if (eq (preceding-char) ?\)) ;; (forward-sexp -1)) ;; ;; Get initial indentation of the line we are on. ;; (current-indentation)))))))))) (defvar OMG-syntax-table nil "Syntax table for Omegahat code.") (if S-syntax-table nil (setq S-syntax-table (make-syntax-table)) (modify-syntax-entry ?\\ "\\" S-syntax-table) (modify-syntax-entry ?+ "." S-syntax-table) (modify-syntax-entry ?- "." S-syntax-table) (modify-syntax-entry ?= "." S-syntax-table) (modify-syntax-entry ?% "." S-syntax-table) (modify-syntax-entry ?< "." S-syntax-table) (modify-syntax-entry ?> "." S-syntax-table) (modify-syntax-entry ?& "." S-syntax-table) (modify-syntax-entry ?| "." S-syntax-table) (modify-syntax-entry ?\' "\"" S-syntax-table) ;;FIXME: This fails (warning in compilation): ;;F "//" are 2 characters; ?// is invalid ;;F NEXT LINE IS BOGUS IN XEMACS, AJR ;;F (modify-syntax-entry ?// "<" S-syntax-table) ; open comment ;;F (modify-syntax-entry ?\n ">" S-syntax-table) ; close comment ;;(modify-syntax-entry ?. "w" S-syntax-table) ; "." used in S obj names (modify-syntax-entry ?. "_" S-syntax-table) ; see above/below, ; plus consider separation. (modify-syntax-entry ?$ "_" S-syntax-table) ; foo.bar$hack is 1 symbol (modify-syntax-entry ?_ "." S-syntax-table) (modify-syntax-entry ?* "." S-syntax-table) (modify-syntax-entry ?< "." S-syntax-table) (modify-syntax-entry ?> "." S-syntax-table) (modify-syntax-entry ?/ "." S-syntax-table)) (defvar OMG-editing-alist '((paragraph-start . (concat "^$\\|" page-delimiter)) (paragraph-separate . (concat "^$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (require-final-newline . mode-require-final-newline) (comment-start . "//") (comment-start-skip . "//+ *") (comment-column . 40) ;;(comment-indent-function . 'S-comment-indent) ;;(ess-comment-indent . 'S-comment-indent) ;;(ess-indent-line . 'S-indent-line) ;;(ess-calculate-indent . 'ess-calculate-indent) (indent-line-function . 'ess-indent-line) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) (ess-local-process-name . nil) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . S-syntax-table) (font-lock-defaults . '(ess-OMG-font-lock-defaults nil nil ((?\. . "w"))))) "General options for Omegahat source files.") (defvar ess-OMG-font-lock-defaults (append (list (cons "\\b[0-9]+\\b" 'font-lock-type-face) ; numbers (cons (concat "\\<" (regexp-opt ess-S-keywords 'enc-paren) "\\>") 'font-lock-keyword-face)) (list (cons (regexp-opt ess-S-assign-ops) 'font-lock-constant-face) ; assign (cons (concat "\\<" (regexp-opt ess-S-constants 'enc-paren) "\\>") 'font-lock-type-face) ; constants (cons (concat "\\<" (regexp-opt ess-S-modifyiers 'enc-paren) "\\>") 'font-lock-constant-face) ; modify search list or source (cons ess-S-function-name-regexp '(1 font-lock-function-name-face keep)) ; function name (cons "\\s.\\|\\s(\\|\\s)" 'font-lock-function-name-face) ;punctuation and parents (same as function not to cause vidual disturbance) )) ; keywords "Font-lock patterns used in `OMG' buffers.") ;;; Changes from S to S-PLUS 3.x. (standard S3 should be in ess-s-l.el !). (defconst OMG-help-sec-keys-alist '((?a . "ARGUMENTS:") (?b . "BACKGROUND:") (?B . "BUGS:") (?d . "DESCRIPTION:") (?D . "DETAILS:") (?e . "EXAMPLES:") (?n . "NOTE:") (?O . "OPTIONAL ARGUMENTS:") (?R . "REQUIRED ARGUMENTS:") (?r . "REFERENCES:") (?s . "SEE ALSO:") (?S . "SIDE EFFECTS:") (?u . "USAGE:") (?v . "VALUE:")) "Alist of (key . string) pairs for use in section searching.") ;;; `key' indicates the keystroke to use to search for the section heading ;;; `string' in an S help file. `string' is used as part of a ;;; regexp-search, and so specials should be quoted. (defconst ess-help-OMG-sec-regex "^[A-Z. ---]+:$" "Reg(ular) Ex(pression) of section headers in help file") ;;; S-mode extras of Martin Maechler, Statistik, ETH Zurich. ;;>> Moved things into --> ./ess-utils.el (provide 'ess-omg-l) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-omg-l.el ends here ess/lisp/ess-utils.el0000664000175000017500000014052312601651046013153 0ustar eddedd;;; ess-utils.el --- General Emacs utility functions used by ESS ;; Copyright (C) 1998--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: Martin Maechler ;; Created: 9 Sept 1998 ;; Maintainer: ESS-core ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: (eval-when-compile (require 'tramp) (require 'cl)) (defun ess-inside-string-or-comment-p (&optional pos) "Return non-nil if POSition [defaults to (point)] is inside string or comment (according to syntax)." ;;FIXME (defun ess-calculate-indent ..) can do that ... (interactive) (setq pos (or pos (point))) (let ((ppss (syntax-ppss pos))) (or (car (setq ppss (nthcdr 3 ppss))) (car (setq ppss (cdr ppss))) (nth 3 ppss)))) (defun ess-inside-string-p (&optional pos) "Return non-nil if point is inside string (according to syntax)." (interactive) ;; when narrowing the buffer in iESS the ppss cahce is screwed:( But it is ;; very fast, so don't bother for now. (let ((pps (syntax-ppss pos))) (nth 3 pps)) ;; (nth 3 (parse-partial-sexp (point-min) pos)) ) (defun ess-inside-comment-p (&optional pos) "Return non-nil if point is inside string (according to syntax)." (interactive) (setq pos (or pos (point))) (save-excursion (or (when font-lock-mode ;; this is a shortcut (works well usually) (let ((face (get-char-property pos 'face))) (eq 'font-lock-comment-face face))) (nth 4 (parse-partial-sexp (progn (goto-char pos) (point-at-bol)) pos))))) (defun ess-inside-brackets-p (&optional pos curly?) "Return t if position POS is inside brackets. POS defaults to point if no value is given. If curly? is non nil also return t if inside curly brackets." (save-excursion (let ((ppss (syntax-ppss pos)) (r nil)) (while (and (> (nth 0 ppss) 0) (not r)) (goto-char (nth 1 ppss)) (when (or (char-equal ?\[ (char-after)) (and curly? (char-equal ?\{ (char-after)))) (setq r t)) (setq ppss (syntax-ppss))) r))) (defun ess--extract-default-fl-keywords (keywords) "Extract the t-keywords from `ess-font-lock-keywords'." (delq nil (mapcar (lambda (c) (when (cdr c) (symbol-value (car c)))) (if (symbolp keywords) (symbol-value keywords) keywords)))) (defun ess-font-lock-toggle-keyword (keyword) (interactive (list (intern (ess-completing-read "Keyword to toggle" (mapcar (lambda (el) (symbol-name (car el))) (symbol-value ess-font-lock-keywords)) nil t)))) (let* ((kwds (symbol-value (if (eq major-mode 'ess-mode) ess-font-lock-keywords inferior-ess-font-lock-keywords))) (kwd (assoc keyword kwds))) (unless kwd (error "Keyword %s was not found in (inferior-)ess-font-lock-keywords list" keyword)) (if (cdr kwd) (setcdr kwd nil) (setcdr kwd t)) (let ((mode major-mode) (dialect ess-dialect) (fld (ess--extract-default-fl-keywords kwds))) ;; refresh font-lock defaults in all necessary buffers (mapc (lambda (b) (with-current-buffer b (when (and (eq major-mode mode) (eq ess-dialect dialect)) (setcar font-lock-defaults fld) (font-lock-refresh-defaults)))) (buffer-list))))) (defun ess--generate-font-lock-submenu (menu) "Internal, used to generate ESS font-lock submenu" (append (mapcar (lambda (el) `[,(symbol-name (car el)) (lambda () (interactive) (ess-font-lock-toggle-keyword ',(car el))) :style toggle :enable t :selected ,(cdr el)]) (cond ((eq major-mode 'ess-mode) (symbol-value ess-font-lock-keywords)) ((eq major-mode 'inferior-ess-mode) (symbol-value inferior-ess-font-lock-keywords)))) (list "-----" ["Save to custom" (lambda () (interactive) (let ((kwd (if (eq major-mode 'ess-mode) ess-font-lock-keywords inferior-ess-font-lock-keywords))) (customize-save-variable kwd (symbol-value kwd)))) t]))) (defun ess--generate-eval-visibly-submenu (menu) '(["yes" (lambda () (interactive) (setq ess-eval-visibly t)) :style radio :enable t :selected (eq ess-eval-visibly t)] ["nowait" (lambda () (interactive) (setq ess-eval-visibly 'nowait)) :style radio :enable t :selected (eq ess-eval-visibly 'nowait) ] ["no" (lambda () (interactive) (setq ess-eval-visibly nil)) :style radio :enable t :selected (eq ess-eval-visibly nil) ])) (defun ess-quote-special-chars (string) (replace-regexp-in-string "\"" "\\\\\\&" (replace-regexp-in-string ;; replace backslashes "\\\\" "\\\\" string nil t))) ;; simple alternative to ess-read-object-name-default of ./ess-inf.el : ;; is "wrongly" returning "p1" for word "p1.part2" : (defun ess-extract-word-name () "Get the word you're on (cheap algorithm). Use `ess-read-object-name-default' for a better but slower version." (save-excursion (re-search-forward "\\<\\w+\\>" nil t) (buffer-substring (match-beginning 0) (match-end 0)))) (defun ess-rep-regexp (regexp to-string &optional fixedcase literal verbose) "Instead of (replace-regexp..) -- do NOT replace in strings or comments. If FIXEDCASE is non-nil, do *not* alter case of replacement text. If LITERAL is non-nil, do *not* treat `\\' as special. If VERBOSE is non-nil, (message ..) about replacements." (let ((case-fold-search (and case-fold-search (not fixedcase))); t <==> ignore case in search (ppt (point)); previous point (p)) (while (and (setq p (re-search-forward regexp nil t)) (< ppt p)) (setq ppt p) (cond ((not (ess-inside-string-or-comment-p (1- p))) (if verbose (let ((beg (match-beginning 0))) (message "buffer in (match-beg.,p)=(%d,%d) is '%s'" beg p (buffer-substring beg p)))) (replace-match to-string fixedcase literal) ;;or (if verbose (setq pl (append pl (list p)))) ))) ;;or (if (and verbose pl) ;;or (message "s/%s/%s/ at %s" regexp to-string pl)) ) ) (defun ess-replace-regexp-dump-to-src (regexp to-string &optional dont-query verbose ensure-mode) "Depending on dont-query, call `ess-rep-regexp' or `query-replace-regexp' from the beginning of the buffer." (save-excursion (if (and ensure-mode (not (equal major-mode 'ess-mode))) (ess-mode)) (goto-char (point-min)) (if dont-query (ess-rep-regexp regexp to-string nil nil verbose) (query-replace-regexp regexp to-string nil)))) (defun ess-revert-wisely () "Revert from disk if file and buffer last modification times are different." (interactive) ; whether or not a revert is needed, force load local variables ; for example, suppose that you change the local variables and then ; save the file, a revert is unneeded, but a force load is (hack-local-variables) (if (not (verify-visited-file-modtime (current-buffer))) (progn (let ((ess-temp-store-point (point))) (revert-buffer t t) (goto-char ess-temp-store-point)) t) nil)) (defun ess-space-around (word &optional from verbose) "Replace-regexp .. ensuring space around all occurences of WORD, starting from FROM {defaults to (point)}." (interactive "d\nP"); Defaults: point and prefix (C-u) (save-excursion (goto-char from) (ess-rep-regexp (concat "\\([^ \t\n]\\)\\(\\<" word "\\>\\)") "\\1 \\2" nil nil verbose) (goto-char from) (ess-rep-regexp (concat "\\(\\<" word "\\>\\)\\([^ \t\n]\\)") "\\1 \\2" nil nil verbose) ) ) (defun ess-time-string (&optional clock) "Returns a string for use as a timestamp. + hr:min if CLOCK is non-nil, like \"13 Mar 1992\". Redefine to taste." (format-time-string (concat "%e %b %Y" (if clock ", %H:%M")))) ;;- From: friedman@gnu.ai.mit.edu (Noah Friedman) ;;- Date: 12 Feb 1995 21:30:56 -0500 ;;- Newsgroups: gnu.emacs.sources ;;- Subject: nuke-trailing-whitespace ;;- ;;- This is too trivial to make into a big todo with comments and copyright ;;- notices whose length exceed the size of the actual code, so consider it ;;- public domain. Its purpose is along similar lines to that of ;;- `require-final-newline', which is built in. I hope the names make it ;;- obvious. ;; (add-hook 'write-file-hooks 'nuke-trailing-whitespace) ;;or at least ;; (add-hook 'ess-mode-hook ;; (lambda () ;; (add-hook 'local-write-file-hooks 'nuke-trailing-whitespace))) (defvar ess-nuke-trailing-whitespace-p nil;disabled by default 'ask "*[Dis]activates (ess-nuke-trailing-whitespace). Disabled if `nil'; if `t', it works unconditionally, otherwise, the user is queried. Note that setting the default to `t' may not be a good idea when you edit binary files!") ;;; MM: Newer Emacsen now have delete-trailing-whitespace ;;; -- but no customization like nuke-trailing-whitespace-p .. (defun ess-nuke-trailing-whitespace () "Nuke all trailing whitespace in the buffer. Whitespace in this case is just spaces or tabs. This is a useful function to put on write-file-hooks. If the variable `ess-nuke-trailing-whitespace-p' is `nil', this function is disabled. If `t', unreservedly strip trailing whitespace. If not `nil' and not `t', query for each instance." (interactive) (let ((bname (buffer-name))) (cond ((or (string= major-mode "rmail-mode") (string= bname "RMAIL") nil)); do nothing.. (t (and (not buffer-read-only) ess-nuke-trailing-whitespace-p (save-match-data (save-excursion (save-restriction (widen) (goto-char (point-min)) (cond ((eq ess-nuke-trailing-whitespace-p t) (while (re-search-forward "[ \t]+$" (point-max) t) (delete-region (match-beginning 0) (match-end 0)))) (t (query-replace-regexp "[ \t]+$" ""))))))))) ;; always return nil, in case this is on write-file-hooks. nil)) (defun ess-kermit-get (&optional ess-file-arg ess-dir-arg) "Get a file with Kermit. WARNING: Experimental! From your *shell* buffer, start kermit and then log in to the remote machine. Open a file that starts with `ess-kermit-prefix'. From that buffer, execute this command. It will retrieve a file from the remote directory that you specify with the same name, but without the `ess-kermit-prefix'." (interactive) ;; (save-match-data (let ((ess-temp-file (if ess-file-arg ess-file-arg (buffer-name))) (ess-temp-file-remote-directory ess-dir-arg)) (if (string-equal ess-kermit-prefix (substring ess-temp-file 0 1)) (progn ;; I think there is a bug in the buffer-local variable handling in GNU Emacs 21.3 ;; Setting ess-kermit-remote-directory every time is somehow resetting it to the ;; default on the second pass. So, here's a temporary work-around. It will fail ;; if you change the default, so maybe this variable should not be customizable. ;; In any case, there is also trouble with local variables in XEmacs 21.4.9 and ;; 21.4.10. XEmacs 21.4.8 is fine. (if ess-temp-file-remote-directory (setq ess-kermit-remote-directory ess-temp-file-remote-directory) (if (string-equal "." ess-kermit-remote-directory) (setq ess-kermit-remote-directory (read-string "Remote directory to transfer file from: " ess-kermit-remote-directory)))) (setq ess-temp-file-remote-directory ess-kermit-remote-directory) ;; (setq ess-temp-file (substring ess-temp-file (match-end 0))) (ess-sas-goto-shell) (insert "cd " ess-temp-file-remote-directory "; " ess-kermit-command " -s " (substring ess-temp-file 1) " -a " ess-temp-file) (comint-send-input) ;; (insert (read-string "Press Return to connect to Kermit: " nil nil "\C-\\c")) ;; (comint-send-input) ;; (insert (read-string "Press Return when Kermit is ready to recieve: " nil nil ;; (concat "receive ]" ess-sas-temp-file))) ;; (comint-send-input) ;; (insert (read-string "Press Return when transfer is complete: " nil nil "c")) ;; (comint-send-input) (insert (read-string "Press Return when shell is ready: ")) (comint-send-input) (switch-to-buffer (find-buffer-visiting ess-temp-file)) (ess-revert-wisely) )))) (defun ess-kermit-send () "Send a file with Kermit. WARNING: Experimental! From a file that starts with `ess-kermit-prefix', execute this command. It will transfer this file to the remote directory with the same name, but without the `ess-kermit-prefix'." (interactive) ;; (save-match-data (let ((ess-temp-file (expand-file-name (buffer-name))) (ess-temp-file-remote-directory nil)) (if (string-equal ess-kermit-prefix (substring (file-name-nondirectory ess-temp-file) 0 1)) (progn ;; I think there is a bug in the buffer-local variable handling in GNU Emacs 21.3 ;; Setting ess-kermit-remote-directory every time is somehow resetting it to the ;; default on the second pass. Here's a temporary work-around. It will fail ;; if you change the default, so maybe this variable should not be customizable. ;; In any case, there is also trouble with local variables in XEmacs 21.4.9 and ;; 21.4.10. XEmacs 21.4.8 is fine. (if (string-equal "." ess-kermit-remote-directory) (setq ess-kermit-remote-directory (read-string "Remote directory to transfer file to: " ess-kermit-remote-directory))) (setq ess-temp-file-remote-directory ess-kermit-remote-directory) ;; (setq ess-temp-file (substring ess-temp-file (match-end 0))) (ess-sas-goto-shell) (insert "cd " ess-temp-file-remote-directory "; " ess-kermit-command " -a " (substring (file-name-nondirectory ess-temp-file) 1) " -g " ess-temp-file) (comint-send-input) ;; (insert (read-string "Press Return to connect to Kermit: " nil nil "\C-\\c")) ;; (comint-send-input) ;; (insert (read-string "Press Return when Kermit is ready to recieve: " nil nil ;; (concat "receive ]" ess-sas-temp-file))) ;; (comint-send-input) ;; (insert (read-string "Press Return when transfer is complete: " nil nil "c")) ;; (comint-send-input) (insert (read-string "Press Return when shell is ready: ")) (comint-send-input) (switch-to-buffer (find-buffer-visiting ess-temp-file)) (ess-revert-wisely) )))) (defun ess-search-except (regexp &optional except backward) "Search for a regexp, store as match 1, optionally ignore strings that match exceptions." (interactive) (let ((continue t) (exit nil)) (while continue (if (or (and backward (search-backward-regexp regexp nil t)) (and (not backward) (search-forward-regexp regexp nil t))) (progn (setq exit (match-string 1)) (setq continue (and except (string-match except exit))) (if continue (setq exit nil))) ;;else (setq continue nil)) ) exit)) (defun ess-save-and-set-local-variables () "If buffer was modified, save file and set Local Variables if defined. Return t if buffer was modified, nil otherwise." (interactive) (let ((ess-temp-point (point)) (ess-temp-return-value (buffer-modified-p))) ;; if buffer has changed, save buffer now (before potential revert) (if ess-temp-return-value (save-buffer)) ;; If Local Variables are defined, update them now ;; since they may have changed since the last revert ;; (save-excursion (beginning-of-line -1) (save-match-data (if (search-forward "End:" nil t) (revert-buffer t t))) ;; save-excursion doesn't save point in the presence of a revert ;; so you need to do it yourself (goto-char ess-temp-point) ess-temp-return-value)) (defun ess-get-file-or-buffer (file-or-buffer) "Return file-or-buffer if it is a buffer; otherwise return the buffer associated with the file which must be qualified by it's path; if the buffer does not exist, return nil." (interactive) (if file-or-buffer (if (bufferp file-or-buffer) file-or-buffer (find-buffer-visiting file-or-buffer)))) (defun ess-set-local-variables (alist &optional file-or-buffer) "Set local variables from ALIST in current buffer; if file-or-buffer is specified, perform action in that buffer." (interactive) (if file-or-buffer (set-buffer (ess-get-file-or-buffer file-or-buffer))) (mapcar (lambda (pair) (make-local-variable (car pair)) (set (car pair) (eval (cdr pair)))) alist)) (defun ess-clone-local-variables (from-file-or-buffer &optional to-file-or-buffer) "Clone local variables from one buffer to another buffer." (interactive) (ess-set-local-variables (ess-sas-create-local-variables-alist from-file-or-buffer) to-file-or-buffer)) (defun ess-return-list (ess-arg) "Given an item, if it is a list return it, else return item in a list." (if (listp ess-arg) ess-arg (list ess-arg))) (defun ess-find-exec (ess-root-arg ess-root-dir) "Given a root directory and the root of an executable file name, find it's full name and path, if it exists, anywhere in the sub-tree." (let* ((ess-tmp-dirs (directory-files ess-root-dir t "^[^.]")) (ess-tmp-return (ess-find-exec-completions ess-root-arg ess-root-dir)) (ess-tmp-dir nil)) (while ess-tmp-dirs (setq ess-tmp-dir (car ess-tmp-dirs) ess-tmp-dirs (cdr ess-tmp-dirs)) (if (file-accessible-directory-p ess-tmp-dir) (setq ess-tmp-return (nconc ess-tmp-return (ess-find-exec ess-root-arg ess-tmp-dir))))) ess-tmp-return)) (defun ess-find-exec-completions (ess-root-arg &optional ess-exec-dir) "Given the root of an executable file name, find all possible completions. Search for the executables in ESS-EXEC-DIR (which defaults to `exec-path' if no value is given)." (let* ((ess-exec-path (if ess-exec-dir (ess-return-list ess-exec-dir) exec-path)) (ess-tmp-exec nil) (ess-tmp-path-count (length ess-exec-path)) (ess-tmp-dir nil) (ess-tmp-files nil) (ess-tmp-file nil)) (while ess-exec-path (setq ess-tmp-dir (car ess-exec-path) ess-exec-path (cdr ess-exec-path)) (when (and (> (length ess-tmp-dir) 0) (file-accessible-directory-p ess-tmp-dir)) ;; the first test above excludes "" from exec-path, which can be ;; problematic with Tramp. (setq ess-tmp-files (file-name-all-completions ess-root-arg ess-tmp-dir)) (while ess-tmp-files (setq ess-tmp-file (concat (file-name-as-directory ess-tmp-dir) (car ess-tmp-files)) ess-tmp-files (cdr ess-tmp-files)) (if (and (file-executable-p ess-tmp-file) (not (file-directory-p ess-tmp-file))) ;; we have found a possible executable, so keep it. (setq ess-tmp-exec (nconc ess-tmp-exec (list ess-tmp-file))))))) ess-tmp-exec)) ;; Copyright (C) 1994 Simon Marshall. ;; Author: Simon Marshall ;; LCD Archive Entry: ;; unique|Simon Marshall|Simon.Marshall@mail.esrin.esa.it| ;; Functions and commands to uniquify lists or buffer text (cf. sort). ;; 23-Apr-1994|1.00|~/packages/unique.el.Z| ;; ;; MM: renamed from 'unique' to 'ess-unique', then (defun ess-uniq (list predicate) "Uniquify LIST, stably, deleting elements using PREDICATE. Return the list with subsequent duplicate items removed by side effects. PREDICATE is called with an element of LIST and a list of elements from LIST, and should return the list of elements with occurrences of the element removed. This function will work even if LIST is unsorted. See also `ess-uniq-list'." (let ((list list)) (while list (setq list (setcdr list (funcall predicate (car list) (cdr list)))))) list) (defun ess-uniq-list (items) "Delete all duplicate entries in ITEMS list, calling `ess-uniq'." (ess-uniq items 'delete)) (defun ess-drop-non-directories (file-strings) "Drop all entries that do not \"look like\" directories." (ess-flatten-list (mapcar 'file-name-directory file-strings))) (defun ess-flatten-list (&rest list) "Take the arguments and flatten them into one long list. Drops 'nil' entries." ;; Taken from lpr.el ;; `lpr-flatten-list' is defined here (copied from "message.el" and ;; enhanced to handle dotted pairs as well) until we can get some ;; sensible autoloads, or `flatten-list' gets put somewhere decent. ;; (ess-flatten-list '((a . b) c (d . e) (f g h) i . j)) ;; => (a b c d e f g h i j) (ess-flatten-list-1 list)) (defun ess-flatten-list-1 (list) (cond ((null list) (list)) ((consp list) (append (ess-flatten-list-1 (car list)) (ess-flatten-list-1 (cdr list)))) (t (list list)))) (defun ess-delete-blank-lines () "Convert 2 or more lines of white space into one." (interactive) (save-excursion (goto-char (point-min)) (save-match-data (while (search-forward-regexp "^[ \t]*\n[ \t]*\n" nil t) ;;(goto-char (match-beginning 0)) (delete-blank-lines))))) (defun ess-do-auto-fill () "This is the same as \\[do-auto-fill] in GNU emacs 21.3, with one major difference: if we could not find a suitable place to break the line, we simply do not break it (instead of breaking after the first word)." (let (fc justify bol give-up (fill-prefix fill-prefix)) (if (or (not (setq justify (current-justification))) (null (setq fc (current-fill-column))) (and (eq justify 'left) (<= (current-column) fc)) (save-excursion (beginning-of-line) (setq bol (point)) (and auto-fill-inhibit-regexp (looking-at auto-fill-inhibit-regexp)))) nil ;; Auto-filling not required (if (memq justify '(full center right)) (save-excursion (unjustify-current-line))) ;; Choose a fill-prefix automatically. (if (and adaptive-fill-mode (or (null fill-prefix) (string= fill-prefix ""))) (let ((prefix (fill-context-prefix (save-excursion (backward-paragraph 1) (point)) (save-excursion (forward-paragraph 1) (point))))) (and prefix (not (equal prefix "")) (setq fill-prefix prefix)))) (while (and (not give-up) (> (current-column) fc)) ;; Determine where to split the line. (let* (after-prefix (fill-point (let ((opoint (point)) bounce (first t)) (save-excursion (beginning-of-line) (setq after-prefix (point)) (and fill-prefix (looking-at (regexp-quote fill-prefix)) (setq after-prefix (match-end 0))) (move-to-column (1+ fc)) ;; Move back to the point where we can break the line. ;; We break the line between word or ;; after/before the character which has character ;; category `|'. We search space, \c| followed by ;; a character, or \c| following a character. If ;; not found, place the point at beginning of line. (while (or first ;; If this is after period and a single space, ;; move back once more--we don't want to break ;; the line there and make it look like a ;; sentence end. (and (not (bobp)) (not bounce) sentence-end-double-space (save-excursion (forward-char -1) (and (looking-at "\\. ") (not (looking-at "\\. "))))) (and (not (bobp)) (not bounce) fill-nobreak-predicate (funcall fill-nobreak-predicate))) (setq first nil) (re-search-backward "[ \t]\\|\\c|.\\|.\\c|\\|^") ;; If we find nowhere on the line to break it, ;; do not break it. Set bounce to t ;; so we will not keep going in this while loop. (if (<= (point) after-prefix) (setq bounce t) (if (looking-at "[ \t]") ;; Break the line at word boundary. (skip-chars-backward " \t") ;; Break the line after/before \c|. (forward-char 1)))) (if enable-multibyte-characters ;; If we are going to break the line after or ;; before a non-ascii character, we may have ;; to run a special function for the charset ;; of the character to find the correct break ;; point. (if (not (and (eq (charset-after (1- (point))) 'ascii) (eq (charset-after (point)) 'ascii))) (fill-find-break-point after-prefix))) ;; Let fill-point be set to the place where we end up. ;; But move back before any whitespace here. (skip-chars-backward " \t") (point))))) ;; See whether the place we found is any good. (if (save-excursion (goto-char fill-point) (and (not (bolp)) ;; There is no use breaking at end of line. (not (save-excursion (skip-chars-forward " ") (eolp))) ;; It is futile to split at the end of the prefix ;; since we would just insert the prefix again. (not (and after-prefix (<= (point) after-prefix))) ;; Don't split right after a comment starter ;; since we would just make another comment starter. (not (and comment-start-skip (let ((limit (point))) (beginning-of-line) (and (re-search-forward comment-start-skip limit t) (eq (point) limit))))))) ;; Ok, we have a useful place to break the line. Do it. (let ((prev-column (current-column))) ;; If point is at the fill-point, do not `save-excursion'. ;; Otherwise, if a comment prefix or fill-prefix is inserted, ;; point will end up before it rather than after it. (if (save-excursion (skip-chars-backward " \t") (= (point) fill-point)) (funcall comment-line-break-function t) (save-excursion (goto-char fill-point) (funcall comment-line-break-function t))) ;; Now do justification, if required (if (not (eq justify 'left)) (save-excursion (end-of-line 0) (justify-current-line justify nil t))) ;; If making the new line didn't reduce the hpos of ;; the end of the line, then give up now; ;; trying again will not help. (if (>= (current-column) prev-column) (setq give-up t))) ;; No good place to break => stop trying. (setq give-up t)))) ;; Justify last line. (justify-current-line justify t t) t))) (defun ess-select-frame-set-input-focus (frame) "Select FRAME, raise it, and set input focus, if possible. Copied almost verbatim from gnus-utils.el (but with test for mac added)." (cond ((featurep 'xemacs) (raise-frame frame) (select-frame frame) (focus-frame frame)) ;; The function `select-frame-set-input-focus' won't set ;; the input focus under Emacs 21.2 and X window system. ;;((fboundp 'select-frame-set-input-focus) ;; (defalias 'gnus-select-frame-set-input-focus ;; 'select-frame-set-input-focus) ;; (select-frame-set-input-focus frame)) (t (raise-frame frame) (select-frame frame) (cond ((and (memq window-system '(x mac)) (fboundp 'x-focus-frame)) (x-focus-frame frame)) ((eq window-system 'w32) (w32-focus-frame frame))) (when focus-follows-mouse (set-mouse-position frame (1- (frame-width frame)) 0))))) (defun ess-sci-to-dec () "For BUGS/S family: Express +/-0.000E+/-0 or +/-0.0e+/-00 as a decimal." (interactive) (setq buffer-read-only nil) (save-excursion (goto-char 0) (save-match-data (let ((ess-temp-replacement-string nil) (ess-temp-replacement-9 0) (ess-temp-replacement-diff 0)) (while (search-forward-regexp "-?[0-9][.][0-9][0-9]?[0-9]?[Ee][+-][0-9][0-9]?" nil t) (setq ess-temp-replacement-string (int-to-string (string-to-number (match-string 0)))) (setq ess-temp-replacement-diff (- (match-end 0) (match-beginning 0))) (save-match-data (setq ess-temp-replacement-9 (string-match "99999999999$" ess-temp-replacement-string)) (if (not ess-temp-replacement-9) (setq ess-temp-replacement-9 (string-match "000000000001$" ess-temp-replacement-string)))) (if ess-temp-replacement-9 (setq ess-temp-replacement-string (substring ess-temp-replacement-string 0 ess-temp-replacement-9))) (setq ess-temp-replacement-diff (- ess-temp-replacement-diff (string-width ess-temp-replacement-string))) (while (> ess-temp-replacement-diff 0) (setq ess-temp-replacement-string (concat ess-temp-replacement-string " ")) (setq ess-temp-replacement-diff (- ess-temp-replacement-diff 1))) (replace-match ess-temp-replacement-string)))))) (defun ess-num-or-zero (arg) "*If a number, then return that number, otherwise return 0." (or (and (numberp arg) arg) 0)) ; Timer management (defcustom ess-idle-timer-interval 1 "Number of idle seconds to wait before running function in `ess-idle-timer-functions'." :group 'ess) (defvar ess-idle-timer-functions nil "A list of functions to run each `ess-idle-timer-interval' idle seconds. If your function calls the process, you better use `ess-when-new-input' to wrap your call. If you call the subprocess please respect `ess-can-eval-in-background' variable. These functions are run with `run-hooks'. Use `add-hook' to add symbols to this variable. Most likely you will need a local hook. Then you should specify the LOCAL argument to `add-hook' and initialise it in `ess-mode-hook' or `ess-post-run-hook', or one of the more specialised hooks `ess-R-post-run-hook',`ess-stata-post-run-hook' etc. ") (defun ess--idle-timer-function nil "Internal function executed by `ess--idle-timer'" ;; (while-no-input (run-hooks 'ess-idle-timer-functions)) (require 'timer) (defvar ess--idle-timer (run-with-idle-timer ess-idle-timer-interval 'repeat 'ess--idle-timer-function) "Timer used to run `ess-idle-timer-functions'.") (defmacro ess-when-new-input (time-var &rest body) "BODY is evaluate only if the value of procss variable TIME-VAR is bigger than the time of the last user input (stored in 'last-eval' process variable). TIME-VAR is the name of the process variable which holds the access time. See the code for `ess-synchronize-dirs' and `ess-cache-search-list'. Returns nil when no current process, or process is busy, or time-var > last-eval. Otherwise, execute BODY and return the last value. If BODY is executed, set process variable TIME-VAR to (current-time). Variable *proc* is bound to the current process during the evaluation of BODY. Should be used in `ess-idle-timer-functions' which call the process to avoid excessive requests. " (declare (indent 1) (debug t)) `(with-ess-process-buffer 'no-error (let ((le (process-get *proc* 'last-eval)) (tv (process-get *proc* ',time-var))) (when (and (or (null tv) (null le) (time-less-p tv le)) (not (process-get *proc* 'busy))) (let ((out (progn ,@body))) (process-put *proc* ',time-var (current-time)) out))))) (defmacro ess--execute-electric-command (map &optional prompt wait exit-form &rest args) "Execute single-key comands defined in MAP till a key is pressed which is not part of map. Return the value of the lastly executed command. Single-key input commands are those that once executed do not requre the prefix command for subsequent invocation. PROMPT is passed to `read-event'. If WAIT is t, wait for next input and ignore the keystroke which triggered the command. Each command in map should accept one at least one argument, the most recent event (as read by `read-event'). ARGS are the supplementary arguments passed to the commands. EXIT-FORM should be supplied for a more refined control of the read-even loop. The loop is exited when EXIT-FORM evaluates to t. See examples in the tracebug code. " ;;VS[09-06-2013]: check: it seems that set-temporary-overlay-map is designed ;;for this type of things; see also repeat.el package. `(let* ((ev last-command-event) (command (lookup-key ,map (vector ev))) out exit ) (if (not (or ,wait command)) (message "%s is undefined" (key-description (this-command-keys))) (unless ,wait (setq out (and command (funcall command ev ,@args)))) (while (and (not exit) (setq command (lookup-key ,map (vector (setq ev (read-event ,prompt)))))) (setq out (funcall command ev ,@args)) (sleep-for .01) (setq exit ,exit-form)) (unless exit ;; push only if an event triggered the exit (push ev unread-command-events)) out))) (defmacro ess-execute-dialect-specific (command &optional prompt &rest args) "Execute dialect specific command. -- If command is not defined issue warning 'Not available for dialect X' -- if a function, execute it with ARGS -- If a string starting with 'http' or 'www', browse with `browse-url', otherwise execute the command in inferior process. -- If a string, interpret as a command to subprocess, and substitute ARGS with `(format ,command ,@args). When PROMPT is non-nil ask the user for a string value and prepend the response to ARGS. If prompt is a string just pass it to `read-string'. If a list, pass it to `ess-completing-read'. " `(if (null ,command) (message "Sorry, not implemented for dialect %s" ess-dialect) (let* ((com (if (symbolp ,command) (symbol-function ,command) ,command)) (prompt ',prompt) (resp (and prompt (if (stringp prompt) (read-string prompt) (apply 'ess-completing-read prompt)))) (args (append (list resp) ',args))) (cond ((functionp com) (apply com args)) ((and (stringp com) (string-match "^\\(http\\|www\\)" com)) (setq com (apply 'format com args)) (require 'browse-url) (browse-url com)) ((stringp com) (unless (string-match "\n$" com) (setq com (concat com "\n"))) (setq com (apply 'format com args)) (ess-eval-linewise com)) (t (error "Argument COMMAND must be either a function or a string")))))) ;; SJE: 2009-01-30 -- this contribution from ;; Erik Iverson (defun ess-tooltip-show-at-point (text xo yo) "Show a tooltip displaying 'text' at (around) point, xo and yo are x- and y-offsets for the toolbar from point." (let ( (fx (frame-parameter nil 'left)) (fy (frame-parameter nil 'top)) (fw (frame-pixel-width)) (fh (frame-pixel-height)) frame-left frame-top my-x-offset my-y-offset) ;; The following comment was found before code looking much like that ;; of frame-left and frame-top below in the file ;; tooltip-help.el. I include it here for acknowledgement, and I did observe ;; the same behavior with the Emacs window maximized under Windows XP. ;; -----original comment-------- ;; handles the case where (frame-parameter nil 'top) or ;; (frame-parameter nil 'left) return something like (+ -4). ;; This was the case where e.g. Emacs window is maximized, at ;; least on Windows XP. The handling code is "shamelessly ;; stolen" from cedet/speedbar/dframe.el ;; (contributed by Andrey Grigoriev) (setq frame-left (if (not (consp fx)) fx (if (eq (car fx) '-) (- (x-display-pixel-width) (car (cdr fx)) fw) (car (cdr fx))))) (setq frame-top (if (not (consp fy)) fy (if (eq (car fy) '-) (- (x-display-pixel-height) (car (cdr fy)) fh) (car (cdr fy))))) ;; calculate the offset from point, use xo and yo to adjust to preference (setq my-x-offset (+ (car(window-inside-pixel-edges)) (car(posn-x-y (posn-at-point))) frame-left xo)) (setq my-y-offset (+ (cadr(window-inside-pixel-edges)) (cdr(posn-x-y (posn-at-point))) frame-top yo)) (let ((tooltip-frame-parameters (cons (cons 'top my-y-offset) (cons (cons 'left my-x-offset) tooltip-frame-parameters)))) (tooltip-show text)) )) ;; (defun ess-tooltip-show-at-point (text xo yo) ;; (with-no-warnings ;; (pos-tip-show text ;; 'popup-tip-face ;; (point) ;; nil tooltip-hide-delay ;; popup-tip-max-width ;; nil xo yo))) (defvar ess-build-tags-command nil "Command passed to generate tags. If nil, `ess-build-tags-for-directory' uses the mode's imenu regexpresion. Othersiwe, it should be a string with two %s formats: one for directory and another for the output file.") (defun ess-build-tags-for-directory (dir tagfile) "Ask for directory and tag file and build tags for current dialect. If the current language defines `ess-build-tags-command' use it and ask the subprocess to build the tags. Otherwise use imenu regexp and call find .. | etags .. in a shell command. You must have 'find' and 'etags' programs installed. Use M-. to navigate to a tag. M-x `visit-tags-table' to append/replace the currently used tag table. If prefix is given, force tag generation based on imenu. Might be useful when different language files are also present in the directory (.cpp, .c etc)." (interactive "DDirectory to tag: GTags file (default TAGS): ") (when (or (eq (length (file-name-nondirectory tagfile)) 0) (file-directory-p tagfile)) (setq tagfile (concat (file-name-as-directory tagfile) "TAGS"))) ;; emacs find-tags doesn't play well with remote TAG files :( (when (file-remote-p tagfile) (require 'tramp) (setq tagfile (with-parsed-tramp-file-name tagfile foo foo-localname))) (when (file-remote-p dir) (setq dir (with-parsed-tramp-file-name dir foo foo-localname))) (if (and ess-build-tags-command (null current-prefix-arg)) (ess-eval-linewise (format ess-build-tags-command dir tagfile)) ;; else generate from imenu (unless (or imenu-generic-expression ess-imenu-generic-expression) ;; need both!! (error "No ess-tag-command found, and no imenu-generic-expression defined")) (let* ((find-cmd (format "find %s -type f -size 1M \\( -regex \".*\\.\\(cpp\\|jl\\|[RsrSch]\\(nw\\)?\\)$\" \\)" dir)) (regs (delq nil (mapcar (lambda (l) (if (string-match "'" (cadr l)) nil ;; remove for time being (format "/%s/\\%d/" (replace-regexp-in-string "/" "\\/" (nth 1 l) t) (nth 2 l)))) imenu-generic-expression))) (tags-cmd (format "etags -o %s --regex='%s' -" tagfile (mapconcat 'identity regs "' --regex='")))) (message "Building tags: %s" tagfile) ;; (dbg (format "%s | %s" find-cmd tags-cmd)) (when (= 0 (shell-command (format "%s | %s" find-cmd tags-cmd))) (message "Building tags .. ok!"))))) (defun ess-function-arguments (funname &optional proc) "Get FUNARGS from cache or ask the process for it. Return FUNARGS - a list with the first element being a cons (package_name . time_stamp_of_request), second element is a string giving arguments of the function as they appear in documentation, third element is a list of arguments of all methods. If package_name is nil, and time_stamp is less recent than the time of the last user interaction to the process, then update the entry. Package_name is also nil when funname was not found, or funname is a special name that contains :,$ or @. If PROC is given, it should be an ESS process which should be queried for arguments. " (when (and funname ;; usually returned by ess--funname.start (might be nil) (or proc (ess-process-live-p))) (let* ((proc (or proc (get-process ess-local-process-name))) (args (gethash funname (process-get proc 'funargs-cache))) (pack (caar args)) (ts (cdar args))) (when (and args (and (time-less-p ts (process-get proc 'last-eval)) (or (null pack) (equal pack "")))) ;; reset cache (setq args nil)) (or args (cadr (assoc funname (process-get proc 'funargs-pre-cache))) (and (not (process-get proc 'busy)) (with-current-buffer (ess-command (format ess-funargs-command (ess-quote-special-chars funname)) nil nil nil nil proc) (goto-char (point-min)) (when (re-search-forward "(list" nil t) (goto-char (match-beginning 0)) (setq args (ignore-errors (eval (read (current-buffer))))) (if args (setcar args (cons (car args) (current-time))))) ;; push even if nil (puthash (substring-no-properties funname) args (process-get proc 'funargs-cache)))))))) (defun ess-symbol-start () "Get initial position for objects completion." (let ((beg (car (bounds-of-thing-at-point 'symbol)))) (when (and beg (not (save-excursion (goto-char beg) (looking-at "/\\|.[0-9]")))) beg))) (defun ess-arg-start () "Get initial position for args completion" (when (not (ess-inside-string-p)) (when (ess--funname.start) (if (looking-back "[(,]+[ \t\n]*") (point) (ess-symbol-start))))) (defvar ess--funname.start nil) (defun ess--funname.start (&optional look-back) "If inside a function call, return (FUNNAMME . START) where FUNNAME is a function name found before ( and START is where FUNNAME starts. LOOK-BACK is a number of characters to look back; defaults to 2000. As the search might get quite slow for files with thousands of lines. Also store the cons in 'ess--funname.start for potential use later." (save-excursion (save-restriction (let* ((proc (get-buffer-process (current-buffer))) (mark (and proc (process-mark proc)))) (if (and mark (>= (point) mark)) (narrow-to-region mark (point))) (and ess-noweb-mode (ess-noweb-narrow-to-chunk)) (unless (ess-inside-string-p) (setq ess--funname.start (condition-case nil ;; check if it is inside a functon (progn ;; for the sake of big buffers, look only 1000 chars back (narrow-to-region (max (point-min) (- (point) 1000)) (point)) (up-list -1) (while (not (looking-at "(")) (up-list -1)) (let ((funname (symbol-name (symbol-at-point)))) (when (and funname (not (member funname ess-S-non-functions))) (cons funname (- (point) (length funname)))) )) (error nil)) )))))) (defun ess--inject-code-from-file (file) ;; this is different from ess-load-file (let ((content (with-temp-buffer (insert-file-contents file) (buffer-string)))) (when (string= ess-dialect "R") ;; don't detect intermediate prompts (setq content (concat "{" content "}\n"))) (ess-command content))) (provide 'ess-utils) ;;; ess-utils.el ends here ess/lisp/tmp/0000775000175000017500000000000012423756516011506 5ustar eddeddess/lisp/tmp/ess-rlib.el0000664000175000017500000002036012423756516013551 0ustar eddedd;;; ess-rlib.el --- browse contents of R packages. ;; Stephen Eglen, GPL applies. ;; ;; Primitive browswing facilities for the list of packages, and ;; the functions within a package. Use RET or mouse-2 to click on a ;; link and see either contents of a package or the function. ;; ;; To use, simply start a R session, eval this buffer, ;; then, in the R buffer, do ;; source("ess-rlib.R") ;; to load the changes to the data() and print.libraryIQR() functions. ;; ;; Then do M-x ;; ess-rpackage or use C-x C-e at end of one of following lines: ;; ;; (ess-rpackage "ctest") ;; okay ;; ;; (ess-rpackage "foreign") ;; okay, but fails on "S3 read functions" ;; ;; (ess-rpackage "eda") ;; shows help for lib, but won't show individual files unless package ;; has been loaded. How to show help without loading the package first? ;; (ess-rpackage "ts") ;; not so good, due to regexp failure! ;; (ess-rpackage "base") ;; (ess-rpackage "mva") ;; one problem, near end of buffer. ;; Presumably, adding link markup to the output from library() command ;; would help here so that only functions will get converted into ;; links. This would be more robust than using regexps. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (ess-rdata) ;; This command will browse the output of the data() command, using ;; the extra markup of data names. Output goes to the *ess-rdata* ;; buffer. It currently just converts the data names into links ;; (highlight with mouse; underline), but no action is made on the ;; links. Kurt suggested before making e.g. ? bring up help on that ;; data topic, and RET to load the package. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun ess-rpackage (package) "View functions within the package named PACKAGE. The package must have already been loaded; if the package is not loaded, the functions in it can still be viewed, but the help for those functions cannot be viewed. This function is therefore currently restricted to show contents for loaded packages only. This calls an extra R funcition named funs.for.package()." (interactive (let () (list (completing-read "Package name: " (mapcar 'list (ess-rpackage-list)))))) (let (beg str (all t)) (setq str (concat "funs.for.package('" package "')\n")) (ess-execute str nil "ess-rlib") (pop-to-buffer "*ess-rlib*") (goto-char (point-min)) (while (re-search-forward "^[^ ]" nil t) (beginning-of-line) (setq beg (point)) (re-search-forward "\\s-") (add-text-properties beg (1- (point)) '(face underline mouse-face highlight help-xref function)) )) ;; End of mark up, so add some text to the top of buffer. (goto-char (point-min)) (insert "Functions in package " package ":\n\n") (goto-char (point-min)) (ess-rpackage-mode) ) (defun ess-rpackage-list () "Return list of packages currently loaded." (save-window-excursion (ess-execute "cat(.packages(), '\\n')") (pop-to-buffer "*ess-output*") (cdr (reverse (split-string (buffer-substring (point-min) (point-max)) " "))))) (defun ess-rpackage-1 (lib) "View help available for a topic. Lib should either be blank or name of a package. It currently uses regexps to guess which parts of the output are function and package names. This mostly works, but for a classic failure, see output from viewing the base package. Old version." (interactive "sPackage name (leave blank for lib list): ") ;; todo: would it be worth getting completion for package list? (let (beg str (all t)) (setq str (if (equal lib "") "library()" (setq all nil) (concat "library(help=" lib ")\n"))) (ess-execute str nil "ess-rlib") (pop-to-buffer "*ess-rlib*") (if all (ess-markup-libnames) (re-search-forward "^Index:") (while (re-search-forward "^[^ ]+ " nil t) (beginning-of-line) (setq beg (point)) (re-search-forward "[ \t]") (add-text-properties beg (1- (point)) '( face underline mouse-face highlight help-xref function)) (end-of-line) )) ;; end of mark up (goto-char (point-min)) (ess-rpackage-mode) ) ) (defun ess-markup-libnames () "Markup the output from library() command." (goto-char (point-min)) (while (re-search-forward "^\\\\package{" nil t) (delete-region (point) (progn (beginning-of-line) (point))) (setq beg (point)) (search-forward "}") (delete-backward-char 1) (add-text-properties beg (point) '(face underline mouse-face highlight help-xref library)) (end-of-line))) (defun ess-markup-libnames-old () "Markup the output from library() command." (goto-char (point-min)) (while (re-search-forward "^[^ ]+ " nil t) (beginning-of-line) (if (not (looking-at "Packages in library")) (progn (setq beg (point)) (re-search-forward "[ \t]") (add-text-properties beg (1- (point)) '(face underline mouse-face highlight help-xref library)))) (end-of-line) )) ;;; Set up the major mode for viewing. (define-derived-mode ess-rpackage-mode text-mode "Rlib" "Major mode for browsing package contents. \\{ess-rpackage-mode-map}" (setq case-fold-search nil)) ;; define the keys. (if (featurep 'xemacs) (define-key ess-rpackage-mode-map [button2] 'ess-rpackage-mouse-view) (define-key ess-rpackage-mode-map [mouse-2] 'ess-rpackage-mouse-view) ) (define-key ess-rpackage-mode-map [return] 'ess-rpackage-show-help) (define-key ess-rpackage-mode-map "\t" 'help-next-ref) (if (featurep 'xemacs) (define-key ess-rpackage-mode-map [iso-left-tab] 'help-previous-ref) (define-key ess-rpackage-mode-map [] 'help-previous-ref)) (defun ess-rpackage-show-help () "Show ESS help for item on current line." (interactive) (let (beg fn type) (save-excursion (beginning-of-line) (setq beg (point)) (if (looking-at "[ \t\n]") (message "No function on this line.") (setq type (get-text-property (point) 'help-xref)) (re-search-forward "\\s-") (setq fn (buffer-substring-no-properties beg (1- (point)))) (if (equal type 'function) (ess-display-help-on-object fn) (ess-rpackage fn)))))) (defun ess-rpackage-mouse-view (event) "In rdired, visit the object on the line you click on." ;; copied from ess-rdired. (interactive "e") (let (window pos) (save-excursion (if (featurep 'xemacs) ;; XEmacs (setq window (event-window event) pos (event-point event)) ;; Emacs (setq window (posn-window (event-end event)) pos (posn-point (event-end event)))) (if (not (windowp window)) (error "No file chosen")) (set-buffer (window-buffer window)) (goto-char pos) (ess-rpackage-show-help)))) (defun ess-rdata () "Show the data currently available. Currently the links are not active -- nothing is set up to handle either pressing RET or mouse-2 over a data name. Kurt suggested maybe `?' on a data item lists its help, and RET to load the data set?" (interactive) (let (beg str (all t)) (setq str "data()") (ess-execute str nil "ess-rdata") (pop-to-buffer "*ess-rdata*") ;; Now mark up the buffer. (goto-char (point-min)) (while (re-search-forward "^\\\\data{" nil t) (delete-region (point) (progn (beginning-of-line) (point))) (setq beg (point)) (search-forward "}") (delete-backward-char 1) (add-text-properties beg (point) '(face underline mouse-face highlight help-xref library)) (end-of-line))) (goto-char (point-min)) ) ess/lisp/tmp/ess-rlib.R0000664000175000017500000001754012423756516013360 0ustar eddedd## My modification of R 1.7.1 functions to help with iESS... Search for ## iESS to see the changes I made. ## source("ess-rlib.R") before running (ess-rpackage "") print.libraryIQR <- function (x, ...) { sQuote <- function(s) paste("'", s, "'", sep = "") db <- x$results out <- if (nrow(db) == 0) NULL else lapply(split(1:nrow(db), db[, "LibPath"]), function(ind) db[ind, c("Package", "Title"), drop = FALSE]) outFile <- tempfile("RlibraryIQR") outConn <- file(outFile, open = "w") first <- TRUE for (lib in names(out)) { writeLines(paste(ifelse(first, "", "\n"), "Packages in library ", sQuote(lib), ":\n", sep = ""), outConn) if (!is.null(getOption("STERM")) && grep("^iESS", getOption("STERM")) == 1) writeLines(formatDL(paste("\\package{", out[[lib]][, "Package"], "}", sep=''), out[[lib]][, "Title"]), outConn) else writeLines(formatDL(out[[lib]][, "Package"], out[[lib]][, "Title"]), outConn) first <- FALSE } if (first) { close(outConn) unlink(outFile) writeLines("no packages found") } else { if (!is.null(x$footer)) writeLines(c("\n", x$footer), outConn) close(outConn) file.show(outFile, delete.file = TRUE, title = "R packages available") } invisible(x) } data <- function (..., list = character(0), package = .packages(), lib.loc = NULL, verbose = getOption("verbose")) { sQuote <- function(s) paste("'", s, "'", sep = "") names <- c(as.character(substitute(list(...))[-1]), list) if (!missing(package)) if (is.name(y <- substitute(package))) package <- as.character(y) found <- FALSE fsep <- .Platform$file.sep paths <- .find.package(package, lib.loc, verbose = verbose) if (is.null(lib.loc)) paths <- c(.path.package(package, TRUE), getwd(), paths) paths <- unique(paths[file.exists(paths)]) nodata <- !(file.exists(file.path(paths, "data")) & file.info(file.path(paths, "data"))$isdir) if (any(nodata)) { if (!missing(package) && (length(package) > 0)) { packagesWithNoData <- package[package %in% sapply(paths[nodata], basename)] if (length(packagesWithNoData) > 1) { warning(paste("packages", paste(sQuote(packagesWithNoData), collapse = ", "), "contain no datasets")) } else if (length(packagesWithNoData) == 1) { warning(paste("package", sQuote(packagesWithNoData), "contains no datasets")) } } paths <- paths[!nodata] } if (length(names) == 0) { db <- matrix(character(0), nr = 0, nc = 4) noindex <- character(0) for (path in paths) { entries <- NULL if (file.exists(INDEX <- file.path(path, "Meta", "data.rds"))) { entries <- .readRDS(INDEX) } else if (file.exists(INDEX <- file.path(path, "data", "00Index.rds"))) { entries <- .readRDS(INDEX) } else if (file.exists(INDEX <- file.path(path, "data", "00Index.dcf"))) { entries <- read.dcf(INDEX) entries <- cbind(colnames(entries), c(entries)) } else if (file.exists(INDEX <- file.path(path, "data", "00Index"))) entries <- read.00Index(INDEX) else { if (length(list.files(file.path(path, "data"))) > 0) noindex <- c(noindex, basename(path)) } if (NROW(entries) > 0) { ## SJE if (!is.null(getOption("STERM")) && grep("^iESS", getOption("STERM")) == 1) entries[,1] <- paste("\\data{",entries[,1], "}", sep='' ) db <- rbind(db, cbind(basename(path), dirname(path), entries)) } } colnames(db) <- c("Package", "LibPath", "Item", "Title") if (length(noindex) > 0) { if (!missing(package) && (length(package) > 0)) { packagesWithNoIndex <- package[package %in% noindex] if (length(packagesWithNoIndex) > 1) { warning(paste("packages", paste(sQuote(packagesWithNoIndex), collapse = ", "), "contain data sets but no index")) } else if (length(packagesWithNoIndex) == 1) warning(paste("package", sQuote(packagesWithNoIndex), "contains data sets but no index")) } } footer <- if (missing(package)) paste("Use ", sQuote(paste("data(package =", ".packages(all.available = TRUE))")), "\n", "to list the data sets in all *available* packages.", sep = "") else NULL y <- list(type = "data", title = "Data sets", header = NULL, results = db, footer = footer) class(y) <- "packageIQR" return(y) } paths <- file.path(paths, "data") for (name in names) { files <- NULL for (p in paths) { if (file.exists(file.path(p, "Rdata.zip"))) { if (file.exists(fp <- file.path(p, "filelist"))) files <- c(files, file.path(p, scan(fp, what = "", quiet = TRUE))) else warning(paste(sQuote("filelist"), "is missing for dir", sQuote(p))) } else { files <- c(files, list.files(p, full = TRUE)) } } files <- files[grep(name, files)] found <- FALSE if (length(files) > 1) { good <- c("R", "r", "RData", "rdata", "rda", "tab", "txt", "TXT", "csv", "CSV") exts <- sub(".*\\.", "", files) o <- match(exts, good, nomatch = 100) paths <- dirname(files) paths <- factor(paths, levels = paths) files <- files[order(paths, o)] } if (length(files) > 0) { subpre <- paste(".*", fsep, sep = "") for (file in files) { if (verbose) cat("name=", name, ":\t file= ...", fsep, sub(subpre, "", file), "::\t", sep = "") if (found) break found <- TRUE ext <- sub(".*\\.", "", file) if (sub(subpre, "", file) != paste(name, ".", ext, sep = "")) found <- FALSE else { zfile <- zip.file.extract(file, "Rdata.zip") switch(ext, R = , r = source(zfile, chdir = TRUE), RData = , rdata = , rda = load(zfile, envir = .GlobalEnv), TXT = , txt = , tab = assign(name, read.table(zfile, header = TRUE), env = .GlobalEnv), CSV = , csv = assign(name, read.table(zfile, header = TRUE, sep = ";"), env = .GlobalEnv), found <- FALSE) if (zfile != file) unlink(zfile) } if (verbose) cat(if (!found) "*NOT* ", "found\n") } } if (!found) warning(paste("Data set", sQuote(name), "not found")) } invisible(names) } ## This function needed for ess-rpackage, Sun 14 Sep 2003 funs.for.package <- function(package) { x <- .readRDS(file = system.file("Meta", "Rd.rds", package = package)) writeLines(formatDL(unlist(x[,5]), rep(x[,4], sapply(x[,5], length)))) } ess/lisp/tmp/ess-dump.el0000664000175000017500000001715512423756516013576 0ustar eddedd;;; ess-dump.el --- Getting objects into text files for editing ;; Copyright (C) 2000--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Original Author: A.J. Rossini ;; Created: 3 Sept 2000 ;; Maintainers: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for sending statistical objects to text files for editing. ;; ;; THIS IS STRICTLY NOT USED, BUT IS FOR PLANNING. ;;; Code: ; Requires and autoloads (require 'ess) (defun ess-check-source (fname) "If file FNAME has an unsaved buffer, offer to save it. Returns t if the buffer existed and was modified, but was not saved." (let ((buff (get-file-buffer fname))) ;; RMH: Corrections noted below are needed for C-c C-l to work ;; correctly when issued from *S* buffer. ;; The following barfs since ;; 1. `if' does not accept a buffer argument, `not' does. ;; 2. (buffer-file-name) is not necessarily defined for *S* ;;(if buff ;; (let ((deleted (not (file-exists-p (buffer-file-name))))) ;; Next 2 lines are RMH's solution: (if (not(not buff)) (let ((deleted (not (file-exists-p fname)))) (if (and deleted (not (buffer-modified-p buff))) ;; Buffer has been silently deleted, so silently save (save-excursion (set-buffer buff) (set-buffer-modified-p t) (save-buffer)) (if (and (buffer-modified-p buff) (or ess-mode-silently-save (y-or-n-p (format "Save buffer %s first? " (buffer-name buff))))) (save-excursion (set-buffer buff) (save-buffer)))) (buffer-modified-p buff))))) (defun ess-dump-object-into-edit-buffer (object) "Edit an ESS object in its own buffer. Without a prefix argument, this simply finds the file pointed to by `ess-source-directory'. If this file does not exist, or if a prefix argument is given, a dump() command is sent to the ESS process to generate the source buffer." (interactive (progn (ess-force-buffer-current "Process to dump from: ") (ess-read-object-name "Object to edit: "))) (let* ((dirname (file-name-as-directory (if (stringp ess-source-directory) ess-source-directory (save-excursion (set-buffer (process-buffer (get-ess-process ess-local-process-name))) (ess-setq-vars-local ess-customize-alist) (apply ess-source-directory nil))))) (filename (concat dirname (format ess-dump-filename-template object))) (old-buff (get-file-buffer filename))) ;; If the directory doesn't exist, offer to create it (if (file-exists-p (directory-file-name dirname)) nil (if (y-or-n-p ; Approved (format "Directory %s does not exist. Create it? " dirname)) (make-directory (directory-file-name dirname)) (error "Directory %s does not exist." dirname))) ;; Three options: ;; (1) Pop to an existing buffer containing the file in question ;; (2) Find an existing file ;; (3) Create a new file by issuing a dump() command to S ;; Force option (3) if there is a prefix arg (if current-prefix-arg (ess-dump-object object filename) (if old-buff (progn (pop-to-buffer old-buff) (message "Popped to edit buffer.")) ;; No current buffer containing desired file (if (file-exists-p filename) (progn (ess-find-dump-file-other-window filename) (message "Read %s" filename)) ;; No buffer and no file (ess-dump-object object filename)))))) (defun ess-dump-object (object filename) "Dump the ESS object OBJECT into file FILENAME." (let ((complete-dump-command (format inferior-ess-dump-command object filename))) (if (file-writable-p filename) nil (error "Can't dump %s as %f is not writeable." object filename)) ;; Make sure we start fresh (if (get-file-buffer filename) (or (kill-buffer (get-file-buffer filename)) (error "Aborted."))) (ess-command complete-dump-command) (message "Dumped in %s" filename) (ess-find-dump-file-other-window filename) ;; PD, 1Apr97 ;;This ensures that the object gets indented according to ess-mode, ;;not as the R/S deparser does it. At the same time, it gets rid ;;of the mess generated by sending TAB characters to the readline ;;functions in R when you eval-buffer-*. (indent-region (point-min-marker) (point-max-marker) nil) (set-buffer-modified-p nil) ;; Don't make backups for temporary files; it only causes clutter. ;; The ESS object itself is a kind of backup, anyway. (if ess-keep-dump-files nil (make-local-variable 'make-backup-files) (setq make-backup-files nil)) ;; Don't get confirmation to delete dumped files when loading (if (eq ess-keep-dump-files 'check) (setq ess-keep-dump-files nil)) ;; Delete the file if necessary (if ess-delete-dump-files (delete-file (buffer-file-name))))) (defun ess-find-dump-file-other-window (filename) "Find ESS source file FILENAME in another window." (if (file-exists-p filename) nil (ess-write-to-dribble-buffer (format "%s does not exist. Bad dump, starting fresh." filename))) ;; Generate a buffer with the dumped data (find-file-other-window filename) (ess-mode ess-customize-alist) (auto-save-mode 1) ; Auto save in this buffer (setq ess-local-process-name ess-current-process-name) (if ess-function-template (progn (goto-char (point-max)) (if (re-search-backward ess-dumped-missing-re nil t) (progn (replace-match ess-function-template t t) (set-buffer-modified-p nil) ; Don't offer to save if killed now (goto-char (point-min)) (condition-case nil ;; This may fail if there are no opens (down-list 1) (error nil))))))) ;; AJR: XEmacs, makes sense to dump into "other frame". (defun ess-dump-object-into-edit-buffer-other-frame (object) "Edit an ESS object in its own frame." (switch-to-buffer-other-frame (ess-dump-object-into-edit-buffer object))) (provide 'ess-dump) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-dump.el ends here ess/lisp/ess-send.el0000664000175000017500000000512512423756516012754 0ustar eddedd;; First pass at context sensitive help. (defun ess-eval-expanded (&optional head tail commands-buffer) "Send the expanded current region or word-at-point to the inferior-ess process after first concating the head and tail. If the region is active, the function uses the current region. If the region is not active, the function uses the word-at-point" (interactive) (if (not head) (setq head "summary(")) (if (not tail) (setq tail ")")) (if (not commands-buffer) (setq commands-buffer (get-buffer-create "tmp-buffer"))) (let (kill-ring current-word) (if mark-active (progn (copy-region-as-kill (region-beginning) (region-end)) (setq current-word (current-kill 1))) (setq current-word (word-at-point))) (ess-command (concat head current-word tail) commands-buffer))) ;; this is probably not the best key or key-map (define-key ess-mode-map "\C-c\C-w" 'ess-eval-expanded) ;; previous version, sends expanded text to Commands window ;;;(defun ess-eval-expanded (&optional head tail) "" ;;; (interactive) ;;; (if (not head) (setq head "summary(")) ;;; (if (not tail) (setq tail ")")) ;;; (let (kill-ring ;;; current-word) ;;; (if mark-active ;;; (progn ;;; (copy-region-as-kill (region-beginning) (region-end)) ;;; (setq current-word (current-kill 1))) ;;; (setq current-word (word-at-point))) ;;; (ess-eval-linewise (concat head current-word tail)))) ;;;(define-key ess-mode-map "\C-c\C-w" 'ess-eval-expanded) ;; First working version: set of three functions. ;; The region and word-at-point are in independent functions and ;; and are called by the main function. ;;(defun ess-eval-expanded (&optional head tail) "" ;; (interactive) ;; (if mark-active (ess-eval-expanded-region ;; (region-beginning) (region-end) head tail) ;; (ess-eval-expanded-word-at-point head tail))) ;;(defun ess-eval-expanded-region (start end &optional head tail) ;; "Send the expanded current region to the inferior ESS process after ;;first concating the head and tail." ;; (let (kill-ring ;; expanded-region) ;; (copy-region-as-kill start end) ;; (setq expanded-region (concat head (current-kill 1) tail)) ;; (ess-eval-linewise expanded-region)) ;;) ;; (setq debug-on-error t) ;;(defun ess-eval-expanded-word-at-point (&optional head tail) ;; "Send the expanded word-at-point to the inferior ESS process after ;;first concating the head and tail." ;; (let (expanded-region) ;; (setq expanded-region (concat head (word-at-point) tail)) ;; (ess-eval-linewise expanded-region)) ;;) ess/lisp/TODO0000664000175000017500000000211312423756516011373 0ustar eddedd -*- mode: text -*- o Improve on "Sweave mode" aka "working with '*.Rnw'" aka ess-noweb-mode.el - Latex <-> Pdflatex: should be `switchable' like in AUCtex - more things "to be like AUCtex: .... ... - Better/new keybindings + walk through idea (MM): - re-assign C-c C-c to "eval-chunk-and-step" (not yet there) - may assign C-c RET to "eval-chunk[-and-go]" where the ``-and-go'' part is switchable either by Prefix (==> "C-u C-c RET" would mean "and-go") or also by a customizable variable o ---------------- Entries from 2001 by Tony : --------------------------- Solve now: 1. Get ess-menu to "do the right thing" on startup. Make sure that it is only started when sensible/available. Solve later: 1. "ess-(new|change)-buffer-this-process" possible to detach processes from buffers. (for sending output from a single buffer to many. This could be done by running a 2-stage filter (the "real" as the real, and the others as copies with append. 2. look at semantic for rewriting. 3. inferior-ess rewrite. 4. ess/lisp/ess-r-d.el0000664000175000017500000022617012632537307012507 0ustar eddedd;;; ess-r-d.el --- R customization ;; Copyright (C) 1997--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2015 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: A.J. Rossini ;; Created: 12 Jun 1997 ;; Maintainer: ESS-core ;; Keywords: languages, statistics ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the R customizations for ESS. See ess-s-l.el ;; for general S language customizations. ;;; Code: ;;; Autoloads and Requires (ess-message "[ess-r-d:] (require 'ess-s-l)") (require 'ess-s-l) (require 'eldoc) (require 'ess-developer) (require 'ess-help) (require 'ess-roxy) (require 'ess-tracebug) (require 'compile); for compilation-* below (require 'easymenu) (require 'ess-r-completion) (require 'ess-r-syntax) (autoload 'ess-r-args-show "ess-r-args" "(Autoload)" t) (autoload 'ess-r-args-auto-show "ess-r-args" "(Autoload)" t) (autoload 'ess-help-underline "ess-help" "(Autoload)" t) (autoload 'ess--flush-help-into-current-buffer "ess-help" "(Autoload)" t) (defvar ess-dev-map (let (ess-dev-map) (define-prefix-command 'ess-dev-map) ;; Note: some of these comand are automatically redefined by those in (define-key ess-dev-map "\C-t" 'ess-toggle-developer) (define-key ess-dev-map "t" 'ess-toggle-developer) ;; (define-key ess-dev-map "\C-T" 'ess-toggle-tracebug) (define-key ess-dev-map "T" 'ess-toggle-tracebug) (define-key ess-dev-map "\C-a" 'ess-developer-add-package) (define-key ess-dev-map "a" 'ess-developer-add-package) (define-key ess-dev-map "\C-r" 'ess-developer-remove-package) (define-key ess-dev-map "r" 'ess-developer-remove-package) (define-key ess-dev-map "\C-l" 'ess-developer-load-package) (define-key ess-dev-map "l" 'ess-developer-load-package) (define-key ess-dev-map "`" 'ess-show-traceback) (define-key ess-dev-map "~" 'ess-show-call-stack) (define-key ess-dev-map "\C-w" 'ess-watch) (define-key ess-dev-map "w" 'ess-watch) (define-key ess-dev-map "\C-d" 'ess-debug-flag-for-debugging) (define-key ess-dev-map "d" 'ess-debug-flag-for-debugging) (define-key ess-dev-map "\C-u" 'ess-debug-unflag-for-debugging) (define-key ess-dev-map "u" 'ess-debug-unflag-for-debugging) (define-key ess-dev-map [(control ?D)] 'ess-debug-unflag-for-debugging) (define-key ess-dev-map "\C-b" 'ess-bp-set) (define-key ess-dev-map "b" 'ess-bp-set) (define-key ess-dev-map [(control ?B)] 'ess-bp-set-conditional) (define-key ess-dev-map "B" 'ess-bp-set-conditional) (define-key ess-dev-map "\C-L" 'ess-bp-set-logger) (define-key ess-dev-map "L" 'ess-bp-set-logger) (define-key ess-dev-map "\C-o" 'ess-bp-toggle-state) (define-key ess-dev-map "o" 'ess-bp-toggle-state) (define-key ess-dev-map "\C-k" 'ess-bp-kill) (define-key ess-dev-map "k" 'ess-bp-kill) (define-key ess-dev-map "\C-K" 'ess-bp-kill-all) (define-key ess-dev-map "K" 'ess-bp-kill-all) (define-key ess-dev-map "\C-n" 'ess-bp-next) (define-key ess-dev-map "n" 'ess-bp-next) (define-key ess-dev-map "i" 'ess-debug-goto-input-event-marker) (define-key ess-dev-map "I" 'ess-debug-goto-input-event-marker) (define-key ess-dev-map "\C-p" 'ess-bp-previous) (define-key ess-dev-map "p" 'ess-bp-previous) (define-key ess-dev-map "\C-e" 'ess-debug-toggle-error-action) (define-key ess-dev-map "e" 'ess-debug-toggle-error-action) (define-key ess-dev-map "0" 'ess-electric-selection) (define-key ess-dev-map "1" 'ess-electric-selection) (define-key ess-dev-map "2" 'ess-electric-selection) (define-key ess-dev-map "3" 'ess-electric-selection) (define-key ess-dev-map "4" 'ess-electric-selection) (define-key ess-dev-map "5" 'ess-electric-selection) (define-key ess-dev-map "6" 'ess-electric-selection) (define-key ess-dev-map "7" 'ess-electric-selection) (define-key ess-dev-map "8" 'ess-electric-selection) (define-key ess-dev-map "9" 'ess-electric-selection) (define-key ess-dev-map "?" 'ess-tracebug-show-help) ess-dev-map) "Keymap for commands related to development and debugging.") (easy-menu-define ess-roxygen-menu nil "Roxygen submenu." '("Roxygen" :visible (and ess-dialect (string-match "^R" ess-dialect)) ["Update/Generate Template" ess-roxy-update-entry t] ["Preview Rd" ess-roxy-preview-Rd t] ["Preview HTML" ess-roxy-preview-HTML t] ["Preview text" ess-roxy-preview-text t] ["Hide all" ess-roxy-hide-all t] ["Toggle Roxygen Prefix" ess-roxy-toggle-roxy-region t])) (easy-menu-define ess-tracebug-menu nil "Tracebug submenu." '("Tracebug" :visible (and ess-dialect (string-match "^R" ess-dialect)) ;; :enable ess-local-process-name ["Active?" ess-toggle-tracebug :style toggle :selected (or (and (ess-process-live-p) (ess-process-get 'tracebug)) ess-use-tracebug)] ["Show traceback" ess-show-traceback (ess-process-live-p)] ["Show call stack" ess-show-call-stack (ess-process-live-p)] ["Watch" ess-watch (and (ess-process-live-p) (ess-process-get 'tracebug))] ["Error action cycle" ess-debug-toggle-error-action (and (ess-process-live-p) (ess-process-get 'tracebug))] "----" ["Flag for debugging" ess-debug-flag-for-debugging ess-local-process-name] ["Unflag for debugging" ess-debug-unflag-for-debugging ess-local-process-name] "----" ["Set BP" ess-bp-set t] ["Set conditional BP" ess-bp-set-conditional t] ["Set logger BP" ess-bp-set-logger t] ["Kill BP" ess-bp-kill t] ["Kill all BPs" ess-bp-kill-all t] ["Next BP" ess-bp-next t] ["Previous BP" ess-bp-previous t] "-----" ["About" ess-tracebug-show-help t])) (easy-menu-define ess-developer-menu nil "Developer submenu." '("Developer" :visible (and ess-dialect (string-match "^R" ess-dialect)) ["Active?" ess-toggle-developer :style toggle :selected ess-developer] ["Add package" ess-developer-add-package t] ["Remove package" ess-developer-remove-package t])) (easy-menu-add-item ess-mode-menu nil ess-roxygen-menu "end-dev") (easy-menu-add-item ess-mode-menu nil ess-developer-menu "end-dev") (easy-menu-add-item ess-mode-menu nil ess-tracebug-menu "end-dev") (easy-menu-add-item inferior-ess-mode-menu nil ess-developer-menu "end-dev") (easy-menu-add-item inferior-ess-mode-menu nil ess-tracebug-menu "end-dev") ;; modify S Syntax table: (setq R-syntax-table S-syntax-table) ;; In R 2.x, back tick now is a quote character, so lets tell Emacs ;; that it is; the problem below for older R should no longer be a ;; serious issue. ;;R >= 1.8: back tick `string` -- unfortunately no *pair* checking: ;; breaks when things like `..' are used: (modify-syntax-entry ?` "\"" R-syntax-table) (modify-syntax-entry ?_ "_" R-syntax-table) ; foo_bar is symbol in R >=1.9 (ess-message "[ess-r-d:] (autoload ..) & (def** ..)") ;; (autoload 'inferior-ess "ess-inf" "Run an ESS process.") ;; (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defvar R-customize-alist (append '((ess-local-customize-alist . 'R-customize-alist) (ess-eldoc-function . 'ess-R-eldoc-function) (ess-dialect . "R") (ess-suffix . "R") (ess-ac-sources . '(ac-source-R)) (ess-company-backends . '((company-R-args company-R-objects))) (ess-build-tags-command . "rtags('%s', recursive = TRUE, pattern = '\\\\.[RrSs](rw)?$',ofile = '%s')") (ess-traceback-command . "local({cat(geterrmessage(), \"---------------------------------- \n\", fill=TRUE);try(traceback(), silent=TRUE)})\n") (ess-call-stack-command . "traceback(1)\n") (ess-eval-command . ".ess.eval(\"%s\", FALSE, FALSE, file=\"%f\")\n") (ess-eval-visibly-command . ".ess.eval(\"%s\", TRUE, TRUE, 300, file=\"%f\")\n") (ess-eval-visibly-noecho-command . ".ess.eval(\"%s\", FALSE, TRUE, 300, file=\"%f\")\n") (ess-load-command . ".ess.source(\"%s\", FALSE, FALSE)\n") (ess-load-visibly-command . ".ess.source(\"%s\", TRUE, TRUE, 300)\n") (ess-load-visibly-noecho-command . ".ess.source(\"%s\", FALSE, TRUE, 300)\n") (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-help-web-search-command . 'ess-R-sos) (ess-mode-syntax-table . R-syntax-table) (ess-mode-editing-alist . R-editing-alist) (ess-change-sp-regexp . ess-R-change-sp-regexp) (ess-help-sec-regex . ess-help-R-sec-regex) (ess-help-sec-keys-alist . ess-help-R-sec-keys-alist) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-cmd-delay . ess-R-cmd-delay) (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-r-namedb.el" ) (ess-smart-operators . ess-R-smart-operators) (inferior-ess-program . inferior-R-program-name) (inferior-ess-objects-command . inferior-R-objects-command) (inferior-ess-font-lock-keywords . 'inferior-R-font-lock-keywords) (inferior-ess-search-list-command . "search()\n") ;;(inferior-ess-help-command . "help(\"%s\", htmlhelp=FALSE)\n") (inferior-ess-help-command . inferior-ess-r-help-command) (inferior-ess-help-filetype . nil) (inferior-ess-exit-command . "q()") (inferior-ess-exit-prompt . "Save workspace image? [y/n/c]: ") ;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help? (inferior-ess-start-file . nil) ;; "~/.ess-R" (inferior-ess-start-args . "") (ess-error-regexp-alist . ess-R-error-regexp-alist) (ess-describe-object-at-point-commands . 'ess-R-describe-object-at-point-commands) (ess-STERM . "iESS") (ess-editor . R-editor) (ess-pager . R-pager) (prettify-symbols-alist . '(("<-" . ?тЖР) ("<<-" . ?тЖЮ) ("->" . ?тЖТ) ("->>" . ?тЖа)))) S-common-cust-alist) "Variables to customize for R -- set up later than emacs initialization.") (defvar R-editing-alist ;; copy the S-alist and modify : (let ((S-alist (copy-alist S-editing-alist))) (setcdr (assoc 'ess-font-lock-defaults S-alist) '(ess--extract-default-fl-keywords ess-R-font-lock-keywords)) (setcdr (assoc 'ess-font-lock-keywords S-alist) (quote 'ess-R-font-lock-keywords)) S-alist) "General options for editing R source files.") (defvar ess-R-error-regexp-alist '(R R1 R2 R3 R4 R-recover) "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.") ;; takes precidence over R1 below in english locales, and allows spaces in file path (add-to-list 'compilation-error-regexp-alist-alist '(R "\\(at \\(.+\\)[#:]\\([0-9]+\\)\\)" 2 3 nil 2 1)) (add-to-list 'compilation-error-regexp-alist-alist '(R1 " \\([^ \t\n]+\\)#\\([0-9]+\\)[: ]" 1 2 nil 2)) (add-to-list 'compilation-error-regexp-alist-alist '(R2 "(\\(\\w+ \\([^())\n]+\\)#\\([0-9]+\\)\\))" 2 3 nil 2 1)) ;; (add-to-list 'compilation-error-regexp-alist-alist ;; '(R2 "\\(?:^ +\\(.*?\\):\\([0-9]+\\):\\([0-9]+\\):\\)" 1 2 nil 2 1)) ;; (add-to-list 'compilation-error-regexp-alist-alist ;; '(R3 "\\(?:Error.*: .*\n? +\\)\\(.*\\):\\([0-9]+\\):\\([0-9]+\\):" 1 2 3 2 1)) ;; precede R4 and allowes spaces in file path (add-to-list 'compilation-error-regexp-alist-alist ;; start with bol,: but don't start with digit '(R3 "\\(?:^ +\\|: +\\)\\([^-+[:digit:]\n]:?[^:\n]*\\):\\([0-9]+\\):\\([0-9]+\\):" 1 2 3 2 1)) (add-to-list 'compilation-error-regexp-alist-alist ;; don't start with digit, don't contain spaces '(R4 "\\([^-+ [:digit:]][^: \t\n]+\\):\\([0-9]+\\):\\([0-9]+\\):" 1 2 3 2 1)) (add-to-list 'compilation-error-regexp-alist-alist '(R-recover " *[0-9]+: +\\([^:\n\t]+?\\)#\\([0-9]+:\\)" 1 2 nil 2 1)) ;; gnu C errors ;; (add-to-list 'compilation-error-regexp-alist-alist ;; '(R_C "^\\([^-+ [:digit:]][^: \t\n]+\\):\\([0-9]+\\):\\([0-9]+\\):" 2 3 nil 2 1)) (let ((r-ver '("R-1" "R-2" "R-3" "R-devel" "R-patched"))) (defvar ess-r-versions (if (eq system-type 'darwin) (append r-ver '("R32" "R64")) r-ver) "List of partial strings for versions of R to access within ESS. Each string specifies the start of a filename. If a filename beginning with one of these strings is found on `exec-path', a M-x command for that version of R is made available. For example, if the file \"R-1.8.1\" is found and this variable includes the string \"R-1\", a function called `M-x R-1.8.1' will be available to run that version of R. If duplicate versions of the same program are found (which happens if the same path is listed on `exec-path' more than once), they are ignored by calling `ess-uniq-list'. Set this variable to nil to disable searching for other versions of R. If you set this variable, you need to restart Emacs (and set this variable before ess-site is loaded) for it to take effect.")) (defvar ess-R-post-run-hook nil "Functions run in process buffer after the initialization of R process.") (defun ess--R-load-ESSR () "Load/INSTALL/Update ESSR." (let* ((ESSR-directory (expand-file-name "ESSR" ess-etc-directory)) (src-dir (expand-file-name "R" ESSR-directory))) (if (not (or (and (boundp 'ess-remote) ess-remote) (file-remote-p (ess-get-process-variable 'default-directory)))) (let ((cmd (format "local({ source('%s/.load.R', local=TRUE) #define load.ESSR load.ESSR('%s')})\n" src-dir src-dir))) (ess-write-to-dribble-buffer (format "load-ESSR cmd:\n%s\n" cmd)) (with-current-buffer (ess-command cmd) (let ((msg (buffer-string))) (when (> (length msg) 1) (message (format "load ESSR: %s" msg)))))) ;; else, remote (let* ((verfile (expand-file-name "VERSION" ESSR-directory)) (loadremote (expand-file-name "LOADREMOTE" ESSR-directory)) (version (if (file-exists-p verfile) (with-temp-buffer (insert-file-contents verfile) (buffer-string)) (error "Cannot find ESSR source code"))) (r-load-code (with-temp-buffer (insert-file-contents loadremote) (buffer-string)))) (ess-write-to-dribble-buffer (format "version file: %s\nloadremote file: %s\n" verfile loadremote)) (unless (ess-boolean-command (format r-load-code version) nil 0.1) (let ((errmsg (with-current-buffer " *ess-command-output*" (buffer-string))) (files (directory-files src-dir t "\\.R$"))) (ess-write-to-dribble-buffer (format "error loading ESSR.rda: \n%s\n" errmsg)) ;; should not happen, unless extrem conditions (ancient R or failed download)) (message "Failed to download ESSR.rda (see *ESS* buffer). Injecting ESSR code from local machine") (ess-command (format ".ess.ESSRversion <- '%s'\n" version)) ; cannot do this at R level (mapc #'ess--inject-code-from-file files))))))) ;;;### autoload (defun R (&optional start-args) "Call 'R', the 'GNU S' system from the R Foundation. Optional prefix (C-u) allows to set command line arguments, such as --vsize. This should be OS agnostic. If you have certain command line arguments that should always be passed to R, put them in the variable `inferior-R-args'." (interactive "P") (ess-write-to-dribble-buffer ;; for debugging only (format "\n(R): ess-dialect=%s, buf=%s, start-arg=%s\n current-prefix-arg=%s\n" ess-dialect (current-buffer) start-args current-prefix-arg)) (let* ((r-always-arg (if (or ess-microsoft-p (eq system-type 'cygwin)) "--ess " ;; else: "unix alike" (if (not ess-R-readline) "--no-readline "))) (r-start-args (concat r-always-arg inferior-R-args " " ; add space just in case (if start-args (read-string (concat "Starting Args" (if r-always-arg (concat " [other than '" r-always-arg "']")) " ? ")) nil))) (cust-alist (copy-alist R-customize-alist)) (gdbp (string-match-p "gdb" r-start-args)) use-dialog-box) (when gdbp (setcdr (assoc 'inferior-ess-secondary-prompt cust-alist) (format "\\(%s\\)\\|\\((gdb) \\)" (cdr (assoc 'inferior-ess-secondary-prompt cust-alist))))) (when (or ess-microsoft-p (eq system-type 'cygwin)) (setq use-dialog-box nil) (when ess-microsoft-p ;; default-process-coding-system would break UTF locales on Unix (setq default-process-coding-system '(undecided-dos . undecided-dos)))) (inferior-ess r-start-args cust-alist gdbp) (ess-process-put 'funargs-pre-cache ess-R--funargs-pre-cache) (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first (add-hook 'completion-at-point-functions 'ess-R-object-completion nil 'local) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (setq comint-input-sender 'inferior-R-input-sender) (if gdbp (progn ;; We need to use callback, because R might start with a gdb process (ess-process-put 'callbacks '(R-initialize-on-start)) ;; trigger the callback (process-send-string (get-process ess-local-process-name) "\n")) (ess-wait-for-process) (R-initialize-on-start)) (ess-write-to-dribble-buffer (format "(R): inferior-ess-language-start=%s\n" inferior-ess-language-start)))) (defun R-initialize-on-start (&optional proc string) "This function is run after the first R prompt. Executed in process buffer." (interactive) (when ess-can-eval-in-background (ess-async-command-delayed "invisible(installed.packages())\n" nil (get-process ess-local-process-name) ;; "invisible(Sys.sleep(10))\n" nil (get-process ess-local-process-name) ;; test only (lambda (proc) (process-put proc 'packages-cached? t)))) (ess--R-load-ESSR) (when inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start nil nil nil 'wait-prompt)) (with-ess-process-buffer nil (add-hook 'ess-presend-filter-functions 'ess-R-scan-for-library-call nil 'local) (run-mode-hooks 'ess-R-post-run-hook))) ;; (defun ess--R-cache-installed-packages () ;; "Run by `ess-delayed-init' in R process buffer. ;; Useses internal R caching of installed packages." ;; (ess-command "invisible(installed.packages())\n" ;; nil nil nil .2 nil 'redisplay) ;; (ess-process-put 'packages-cached? t) ;; ) ;;;### autoload (defun R-mode (&optional proc-name) "Major mode for editing R source. See `ess-mode' for more help." (interactive "P") (setq ess-customize-alist R-customize-alist) ;;(setq imenu-generic-expression R-imenu-generic-expression) (ess-mode R-customize-alist proc-name) ;; for emacs < 24 (add-hook 'comint-dynamic-complete-functions 'ess-complete-object-name t 'local) ;; for emacs >= 24 (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first (add-hook 'completion-at-point-functions 'ess-R-object-completion nil 'local) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (if (fboundp 'ess-add-toolbar) (ess-add-toolbar)) ;; ECB needs seminatic stuff. ;; (if (featurep 'semantic) ;; (setq semantic-toplevel-bovine-table r-toplevel-bovine-table)) (when (and ess-imenu-use-S (require 'ess-menu)) (setq imenu-generic-expression ess-imenu-generic-expression) (imenu-add-to-menubar "Imenu-R")) ;; useful for swankr/slime: (set (make-local-variable 'beginning-of-defun-function) (lambda (&optional arg) (skip-chars-backward " \t\n") (ess-beginning-of-function 'no-error))) (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function) (ess-roxy-mode t) (ad-activate 'fill-paragraph) (ad-activate 'move-beginning-of-line) (ad-activate 'back-to-indentation) (ad-activate 'ess-eval-line-and-step) (if ess-roxy-hide-show-p (ad-activate 'ess-indent-command)) (substitute-key-definition 'newline-and-indent 'ess-newline-and-indent ess-mode-map global-map) (substitute-key-definition 'indent-new-comment-line 'ess-indent-new-comment-line ess-mode-map global-map) (run-hooks 'R-mode-hook)) (fset 'r-mode 'R-mode) (defun ess-R-arch-2-bit (arch) "Translate R's architecture shortcuts/directory names to 'bits', i.e., \"32\" or \"64\" (for now)." (if (string= arch "i386") "32" ;; else: "64")) (defun ess-rterm-arch-version (long-path &optional give-cons) "Find an architecture-specific name for LONG-PATH, an absolute (long name) path to R on Windows. Returns either Name, a string, or a (Name . Path) cons, such as (\"R-2.12.1-64bit\" . \"C:/Program Files/R/R-2.12.1/bin/x64/Rterm.exe\") \"R-x.y.z/bin/Rterm.exe\" will return \"R-x.y.z\", for R-2.11.x and older. \"R-x.y.z/bin/i386/Rterm.exe\" will return \"R-x.y.z-32bit\", for R-2.12.x and newer. \"R-x.y.z/bin/x64/Rterm.exe\" will return \"R-x.y.z-64bit\", for R-2.12.x and newer." (let* ((dir (directory-file-name (file-name-directory long-path))) (dir2 (directory-file-name (file-name-directory dir))) (v-1up (file-name-nondirectory dir));; one level up (v-2up (file-name-nondirectory dir2));; two levels up; don't want "bin" ... (v-3up (file-name-nondirectory ;; three levels up; no "bin" for i386, x64 ... (directory-file-name (file-name-directory dir2)))) (val (if (string= v-2up "bin") (concat v-3up "-" (ess-R-arch-2-bit v-1up) "bit") ;; pre R-2.12.x, or when there's no extra arch-specific sub directory: v-2up))) (if give-cons (cons val long-path) val))) (defun ess-r-versions-create () "Generate the `M-x R-x.y.z' functions for starting other versions of R. On MS Windows, this works using `ess-rterm-version-paths'; otherwise, see `ess-r-versions' for strings that determine which functions are created. The result is a list of the new R defuns, if any, that were created. The defuns will normally be placed on the menubar and stored as `ess-r-versions-created' upon ESS initialisation." (if (not ess-r-versions) nil ;nothing to return ;; else, if ess-r-versions is non-nil, let's try to find those R versions. ;; This works by creating a temp buffer where the template function is ;; edited so that X.Y is replaced by the version name (let (versions r-versions-created (eval-buf (get-buffer-create "*ess-temp-r-evals*")) (template ;; This is the template function used for creating M-x R-X.Y. (concat "(defun R-X.Y (&optional start-args) \"Call the R version 'R-X.Y' using ESS. This function was generated by `ess-r-versions-create'.\" (interactive \"P\") (let ((inferior-R-version \"R-X.Y\") (inferior-R-program-name \"" (if ess-microsoft-p "Rterm" "R") "-X.Y\")) (R start-args))) "))) (with-current-buffer eval-buf ;; clear the buffer. (delete-region (point-min) (point-max)) ;; Find which versions of R we want. Remove the pathname, leaving just ;; the name of the executable. (setq versions (if ess-microsoft-p (mapcar (lambda(v) (ess-rterm-arch-version v 'give-cons)) ess-rterm-version-paths) ;; ^^^^^^^^^^^^^^^^^^^^^^^ from ./ess-site.el at start ;; else (non-MS): (ess-uniq-list (mapcar 'file-name-nondirectory (apply 'nconc (mapcar 'ess-find-exec-completions ess-r-versions)))))) (setq r-versions-created ; also for returning at end. (if ess-microsoft-p (mapcar 'car versions) versions)) (ess-write-to-dribble-buffer (format "(R): ess-r-versions-create making M-x defuns for \n %s\n" (mapconcat 'identity r-versions-created "\n "))) ;; Iterate over each string in VERSIONS, creating a new defun each time. (while versions (let* ((version (car versions)) (ver (if ess-microsoft-p (car version) version)) (beg (point))) (setq versions (cdr versions)) (insert template) (goto-char beg) (while (search-forward "R-X.Y" nil t) ;; in all cases (replace-match ver t t)) (when ess-microsoft-p (goto-char beg) (while (search-forward "Rterm-X.Y" nil t) (replace-match (w32-short-file-name (cdr version)) t t))) (goto-char (point-max)))) ;; buffer has now been created with defuns, so eval them! (eval-buffer)) (unless (and (boundp 'ess-debugging) ess-debugging) (kill-buffer eval-buf)) r-versions-created))) (defvar ess-newest-R nil "Stores the newest version of R that has been found. Used as a cache, within ess-find-newest-R. Do not use this value directly, but instead call the function \\[ess-find-newest-R].") (defcustom ess-prefer-higher-bit t "Non-nil means prefer higher bit architectures of R. e.g. prefer 64 bit over 32 bit. This is currently used only by the code on Windows for finding the newest version of R." :group 'ess-R :type 'boolean) (defun ess-rterm-prefer-higher-bit () "Optionally remove 32bit Rterms from being candidate for R-newest. Return the list of candidates for being R-newest. Filtering is done iff `ess-prefer-higher-bit' is non-nil. This is used only by Windows when running `ess-find-newest-R'." (if ess-prefer-higher-bit ;; filter out 32 bit elements (let ((filtered (delq nil (mapcar (lambda (x) (unless (string-match "/i386/Rterm.exe" x) x)) ess-rterm-version-paths)))) (if (null filtered) ;; if none survived filtering, keep the original list ess-rterm-version-paths filtered)) ess-rterm-version-paths)) (defun ess-find-newest-R () "Find the newest version of R on the system. Once the value is found, cache it in the variable `ess-newest-R' for future use as finding the newest version of R can be potentially time-consuming." (or ess-newest-R (progn (message "Finding all versions of R on your system...") ;;(sleep-for 3) nil) (setq ess-newest-R (ess-newest-r (if ess-microsoft-p (ess-rterm-prefer-higher-bit) (add-to-list 'ess-r-versions-created inferior-R-program-name)))))) (defun ess-check-R-program-name () "Check if `inferior-R-program-name' points to an executable version of R. If not, try to find the newest version of R elsewhere on the system, and update `inferior-R-program-name' accordingly." (unless (executable-find inferior-R-program-name) ;; need to check if we can find another name. (let ((newest (ess-find-newest-R))) (if newest (setq inferior-R-program-name newest) (message "Sorry, no version of R could be found on your system."))))) (defun R-newest (&optional start-args) "Find the newest version of R available, and run it. Subsequent calls to R-newest will run that version, rather than searching again for the newest version. Providing an optional prefix arg (C-u) will prompt for command line arguments." (interactive "P") (let ((rnewest (ess-find-newest-R))) (if (not rnewest) (error "No version of R could be found.") ;; Else: we have a working version of R. ;; Have to be careful to avoid recursion... (message (concat "Newest version of R is " rnewest)) (fset 'R-newest (intern (if ess-microsoft-p (ess-rterm-arch-version rnewest) rnewest))) ;;(fset 'R-newest (intern rnewest)) (R-newest start-args)))) ;; (ess-r-version-date "R-2.5.1") (ess-r-version-date "R-patched") ;; (ess-r-version-date "R-1.2.1") (ess-r-version-date "R-1.8.1") ;; Windows: ;; (ess-r-version-date "C:/Program Files (x86)/R/R-2.11.1/bin/Rterm.exe") ;; Note that for R-devel, ver-string is something like ;; R version 2.6.0 Under development (unstable) (2007-07-14 r42234) ;; Antique examples are 'R 1.0.1 (April 14, 2000)' or 'R 1.5.1 (2002-06-17).' (defun ess-r-version-date (rver) "Return the date of the version of R named RVER. The date is returned as a date string. If the version of R could not be found from the output of the RVER program, \"-1\" is returned." (let ((date "-1") (ver-string (shell-command-to-string ;; here, MS Windows (shell-command) needs a short name: (concat (if ess-microsoft-p (w32-short-file-name rver) rver) " --version")))) (when (string-match "R \\(version \\)?[1-9][^\n]+ (\\(2[0-9-]+\\)\\( r[0-9]+\\)?)" ver-string) (setq date (match-string 2 ver-string))) (cons date rver))) (defun ess-current-R-version () "Get the version of R currently running in the ESS buffer as a string" (ess-make-buffer-current) (car (ess-get-words-from-vector "as.character(.ess.Rversion)\n"))) (defun ess-current-R-at-least (version) "Is the version of R (in the ESS buffer) at least (\">=\") VERSION ? Examples: (ess-current-R-at-least '2.7.0) or (ess-current-R-at-least \"2.5.1\")" (ess-make-buffer-current) (string= "TRUE" (car (ess-get-words-from-vector (format "as.character(.ess.Rversion >= \"%s\")\n" version))))) (defvar ess-temp-newest nil) (defun ess-newest-r (rvers) "Check all the versions of RVERS to see which is the newest. Return the name of the newest version of R." (let ((rtimes (mapcar 'ess-r-version-date rvers))) ;; SJE: 2007-07-13 -- following line is a temp var to check that ;; the newest version of R is found correctly. ;; (nowadays gives a compile warning) (setq ess-temp-newest rtimes) (ess-find-newest-date rtimes))) ;; Test case for following defun: ;; (setq a '( ("2003-10-04" . "R-1.7") ;; ("2006-11-19" . "R-2.2") ;; ("2007-07-01" . "R-dev") ;; ("-1" . "R-broken") ;; ("2005-12-30" . "R-2.0"))) ;; (ess-find-newest-date a) (defun ess-find-newest-date (rvers) "Find the newest version of R given in the a-list RVERS. Each element of RVERS is a dotted pair (date . R-version), where date is given as e.g.\"2007-11-30\" so that we can compare dates as strings. If a date is listed as \"-1\", that version of R could not be found. If the value returned is nil, no valid newest version of R could be found." (let (new-r this-r (new-time "0")) (while rvers (setq this-r (car rvers) rvers (cdr rvers)) (when (string< new-time (car this-r)) (setq new-time (car this-r) new-r (cdr this-r)))) new-r)) (defun ess-find-rterm (&optional ess-R-root-dir bin-Rterm-exe) "Find the full path of all occurences of Rterm.exe under the ESS-R-ROOT-DIR. If ESS-R-ROOT-DIR is nil, construct it by looking for an occurence of Rterm.exe in the exec-path. If there are no occurences of Rterm.exe in the exec-path, then use `ess-program-files' (which evaluates to something like \"c:/progra~1/R/\" in English locales) which is the default location for the R distribution. If BIN-RTERM-EXE is nil, then use \"bin/Rterm.exe\"." (if (not ess-R-root-dir) (let ((Rpath (executable-find "Rterm"))) (setq ess-R-root-dir (expand-file-name (if Rpath (concat (file-name-directory Rpath) "../../") (concat ess-program-files "/R/")))) (ess-write-to-dribble-buffer (format "(ess-find-rterm): ess-R-root-dir = '%s'\n" ess-R-root-dir)))) (if (not bin-Rterm-exe) (setq bin-Rterm-exe "bin/Rterm.exe")) (when (file-directory-p ess-R-root-dir) ; otherwise file-name-all-.. errors (setq ess-R-root-dir (ess-replace-regexp-in-string "[\\]" "/" ess-R-root-dir)) (let ((R-ver (ess-drop-non-directories (ess-flatten-list (mapcar (lambda (r-prefix) (file-name-all-completions r-prefix ess-R-root-dir)) (append '("rw") ess-r-versions)))))) (mapcar (lambda (dir) (let ((R-path (concat ess-R-root-dir (ess-replace-regexp-in-string "[\\]" "/" dir) bin-Rterm-exe))) (if (file-exists-p R-path) R-path))) R-ver)))) ;;;### autoload (defun Rnw-mode () "Major mode for editing Sweave(R) source. See `ess-noweb-mode' and `R-mode' for more help." (interactive) (require 'ess-noweb);; << probably someplace else (setq ess--make-local-vars-permenent t) (ess-noweb-mode 1); turn it on (ess-noweb-set-doc-mode 'latex-mode) (ess-noweb-set-code-mode 'R-mode) (setq ess--local-handy-commands (append '(("weave" . ess-swv-weave) ("tangle" . ess-swv-tangle)) ess-handy-commands) ess-dialect "R" ess-language "S") (put 'ess--local-handy-commands 'permanent-local t) (run-hooks 'Rnw-mode-hook)) (fset 'Snw-mode 'Rnw-mode); just a synonym (for now or ever) (autoload 'ess-transcript-mode "ess-trns" "Major mode for editing S transcript files." t) (defun R-transcript-mode () "Does the right thing." (interactive) (ess-transcript-mode R-customize-alist)) (fset 'r-transcript-mode 'R-transcript-mode) (defun R-fix-T-F (&optional from quietly) "Fix T/F into TRUE and FALSE *cautiously*, i.e. not in comments and strings; starting from the current position (point)." (interactive "d\nP"); point and prefix (C-u) (save-excursion (goto-char from) (ess-rep-regexp "\\(\\([][=,()]\\|<-\\) *\\)T\\>" "\\1TRUE" 'fixcase nil (not quietly)) (goto-char from) (ess-rep-regexp "\\(\\([][=,()]\\|<-\\) *\\)F\\>" "\\1FALSE" 'fixcase nil (not quietly)))) ;; From: Sebastian Luque ;; To: ess-help@stat.math.ethz.ch ;; Date: Mon, 01 May 2006 19:17:49 -0500 ;; Without knowing how to tell R to use w3m from within Emacs, and after ;; switching to Konqueror's window for the millionth time, I wrote the ;; following function: ;; This emulates some of the functionality of RSiteSearch() and tests ok in ;; my system GNU Emacs 22.0.50.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll ;; bars) of 2006-04-27 on pacem, modified by Debian. This has the benefit of ;; displaying results with whatever you've told browse-url to use; in my ;; case, w3m with the emacs-w3m package. ;; My elisp skills are rather poor, so comments and suggestions for ;; improvement are welcome. ;; -- ;; Seb ;; MM _FIXME_: This only works correctly for Emacs 22.0.50 (alpha) ;; for 21.x it has problems in the (completing-read-multiple .) ;; at the end (defun R-site-search (string) "Search the R archives for STRING, using default criteria. If called with a prefix, options are available for 1) matches per page, 2) sections of the archives to search (separated by value of `crm-default-separator'), 3) for displaying results in long or short formats, and 4) for sorting by any given field. Completion is available for supplying options." (interactive "sSearch string: ") (let ((site "http://search.r-project.org/cgi-bin/namazu.cgi?query=") (okstring (replace-regexp-in-string " +" "+" string))) (if current-prefix-arg (let ((mpp (concat "&max=" (completing-read "Matches per page: " '(("20" 1) ("30" 2) ("40" 3) ("50" 4) ("100" 5))))) (format (concat "&result=" (completing-read "Format: " '("normal" "short") nil t "normal" nil "normal"))) (sortby (concat "&sort=" (completing-read "Sort by: " '(("score" 1) ("date:late" 2) ("date:early" 3) ("field:subject:ascending" 4) ("field:subject:decending" 5) ("field:from:ascending" 6) ("field:from:decending" 7) ("field:size:ascending" 8) ("field:size:decending" 9)) nil t "score" nil "score"))) (restrict (concat "&idxname=" (mapconcat 'identity (completing-read-multiple "Limit search to: " '(("Rhelp02a" 1) ("functions" 2) ("docs" 3) ("Rhelp01" 4)) nil t "Rhelp02a,functions,docs" nil "Rhelp02a,functions,docs") "&idxname=")))) (browse-url (concat site okstring mpp format sortby restrict))) ;; else: without prefix use defaults: (browse-url (concat site okstring "&max=20&result=normal&sort=score" "&idxname=Rhelp02a&idxname=functions&idxname=docs"))))) (defvar ess--packages-cache nil "Cache var to store package names. Used by `ess-install.packages'.") (defvar ess--CRAN-mirror nil "CRAN mirror name cache.") (defun ess-R-install.packages (&optional update pack) "Prompt and install R package. With argument, update cached packages list." (interactive "P") (when (equal "@CRAN@" (car (ess-get-words-from-vector "getOption('repos')[['CRAN']]\n"))) (ess-setCRANMiror ess--CRAN-mirror) (ess-wait-for-process (get-process ess-current-process-name)) (unless pack (setq update t))) (when (or update (not ess--packages-cache)) (message "Fetching R packages ... ") (setq ess--packages-cache (ess-get-words-from-vector "print(rownames(available.packages()), max=1e6)\n"))) (let* ((ess-eval-visibly-p t) (pack (or pack (ess-completing-read "Package to install" ess--packages-cache)))) (process-send-string (get-process ess-current-process-name) (format "install.packages('%s')\n" pack)) (display-buffer (buffer-name (process-buffer (get-process ess-current-process-name)))))) (define-obsolete-function-alias 'ess-install.packages 'ess-R-install.packages "ESS[12.09-1]") (defun ess-install-library () "Install library/package for current dialect. Currently works only for R." (interactive) (if (not (string-match "^R" ess-dialect)) (message "Sorry, not available for %s" ess-dialect) (ess-R-install.packages))) (defun ess-setRepositories () "Call setRepositories()" (interactive) (if (not (string-match "^R" ess-dialect)) (message "Sorry, not available for %s" ess-dialect) (ess-eval-linewise "setRepositories(FALSE)\n"))) (defun ess-setCRANMiror (&optional mirror) "Set cran mirror" (interactive) (let ((mirror-cmd "local({r <- getOption('repos'); r['CRAN'] <- '%s';options(repos=r)})\n")) (if mirror (ess-command (format mirror-cmd mirror)) (let* ((M1 (ess-get-words-from-vector "local({out <- getCRANmirrors(local.only=TRUE); print(paste(out$Name,'[',out$URL,']', sep=''))})\n")) (M2 (mapcar (lambda (el) (string-match "\\(.*\\)\\[\\(.*\\)\\]$" el) (propertize (match-string 1 el) 'URL (match-string 2 el))) M1)) (mirror (ess-completing-read "Choose CRAN mirror" M2 nil t))) (when mirror (setq mirror (get-text-property 0 'URL mirror)) (setq ess--CRAN-mirror mirror) (ess-command (format mirror-cmd mirror)))))) (message "CRAN mirror: %s" (car (ess-get-words-from-vector "getOption('repos')[['CRAN']]\n")))) (defun ess-R-sos (cmd) "Interface to findFn in the library sos." ;(interactive (list (read-from-minibuffer "Web search for:" nil nil t nil (current-word)))) (interactive "sfindFn: ") (unless (equal "TRUE" (car (ess-get-words-from-vector "as.character(suppressPackageStartupMessages(require(sos)))\n"))) (if (y-or-n-p "Library 'sos' is not installed. Install? ") (progn (ess-eval-linewise "install.packages('sos')\n") (ess-eval-linewise "library(sos)\n")) (signal 'quit nil))) (message nil) (ess-eval-linewise (format "findFn(\"%s\", maxPages=10)" cmd))) (define-obsolete-function-alias 'ess-sos 'ess-R-sos "ESS[12.09-1]") (defun ess-R-scan-for-library-call (string) "Detect `library/require' calls in string and update tracking vars. Placed into `ess-presend-filter-functions' for R dialects." (when (string-match-p "\\blibrary(\\|\\brequire(" string) (ess--mark-search-list-as-changed)) string) (defun ess-load-library () "Prompt and load dialect specific library/package/module. Note that add-ons in R are called 'packages' and the name of this function has nothing to do with R package mechanism, but it rather serves a generic, dialect independent purpose. It is also similar to `load-library' emacs function." (interactive) (if (not (string-match "^R" ess-dialect)) (message "Sorry, not available for %s" ess-dialect) (let ((ess-eval-visibly-p t) (packs (ess-get-words-from-vector "print(.packages(T), max=1e6)\n")) pack) (setq pack (ess-completing-read "Load" packs)) (ess-eval-linewise (format "library('%s')\n" pack)) (ess--mark-search-list-as-changed) (display-buffer (buffer-name (process-buffer (get-process ess-current-process-name))))))) (define-obsolete-function-alias 'ess-library 'ess-load-library "ESS[12.09-1]") ;;; smart-comma was a bad idea (eval-after-load "eldoc" '(eldoc-add-command "ess-smart-comma")) ;;;*;;; Indentation Engine ;; Written by Lionel Henry in mid 2015 (defun ess-r-indent-line () "Indent current line as ESS R code. Return the amount the indentation changed by." (let ((indent (ess-calculate-indent nil)) beg shift-amt (case-fold-search nil) (pos (- (point-max) (point)))) (beginning-of-line) (setq beg (point)) (skip-chars-forward " \t") (setq shift-amt (- indent (current-column))) (if (zerop shift-amt) (if (> (- (point-max) pos) (point)) (goto-char (- (point-max) pos))) (delete-region beg (point)) (indent-to indent) ;; If initial point was within line's indentation, ;; position after the indentation. ;; Else stay at same point in text. (when (> (- (point-max) pos) (point)) (goto-char (- (point-max) pos)))) shift-amt)) (defun ess-r-indent-exp () (save-excursion (when current-prefix-arg (ess-climb-to-top-level)) (let* ((bounds (ess-continuations-bounds)) (end (cadr bounds)) (beg (if current-prefix-arg (car bounds) (forward-line) (point)))) (indent-region beg end)))) (defun ess-indent-call (&optional start) (save-excursion (when (ess-climb-outside-calls) (setq start (or start (point))) (skip-chars-forward "^[(") (forward-char) (ess-up-list) (indent-region start (point))))) (defun ess-offset (offset) (setq offset (eval (intern (concat "ess-offset-" (symbol-name offset))))) (when (and (not (eq offset nil)) (listp offset) (or (numberp (cadr offset)) (eq (cadr offset) t) (error "Malformed offset"))) (setq offset (cadr offset))) (cond ((numberp offset) offset) ((null offset) 0) (t ess-indent-level))) (defun ess-offset-type (offset) (setq offset (eval (intern (concat "ess-offset-" (symbol-name offset))))) (if (listp offset) (car offset) offset)) (defun ess-overridden-blocks () (append (when (memq 'fun-decl ess-align-blocks) (list (car ess-prefixed-block-patterns))) (when (memq 'control-flow ess-align-blocks) (append (cdr ess-prefixed-block-patterns) '("}?[ \t]*else"))))) (defun ess-calculate-indent (&optional parse-start) "Return appropriate indentation for current line as ESS code. In usual case returns an integer: the column to indent to. Returns nil if line starts inside a string, t if in a comment." (save-excursion (beginning-of-line) (let* ((indent-point (point)) (state (syntax-ppss)) (containing-sexp (cadr state)) (prev-containing-sexp (car (last (butlast (nth 9 state)))))) (ess-back-to-indentation) (cond ;; Strings ((ess-point-in-string-p state) (current-indentation)) ;; Comments ((ess-calculate-indent--comments)) ;; Indentation of commas ((looking-at ",") (ess-calculate-indent--comma)) ;; Arguments: Closing ((ess-call-closing-p) (ess-calculate-indent--call-closing-delim)) ;; Block: Contents (easy cases) ((ess-calculate-indent--block-relatively)) ;; Block: Prefixed block ((ess-calculate-indent--prefixed-block-curly)) ;; Continuations ((ess-calculate-indent--continued)) ;; Block: Overridden contents ((ess-calculate-indent--aligned-block)) ;; Block: Opening ((ess-block-opening-p) (ess-calculate-indent--block-opening)) ;; Bare line ((and (null containing-sexp) (not (ess-unbraced-block-p))) 0) ;; Block: Closing ((ess-block-closing-p) (ess-calculate-indent--block 0)) ;; Block: Contents ((ess-block-p) (ess-calculate-indent--block)) ;; Arguments: Nested calls override ((ess-calculate-indent--nested-calls)) ;; Arguments: Contents (t (ess-calculate-indent--args)))))) (defun ess-calculate-indent--comments () (when ess-indent-with-fancy-comments (cond ;; ### or #! ((or (looking-at "###") (and (looking-at "#!") (= 1 (line-number-at-pos)))) 0) ;; Single # comment ((looking-at "#[^#']") comment-column)))) (defun ess-calculate-indent--comma () (when (ess-point-in-call-p) (let ((indent (save-excursion (ess-calculate-indent--args))) (unindent (progn (skip-chars-forward " \t") ;; return number of skiped chars (skip-chars-forward ", \t")))) (- indent unindent)))) (defun ess-calculate-indent--call-closing-delim () (cond ((save-excursion (ess-skip-blanks-backward t) (eq (char-before) ?,)) (ess-calculate-indent--args nil)) ((save-excursion (and (ess-climb-operator) (or (not ess-align-continuations-in-calls) (ess-looking-at-definition-op-p)))) (ess-calculate-indent--continued)) (t (ess-calculate-indent--args 0)))) (defun ess-calculate-indent--block-opening () (cond ;; Block is an argument in a function call ((when containing-sexp (ess-at-containing-sexp (ess-looking-at-call-opening "[[(]"))) (ess-calculate-indent--block 0)) ;; Top-level block ((null containing-sexp) 0) ;; Block is embedded in another block ((ess-at-containing-sexp (equal (char-after) ?\{) (+ (current-indentation) (ess-offset 'block)))))) (defun ess-calculate-indent--aligned-block () ;; Check for `else' opening (if (and (memq 'control-flow ess-align-blocks) (looking-at "else\\b") (ess-climb-if-else)) (progn (when (looking-at "else\\b") (ess-skip-curly-backward)) (current-column)) ;; Check for braced and unbraced blocks (ess-save-excursion-when-nil (let ((offset (if (looking-at "[{})]") 0 (ess-offset 'block)))) (when (and (cond ;; Unbraced blocks ((ess-climb-block-prefix)) ;; Braced blocks (containing-sexp (when (ess-at-containing-sexp (looking-at "{")) (ess-climb-outside-prefixed-block)))) (some 'looking-at (ess-overridden-blocks))) (+ (current-column) offset)))))) (defun ess-calculate-indent--block-relatively () (ess-save-excursion-when-nil (let ((offset (if (looking-at "[})]") 0 (ess-offset 'block))) (start-line (line-number-at-pos))) (cond ;; Braceless block continuations: only when not in a call ((ess-save-excursion-when-nil (and (not (looking-at "{")) (ess-goto-char (ess-unbraced-block-p)) (not (looking-at "function\\b")) (or (null containing-sexp) (ess-at-containing-sexp (not (looking-at "(")))))) (ess-maybe-climb-broken-else 'same-line) (ess-skip-curly-backward) (+ (current-column) (ess-offset 'block))) ;; Don't indent relatively other continuations ((ess-looking-at-continuation-p) nil) ;; If a block already contains an indented line, we can indent ;; relatively from that first line ((ess-save-excursion-when-nil (and (not (looking-at "}")) containing-sexp (goto-char containing-sexp) (looking-at "{") (progn (forward-line) (ess-back-to-indentation) (/= (line-number-at-pos) start-line)) (not (looking-at "[ \t]*\\(#\\|$\\)")) (save-excursion (or (ess-jump-expression) (ess-jump-continuations)) (< (line-number-at-pos) start-line)))) (current-column)) ;; If a block is not part of a call, we can indent relatively ;; from the opening {. First check that enclosing { is first ;; thing on line ((and containing-sexp (not (ess-unbraced-block-p)) (goto-char containing-sexp) (ess-block-opening-p) (equal (point) (save-excursion (ess-back-to-indentation) (point)))) (+ (current-column) offset)))))) (defun ess-arg-block-p () (unless (or (null containing-sexp) ;; Unbraced blocks in a { block are not arg blocks (and (ess-unbraced-block-p) (ess-at-containing-sexp (looking-at "{")))) (cond ;; Unbraced body ((ess-at-indent-point (and (ess-unbraced-block-p) (goto-char containing-sexp) (ess-looking-at-call-opening "[[(]"))) 'body) ;; Indentation of opening brace as argument ((ess-at-containing-sexp (ess-looking-at-call-opening "[[(]")) 'opening) ;; Indentation of body or closing brace as argument ((ess-at-containing-sexp (and (or (looking-at "{") (ess-looking-at-block-paren-p)) prev-containing-sexp (goto-char prev-containing-sexp) (ess-looking-at-call-opening "[[(]"))) 'body)))) (defun ess-calculate-indent--block (&optional offset) (let ((arg-block (ess-arg-block-p))) (cond (arg-block (ess-calculate-indent--arg-block offset arg-block)) (t ;; Block is not part of an arguments list. Climb over any ;; block opening (function declaration, etc) to indent from ;; starting indentation. (or (ess-climb-block-prefix) (and (goto-char containing-sexp) (ess-climb-block-prefix))) (+ (current-indentation) (or offset (ess-offset 'block))))))) (defun ess-calculate-indent--arg-block (offset arg-block) (let* ((block-type (cond ((or (ess-at-containing-sexp (and (eq arg-block 'body) (ess-climb-block-prefix "function"))) (ess-at-indent-point (and (eq arg-block 'opening) (ess-backward-sexp 2) (looking-at "function\\b")))) 'fun-decl) ((ess-at-indent-point (ess-unbraced-block-p)) 'unbraced) ((ess-at-containing-sexp (not (ess-looking-back-attached-name-p))) 'bare-block) (t))) (call-pos (if (and (not (eq block-type 'unbraced)) (not (eq arg-block 'opening))) (goto-char prev-containing-sexp) (prog1 containing-sexp (goto-char indent-point))))) (ess-calculate-indent--args offset (ess-offset-type 'block) call-pos indent-point block-type))) ;; This function is currently the speed bottleneck of the indentation ;; engine. This is due to the need to call (ess-maximum-args-indent) ;; to check if some previous arguments have been pushed off from their ;; natural indentation: we need to check the whole call. This is very ;; inefficient especially when indenting a region containing a large ;; function call (e.g. some dplyr's data cleaning code). Should be ;; solved by implementing a cache as in (syntax-ppss), though it's ;; probably not worth the work. (defun ess-calculate-indent--args (&optional offset type call-pos to block) (let* ((call-pos (or call-pos containing-sexp)) (max-col (prog1 (unless (eq type 'prev-line) (ess-maximum-args-indent call-pos to)) (goto-char call-pos))) (override (and ess-align-arguments-in-calls (save-excursion (ess-climb-object) (some 'looking-at ess-align-arguments-in-calls)))) (type-sym (cond (block 'block) ((looking-at "[[:blank:]]*[([][[:blank:]]*\\($\\|#\\)") 'arguments-newline) (t 'arguments))) (type (or type (and override 'open-delim) (ess-offset-type type-sym))) (offset (or offset (and (not block) (eq type 'open-delim) 0) (ess-offset type-sym))) (indent (cond ;; Indent from opening delimiter ((eq type 'open-delim) (ess-calculate-indent--args-open-delim)) ;; Indent from attached name ((eq type 'prev-call) (ess-calculate-indent--args-prev-call)) ;; Indent from previous line indentation ((eq type 'prev-line) (ess-calculate-indent--args-prev-line)) (t (error "Malformed offset"))))) (if max-col (ess-adjust-argument-indent indent offset max-col block) (+ indent offset)))) (defun ess-calculate-indent--args-open-delim () (forward-char) (current-column)) (defun ess-calculate-indent--args-prev-call () ;; Handle brackets chains such as ][ (cf data.table) (ess-climb-chained-delims) ;; Handle call chains (if ess-indent-from-chain-start (while (and (ess-backward-sexp) (when (looking-back "[[(][ \t,]*" (line-beginning-position)) (goto-char (match-beginning 0))))) (ess-backward-sexp)) (when ess-indent-from-lhs (ess-climb-lhs)) (if (and nil (eq block 'fun-decl) (not (eq arg-block 'opening)) (not (eq (ess-offset-type type-sym) 'open-delim))) (+ (ess-offset 'block) (current-column)) (current-column))) (defun ess-calculate-indent--args-prev-line () (ess-at-indent-point (cond ;; Closing delimiters are actually not indented at ;; prev-line, but at opening-line ((looking-at "[]})]") (ess-up-list -1) (when (looking-at "{") (ess-climb-block-prefix)) (current-indentation)) ;; Function blocks need special treatment ((and (eq type 'prev-line) (eq block 'fun-decl)) (goto-char containing-sexp) (ess-climb-block-prefix) (current-indentation)) ;; Regular case (t ;; Find next non-empty line to indent from (while (and (= (forward-line -1) 0) (looking-at "[ \t]*\\($\\|#\\)"))) (goto-char (ess-code-end-position)) ;; Climb relevant structures (unless (ess-climb-block-prefix) (when (eq (char-before) ?,) (forward-char -1)) (ess-climb-expression) (ess-climb-continuations)) ;; The following ensures that only the first line ;; counts. Otherwise consecutive statements would get ;; increasingly more indented. (when (and block containing-sexp (not (eq block 'unbraced)) (save-excursion (/= (line-number-at-pos) (progn (goto-char containing-sexp) (line-number-at-pos))))) (setq offset 0)) (current-indentation))))) ;; Indentation of arguments needs to keep track of how previous ;; arguments are indented. If one of those has a smaller indentation, ;; we push off the current line from its natural indentation. For ;; block arguments, we still need to push off this column so we ignore ;; it. (defun ess-adjust-argument-indent (base offset max-col push) (if push (+ (min base max-col) offset) (min (+ base offset) max-col))) ;; When previous arguments are shifted to the left (can happen in ;; several situations) compared to their natural indentation, the ;; following lines should not get indented past them. The following ;; function checks the minimum indentation for all arguments of the ;; current function call or bracket indexing. (defun ess-maximum-args-indent (&optional from to) (let* ((to (or to (point))) (to-line (line-number-at-pos to)) (from-line (progn (goto-char (1+ (or from containing-sexp))) (line-number-at-pos))) (prev-pos (1- (point))) max-col) (while (< (line-number-at-pos) to-line) (forward-line) (ess-back-to-indentation) ;; Ignore the line with the function call, the line to be ;; indented, and empty lines. (unless (or (>= (line-number-at-pos) to-line) (looking-at "[ \t]*\\($\\|#\\)")) (let ((indent (cond ;; First line: minimum indent is right after ( ((= (line-number-at-pos) from-line) (save-excursion (goto-char (1+ containing-sexp)) (current-column))) ;; Handle lines starting with a comma ((save-excursion (looking-at ",")) (+ (current-indentation) 2)) (t (current-indentation))))) (setq max-col (min indent (or max-col indent)))))) max-col)) ;; Move to leftmost side of a call (either the first letter of its ;; name or its closing delim) (defun ess-move-to-leftmost-side () (when (or (looking-at "[({]") (ess-looking-at-call-p)) (ess-save-excursion-when-nil (let ((start-col (current-column))) (skip-chars-forward "^{[(") (forward-char) (ess-up-list) (forward-char -1) (< (current-column) start-col))))) (defun ess-max-col () (let ((max-col (point))) (save-excursion (while (< (point) indent-point) (unless (and ess-indent-with-fancy-comments (looking-at "### ")) (setq max-col (min max-col (current-column)))) (forward-line) (ess-back-to-indentation))) max-col)) (defun ess-calculate-indent--prefixed-block-curly () (when (looking-at "{") (ess-save-excursion-when-nil (let ((block-type (ess-climb-block-prefix))) (cond ((ess-save-excursion-when-nil (and (memq 'fun-decl-opening ess-indent-from-lhs) (string= block-type "function") (ess-climb-operator) (ess-looking-at-assignment-op-p) (ess-climb-expression))) (current-column)) ((= (save-excursion (back-to-indentation) (point)) (point)) (ess-calculate-indent--continued))))))) (defun ess-calculate-indent--continued () "If a continuation line, return an indent of this line, otherwise nil." (save-excursion (let* ((start-line (line-number-at-pos)) (prev-pos 0) (cascade (eq (ess-offset-type 'continued) 'cascade)) (climbed (progn (ess-climb-continuations cascade))) max-col) (when climbed (cond ;; Overridden calls ((and ess-align-continuations-in-calls (not (eq climbed 'def-op)) containing-sexp (save-excursion (goto-char containing-sexp) (looking-at "[[(]"))) (setq max-col (ess-max-col)) (ess-move-to-leftmost-side) (+ (min (current-column) max-col) (if (eq climbed 'def-op) (ess-offset 'continued) 0))) ;; Regular case (t (let ((first-indent (or (eq climbed 'def-op) (save-excursion (when (ess-looking-back-closing-p) (ess-climb-expression)) (not (ess-climb-continuations cascade)))))) ;; Record all indentation levels between indent-point and ;; the line we climbed. Some lines may have been pushed off ;; their natural indentation. These become the new ;; reference. (setq max-col (ess-max-col)) ;; Indenting continuations from the front of closing ;; delimiters looks better (when (ess-looking-back-closing-p) (backward-char)) (+ (min (current-column) max-col) (cond ((eq (ess-offset-type 'continued) 'cascade) (ess-offset 'continued)) (first-indent (ess-offset 'continued)) (t 0)))))))))) (defun ess-calculate-indent--nested-calls () (when ess-align-nested-calls (let ((calls (mapconcat 'identity ess-align-nested-calls "\\|")) match) (save-excursion (and containing-sexp (looking-at (concat "\\(" calls "\\)(")) (setq match (match-string 1)) (goto-char containing-sexp) (looking-at "(") (ess-backward-sexp) (looking-at (concat match "(")) (current-column)))))) ;;;*;;; Call filling engine ;; Unroll arguments to a single line until closing marker is found. (defun ess-fill--unroll-lines (bounds &optional jump-cont) (let* ((last-pos (point-min)) (containing-sexp (ess-containing-sexp-position)) prefix-break) (goto-char (car bounds)) (goto-char (ess-code-end-position)) (while (and (/= (point) last-pos) (< (line-end-position) (cadr bounds)) (not prefix-break)) (setq last-pos (point)) ;; Check whether we ended up in a sub call. In this case, jump ;; over it, otherwise, join lines. (let ((contained-sexp (ess-containing-sexp-position))) (cond ((and contained-sexp containing-sexp (not (= containing-sexp contained-sexp))) (goto-char (1+ contained-sexp)) (ess-up-list)) ;; Jump over continued statements ((and jump-cont (ess-looking-back-operator-p)) (ess-skip-blanks-forward t) (ess-jump-continuations)) ;; Jump over comments ((looking-at "#") (forward-line) (ess-indent-line)) (t (join-line 1)))) (goto-char (ess-code-end-position))) (goto-char (car bounds)))) (defvar ess-fill--orig-pos nil "Original position of cursor.") (defvar ess-fill--orig-state nil "Backup of original code to cycle back to original state.") (defvar ess-fill--second-state nil "Backup of code produce by very first cycling. If this is equal to orig-state, no need to cycle back to original state.") (defvar ess-fill--style-level nil "Filling style used in last cycle.") (defun ess-fill--substring (bounds) (buffer-substring (car bounds) (marker-position (cadr bounds)))) ;; Detect repeated commands (defun ess-fill-style (type bounds) (let ((max-level ;; This part will be simpler once we have the style alist (cond ((eq type 'calls) ;; No third style either when ess-offset-arguments is ;; set to 'open-delim, or when ess-fill-calls-newlines ;; is nil and no numeric prefix is given (if (and (not (eq (ess-offset-type 'arguments) 'open-delim)) (or ess-fill-calls-newlines (numberp current-prefix-arg))) 3 2)) ((eq type 'continuations) 2)))) (if (not (memq last-command '(fill-paragraph-or-region fill-paragraph))) (progn ;; Record original state on first cycling (setq ess-fill--orig-state (ess-fill--substring bounds)) (setq ess-fill--orig-pos (point)) (setq ess-fill--second-state nil) (setq ess-fill--style-level 1)) ;; Also record state on second cycling (when (and (= ess-fill--style-level 1) (null ess-fill--second-state)) (setq ess-fill--second-state (ess-fill--substring bounds))) (cond ((>= ess-fill--style-level max-level) (let ((same-last-and-orig (string= (ess-fill--substring bounds) ess-fill--orig-state)) (same-2nd-and-orig (string= ess-fill--orig-state ess-fill--second-state))) ;; Avoid cycling to the same state twice (cond ((and same-last-and-orig same-2nd-and-orig) (setq ess-fill--style-level 2)) ((or same-last-and-orig same-2nd-and-orig) (setq ess-fill--style-level 1)) (t (setq ess-fill--style-level 0))))) (ess-fill--style-level (setq ess-fill--style-level (1+ ess-fill--style-level)))))) ess-fill--style-level) (defun ess-fill-args (&optional style) (let ((start-pos (point-min)) (orig-col (current-column)) (orig-line (line-number-at-pos)) (bounds (ess-args-bounds 'marker)) ;; Set undo boundaries manually (undo-inhibit-record-point t) last-pos last-newline prefix-break infinite) (when (not bounds) (error "Could not find function bounds")) (setq style (or style (ess-fill-style 'calls bounds))) (if (= style 0) (progn (delete-region (car bounds) (marker-position (cadr bounds))) (insert ess-fill--orig-state) ;; Restore the point manually. (save-excursion) wouldn't ;; work here because we delete the text rather than just ;; modifying it. (goto-char ess-fill--orig-pos) (message "Back to original formatting")) (when ess-blink-refilling (ess-blink-region (nth 2 bounds) (1+ (marker-position (cadr bounds))))) (undo-boundary) (save-excursion (ess-fill--unroll-lines bounds t) (cond ;; Some styles start with first argument on a newline ((and (memq style '(2 4)) ess-fill-calls-newlines (not (looking-at "[ \t]*#"))) (newline-and-indent)) ;; Third level, start a newline after N arguments ((and (= style 3) (not (looking-at "[ \t]*#"))) (let ((i (if (numberp current-prefix-arg) current-prefix-arg 1))) (while (and (> i 0) (ess-jump-arg) (ess-jump-char ",")) (setq i (1- i)))) (newline-and-indent))) (while (and (not (looking-at "[])]")) (/= (point) (or last-pos 1)) (not infinite)) (setq prefix-break nil) ;; Record start-pos as future breaking point to avoid breaking ;; at `=' sign (while (looking-at "[ \t]*[\n#]") (forward-line) (ess-back-to-indentation)) (setq start-pos (point)) (while (and (< (current-column) fill-column) (not (looking-at "[])]")) (/= (point) (or last-pos 1)) ;; Break after one pass if prefix is active (not prefix-break)) (when (memq style '(2 3)) (setq prefix-break t)) (ess-jump-char ",") (setq last-pos (point)) ;; Jump expression and any continuations. Reindent all lines ;; that were jumped over (let ((cur-line (line-number-at-pos)) end-line) (when (ess-jump-arg) (setq last-newline nil)) (save-excursion (when (< cur-line (line-number-at-pos)) (setq end-line (line-number-at-pos)) (ess-goto-line (1+ cur-line)) (while (and (<= (line-number-at-pos) end-line) (/= (point) (point-max))) (ess-indent-line) (forward-line)))))) (when (or (>= (current-column) fill-column) prefix-break ;; Ensures closing delim on a newline (and (= style 4) (looking-at "[ \t]*[])]") (setq last-pos (point)))) (if (and last-pos (/= last-pos start-pos)) (goto-char last-pos) (ess-jump-char ",")) (cond ((looking-at "[ \t]*[#\n]") (forward-line) (ess-indent-line) (setq last-newline nil)) ;; With levels 2 and 3, closing delim goes on a newline ((looking-at "[ \t]*[])]") (when (and (memq style '(2 3 4)) ess-fill-calls-newlines (not last-newline)) (newline-and-indent) ;; Prevent indenting infinitely (setq last-newline t))) ((not last-newline) (newline-and-indent) (setq last-newline t)) (t (setq infinite t))))) ;; Reindent surrounding context (ess-indent-call (car bounds))) ;; Signal marker for garbage collection (set-marker (cadr bounds) nil) (undo-boundary)))) (defun ess-fill-continuations (&optional style) (let ((bounds (ess-continuations-bounds 'marker)) (undo-inhibit-record-point t) (last-pos (point-min)) last-newline infinite) (when (not bounds) (error "Could not find statements bounds")) (setq style (or style (ess-fill-style 'continuations bounds))) (if (= style 0) (progn (delete-region (car bounds) (marker-position (cadr bounds))) (insert ess-fill--orig-state) (goto-char ess-fill--orig-pos) (message "Back to original formatting")) (when ess-blink-refilling (ess-blink-region (car bounds) (marker-position (cadr bounds)))) (undo-boundary) (save-excursion (ess-fill--unroll-lines bounds) (while (and (< (point) (cadr bounds)) (/= (point) (or last-pos 1)) (not infinite)) (setq last-pos (point)) (when (and (ess-jump-expression) (indent-according-to-mode) (not (> (current-column) fill-column))) (setq last-newline nil)) (ess-jump-operator) (if (or (and (> (current-column) fill-column) (goto-char last-pos)) (= style 2)) (progn (ess-jump-operator) (unless (= (point) (cadr bounds)) (when last-newline (setq infinite t)) (newline-and-indent) (setq last-newline t))) (setq last-newline nil))) (ess-indent-call (car bounds))) (set-marker (cadr bounds) nil) (undo-boundary)))) (provide 'ess-r-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-r-d.el ends here ess/lisp/ess-r-args.el0000664000175000017500000003376312423756516013227 0ustar eddedd;;; ess-r-args.el --- Insert R function's arguments ;; Copyright (C) 2007 Sven Hartenstein ;; Copyright (C) 2007 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; Last update: 2012-02-27 ;;; Commentary: ;; == DOCUMENTATION == ;; This file provides some functions that show or insert a ;; R-function's arguments (and their default values) by using R's ;; args() function. This code requires ESS (http://ess.r-project.org). ;; For screenshots as well as information on requirements, ;; installation, configuration and troubleshooting, please visit ;; http://www.svenhartenstein.de/emacs-ess.php ;; Users of XEmacs (or maybe non-GNU-Emacs users): The code below must ;; be slightly adapted in order to work in XEmacs (i.e. comment out ;; the delete-trailing-whitespace function call by putting a semicolon ;; at the beginning of the line). Furthermore, the tooltip option does ;; NOT work in XEmacs (yet) (and will probably only ever work if the ;; ESS-core team will adapt the code for XEmacs compatibility). ;; == Requirements == ;; * ESS mode must be loaded and running. ;; * A R process must be running within ESS. ;; * For the tooltip option to work, Emacs must not run within a ;; terminal but (directly) under the X window system (in case of ;; GNU/Linux). ;; * The tooltip option currently requires GNU Emacs (i.e. not XEmacs ;; or a similar other derivate). ;; == Installation == ;; To make Emacs aware of the functions defined in this file load it ;; into Emacs by including something like the following in your ;; ~/.emacs file (adapt "/PATH/TO"!). ;; ;; (add-hook 'ess-mode-hook (lambda () (load "/PATH/TO/ess-r-args.el"))) ;; ;; This file is included with ESS; if you are reading this file as ;; part of the ESS distribution, then you do not need to add the above ;; line. ;; == Configuration == ;; Configuration should be done by setting some variables in your ;; ~/.emacs file, the following is an example only, adjust it to your ;; needs. ;; ;; ess-r-args-noargsmsg is printed, if no argument information ;; ;; could be found. You could set it to an empty string ("") for no ;; ;; message. ;; (setq ess-r-args-noargsmsg "No args found.") ;; ;; ;; ess-r-args-show-as determines how (where) the information is ;; ;; displayed. Set it to 'tooltip little tooltip windows or to ;; ;; 'message (the default) which will use the echo area at the bottom of ;; ;; your Emacs frame. ;; (setq ess-r-args-show-as nil) ;; ;; ;; ess-r-args-show-prefix is a string that is printed in front of ;; ;; the arguments list. The default is "ARGS: ". ;; (setq ess-r-args-show-prefix "ARGS: ") ;; == Usage == ;; The functions should be called when point (text cursor) is between ;; two parentheses of a R function call (see screenshots above). It ;; will then (invisibly) query R for which arguments the respective ;; function knows as well as their default values and show or insert ;; the result. ;; There are currently two functions: ess-r-args-show echoes the ;; arguments in the echo area or as tooltip, ess-r-args-insert prints ;; the arguments at point. ;; In order to not having to type the whole function name each time ;; you want to see the arguments list, you most probably want to bind ;; the functions to a key which again should be done in your ~/.emacs ;; file. You can also let Emacs call the function each time you insert ;; an opening parenthesis ("("). ;; -----> do this below ;; Again, the following is an example only: ;; bind ess-r-args-show to F2 ;; (define-key ess-mode-map [f2] 'ess-r-args-show) ;; bind ess-r-args-insert to F3 ;; (define-key ess-mode-map [f3] 'ess-r-args-insert) ;; == Setting the tooltip position == ;; Unfortunately (?), tooltips are by default shown at the mouse ;; pointer's position, which is not necessarily where you are looking ;; at. If you use Emacs' mouse-avoidance-mode with option "banish" ;; then the mouse pointer will automatically be put at the upper right ;; corner of the Emacs window so that you know where to look for the ;; tooltip. Emacs also allows for setting the tooltip position ;; relative to the upper left corner of your screen. If you know how ;; to let Emacs determine the point (text cursor) position in pixels ;; from the upper left corner of the screen, please let me know. It ;; would then be possible to show the tooltip near the point, which I ;; would consider preferably. ;; SJE: see code at bottom 2009-01-30... ;; ;; Put mouse away when using keyboard ;; (mouse-avoidance-mode 'banish) ;; ;; Set the tooltip position in absolute pixels from the upper left ;; ;; corner of the screen ;; (setq tooltip-frame-parameters ;; '((name . "tooltip") ;; (left . 20) ;; (top . 20))) ;; == Changelog == ;; * 2007-04-03: The function should now do nothing (instead of ;; irritating cursor movement) if the current ESS process is ;; anything but R. ;; * 2007-04-05: Function names changed. Much more modular. GPLed. New ;; prefix configuration variable. Minor changes. ;; * 2007-04-30: Error handling added. Bugfix: Emacs used to lock up ;; when function was called within parentheses following the "#" ;; character (Thanks to John Bullock for his bug report!). ;; == Troubleshooting == ;; Before sending reports of problems, please check the following. ;; * Doublecheck the requirements section above. ;; * Please be sure you tried both the "tooltip" option and the "echo ;; area" option and tell me whether both failed or just one. ;; * Check whether it is a key binding problem. Run the function with ;; M-x ess-r-args-show RET. If it works but not the key binding, try ;; binding it to another key. Some window managers might not pass ;; the function key keystrokes to Emacs. ;; If you encounter problems, please send me detailed bug reports. ;; Please also indicate the ESS version you are running and the Emacs ;; type (GNU vs. X) and operating system. I will do my best to help ;; but please be aware that I'm everything but an emacs lisp expert. ;; == TODO == ;; These are things that I would like to see improved. Please let me ;; know if you know how it could be done. ;; * As mentioned above, I would like to place the tooltip near the ;; point (text cursor) but I do not see how this could be done. ;; * Both the message in the echo area and the tooltip automatically ;; disappear as soon as a key is pressed. That is, you will need to ;; call the function again if you have entered the first ;; parameter(s) and wonder what additional parameters are possible. ;; I would prefer the information to be shown, say, five seconds or ;; so. ;;; Code: (eval-and-compile (require 'ess-custom)) (eval-when-compile (if ess-has-tooltip (require 'tooltip))); for tooltip-show (require 'ess) (defun ess-r-args-current-function () "Returns the name of the R function assuming point is currently within the argument list or nil if no possible function name is found." (save-excursion (condition-case nil (up-list -1) (error (message "Can't find opening parenthesis."))) (let ((posend (point))) (backward-sexp 1) (let ((rfunname (buffer-substring-no-properties posend (point)))) (if (posix-string-match "^[a-zA-Z0-9_\.]+$" rfunname) rfunname nil))))) (defun ess-r-args-get (&optional function trim) "Returns string of arguments and their default values of R function FUNCTION or nil if no possible function name found. Calls ess-r-args-current-function if no argument given. If TRIM is non-nill remove tabs and newlines and replace ' = ' with '=' (useful for display in minibuffer to avoid window and buffer readjustments for multiline string)." (if (null function) (setq function (ess-r-args-current-function))) (when (and function (or ess-current-process-name (interactive-p))) (ess-force-buffer-current "R process to use: ") ;; ^^^^^^^^^^^^^^^ has own error handler (cadr (ess-function-arguments function)) )) ;; (let ((ess-nuke-trailing-whitespace-p t) ;; (args)) ;; (ess-command (format "try({fun<-\"%s\"; fundef<-paste(fun, '.default',sep='') ;; if(exists(fundef, mode = \"function\")) args(fundef) else args(fun)}, silent=F)\n" function) ;; (get-buffer-create "*ess-r-args-tmp*")) ;; (with-current-buffer "*ess-r-args-tmp*" ;; (goto-char (point-min)) ;; (if (null (search-forward "function" 20 t)) ;; (message ess-r-args-noargsmsg) ;; (goto-char (point-min)) ;; (search-forward "(" nil t) ;; (delete-region (point-min) (point)) ;; (goto-char (point-max)) ;; (search-backward ")" nil t) ;; (delete-region (point) (point-max)) ;; (ess-nuke-trailing-whitespace); should also work in Xemacs ;; (setq args (buffer-string)) ;; (if trim ;; (replace-regexp-in-string " = " "=" ;; (replace-regexp-in-string "[\n \t]+" " " args)) ;; args) ;; ))))) (defun ess-r-args-show (&optional function) "Show arguments and their default values of R function. Calls \\[ess-r-args-current-function] if called without argument." (interactive "*") (ess-message "(ess-r-args-show): start") (if (null function) (setq function (ess-r-args-current-function))) (ess-message ".... function='%s'" function) (when function (let* ((tt (and (equal ess-r-args-show-as 'tooltip) ess-has-tooltip)) (args (concat ess-r-args-show-prefix (ess-r-args-get function (not tt))))) (ess-message "(ess-r-args-show): args='%s'" args) (when args (if (not tt) (message args) (require 'tooltip) ;; value of 30 in next call is just a guess, ;; should really be based ;; on something like pixel height of 1-2 vertical ;; lines of text (ess-tooltip-show-at-point args 0 30)) )))) (defun ess-r-args-auto-show () "Typically assigned to \"(\": If there's an ess-process, automatically show arguments and their default values of an R function. Built on \\[ess-r-args-show]." (interactive) (insert "("); (skeleton-pair-insert-maybe nil) (if (and (not eldoc-mode) ess-local-process-name ; has a process and it must still be running (ess-get-process ess-local-process-name)) (ess-r-args-show))) ;; MM: I would strongly discourage use of the following: ;; it leads to clueless newbie-users who indeed ;; explicitly call a function with all its default arguments; ;; instead of only setting the required arguments (defun ess-r-args-insert (&optional function) "Insert arguments and their default values of function. Calls ess-r-args-current-function if no argument given." (interactive "*") (if (null function) (setq function (ess-r-args-current-function))) (if function (let ((args (ess-r-args-get function)) (pointpos (point))) (insert args) (goto-char pointpos)))) ;; (defvar ess-r-object-tooltip-alist ;; '((numeric . "summary") ;; (integer . "summary") ;; (factor . "table") ;; (lm . "summary") ;; (other . "str")) ;; "List of ( . ) to be used in \\[ess-r-object-tooltip]. ;; For example, when called while point is on a factor object, a table of that ;; factor will be shown in the tooltip. ;; The special key \"other\" in the alist defines which function to call when ;; the class is not mached in the alist. The default, str(), is a fairly useful ;; default for many, including data.frame and function objects.") ;; From Erik Iversion, slightly modified, ;; http://www.sigmafield.org/2009/10/01/r-object-tooltips-in-ess/ ;; (defun ess-r-object-tooltip () ;; "Get info for object at point, and display it in a tooltip." ;; (interactive) ;; (let ((proc (ess-get-process)) ;; (objname (current-word)) ;; (curbuf (current-buffer)) ;; (tmpbuf (get-buffer-create " *ess-r-object-tooltip*")) ;; bs) ;; (when objname ;; (ess-write-to-dribble-buffer ;; (format "ess-r-object-tooltip: objname='%s'\n" objname)) ;; (ess-command (concat "class(" objname ")\n") tmpbuf nil nil nil proc) ;; (with-current-buffer tmpbuf ;; (goto-char (point-min)) ;; ;; CARE: The following can only work in an English language locale! ;; ;; .lang. <- Sys.getenv("LANGUAGE"); Sys.setenv(LANGUAGE="en") ;; ;; .lc. <- Sys.getlocale("LC_MESSAGES"); Sys.setlocale("LC_MESSAGES","en_US.utf-8") ;; ;; and *afterward* Sys.setenv(LANGUAGE=.lang.); Sys.setlocale("LC_MESSAGES", .lc.) ;; ;; but that fails sometimes, e.g., on Windows ;; (unless (re-search-forward "\(object .* not found\)\|unexpected" nil t) ;; (re-search-forward "\"\\(.*\\)\"" nil t) ;; (let* ((objcls (match-string 1)) ;; (myfun (or (cdr (assoc-string objcls ess-r-object-tooltip-alist)) ;; (cdr (assoc 'other ess-r-object-tooltip-alist))))) ;; (ess-command (concat myfun "(" objname ")\n") tmpbuf nil nil nil proc)) ;; (setq bs (buffer-string))))) ;; (if bs ;; (ess-tooltip-show-at-point bs 0 30)))) ;; Erik: my default key map ;;(define-key ess-mode-map "\C-c\C-g" 'ess-r-object-tooltip) ;; On http://www.sigmafield.org/2009/10/01/r-object-tooltips-in-ess/ ;; in the comments, "Charlie" recommended ;; (custom-set-faces ;; '(tooltip ((t (:background "white" :foreground "blue" :foundry "fixed"))))) (provide 'ess-r-args) ;;; ess-r-args.el ends here ess/lisp/ess-vst-d.el0000664000175000017500000000605512423756516013063 0ustar eddedd;;; ess-vst-d.el --- ViSta customization ;; Copyright (C) 1997 A. J. Rossini ;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 26 Aug 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file extends the XLispStat configuration for ViSta. ;;; Code: ;;; Requires and Autoloads: (require 'ess-lsp-l) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (defvar VST-customize-alist '((ess-customize-alist . VST-customize-alist ) (ess-language . "XLS" ) (ess-dialect . "ViSta" ) (ess-loop-timeout . ess-XLS-loop-timeout) (ess-object-name-db-file . "ess-xls-namedb.el" ) (ess-help-sec-regex . " ") (ess-help-sec-keys-alist . " ") (inferior-ess-primary-prompt . "> ?" ) (comint-use-prompt-regexp . t) (inferior-ess-program . inferior-VST-program-name) (inferior-ess-help-command . "(help '%s)\n" ) (inferior-ess-objects-command . "(variables)\n" ) (inferior-ess-exit-command . "(exit)\n" ) (inferior-ess-start-file . nil) ;"~/.ess-VST") ;;(inferior-ess-start-args . nil) ) "Variables to customize for XLS.") (defun VST-mode (&optional proc-name) "Major mode for editing ViSta source. NOT EVEN STARTED." (interactive) (setq ess-customize-alist VST-customize-alist) (lisp-mode)) (defun ViSta () "Call 'ViSta', the extend XLispStat statistical system, from Forrest Young." (interactive) (setq ess-customize-alist VST-customize-alist) (ess-write-to-dribble-buffer (format "(ViSta): ess-dialect=%s , buf=%s\n" ess-dialect (current-buffer))) (inferior-ess)) ; Provide package (provide 'ess-vst-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-vst-d.el ends here ess/lisp/ess-sas-a.el0000664000175000017500000020226612577152666013042 0ustar eddedd;;; ess-sas-a.el --- clean-room implementation of many SAS-mode features ;; Copyright (C) 1997--2009 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Rodney A. Sparapani ;; Maintainer: ESS-core@r-project.org ;; Created: 17 November 1999 ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: ;;; Table of Contents ;;; Section 1: Variable Definitions ;;; Section 2: Function Definitions ;;; Section 3: Key Definitions ;;; Section 1: Variable Definitions (defvar ess-sas-file-path "." "Full path-name of the sas file to perform operations on.") (defcustom ess-sas-data-view-libname " " "*SAS code to define a library for `ess-sas-data-view-fsview' or `ess-sas-data-view-insight'." :group 'ess-sas :type 'string) (defcustom ess-sas-data-view-submit-options (if ess-microsoft-p "-noenhancededitor -nosysin -log NUL:" "-nodms -nosysin -log /dev/null -terminal") "*The command-line options necessary for your OS with respect to `ess-sas-data-view-fsview' and `ess-sas-data-view-insight'." :group 'ess-sas :type 'string) (defcustom ess-sas-data-view-fsview-command "; proc fsview data=" "*SAS code to open a SAS dataset with `ess-sas-data-view-fsview'." :group 'ess-sas :type 'string) (defcustom ess-sas-data-view-fsview-statement " " "*SAS code to perform a PROC FSVIEW statement with `ess-sas-data-view-fsview'." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-data-view-fsview-statement) (defcustom ess-sas-data-view-insight-command "; proc insight data=" "*SAS code to open a SAS dataset with `ess-sas-data-view-insight'." :group 'ess-sas :type 'string) (defcustom ess-sas-data-view-insight-statement " " "*SAS code to perform a PROC FSVIEW statement with `ess-sas-data-view-insight'." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-data-view-insight-statement) (defcustom ess-sas-graph-view-suffix-regexp "[.]\\([eE]?[pP][sS]\\|[pP][dD][fF]\\|[gG][iI][fF]\\|[jJ][pP][eE]?[gG]\\|[tT][iI][fF][fF]?\\)" "*GSASFILE suffix regexp." :group 'ess-sas :type 'string) (defcustom ess-sas-graph-view-viewer-alist ;;creates something like ;;'(("[pP][dD][fF]" . "/usr/local/bin/acroread") ("[eE]?[pP][sS]" . "/usr/local/bin/gv"))) (let ((ess-tmp-alist nil) (ess-tmp-ps nil) (ess-tmp-pdf nil)) (setq ess-tmp-ps (executable-find (if ess-microsoft-p "gsview32" "gsview"))) (if (not ess-tmp-ps) (setq ess-tmp-ps (executable-find "gv"))) (if (not ess-tmp-ps) (setq ess-tmp-ps (executable-find "ghostview"))) (setq ess-tmp-pdf (executable-find "evince")) (if (not ess-tmp-pdf) (setq ess-tmp-pdf (executable-find "xpdf"))) (if (not ess-tmp-pdf) (setq ess-tmp-pdf (if ess-microsoft-p "acrord32" "acroread"))) (if (and ess-tmp-ps ess-tmp-pdf) (setq ess-tmp-alist (list (cons "[eE]?[pP][sS]" ess-tmp-ps) (cons "[pP][dD][fF]" ess-tmp-pdf))) (if ess-tmp-ps (setq ess-tmp-alist (list (cons "[eE]?[pP][sS]" ess-tmp-ps) (cons "[pP][dD][fF]" ess-tmp-ps)))))) "*Associate file name extensions with graphics image file viewers." :group 'ess-sas :type 'string) ;;(defcustom ess-sas-smart-back-tab nil ;; "*Set to t to make C-TAB insert an end/%end; statement to close a block." ;; :group 'ess-sas ;;) (defcustom ess-sas-log-max 0 "*If >0 and .log file exceeds this many bytes, just \"refresh\" this many bytes." :group 'ess-sas :type 'integer) (defcustom ess-sas-rtf-font-name "Bitstream Vera Sans Mono" ; (if (featurep 'xemacs) "Lucida Sans Typewriter" "Bitstream Vera Sans Mono") "*Name of font to create MS RTF with" :group 'ess-sas :type 'string) (defcustom ess-sas-shell-buffer "*shell*" "*Name that you want to use for the shell buffer; buffer-local." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-shell-buffer) (defcustom ess-sas-shell-buffer-remote-host nil "*Remote host that you want to open a shell on." :group 'ess-sas :type '(choice (const nil) string)) (make-variable-buffer-local 'ess-sas-shell-buffer-remote-host) (defcustom ess-sas-shell-buffer-remote-init "ssh" "*Command to open a shell on a remote host." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-shell-buffer-remote-init) (defcustom ess-sas-submit-mac-virtual-pc nil "*Non-nil means that you want to run Windows SAS in a Virtual PC emulator on your Mac; buffer-local." :group 'ess-sas :type 'boolean) (make-variable-buffer-local 'ess-sas-submit-mac-virtual-pc) (defcustom ess-sas-submit-command sas-program "*Command to invoke SAS in batch; buffer-local." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-submit-command) (defcustom ess-sas-submit-command-options "-rsasuser" "*Options to pass to SAS in batch; buffer-local." :group 'ess-sas :type 'string) (make-variable-buffer-local 'ess-sas-submit-command-options) (defvar ess-sas-submit-method (if ess-microsoft-p (if (w32-shell-dos-semantics) 'ms-dos 'sh) (if (or (equal system-type 'Apple-Macintosh) (and ess-sas-submit-mac-virtual-pc (equal system-type 'darwin))) 'apple-script 'sh)) "Method used by `ess-sas-submit'. The default is based on the value of the emacs variable `system-type' and, on Windows, the function `w32-shell-dos-semantics'. 'sh if *shell* runs sh, ksh, csh, tcsh or bash 'ms-dos if *shell* follows MS-DOS semantics 'apple-script *shell* unavailable in Mac Classic, use AppleScript, also for Windows SAS in Virtual PC on Mac OS X Unix users will get 'sh by default. Windows users running bash in *shell* will get 'sh by default. Windows users running MS-DOS in *shell* will get 'ms-dos by default. Users accessing a remote machine with `telnet', `rlogin', `ssh', etc., should set this variable to 'sh regardless of their local shell (since their remote shell is 'sh).") (make-variable-buffer-local 'ess-sas-submit-method) (defcustom ess-sas-graph-view-viewer-default (if ess-microsoft-p "explorer" (if (equal ess-sas-submit-method 'sh) "sdtimage")) "*Default graphics image file viewer." :group 'ess-sas :type 'string) (defcustom ess-sas-submit-post-command (if (equal ess-sas-submit-method 'sh) "&" (if ess-microsoft-p "-icon")) "*Command-line statement to post-modify SAS invocation" :group 'ess-sas :type 'string) (defcustom ess-sas-submit-pre-command ;;"nohup" (if (equal ess-sas-submit-method 'sh) ;; nice is tricky, higher numbers give you lower priorities ;; if you are using csh/tcsh, the default priority is 4 ;; if you are using most other shells, the default priority is 10, ;; and some implementations are higher, i.e. zsh unless you ;; specify "setopt no_bg_nice" in your ~/.zshrc ;; therefore, on the same machine, you can run at a higher or ;; lower priority by changing shells, although, the command ;; line is the same! ;; the following code should give you a priority of 10 regardless ;; of which shell is in use, but it will default to the old ;; behavior if csh or variant is not recognized ;; this should avoid the necessity of each user needing to set this ;; variable correctly based on the shell that they use and provide ;; an environment where all shells are treated equally (let* ((temp-shell (getenv "SHELL")) ;; AJR: old CYGWIN versions return nil for (getenv ;; "SHELL"), so we need to deal with it 'cause I have to (temp-char (if temp-shell (string-match "/" temp-shell) nil))) (while temp-char (setq temp-shell (substring temp-shell (+ 1 temp-char))) (setq temp-char (string-match "/" temp-shell))) (cond ((or (equal temp-shell "csh") (equal temp-shell "tcsh")) "nohup nice +6") (t "nohup nice"))) (if ess-microsoft-p "start")) "*Command-line statement to precede SAS invocation, e.g. start or nohup" :group 'ess-sas :type 'string) (defcustom ess-sas-suffix-1 "txt" "*The first suffix to associate with SAS." :group 'ess-sas :type 'string) (defcustom ess-sas-suffix-2 "csv" "*The second suffix to associate with SAS." :group 'ess-sas :type 'string) (defcustom ess-sas-suffix-regexp (concat "[.]\\([sS][aA][sS]\\|[lL][oO][gG]\\|[lL][sS][tT]" (if ess-sas-suffix-1 (concat "\\|" (downcase ess-sas-suffix-1) "\\|" (upcase ess-sas-suffix-1))) (if ess-sas-suffix-2 (concat "\\|" (downcase ess-sas-suffix-2) "\\|" (upcase ess-sas-suffix-2))) "\\)") "*Regular expression for SAS suffixes." :group 'ess-sas :type 'string) (defcustom ess-sas-tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120) "List of tab stop positions used by `tab-to-tab-stop' in ESS[SAS]." :group 'ess-sas) (defcustom ess-sas-temp-root "-temp" "*Appended to root name of the temporary .sas file for `ess-sas-submit-region'." :group 'ess-sas :type 'string) (defvar ess-sas-versions '("sas") "List of partial strings for versions of SAS to access within ESS. Each string specifies the start of a filename. If a filename beginning with one of these strings is found on `exec-path', a M-x command for that version of SAS is made available. For example, if the file \"sas8\" is found and this variable includes the string \"sas\", a function called `M-x SAS8' will be available to run that version of SAS. If duplicate versions of the same program are found (which happens if the same path is listed on `exec-path' more than once), they are ignored by calling `ess-uniq-list'. If you set this variable, you need to restart Emacs (and set this variable before ess-site is loaded) for it to take effect.") ;;; Section 2: Function Definitions (defun ess-ebcdic-to-ascii-search-and-replace () "*Search and replace EBCDIC text with ASCII equivalents." (interactive) (let ((ess-tmp-dd (executable-find "dd")) (ess-tmp-recode (executable-find "recode")) (ess-tmp-util nil) (ess-tmp-util-args nil)) (if ess-tmp-dd (progn (setq ess-tmp-util ess-tmp-dd) (setq ess-tmp-util-args "conv=ascii")) (setq ess-tmp-util ess-tmp-recode) (setq ess-tmp-util-args "EBCDIC..ISO-8859-1")) (if ess-tmp-util (while (search-forward-regexp "[^\f\t\n -~][^\f\t\n -?A-JQ-Yb-jp-y]*[^\f\t\n -~]?" nil t) (call-process-region (match-beginning 0) (match-end 0) ess-tmp-util t (list t nil) t ess-tmp-util-args))))) (defun ess-exit-notify-sh (string) "Detect completion or failure of submitted job and notify the user." ;(let* ((exit-done "\\[[0-9]+\\]\\ *\\+*\\ *\\(Exit\\|Done\\).*$") (let* ((exit-done "\\[[0-9]+\\]\\ *\\+*\\ *\\(Exit\\|Done\\)[^\r\n]*") ; GNU Emacs needs this (beg (string-match exit-done string))) (if beg (message (substring string beg (match-end 0)))))) (defun ess-sas-append-log () "Append ess-temp.log to the current .log file." (interactive) (ess-sas-goto "log" 'revert) (goto-char (point-max)) (insert-file-contents (concat (ess-sas-temp-root) ".log")) (save-buffer)) (defun ess-sas-append-lst () "Append ess-temp.lst to the current .lst file." (interactive) (ess-sas-goto "lst" 'revert) (goto-char (point-max)) (insert-file-contents (concat (ess-sas-temp-root) ".lst")) (save-buffer)) (defun ess-sas-backward-delete-tab () "Moves the cursor to the previous tab-stop, deleting any characters on the way." (interactive) (let* (;; point of search ;;(ess-sas-search-point nil) ;; column of search ;;(ess-sas-search-column nil) ;; limit of search ;;(ess-sas-search-limit nil) ;; text to be inserted after a back-tab, if any ;;(ess-sas-end-text "end;") ;; current-column (ess-sas-column (current-column)) ;; remainder of current-column and sas-indent-width (ess-sas-remainder (% ess-sas-column sas-indent-width))) (if (not (= ess-sas-column 0)) (progn (if (= ess-sas-remainder 0) (setq ess-sas-remainder sas-indent-width)) (let ((backward-delete-char-untabify-method 'nil)) (backward-delete-char-untabify ess-sas-remainder t) (setq ess-sas-column (- ess-sas-column ess-sas-remainder)) (move-to-column ess-sas-column) (setq left-margin ess-sas-column)) )) )) ;; this feature was far too complicated to perfect ;; (if ess-sas-smart-back-tab (progn ;; (save-excursion ;; (setq ess-sas-search-point ;; (search-backward-regexp "end" nil t)) ;; (if (and ess-sas-search-point ;; (search-backward-regexp "%" (+ ess-sas-search-point -1) t)) ;; (setq ess-sas-search-point (+ ess-sas-search-point -1)) ;; ) ;; (if (and ess-sas-search-point ;; (not (equal ess-sas-column (current-column)))) ;; (setq ess-sas-search-point nil)) ;; ) ;; (save-excursion ;; (setq ess-sas-search-point ;; (search-backward-regexp "do\\|select" ;; ess-sas-search-point t)) ;; (setq ess-sas-search-column (current-column)) ;; (if ess-sas-search-point (progn ;; (save-excursion ;; (search-backward-regexp "^" nil t) ;; (setq ess-sas-search-limit (point)) ;; ) ;; (if (search-backward-regexp "if.*then\\|else" ess-sas-search-limit t) ;; (setq ess-sas-search-point (point))) ;; (if (search-backward-regexp "%" ess-sas-search-limit t) (progn ;; (setq ess-sas-end-text "%end;") ;; (setq ess-sas-search-point (point)) ;; )) ;; (setq ess-sas-search-column (current-column)) ;; (if (not (equal ess-sas-column ess-sas-search-column)) ;; (setq ess-sas-search-point nil)) ;; ))) ;; (if ess-sas-search-point (insert ess-sas-end-text)) ;; )) (defun ess-sas-cd () "Change directory, taking into account various issues with respect to `ess-sas-file-path'." ;(interactive) (ess-sas-file-path) (ess-sas-goto-shell t) (comint-send-input) (if (equal ess-sas-submit-method 'sh) (insert "cd \"" (car (last (split-string (file-name-directory ess-sas-file-path) "\\([a-zA-Z][a-zA-Z]:\\|]\\)"))) "\"") (if (equal ess-sas-submit-method 'ms-dos) (progn (if (string-equal ":" (substring ess-sas-file-path 1 2)) (progn (insert (substring ess-sas-file-path 0 2)) (comint-send-input))) (insert "cd \"" (convert-standard-filename (file-name-directory ess-sas-file-path)) "\"")))) (comint-send-input)) (defun ess-sas-create-local-variables-alist (&optional file-or-buffer) "Create an alist of local variables from file-or-buffer, use the current buffer if nil." (if file-or-buffer (set-buffer (ess-get-file-or-buffer file-or-buffer))) (ess-change-alist 'ess-kermit-remote-directory ess-kermit-remote-directory nil)) (defun ess-sas-data-view-fsview (&optional ess-sas-data) "Open a dataset for viewing with PROC FSVIEW." (interactive) (ess-save-and-set-local-variables) (save-excursion (let ((ess-tmp-sas-data nil) (ess-tmp-sas-data-view-fsview-statement ess-sas-data-view-fsview-statement) (ess-search-regexp "[ \t=]\\([a-zA-Z_][a-zA-Z_0-9]*[.][a-zA-Z_][a-zA-Z_0-9]*\\)\\(&.*\\)?[. ,()\t;/]") (ess-search-except "^\\([wW][oO][rR][kK]\\|[fF][iI][rR][sS][tT]\\|[lL][aA][sS][tT]\\)[.]")) (if ess-sas-data nil (save-match-data (search-backward-regexp "[ \t=]" nil t) (save-excursion (setq ess-tmp-sas-data (ess-search-except ess-search-regexp ess-search-except))) (if (not ess-tmp-sas-data) (setq ess-tmp-sas-data (ess-search-except ess-search-regexp ess-search-except t))) (setq ess-sas-data (read-string "Permanent SAS Dataset: " ess-tmp-sas-data)) ;; (ess-sas-goto-shell t) (ess-sas-cd) (insert (concat ess-sas-submit-pre-command " " ess-sas-submit-command " -initstmt \"" ess-sas-data-view-libname ess-sas-data-view-fsview-command ess-sas-data ";" ess-tmp-sas-data-view-fsview-statement "; run;\" " ess-sas-submit-command-options " " ess-sas-data-view-submit-options " " ess-sas-submit-post-command)) (comint-send-input) ))))) (defun ess-sas-data-view-insight (&optional ess-sas-data) "Open a dataset for viewing with PROC INSIGHT." (interactive) (ess-save-and-set-local-variables) (save-excursion (let ((ess-tmp-sas-data nil) (ess-tmp-sas-data-view-insight-statement ess-sas-data-view-insight-statement) (ess-search-regexp "[ \t=]\\([a-zA-Z_][a-zA-Z_0-9]*[.][a-zA-Z_][a-zA-Z_0-9]*\\)\\(&.*\\)?[. ,()\t;]") (ess-search-except "^\\([wW][oO][rR][kK]\\|[fF][iI][rR][sS][tT]\\|[lL][aA][sS][tT]\\)[.]")) (if ess-sas-data nil (save-match-data (search-backward-regexp "[ \t=]" nil t) (save-excursion (setq ess-tmp-sas-data (ess-search-except ess-search-regexp ess-search-except))) (if (not ess-tmp-sas-data) (setq ess-tmp-sas-data (ess-search-except ess-search-regexp ess-search-except t))) (setq ess-sas-data (read-string "Permanent SAS Dataset: " ess-tmp-sas-data)) ;; (ess-sas-goto-shell t) (ess-sas-cd) (insert (concat ess-sas-submit-pre-command " " ess-sas-submit-command " -initstmt \"" ess-sas-data-view-libname ess-sas-data-view-insight-command ess-sas-data ";" ess-tmp-sas-data-view-insight-statement "; run;\" " ess-sas-data-view-submit-options " " ess-sas-submit-post-command)) (comint-send-input) ))))) (defun ess-sas-graph-view () "Open a GSASFILE for viewing." (interactive) ;; (ess-sas-goto-shell t) (ess-sas-cd) (ess-sas-goto-log 'no-error-check) (save-excursion (let ( (ess-tmp-length (length ess-sas-graph-view-viewer-alist)) (ess-tmp-counter 0) (ess-tmp-graph nil) (ess-tmp-graph-alist nil) (ess-tmp-glyph nil) (ess-tmp-graph-regexp (concat "[cCub][oOty][rRpt][dDue][sSt][ ][wW][rR][iI][tT][tT][eE][nN][ ]+[tT][oO][ ]\n?[ ]*\\(.*" ;; (concat "[ ][rR][eE][cC][oO][rR][dD][sS][ ][wW][rR][iI][tT][tT][eE][nN][ ]+[tT][oO][ ]\n?[ ]*\\(.*" ess-sas-graph-view-suffix-regexp "\\)"))) ; (concat "['\"]\\(.*" ess-sas-graph-suffix-regexp "\\)['\"]"))) (save-match-data (search-backward-regexp "[ \t=]" nil t) (save-excursion (setq ess-tmp-graph (ess-search-except ess-tmp-graph-regexp))) (if (not ess-tmp-graph) (setq ess-tmp-graph (ess-search-except ess-tmp-graph-regexp nil t))) (setq ess-tmp-graph (read-string "GSASFILE: " (or ess-tmp-graph ess-sas-file-path))) (if (fboundp 'ess-xemacs-insert-glyph) (progn (if (string-match "[.][gG][iI][fF]" ess-tmp-graph) (setq ess-tmp-glyph 'gif) ;;else (if (string-match "[.][jJ][pP][eE]?[gG]" ess-tmp-graph) (setq ess-tmp-glyph 'jpeg))))) ;;GNU Emacs graphics file image viewing mode loaded? (if (and (boundp 'auto-image-file-mode) auto-image-file-mode (string-match "[.][jJ][pP][eE]?[gG]" ess-tmp-graph)) (find-file ess-tmp-graph) ;;else XEmacs graphics file image viewing mode loaded? (if (and (fboundp 'image-mode) (string-match "[.]\\([jJ][pP][eE]?[gG]\\|[gG][iI][fF]\\)" ess-tmp-graph)) (find-file ess-tmp-graph) ;;else XEmacs graphics file image viewing primitives loaded? (if ess-tmp-glyph (progn (switch-to-buffer (file-name-nondirectory ess-tmp-graph)) (ess-xemacs-insert-glyph (make-glyph (vector ess-tmp-glyph :file ess-tmp-graph)))) ;;else use the appropriate graphics file image viewer (while (< ess-tmp-counter ess-tmp-length) (setq ess-tmp-graph-alist (nth ess-tmp-counter ess-sas-graph-view-viewer-alist)) (setq ess-tmp-graph-regexp (car ess-tmp-graph-alist)) (if (string-match (concat "[.]" ess-tmp-graph-regexp) ess-tmp-graph) (progn (ess-sas-goto-shell t) (insert ess-sas-submit-pre-command " " (cdr ess-tmp-graph-alist) " " ess-tmp-graph (if (equal ess-sas-submit-method 'sh) " &")) (setq ess-tmp-glyph 'alist) (setq ess-tmp-counter ess-tmp-length)) ;;else (setq ess-tmp-counter (+ ess-tmp-counter 1)))) (if (not ess-tmp-glyph) (progn (ess-sas-goto-shell t) (insert ess-sas-submit-pre-command " " ess-sas-graph-view-viewer-default " " ess-tmp-graph (if (equal ess-sas-submit-method 'sh) " &")))) (comint-send-input)))))))) (defun ess-sas-file-path (&optional force) "Define `ess-sas-file-path' to be the current buffer depending on suffix." (interactive) (save-match-data (let ((ess-sas-temp-file (expand-file-name (buffer-name)))) (if (or force (string-match ess-sas-suffix-regexp ess-sas-temp-file)) ;;(progn (setq ess-sas-file-path (nth 0 (split-string ess-sas-temp-file "[<]"))))))) ;; (setq ess-directory (file-name-directory ess-sas-file-path))))))) (defun ess-sas-file-path-remote-host () "Return the remote host, if any, associated with `ess-sas-file-path'." (interactive) (let* ((temp-colon-pos (string-match ":" ess-sas-file-path)) (temp-list (if (or (not temp-colon-pos) (> temp-colon-pos 2)) (if (equal ess-sas-file-path ".") nil (split-string (file-name-directory ess-sas-file-path) "\\(@\\|:\\|]\\)")) (list ess-sas-file-path))) (temp-list-length (length temp-list))) (if (= temp-list-length 1) (setq temp-list nil) (if (= temp-list-length 2) (setq temp-list (car temp-list)) (setq temp-list (nth 1 temp-list)))) (if temp-list (setq temp-list (car (last (split-string temp-list "/"))))) temp-list)) (defun ess-sas-goto (suffix &optional revert no-create) "Find a file associated with a SAS file by suffix and revert if necessary." ; (interactive) ; (let ((ess-temp-regexp (concat ess-sas-suffix-regexp "[.]?[1-9]?\\'"))) ; can we identify common nonsense extensions like .log.1 or .sas.2? (let ((ess-temp-regexp (concat ess-sas-suffix-regexp "\\(@.+\\)?\\'"))) (save-match-data (if (or (string-match ess-temp-regexp (expand-file-name (buffer-name))) (string-match ess-temp-regexp ess-sas-file-path)) (progn (ess-sas-file-path) (let* ( (ess-sas-temp-file (replace-match (concat "." suffix) t t ess-sas-file-path)) (ess-sas-temp-buff (find-buffer-visiting ess-sas-temp-file)) (ess-temp-kermit-remote-directory ess-kermit-remote-directory)) (if ess-sas-temp-buff (switch-to-buffer ess-sas-temp-buff) ;; else (if no-create (setq revert nil) (if (file-exists-p ess-sas-temp-file) (find-file ess-sas-temp-file)))) ;; else ;; (let* ((ess-sas-buffer-list (buffer-list)) ;; (ess-sas-buffer-list-index 0) ;; (ess-sas-buffer-list-file nil) ;; (ess-sas-buffer-list-length (length ess-sas-buffer-list))) ;; (while (< ess-sas-buffer-list-index ess-sas-buffer-list-length) ;; (setq ess-sas-buffer-list-file ;; (buffer-file-name (nth ess-sas-buffer-list-index ess-sas-buffer-list))) ;; (if (and ess-sas-buffer-list-file ;; (string-match (concat "." suffix) ess-sas-buffer-list-file)) ;; (switch-to-buffer (nth ess-sas-buffer-list-index ess-sas-buffer-list)) ;; (setq ess-sas-buffer-list-index ess-sas-buffer-list-length) ;; ) ;; (setq ess-sas-buffer-list-index (+ 1 ess-sas-buffer-list-index)) ;; ))) (if (and (not no-create) (or (string-equal suffix "log") (string-equal suffix "lst"))) (ess-kermit-get (file-name-nondirectory ess-sas-temp-file) ess-temp-kermit-remote-directory)) (if revert (if (and (> ess-sas-log-max 0) (string-equal suffix "log") (> (ess-num-or-zero (nth 7 (file-attributes ess-sas-temp-file))) ess-sas-log-max)) (progn (insert-file-contents ess-sas-temp-file nil 0 ess-sas-log-max t) t) (ess-revert-wisely)) nil))))))) ;;(defun ess-sas-file (suffix &optional revert) ;; "Please use `ess-sas-goto' instead." ;; (let* ((tail (downcase (car (split-string ;; (car (last (split-string (buffer-name) "[.]"))) "[<]")))) ;;(if (fboundp 'file-name-extension) (file-name-extension (buffer-name)) ;; (substring (buffer-name) -3))) ;; (tail-in-tail-list (member tail (list "sas" "log" "lst" ;; ess-sas-suffix-1 ess-sas-suffix-2))) ;; (root (if tail-in-tail-list (expand-file-name (buffer-name)) ;; ess-sas-file-path)) ;; (ess-sas-arg (concat (file-name-sans-extension root) "." suffix)) ;; (ess-sas-buf (find-buffer-visiting ess-sas-arg))) ;; (if (equal tail suffix) (if revert (ess-revert-wisely)) ;; (if (not ess-sas-buf) (find-file ess-sas-arg) ;; (switch-to-buffer ess-sas-buf) ;; (if revert (ess-revert-wisely)))))) (defun ess-sas-goto-file-1 () "Switch to ess-sas-file-1 and revert from disk." (interactive) (ess-sas-goto ess-sas-suffix-1 'revert)) (defun ess-sas-goto-file-2 () "Switch to ess-sas-file-2 and revert from disk." (interactive) (ess-sas-goto ess-sas-suffix-2 'revert)) (defun ess-sas-goto-log (&optional ess-tmp-no-error-check) "Switch to the .log file, revert from disk and search for error messages." (interactive) (let ((ess-sas-error (concat "^ERROR [0-9]+-[0-9]+:\\|^ERROR:\\|_ERROR_=1 _N_=\\|_ERROR_=1[ ]?$" "\\|NOTE: MERGE statement has more than one data set with repeats" "\\|NOTE: Variable .* is uninitialized." "\\|NOTE: SAS went to a new line when INPUT statement reached past" "\\|NOTE 485-185: Informat .* was not found" "\\|NOTE: Estimated G matrix is not positive definite." "\\|NOTE: Compressing data set .* increased size by" "\\|NOTE: ERROR DETECTED IN ANNOTATE=" "\\|WARNING: Apparent symbolic reference .* not resolved." "\\|WARNING: Length of character variable has already been set." "\\|WARNING: Not all variables in the list " "\\|WARNING: RUN statement ignored due to previous errors." "\\|WARNING: Values exist outside the axis range" "\\|WARNING: Truncated record." "\\|Bus Error In Task\\|Segmentation Violation In Task")) (ess-sas-save-point nil)); (ess-sas-pop-mark nil)) (if (ess-sas-goto "log" 'revert) (progn (setq ess-sas-save-point (point)) (goto-char (point-min))) (setq ess-sas-save-point (point))) ;(if (number-char-or-marker-p ess-sas-save-point) (progn (if ess-tmp-no-error-check (goto-char ess-sas-save-point) (if (or (search-forward-regexp ess-sas-error nil t) (and (goto-char (point-min)) (search-forward-regexp ess-sas-error nil t))) t ; this feature never worked quite right (and was XEmacs only to boot) ; after highlighting an error message, moving point would cause an unwanted ; highlighting between point and mark; why god, why?!? ; ; (if (and (boundp 'zmacs-regions) zmacs-regions) ; (progn ; (if ess-sas-pop-mark (pop-mark) ; (setq ess-sas-pop-mark t)) ; (push-mark (match-beginning 0) t) ; (zmacs-activate-region))) (goto-char ess-sas-save-point))))) (defun ess-sas-goto-lst () "Switch to the .lst file and revert from disk." (interactive) (ess-sas-goto "lst" 'revert)) (defun ess-sas-goto-sas (&optional revert) "Switch to the .sas file." (interactive) (ess-sas-goto "sas" revert)) (defun ess-sas-goto-shell (&optional set-buffer) "Set `ess-sas-file-path' and goto `ess-sas-shell-buffer'. If optional argument is non-nil, then set-buffer rather than switch." (interactive) (ess-sas-file-path) ; The following let* block is an attempt to deal with remote directories. (let* ((temp-shell-buffer-remote-host (or ess-sas-shell-buffer-remote-host (ess-sas-file-path-remote-host))) (temp-shell-buffer-remote-init ess-sas-shell-buffer-remote-init) (temp-shell-buffer (if temp-shell-buffer-remote-host (concat "*" temp-shell-buffer-remote-host "*") ess-sas-shell-buffer)) ) (if (get-buffer temp-shell-buffer) (if set-buffer (set-buffer temp-shell-buffer) (switch-to-buffer temp-shell-buffer)) (shell) (rename-buffer temp-shell-buffer) (ess-sleep) ; GNU Emacs needs this (if temp-shell-buffer-remote-host (progn (insert (concat temp-shell-buffer-remote-init " " temp-shell-buffer-remote-host)) (comint-send-input)) ) (if (eq ess-sas-submit-method 'sh) (add-hook 'comint-output-filter-functions 'ess-exit-notify-sh)) ;; 19.28 ;; nil t) works for newer emacsen ) ) (goto-char (point-max)) ; (insert "cd " ess-temp-directory) ; (comint-send-input)) ) (defun ess-sas-interactive () "And now for something completely different." (interactive) (ess-sas-file-path) (setq ess-customize-alist SAS-customize-alist) (let ((ess-temp-sas-file (nth 0 (split-string (car (last (split-string ess-sas-file-path "\\([a-zA-Z][a-zA-Z]:\\|]\\)"))) "[.]")))) ;; (message "%s" ess-temp-sas-file) (setq ess-sas-shell-buffer "*iESS[SAS]*") (ess-sas-goto-shell) (ess-add-ess-process) (ess-setq-vars-local ess-customize-alist) (inferior-ess-mode) (ess-eval-linewise (concat ess-sas-submit-command " " ess-sas-submit-command-options " -altlog " ess-temp-sas-file ".log -altprint " ess-temp-sas-file ".lst -stdio")) ;;ess-temp-sas-file ".lst -stdio < /dev/tty")) (ess-sas-goto-sas) (setq ess-sas-submit-method 'iESS) (setq ess-eval-visibly-p nil) )) ;;(defun ess-sas-interactive () ;; (interactive) ;; (ess-sas-file-path) ;; (setq ess-sas-submit-method 'iESS) ;; ;; (let ((ess-temp-stderr " ") (ess-temp-stdout " ") (ess-temp-stdin " ")) ;; (setq ess-sas-shell-buffer "*LOG*") ;; (ess-sas-goto-shell) ;; (insert "tty") ;; (comint-send-input) ;; (sleep-for ess-sleep-for) ;; (save-excursion (setq ess-temp-stderr (ess-search-except "\\(/dev/[a-z0-9/]+\\)" nil t))) ;; (setq ess-sas-shell-buffer "*OUTPUT*") ;; (ess-sas-goto-shell) ;; (insert "tty") ;; (comint-send-input) ;; (sleep-for ess-sleep-for) ;; (save-excursion (setq ess-temp-stdout (ess-search-except "\\(/dev/[a-z0-9/]+\\)" nil t))) ;; (setq ess-sas-shell-buffer "*PROGRAM*") ;; (ess-sas-goto-shell) ;;;; (insert "tty") ;; (comint-send-input) ;; (sleep-for ess-sleep-for) ;; (insert "sh") ;; (comint-send-input) ;; (sleep-for ess-sleep-for) ;; (save-excursion (setq ess-temp-stdin (ess-search-except "\\(/dev/[a-z0-9/]+\\)" nil t))) ;; (insert (concat ess-sas-submit-command " " ess-sas-submit-command-options " -stdio <" ;; ess-temp-stdin " >1 " ess-temp-stdout " >2 " ess-temp-stderr)) ;; (comint-send-input) ;; (ess-add-ess-process) ;; (ess-sas-goto-sas) ;;)) (defun ess-sas-kill-buffers () "Kill all buffers related to a .sas file." (interactive) (ess-sas-file-path) (ess-sas-goto "log" nil t) (kill-buffer nil) (ess-sas-goto "lst" nil t) (kill-buffer nil) (ess-sas-goto ess-sas-suffix-1 nil t) (kill-buffer nil) (ess-sas-goto ess-sas-suffix-2 nil t) (kill-buffer nil) (ess-sas-goto "sas" nil t) (kill-buffer nil) ) (if (featurep 'xemacs) (condition-case nil (progn (require 'rtf-support) (when (featurep 'rtf-support) (defun ess-sas-rtf-portrait (&optional ess-tmp-font-size) "Creates an MS RTF portrait file from the current buffer." (interactive) (ess-sas-file-path t) (ess-revert-wisely) (if (equal ess-tmp-font-size nil) (setq ess-tmp-font-size "21")) (let ((ess-temp-rtf-file (replace-in-string ess-sas-file-path "[.][^.]*$" ".rtf"))) ;(expand-file-name (buffer-name)) "[.][^.]*$" ".rtf"))) (rtf-export ess-temp-rtf-file) (ess-sas-goto "rtf" t) (goto-char (point-min)) (replace-regexp "\\\\fmodern .*;" (concat "\\\\fmodern " ess-sas-rtf-font-name ";")) (goto-line 2) (if (string-match ess-sas-suffix-regexp ess-sas-file-path) (insert "\\margl720\\margr720\\margt720\\margb720\n")) (goto-char (point-min)) (while (replace-regexp "\\\\fs[0-9]+" (concat "\\\\fs" ess-tmp-font-size)) nil) (save-buffer) (kill-buffer (current-buffer)))) )) (error nil)) ; else (defun ess-sas-rtf-portrait (&optional ess-tmp-font-size) "Creates an MS RTF portrait file from the current buffer." (interactive) ; (ess-sas-file-path t) (ess-revert-wisely) (set-visited-file-name (concat (buffer-name) ".rtf")) ; (ess-sas-goto "rtf" t) (if 'buffer-read-only (setq buffer-read-only nil)) (ess-rtf-replace-chars) (goto-char (point-min)) (insert (concat "{\\rtf1\\ansi{\\fonttbl\\f1\\fmodern " ess-sas-rtf-font-name ";}\n" "\\margl720\\margr720\\margt720\\margb720\n" "{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;}\n" "{\\stylesheet{\\s15\\plain\\f1\\fs16\\cf1\\cb8\\lang1024 Emacs Text;}{\\*\\cs16 \\additive\\f1\\fs16\\cf1\\cb8\\lang1024 Emacs Base Style;}}\n" "{\\plain\\s15{\\cs16\\cs16\\f1\\fs16\\cf1\\cb8\\lang1024{\\cs16\\f1\\fs16\\cf1\\cb8\\lang1024\n")) (goto-char (point-max)) (insert "}}}}\n") (save-buffer) (kill-buffer (current-buffer))) ) (defun ess-rtf-replace-chars () "Convert a text file to an MS RTF file." (interactive) (goto-char (point-min)) (while (re-search-forward "\n" nil t) (replace-match "\\par\n" nil t)) (goto-char (point-min)) (while (re-search-forward "\f" nil t) (replace-match "\\page\n" nil t)) (goto-char (point-min)) (while (re-search-forward "\t" nil t) (replace-match "\\tab" nil t))) (defun ess-sas-rtf-landscape (&optional ess-tmp-font-size) "Creates an MS RTF landscape file from the current buffer." (interactive) (ess-revert-wisely) (set-visited-file-name (concat (buffer-name) ".rtf")) (if 'buffer-read-only (setq buffer-read-only nil)) (ess-rtf-replace-chars) (goto-char (point-min)) (insert (concat "{\\rtf1\\ansi{\\fonttbl\\f1\\fmodern " ess-sas-rtf-font-name ";}\n" "\\margl720\\margr720\\margt720\\margb720\n" "{\\*\\pgdsctbl\n" "{\\pgdsc0\\pgdscuse195\\lndscpsxn\\pgwsxn15840\\pghsxn12240\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\pgdscnxt0 Default;}}\n" "\\landscape\\paperh12240\\paperw15840\\margl1800\\margr1800\\margt1440\\margb1440\\sectd\\sbknone\\lndscpsxn\\pgwsxn15840\\pghsxn12240\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\ftnbj\\ftnstart1\\ftnrstcont\\ftnnar\\aenddoc\\aftnrstcont\\aftnstart1\\aftnnrlc\n" "{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;}\n" "{\\stylesheet{\\s15\\plain\\f1\\fs16\\cf1\\cb8\\lang1024 Emacs Text;}{\\*\\cs16 \\additive\\f1\\fs16\\cf1\\cb8\\lang1024 Emacs Base Style;}}\n" "{\\plain\\s15{\\cs16\\cs16\\f1\\fs16\\cf1\\cb8\\lang1024{\\cs16\\f1\\fs16\\cf1\\cb8\\lang1024\n")) (goto-char (point-max)) (insert "}}}}\n") (save-buffer) (kill-buffer (current-buffer))) (defun ess-sas-rtf-us-landscape () "Creates an MS RTF US landscape file from the current buffer." (interactive) (ess-sas-rtf-portrait "16") (ess-sas-goto "rtf" t) (goto-char (point-min)) (forward-line 3) (insert (concat "{\\*\\pgdsctbl\n" "{\\pgdsc0\\pgdscuse195\\lndscpsxn\\pgwsxn15840\\pghsxn12240\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\pgdscnxt0 Default;}}\n" "\\landscape\\paperh12240\\paperw15840\\margl1800\\margr1800\\margt1440\\margb1440\\sectd\\sbknone\\lndscpsxn\\pgwsxn15840\\pghsxn12240\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\ftnbj\\ftnstart1\\ftnrstcont\\ftnnar\\aenddoc\\aftnrstcont\\aftnstart1\\aftnnrlc\n")) (save-buffer) (kill-buffer (current-buffer))) (defun ess-sas-rtf-a4-landscape () "Creates an MS RTF A4 landscape file from the current buffer." (interactive) (ess-sas-rtf-portrait "16") (ess-sas-goto "rtf" t) (goto-char (point-min)) (forward-line 3) (insert (concat "{\\*\\pgdsctbl\n" "{\\pgdsc0\\pgdscuse195\\lndscpsxn\\pgwsxn16837\\pghsxn11905\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\pgdscnxt0 Default;}}\n" "\\landscape\\paperh11905\\paperw16837\\margl1800\\margr1800\\margt1440\\margb1440\\sectd\\sbknone\\lndscpsxn\\pgwsxn16837\\pghsxn11905\\marglsxn1800\\margrsxn1800\\margtsxn1440\\margbsxn1440\\ftnbj\\ftnstart1\\ftnrstcont\\ftnnar\\aenddoc\\aftnrstcont\\aftnstart1\\aftnnrlc\n")) (save-buffer) (kill-buffer (current-buffer))) (defun ess-sas-submit () "Save the .sas file and submit to shell using a function that depends on the value of `ess-sas-submit-method'" (interactive) (ess-sas-file-path) (ess-sas-goto-sas) (save-buffer) (hack-local-variables) ;(ess-save-and-set-local-variables) (cond ((eq ess-sas-submit-method 'apple-script) (ess-sas-submit-mac ess-sas-submit-command ess-sas-submit-command-options)) ((eq ess-sas-submit-method 'ms-dos) (ess-sas-submit-windows ess-sas-submit-command ess-sas-submit-command-options)) ((eq ess-sas-submit-method 'iESS) (ess-sas-submit-iESS ess-sas-submit-command ess-sas-submit-command-options)) ((eq ess-sas-submit-method 'sh) (ess-sas-submit-sh ess-sas-submit-command ess-sas-submit-command-options)) (t (ess-sas-submit-sh ess-sas-submit-command ess-sas-submit-command-options))) ; (ess-sas-goto-sas) ) (defun ess-sas-submit-iESS (arg1 arg2) "iESS Submit a batch job in an inferior-ESS buffer. The buffer should (1) have telnet access and be running a shell on a remote machine or (2) be running a shell on the local machine. The user can telnet to the remote computer and then declare the *telnet-buffer* to be an inferior ESS buffer with the `ess-add-ess-process' command. When using a remote computer, the .sas file must live on the remote computer and be accessed through `ange-ftp'. When `ess-sas-submit' saves a file, it is therefore saved on the remote computer. The various functions such as `ess-sas-goto-lst' retrieve their files from the remote computer. Local copies of the .sas .lst .log and others may be made manually with `write-buffer'." ;; (ess-eval-linewise (concat "cd default-directory)) (ess-force-buffer-current "Process to load into: ") (ess-eval-linewise (concat "cd " (car (last (split-string (file-name-directory ess-sas-file-path) "\\(:\\|]\\)"))))) (ess-eval-linewise (concat arg1 " " arg2 " " (buffer-name) " &"))) (defun ess-sas-submit-mac (arg1 arg2) "If you are using Mac SAS, then arg1, `ess-sas-submit-command', should be the AppleScript command \"invoke SAS using program file\", and, if necessary, arg2, `ess-sas-submit-command-options', is a string of the form \"with options { \\\"option-1\\\", \\\"option-2\\\", etc.}\". If you are using Windows SAS with the PC emulator Virtual PC, then `ess-sas-submit-command' should be ..." ;(ess-save-and-set-local-variables) (do-applescript (concat arg1 " \"" (if (not ess-sas-submit-mac-virtual-pc) (unix-filename-to-mac default-directory)) (buffer-name) "\"" arg2))) (defun ess-sas-submit-region () "Write region to temporary file, and submit to SAS." (interactive) (ess-sas-file-path) (hack-local-variables t) (write-region (region-beginning) (region-end) (concat (ess-sas-temp-root) ".sas")) (let ((arg1 ess-sas-submit-command) (arg2 ess-sas-submit-command-options)) (save-excursion (ess-sas-goto-shell t) (if (and (w32-shell-dos-semantics) (string-equal ":" (substring ess-sas-file-path 1 2))) (progn (insert (substring ess-sas-file-path 0 2)) (comint-send-input) )) (insert "cd \"" (convert-standard-filename (file-name-directory ess-sas-file-path)) "\"") (comint-send-input) (insert (concat ess-sas-submit-pre-command " " arg1 " " arg2 " " (ess-sas-temp-root) " " ess-sas-submit-post-command)) (comint-send-input) )) ) (defun ess-sas-submit-sh (arg1 arg2) "Unix or bash in the *shell* buffer. Multiple processing is supported on this platform. SAS may not be found in your PATH. You can alter your PATH to include SAS or you can specify the PATHNAME (PATHNAME can NOT contain spaces), i.e. let arg1 be your local equivalent of \"/usr/local/sas612/sas\"." (if (string-equal (substring (file-name-nondirectory ess-sas-file-path) 0 1) ess-kermit-prefix) (progn (ess-kermit-send) (ess-sas-goto-shell t) (insert ess-sas-submit-pre-command " " arg1 " " (substring (file-name-sans-extension (file-name-nondirectory ess-sas-file-path)) 1) " " arg2 " " ess-sas-submit-post-command) (comint-send-input)) ;;else ;; (ess-sas-goto-shell t) (ess-sas-cd) ; (insert "cd " (car (last (split-string (file-name-directory ess-sas-file-path) ;"\\([a-zA-Z][a-zA-Z]:\\|]\\)")))) ; (comint-send-input) (insert ess-sas-submit-pre-command " " arg1 " " (file-name-sans-extension (file-name-nondirectory ess-sas-file-path)) " " arg2 " " ess-sas-submit-post-command)) ; (ess-sleep) (comint-send-input)) (defun ess-sas-submit-windows (arg1 arg2) "Windows using MS-DOS prompt in the *shell* buffer. Multiple processing is supported on this platform. On most Windows installations, SAS will not be found in your PATH so you should alter your PATH to include SAS, i.e. SET PATH=%PATH%;C:\\Program Files\\SAS Or you can specify the PATHNAME directly (you must escape spaces by enclosing the string in \\\"'s), i.e. let `ess-sas-submit-command' be \"\\\"C:\\Program Files\\SAS\\sas.exe\\\"\". Keep in mind that the maximum command line length in MS-DOS is 127 characters so altering your PATH is preferable." ;(ess-save-and-set-local-variables) (ess-sas-goto-shell t) (if (string-equal ":" (substring ess-sas-file-path 1 2)) (progn (insert (substring ess-sas-file-path 0 2)) (comint-send-input) ) ) (insert "cd \"" (convert-standard-filename (file-name-directory ess-sas-file-path)) "\"") (comint-send-input) (insert ess-sas-submit-pre-command " " arg1 " -sysin \"" (file-name-sans-extension (file-name-nondirectory ess-sas-file-path)) "\" " arg2 " " ess-sas-submit-post-command) (comint-send-input)) (defun ess-sas-tab-to-tab-stop () "Tab to next tab-stop and set left margin." (interactive) (tab-to-tab-stop) (setq left-margin (current-column)) ) (defun ess-sas-temp-root () "Return `ess-sas-file-path' sans extension with `ess-sas-temp-root' appended." (concat (file-name-sans-extension ess-sas-file-path) ess-sas-temp-root)) (defun ess-sas-transcript (&optional strip) "Comment .log messages to create a .sas program; use C-u to strip." (interactive "P") (save-excursion (goto-char (point-min)) (while (search-forward-regexp (concat "^\\(\\(1[ \t]+The SAS System\\| \\|NOTE\\|WARNING\\|ERROR\\|" "[ \t]+\\(\\(real\\|cpu\\) time\\|Licensed to\\|Engine:\\|" "Physical Name:\\|File Name=\\|Owner Name=\\|Group Name=\\|" "Access Permission=\\|File Size (bytes)=\\|Pipe command=\\|" "RECFM=[DFNPV],LRECL=\\|[0-9]+:[0-9]+[ /t]+[0-9]+:[0-9]+\\|" "[1-9][0-9]* at [0-9]+:[0-9]+[ /t]+[1-9][0-9]* at [0-9]+:[0-9]+\\)\\).*$" "\\|[0-9]+\\([ \t]+!\\)?\\|MPRINT([_A-Z]+):\\|" "[ \t]+\\(values at the places given by: (Line):(Column).\\|" "The m\\(in\\|ax\\)imum record length was [1-9][0-9]*.\\|" "One or more lines were truncated.\\|" "Each place is given by: (Number of times) at (Line):(Column).\\|" "[0-9][0-9]:[0-9][0-9] [MTWFS][aeioudhnrst]+day, [JFMASOND]" "[aeiouybcghlmnprstv]+ [1-9][0-9]?, 20[0-9][0-9]\\)\\)") nil t) (replace-match (if strip " " "/*\\&*/") t)) )) (defun ess-sas-toggle-sas-listing-mode (&optional force) "Toggle SAS-listing-mode for .lst files." (interactive) (ess-sas-goto-lst) (if (equal (cdr (assoc "\\.[lL][sS][tT]\\'" auto-mode-alist)) 'SAS-listing-mode) (progn (setq auto-mode-alist (delete '("\\.[lL][sS][tT]\\'" . SAS-listing-mode) auto-mode-alist)) (setq buffer-read-only nil) (ess-listing-minor-mode 0)) (setq auto-mode-alist (append '(("\\.[lL][sS][tT]\\'" . SAS-listing-mode)) auto-mode-alist)) (setq buffer-read-only t) (ess-listing-minor-mode 1))) (defun ess-sas-toggle-sas-log-mode () "Toggle SAS-log-mode for .log files." (interactive) (ess-sas-goto-log) (kill-buffer nil) ; (if (equal (cdr (assoc "\\.[lL][oO][gG]\\'" auto-mode-alist)) 'SAS-log-mode) (progn ; (setq auto-mode-alist (delete '("\\.[lL][oO][gG]\\'" . SAS-log-mode) auto-mode-alist)) ; (setq buffer-read-only nil) ; (ess-transcript-minor-mode 0) ; (font-lock-mode 0)) ; (setq auto-mode-alist (append '(("\\.[lL][oO][gG]\\'" . SAS-log-mode)) auto-mode-alist)) ; (setq buffer-read-only t) ; (ess-transcript-minor-mode 1) ; (font-lock-mode 1) ; (font-lock-fontify-buffer)) (if (equal (cdr (assoc "\\.[lL][oO][gG]\\'" auto-mode-alist)) 'SAS-log-mode) (setq auto-mode-alist (delete '("\\.[lL][oO][gG]\\'" . SAS-log-mode) auto-mode-alist)) (setq auto-mode-alist (append '(("\\.[lL][oO][gG]\\'" . SAS-log-mode)) auto-mode-alist))) (ess-sas-goto-log)) (defun ess-sas-versions-create () "Generate the `M-x SASV' functions for starting other versions of SAS. See `ess-sas-versions' for strings that determine which functions are created. The local variable `ess-sas-versions-created' is used to return list of the new SAS defuns, if any, that were created. The defuns will normally be placed on the menubar upon ESS initialisation." ;; This works by creating a temp buffer where the template function is ;; edited so that V is replaced by the version number (let ((template "") (beg) (versions) (version) (eval-buf (get-buffer-create "*ess-temp-sas-evals*")) (ess-sas-versions-created) ) ;; ;; This is the template function used for creating M-x SASV. (setq template "(defun SASV (&optional start-args) \"Call SASV, i.e., the SAS version 'SASV' using ESS. This function was generated by `ess-sas-versions-create'.\" (interactive \"P\") (let ((inferior-SAS-program-name \"SASV\")) (SAS start-args))) ") (save-excursion (set-buffer eval-buf) ;; clear the buffer. (delete-region (point-min) (point-max)) ;; Find which versions of SAS we want. Remove the pathname, leaving just ;; the name of the executable. (setq versions (ess-uniq-list (mapcar 'file-name-nondirectory (apply 'nconc (mapcar 'ess-find-exec-completions ess-sas-versions))))) (ess-write-to-dribble-buffer (format "(SAS): ess-sas-versions-create making M-x defuns for %s" (mapconcat 'identity versions " "))) (setq ess-sas-versions-created versions) ;keep copy for returning at end. ;; Iterate over each string in VERSIONS, creating a new defun each time. (while versions (setq version (car versions) versions (cdr versions)) (setq beg (point)) (insert template) (goto-char beg) (while (search-forward "SASV" nil t) (replace-match version t t)) (goto-char (point-max)) ) ;; buffer has now been created with defuns, so eval them! (eval-buffer) (kill-buffer eval-buf) ) ess-sas-versions-created)) ;;; Section 3: Key Definitions (defun ess-sas-edit-keys-set (&optional arg) "Set TAB/RET key in `SAS-mode'. If arg is nil TAB is `sas-indent-line' and RET is `newline-and-indent'. Else TAB is `ess-sas-tab-to-tab-stop', C-TAB is `ess-sas-backward-delete-tab' and RET is `newline'." (interactive) (if arg (progn (if (and (equal emacs-major-version 19) (equal emacs-minor-version 28)) (define-key sas-mode-local-map [C-tab] 'ess-sas-backward-delete-tab) ;;else (define-key sas-mode-local-map [(control tab)] 'ess-sas-backward-delete-tab)) (define-key sas-mode-local-map [return] 'newline) (define-key sas-mode-local-map "\t" 'ess-sas-tab-to-tab-stop)) ;;else (define-key sas-mode-local-map [return] 'newline-and-indent) (define-key sas-mode-local-map "\t" 'sas-indent-line))) (defvar ess-sas-edit-keys-toggle nil "Toggle TAB/RET key in `SAS-mode'. nil binds TAB to `sas-indent-line' and RET to `newline-and-indent'. Non-nil binds TAB to `ess-sas-tab-to-tab-stop', C-TAB to `ess-sas-backward-delete-tab', and RET to `newline'.") (defun ess-sas-edit-keys-toggle (&optional arg) "Toggle `ess-sas-edit-keys-toggle'. Optional arg is still accepted for backward compatibility, however, arg is ignored." (interactive) (setq ess-sas-edit-keys-toggle (not ess-sas-edit-keys-toggle)) (ess-sas-edit-keys-set ess-sas-edit-keys-toggle) ) (defvar ess-sas-global-pc-keys nil "Non-nil if function keys use PC-like SAS key definitions in all modes.") (defun ess-sas-global-pc-keys () "PC-like SAS key definitions" (interactive) (when (or (not (featurep 'xemacs)) (featurep 'rtf-support)) (global-set-key [(control f1)] 'ess-sas-rtf-portrait) (global-set-key [(control f2)] 'ess-sas-rtf-landscape)) (global-set-key (quote [f2]) 'ess-revert-wisely) (global-set-key (quote [f3]) 'ess-sas-goto-shell) (global-set-key (quote [f4]) 'ess-sas-goto-file-1) (global-set-key (quote [f5]) 'ess-sas-goto-sas) (global-set-key (quote [f6]) 'ess-sas-goto-log) (global-set-key [(control f6)] 'ess-sas-append-log) (global-set-key (quote [f7]) 'ess-sas-goto-lst) (global-set-key [(control f7)] 'ess-sas-append-lst) (global-set-key (quote [f8]) 'ess-sas-submit) (global-set-key [(control f8)] 'ess-sas-submit-region) (global-set-key (quote [f9]) 'ess-sas-data-view-fsview) (global-set-key [(control f9)] 'ess-sas-data-view-insight) ;; (global-set-key (quote [f10]) 'ess-sas-toggle-sas-log-mode) ;; (global-set-key [(control f10)] 'ess-sas-toggle-sas-listing-mode) ;; (global-set-key (quote [f11]) 'ess-sas-goto-file-2) ;; (global-set-key [(control f11)] 'ess-ebcdic-to-ascii-search-and-replace) (global-set-key (quote [f12]) 'ess-sas-graph-view) (if (and ess-sas-edit-keys-toggle (equal emacs-major-version 19) (equal emacs-minor-version 28)) (global-set-key [C-tab] 'ess-sas-backward-delete-tab) ;else (global-set-key [(control tab)] 'ess-sas-backward-delete-tab)) ;(define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path) (setq ess-sas-global-pc-keys t) (setq ess-sas-global-unix-keys nil) (setq ess-sas-local-pc-keys nil) (setq ess-sas-local-unix-keys nil) ) (defvar ess-sas-global-unix-keys nil "Non-nil if function keys use Unix-like SAS key definitions in all modes.") (defun ess-sas-global-unix-keys () "Unix/Mainframe-like SAS key definitions" (interactive) (when (or (not (featurep 'xemacs)) (featurep 'rtf-support)) (global-set-key [(control f1)] 'ess-sas-rtf-portrait) (global-set-key [(control f2)] 'ess-sas-rtf-landscape)) (global-set-key (quote [f2]) 'ess-revert-wisely) (global-set-key (quote [f3]) 'ess-sas-submit) (global-set-key [(control f3)] 'ess-sas-submit-region) (global-set-key (quote [f4]) 'ess-sas-goto-sas) (global-set-key (quote [f5]) 'ess-sas-goto-log) (global-set-key [(control f5)] 'ess-sas-append-log) (global-set-key (quote [f6]) 'ess-sas-goto-lst) (global-set-key [(control f6)] 'ess-sas-append-lst) (global-set-key (quote [f7]) 'ess-sas-goto-file-1) (global-set-key (quote [f8]) 'ess-sas-goto-shell) (global-set-key (quote [f9]) 'ess-sas-data-view-fsview) (global-set-key [(control f9)] 'ess-sas-data-view-insight) ;; (global-set-key (quote [f10]) 'ess-sas-toggle-sas-log-mode) ;; (global-set-key [(control f10)] 'ess-sas-toggle-sas-listing-mode) ;; (global-set-key (quote [f11]) 'ess-sas-goto-file-2) ;; (global-set-key [(control f11)] 'ess-ebcdic-to-ascii-search-and-replace) (global-set-key (quote [f12]) 'ess-sas-graph-view) (if (and ess-sas-edit-keys-toggle (equal emacs-major-version 19) (equal emacs-minor-version 28)) (global-set-key [C-tab] 'ess-sas-backward-delete-tab) ;else (global-set-key [(control tab)] 'ess-sas-backward-delete-tab)) ;(define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path) (setq ess-sas-global-pc-keys nil) (setq ess-sas-global-unix-keys t) (setq ess-sas-local-pc-keys nil) (setq ess-sas-local-unix-keys nil) ) (defvar ess-sas-local-pc-keys nil "Non-nil if function keys use PC-like SAS key definitions in SAS-mode and related modes.") (defun ess-sas-local-pc-keys () "PC-like SAS key definitions." (interactive) (when (or (not (featurep 'xemacs)) (featurep 'rtf-support)) (define-key sas-mode-local-map [(control f1)] 'ess-sas-rtf-portrait) (define-key sas-mode-local-map [(control f2)] 'ess-sas-rtf-landscape)) (define-key sas-mode-local-map (quote [f2]) 'ess-revert-wisely) (define-key sas-mode-local-map (quote [f3]) 'ess-sas-goto-shell) (define-key sas-mode-local-map (quote [f4]) 'ess-sas-goto-file-1) (define-key sas-mode-local-map (quote [f5]) 'ess-sas-goto-sas) (define-key sas-mode-local-map (quote [f6]) 'ess-sas-goto-log) (define-key sas-mode-local-map [(control f6)] 'ess-sas-append-log) (define-key sas-mode-local-map (quote [f7]) 'ess-sas-goto-lst) (define-key sas-mode-local-map [(control f7)] 'ess-sas-append-lst) (define-key sas-mode-local-map (quote [f8]) 'ess-sas-submit) (define-key sas-mode-local-map [(control f8)] 'ess-sas-submit-region) (define-key sas-mode-local-map (quote [f9]) 'ess-sas-data-view-fsview) (define-key sas-mode-local-map [(control f9)] 'ess-sas-data-view-insight) (define-key sas-mode-local-map (quote [f10]) 'ess-sas-toggle-sas-log-mode) (define-key sas-mode-local-map [(control f10)] 'ess-sas-toggle-sas-listing-mode) (define-key sas-mode-local-map (quote [f11]) 'ess-sas-goto-file-2) (define-key sas-mode-local-map [(control f11)] 'ess-ebcdic-to-ascii-search-and-replace) (define-key sas-mode-local-map (quote [f12]) 'ess-sas-graph-view) ;(define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path) (setq ess-sas-global-pc-keys nil) (setq ess-sas-global-unix-keys nil) (setq ess-sas-local-pc-keys t) (setq ess-sas-local-unix-keys nil) ) (defvar ess-sas-local-unix-keys nil "Non-nil if function keys use Unix-like SAS key definitions in SAS-mode and related modes.") (defun ess-sas-local-unix-keys () "Unix/Mainframe-like SAS key definitions" (interactive) (when (or (not (featurep 'xemacs)) (featurep 'rtf-support)) (define-key sas-mode-local-map [(control f1)] 'ess-sas-rtf-portrait) (define-key sas-mode-local-map [(control f2)] 'ess-sas-rtf-landscape)) (define-key sas-mode-local-map (quote [f2]) 'ess-revert-wisely) (define-key sas-mode-local-map (quote [f3]) 'ess-sas-submit) (define-key sas-mode-local-map [(control f3)] 'ess-sas-submit-region) (define-key sas-mode-local-map (quote [f4]) 'ess-sas-goto-sas) (define-key sas-mode-local-map (quote [f5]) 'ess-sas-goto-log) (define-key sas-mode-local-map [(control f5)] 'ess-sas-append-log) (define-key sas-mode-local-map (quote [f6]) 'ess-sas-goto-lst) (define-key sas-mode-local-map [(control f6)] 'ess-sas-append-lst) (define-key sas-mode-local-map (quote [f7]) 'ess-sas-goto-file-1) (define-key sas-mode-local-map (quote [f8]) 'ess-sas-goto-shell) (define-key sas-mode-local-map (quote [f9]) 'ess-sas-data-view-fsview) (define-key sas-mode-local-map [(control f9)] 'ess-sas-data-view-insight) (define-key sas-mode-local-map (quote [f10]) 'ess-sas-toggle-sas-log-mode) (define-key sas-mode-local-map [(control f10)] 'ess-sas-toggle-sas-listing-mode) (define-key sas-mode-local-map (quote [f11]) 'ess-sas-goto-file-2) (define-key sas-mode-local-map [(control f11)] 'ess-ebcdic-to-ascii-search-and-replace) (define-key sas-mode-local-map (quote [f12]) 'ess-sas-graph-view) ;(define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path) (setq ess-sas-global-pc-keys nil) (setq ess-sas-global-unix-keys nil) (setq ess-sas-local-pc-keys nil) (setq ess-sas-local-unix-keys t) ) (provide 'ess-sas-a) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sas-a.el ends here ess/lisp/ess-roxy.el0000664000175000017500000010127512632537307013024 0ustar eddedd;;; ess-roxy.el --- convenient editing of in-code roxygen documentation ;; ;; Copyright (C) 2009--2012 Henning Redestig, A.J. Rossini, Richard ;; M. Heiberger, Martin Maechler, Kurt Hornik, Rodney Sparapani, Stephen ;; Eglen and Vitalie Spinu. ;; ;; Author: Henning Redestig ;; Keywords: convenience, tools ;; ;; This file is part of ESS ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3 of the ;; License, or (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see ;; . ;;; Commentary: ;; Lots of inspiration from doc-mode, ;; http://nschum.de/src/emacs/doc-mode/ ;; ;; Features:: ;; ;; - basic highlighting ;; - generating and updating templates from function definition and customized default template ;; - C-c C-o C-o :: update template ;; - navigating and filling roxygen fields ;; - C-c TAB, M-q, C-a, ENTER, M-h :: advised tag completion, fill-paragraph, ;; move-beginning-of-line, newline-and-indent ;; - C-c C-o n,p :: next, previous roxygen entry ;; - C-c C-o C-c :: Unroxygen region. Convenient for editing examples. ;; - folding visibility using hs-minor-mode ;; - TAB :: advised ess-ident-command, hide entry if in roxygen doc. ;; - preview ;; - C-c C-o C-r :: create a preview of the Rd file as generated ;; using roxygen ;; - C-c C-o C-t :: create a preview of the Rd HTML file as generated ;; using roxygen and the tools package ;; - C-c C-o t :: create a preview of the Rd text file ;; ;; Known issues: ;; ;; - hideshow mode does not work very well. In particular, if ordinary ;; comments precede a roxygen entry, then both will be hidden in the ;; same overlay from start and not unfoldable using TAB since the ;; roxygen prefix is not present. The planned solution is implement ;; a replacement for hideshow. ;; - only limited functionality for S4 documentation. ;; this *is* enabled now via ess-mode-hook in ./ess-site.el ;;; Code: (require 'ess-custom) (require 'hideshow) (eval-when-compile (require 'cl)) (autoload 'Rd-preview-help "ess-rd" "[autoload]" t) ;; ------------------ (defvar ess-roxy-mode-map (let ((map (make-sparse-keymap))) (if ess-roxy-hide-show-p (define-key map (kbd "C-c C-o h") 'ess-roxy-hide-all)) ;; short version (*first*: -> key binding shown in menu): (define-key map (kbd "C-c C-o n") 'ess-roxy-next-entry) (define-key map (kbd "C-c C-o p") 'ess-roxy-previous-entry) ;; For consistency (e.g. C-c C-o C-h !): kept here *in* addition to above (define-key map (kbd "C-c C-o C-o") 'ess-roxy-update-entry) (define-key map (kbd "C-c C-o C-r") 'ess-roxy-preview-Rd) (define-key map (kbd "C-c C-o C-w") 'ess-roxy-preview-HTML) (define-key map (kbd "C-c C-o C-t") 'ess-roxy-preview-text) (define-key map (kbd "C-c C-o C-c") 'ess-roxy-toggle-roxy-region) map) ) ;; (defvar ess-roxy-font-lock-keywords nil) (defvar ess-roxy-font-lock-keywords `((,(concat ess-roxy-re " *\\([@\\]" (regexp-opt ess-roxy-tags-param t) "\\)\\>") (1 'font-lock-keyword-face prepend)) (,(concat ess-roxy-re " *\\([@\\]" (regexp-opt '("param" "importFrom" "importClassesFrom" "importMethodsFrom") t) "\\)\\>\\(?:[ \t]+\\(\\sw+\\)\\)?") (1 'font-lock-keyword-face prepend) (3 'font-lock-variable-name-face prepend)) (,(concat "[@\\]" (regexp-opt ess-roxy-tags-noparam t) "\\>") (0 'font-lock-variable-name-face prepend)) (,(concat ess-roxy-re) (0 'bold prepend)))) (define-minor-mode ess-roxy-mode "Minor mode for editing in-code documentation." ;; :lighter " Rox" :keymap ess-roxy-mode-map (if ess-roxy-mode (progn (unless (featurep 'xemacs) ;; does not exist in xemacs: (font-lock-add-keywords nil ess-roxy-font-lock-keywords)) (if (and (featurep 'emacs) (>= emacs-major-version 24)) (add-to-list 'completion-at-point-functions 'ess-roxy-tag-completion) (add-to-list 'comint-dynamic-complete-functions 'ess-roxy-complete-tag)) (if ess-roxy-hide-show-p (progn ;(setq hs-c-start-regexp "s") (if (condition-case nil (if (and (symbolp hs-minor-mode) (symbol-value hs-minor-mode)) nil t) (error t) ) (progn (hs-minor-mode))) (if ess-roxy-start-hidden-p (ess-roxy-hide-all))))) (if ess-roxy-hide-show-p (if hs-minor-mode (progn (hs-show-all) (hs-minor-mode)))) (unless (featurep 'xemacs) (font-lock-remove-keywords nil ess-roxy-font-lock-keywords))) (when font-lock-mode (font-lock-fontify-buffer)) ;; for auto fill functionality (make-local-variable 'paragraph-start) (setq paragraph-start (concat "\\(" ess-roxy-re "\\)*" paragraph-start)) (make-local-variable 'paragraph-separate) (setq paragraph-separate (concat "\\(" ess-roxy-re "\\)*" paragraph-separate)) (make-local-variable 'adaptive-fill-function) (setq adaptive-fill-function 'ess-roxy-adaptive-fill-function) (add-hook 'ess-presend-filter-functions 'ess-roxy-remove-roxy-re nil 'local) ) ;; (setq hs-c-start-regexp ess-roxy-str) ;; (make-variable-buffer-local 'hs-c-start-regexp) ;;; Function definitions (defun ess-back-to-roxy () "Go to roxy prefix" (progn (end-of-line) (re-search-backward (concat ess-roxy-re " ?") (point-at-bol)) (goto-char (match-end 0)))) (defun ess-roxy-beg-of-entry () "Get point number at start of current entry, 0 if not in entry" (save-excursion (let (beg) (beginning-of-line) (setq beg -1) (if (not (ess-roxy-entry-p)) (setq beg 0) (setq beg (point))) (while (and (= (forward-line -1) 0) (ess-roxy-entry-p)) (setq beg (point))) beg))) (defun ess-roxy-in-header-p () "true if point is the description / details field" (save-excursion (let ((res t) (cont (ess-roxy-entry-p))) (beginning-of-line) (while cont (if (looking-at (concat ess-roxy-re " *[@].+")) (progn (setq res nil) (setq cont nil))) (setq cont (and (= (forward-line -1) 0) (ess-roxy-entry-p))) )res))) (defun ess-roxy-beg-of-field () "Get point number at beginning of current field, 0 if not in entry" (save-excursion (let (cont beg) (beginning-of-line) (setq beg 0) (setq cont t) (while (and (ess-roxy-entry-p) cont) (setq beg (point)) (if (looking-at (concat ess-roxy-re " *[@].+")) (setq cont nil)) (if (ess-roxy-in-header-p) (if (looking-at (concat ess-roxy-re " *$")) (progn (forward-line 1) (setq beg (point)) (setq cont nil)))) (if cont (setq cont (= (forward-line -1) 0)))) beg))) (defun ess-roxy-end-of-entry () " get point number at end of current entry, 0 if not in entry" (save-excursion (let ((end)) (end-of-line) (setq end -1) (if (not (ess-roxy-entry-p)) (setq end 0) (setq end (point))) (while (and (= (forward-line 1) 0) (ess-roxy-entry-p)) (end-of-line) (setq end (point))) end))) (defun ess-roxy-end-of-field () "get point number at end of current field, 0 if not in entry" (save-excursion (let ((end nil) (cont nil)) (setq end 0) (if (ess-roxy-entry-p) (progn (end-of-line) (setq end (point)))) (beginning-of-line) (forward-line 1) (setq cont t) (while (and (ess-roxy-entry-p) cont) (save-excursion (end-of-line) (setq end (point))) (if (or (and (ess-roxy-in-header-p) (looking-at (concat ess-roxy-re " *$"))) (looking-at (concat ess-roxy-re " *[@].+"))) (progn (forward-line -1) (end-of-line) (setq end (point)) (setq cont nil))) (if cont (setq cont (= (forward-line 1) 0)))) end))) (defun ess-roxy-entry-p () "True if point is in a roxy entry" (save-excursion (beginning-of-line) (looking-at (concat ess-roxy-re)))) (defun ess-roxy-narrow-to-field () "Go to to the start of current field" (interactive) (let ((beg (ess-roxy-beg-of-field)) (end (ess-roxy-end-of-field))) (narrow-to-region beg end))) (defun ess-roxy-adaptive-fill-function () "Return prefix for filling paragraph or nil if not determined." (when (ess-roxy-entry-p) (let ((roxy-str (car (split-string (ess-roxy-guess-str) "'")))) (if (ess-roxy-in-header-p) (save-excursion (ess-back-to-roxy) (re-search-forward "\\([ \t]*\\)" (line-end-position) t) (concat roxy-str "' " (match-string 1))) (concat roxy-str "' " (make-string ess-indent-offset ? )))))) (defun ess-roxy-current-field () "Return the name of the field at point." (and (not (ess-roxy-in-header-p)) (save-excursion (goto-char (ess-roxy-beg-of-field)) (if (re-search-forward (concat ess-roxy-re "[ \t]+@\\([[:alpha:]]+\\)") (line-end-position) t) (match-string-no-properties 1))))) (defun ess-roxy-maybe-indent-line () "Indent line when point is in a field, but not in its first line." (when (and (not (ess-roxy-in-header-p)) (not (equal (ess-roxy-current-field) "examples")) (save-excursion (beginning-of-line) (let ((line-n (count-lines 1 (point)))) (goto-char (ess-roxy-beg-of-field)) (not (equal line-n (count-lines 1 (point))))))) (ess-roxy-should-indent-line-p) (ess-back-to-roxy) (delete-region (point) (progn (skip-chars-forward " \t") (point))) (insert (make-string ess-indent-offset ? )))) (defun ess-roxy-goto-func-def () "put point at start of function either that the point is in or below the current roxygen entry, error otherwise" (if (ess-roxy-entry-p) (progn (ess-roxy-goto-end-of-entry) (forward-line 1) (beginning-of-line)) (goto-char (car (ess-end-of-function))))) (defun ess-roxy-get-args-list-from-def () "get args list for current function" (save-excursion (ess-roxy-goto-func-def) (let ((args (ess-roxy-get-function-args))) (mapcar (lambda (x) (cons x '(""))) args)))) (defun ess-roxy-insert-args (args &optional here) "Insert an args list to the end of the roxygen entry for the function at point. if here is supplied start inputting `here'. Finish at end of line." (let* ((arg-des nil) (roxy-str (ess-roxy-guess-str))) (if (or (not here) (< here 1)) (progn (ess-roxy-goto-end-of-entry) (beginning-of-line) (if (not (looking-at "\=")) (progn (end-of-line)))) (goto-char here)) (while (stringp (car (car args))) (setq arg-des (pop args)) (unless (string= (car arg-des) "") (progn (insert (concat "\n" roxy-str " @param " (car arg-des) " ")) (insert (ess-replace-in-string (concat (car (cdr arg-des))) "\n" (concat "\n" roxy-str))) (if ess-roxy-fill-param-p (fill-paragraph)) ))))) (defun ess-roxy-merge-args (fun ent) "Take two args lists (alists) and return their union. Result holds all keys from both fun and ent but no duplicates and association from ent are preferred over entries from fun. Also, drop entries from ent that are not in fun and are associated with the empty string." (let ((res-arg nil) (arg-des)) (while (stringp (car (car fun))) (setq arg-des (pop fun)) (if (assoc (car arg-des) ent) (setq res-arg (cons (cons (car arg-des) (cdr (assoc (car arg-des) ent))) res-arg)) (setq res-arg (cons (cons (car arg-des) '("")) res-arg)))) (while (stringp (car (car ent))) (setq arg-des (pop ent)) (if (and (not (assoc (car arg-des) res-arg)) (not (string= (car (cdr arg-des)) ""))) (setq res-arg (cons (cons (car arg-des) (cdr arg-des)) res-arg)))) (nreverse res-arg))) (defun ess-roxy-update-entry () "Update the entry at the point or the entry above the function which the point is in. Add a template empty roxygen documentation if no roxygen entry is available. The template can be customized via the variable `ess-roxy-template-alist'. The parameter descriptions can are filled if `ess-roxy-fill-param-p' is non-nil." (interactive) (save-excursion (let* ((args-fun (ess-roxy-get-args-list-from-def)) (args-ent (ess-roxy-get-args-list-from-entry)) (args (ess-roxy-merge-args args-fun args-ent)) (roxy-str (ess-roxy-guess-str)) (line-break "") here key template tag-def) (ess-roxy-goto-func-def) (if (not (= (forward-line -1) 0)) (progn (insert "\n") (forward-line -1))) (if (and (not (looking-at "^\n")) (not (ess-roxy-entry-p))) (progn (end-of-line) (insert "\n"))) (if (ess-roxy-entry-p) (progn (setq here (1- (ess-roxy-delete-args))) (ess-roxy-insert-args args here)) (setq template (copy-sequence ess-roxy-template-alist)) (while (stringp (car (car template))) (setq tag-def (pop template)) (if (string= (car tag-def) "param") (ess-roxy-insert-args args (point)) (if (string= (car tag-def) "description") (insert (concat line-break roxy-str " " (cdr tag-def) "\n" roxy-str)) (if (string= (car tag-def) "details") (insert (concat line-break roxy-str " " (cdr tag-def))) (insert (concat line-break roxy-str " @" (car tag-def) " " (cdr tag-def)))) )) (setq line-break "\n") ))))) (defun ess-roxy-goto-end-of-entry () "Put point at the top of the entry at point or above the function at point. Return t if the point is left in a roxygen entry, otherwise nil. Error if point is not in function or roxygen entry." (if (not (ess-roxy-entry-p)) (progn (goto-char (nth 0 (ess-end-of-function))) (forward-line -1))) (if (ess-roxy-entry-p) (progn (goto-char (ess-roxy-end-of-entry)) t) (forward-line) nil)) (defun ess-roxy-goto-beg-of-entry () "put point at the top of the entry at point or above the function at point. Return t if the point is left in a roxygen entry, otherwise nil. Error if point is not in function or roxygen entry." (if (not (ess-roxy-entry-p)) (progn (goto-char (nth 0 (ess-end-of-function))) (forward-line -1))) (if (ess-roxy-entry-p) (progn (goto-char (ess-roxy-beg-of-entry)) t) (forward-line) nil)) (defun ess-roxy-delete-args () "remove all args from the entry at point or above the function at point. Return 0 if no deletions were made other wise the point at where the last deletion ended" (save-excursion (let* ((args nil) (cont t) (field-beg 0) entry-beg entry-end field-end) (ess-roxy-goto-end-of-entry) (setq entry-beg (ess-roxy-beg-of-entry)) (setq entry-end (ess-roxy-end-of-entry)) (goto-char entry-end) (beginning-of-line) (while (and (<= entry-beg (point)) (> entry-beg 0) cont) (if (looking-at (concat ess-roxy-re " *@param")) (progn (setq field-beg (ess-roxy-beg-of-field)) (setq field-end (ess-roxy-end-of-field)) (delete-region field-beg (+ field-end 1)))) (setq cont nil) (if (= (forward-line -1) 0) (setq cont t))) field-beg))) (defun ess-roxy-get-args-list-from-entry () "fill an args list from the entry above the function where the point is" (save-excursion (let* (args entry-beg field-beg field-end args-text arg-name desc) (if (ess-roxy-goto-end-of-entry) (progn (setq roxy-str (ess-roxy-guess-str)) (beginning-of-line) (setq entry-beg (ess-roxy-beg-of-entry)) (while (and (< entry-beg (point)) (> entry-beg 0)) (if (looking-at (concat ess-roxy-re " *@param")) (progn (setq field-beg (ess-roxy-beg-of-field)) (setq field-end (ess-roxy-end-of-field)) (setq args-text (buffer-substring-no-properties field-beg field-end)) (setq args-text (ess-replace-in-string args-text roxy-str "")) (setq args-text (ess-replace-in-string args-text "[[:space:]]*@param *" "")) ;; (setq args-text ;; (ess-replace-in-string args-text "\n" "")) (string-match "[^[:space:]]*" args-text) (setq arg-name (match-string 0 args-text)) (setq desc (replace-regexp-in-string (concat "^" (regexp-quote arg-name) " *") "" args-text)) (setq args (cons (list (concat arg-name) (concat desc)) args)))) (forward-line -1)) args) nil)))) (defun ess-roxy-toggle-roxy-region (beg end) "Remove prefix roxy string in this region if point is in a roxy region, otherwise prefix all lines with the roxy string. Convenient for editing example fields." (interactive "r") (unless (use-region-p) (error "region is not active")) (ess-roxy-roxy-region beg end (ess-roxy-entry-p))) (defun ess-roxy-roxy-region (beg end &optional on) (save-excursion (let (RE to-string (roxy-str (ess-roxy-guess-str))) (narrow-to-region beg (- end 1)) (if on (progn (setq RE (concat ess-roxy-re " +?")) (setq to-string "")) (setq RE "^") (setq to-string (concat roxy-str " "))) (goto-char beg) (while (re-search-forward RE (point-max) 'noerror) (replace-match to-string)) (widen)))) (defun ess-roxy-preview () "Use a (possibly newly) connected R session and the roxygen package `ess-roxy-package' to generate the Rd code for entry at point, place it in a temporary buffer and return that buffer." (let ((beg (ess-roxy-beg-of-entry)) (tmpf (make-temp-file "ess-roxy")) (roxy-buf (get-buffer-create " *RoxygenPreview*")) (out-rd-roclet (cond ((string= "roxygen" ess-roxy-package) "make.Rd2.roclet()$parse") ;; must not line break strings to avoid getting +s in the output ((string= "roxygen2" ess-roxy-package) "(function(P) { if(compareVersion(paste(packageVersion('roxygen2')), '3.0.0') < 0) { ..results <- roxygen2:::roc_process(rd_roclet(), parse.files(P), \"\");cat(vapply(..results, FUN.VALUE=character(1), function(x) { roxygen2:::rd_out_cache$compute(x, format(x))})) } else {..results <- roc_proc_text(rd_roclet(), readChar(P, file.info(P)$size));cat(vapply(..results, format, FUN.VALUE = character(1))) } })") (t (error "need to hard code the roclet output call for roxygen package '%s'" ess-roxy-package)))) ) (if (= beg 0) (error "Point is not in a Roxygen entry")) (save-excursion (goto-char (ess-roxy-end-of-entry)) (forward-line 1) (if (ess-end-of-function nil t) (append-to-file beg (point) tmpf) (while (and (forward-line 1) (not (looking-at "^$")) (not (looking-at ess-roxy-re)))) (append-to-file beg (point) tmpf)) (ess-force-buffer-current) (ess-command (concat "print(suppressWarnings(require(" ess-roxy-package ", quietly=TRUE)))\n") roxy-buf) (with-current-buffer roxy-buf (goto-char 1) (if (search-forward-regexp "FALSE" nil t) (error (concat "Failed to load the " ess-roxy-package " package; " "in R, try install.packages(\"" ess-roxy-package "\")")))) (ess-command (concat out-rd-roclet "(\"" tmpf "\")\n") roxy-buf)) (delete-file tmpf) roxy-buf)) (defun ess-roxy-preview-HTML (&optional visit-instead-of-browse) "Use a (possibly newly) connected R session and the roxygen package to generate a HTML page for the roxygen entry at point and open that buffer in a browser. Visit the HTML file instead of showing it in a browser if `visit-instead-of-browse' is non-nil." (interactive "P") (let* ((roxy-buf (ess-roxy-preview)) (rd-tmp-file (make-temp-file "ess-roxy-" nil ".Rd")) (html-tmp-file (make-temp-file "ess-roxy-" nil ".html")) (rd-to-html (concat "Rd2HTML(\"" rd-tmp-file "\",\"" html-tmp-file "\", stages=c(\"render\"))")) ) (with-current-buffer roxy-buf (set-visited-file-name rd-tmp-file) (save-buffer) (kill-buffer roxy-buf)) (ess-force-buffer-current) (ess-command "print(suppressWarnings(require(tools, quietly=TRUE)))\n") (if visit-instead-of-browse (progn (ess-command (concat rd-to-html "\n")) (find-file html-tmp-file)) (ess-command (concat "browseURL(" rd-to-html ")\n"))))) (defun ess-roxy-preview-text () "Use the connected R session and the roxygen package to generate the text help page of the roxygen entry at point." (interactive) (with-current-buffer (ess-roxy-preview) (Rd-preview-help))) (defun ess-roxy-preview-Rd (&optional name-file) "Use the connected R session and the roxygen package to generate the Rd code for the roxygen entry at point. If called with a non-nil `name-file' (e.g. universal argument C-u), also set the visited file name of the created buffer to facilitate saving that file." (interactive "P") (let ((roxy-buf (ess-roxy-preview))) (pop-to-buffer roxy-buf) (if name-file (save-excursion (goto-char 1) (search-forward-regexp "name{\\(.+\\)}") (set-visited-file-name (concat (match-string 1) ".Rd")))) (Rd-mode))) (defun ess-roxy-guess-str (&optional not-here) "guess the prefix used in the current roxygen block. If `not-here' is non-nil, guess the prefix for nearest roxygen block before the point" (save-excursion (if (ess-roxy-entry-p) (progn (goto-char (point-at-bol)) (search-forward-regexp ess-roxy-re)) (if not-here (search-backward-regexp ess-roxy-re))) (if (or not-here (ess-roxy-entry-p)) (match-string 0) ess-roxy-str))) (defun ess-roxy-hide-block () "hide current roxygen comment block" (interactive) (save-excursion (let ((end-of-entry (ess-roxy-end-of-entry)) (beg-of-entry (ess-roxy-beg-of-entry))) (hs-hide-block-at-point nil (list beg-of-entry end-of-entry))))) (defun ess-roxy-toggle-hiding () "Toggle hiding/showing of a block. See `hs-show-block' and `ess-roxy-hide-block'." (interactive) (hs-life-goes-on (if (hs-overlay-at (point-at-eol)) (hs-show-block) (ess-roxy-hide-block)))) (defun ess-roxy-show-all () "Hide all Roxygen entries in current buffer. " (interactive) (ess-roxy-hide-all t)) (defun ess-roxy-hide-all (&optional show) "Hide all Roxygen entries in current buffer. " (interactive) (hs-life-goes-on (save-excursion (goto-char (point-min)) (while (re-search-forward (concat ess-roxy-re) (point-max) t 1) (let ((end-of-entry (ess-roxy-end-of-entry))) (if show (hs-show-block) (ess-roxy-hide-block)) (goto-char end-of-entry) (forward-line 1)))))) (defun ess-roxy-previous-entry () "Go to beginning of previous Roxygen entry. " (interactive) (if (ess-roxy-entry-p) (progn (goto-char (ess-roxy-beg-of-entry)) (forward-line -1))) (search-backward-regexp ess-roxy-re (point-min) t 1) (goto-char (ess-roxy-beg-of-entry))) (defun ess-roxy-next-entry () "Go to beginning of next Roxygen entry. " (interactive) (if (ess-roxy-entry-p) (progn (goto-char (ess-roxy-end-of-entry)) (forward-line 1))) (search-forward-regexp ess-roxy-re (point-max) t 1) (goto-char (ess-roxy-beg-of-entry))) (defun ess-roxy-get-function-args () "Return the arguments specified for the current function as a list of strings." (save-excursion (let ((args-txt (progn (ess-beginning-of-function) (buffer-substring-no-properties (progn (search-forward-regexp "\\([=,-]+ *function *\\|^\s*function\\)" nil nil 1) (+ (point) 1)) (progn (ess-roxy-match-paren) (point)))))) (setq args-txt (replace-regexp-in-string "#+[^\"']*\n" "" args-txt)) (setq args-txt (replace-regexp-in-string "([^)]+)" "" args-txt)) (setq args-txt (replace-regexp-in-string "=[^,]+" "" args-txt)) (setq args-txt (replace-regexp-in-string "[ \t\n]+" "" args-txt)) (split-string args-txt ",")))) (defun ess-roxy-match-paren () "Go to the matching parenthesis" (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1)) ((looking-at "\\s\)") (forward-char 1) (backward-list 1)))) (defun ess-roxy-complete-tag () "complete the tag at point" (let ((token-string (thing-at-point 'symbol))) (when (and token-string (string-match "@.+" token-string)) (comint-dynamic-simple-complete (replace-regexp-in-string "^@" "" token-string) (append ess-roxy-tags-noparam ess-roxy-tags-param))))) (defun ess-roxy-tag-completion () "Completion data for emacs >= 24" (when (save-excursion (re-search-backward "@\\<\\(\\w*\\)" (point-at-bol) t)) (let ((token (match-string-no-properties 1)) (beg (match-beginning 1)) (end (match-end 1))) (when (and end (= end (point))) (list beg end (append ess-roxy-tags-noparam ess-roxy-tags-param) :exclusive 'no))))) (defun ess-roxy-remove-roxy-re (string) "Remove the `ess-roxy-str' before sending to R process. Useful for sending code from example section. This function is placed in `ess-presend-filter-functions'. " (if (ess-roxy-entry-p) (replace-regexp-in-string ess-roxy-re "" string) string)) (add-hook 'ess-presend-filter-functions 'ess-roxy-remove-roxy-re nil) (defun ess-roxy-find-par-end (stop-point &rest stoppers) (mapc #'(lambda (stopper) (when (and (> stop-point (point)) (save-excursion (re-search-forward stopper stop-point t))) (setq stop-point (match-beginning 0)))) stoppers) (save-excursion (goto-char stop-point) (line-end-position 0))) (defmacro ess-roxy-with-filling-context (&rest body) (declare (indent 0) (debug (&rest form))) `(let ((comment-start "#+'[ \t]+#") (comment-start-skip "#+'[ \t]+# *") (comment-use-syntax nil) (adaptive-fill-first-line-regexp (concat ess-roxy-re "[ \t]*")) (temp-table (make-syntax-table S-syntax-table)) (paragraph-start (concat "\\(" ess-roxy-re "\\(" paragraph-start "\\|[ \t]*@" "\\)" "\\)\\|\\(" paragraph-start "\\)"))) ;; Prevent the roxy prefix to be interpreted as comment or string ;; starter (modify-syntax-entry ?# "w" temp-table) (modify-syntax-entry ?' "w" temp-table) ;; Neutralise (comment-normalize-vars) because it modifies the ;; comment-start regexp in such a way that paragraph filling of ;; comments in @examples fields does not work (cl-letf (((symbol-function 'comment-normalize-vars) #'ignore)) (with-syntax-table temp-table ,@body)))) (defadvice ess-eval-line-and-step (around ess-eval-line-and-step-roxy) "evaluate line but do not skip over comment (roxy) lines" (if (ess-roxy-entry-p) (let ((simple-next t)) ad-do-it) ad-do-it)) (defadvice ess-indent-command (around ess-roxy-toggle-hiding) "hide this block if we are at the beginning of the line" (if (and (= (point) (point-at-bol)) (ess-roxy-entry-p) 'ess-roxy-hide-show-p) (progn (ess-roxy-toggle-hiding)) ad-do-it)) (defadvice fill-paragraph (around ess-roxy-fill-advise) "Fill roxygen paragraphs." (cond ;; Regular case ((not (and (eq major-mode 'ess-mode) (string= ess-dialect "R"))) ad-do-it) ;; Filling of code comments in @examples roxy field ((and (ess-roxy-entry-p) (save-excursion (back-to-indentation) (looking-at "#"))) (ess-roxy-with-filling-context ad-do-it)) ((and (not (ess-roxy-entry-p)) (ess-point-in-comment-p)) ad-do-it) ;; Filling of call arguments with point on call name ((and ess-fill-calls (ess-point-on-call-name-p)) (save-excursion (skip-chars-forward "^([") (forward-char) (ess-fill-args))) ;; Filling of continuations ((and ess-fill-continuations (ess-point-in-continuation-p)) (ess-fill-continuations)) ;; Filling of call arguments ((and ess-fill-calls (ess-point-in-call-p)) (ess-fill-args)) ;; Filling of roxy blocks ((ess-roxy-entry-p) (save-excursion (let* ((saved-pos (point)) (saved-line (line-number-at-pos)) (saved-col (current-column)) (buffer (current-buffer)) (par-start (save-excursion (if (save-excursion (and (backward-paragraph) (forward-paragraph) (<= (point) saved-pos))) (line-beginning-position) (progn (backward-paragraph) (point))))) (par-end (ess-roxy-find-par-end (save-excursion (forward-paragraph) (point)) (concat ess-roxy-re "[ \t]*@examples\\b") "^[^#]"))) ;; Refill the whole structural paragraph sequentially, field by ;; field, stopping at @examples (ess-roxy-with-filling-context (save-excursion (save-restriction (narrow-to-region par-start par-end) (goto-char 0) (while (< (point) (point-max)) (ess-roxy-maybe-indent-line) ad-do-it (forward-paragraph)))))))) (t ad-do-it))) (defadvice move-beginning-of-line (around ess-roxy-beginning-of-line) "move to start" (if (ess-roxy-entry-p) (let ((new-pos (save-excursion (end-of-line) (and (re-search-backward (concat ess-roxy-re " ?") (point-at-bol) t) (match-end 0))))) (if (or (bolp) (< new-pos (point))) (goto-char new-pos) ad-do-it)) ad-do-it)) (defadvice back-to-indentation (around ess-roxy-back-to-indentation) "Handle back-to-indentation in roxygen doc" (if (ess-roxy-entry-p) (progn (end-of-line) (re-search-backward (concat ess-roxy-re " *") (point-at-bol) t) (goto-char (match-end 0))) ad-do-it)) (defun ess-roxy-indent-new-comment-line () (if (not (ess-roxy-entry-p)) (indent-new-comment-line) (ess-roxy-indent-on-newline))) (defun ess-roxy-newline-and-indent () (if (or (not (ess-roxy-entry-p)) (not ess-roxy-insert-prefix-on-newline)) (newline-and-indent) (ess-roxy-indent-on-newline))) (defun ess-roxy-indent-on-newline () "Insert a newline in a roxygen field." (cond ;; Point at beginning of first line of entry; do nothing ((= (point) (ess-roxy-beg-of-entry)) (newline-and-indent)) ;; Otherwise: skip over roxy comment string if necessary and then ;; newline and then inset new roxy comment string (t (let ((point-after-roxy-string (save-excursion (forward-line 0) (ess-back-to-roxy) (point)))) (goto-char (max (point) point-after-roxy-string))) (newline-and-indent) (insert (concat (ess-roxy-guess-str t) " "))))) (provide 'ess-roxy) ;;; ess-roxy.el ends here ess/lisp/essd-els.el0000664000175000017500000002212512506744203012741 0ustar eddedd;;; essd-els.el --- S-PLUS 3.x at another location customization ;; Copyright (C) 1998 Richard M. Heiberger ;; Copyright (C) 1999--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: December 1998 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S-PLUS 3.x customizations for ess-mode. ;;; Code: (require 'ess-s-l) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defvar S+elsewhere-dialect-name "S+6" "Name of 'dialect' for S-PLUS at another location.") ;easily changeable in a user's .emacs (defvar S+elsewhere-customize-alist (append '((ess-local-customize-alist . 'S+elsewhere-customize-alist) (ess-dialect . S+elsewhere-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-object-name-db-file . "ess-spelsewhere-namedb.el" ) (inferior-ess-program . inferior-S-elsewhere-program-name) (inferior-ess-help-command . "help(\"%s\", pager=\"cat\", window=F)\n") (inferior-ess-start-file . nil) ;"~/.ess-S+3") (inferior-ess-start-args . "-i") (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for S+elsewhere") (defun S+elsewhere (&optional proc-name) "Call 'S-PLUS 3.x', the 'Real Thing' from StatSci. This command is obsolete; please use `ess-remote' instead." (interactive) (setq ess-customize-alist S+elsewhere-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+elsewhere): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start))) (defun S+elsewhere-mode (&optional proc-name) "Major mode for editing S+3 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+elsewhere-customize-alist) (ess-mode S+elsewhere-customize-alist proc-name)) (defun S+elsewhere-transcript-mode () "S-PLUS 3.x transcript mode." (interactive) (ess-transcript-mode S+elsewhere-customize-alist)) ;; This REALLY shouldn't need an editing mode. Just a transcript and ;; an inferior process handler. (defun ess-change-alist (item value alist) "Modify ALIST to set VALUE to ITEM. If there is a pair whose car is ITEM, replace its cdr by VALUE. If there is not such pair, create new pair (ITEM . VALUE) and return new alist whose car is the new pair and cdr is ALIST. \[tomo's ELIS like function]" (let ((pair (assoc item alist))) (if pair (progn (setcdr pair value) alist) (cons (cons item value) alist)))) (defun ess-select-alist-dialect (&optional dialect) "Query user for an ESS dialect and return the matching customize-alist." (interactive) (let* ((dialects '("R" "S+" "julia" "arc" "vst" "omg" "s3" "s4" "stata" "sp3" "sp4" "sqpe4" "sp5" "sqpe" "XLS" "SAS")) (dialect (or dialect (ess-completing-read "Dialect" dialects nil t)))) (cond ((string= dialect "julia") julia-customize-alist) ((string= dialect "arc") ARC-customize-alist) ((string= dialect "vst") VST-customize-alist) ((string= dialect "omg") OMG-customize-alist) ((string= dialect "s3") S3-customize-alist) ((string= dialect "s4") S4-customize-alist) ((string= dialect "stata") STA-customize-alist) ((string= dialect "R") R-customize-alist ) ((string= dialect "sp3") S+3-customize-alist) ((string= dialect "sp4") S+4-customize-alist) ((string= dialect "sqpe4") Sqpe+4-customize-alist) ((string= dialect "sp5") S+5-customize-alist) ((string= dialect "S+") S+-customize-alist) ((string= dialect "sqpe") Sqpe+-customize-alist) ((string= dialect "XLS") XLS-customize-alist) ((string= dialect "SAS") SAS-customize-alist);was S+elsewhere-customize-alist? (t S+elsewhere-customize-alist) ))) ;; (defun ESS-elsewhere (&optional proc-name) ;; "Call an inferior process from ELSEWHERE. ;; This command is obsolete; please use `ess-remote' instead." ;; (interactive) ;; ;; Need to select a elsewhere-customize-alist ;; (let ((elsewhere-customize-alist (ess-select-alist-dialect))) ;; (ess-change-alist 'inferior-ess-program ;; inferior-ESS-elsewhere-program-name ;; elsewhere-customize-alist) ;; (setq ess-customize-alist elsewhere-customize-alist) ;; (ess-write-to-dribble-buffer ;; (format "\n(ESS-elsewhere): ess-dialect=%s, buf=%s\n" ess-dialect ;; (current-buffer))) ;; (inferior-ess) ;; (if (equal ess-language "S") ;; (if inferior-ess-language-start ;; (ess-eval-linewise inferior-ess-language-start))))) (defun ess-add-ess-process () "Execute this command from within a buffer running a process to add the process to `ess-process-name-alist' and to make it the `ess-current-process-name'. This command will normally be run in a telnet buffer connected to another computer or in a shell or comint buffer on the local computer." (interactive) (let ((proc (get-buffer-process (buffer-name)))) (if (not proc) (error "No process is associated with this buffer.") (set-process-filter proc 'inferior-ess-output-filter) (setq ess-current-process-name (process-name proc)) (add-to-list 'ess-process-name-list (list ess-current-process-name))))) (defvar ess-remote nil "Indicator, t in ess-remote buffers.") (defun ess-remote (&optional proc-name dialect) "Execute this command from within a buffer running a process. It runs `ess-add-ess-process' to add the process to `ess-process-name-alist' and to make it the `ess-current-process-name'. It then prompts the user for an ESS language and sets the editing characteristics appropriately. To use this command, first start a process on a remote computer by manual use of telnet, rlogin, ssh, or some other protocol. Start the relevant program (\"S\" or \"R\" or \"sas -stdio\") in that buffer. Once you are talking to S or R or SAS, then execute `ess-remote' to make the current buffer an inferior-ess buffer with the right behavior for the language you are currently working with. With S and R, use C-c C-n to send lines over. With SAS, use C-c i `ess-eval-line-and-step-invisibly' to send lines over invisibly. DIALECT is the desired ess-dialect. If nil, ask for dialect" (interactive) (ess-add-ess-process) ;; Need to select a remote-customize-alist (let ((ess-customize-alist (ess-select-alist-dialect dialect))) (ess-write-to-dribble-buffer (format "\n(ESS-remote): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (ess-setq-vars-local ess-customize-alist) (inferior-ess-mode) (set (make-local-variable 'ess-remote) t) (setq ess-local-process-name (or proc-name ess-current-process-name)) (goto-char (point-max)) (when (equal ess-dialect "R") ;; ugly fix for evn variable. What can we do :( (ess-eval-linewise (format "options(pager='%s')\n" inferior-ess-pager) nil nil nil 'wait) (ess--R-load-ESSR)) (when (equal ess-dialect "S+") (ess-command ess-S+--injected-code)) (when (equal ess-language "SAS") (font-lock-mode 0) (SAS-log-mode) (shell-mode) (setq buffer-read-only nil) (font-lock-mode 1)) (ess-process-put 'funargs-cache (make-hash-table :test 'equal)) (ess-process-put 'funargs-pre-cache nil) (ess-process-put 'accum-buffer-name (format " *%s:accum*" ess-local-process-name)) (ess-load-extras) (when inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start nil nil nil 'wait-prompt)))) ; Provide package (provide 'essd-els) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; essd-els.el ends here ess/lisp/ess-compat.el0000664000175000017500000003121112577152666013307 0ustar eddedd;;; ess-compat.el --- simple determination of Emacs/XEmacs and version #. ;; Copyright (C) 2000--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 07 June 2000 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file contains functions for easily determining features of the ;; version of Emacs that we are using. In particular, it look for ;; version number, customize support, as well as Emacs/XEmacs, for ;; flaggin support later on. ;;; Code: ;;; Define a function to make it easier to check which version we're ;;; running. ;; no longer in use; 2013-12-30: (defun ess-running-emacs-version-or-newer (major minor) (or (> emacs-major-version major) (and (= emacs-major-version major) (>= emacs-minor-version minor)))) ;(defvar ess-running-xemacs (string-match "XEmacs\\|Lucid" emacs-version)) (defvar ess-local-custom-available (featurep 'custom) "Value is nil if custom.el not available, t if available. Only a concern with earlier versions of Emacs.") ;; FIXME: When emacs is started from Cygwin shell in Windows, ;; we have (equal window-system 'x) -and should use "--ess" in *d-r.el (defvar ess-microsoft-p (or (eq system-type 'ms-dos) (eq system-type 'windows-nt)) "Value is t if the OS is one of Microsoft's, nil otherwise.") ;; These definitions are for Emacs versions < 20.4 or XEmacs ;; These are taken verbatim from the file emacs-20.6/lisp/w32-fns.el ;; ;; Note: 20.3 and 19.x NTemacs users are strongly encouraged to upgrade to ;; version 20.4 or higher. NTemacs 20.2 is not supported by ESS. ;; XEmacs 20.x needs this (if (not (fboundp 'find-buffer-visiting)) (fset 'find-buffer-visiting 'get-file-buffer)) ;; XEmacs <= 21.4.15 needs this: (defalias 'ess-line-beginning-position (if (fboundp 'line-beginning-position) 'line-beginning-position 'point-at-bol)) (if (and (not (featurep 'xemacs)) (string-match "XEmacs\\|Lucid" emacs-version)) (provide 'xemacs)) ;; XEmacs 21.x and Emacs 20.x need this (cond ((fboundp 'replace-regexp-in-string) (defalias 'ess-replace-regexp-in-string 'replace-regexp-in-string)) ((featurep 'xemacs) (defun ess-replace-regexp-in-string(regexp replace string) "Mimic GNU Emacs function replace-regexp-in-string with XEmacs' replace-in-string" (replace-in-string string regexp replace))) ;; GNU emacs <= 20 -- take Emacs' 21(.3)'s definition: (t (defun ess-replace-regexp-in-string (regexp rep string &optional fixedcase literal subexp start) "Replace all matches for REGEXP with REP in STRING. Return a new string containing the replacements. Optional arguments FIXEDCASE, LITERAL and SUBEXP are like the arguments with the same names of function `replace-match'. If START is non-nil, start replacements at that index in STRING. REP is either a string used as the NEWTEXT arg of `replace-match' or a function. If it is a function it is applied to each match to generate the replacement passed to `replace-match'; the match-data at this point are such that match 0 is the function's argument. To replace only the first match (if any), make REGEXP match up to \\' and replace a sub-expression, e.g. (ess-replace-regexp-in-string \"\\(foo\\).*\\'\" \"bar\" \" foo foo\" nil nil 1) => \" bar foo\" " ;; To avoid excessive consing from multiple matches in long strings, ;; don't just call `replace-match' continually. Walk down the ;; string looking for matches of REGEXP and building up a (reversed) ;; list MATCHES. This comprises segments of STRING which weren't ;; matched interspersed with replacements for segments that were. ;; [For a `large' number of replacments it's more efficient to ;; operate in a temporary buffer; we can't tell from the function's ;; args whether to choose the buffer-based implementation, though it ;; might be reasonable to do so for long enough STRING.] (let ((l (length string)) (start (or start 0)) matches str mb me) (save-match-data (while (and (< start l) (string-match regexp string start)) (setq mb (match-beginning 0) me (match-end 0)) ;; If we matched the empty string, make sure we advance by one char (when (= me mb) (setq me (min l (1+ mb)))) ;; Generate a replacement for the matched substring. ;; Operate only on the substring to minimize string consing. ;; Set up match data for the substring for replacement; ;; presumably this is likely to be faster than munging the ;; match data directly in Lisp. (string-match regexp (setq str (substring string mb me))) (setq matches (cons (replace-match (if (stringp rep) rep (funcall rep (match-string 0 str))) fixedcase literal str subexp) (cons (substring string start mb) ; unmatched prefix matches))) (setq start me)) ;; Reconstruct a string from the pieces. (setq matches (cons (substring string start l) matches)) ; leftover (apply #'concat (nreverse matches))))) ) ) ;; remassoc exists as a built-in function in xemacs, but ;; not in GNU emacs ;; (if (not (functionp 'remassoc)) (defun remassoc (key a) "remove an association pair from an alist" (if a (let ((pair (car a))) (if (equal (car pair) key) (cdr a) (cons pair (remassoc key (cdr a)))))))) (if (not (fboundp 'w32-using-nt)) (defun w32-using-nt () "Return non-nil if literally running on Windows NT (i.e., not Windows 9X)." (and (eq system-type 'windows-nt) (getenv "SystemRoot")))) (if (and (featurep 'xemacs) (fboundp 'extent-at) (fboundp 'make-extent) (fboundp 'set-extent-property)) (defun ess-xemacs-insert-glyph (gl) "Insert a glyph at the left edge of point." (let ((prop 'myimage) ;; myimage is an arbitrary name, chosen to ;; (hopefully) not conflict with any other ;; properties. Change it if necessary. extent) ;; First, check to see if one of our extents already exists at ;; point. For ease-of-programming, we are creating and using our ;; own extents (multiple extents are allowed to exist/overlap at the ;; same point, and it's quite possible for other applications to ;; embed extents in the current buffer without your knowledge). ;; Basically, if an extent, with the property stored in "prop", ;; exists at point, we assume that it is one of ours, and we re-use ;; it (this is why it is important for the property stored in "prop" ;; to be unique, and only used by us). (if (not (setq extent (extent-at (point) (current-buffer) prop))) (progn ;; If an extent does not already exist, create a zero-length ;; extent, and give it our special property. (setq extent (make-extent (point) (point) (current-buffer))) (set-extent-property extent prop t) )) ;; Display the glyph by storing it as the extent's "begin-glyph". (set-extent-property extent 'begin-glyph gl)))) ;; XEmacs and NTemacs 19.x need these (if (not (boundp 'w32-system-shells)) (defvar w32-system-shells '("cmd" "cmd.exe" "command" "command.com" "4nt" "4nt.exe" "4dos" "4dos.exe" "ndos" "ndos.exe") "List of strings recognized as Windows NT/9X system shells.") ) (if (not (fboundp 'w32-system-shell-p)) (defun w32-system-shell-p (shell-name) (and shell-name (member (downcase (file-name-nondirectory shell-name)) w32-system-shells))) ) (if (not (fboundp 'w32-shell-name)) (defun w32-shell-name () "Return the name of the shell being used." (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name) (getenv "ESHELL") (getenv "SHELL") (and (w32-using-nt) "cmd.exe") "command.com")) ) ;; XEmacs and NTemacs 20.3 need this (if (not (fboundp 'w32-shell-dos-semantics)) (defun w32-shell-dos-semantics () "Return t if the interactive shell being used expects msdos shell semantics." (or (w32-system-shell-p (w32-shell-name)) (and (member (downcase (file-name-nondirectory (w32-shell-name))) '("cmdproxy" "cmdproxy.exe")) (w32-system-shell-p (getenv "COMSPEC"))))) ) ;; XEmacs need this (unless configured with --with-mule=yes) (if (not (boundp 'enable-multibyte-characters)) (defvar enable-multibyte-characters nil "Non-nil means the buffer contents are regarded as multi-byte characters. This concept is handled completely differently on Xemacs.")) (defvar ess-has-tooltip (and (not (featurep 'xemacs)) (>= emacs-major-version 21)) "non-nil if 'tooltip can be required; typically nil for Xemacs.") ;; XEmacs on Windows needs this (if (and ess-microsoft-p (not (fboundp 'w32-short-file-name))) (cond ((fboundp 'win32-short-file-name) (fset 'w32-short-file-name 'win32-short-file-name)) ((fboundp 'mswindows-short-file-name) (fset 'w32-short-file-name 'mswindows-short-file-name)) (t (warn "None of 'w32-short-file-name, 'win32-short-file-name, or 'mswindows-short-file-name are defined! You will have to manually set ess-program-files (in ess-custom.el) to the correct \"8.3\"-style directory name.")))) (defun ess-sleep () "Put emacs to sleep for `ess-sleep-for-shell' seconds (floats work). Sometimes its necessary to wait for a shell prompt." (if (featurep 'xemacs) (sleep-for ess-sleep-for-shell) (sleep-for 0 (truncate (* ess-sleep-for-shell 1000))))) (unless (fboundp 'use-region-p) ;; emacs 23 needs this (defun use-region-p () "Return t if the region is active and it is appropriate to act on it. This is used by commands that act specially on the region under Transient Mark mode. The return value is t if Transient Mark mode is enabled and the mark is active; furthermore, if `use-empty-active-region' is nil, the region must not be empty. Otherwise, the return value is nil. For some commands, it may be appropriate to ignore the value of `use-empty-active-region'; in that case, use `region-active-p'." (and (region-active-p) (or use-empty-active-region (> (region-end) (region-beginning))))) (defun region-active-p () "Return t if Transient Mark mode is enabled and the mark is active. Some commands act specially on the region when Transient Mark mode is enabled. Usually, such commands should use `use-region-p' instead of this function, because `use-region-p' also checks the value of `use-empty-active-region'." (and transient-mark-mode mark-active))) (provide 'ess-compat) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-compat.el ends here ess/lisp/ess-s3-d.el0000664000175000017500000000632612423756516012575 0ustar eddedd;;; ess-s3-d.el --- S 3 (AT&T version) customization ;; Copyright (C) 1997 A. J. Rossini ;; Copyright (C) 1998--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 12 Jun 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S 3 customizations for ess-mode. ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (require 'ess-s-l) (defvar S3-customize-alist (append '((ess-local-customize-alist . 'S3-customize-alist) (ess-dialect . "S3") (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-change-sp-regexp . ess-S-change-sp-regexp) (ess-help-sec-keys-alist . ess-help-S3-sec-keys-alist) (ess-object-name-db-file . "ess-s3-namedb.el" ) (inferior-ess-program . inferior-S3-program-name) ; "S") (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . nil) (inferior-ess-search-list-command . "search()\n") (inferior-ess-objects-command . "objects(%d)\n") (inferior-ess-start-file . nil) ;"~/.ess-S3") (inferior-ess-start-args . "") (ess-STERM . "iESS") ) S+common-cust-alist); use S+ ones here; partly overwritten above!! "Variables to customize for S3") (defun S3 (&optional proc-name) "Call 'S 3.x', the version from AT&T." (interactive) (setq ess-customize-alist S3-customize-alist) (ess-write-to-dribble-buffer (format "\n(S3): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start))) (defun S3-mode (&optional proc-name) "Major mode for editing S3 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S3-customize-alist) (ess-mode S3-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) ; Provide package (provide 'ess-s3-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-s3-d.el ends here ess/lisp/ess-toolbar.el0000664000175000017500000002313212423756516013463 0ustar eddedd;;; ess-toolbar.el --- Support for a toolbar in ESS. ;; Copyright (C) 1997--2009 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Stephen Eglen ;; Created: 2004-05-06 ;; Revised: 2009-03-16 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This code adds a toolbar to ESS modes for editing R and S code. ;; Support can be added for other modes (e.g. STATA), just ask! ;; ;; This code is experimental, and runs best on Emacs 21 and XEmacs ;; 21. It has been tested only on Linux machines. All feedback ;; appreciated. ;; ;; If your emacs can support images, the ESS toolbar should be loaded. ;; ;; If you see a toolbar, but no icons, check out the value of ;; ess-icon-directory. ;; ;; The toolbar can be customized in several ways. To see options, do: ;; M-x customize-group RET ess-toolbar RET ;; If you change any of the variables, you _may_ need to restart Emacs ;; to see any effect. See also the documentation for ess-toolbar-items ;; if you wish to change its value. ;;; Technical issues. ;; Emacs vs XEmacs. ;; Of course, Emacs and XEmacs have different interfaces and handle ;; the toolbars in different ways. The code here is rough, but ;; hopefully soon a compatibility toolbar library will be released ;; that will make the toolbar code more portable. So, for now the ;; code should be regarded as proof of concept. ;; 2009-03-16: toolbar code in Emacs 23 has changed slightly to 22, ;; and presumably once Emacs 22 is no longer supported, this code can ;; be cleaned up a bit (i.e. no need to set load-path.) ;;; Code: (defgroup ess-toolbar nil "ESS: toolbar support." :group 'ess :link '(emacs-commentary-link :tag "Commentary" "ess-toolbar.el") :prefix "ess-") (defcustom ess-use-toolbar (if (featurep 'xemacs) (memq (device-type) '(x gtk mswindows)) (and (fboundp 'display-images-p) (display-images-p))) "*Non-nil means ESS should support the toolbar. Currently works only under Emacs 21 and maybe XEmacs 21.4." :group 'ess-toolbar :type 'boolean) (defcustom ess-toolbar-own-icons nil "*Non-nil means that we only put our toolbar entries in ESS. Otherwise we get standard toolbar as well as ESS entries. Under Emacs, the standard toolbar items are copied from the default toolbar. Under XEmacs, the items stored in `ess-toolbar-xemacs-general' are added." :group 'ess-toolbar :type 'boolean) (defcustom ess-toolbar-global nil "*Non-nil means that the ESS toolbar is available in all emacs buffers. Otherwise, the ESS toolbar is present only in R/S mode buffers. For beginners, this is probably better set to a non-nil value." :group 'ess-toolbar :type 'boolean) (defcustom ess-toolbar-items '( (R "startr" "Start R process") ;;(S "spluslogo" "Start S process") (S "splus_letter_small" "Start S process") (ess-eval-line-and-step "rline" "Eval line & step") (ess-eval-region "rregion" "Eval region") (ess-eval-function-or-paragraph-and-step "rregion" "Eval function or paragraph and step") (ess-load-file "rbuffer" "Load file") (ess-eval-function "rfunction" "Eval function") (ess-switch-to-ESS "switch_ess" "Switch to ESS buffer")) "Items to be added to the ESS toolbar. Each list element has three items: 1. the name of the function to run 2. the icon to be used (without .xpm extension) 3. the tooltip doc string (XEmacs only; Emacs gets doc string from menu items. General toolbar items are also added to the ESS toolbar iff `ess-toolbar-own-icons' is nil. Setting this variable with setq doesn't take effect once you have loaded ess-site, unless you follow it by a call to `ess-make-toolbar' afterwards. Instead, change its value using Custom, and then on all new ESS buffers you should see the toolbar has changed." :group 'ess-toolbar :set (lambda (symbol value) (set-default symbol value) (if (fboundp 'ess-make-toolbar) (ess-make-toolbar))) :type '(repeat (list (function :tag "Function to run") (string :tag "Icon") (string :tag "Tooltip")))) (defvar ess-icon-directory (expand-file-name (concat (file-name-as-directory ess-etc-directory) "icons")) "*Location for ESS icons. This variable should be set automatically by the ESS install process. Icons should be found in ESS/etc/icons/ directory. If `ess-icon-directory' is invalid, please report a bug.") (unless (file-directory-p ess-icon-directory) (ess-write-to-dribble-buffer "`ess-icon-directory' does not exist; using `ess-etc-directory'.\n") (setq ess-icon-directory ess-etc-directory)) (defvar ess-toolbar nil "Toolbar items to be added to ESS editing buffers.") (defun ess-make-toolbar () "Make the ESS toolbar." (if (featurep 'xemacs) (ess-make-toolbar-xemacs) ;; Under Emacs, only worth building the toolbar if tool-bar-map is ;; available. e.g. when running Emacs within a terminal, tool-bar-map ;; is not available, so no need to make the tool-bar. (if (boundp 'tool-bar-map) (ess-make-toolbar-emacs)))) (defun ess-make-toolbar-emacs () "Make the ESS toolbar under Emacs." (setq ess-toolbar (if (or ess-toolbar-own-icons (null tool-bar-map)) (make-sparse-keymap) (copy-keymap tool-bar-map))) (let ((tool-bar-map ess-toolbar) (load-path (list ess-icon-directory))) ;; in Emacs 22, icons are found by examining load-path, bound here ;; whereas Emacs 23 seems to want them in image-load-path, set at the ;; bottom of this file. (mapc 'ess-add-icon-emacs ess-toolbar-items))) (defun ess-add-icon-emacs (x) "Add an ESS item to the Emacs toolbar." ;; By using tool-bar-add-item-from-menu instead of tool-bar-add-item ;; we get the tooltips "for free" from ess-mode-map. (tool-bar-add-item-from-menu (car x) (cadr x) ess-mode-map)) (defun ess-add-icon-xemacs (x) "Return a 4-vector containing the spec for an ESS toolbar entry in XEmacs." (vector (toolbar-make-button-list (expand-file-name (concat (cadr x) ".xpm") ess-icon-directory)) (car x) ;function t (nth 2 x) ;doc string )) (defvar ess-toolbar-xemacs-general (list [toolbar-file-icon toolbar-open t "Open a file"] [toolbar-disk-icon toolbar-save t "Save buffer"] [toolbar-printer-icon generic-print-buffer t "Print buffer"] [toolbar-cut-icon toolbar-cut t "Kill region"] [toolbar-copy-icon toolbar-copy t "Copy region"] [toolbar-paste-icon toolbar-paste t "Paste from clipboard"] [toolbar-undo-icon toolbar-undo t "Undo edit"] [toolbar-replace-icon toolbar-replace t "Search & Replace"] [:style 3d] ) "General Xemacs icons to be added iff `ess-toolbar-own-icons' is non-nil. These toolbar items were taken from the list that John Fox's code provided. Each vector is of length four specifying: 1 - icon; 2 - function to call; 3 - whether to activate; 4 - doc string.") (defun ess-make-toolbar-xemacs () "Set up the ESS toolbar for XEmacs." (setq ess-toolbar (append (if ess-toolbar-own-icons nil ess-toolbar-xemacs-general) (mapcar 'ess-add-icon-xemacs ess-toolbar-items))) ) (defun ess-add-toolbar () "Add the ESS toolbar to a particular mode. The toolbar is added iff `ess-toolbar-global' is nil, else the toolbar is added globally when ess-toolbar.el is loaded." (if (and ess-toolbar (not ess-toolbar-global)) (if (featurep 'xemacs) (set-specifier default-toolbar ess-toolbar (current-buffer)) ;; Support for Emacs (set (make-local-variable 'tool-bar-map) ess-toolbar)))) ;; Make the toolbars. Each toolbar is hopefully made only when this file ;; is loaded; we don't need it to be remade every time. (if ess-use-toolbar (progn (ess-make-toolbar) ;; After making the toolbar, if ESS toolbar is needed globally, ;; add it here. (if ess-toolbar-global (if (featurep 'xemacs) ;; Xemacs (progn (set-specifier default-toolbar ess-toolbar) (ess-write-to-dribble-buffer "Creating global XEmacs toolbar")) ;; Emacs (setq tool-bar-map ess-toolbar) (ess-write-to-dribble-buffer "Creating global Emacs toolbar")) ) ;; Check for toolbar support - needed iff ess-use-toolbar is non-nil. (or ;; XEmacs test for image support, adapted from vm-version.el: (and (featurep 'xemacs) (memq (device-type) '(x gtk mswindows))) ;; ;; Emacs support for images: (and (fboundp 'display-images-p) (display-images-p)) ;; if above tests failed, give a warning. (progn (message "Toolbar support for ESS not available in this emacs.") ;; Not sure if we want to delay startup of ESS. ;;(sit-for 2) )) )) ;; Following needed for Emacs 23, not Emacs 22 (nor XEmacs). (when (boundp 'image-load-path) (add-to-list 'image-load-path ess-icon-directory)) (provide 'ess-toolbar) ;;; ess-toolbar.el ends here ess/lisp/ess-trns.el0000664000175000017500000003436512423756516013021 0ustar eddedd;;; ess-trns.el --- Support for manipulating S transcript files ;; Copyright (C) 1989--1994 Bates, Kademan, Ritter and Smith ;; Copyright (C) 1997--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: David Smith ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for dealing with ESS transcripts. ;;; Code: ; Requires and autoloads (require 'ess) (eval-when-compile (require 'comint) (require 'ess-inf)) (autoload 'ess-eval-region "ess-inf" "[autoload]" t) (autoload 'ess-eval-region-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-function "ess-inf" "[autoload]" t) (autoload 'ess-eval-function-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-line "ess-inf" "[autoload]" t) (autoload 'ess-eval-line-and-go "ess-inf" "[autoload]" t) (autoload 'ess-eval-line-and-step "ess-inf" "[autoload]" t) (autoload 'comint-previous-prompt "comint" "[autoload]" t) (autoload 'comint-next-prompt "comint" "[autoload]" t) (autoload 'ess-load-file "ess-inf" "[autoload]" t) (autoload 'ess-request-a-process "ess-inf" "(autoload)" nil) (autoload 'ess-get-process-buffer "ess-inf" "(autoload)" nil) (autoload 'ess-switch-to-ESS "ess-inf" "(autoload)" nil) (autoload 'ess-switch-to-end-of-ESS "ess-inf" "(autoload)" nil) (autoload 'ess-eval-linewise "ess-inf" "(autoload)" nil) (autoload 'inferior-ess-get-old-input "ess-inf" "(autoload)" nil) ; ess-transcript-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; In this section: ;;;; ;;;; * The major mode ess-transcript-mode ;;;; * Commands for ess-transcript-mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;*;; Major mode definition (defvar ess-transcript-mode-map nil "Keymap for `ess-transcript-mode'.") (unless ess-transcript-mode-map (setq ess-transcript-mode-map (make-sparse-keymap)) (define-key ess-transcript-mode-map "\C-c\C-s" 'ess-switch-process) (define-key ess-transcript-mode-map "\C-c\C-r" 'ess-eval-region) (define-key ess-transcript-mode-map "\C-c\M-r" 'ess-eval-region-and-go) ;; (define-key ess-transcript-mode-map "\M-\C-x" 'ess-eval-function) ;; (define-key ess-transcript-mode-map "\C-c\M-f" 'ess-eval-function-and-go) ;; (define-key ess-transcript-mode-map "\C-c\C-j" 'ess-eval-line) ;; (define-key ess-transcript-mode-map "\C-c\M-j" 'ess-eval-line-and-go) (define-key ess-transcript-mode-map "\C-c\C-k" 'ess-force-buffer-current) (define-key ess-transcript-mode-map "\C-c\C-q" 'ess-quit) (define-key ess-transcript-mode-map "\C-c\C-j" 'ess-transcript-send-command) (define-key ess-transcript-mode-map "\C-c\M-j" 'ess-transcript-send-command-and-move) (define-key ess-transcript-mode-map "\M-\C-a" 'ess-goto-end-of-function-or-para) (define-key ess-transcript-mode-map "\M-\C-e" 'ess-goto-end-of-function-or-para) (define-key ess-transcript-mode-map "\C-c\C-y" 'ess-switch-to-ESS) (define-key ess-transcript-mode-map "\C-c\C-z" 'ess-switch-to-end-of-ESS) (define-key ess-transcript-mode-map "\C-c\C-v" 'ess-display-help-on-object) (define-key ess-transcript-mode-map "\C-c\C-d" 'ess-dump-object-into-edit-buffer) (define-key ess-transcript-mode-map "\C-c\C-t" 'ess-execute-in-tb) (define-key ess-transcript-mode-map "\C-c\t" 'ess-complete-object-name-deprecated) (define-key ess-transcript-mode-map "\C-a" 'comint-bol) (define-key ess-transcript-mode-map "\M-\t" 'comint-replace-by-expanded-filename) (define-key ess-transcript-mode-map "\M-?" 'comint-dynamic-list-completions) (define-key ess-transcript-mode-map "\C-c\C-k" 'ess-request-a-process) (define-key ess-transcript-mode-map "{" 'ess-electric-brace) (define-key ess-transcript-mode-map "}" 'ess-electric-brace) (define-key ess-transcript-mode-map "\e\C-h" 'ess-mark-function) (define-key ess-transcript-mode-map "\e\C-q" 'ess-indent-exp) ;(define-key ess-transcript-mode-map "\177" 'backward-delete-char-untabify) (define-key ess-transcript-mode-map "\t" 'ess-indent-command) (define-key ess-transcript-mode-map "\C-c\C-p" 'comint-previous-prompt) (define-key ess-transcript-mode-map "\C-c\C-n" 'comint-next-prompt) ;; (define-key ess-transcript-mode-map "\C-c\C-n" 'ess-eval-line-and-step) (define-key ess-transcript-mode-map "\r" 'ess-transcript-send-command-and-move) (define-key ess-transcript-mode-map "\M-\r" 'ess-transcript-send-command) (define-key ess-transcript-mode-map "\C-c\r" 'ess-transcript-copy-command) (define-key ess-transcript-mode-map "\C-c\C-w" 'ess-transcript-DO-clean-region) (define-key ess-transcript-mode-map "\C-c\M-c" 'ess-transcript-clean-buffer) ) (easy-menu-define ess-transcript-mode-menu ess-transcript-mode-map "Menu for use in S transcript mode." '("ESS-trans" ["What is this? (beta)" ess-mouse-me t] ["Describe" describe-mode t] ["About" (ess-goto-info "Transcript Mode") t] ["Send bug report" ess-submit-bug-report t] "------" ["Mark cmd group" mark-paragraph t] ["Previous prompt" comint-previous-prompt t] ["Next prompt" comint-next-prompt t] "------" ["Send and move" ess-transcript-send-command-and-move t] ["Copy command" ess-transcript-copy-command t] ["Send command" ess-transcript-send-command t] ["Clean Region" ess-transcript-DO-clean-region t] ["Clean Whole Buffer" ess-transcript-clean-buffer t] ["Switch S process" ess-switch-process t] )) (unless (featurep 'xemacs) (if (featurep 'ess-trans) (define-key ess-transcript-mode-map [menu-bar ess-trans] (cons "ess-trans" ess-transcript-mode-menu)) (eval-after-load "ess-trans" '(define-key ess-transcript-mode-map [menu-bar ess-trans] (cons "ess-trans" ess-transcript-mode-menu))))) (when (featurep 'xemacs) (defun ess-transcript-mode-xemacs-menu () "Hook to install `ess-transcript-mode' menu for XEmacs (w/ easymenu)." (if 'ess-transcript-mode (easy-menu-add ess-transcript-mode-menu) (easy-menu-remove ess-transcript-mode-menu))) (add-hook 'ess-transcript-mode-hook 'ess-transcript-mode-xemacs-menu)) (defun ess-transcript-mode (alist &optional proc) "Major mode for manipulating {ESS} transcript files. Type \\[ess-transcript-send-command] to send a command in the transcript to the current S process. \\[ess-transcript-copy-command] copies the command but does not execute it, allowing you to edit it in the process buffer first. Type \\[ess-transcript-clean-region] to delete all outputs and prompts in the region, leaving only the S commands. Other keybindings are: \\{ess-transcript-mode-map}" (interactive) (require 'ess-inf) (kill-all-local-variables) (setq buffer-read-only t) ;; to protect the buffer. (ess-setq-vars-local alist); (current-buffer)) (setq major-mode 'ess-transcript-mode) (setq mode-name "ESS Transcript") (use-local-map ess-transcript-mode-map) (set-syntax-table ess-mode-syntax-table) (setq mode-line-process '(" [" ess-local-process-name "]")) (make-local-variable 'ess-local-process-name) (setq ess-local-process-name nil) (unless inferior-ess-prompt ;; For S languages it is set in custom-alist (setq inferior-ess-prompt ;; Do not anchor to bol with `^' (concat "\\(" inferior-ess-primary-prompt "\\|" inferior-ess-secondary-prompt "\\)"))) (make-local-variable 'paragraph-start) (setq paragraph-start (concat "^" inferior-ess-prompt "\\|^\^L")) (make-local-variable 'paragraph-separate) (setq paragraph-separate "^\^L") (make-local-variable 'comint-use-prompt-regexp) (setq comint-use-prompt-regexp t) (make-local-variable 'comint-prompt-regexp) (setq comint-prompt-regexp (concat "^" inferior-ess-prompt)) ;; font-lock support (when inferior-ess-font-lock-keywords ;; new system (setq inferior-ess-font-lock-defaults (ess--extract-default-fl-keywords inferior-ess-font-lock-keywords))) (set (make-local-variable 'font-lock-defaults) '(inferior-ess-font-lock-defaults nil nil ((?\. . "w") (?\_ . "w") (?' . ".")))) ;;; Keep out of the code. (make-local-variable 'indent-tabs-mode) (setq indent-tabs-mode nil) (run-hooks 'ess-transcript-mode-hook)) ;;*;; Commands used in S transcript mode (defun ess-transcript-send-command () "Send the command at point in the transcript to the ESS process. The line should begin with a prompt. The ESS process buffer is displayed if it is not already." (interactive) (let* ((proc (or ess-local-process-name (ess-request-a-process "Evaluate into which process? " t))) (ess-buf (ess-get-process-buffer proc))) (setq ess-local-process-name proc) (if (get-buffer-window ess-buf) nil (display-buffer ess-buf t)) (let ((input (inferior-ess-get-old-input))) (with-current-buffer ess-buf (goto-char (point-max)) (ess-eval-linewise input))))) (defun ess-transcript-send-command-and-move () "Send the command on this line, and move point to the next command." (interactive) ;; (ess-transcript-send-command) ;; This doesn't work properly ;; replacement code begins (let* ((proc (or ess-local-process-name (ess-request-a-process "Evaluate into which process? " t))) (ess-buf (ess-get-process-buffer proc))) (setq ess-local-process-name proc) (if (get-buffer-window ess-buf) nil (display-buffer ess-buf t)) (let ((input (inferior-ess-get-old-input))) (with-current-buffer ess-buf (goto-char (point-max)) (ess-eval-linewise input nil nil nil 1)))) ;; replacement code ends (goto-char ess-temp-point) (comint-next-prompt 1)) (defun ess-transcript-copy-command () "Copy the command at point to the command line of the ESS process." (interactive) (let* ((proc (or ess-local-process-name (ess-request-a-process "Evaluate into which process? " t))) (ess-buf (process-buffer (get-process proc))) (input (inferior-ess-get-old-input))) (setq ess-local-process-name proc) (if (get-buffer-window ess-buf) nil (display-buffer ess-buf t)) (with-current-buffer ess-buf (goto-char (point-max)) (insert input))) (ess-switch-to-end-of-ESS)) (defun ess-transcript-clean-region (beg end even-if-read-only) "Strip the transcript in the region, leaving only (R/S/Lsp/..) commands. Deletes any lines not beginning with a prompt, and then removes the prompt from those lines that remain. Prefix argument means to clean even if the buffer is \\[read-only]." (interactive "r\nP") (unless inferior-ess-prompt (error "Cannot clean ESS transcript region in this mode! That only works in ess-transcript-mode or inferior-ess-mode ('*R*' etc)." ;; Maybe call ess-clean-region-in-new-transcript ?")) )) (let ((do-toggle (and buffer-read-only even-if-read-only)) (ess-prompt-rx (if inferior-ess-secondary-prompt (concat "^\\(\\(" inferior-ess-prompt "\\)\\|\\(" inferior-ess-secondary-prompt "\\)\\)") (concat "^" inferior-ess-prompt)))) (save-excursion (if do-toggle (setq buffer-read-only nil)) (save-restriction (unless (featurep 'xemacs) ;; does not exist in xemacs: (deactivate-mark)) (narrow-to-region beg end) (goto-char (point-min)) (delete-non-matching-lines ess-prompt-rx) (goto-char (point-min)) ;; (replace-regexp * * ) : (while (re-search-forward ess-prompt-rx nil t) (replace-match "" nil nil))) (if do-toggle (setq buffer-read-only t))))) ;; unfinished idea :----------------------- ;; (defun ess-clean-region-in-new-transcript (beg end) ;; "Copy the region into a new ess-transcript buffer, and clean it there, ;; using \\[ess-transcript-clean-region]." ;; (interactive "r") ;; (let ((bname (buffer-file-name))) ;; (setq bname (if bname .. ..)) ;; (let ;; (fbase (if fname (file-name-sans-extension (file-name-nondirectory fname)) ;; (buffer-name))) ;; ;; ;; the buffer name should be like a file name ;; (buf-nam ....) ;; (trns-buf (get-buffer-create fbase)) ;; (pop-to-buffer trns-buf) ;; (ess-transcript-mode .....) ;; ))) (defun ess-transcript-DO-clean-region (beg end) "Clean the current via \\[ess-transcript-clean-region] even if the buffer is read-only." (interactive "r") (ess-transcript-clean-region beg end 'In-ANY-case)) (defun ess-transcript-clean-buffer () "Cleanup the whole buffer. Use point-min/max to obey narrow-to-region." (interactive) (ess-transcript-clean-region (point-min) (point-max) 'In-ANY-case)) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-trns.el ends here ess/lisp/ess-developer.el0000664000175000017500000004711712577152666014025 0ustar eddedd;;; ess-developer.el --- Developer mode for R. ;; Copyright (C) 2011-2015 V. Spinu, A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Vitalie Spinu ;; Created: 12-11-2011 ;; Maintainer: ESS-core ;; Keywords: languages, tools ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; see apropriate documentation section of ESS user manual ;;; Code: ;; (require 'ess-site) ;; need to assigne the keys in the map (defgroup ess-developer nil "ESS: developer." :group 'ess :prefix "ess-developer-") (defface ess-developer-indicator-face '((((class grayscale)) (:background "DimGray")) (((class color) (background light)) (:foreground "red4" :bold t )) (((class color) (background dark)) (:foreground "deep sky blue" :bold t ))) "Face to highlight mode line process name when developer mode is on." :group 'ess-developer) (defcustom ess-developer-packages nil "List of names of R packages you currently develop. Set this variable to the list of packages you commonly develop or use `ess-developer-add-package' to modify interactively this list." :group 'ess-developer :type 'list) (defcustom ess-developer-load-package-command "library(devtools)\nload_all('%s')\n" "Command issued by `ess-developer-load-package'. %s is subsituted with the user supplied directory." :group 'ess-developer :type 'string) (defvar ess-developer-root-file "DESCRIPTION" "If this file is present in the directory, it is considered a project root.") ;; (defcustom ess-developer-force-attach nil ;; "If non-nill all the packages listed in `ess-developer-packages' should be attached ;; when ess-developer mode is turned on." ;; :group 'ess-developer ;; :type 'boolean) (defcustom ess-developer-enter-hook nil "Normal hook run on entering `ess-developer' mode." :group 'ess-developer :type 'hook) (defcustom ess-developer-exit-hook nil "Normal hook run on exiting `ess-developer' mode." :group 'ess-developer :type 'hook) (defcustom ess-developer-activate-in-package t "If non-nil, `ess-developer' is automatically turned on within R packages. The activation is triggered only for packages currently listed in `ess-developer-packages'." :group 'ess-developer :type 'boolean) (defcustom ess-developer-load-on-add-commands '(("library" . "library(%n)") ("load_all" . "library(devtools)\nload_all('%d')")) "Alist of available load commands what are proposed for loading on `ess-developer-add-package'. %n is replaced with package name, %d is replaced with package directory. See also `ess-developer-load-package' for related functionality." :group 'ess-developer :type 'alist) (defvar ess-developer--load-hist nil) (defun ess-developer-add-package (&optional attached-only) "Add a package to `ess-developer-packages' list. With prefix argument only choose from among attached packages." (interactive "P") (ess-force-buffer-current) (let* ((packs (ess-get-words-from-vector (format "print(unique(c(.packages(), %s)), max=1e6)\n" (if attached-only "NULL" ".packages(TRUE)")))) (cur-pack (ess-developer--get-package-name)) (sel (ess-completing-read "Add package" packs nil nil nil nil (unless (member cur-pack ess-developer-packages) cur-pack))) (check-attached (format ".ess_package_attached('%s')\n" sel))) (unless (ess-boolean-command check-attached) (let* ((fn (if (> (length ess-developer-load-on-add-commands) 1) (ess-completing-read "Package not loaded. Use" (mapcar 'car ess-developer-load-on-add-commands) nil t nil 'ess-developer--load-hist (car ess-developer--load-hist)) (caar ess-developer-load-on-add-commands))) (cmd (cdr (assoc fn ess-developer-load-on-add-commands)))) (setq cmd (replace-regexp-in-string "%n" sel cmd)) (when (string-match-p "%d" cmd) (let ((dir (read-directory-name "Package: " (ess-developer--get-package-path sel) nil t nil))) (setq cmd (replace-regexp-in-string "%d" dir cmd)))) (ess-eval-linewise (concat cmd "\n"))) (ess-wait-for-process) (when (not (ess-boolean-command check-attached)) (error "Package '%s' could not be added" sel))) (setq ess-developer-packages (ess-uniq-list (append ess-developer-packages (list sel)))) ;; turn developer in all files from selected package (ess-developer-activate-in-package sel 'all) (message "You are developing: %s" ess-developer-packages))) (defun ess-developer-remove-package () "Remove packages from `ess-developer-packages' list; defaults to *ALL*." (interactive) (unless ess-developer-packages (error "Nothing to remove, 'ess-developer-packages' is empty")) (let ((sel (ess-completing-read "Remove package(s)" (append ess-developer-packages (list "*ALL*")) nil t nil nil "*ALL*"))) (if (equal "*ALL*" sel) (progn (setq ess-developer-packages nil) (ess-developer-deactivate-in-package nil 'all) (message "Removed *ALL* packages from the `ess-developer-packages' list.")) (setq ess-developer-packages (delete sel ess-developer-packages)) (ess-developer-deactivate-in-package sel 'all) (message "Removed package '%s' from the `ess-developer-packages' list" (propertize sel 'face 'font-lock-function-name-face))))) (defun ess-developer-send-region-fallback (proc beg end visibly &optional message tracebug func) (if tracebug (ess-tracebug-send-region proc beg end visibly message t) (ess-send-region proc beg end visibly message))) (defun ess-developer-source-current-file (&optional filename) "Ask for namespace to source the current file into. If *current* is selected just invoke source('file_name'), otherwise call devSource." (interactive) (ess-force-buffer-current "R process to use: ") (unless ess-developer (error "Ess-developer mode is not active")) (if (not (or filename buffer-file-name)) (error "Buffer '%s' doesn't visit a file" (buffer-name (current-buffer))) (let* ((filename (or filename buffer-file-name)) (file (file-name-nondirectory filename)) (all-packs (append ess-developer-packages (list "*current*" ))) (default (car (member (car ess-developer--hist) all-packs))) (env (ess-completing-read (format "devSource '%s' into" file) all-packs nil t nil 'ess-developer--hist default)) (comm (if (equal env "*current*") (format "source(file=\"%s\", local=F)\n cat(\"Sourced file '%s' into\", capture.output(environment()), '\n')" filename file) (format ".essDev_source(source='%s',package='%s')" filename env)))) (when (buffer-modified-p) (save-buffer)) (message "devSourcing '%s' ..." file) (ess-developer--command comm 'ess-developer--propertize-output)))) (defun ess-developer--exists-in-ns (var ns) ;; If namespace does not exist, the R code below throw an error. But that's equivalent to FALSE. (let ((cmd "as.character(exists('%s', envir=asNamespace('%s'), mode='function', inherits=FALSE))\n")) (ess-boolean-command (format cmd var ns)))) (defun ess-developer-send-function (proc beg end name &optional visibly message tracebug) (save-excursion (if (null ess-developer-packages) (error "`ess-developer-packages' is empty (add packages with C-c C-t C-a).") (if (null name) (error "Oops, could not find function name (probably a regexp bug)") (let ((nms (ess-get-words-from-vector "loadedNamespaces()\n")) (dev-packs ess-developer-packages) (default-ns (ess-developer--get-package-name)) assigned-p ns) (if (string-match-p ess-set-function-start (concat name "(")) ;; if setMethod, setClass etc, do send region (ess-developer-send-region proc beg end visibly message tracebug) (when tracebug (ess-tracebug-set-last-input proc)) (if (member default-ns dev-packs) (ess-developer-devSource beg end default-ns message) ;; iterate over all developed packages and check if functions ;; exists in that namespace (while (and (setq ns (pop dev-packs)) (not assigned-p)) (when (and (member ns nms) (ess-developer--exists-in-ns name ns)) (ess-developer-devSource beg end ns message) (setq assigned-p t))) ;; last resort - assign in current env (unless assigned-p (ess-developer-send-region-fallback proc beg end visibly message tracebug))))))))) (defvar ess-developer--hist nil) (defun ess-developer-send-region (proc beg end &optional visibly message tracebug) "Ask for for the package and devSource region into it." (let* ((all-packs (append ess-developer-packages (list "*current*" ))) (default (car (member (car ess-developer--hist) all-packs))) (package (ess-completing-read "devEval into" all-packs nil t nil 'ess-developer--hist default))) (message (if message (format "dev%s ..." message))) (if (equal package "*current*") (ess-developer-send-region-fallback proc beg end visibly message tracebug) ;; else, (ignore VISIBLY here) (ess-developer-devSource beg end package message)))) (defun ess-developer-devSource (beg end package &optional message) (let* ((ess-eval-command (format ".essDev.eval(\"%s\", package=\"%s\", file=\"%s\")" "%s" package "%f")) (ess-eval-visibly-command ess-eval-command) (ess-eval-visibly-noecho-command ess-eval-command)) (if message (message message)) (ess-developer--command (ess--make-source-refd-command beg end) 'ess-developer--propertize-output))) (defun ess-developer--command (comm &optional propertize-func) "Evaluate the command and popup a message with the output if succed. On error insert the error at the end of the inferior-ess buffer. PROPERTIZE-FUNC is a function called with the output buffer being current. usually used to manipulate the output, for example to propertize output text. " (setq comm (format "eval({cat(\"\\n\")\n%s\ncat(\"!@OK@!\")})\n" comm)) (let ((buff (get-buffer-create " *ess-command-output*")) out) (ess-command comm buff nil nil 0.1) (with-current-buffer buff (goto-char (point-min)) (delete-region (point) (min (point-max) ;; delete + + + (1+ (point-at-eol)))) (goto-char (point-max)) (if (re-search-backward "!@OK@!" nil t) (progn (when (fboundp propertize-func) (save-excursion (funcall propertize-func))) (message "%s" (buffer-substring (point-min) (max (point-min) (1- (point)))))) (message "%s" (buffer-substring-no-properties (point-min) (point-max))))))) (defun ess-developer--propertize-output () (goto-char (point-min)) (while (re-search-forward "\\(FUN\\|CLS\\|METH\\)\\[" nil t) (put-text-property (match-beginning 1) (match-end 1) 'face 'font-lock-function-name-face)) (goto-char (point-min)) (while (re-search-forward "\\([^ \t]+\\):" nil t) (put-text-property (match-beginning 1) (match-end 1) 'face 'font-lock-keyword-face))) (defvar ess-developer--pack-name nil) (make-variable-buffer-local 'ess-developer--pack-name) (defun ess-developer--get-package-path (&optional pack-name) "Get the root of R package that contains current directory. Root is determined by locating `ess-developer-root-file'. If PACK-NAME is given, iterate over default-directories of all open R files till package with name pack-name is found. If not found, return nil." (if pack-name (let ((bl (buffer-list)) path bf) (while (and (setq bf (pop bl)) (not path)) (when (buffer-local-value 'ess-dialect bf) (with-current-buffer bf (setq path (ess-developer--get-package-path)) (unless (equal pack-name (ess-developer--get-package-name)) (setq path nil))))) path) (let ((path (directory-file-name default-directory))) (when (string= "R" (file-name-nondirectory path)) (setq path (file-name-directory path)) (when (file-exists-p (expand-file-name ess-developer-root-file path)) path))) ;; This following version is incredibly slow on remotes: ;; (let ((path default-directory) ;; opath package) ;; (while (and path ;; (not package) ;; (not (equal path opath))) ;; (if (file-exists-p (expand-file-name ess-developer-root-file path)) ;; (setq package path) ;; (setq opath path ;; path (file-name-directory (directory-file-name path))))) ;; package) )) (defun ess-developer--get-package-name (&optional path force) "Find package name in path. Parses DESCRIPTION file in PATH (R specific so far). PATH defaults to the value returned by (ess-developer--get-package-path). If FORCE is non-nil, don't check for buffer local cached value of the package name." (or (and (not force) ess-developer--pack-name) (when (setq path (or path (ess-developer--get-package-path))) (let ((file (expand-file-name ess-developer-root-file path)) (case-fold-search t)) (when (file-exists-p file) (with-temp-buffer (insert-file-contents file) (goto-char (point-min)) (re-search-forward "package: \\(.*\\)") (setq ess-developer--pack-name (match-string 1)))))))) (defun ess-developer-activate-in-package (&optional package all) "Activate developer if current file is part of a package which is registered in `ess-developer-packages'. If PACKAGE is given, activate only if current file is part of the PACKAGE, `ess-developer-packages' is ignored in this case. If ALL is non-nil, perform activation in all R buffers. This function does nothing if `ess-developer-activate-in-package' is nil." (when ess-developer-activate-in-package (if all (dolist (bf (buffer-list)) (with-current-buffer bf (ess-developer-activate-in-package package))) (let ((pack (ess-developer--get-package-name))) (when (and buffer-file-name pack (not ess-developer) (if package (equal pack package) (member pack ess-developer-packages))) (ess-developer t)))))) (defun ess-developer-deactivate-in-package (&optional package all) "Deactivate developer if current file is part of the R package. If PACKAGE is given, deactivate only if current package is PACKAGE. If ALL is non-nil, deactivate in all open R buffers." (if all (dolist (bf (buffer-list)) (with-current-buffer bf (ess-developer-deactivate-in-package package))) (let ((pack (ess-developer--get-package-name))) (when (and ess-developer (or (null package) (equal pack package))) (ess-developer -1))))) (defun ess-developer-load-package () "Interface to load_all function from devtools package." (interactive) (ess-force-buffer-current) (let ((package (ess-developer--get-package-path))) (unless (and package ess-developer) ;; ask only when not obvious (setq package (read-directory-name "Package: " package nil t nil))) (unless (file-exists-p (expand-file-name ess-developer-root-file package)) (error "Not a valid package. No '%s' found in `%s'." ess-developer-root-file package)) (message "Loading %s" (abbreviate-file-name package)) (ess-eval-linewise (format ess-developer-load-package-command package)))) (defvar ess-developer nil "Non nil in buffers where developer mode is active") (make-variable-buffer-local 'ess-developer) ;; Since the ESSR package, this one is not needed: ;; (defun ess-developer--inject-source-maybe () ;; ;; puting this into ESSR.R makes loading very slow ;; ;; when ESSR is a package, this should go away ;; (let ((devR-file (concat (file-name-directory ess-etc-directory) ;; "ess-developer.R"))) ;; (unless (ess-boolean-command ;; "exists('.essDev_source', envir = .ESSR_Env)\n") ;; (unless (file-exists-p devR-file) ;; (error "Cannot locate 'ess-developer.R' file")) ;; (message "Injecting ess-developer code ...") ;; (ess--inject-code-from-file devR-file) ;; (unless (ess-boolean-command "exists('.essDev_source', envir = .ESSR_Env)\n") ;; (error "Could not source ess-developer.R. Please investigate the output of *ess-command-output* buffer for errors"))))) (defun ess-developer (&optional val) "Toggle on/off `ess-developer' functionality. If optional VAL is non-negative, turn on the developer mode. If VAL is negative turn it off. See also `ess-developer-packages', `ess-developer-add-package' and `ess-developer-activate-in-package'." (interactive) (when (eq val t) (setq val 1)) (let ((ess-dev (if (numberp val) (if (< val 0) nil t) (not ess-developer)))) (if ess-dev (progn (run-hooks 'ess-developer-enter-hook) (if ess-developer-packages (message "You are developing: %s" ess-developer-packages) (message "Developer is on (add packages with C-c C-t a)"))) (run-hooks 'ess-developer-exit-hook) (message "%s developer is off" (if (get-buffer-process (current-buffer)) "Global" "Local"))) (setq ess-developer ess-dev)) (force-window-update)) (defalias 'ess-toggle-developer 'ess-developer) ;;; MODELINE (defvar ess-developer--local-indicator '("" (:eval ;; process has priority (if (and (ess-process-live-p) (ess-get-process-variable 'ess-developer)) (propertize " D" 'face 'ess-developer-indicator-face) (if ess-developer (propertize " d" 'face 'ess-developer-indicator-face) ""))))) (put 'ess-developer--local-indicator 'risky-local-variable t) (defun ess-developer-setup-modeline () (add-to-list 'ess--local-mode-line-process-indicator 'ess-developer--local-indicator 'append)) ;;; HOOKS (add-hook 'R-mode-hook 'ess-developer-activate-in-package) (add-hook 'R-mode-hook 'ess-developer-setup-modeline) (add-hook 'inferior-ess-mode-hook 'ess-developer-setup-modeline) (provide 'ess-developer) ;;; ess-developer.el ends here ess/lisp/msdos.el0000664000175000017500000001467012516226622012356 0ustar eddedd;;; msdos.el --- Run an MS-DOS shell in an NTemacs buffer with bash as the shell ;; Copyright (C) 1999 Richard M. Heiberger ;; Copyright (C) 2000--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: February 1999 ;; Maintainer: ESS-core ;; Keywords: processes ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; The file msdos.el in the next mail message opens an *msdos* buffer ;; in shell-mode and msdos-minor-mode. When cmdproxy.exe/command.com ;; is the emacs shell, then this gets various setting right that M-x ;; shell currently misses. The function M-x msdos-minor-mode could be ;; automatically run by emacs in shell-mode in that case. ;; When bash is the emacs shell, msdos.el still opens a ;; cmdproxy.exe/command.com shell in the buffer *msdos*. There are ;; occasions when it is necessary to run DOS character-based programs ;; in an emacs window. ;; I followed the suggestion by AndrewI to look at M-x shell and modify ;; it. It turns out not to have been trivial. ;; I've listed it as part of ESS (emacs speaks statistics) for now. I ;; will be happy to sign it over to FSF and have it become part of the ;; standard distribution for windows machines. ;;; Code: (require 'shell); and hence 'comint ;;; Customization and Buffer Variables (defcustom explicit-msdos-shell-file-name "cmdproxy.exe" "*If non-nil, is file name to use for explicitly requested msdos inferior shell." :type '(choice (const :tag "None" nil) file) :group 'shell) (defcustom explicit-msdos-comspec-file-name (if (w32-using-nt) "cmd.exe" "command.com") "*If non-nil, is file name to use for explicitly requested COMSPEC environment variable." :type '(choice (const :tag "None" nil) file) :group 'shell) (make-variable-buffer-local 'msdos-minor-mode) (defvar msdos-minor-mode nil "Non-nil if using msdos-minor mode as a minor mode of some other mode.") (defun msdos () "Run an inferior msdos shell, with I/O through buffer *msdos*. This function is intended to be used in an Ntemacs session in which bash is the primary shell. But sometimes an MSDOS window, within emacs, is also needed. If buffer exists but shell process is not running, make new shell. If buffer exists and shell process is running, just switch to buffer `*msdos*'. Program used comes from variable `explicit-msdos-shell-file-name'. If a file `~/.emacs_SHELLNAME' exists, it is given as initial input (Note that this may lose due to a timing error if the shell discards input when it starts up.) The buffer is put in Shell mode, giving commands for sending input and controlling the subjobs of the shell. See `shell-mode'. See also the variable `shell-prompt-pattern'. The buffer is put into \\[msdos-minor-mode]. See `msdos-minor-mode'. The COMSPEC environment variable in the inferior shell, but not in the emacs process, is set to `explicit-msdos-comspec-file-name'. The SHELL environment variable in the inferior shell, but not in the emacs process, is set to `explicit-msdos-shell-file-name'. The shell file name (sans directories) is used to make a symbol name such as `explicit-csh-args'. If that symbol is a variable, its value is used as a list of arguments when invoking the shell. \(Type \\[describe-mode] in the shell buffer for a list of commands.)" (interactive) (if (not (comint-check-proc "*msdos*")) (let* ((prog explicit-msdos-shell-file-name) (name (file-name-nondirectory prog)) (startfile (concat "~/.emacs_" name)) (xargs-name (intern-soft (concat "explicit-" name "-args"))) shell-buffer (comspec (getenv "COMSPEC")) (shell (getenv "SHELL")) ) (save-excursion (setenv "COMSPEC" explicit-msdos-comspec-file-name) (setenv "SHELL" explicit-msdos-shell-file-name) (set-buffer (apply 'make-comint "msdos" prog (if (and xargs-name (boundp xargs-name)) (symbol-value xargs-name)) (if (file-exists-p startfile) (concat "/k " startfile)))) (setenv "COMSPEC" comspec) (setenv "SHELL" shell) (setq shell-buffer (current-buffer)) (shell-mode) (msdos-minor-mode) (sleep-for 4) ; need to wait, else working too fast! ;;; The `exit' warning should precede the "c:\" prompt. ;;; If not, then increase the sleep-for time! (goto-char (point-min)) (insert "Remember to exit this buffer with `exit'. If you kill the buffer without exiting, you may not be able to shut down Windows cleanly.") (goto-char (point-max))) (pop-to-buffer shell-buffer)) (pop-to-buffer "*msdos*"))) (defun msdos-minor-mode () "Minor mode for running msdos in a shell-mode buffer: a. Uses \\[set-buffer-process-coding-system] to set the coding system to `'raw-text-dos'. The DOS C-m C-l end-of-line is critical. The shell freezes without it. b. The variable `comint-completion-addsuffix' is set to `\\' for directories. c. Prevents echoing of commands. d. strips ctrl-m from output. " (interactive) (setq msdos-minor-mode t) (set (make-local-variable 'comint-completion-addsuffix) '("\\" . " ")) (setq comint-process-echoes t) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) (set-buffer-process-coding-system 'raw-text-dos 'raw-text-dos) ;; buffer-process-coding-system is critical. ) ;; Install ourselves: (put 'msdos-minor-mode 'permanent-local t) (or (assq 'msdos-minor-mode minor-mode-alist) (setq minor-mode-alist (append minor-mode-alist (list '(msdos-minor-mode " msdos"))))) ;; Provide ourselves: (provide 'msdos) ;;; msdos.el ends here ess/lisp/ess-r-completion.el0000664000175000017500000005335012577152666014444 0ustar eddedd;;; ess-r-completion.el --- R completion ;; ;; Copyright (C) 2015 A.J. Rossini, Richard M. Heiberger, Martin Maechler, Kurt ;; Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; ;; Author: Vitalie Spinu ;; Maintainer: ESS-core ;; ;; Keywords: languages, statistics ;; ;; This file is part of ESS. ;; ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;;; Commentary: ;; ;;; Code: ;;; ElDoc (eval-when-compile (require 'cl)) (require 'ess-utils) (defun ess-R-eldoc-function () "Return the doc string, or nil. If an ESS process is not associated with the buffer, do not try to look up any doc strings." (interactive) (let ((proc (ess-get-next-available-process))) (when proc (let ((funname (or (and ess-eldoc-show-on-symbol ;; aggressive completion (thing-at-point 'symbol)) (car (ess--funname.start))))) (when funname (let* ((args (ess-function-arguments funname proc)) (bargs (cadr args)) (doc (mapconcat (lambda (el) (if (equal (car el) "...") "..." (concat (car el) "=" (cdr el)))) bargs ", ")) (margs (nth 2 args)) (W (- (window-width (minibuffer-window)) (+ 4 (length funname)))) doc1) (when doc (setq doc (ess-eldoc-docstring-format funname doc)) (when (and margs (< (length doc1) W)) (setq doc1 (concat doc (propertize " || " 'face font-lock-function-name-face))) (while (and margs (< (length doc1) W)) (let ((head (pop margs))) (unless (assoc head bargs) (setq doc doc1 doc1 (concat doc1 head "=, "))))) (when (equal (substring doc -2) ", ") (setq doc (substring doc 0 -2))) (when (and margs (< (length doc) W)) (setq doc (concat doc " {--}")))) doc))))))) (defun ess-eldoc-docstring-format (funname doc) (save-match-data (let* (;; (name (symbol-name sym)) (truncate (or (not (eq t eldoc-echo-area-use-multiline-p)) (eq ess-eldoc-abbreviation-style 'aggressive))) ;; Subtract 1 from window width since will cause a wraparound and ;; resize of the echo area. (W (1- (- (window-width (minibuffer-window)) (+ 2 (length funname))))) newdoc ) (setq doc (if (or (<= (length doc) W) (null ess-eldoc-abbreviation-style) (eq 'none ess-eldoc-abbreviation-style)) doc ;;MILD filter (setq doc (replace-regexp-in-string "TRUE" "T" doc)) (setq doc (replace-regexp-in-string "FALSE" "F" doc)) (if (or (<= (length doc) W) (eq 'mild ess-eldoc-abbreviation-style)) doc ;;NORMAL filter (deal with long defaults) (setq doc (replace-regexp-in-string ;; function calls inside default docs foo(xxxx{..}) "([^)]\\{8\\}\\([^)]\\{4,\\}\\))" "{.}" doc nil nil 1)) (if (<= (length doc) W) doc (setq doc (replace-regexp-in-string " +[^ \t=,\"\]+=[^ \t]\\{10\\}\\([^ \t]\\{4,\\}\\)\\(,\\|\\'\\)" "{.}," doc nil nil 1)) (if (<= (length doc) W) doc (setq doc (replace-regexp-in-string " +[^ \t=,\"]+=\\([^ \t]\\{10,\\}\\)\\(,\\|\\'\\)" "{.}," doc nil nil 1)) (if (or (<= (length doc) W) (eq 'normal ess-eldoc-abbreviation-style)) doc ;;STRONG filter (replace defaults) (setq doc (replace-regexp-in-string " *[^ \t=,\"\\]* = \\([^ \t]\\{4,\\}\\)\\(,\\|\\'\\)" "{.}," doc nil nil 1)) (if (<= (length doc) W) doc (setq doc (replace-regexp-in-string "\\(=[^FT0-9].+?\\)\\(, [^ =,\"\\]+=\\|\\'\\)" "" doc nil nil 1)) (setq doc (replace-regexp-in-string "\\(=[^FT0-9].+?\\)\\(, [^ =,\"\\]+,\\|\\'\\)" "" doc nil nil 1)) (if (or (<= (length doc) W) (eq 'strong ess-eldoc-abbreviation-style)) doc ;;AGGRESSIVE filter (truncate what is left) (concat (substring doc 0 (- W 4)) "{--}"))))))))) (when (and truncate (> (length doc) W)) (setq doc (concat (substring doc 0 (- W 4)) "{--}"))) (format "%s: %s" (propertize funname 'face 'font-lock-function-name-face) doc)))) ;;; OBJECTS (defun ess-R-object-completion () "Return completions at point in a format required by `completion-at-point-functions'." (if (ess-make-buffer-current) (let* ((funstart (cdr (ess--funname.start))) (completions (ess-R-get-rcompletions funstart)) (token (pop completions))) (when completions (list (- (point) (length token)) (point) completions))) (when (string-match "complete" (symbol-name last-command)) (message "No ESS process associated with current buffer") nil))) (defun ess-complete-object-name () "Perform completion on `ess-language' object preceding point. Uses \\[ess-R-complete-object-name] when `ess-use-R-completion' is non-nil, or \\[ess-internal-complete-object-name] otherwise." (interactive) (if (ess-make-buffer-current) (if ess-use-R-completion (ess-R-complete-object-name) (ess-internal-complete-object-name)) ;; else give a message on second invocation (when (string-match "complete" (symbol-name last-command)) (message "No ESS process associated with current buffer") nil))) (defun ess-complete-object-name-deprecated () "Gives a deprecated message " (interactive) (ess-complete-object-name) (message "C-c TAB is deprecated, completions has been moved to [M-TAB] (aka C-M-i)") (sit-for 2 t)) ;; This one is needed for R <= 2.6.x -- hence *not* obsoleting it (defun ess-internal-complete-object-name () "Perform completion on `ess-language' object preceding point. The object is compared against those objects known by `ess-get-object-list' and any additional characters up to ambiguity are inserted. Completion only works on globally-known objects (including elements of attached data frames), and thus is most suitable for interactive command-line entry, and not so much for function editing since local objects (e.g. argument names) aren't known. Use \\[ess-resynch] to re-read the names of the attached directories. This is done automatically (and transparently) if a directory is modified (S only!), so the most up-to-date list of object names is always available. However attached dataframes are *not* updated, so this command may be necessary if you modify an attached dataframe." (interactive) (ess-make-buffer-current) (if (memq (char-syntax (preceding-char)) '(?w ?_)) (let* ((comint-completion-addsuffix nil) (end (point)) (buffer-syntax (syntax-table)) (beg (unwind-protect (save-excursion (set-syntax-table ess-mode-syntax-table) (backward-sexp 1) (point)) (set-syntax-table buffer-syntax))) (full-prefix (buffer-substring beg end)) (pattern full-prefix) ;; See if we're indexing a list with `$' (listname (if (string-match "\\(.+\\)\\$\\(\\(\\sw\\|\\s_\\)*\\)$" full-prefix) (progn (setq pattern (if (not (match-beginning 2)) "" (substring full-prefix (match-beginning 2) (match-end 2)))) (substring full-prefix (match-beginning 1) (match-end 1))))) ;; are we trying to get a slot via `@' ? (classname (if (string-match "\\(.+\\)@\\(\\(\\sw\\|\\s_\\)*\\)$" full-prefix) (progn (setq pattern (if (not (match-beginning 2)) "" (substring full-prefix (match-beginning 2) (match-end 2)))) (ess-write-to-dribble-buffer (format "(ess-C-O-Name : slots..) : patt=%s" pattern)) (substring full-prefix (match-beginning 1) (match-end 1))))) (components (if listname (ess-object-names listname) (if classname (ess-slot-names classname) ;; Default case: It hangs here when ;; options(error=recover) : (ess-get-object-list ess-current-process-name))))) ;; always return a non-nil value to prevent history expansions (or (comint-dynamic-simple-complete pattern components) 'none)))) (defun ess-R-get-rcompletions (&optional start end prefix) "Call R internal completion utilities (rcomp) for possible completions. Optional START and END delimit the entity to complete, default to bol and point. If PREFIX is given, perform completion on PREFIX. First element of the returned list is the completion token. Needs version of R>=2.7.0." (let* ((start (or start (if prefix 0 (save-excursion (comint-bol nil) (point))))) (end (or end (if prefix (length prefix) (point)))) (prefix (or prefix (buffer-substring start end))) ;; (opts1 (if no-args "op<-rc.options(args=FALSE)" "")) ;; (opts2 (if no-args "rc.options(op)" "")) (cmd (format ".ess_get_completions(\"%s\", %d)\n" (ess-quote-special-chars prefix) (- end start)))) (ess-get-words-from-vector cmd))) (defun ess-R-complete-object-name () "Completion in R via R's completion utilities (formerly 'rcompgen'). To be used instead of ESS' completion engine for R versions >= 2.7.0." (interactive) (let ((possible-completions (ess-R-get-rcompletions)) token-string) ;; If there are no possible-completions, should return nil, so ;; that when this function is called from ;; comint-dynamic-complete-functions, other functions can also be ;; tried. (when possible-completions (setq token-string (pop possible-completions)) (or (comint-dynamic-simple-complete token-string possible-completions) 'none)))) (defvar ess--cached-sp-objects nil) (defun ess--get-cached-completions (prefix &optional point) (if (string-match-p "[]:$@[]" prefix) ;; call proc for objects (cdr (ess-R-get-rcompletions nil nil prefix)) ;; else, get cached list of objects (with-ess-process-buffer 'no-error ;; use proc buf alist (ess-when-new-input last-cached-completions (if (and ess--cached-sp-objects (not (process-get *proc* 'sp-for-ac-changed?))) ;; if global cache is already there, only re-read local .GlobalEnv (progn (unless ess-sl-modtime-alist ;; initialize if empty (setq ess-sl-modtime-alist '((".GlobalEnv" nil)))) ;; fixme: Make adaptive. Not on all remotes are slow; For lots of ;; objects in .GlobalEnv,locals could also be slow. (unless (file-remote-p default-directory) (ess-extract-onames-from-alist ess-sl-modtime-alist 1 'force))) (if ess--cached-sp-objects (ess-get-modtime-list 'ess--cached-sp-objects 'exclude-first) (ess-get-modtime-list) (setq ess--cached-sp-objects (cdr ess-sl-modtime-alist))) ;; reread new package, but not rda, much faster and not needed anyways (process-put *proc* 'sp-for-ac-changed? nil))) (apply 'append (cddar ess-sl-modtime-alist) ; .GlobalEnv (mapcar 'cddr ess--cached-sp-objects))))) ;;; ARGUMENTS (defcustom ess-R-argument-suffix " = " "Suffix appended by `ac-source-R' and `ac-source-R-args' to candidates." :group 'R :type 'string) (define-obsolete-variable-alias 'ess-ac-R-argument-suffix 'ess-R-argument-suffix "15.3") (defvar ess-R--funargs-pre-cache '(("plot" (("graphics") (("x" . "") ("y" . "NULL") ("type" . "p") ("xlim" . "NULL") ("ylim" . "NULL") ("log" . "") ("main" . "NULL") ("sub" . "NULL") ("xlab" . "NULL") ("ylab" . "NULL") ("ann" . "par(\"ann\")") ("axes" . "TRUE") ("frame.plot" . "axes") ("panel.first" . "NULL") ("panel.last" . "NULL") ("asp" . "NA") ("..." . "")) ("x" "y" "..." "ci" "type" "xlab" "ylab" "ylim" "main" "ci.col" "ci.type" "max.mfrow" "ask" "mar" "oma" "mgp" "xpd" "cex.main" "verbose" "scale" "xlim" "log" "sub" "ann" "axes" "frame.plot" "panel.first" "panel.last" "asp" "center" "edge.root" "nodePar" "edgePar" "leaflab" "dLeaf" "xaxt" "yaxt" "horiz" "zero.line" "verticals" "col.01line" "pch" "legend.text" "formula" "data" "subset" "to" "from" "newpage" "vp" "labels" "hang" "freq" "density" "angle" "col" "border" "lty" "add" "predicted.values" "intervals" "separator" "col.predicted" "col.intervals" "col.separator" "lty.predicted" "lty.intervals" "lty.separator" "plot.type" "main2" "par.fit" "grid" "panel" "cex" "dimen" "abbrev" "which" "caption" "sub.caption" "id.n" "labels.id" "cex.id" "qqline" "cook.levels" "add.smooth" "label.pos" "cex.caption" "rows" "levels" "conf" "absVal" "ci.lty" "xval" "do.points" "col.points" "cex.points" "col.hor" "col.vert" "lwd" "set.pars" "range.bars" "col.range" "xy.labels" "xy.lines" "nc" "yax.flip" "mar.multi" "oma.multi"))) ("print" (("base") (("x" . "") ("digits" . "NULL") ("quote" . "TRUE") ("na.print" . "NULL") ("print.gap" . "NULL") ("right" . "FALSE") ("max" . "NULL") ("useSource" . "TRUE") ("..." . "")) ("x" "..." "digits" "signif.stars" "intercept" "tol" "se" "sort" "verbose" "indent" "style" ".bibstyle" "prefix" "vsep" "minlevel" "quote" "right" "row.names" "max" "na.print" "print.gap" "useSource" "diag" "upper" "justify" "title" "max.levels" "width" "steps" "showEnv" "newpage" "vp" "cutoff" "max.level" "give.attr" "units" "abbrCollate" "print.x" "deparse" "locale" "symbolic.cor" "loadings" "zero.print" "calendar")))) "Alist of cached arguments for very time consuming functions.") ;;; HELP (defun ess-R-get-object-help-string (sym) "Help string for ac." (let ((proc (ess-get-next-available-process))) (if (null proc) "No free ESS process found" (let ((buf (get-buffer-create " *ess-command-output*"))) (when (string-match ":+\\(.*\\)" sym) (setq sym (match-string 1 sym))) (with-current-buffer (process-buffer proc) (ess-with-current-buffer buf (ess--flush-help-into-current-buffer sym nil t))) (with-current-buffer buf (ess-help-underline) (goto-char (point-min)) (buffer-string)))))) (defun ess-R-get-arg-help-string (sym &optional proc) "Help string for ac." (setq sym (replace-regexp-in-string " *= *\\'" "" sym)) (let ((proc (or proc (ess-get-next-available-process)))) (if (null proc) "No free ESS process found" (let ((fun (car ess--funname.start))) (with-current-buffer (ess-command (format ".ess_arg_help('%s','%s')\n" sym fun) nil nil nil nil proc) (goto-char (point-min)) (forward-line) (buffer-substring-no-properties (point) (point-max))))))) ;;; COMPANY ;;; http://company-mode.github.io/ (defun company-R-objects (command &optional arg &rest ignored) (interactive (list 'interactive)) (cl-case command (interactive (company-begin-backend 'company-R-objects)) (prefix (unless (ess-inside-string-or-comment-p) (let ((start (ess-symbol-start))) (when start (buffer-substring-no-properties start (point)))))) (candidates (let ((proc (ess-get-next-available-process))) (when proc (with-current-buffer (process-buffer proc) (all-completions arg (ess--get-cached-completions arg)))))) (doc-buffer (company-doc-buffer (ess-R-get-object-help-string arg))))) (defun company-R-args (command &optional arg &rest ignored) (interactive (list 'interactive)) (cl-case command (interactive (company-begin-backend 'company-R-args)) (prefix (unless (ess-inside-string-or-comment-p) (let ((start (ess-arg-start))) (when start (let ((prefix (buffer-substring-no-properties start (point)))) (if ess-company-arg-prefix-length (cons prefix (>= (length prefix) ess-company-arg-prefix-length)) prefix)))))) (candidates (let* ((proc (ess-get-next-available-process)) (args (delete "..." (nth 2 (ess-function-arguments (car ess--funname.start) proc)))) (args (mapcar (lambda (a) (concat a ess-R-argument-suffix)) args))) (all-completions arg args))) (meta (let ((proc (ess-get-next-available-process))) (when (and proc (with-current-buffer (process-buffer proc) (not (file-remote-p default-directory)))) ;; fixme: ideally meta should be fetched with args (let ((doc (ess-R-get-arg-help-string arg proc))) (replace-regexp-in-string "^ +\\| +$" "" (replace-regexp-in-string "[ \t\n]+" " " doc)))))) (sorted t) (require-match 'never) (doc-buffer (company-doc-buffer (ess-R-get-arg-help-string arg))))) ;;; AC SOURCES ;;; http://cx4a.org/software/auto-complete/index.html (defvar ac-source-R '((prefix . ess-ac-start) ;; (requires . 0) ::) (candidates . ess-ac-candidates) ;; (action . ess-ac-action-args) ;; interfere with ac-fallback mechanism on RET (which is extremely annoing in inferior buffers) (document . ess-ac-help)) "Combined ad-completion source for R function arguments and R objects") (defun ess-ac-start () (when (ess-process-live-p) (or (ess-arg-start) (ess-symbol-start)))) (defun ess-ac-candidates () "OBJECTS + ARGS" (let ((args (ess-ac-args))) ;; sort of intrusive but right (if (and ac-auto-start (< (length ac-prefix) ac-auto-start)) args (if args (append args (ess-ac-objects t)) (ess-ac-objects))))) (defun ess-ac-help (sym) (if (string-match-p "= *\\'" sym) (ess-R-get-arg-help-string sym) (ess-R-get-object-help-string sym))) ;; OBJECTS (defvar ac-source-R-objects '((prefix . ess-symbol-start) ;; (requires . 2) (candidates . ess-ac-objects) (document . ess-R-get-object-help-string)) "Auto-completion source for R objects") (defun ess-ac-objects (&optional no-kill) "Get all cached objects" (let ((aprf ac-prefix)) (when (and aprf (ess-process-live-p)) (unless no-kill ;; workaround (kill-local-variable 'ac-use-comphist)) (ess--get-cached-completions aprf ac-point)))) ;; ARGS (defvar ac-source-R-args '((prefix . ess-arg-start) ;; (requires . 0) (candidates . ess-ac-args) ;; (action . ess-ac-action-args) (document . ess-R-get-arg-help-string)) "Auto-completion source for R function arguments") (defun ess-ac-args () "Get the args of the function when inside parentheses." (when (and ess--funname.start ;; set in a call to ess-arg-start (ess-process-live-p)) (let ((args (nth 2 (ess-function-arguments (car ess--funname.start))))) (if args (set (make-local-variable 'ac-use-comphist) nil) (kill-local-variable 'ac-use-comphist)) (delete "..." args) (mapcar (lambda (a) (concat a ess-R-argument-suffix)) args)))) (defvar ess--ac-help-arg-command "getArgHelp('%s','%s')") (provide 'ess-r-completion) ess/lisp/ess-sp4-d.el0000664000175000017500000004704312423756516012757 0ustar eddedd;;; ess-sp4-d.el --- S-PLUS 4.x customization ;; Copyright (C) 1998--2002 Richard M. Heiberger ;; Copyright (C) 2003--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: December 1998 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S-PLUS 4.x customizations for ess-mode ;; with ddeclient. ;;; Code: ;;; Requires and Autoloads: (require 'ess-s-l) ;;NO: this is autoloaded from other places (require 'ess-dde) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defvar S+4-dialect-name "S+4" "Name of 'dialect' for S-PLUS 4.x.");easily changeable in a user's .emacs (defvar inferior-S+4-multipleinstances "/MULTIPLEINSTANCES" "Default \"/MULTIPLEINSTANCES\" opens up a new instance of S+4 in a GUI window and connects it to the '(ddeESS [S+4])' window. The alternative nil uses an existing S+4 GUI (if there is one) and connects it to the '(ddeESS [S+4])' window.") (defvar S+4-customize-alist (append '((ess-local-customize-alist . 'S+4-customize-alist) (ess-dialect . S+4-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-object-name-db-file . "ess-sp4-namedb.el" ) (inferior-ess-program . inferior-S+4-program-name) (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . "chm") (inferior-ess-start-file . nil) ;"~/.ess-S+4") (inferior-ess-start-args . (concat inferior-S+4-multipleinstances " " inferior-S+4-print-command " S_PROJ=" (directory-file-name default-directory))) ;; (inferior-ess-ddeclient . "ddeclient") ;; (inferior-ess-client-name . "S-PLUS") ;; (inferior-ess-client-command . "SCommand") (ess-STERM . "ddeESS") ) S+common-cust-alist) "Variables to customize for S+4") (defvar Sqpe+4-customize-alist (append '((ess-local-customize-alist . 'Sqpe+4-customize-alist) (ess-dialect . S+4-dialect-name) (ess-loop-timeout . 500000 );fixme: dialect specific custom.v (ess-object-name-db-file . "ess-sp4-namedb.el" ) (inferior-ess-program . inferior-Sqpe+4-program-name) (inferior-ess-help-command . "help(\"%s\")\n") (inferior-ess-help-filetype . "chm") (inferior-ess-search-list-command . "searchPaths()\n") (inferior-ess-start-file . nil) ;"~/.ess-S+4") (inferior-ess-language-start . (concat "options(" "STERM='" ess-STERM "'" (if ess-editor (concat ", editor='" ess-editor "'")) (if ess-pager (concat ", pager='" ess-pager "'")) ")")) (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for Sqpe+4.") ;;; There are extra complications in S+4 (compared to S+3) because ;;; ;;; (1) The StatSci supplied Splus.exe doesn't work in an emacs ;;; buffer. It works as as a GUI window and we must send commands ;;; to it through ddeclient. Nonetheless, we need to give it a ;;; process name and be sure that that there is a valid running ;;; process in the '(ddeESS [S+4])' buffer. Therefore we create an ;;; ESS process in the buffer as a placeholder and start a shell ;;; in the ESS buffer. From the shell we start Splus. Once Splus ;;; finishes initializing and kills the original shell, we start ;;; another shell. We have a buffer-local variable ;;; inferior-ess-ddeclient, initialized to nil. When there is a ;;; non-nil value of inferior-ess-ddeclient we send lines to ;;; inferior-ess-ddeclient rather than to the Splus process. ;;; (2) There is no Splus process running in the '(ddeESS [S+4])' ;;; buffer. Therefore inferior-ess will never see a prompt, ;;; unless we first change it to the null prompt "^". Then once ;;; the process has started, we change it back. ;;; (3) When M-x S+4 starts Splus by a shell command, then Splus is an ;;; independent process and will be survive if the '(ddeESS [S+4])' ;;; buffer is killed (or emacs is quit). The '(ddeESS [S+4])' is ;;; made read-only and a warning is placed in it saying that "You ;;; can't type anything here." Actually, if the standalone Splus ;;; is killed and the '(ddeESS [S+4])' is made writable (C-x C-q), ;;; then '(ddeESS [S+4])' becomes a shell buffer. ;;; (defun S+4 (&optional proc-name) "Call 'S-PLUS 4.x', the 'GUI Thing' from StatSci. Put S-Plus in an independent MS-Window (Splus persists even if the '(ddeESS [S+4])' window is killed in emacs). Do this by creating a comint process that calls sh. Send a shell command in that sh buffer to call Splus. When it completes set up a shell as a placeholder in the '(ddeESS [S+4])' buffer. The S-Plus options are correctly set. In particular, the S-Plus Commands window is opened if the Options/General Settings/Startup menu says it should be. There is a 30 second delay during startup in which the screen will not be refreshed. This delay is here to allow slow disks to start the Splus program." (interactive) (save-excursion (setq ess-customize-alist S+4-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+4): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-program (append ess-customize-alist '((inferior-ess-program . "sh")))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (setq ess-customize-alist ; change inferior-ess-start-args (append ess-customize-alist '((inferior-ess-start-args . "-i")))) (let ((s-proj (getenv "S_PROJ")) (manpath (getenv "MANPATH"))) (cd (w32-short-file-name (directory-file-name default-directory))) (setenv "S_PROJ" default-directory) ;; I don't know why this PATH/MANPATH game is needed, ;; except that it doesn't work without it. (setenv "MANPATH" (getenv "PATH")) (inferior-ess) (sleep-for 2) ; need to wait, else working too fast! The Splus ; command in '(ddeESS [S+4])' should follow the "$" ; prompt. If not, then increase the sleep-for time! (setenv "MANPATH" manpath) (setenv "S_PROJ" s-proj)) (setq ess-customize-alist S+4-customize-alist) (ess-setq-vars-local ess-customize-alist) ;;; the next three lines belong in customize-alist, but can't be there ;;; because of the broken ess-setq-vars-default usage in ess-inf.el (setq inferior-ess-ddeclient "ddeclient") (setq inferior-ess-client-name "S-PLUS") (setq inferior-ess-client-command "SCommand") ;;; end of what belongs in customize-alist (setq comint-process-echoes nil) (setq comint-input-sender 'comint-simple-send) (goto-char (point-max)) (insert (concat inferior-S+4-program-name " " inferior-ess-start-args)) ; Note: there is no final "&". ;; Without the "&", the results of !system.command come to '(ddeESS [S+4])' ;; With the "&", the results of !system.command in S get lost. (inferior-ess-send-input) (sleep-for 30) ; Need to wait, else working too fast! ; If the ess-current-process-name doesn't appear in the ; Splus Commands window increase the sleep-for time! (setq ess-local-process-name ess-current-process-name) (ess-eval-linewise (concat "#" ess-current-process-name)) (goto-char (point-min)) (insert "This is a placeholder buffer. You can't type anything here. Use `C-x b RET' to return to your file.\n Anything sent to this process from an S-mode buffer goes directly to the associated Splus Commands window.\n The S-Plus Commands window must be visible. You may need to open the S-Plus Commands window manually (by clicking on Splus/Window/Commands Window).\n Any results of the !system.command typed at the S prompt in the Splus Commands window appear in this buffer.\n\n") (goto-char (point-max)) ; comint-mode-map makes '(ddeESS [S+4])' ;; (use-local-map comint-mode-map) ;a shell buffer after Splus is finished. (set-buffer-process-coding-system 'raw-text-dos 'raw-text-unix) (setq buffer-read-only t) ; force buffer to be read-only (setq mode-name "ddeESS") ;; (ess-eval-linewise inferior-S+4-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) )) (defun S+4-existing (&optional proc-name) "Call 'S-PLUS 4.x', the 'GUI Thing' from StatSci. Do so by finding an existing S-Plus in an independent MS-Window (if there is one) and set up a '(ddeESS [S+4])' buffer in emacs. If there is no existing S-Plus, then a new one will be opened in the default directory, usually something like c:/Program Files/spls45se/users/yourname. If you have a HOME environment variable, it will open it there." (interactive) (let* ((inferior-S+4-multipleinstances " & # ")) ; Note: there is a final "&". ;; Without the "&", there is a core dump. ;; With the "&", the results of !system.command in S get lost. ;; We are picking up an existing S-Plus process for sending to. ;; It doesn't know about us, so nothing comes back. (S+4 proc-name)) (with-current-buffer (car (buffer-list)) ; get the ESS buffer just created (setq buffer-read-only nil) ; permit writing in ESS buffer (goto-char (point-max)) (beginning-of-line) (forward-line -1) (insert "This is S+4-existing. Results of the !system.command typed at the S prompt in the Splus Commands window blink a DOS window and you won't see them.\n\n") (setq buffer-read-only t) ; restore ESS buffer to be read-only )) ;;; There are extra complications in Sqpe+4 (compared to S+3) because ;;; (1) The StatSci supplied Sqpe.exe won't work without SHOME as an ;;; environment variable and Sqpe does not take command line ;;; arguments and ;;; (2) Sqpe.exe comes up with options(interactive=F), which means it ;;; doesn't provide prompts by default, and we must change it to T so ;;; it will provide prompts. ;;; (defun Sqpe+4 (&optional proc-name) "Call 'Sqpe' from 'S-PLUS 4.x', the 'Real Thing' from StatSci." (interactive) (setq ess-customize-alist Sqpe+4-customize-alist) (let* ((shome-nil-p (equal (getenv "SHOME") nil))) (if shome-nil-p (setenv "SHOME" inferior-Sqpe+4-SHOME-name)) (ess-write-to-dribble-buffer (format "\n(Sqpe+4): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (inferior-ess) (setq ess-customize-alist Sqpe+4-customize-alist) ; restore i-e-p-p in alist (ess-setq-vars-local ess-customize-alist) ; restore i-e-p-p in buffer (setq inferior-ess-prompt ; define with correct i-e-p-p ;; Do not anchor to bol with `^' ; (copied from ess-inf.el) (concat "\\(" inferior-ess-primary-prompt "\\|" inferior-ess-secondary-prompt "\\)")) (setq comint-prompt-regexp (concat "^" inferior-ess-prompt)) ; define with correct i-e-p-p (setq comint-input-sender 'inferior-ess-input-sender) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) (goto-char (point-max)) (insert "options(interactive=T)") (inferior-ess-send-input) (setq mode-name "iESS(Sqpe)") ;; (ess-eval-linewise inferior-S+4-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) (if shome-nil-p (setenv "SHOME" nil)))) (defun S+4-mode (&optional proc-name) "Major mode for editing S+4 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+4-customize-alist) (ess-mode S+4-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) (defun S+4-transcript-mode () "S-PLUS 4.x transcript mode." (interactive) (ess-transcript-mode S+4-customize-alist)) (defun S+4-msdos (&optional proc-name) "Call 'S-PLUS 4.x', the 'GUI Thing' from StatSci. Put S-Plus in an independent MS-Window (Splus persists even if the '(ddeESS [S+4])' window is killed in emacs). Do this by creating a comint process that calls sh. Send a shell command in that sh buffer to call Splus. When it completes set up a shell as a placeholder in the '(ddeESS [S+4])' buffer. The S-Plus options are correctly set. In particular, the S-Plus Commands window is opened if the Options/General Settings/Startup menu says it should be. There is a 30 second delay during startup in which the screen will not be refreshed. This delay is here to allow slow disks to start the Splus program." (interactive) (save-excursion (setq ess-customize-alist S+4-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+4): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (setq ess-customize-alist ; change inferior-ess-program (append ess-customize-alist '((inferior-ess-program . (getenv "COMSPEC"))))) (setq ess-customize-alist ; change inferior-ess-primary-prompt (append ess-customize-alist '((inferior-ess-primary-prompt . "^")))) (setq ess-customize-alist ; change inferior-ess-start-args (append ess-customize-alist '((inferior-ess-start-args . "")))) (let ((s-proj (getenv "S_PROJ"))) (cd (w32-short-file-name (directory-file-name default-directory))) (setenv "S_PROJ" default-directory) (inferior-ess) (sleep-for 2) ; need to wait, else working too fast! The Splus ; command in '(ddeESS [S+4])' should follow the "$" ; prompt. If not, then increase the sleep-for time! (setenv "S_PROJ" s-proj)) (setq ess-customize-alist S+4-customize-alist) (ess-setq-vars-local ess-customize-alist) ;;; the next three lines belong in customize-alist, but can't be there ;;; because of the broken ess-setq-vars-default usage in ess-inf.el (setq inferior-ess-ddeclient "ddeclient") (setq inferior-ess-client-name "S-PLUS") (setq inferior-ess-client-command "SCommand") ;;; end of what belongs in customize-alist (setq comint-input-sender 'comint-simple-send) (setq comint-process-echoes nil) (set-buffer-process-coding-system 'raw-text-dos 'raw-text-dos) (goto-char (point-max)) (insert (concat inferior-S+4-program-name " " inferior-ess-start-args)) ; Note: there is no final "&". ; Without the "&", the results of !system.command come to '(ddeESS [S+4])' ; With the "&", the results of !system.command in S get lost. (inferior-ess-send-input) (sleep-for 30) ; Need to wait, else working too fast! ; If the ess-current-process-name doesn't appear in the ; Splus Commands window increase the sleep-for time! ;;; from msdos-minor-mode (setq comint-process-echoes t) (add-hook 'comint-output-filter-functions 'shell-strip-ctrl-m nil t) ;;; end from msdos-minor-mode (setq ess-local-process-name ess-current-process-name) (ess-eval-linewise (concat "#" ess-current-process-name)) (goto-char (point-min)) (insert "This is a placeholder buffer. You can't type anything here. Use 'C-x b RET' to return to your file.\n Anything sent to this process from an S-mode buffer goes directly to the associated Splus Commands window.\n The S-Plus Commands window must be visible. You may need to open the S-Plus Commands window manually (by clicking on Splus/Window/Commands Window).\n There is a 30 second delay when this program starts during which the emacs screen will be partially blank.\n Remember to `q()' from S-Plus and then C-x C-q exit from the `'(ddeESS [S+4])'' buffer, or take the risk of not being able to shut down your computer and suffering through scandisk.\n Any results of the !system.command typed at the S prompt in the Splus Commands window (are supposed to) appear in this buffer.\n\n") (goto-char (point-max)) ; comint-mode-map makes '(ddeESS [S+4])' (use-local-map comint-mode-map) ; a shell buffer after Splus is finished. (setq buffer-read-only t) ; force buffer to be read-only (setq mode-name "ddeESS") ;; (ess-eval-linewise inferior-S+4-editor-pager-command) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) )) (defun S+4-msdos-existing (&optional proc-name) "Call 'S-PLUS 4.x', the 'GUI Thing' from StatSci. Do so by finding an existing S-Plus in an independent MS-Window (if there is one) and set up a '(ddeESS [S+4])' buffer in emacs. If there is no existing S-Plus, then a new one will be opened in the default directory, usually something like c:/Program Files/spls45se/users/yourname. If you have a HOME environment variable, it will open it there." (interactive) (let* ((inferior-S+4-multipleinstances "")) (S+4-msdos proc-name)) (save-excursion (set-buffer (car (buffer-list))) ; get the ESS buffer just created (setq buffer-read-only nil) ; permit writing in ESS buffer (goto-char (point-max)) (beginning-of-line) (forward-line -1) (insert "This is S+4-msdos-existing. Results of the !system.command typed at the S prompt in the Splus Commands window blink a DOS window and you won't see them.\n\n") (setq buffer-read-only t) ; restore ESS buffer to be read-only )) ; Provide package (provide 'ess-sp4-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sp4-d.el ends here ess/lisp/ess-font-lock.el0000664000175000017500000001512612423756516013721 0ustar eddedd;;; ess-font-lock.el --- font-lock color options ;; Copyright (C) 2000--2006 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: 06 Feb 2000 ;; Keywords: languages, faces ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; provides syntax highlighting support. ;;; Code: ; Requires and autoloads (require 'font-lock) (require 'paren) (if (fboundp 'show-paren-mode) (show-paren-mode 1)) ;;; Emacs 20.x notes: ;; font-lock faces are defined in /emacs/emacs-20.5/lisp/font-lock.el ;; The font-lock faces are applied to ESS buffers by ;; ess-mode.el ess-inf.el ess-trns.el ess-custom.el ;; The keywords for faces are defined in the ess[dl]*.el files. ;; All faces can be looked at, under Emacs 20.x, with ;; [menu-bar] [Edit] [Text Properties] [Display Faces} ;;; For XEmacs ;; ... (tony needs to write something here). (defun ess-font-lock-rmh () "Set font-lock colors to Richard Heiberger's usual choice." (interactive) (if (featurep 'xemacs) nil (set-foreground-color "Black") (set-background-color "lightcyan")) (set-face-background 'modeline "lightskyblue") (set-face-foreground 'modeline "midnightblue") (set-face-foreground 'font-lock-comment-face "Firebrick") (set-face-foreground 'font-lock-function-name-face "Blue") (set-face-foreground 'font-lock-keyword-face "Purple") (set-face-foreground 'font-lock-constant-face "Brown") (set-face-foreground 'font-lock-string-face "VioletRed") (set-face-foreground 'font-lock-type-face "Sienna") (set-face-foreground 'font-lock-variable-name-face "Black")) (defun ess-font-lock-blue () "Set font-lock colors to Richard Heiberger's blue color scheme." (interactive) (if (featurep 'xemacs) nil (set-foreground-color "Black") (set-background-color "LightBlue")) (set-face-foreground 'modeline "LightBlue") (set-face-background 'modeline "DarkSlateBlue") (set-face-foreground 'font-lock-comment-face "Firebrick") (set-face-foreground 'font-lock-function-name-face "Blue") (set-face-foreground 'font-lock-keyword-face "Purple") (set-face-foreground 'font-lock-constant-face "Brown") (set-face-foreground 'font-lock-string-face "VioletRed") (set-face-foreground 'font-lock-type-face "Sienna") (set-face-foreground 'font-lock-variable-name-face "Black")) (defun ess-font-lock-wheat () "Set font-lock colors to Richard Heiberger's wheat color scheme." (interactive) (if (featurep 'xemacs) nil (set-foreground-color "Black") (set-background-color "Wheat")) (set-face-foreground 'modeline "Wheat") (set-face-background 'modeline "Sienna") (set-face-foreground 'font-lock-comment-face "Firebrick") (set-face-foreground 'font-lock-function-name-face "Blue") (set-face-foreground 'font-lock-keyword-face "Purple") (set-face-foreground 'font-lock-constant-face "Brown") (set-face-foreground 'font-lock-string-face "VioletRed") (set-face-foreground 'font-lock-type-face "Sienna") (set-face-foreground 'font-lock-variable-name-face "Black")) (defun ess-font-lock-bw () "Set font-lock colors to Richard Heiberger's black and white color scheme." (interactive) (if (featurep 'xemacs) nil (set-foreground-color "Black") (set-background-color "white")) (set-face-foreground 'modeline "gray10") (set-face-background 'modeline "gray90") ;; modify-face is an interactive compiled Lisp function in `faces'. ;; Sample usage: ;;(modify-face FACE FOREGROUND BACKGROUND STIPPLE BOLD-P ITALIC-P UNDERLINE-P &optional INVERSE-P FRAME) (modify-face 'modeline "gray10" "gray90" nil nil t nil ) (modify-face 'font-lock-comment-face "black" "white" nil nil t nil ) (modify-face 'font-lock-function-name-face "black" "white" nil t nil nil ) (modify-face 'font-lock-keyword-face "black" "white" nil nil nil t ) (modify-face 'font-lock-constant-face "black" "white" nil t nil nil ) (modify-face 'font-lock-string-face "black" "white" nil nil t t ) (modify-face 'font-lock-type-face "black" "white" nil t t nil ) (modify-face 'font-lock-variable-name-face "black" "white" nil nil nil nil ) (modify-face 'font-lock-builtin-face "black" "white" nil t nil nil ) (modify-face 'font-lock-warning-face "black" "white" nil t nil nil ) (modify-face 'show-paren-match-face "gray20" "gray80" nil t nil nil ) (modify-face 'show-paren-mismatch-face "white" "gray40" nil t t nil )) (defun ess-font-lock-db () "Set font-lock colors (leave fore-/back-ground alone) courtesy David Brahm " (interactive) (set-face-foreground 'font-lock-comment-face "Firebrick") ; #... %... (set-face-foreground 'font-lock-string-face "SeaGreen") ; "..." "..." (set-face-foreground 'font-lock-keyword-face "MediumBlue") ; if \end (set-face-foreground 'font-lock-function-name-face "VioletRed") ; talk<- {center} (set-face-foreground 'font-lock-variable-name-face "Blue") ; xv (set-face-foreground 'font-lock-type-face "Goldenrod") ; T,F ? (set-face-foreground 'font-lock-constant-face "Magenta") ; <- {eq1} ) (provide 'ess-font-lock) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-font-lock.el ends here ess/lisp/ess.el0000664000175000017500000005236612613523406012025 0ustar eddedd;;; ess.el --- Emacs Speaks Statistics: statistical programming within Emacs ;; Copyright (C) 1989--1996 Bates, Kademan, Ritter and Smith ;; Copyright (C) 1997--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2015 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: Doug Bates ;; Ed Kademan ;; Frank Ritter ;; David Smith ;; Created: October 14, 1991 ;; Maintainer: ESS-core ;; Keywords: statistics, languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; PURPOSE ;; ;; Interface to the S, SAS, and XLisp dialects of statistical ;; programming languages, with potential extensions to other ;; languages. Designed to be extendable to most other interactive ;; statistical programming situations. ;; BRIEF OVERVIEW ;; ;; Supports structured editing of S, SAS, and XLisp (statistics ;; programming languages) functions that are integrated with a ;; running process in a buffer. ;; THE ESS MAILING LIST ;; ;; There is an informal mailing list for discussions of ESS. Alpha ;; and beta releases of ESS are also announced here. Send mail ;; to ess-help-request@r-project.org to join. ;; OVERVIEW OF ESS ;; ;; S is a statistics programming language developed at Bell Labs ;; particularly suited for descriptive and exploratory statistics. ;; s-mode is built on top of comint (the general command interpreter ;; mode written by Olin Shivers), and so comint.el (or comint.elc) ;; should be either loaded or in your load path when you invoke it. ;; ;; Aside from the general features offered by comint such as ;; command history editing and job control, inferior S mode ;; allows you to dump and load S objects into and from external ;; files, and to display help on functions. It also provides ;; name completion while you do these. For more detailed ;; information see the documentation strings for inferior-ess, ;; inferior-ess-mode, ess-mode, and comint-mode. There are also ;; many variables and hooks available for customizing (see ;; the variables below that have document strings that start ;; with an "*"). ;; INSTALLATION ;; See README and S-site for details. ;; GETTING RELEASES OF ESS ;; ===> http://ess.r-project.org ;; ;; CREDITS. ;; Thanks to shiba@shun.isac.co.jp (Ken'ichi "Modal" Shibayama) for ;; the indenting code. ;; Thanks also to maechler@stat.math.ethz.ch (Martin Maechler) for ;; suggestions and bug fixes. ;; ess-eval-line-and-step is based on a function by Rod Ball ;; (rod@marcam.dsir.govt.nz) ;; Also thanks from David Smith to the previous authors for all their ;; help and suggestions. ;; And thanks from Richard M. Heiberger, Kurt Hornik, Martin ;; Maechler, and A.J. Rossini to David Smith. ;; BUG REPORTS ;; Please report bugs to ess-bugs@r-project.org ;; Comments, suggestions, words of praise and large cash donations ;; are also more than welcome, but should generally be split between ;; all authors :-). ;;; Code: ;;*;; Requires and autoloads ;;;===================================================== ;;; (require 'easymenu) (if (or window-system noninteractive ; compilation! ) (require 'font-lock)) (require 'ess-compat) (require 'ess-custom) (require 'ess-mode) (require 'ess-inf) (require 'cl) ; ess-mode: editing S/R/XLS/SAS source (autoload 'inferior-ess "ess-inf" "Run [inferior-ess-program], an ess process, in an Emacs buffer" t) (autoload 'ess-dump-object-into-edit-buffer "ess-mode" "Edit an S object." t) (autoload 'ess-parse-errors "ess-mode" "Jump to the last error generated from a sourced file." t) (autoload 'ess-load-file "ess-inf" "Source a file into S.") (autoload 'ess-inside-string-or-comment-p "ess-utils" "Non-nil, if inside string or comment." t) (autoload 'ess-inside-string-p "ess-utils" "Non-nil if inside string." t) (autoload 'ess-do-auto-fill "ess-utils" "substitute for \\[do-auto-fill]." t) (autoload 'ess-rep-regexp "ess-utils" "Replace, but not in string/comment." t) (autoload 'ess-time-string "ess-utils" "Return time-stamp string." t) (autoload 'ess-nuke-trailing-whitespace "ess-utils" "Maybe get rid of trailing blanks." t) ; ess-transcript-mode: editing ``outputs' (autoload 'ess-transcript-mode "ess-trns" "Major mode for editing S transcript files." t) (autoload 'ess-display-help-on-object "ess-help" "Display help on an S object." t) (defalias 'ess-help 'ess-display-help-on-object) (autoload 'ess-goto-info "ess-help" "Jump to the relevant section in the `ess-mode' manual." t) (autoload 'ess-submit-bug-report "ess-help" "Submit a bug report on the `ess-mode' package." t) ;;==> ess-inf.el has its OWN autoload's ! ; Miscellaneous "ESS globals" (defun ess-version-string () (let* (;;(svn-fname (concat ess-etc-directory "SVN-REVISION")) ;; (svn-rev ;; (when (file-exists-p svn-fname) ;; ;; then it has two lines that look like ;; ;; |Revision: 4803 ;; ;; |Last Changed Date: 2012-04-16 ;; (with-current-buffer (find-file-noselect svn-fname) ;; (goto-char (point-min)) ;; (when (re-search-forward "Revision: \\(.*\\)\n.*: \\(.*\\)" nil t) ;; (concat "svn: " (match-string 1) " (" (match-string 2) ")"))))) (ess-dir (file-name-directory ess-lisp-directory)) ; if() the top-level 'ess/' (is-release (file-exists-p (concat ess-etc-directory ".IS.RELEASE"))) (rel-string (if is-release "Released ")) (git-ref-fn (concat ess-dir ".git/HEAD")) (git-ref (when (file-exists-p git-ref-fn) (with-current-buffer (find-file-noselect git-ref-fn) (goto-char (point-min)) (when (re-search-forward "ref: \\(.*\\)\n" nil t) (match-string 1))))) (git-fname (if git-ref (concat ess-dir ".git/" git-ref) ;; for release (concat ess-etc-directory "git-ref"))) (git-rev (when (file-exists-p git-fname) (with-current-buffer (find-file-noselect git-fname) (goto-char (point-min)) (concat "git: "(buffer-substring 1 (point-at-eol)))))) (elpa-fname (concat ess-dir "ess-pkg.el")) (elpa-rev (when (file-exists-p elpa-fname) ;; get it from ELPA dir name, (probably won't work if installed manually) (concat "elpa: " (replace-regexp-in-string "ess-" "" (file-name-nondirectory (substring ess-dir 1 -1))))))) ;; set the "global" ess-revision: (setq ess-revision (format "%s%s%s" (or rel-string "") ;;(or svn-rev "") (or git-rev "") (or elpa-rev ""))) (when (string= ess-revision "") (setq ess-revision "")) (concat ess-version " [" ess-revision "]"))) (defun ess-version () (interactive) (message (format "ess-version: %s (loaded from %s)" (ess-version-string) (file-name-directory ess-lisp-directory)))) ;;; Set up for menus, if necessary ;;; --> is done in ess-mode.el, ess-inf.el, etc ; ESS yank (defun ess-yank-cleaned-commands () "Yank and strip the code, leaving only (R/S/Lsp/..) commands. Deletes any lines not beginning with a prompt, and then removes the prompt from those lines that remain. Invoke this command with C-u C-u C-y." (setq yank-window-start (window-start)) (let ((beg (point))) (push-mark beg) (setq this-command t) (insert-for-yank (current-kill 0)) (ess-transcript-clean-region beg (point) nil) (if (eq (point) beg) (message "No commands found")) (if (eq this-command t) (setq this-command 'yank)) )) (defun ess-yank (&optional ARG) "With double prefix (C-u C-u) call `ess-yank-cleaned-commands" (interactive "*P") (if (equal '(16) ARG) (ess-yank-cleaned-commands) (let* ((remapped (command-remapping 'yank (point))) (command (cond ((eq remapped 'ess-yank) 'yank) ((null remapped) 'yank) (t remapped)))) (funcall command ARG)))) (put 'ess-yank 'delete-selection 'yank) ; ESS Completion (defun ess-completing-read (prompt collection &optional predicate require-match initial-input hist def) "Read a string in the minibuffer, with completion. Use `ido-completing-read' if IDO interface is present, or fall back on classical `completing-read' otherwise. Meaning of arguments is as in `completing-read' (PROMPT is automatically suffixed with ': ' and (default %s) when needed). If HIST is null use `ess--completing-hist' as history. See also `ess-use-ido'. " (let ((use-ido (and ess-use-ido (featurep 'ido)))) (setq hist (or hist 'ess--completing-hist)) (when (and def (not use-ido)) ;; ido places in front and highlights the default (setq prompt (format "%s(default %s)" prompt def))) (setq prompt (concat prompt ": ")) (if use-ido (let ((reset-ido (and use-ido (not ido-mode))) ;people not using ido but having it) (ido-current-directory nil) (ido-directory-nonreadable nil) (ido-directory-too-big nil) (ido-context-switch-command 'ignore) (ido-enable-flex-matching ess-ido-flex-matching) ;it's fast and useful, may be get into options (ido-choice-list (copy-sequence collection)) ;ido removes the match (reported) sel) (unwind-protect (progn (ido-init-completion-maps) (add-hook 'minibuffer-setup-hook 'ido-minibuffer-setup) (add-hook 'choose-completion-string-functions 'ido-choose-completion-string) (setq sel (ido-read-internal 'list prompt hist def require-match initial-input)) (when hist ;; ido does not push into hist the whole match if C-SPC or RET is used (reported) (unless (string= sel (car (symbol-value hist))) (set hist (cons sel (symbol-value hist)))))) (when reset-ido (remove-hook 'minibuffer-setup-hook 'ido-minibuffer-setup) (remove-hook 'choose-completion-string-functions 'ido-choose-completion-string))) sel) ;; else usual completion (when (and (featurep 'xemacs) ;; xemacs workaround (not (listp (car collection)))) (setq collection (mapcar 'list collection))) (completing-read prompt collection predicate require-match initial-input hist def) ))) (defun ess-load-extras (&optional inferior) "Load all the extra features depending on custom settings." (let ((mode (if inferior 'inferior-ess-mode 'ess-mode)) (isR (string-match "^R" ess-dialect))) ;; auto-complete (when (and (boundp 'ac-sources) (if inferior (eq ess-use-auto-complete t) ess-use-auto-complete)) (add-to-list 'ac-modes mode) ;; files should be in front; ugly, but needed (when ess-ac-sources (setq ac-sources (delq 'ac-source-filename ac-sources)) (mapcar (lambda (el) (add-to-list 'ac-sources el)) ess-ac-sources) (add-to-list 'ac-sources 'ac-source-filename))) ;; company (when (and (boundp 'company-backends) (if inferior (eq ess-use-company t) ess-use-company)) (when ess-company-backends (set (make-local-variable 'company-backends) (copy-list (append ess-company-backends company-backends))) (delq 'company-capf company-backends))) ;; eldoc) (require 'eldoc) (when (and ess-eldoc-function ;; if mode provide this, it suports eldoc (or (and (not inferior) ess-use-eldoc) (and inferior (eq ess-use-eldoc t)))) (when (> eldoc-idle-delay 0.4) ;; default is too slow for paren help (set (make-local-variable 'eldoc-idle-delay) 0.1)) (set (make-local-variable 'eldoc-documentation-function) ess-eldoc-function) (turn-on-eldoc-mode)) ;; tracebug (when (and ess-use-tracebug inferior isR) (ess-tracebug 1)))) ;; not in use since 2004 ;; (defun ess-load-object-name-db-file () ;; "Load object database file if present, mention if not." ;; (if (string= ess-language "S") ;; (progn ;; (make-local-variable 'ess-object-name-db) ;; (condition-case () ;; (load ess-object-name-db-file) ;; (error ;; ;;(message "%s does not exist. Consider running ess-create-object-name-db." ;; ;; ess-object-name-db-file) ;; ;; (ding) ;; (sit-for 1)))))) ;;; xemacs process-put and process-get workarounds: ;;; !!!! remove this when xemacs starts supporting them!!! (when (featurep 'xemacs) (defvar process-plist-map (make-hash-table :test 'eq :weakness 'key) "Property list information for process, when XEmacs doesn't provide this. See `process-plist' and `set-process-plist'.") (defun-when-void process-plist (process) "Return the property list of PROCESS." (check-argument-type #'processp process) (gethash process process-plist-map)) (defun-when-void set-process-plist (process plist) "Set the property list of PROCESS to PLIST." (check-argument-type #'processp process) (check-argument-type #'valid-plist-p plist) (puthash process plist process-plist-map)) (defun-when-void process-get (process propname) "Return the value of PROCESS' PROPNAME property. This is the last value stored with `(process-put PROCESS PROPNAME VALUE)'." (plist-get (process-plist process) propname)) (defun-when-void process-put (process propname value) "Change PROCESS' PROPNAME property to VALUE. It can be retrieved with `(process-get PROCESS PROPNAME)'." (set-process-plist process (plist-put (process-plist process) propname value))) ) ;;; Running these must be done "every time" before use, since ;;; they depend on a customizable variable. ;; trying different viewers; thanks to an original patch for ;; ess-swv.el from Leo : (defun ess-get-ps-viewer () "Get external PostScript viewer to be used from ESS. Use `ess-ps-viewer-pref' when that is executably found by \\[executable-find]. Otherwise try a list of fixed known viewers." (file-name-nondirectory (or (and ess-ps-viewer-pref ; -> ./ess-custom.el (executable-find ess-ps-viewer-pref)) (executable-find "gv") (executable-find "evince") (executable-find "kghostview")))) (defun ess-get-pdf-viewer () "Get external PDF viewer to be used from ESS. Use `ess-pdf-viewer-pref' when that is executably found by \\[executable-find]. Otherwise try a list of fixed known viewers. " (let ((viewer (or ess-pdf-viewer-pref ;; (and (stringp ess-pdf-viewer-pref) ; -> ./ess-custom.el ;; (executable-find ess-pdf-viewer-pref)) (executable-find "evince") (executable-find "kpdf") (executable-find "okular") (executable-find "xpdf") (executable-find "acroread") (executable-find "xdg-open") ;; this one is wrong, (ok for time being as it is used only in swv) (car (ess-get-words-from-vector "getOption(\"pdfviewer\")\n")) ))) (when (stringp viewer) (setq viewer (file-name-nondirectory viewer))) viewer)) ; Buffer local customization stuff ;; Parse a line into its constituent parts (words separated by ;; whitespace). Return a list of the words. ;; Taken from rlogin.el, from the comint package, from XEmacs 20.3. (defun ess-line-to-list-of-words (line) (if (listp line) line (let ((list nil) (posn 0)) ;; (match-data (match-data))) (while (string-match "[^ \t\n]+" line posn) (setq list (cons (substring line (match-beginning 0) (match-end 0)) list)) (setq posn (match-end 0))) (store-match-data (match-data)) (nreverse list)))) (defun ess-write-to-dribble-buffer (text) "Write TEXT to dribble ('*ESS*') buffer." (unless (buffer-live-p ess-dribble-buffer) ;; ESS dribble buffer must be re-created. (setq ess-dribble-buffer (get-buffer-create "*ESS*"))) (let (deactivate-mark) (with-current-buffer ess-dribble-buffer (goto-char (point-max)) (insert-before-markers text)))) ;; Shortcut to render "dribbling" statements less cluttering: (defun ess-if-verbose-write (text) "Write TEXT to dribble buffer ('*ESS*') only *if* `ess-verbose'." (if ess-verbose (ess-write-to-dribble-buffer text))) (defvar ess--make-local-vars-permenent nil "If this varialbe is non-nil in a buffer make all variable permannet. Used in noweb modes.") (make-variable-buffer-local 'ess--make-local-vars-permenent) (put 'ess--make-local-vars-permenent 'permanent-local t) (defun ess-setq-vars-local (alist &optional buf) "Set language variables from ALIST, in buffer BUF, if desired." (if buf (set-buffer buf)) ;; (setq alist (reverse alist)) ;; It should really be in reverse order; (mapc (lambda (pair) (make-local-variable (car pair)) (set (car pair) (eval (cdr pair))) (when ess--make-local-vars-permenent (put (car pair) 'permanent-local t)) ;; hack for Rnw ) alist) (ess-write-to-dribble-buffer (format "(ess-setq-vars-LOCAL): language=%s, dialect=%s, buf=%s, comint..echoes=%s, comint..sender=%s\n" ess-language ess-dialect buf comint-process-echoes comint-input-sender))) (defun ess-setq-vars-default (alist &optional buf) "Set language variables from ALIST, in buffer BUF, if desired." (ess-write-to-dribble-buffer (format "ess-setq-vars-default 0: ess-language=%s, -dialect=%s, buf=%s, comint..echoes=%s, comint..sender=%s\n" ess-language ess-dialect buf comint-process-echoes comint-input-sender)) (if buf (set-buffer buf)) (mapc (lambda (pair) (set-default (car pair) (eval (cdr pair)))) alist) (ess-write-to-dribble-buffer (format "ess-setq-vars-default 1: ess-language=%s, -dialect=%s, buf=%s, comint..echoes=%s, comint..sender=%s\n" ess-language ess-dialect buf comint-process-echoes comint-input-sender)) ) ;;; versions thanks to Barry Margolin . ;;; unfortunately, requires 'cl. Whoops. ;;(defun ess-setq-vars (var-alist &optional buf) ;; "Set language variables from alist, in buffer `buf', if desired." ;; (if buf (set-buffer buf)) ;; (dolist (pair var-alist) ;; (set (car pair) (eval (cdr pair)))) ;; (ess-write-to-dribble-buffer ;; (format "(ess-setq-vars): ess-language=%s, buf=%s \n" ;; ess-language buf))) ;;(defun ess-setq-vars-default (var-alist &optional buf) ;; "Set language variables from alist, in buffer `buf', if desired." ;; (if buf (set-buffer buf)) ;; (dolist (pair var-alist) ;; (set-default (car pair) (eval (cdr pair)))) ;; (ess-write-to-dribble-buffer ;; (format "(ess-setq-vars-default): ess-language=%s, buf=%s \n" ;; ess-language buf))) ;; Toby Speight ;;> ;; untested ;;> (let ((l R-customize-alist)) ; or whatever ;;> (while l ;;> (set (car (car l)) (cdr (car l))) ; set, not setq! ;;> (setq l (cdr l)))) ;; ;; ;;If they are to be buffer-local, you may need to ;; ;;> ;; untested ;;> (set (make-local-variable (car (car l))) (cdr (car l))) ;; ;; Erik Naggum ;; ;;(mapcar (lambda (pair) (set (car pair) (cdr pair))) ;; R-customize-alist) ;; ;;if you want to evaluate these things along the way, which it appears that ;;you want, try: ;; ;;(mapcar (lambda (pair) (set (car pair) (eval (cdr pair)))) ;; R-customize-alist) ;; jsa@alexandria.organon.com (Jon S Anthony) ;;(mapcar (lambda (x) ;; (set-variable (car x) (cdr x))) ;; R-customize-alist) ; Run load hook and provide package (run-hooks 'ess-mode-load-hook) (provide 'ess) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess.el ends here ess/lisp/ess-xls-d.el0000664000175000017500000000724712423756516013061 0ustar eddedd;;; ess-xls-d.el --- XLispStat customization for ESS. ;; Copyright (C) 1997 A. J. Rossini ;; Copyright (C) 1998--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 12 Jun 1997 ;; Maintainer: ESS-core ;; Keywords: statistics, languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the XLispStat customizations for ESS. See ;; ess-lsp-l.el for general Lisp modifications. ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") ;;; Requires and Autoloads: (require 'ess-lsp-l) (defvar ess-help-XLS-sec-keys-alist '((?a . "Args:")) "Sparse online XLS help.") (defvar XLS-editing-alist Lisp-editing-alist) (defvar XLS-customize-alist '((ess-local-customize-alist . 'XLS-customize-alist) (ess-language . "XLS" ) (ess-dialect . "XLS" ) (ess-mode-editing-alist . XLS-editing-alist ) (ess-loop-timeout . ess-XLS-loop-timeout) (ess-object-name-db-file . "ess-xls-namedb.el" ) (ess-help-sec-regex . "^[A-Z. ---]+:$") (ess-help-sec-keys-alist . ess-help-XLS-sec-keys-alist) (inferior-ess-primary-prompt . "> ?" ) (inferior-ess-secondary-prompt . "^" ) (comint-use-prompt-regexp . t) (inferior-ess-program . inferior-XLS-program-name) (inferior-ess-help-command . "(help '%s)\n" ) (inferior-ess-objects-command . "(variables)\n" ) (inferior-ess-exit-command . "(exit)\n" ) ;;(inferior-ess-start-args . "")) (inferior-ess-start-file . nil)) "Variables to customize for XLS.") ;;; The functions of interest (mode, inferior mode) (defun XLS-mode (&optional proc-name) "Major mode for editing XLispStat source. NOT EVEN STARTED." (interactive) (setq ess-customize-alist XLS-customize-alist) (ess-mode XLS-customize-alist proc-name) (setq major-mode 'XLS-mode)) (fset 'xlispstat-mode 'XLS-mode) (defun XLS () "Call 'XLispStat', the Lisp statistical system from Luke Tierney." (interactive) (setq ess-customize-alist XLS-customize-alist) (ess-write-to-dribble-buffer (format "(XLS): ess-dialect=%s , buf=%s\n" ess-dialect (current-buffer))) (inferior-ess)) (defun xls-transcript-mode () "Does the right thing." (interactive) (ess-transcript-mode XLS-customize-alist)) (fset 'XLS-transcript-mode 'xls-transcript-mode) ; Provide package (provide 'ess-xls-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-xls-d.el ends here ess/lisp/ess-sas-l.el0000775000175000017500000023544212632537307013051 0ustar eddedd;;; ess-sas-l.el --- SAS customization ;; Copyright (C) 1997--2009 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Authors: Richard M. Heiberger ;; A.J. Rossini ;; Rodney Sparapani ;; Created: 20 Aug 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This is based upon Version 1.4 of SAS mode: ;;; sas-mode: indent, run etc, SAS programs. ;;; Copyright (C) 1994--1997 Tom Cook ;;; Author: Tom Cook ;;; Dept. of Biostatistics ;;; University of Wisconsin - Madison ;;; Madison, WI 53706 ;;; cook@biostat.wisc.edu ;;; ;;; Acknowledgements: ;;; Menu code for XEmacs/Lucid emacs and startup mods ;;; contributed by arossini@biostats.hmc.psu.edu ;;; ;;; Last change: 2/1/95 ;;; Last change: 01/15/02 ;;; Code: (ess-message "[ess-sas-l:] (require 'ess) ...") (require 'ess) (ess-message "[ess-sas-l:] (require 'ess-mode) ...") (require 'ess-mode) (require 'ess-custom) (ess-message "[ess-sas-l:] (autoload ..) (def** ..) etc ...") (autoload 'ess-transcript-mode "ess-trns" "ESS source eval mode." t) (put 'ess-transcript-minor-mode 'permanent-local t) (or (assq 'ess-transcript-minor-mode minor-mode-alist) (setq minor-mode-alist (append minor-mode-alist (list '(ess-transcript-minor-mode " ESStr"))))) (put 'ess-listing-minor-mode 'permanent-local t) (or (assq 'ess-listing-minor-mode minor-mode-alist) (setq minor-mode-alist (append minor-mode-alist (list '(ess-listing-minor-mode " ESSlst"))))) (defun ess-transcript-minor-mode (&optional arg) "Toggle Ess-Transcript minor mode. With arg, turn Ess-Transcript minor mode on if arg is positive, off otherwise. See the command `ess-transcript-mode' for more information on this mode." (interactive "P") (setq ess-transcript-minor-mode (if (null arg) (not ess-transcript-minor-mode) (> (prefix-numeric-value arg) 0))) (force-mode-line-update) (setq mode-line-process '(" [" ess-local-process-name "]"))) (defun ess-listing-minor-mode (&optional arg) "Toggle Ess-Listing minor mode. With arg, turn Ess-Listing minor mode on if arg is positive, off otherwise. Ess-Listing mode is used solely to place an indicator on the mode line." (interactive "P") (setq ess-listing-minor-mode (if (null arg) (not ess-listing-minor-mode) (> (prefix-numeric-value arg) 0))) (force-mode-line-update) (setq mode-line-process '(" [" ess-local-process-name "]"))) (defcustom ess-automatic-sas-log-or-lst-mode t "Automatically turn on `SAS-log-mode' and `SAS-listing-mode' when enabled." :type 'boolean :group 'ess-sas) (defun ess-SAS-log-mode-p () "Return t when when a SAS log file is detected. A SAS log is defined as having: 1. The first line matches \"^1[ \t]*The SAS System\" 2. The file name ends in .log. " (and ess-automatic-sas-log-or-lst-mode (save-excursion (goto-char (point-min)) (looking-at "1[ \t]*The SAS System")) (if (buffer-file-name) (string-match ".log$" (buffer-file-name)) t))) (defun ess-SAS-listing-mode-p () "Return t when SAS listing file is detected. A .lst file is a SAS listing file when: 1. The file name ends in .lst 2. The corresponding log file exists and is a SAS log file. " (when ess-automatic-sas-log-or-lst-mode (let* ((bfn (buffer-file-name)) (log (and bfn (string-match-p "\\.lst$" bfn) (replace-regexp-in-string "\\.lst$" ".log" bfn)))) (and log (file-exists-p log) (with-temp-buffer (insert-file-contents log nil 0 200) (goto-char (point-min)) (looking-at "1[ \t]*The SAS System")))))) (add-to-list 'magic-mode-alist '(ess-SAS-log-mode-p . SAS-log-mode)) (add-to-list 'magic-mode-alist '(ess-SAS-listing-mode-p . SAS-listing-mode)) (defun SAS-log-mode () "`ess-transcript-mode' for SAS." (interactive) (SAS-mode) (setq mode-name "ESS[LOG]") (ess-transcript-minor-mode 1) (setq buffer-read-only t)) ;; to protect the buffer. (defun SAS-listing-mode() "Fundamental mode with `ess-listing-minor-mode' and read-only." (interactive) (fundamental-mode) (setq mode-name "ESS[LST]") (ess-listing-minor-mode 1) (use-local-map sas-mode-local-map) (setq buffer-read-only t)) ;; to protect the buffer. (fset 'sas-log-mode 'SAS-log-mode) (fset 'SAS-transcript-mode 'SAS-log-mode) (fset 'sas-transcript-mode 'SAS-log-mode) (fset 'sas-mode 'SAS-mode) (fset 'sas-listing-mode 'SAS-listing-mode) (defcustom sas-indent-width 4 "*Amount to indent sas statements." :group 'ess-sas :type 'integer) (defcustom sas-indent-ignore-comment "*" "*Comments that start with this string are ignored in indentation." :group 'ess-sas :type 'string) (defcustom sas-require-confirmation t "*Require confirmation when revisiting a modified sas-output file." :group 'ess-sas :type 'boolean) ;; user can specify the sas program name (defcustom sas-program (if (equal system-type 'Apple-Macintosh) "invoke SAS using program file" "sas") "*Command to invoke SAS, default for buffer-local `ess-sas-submit-command'." :group 'ess-sas :type 'string) (defcustom sas-pre-run-hook nil "Hook to execute prior to running SAS via `submit-sas'." :group 'ess-sas :type 'hook) ;never used--see ess-sas-submit-command-options in ess-sas-a.el ;(defcustom sas-options-string "" ; "*Options to be passed to sas as if typed on the command line." ; :group 'ess-sas ; :type 'string) (defcustom sas-notify t "*Beep and display message when job is done." :group 'ess-sas :type 'boolean) (defcustom sas-error-notify t "*If `sas-notify' t, indicate errors in log file upon completion." :group 'ess-sas :type 'boolean) (defcustom sas-get-options nil "Options to be passed to SAS in sas-get-dataset." :group 'ess-sas :type '(choice (const nil) string)) (defcustom sas-get-options-history nil "History list of Options passed to SAS in sas-get-dataset." :group 'ess-sas) (defcustom sas-page-number-max-line 3 "*Number of lines from the page break, to search for the page number." :group 'ess-sas :type 'integer) (defcustom sas-notify-popup nil "*If this and sas-notify are t), popup a window when SAS job ends." :group 'ess-sas :type 'boolean) (defcustom sas-tmp-libname "_tmp_" "*Libname to use for sas-get-dataset." :group 'ess-sas :type 'string) (defcustom sas-file-name nil "*The name of the current sas file." :group 'ess-sas :type '(choice (const nil) file)) ;; The next two are ``the inside of [...] in a regexp'' to be used in ;; (skip-chars-(for|back)ward SAS-..-chars) (defcustom sas-white-chars " \t\n\f" "This does NOT escape blanks (RMH, 2000/03/20)." :group 'ess-sas :type 'string) (defcustom sas-comment-chars (concat sas-white-chars ";") "Doc?" :group 'ess-sas :type 'string) (defcustom ess-sas-run-regexp-opt t "If you do not want to run regexp-opt, then set to nil." :group 'ess-sas :type '(choice (const nil) string)) (require 'ess-sas-a) (defvar sas-buffer-name nil) (defvar sas-file-root nil) (defvar sas-submitable nil) (defvar sas-dataset nil) (defvar SAS-syntax-table nil "Syntax table for SAS code.") (if SAS-syntax-table nil (setq SAS-syntax-table (make-syntax-table)) ;; (if (equal system-type 'windows-nt) ;; ;; backslash is punctuation (used in MS file names) ;; (modify-syntax-entry ?\\ "." SAS-syntax-table) ;; ;; backslash is an escape character ;; (modify-syntax-entry ?\\ "\\" SAS-syntax-table)) (modify-syntax-entry ?\\ "." SAS-syntax-table) ;; backslash is punctuation (modify-syntax-entry ?+ "." SAS-syntax-table) (modify-syntax-entry ?- "." SAS-syntax-table) (modify-syntax-entry ?= "." SAS-syntax-table) (modify-syntax-entry ?% "w" SAS-syntax-table) (modify-syntax-entry ?< "." SAS-syntax-table) (modify-syntax-entry ?> "." SAS-syntax-table) (modify-syntax-entry ?& "w" SAS-syntax-table) (modify-syntax-entry ?| "." SAS-syntax-table) (modify-syntax-entry ?\' "\"" SAS-syntax-table) (modify-syntax-entry ?* ". 23" SAS-syntax-table) ; comment character (modify-syntax-entry ?\; "." SAS-syntax-table) (modify-syntax-entry ?_ "w" SAS-syntax-table) (modify-syntax-entry ?< "." SAS-syntax-table) (modify-syntax-entry ?> "." SAS-syntax-table) (modify-syntax-entry ?/ ". 14" SAS-syntax-table) ; comment character (modify-syntax-entry ?. "w" SAS-syntax-table)) (require 'font-lock); fontification also works in terminals! ;; (if (or window-system ;; noninteractive) ; compilation! ;;; ... (defvar SAS-mode-font-lock-defaults (if ess-sas-run-regexp-opt (list ;; .log NOTE: messages (cons "^NOTE [0-9]+-[0-9]+: Line generated by the invoked macro" font-lock-comment-face) (cons "^NOTE: .*$" font-lock-comment-face) (cons "^ [^ @].*[.]$" font-lock-comment-face) (cons "^ [a-z].*[a-z][ ]?$" font-lock-comment-face) (cons "^ Engine:[ ]+V.+$" font-lock-comment-face) (cons "^ Physical Name:[ ]+.+$" font-lock-comment-face) (cons "^ \\(cpu\\|real\\) time[ ]+[0-9].*$" font-lock-comment-face) (cons "^ decimal may be shifted by the" font-lock-comment-face) (cons "^NOTE: The infile " font-lock-comment-face) (cons "^NOTE: 1 record was read from the infile " font-lock-comment-face) (cons "^NOTE: [1-9][0-9]* records were read from the infile " font-lock-comment-face) (cons "^ Filename=.*,$" font-lock-comment-face) (cons "^ File Name=.*,$" font-lock-comment-face) (cons "^ File $" font-lock-comment-face) (cons "^ Name=.*,$" font-lock-comment-face) (cons "^ File List=(" font-lock-comment-face) (cons "^ List=(" font-lock-comment-face) (cons "^ Owner Name=.*,$" font-lock-comment-face) (cons "^ Access Permission=.*,$" font-lock-comment-face) (cons "^ Last Modified=.*,?$" font-lock-comment-face) (cons "^ File Size (bytes)=[0-9]+$" font-lock-comment-face) (cons "^ Pipe command=" font-lock-comment-face) (cons "^NOTE: The file " font-lock-comment-face) (cons "^NOTE: 1 record was written to the file " font-lock-comment-face) (cons "^NOTE: [1-9][0-9]* records were written to the file " font-lock-comment-face) (cons "^NOTE: PROC LOGISTIC is modeling the probability that" font-lock-comment-face) (cons "^NOTE: PROC GENMOD is modeling the probability that" font-lock-comment-face) (cons "^1[ ]+The SAS System.*$" font-lock-comment-face) (cons "^\014.*$" font-lock-comment-face) (cons "[*][*][*] ANNOTATE macros are now available [*][*][*]" font-lock-comment-face) (cons "For further information on ANNOTATE macros, enter," font-lock-comment-face) ;; (cons "^SAS/STAT 9.3_M1, SAS/ETS 9.3_M1, SAS/OR 9.3_M1" ;; font-lock-comment-face) (cons "\\(or \\)?%HELPANO.*$" font-lock-comment-face) (cons "^Local Variables:$" font-lock-comment-face) (cons "^End:$" font-lock-comment-face) (cons "^MPRINT([_A-Z0-9]+)" font-lock-comment-face) ;; .log ERROR: messages ; (cons "^ERROR\\( [0-9]+-[1-9][0-9][0-9]\\)?: .*$" (cons "^ERROR\\( [0-9]+-[0-9]+\\)?: .*$" font-lock-keyword-face) ; ERROR: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-keyword-face) ; ERROR #-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-keyword-face) ; ERROR ##-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-keyword-face) ; ERROR ###-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-keyword-face) (cons "^ a format name." font-lock-keyword-face) (cons "^ where a numeric operand is required. The condition was: " font-lock-keyword-face) (cons "[ ][_]+$" font-lock-keyword-face) ;; .log WARNING: messages ;(cons "^WARNING\\( [0-9]+-[1-9][0-9][0-9]\\)?: .*$" (cons "^WARNING\\( [0-9]+-[0-9]+\\)?: .*$" font-lock-function-name-face) ; WARNING: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-function-name-face) ; WARNING #-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-function-name-face) ; WARNING ##-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-function-name-face) ; WARNING ###-###: (cons "^ [^ @].*\\([.][ ]?[ ]?\\|[,a-z][ ]\\)$" font-lock-function-name-face) ;; SAS comments ;; /* */ style handled by grammar above (cons "\\(^[0-9]*\\|[:;!]\\)[ \t]*%?\\*[^;/][^;]*;" font-lock-comment-face) ; these over-rides need to come before the more general declarations (cons "\\") ; font-lock-keyword-face) ; ;; SAS base and SAS/Graph statements (cons (concat ;"\\<" (regexp-opt '( "do" "to" "by" "goto" ; "go" "abort" "and" "array" "assess" "attrib" "baseline" "bayes" "between" "bivar" "block" "bubble" "bubble2" "change" "choro" "class" "contains" "contrast" "delete" "display" "dm" "donut" "drop" "else" "error" "exchange" "exclude" "fcs" "file" "filename" "format" "freq" "footnote" "footnote1" "footnote2" "footnote3" "footnote4" "footnote5" "footnote6" "footnote7" "footnote8" "footnote9" "footnote10" "goptions" "grid" ; "ge" "gt" "hazardratio" "hbar" "hbar3d" "id" "if" "index" "infile" "informat" "input" ; "is" rarely used, but common false pos. "keep" "label" "length" "libname" "like" "link" "lsmeans" ; "le" "lt" "manova" "means" "merge" "missing" "model" "modify" "not" "null" ; "ne" "note" "ods" "options" "output" "otherwise" ; "or" "pageby" "parms" "pie" "pie3d" "plot" "plot2" "prism" "put" "random" "rename" "repeated" "retain" "same" "save" "scatter" "select" "set" "skip" "star" "strata" "sum" "sumby" "surface" "table" "tables" "test" "then" "time" "title" "title1" "title2" "title3" "title4" "title5" "title6" "title7" "title8" "title9" "title10" "univar" "update" "value" "var" "vbar" "vbar3d" "weight" "where" "window" "with" ; "x" ) 'words)) ;"\\>") font-lock-keyword-face) ;; SAS/GRAPH statements not handled above (cons (concat "\\<" (regexp-opt '("axis" "legend" "pattern" "symbol")) "\\([1-9][0-9]?\\)?" "\\>") font-lock-keyword-face) ;; SAS functions and SAS macro functions (cons "%[a-z_][a-z_0-9]*[(;]" font-lock-function-name-face) ;(cons "\\" "("); "[ \t]*(") font-lock-function-name-face) ) (list ;; .log NOTE: messages (cons "^NOTE: .*$" font-lock-constant-face) ;; .log ERROR: messages (cons "^ERROR: .*$" font-lock-keyword-face) ;; .log WARNING: messages (cons "^WARNING: .*$" font-lock-function-name-face) ;; SAS comments ;; /* */ handled by grammar above ;; (list "/\\*.*\\*/" 0 font-lock-comment-face t) (cons "\\(^[0-9]*\\|;\\)[ \t]*\\(%?\\*\\|comment\\).*\\(;\\|$\\)" font-lock-comment-face) ;; SAS execution blocks, DATA/RUN, PROC/RUN, SAS Macro Statements (cons "\\<%do[ \t]*\\(%until\\|%while\\)?\\>" font-lock-constant-face) ;;(cons (concat "\\(^[0-9]*\\|;\\)[ \t]*" ;;"%\\(end\\|global\\|local\\|m\\(acro\\|end\\)\\)" ;;"\\>") font-lock-constant-face) (cons "\\<%\\(end\\|global\\|local\\|m\\(acro\\|end\\)\\)\\>" font-lock-constant-face) (cons (concat "\\(^[0-9]*\\|;\\|):\\|%then\\|%else\\)[ \t]*" "\\(data\\|endsas\\|finish\\|quit\\|run\\|start\\)[ \t\n;]") font-lock-constant-face) (cons (concat "\\(^[0-9]*\\|;\\|):\\|%then\\|%else\\)[ \t]*" ;;"proc[ \t]+[a-z][a-z_0-9]+") font-lock-constant-face) "proc[ \t]+" ;;SAS/Base, SAS/Graph, SAS/FSP and common add-ons "\\(append" "\\|b\\(genmod\\|lifereg\\|phreg\\)" "\\|c\\(a\\(lendar\\|talog\\)\\|port\\|o\\(mpare\\|ntents\\|py\\|rr\\)\\)" "\\|d\\(atasets\\|bcstab\\|isplay\\)\\|ex\\(plode\\|port\\)" "\\|f\\(orm\\(at\\|s\\)\\|req\\|s\\(browse\\|edit\\|l\\(etter\\|ist\\)\\|view\\)\\)" "\\|g?\\(chart\\|p\\(lot\\|rint\\)\\)" "\\|g\\(anno\\|contour\\|device\\|font\\|\\(key\\)?map\\|options\\|project" "\\|re\\(duce\\|move\\|play\\)\\|slide\\|testit\\|3\\(d\\|grid\\)\\)" "\\|\\(map\\|[cg]\\)?import\\|i\\(ml\\|nsight\\)" "\\|means\\|options\\|p\\(menu\\|rintto\\)" "\\|r\\(ank\\|e\\(gistry\\|port\\)\\)" "\\|s\\(ort\\|ql\\|tandard\\|ummary\\)" "\\|t\\(abulate\\|emplate\\|imeplot\\|ran\\(spose\\|tab\\)\\)\\|univariate" ;;SAS/Stat and SAS/ETS "\\|a\\(ceclus\\|nova\\|rima\\|utoreg\\)\\|boxplot" "\\|c\\(a\\(lis\\|n\\(corr\\|disc\\)\\|tmod\\)\\|itibase\\|luster\\|o\\(mputab\\|rresp\\)\\)" "\\|discrim\\|expand\\|f\\(a\\(ctor\\|stclus\\)\\|orecast\\|req\\)" "\\|g\\(enmod\\|l\\(immix\\|m\\(mod\\|power\\|select\\)?\\)\\)\\|inbreed\\|k\\(de\\|rige2d\\)" "\\|l\\(attice\\|ife\\(reg\\|test\\)\\|o\\(ess\\|gistic\\)\\)" "\\|m\\(ds\\|ixed\\|o\\(de\\(clus\\|l\\)\\|rtgage\\)\\|ulttest\\)" "\\|n\\(ested\\|l\\(in\\|mixed\\)\\|par1way\\)\\|orthoreg" "\\|p\\(dlreg\\|hreg\\|l\\(an\\|s\\)\\|ower\\|r\\(in\\(comp\\|qual\\)\\|obit\\)\\)\\|r\\(sr\\)?eg" "\\|s\\(core\\|im\\(2d\\|lin\\)\\|pectra\\|t\\(atespace\\|dize\\|epdisc\\)\\|urvey\\(means\\|reg\\|select\\)\\|yslin\\)" "\\|t\\(phreg\\|pspline\\|r\\(ansreg\\|ee\\)\\|test\\)" "\\|var\\(clus\\|comp\\|iogram\\)\\|x11" "\\)") font-lock-constant-face) ;;(cons (concat "\\(^[0-9]*\\|;\\|%then\\|%else\\)[ \t]*" ;;"\\(%\\(go[ \t]*to\\|i\\(f\\|n\\(clude\\|put\\)\\)\\|let\\|put\\|sysexec\\)\\)" ;;"\\>") font-lock-constant-face) (cons "\\<%\\(go[ \t]*to\\|i\\(f\\|n\\(clude\\|put\\)\\)\\|let\\|put\\|sysexec\\)\\>" font-lock-constant-face) (cons "\\<%\\(by\\|else\\|t\\(o\\|hen\\)\\)\\>" font-lock-constant-face) ;; SAS dataset options/PROC statements followed by an equal sign/left parentheses (cons (concat "[ \t(,]" "\\(attrib\\|by\\|compress\\|d\\(ata\\|rop\\)\\|f\\(irstobs\\|ormat\\)" "\\|i\\(d\\|f\\|n\\)\\|ke\\(ep\\|y\\)\\|l\\(abel\\|ength\\)" "\\|o\\(bs\\|rder\\|ut\\)\\|rename\\|s\\(ortedby\\|plit\\)" "\\|var\\|where\\)" "[ \t]*=") font-lock-keyword-face) (cons "\\<\\(in\\(:\\|dex[ \t]*=\\)?\\|until\\|wh\\(en\\|ile\\)\\)[ \t]*(" font-lock-keyword-face) ;; SAS statements (cons (concat "\\(^[0-9]*\\|):\\|[;,]\\|then\\|else\\)[ \t]*" "\\(a\\(bort\\|rray\\|ttrib\\)\\|b\\(ayes\\|y\\)" "\\|c\\(hange\\|lass\\|ontrast\\)" "\\|d\\(elete\\|isplay\\|m\\|o\\([ \t]+\\(data\\|over\\)\\)?\\|rop\\)" "\\|e\\(rror\\|stimate\\|xc\\(hange\\|lude\\)\\)" "\\|f\\(ile\\(name\\)?\\|o\\(otnote\\(10?\\|[2-9]\\)?\\|rmat\\)\\|req\\)" "\\|go\\([ \t]*to\\|ptions\\)" "\\|hazardratio\\|[hv]bar\\(3d\\)?" "\\|i\\(d\\|f\\|n\\(dex\\|f\\(ile\\|ormat\\)\\|put\\|value\\)\\)" "\\|keep\\|l\\(abel\\|ength\\|i\\(bname\\|nk\\|st\\)\\|smeans\\)" "\\|m\\(anova\\|e\\(ans\\|rge\\)\\|issing\\|od\\(el\\|ify\\)\\)\\|note" "\\|o\\(ds\\|ptions\\|therwise\\|utput\\)\\|p\\(arms\\|lot2?\\|ut\\)" "\\|r\\(andom\\|e\\(name\\|peated\\|tain\\)\\)" "\\|s\\(ave\\|e\\(lect\\|t\\)\\|kip\\|trata\\|um\\(by\\)?\\)" "\\|t\\(ables?\\|i\\(me\\|tle\\(10?\\|[2-9]\\)?\\)\\)\\|update" "\\|va\\(lue\\|r\\)\\|w\\(eight\\|here\\|i\\(ndow\\|th\\)\\)" ;; IML statements that are not also SAS statements "\\|append\\|c\\(lose\\(file\\)?\\|reate\\)\\|edit\\|f\\(ind\\|orce\\|ree\\)" "\\|insert\\|load\\|mattrib\\|p\\(a[ru]se\\|rint\\|urge\\)" "\\|re\\(move\\|peat\\|place\\|set\\|sume\\)" "\\|s\\(et\\(in\\|out\\)\\|how\\|ort\\|tore\\|ummary\\)\\|use\\)?" "\\>") font-lock-keyword-face) ;; (cons "\\<\\(\\(then\\|else\\)[ \t]*\\)?\\(do\\([ \t]*over\\)?\\|else\\)\\>" ;; font-lock-keyword-face) ;; SAS statements that must be followed by a semi-colon (cons (concat "\\(^[0-9]*\\|):\\|[;,]\\|then\\|else\\)[ \t]*" "\\(cards4?\\|datalines\\|end\\|l\\(ostcard\\)\\|page\\|return\\|stop\\)?" "[ \t]*;") font-lock-keyword-face) ;; SAS/GRAPH statements not handled above (cons (concat "\\(^[0-9]*\\|):\\|[;,]\\)[ \t]*" "\\(axis\\|legend\\|pattern\\|symbol\\)" "\\([1-9][0-9]?\\)?\\>") font-lock-keyword-face) ;; SAS Datastep functions and SAS macro functions ;(cons "%[a-z_][a-z_0-9]*[ \t]*[(;]" ;; SAS macro functions occasionally defined with no arguments ;; which means they can be followed by any character that can ;; separate tokens, however, they are most likely to be followed ;; by operat-ions/ors (cons "%[a-z_][a-z_0-9]*[- \t();,+*/=<>]" font-lock-function-name-face) (cons "\\ (- (point-max) pos) (point)) (goto-char (- (point-max) pos))))) ;;(defun sas-indent-region (start end) ;; "Indent a region of SAS code." ;; (interactive "r") ;; (save-excursion ;; (let ((endmark (copy-marker end))) ;; (goto-char start) ;; (and (bolp) (not (eolp)) ;; (sas-indent-line)) ;; (indent-sexp endmark) ;; (set-marker endmark nil)))) (defun indent-sas-statement (arg) "Indent all continuation lines sas-indent-width spaces from first line of statement." (interactive "p") (let (end) (save-excursion (if (> arg 0) (while (and (> arg 0) (search-forward ";" (point-max) 1 1)) (setq end (point)) (if (bobp) nil (backward-char 1)) (beginning-of-sas-statement 1) (forward-char 1) (indent-region (point) end (+ (current-column) (1- sas-indent-width))) (search-forward ";" (point-max) 1 1) (setq arg (1- arg))))))) ;; added 9/31/94 (defun sas-next-statement-indentation () "Returns the correct indentation of the next sas statement. The current version assumes that point is at the end of the statement. This will (hopefully) be fixed in later versions." (if (bobp) 0 (save-excursion (let ((prev-end (point))) (beginning-of-sas-statement 1) (while (and (not (bobp)) (not (looking-at "*/")) (looking-at sas-indent-ignore-comment)) (skip-chars-backward sas-white-chars) (if (bobp) nil (backward-char 1)) (setq prev-end (point)) (beginning-of-sas-statement 1 t)) (if (or (looking-at (concat "data[ \n\t;]\\|" (regexp-opt '("cards;" "cards4;" "datalines;" "datalines4;" "lines;" "lines4;")) "\\|proc[ \n\t]\\|%?do[ \n\t;]\\|%macro[ \n\t]\\|/\\*")) (save-excursion (re-search-forward "\\b%?then\\>[ \n\t]*\\b%?do\\>\\|\\b%?else\\>[ \n\t]*\\b%?do\\>" prev-end 1 1))) ; fixed 1/30/95 to avoid being fooled by ; variable names starting with "do" (+ (current-indentation) sas-indent-width) (if (looking-at "%?end[ ;\n]\\|%mend[ ;\n]\\|\\*/") (max (- (current-indentation) sas-indent-width) 0) (current-indentation))))))) ;; added 2/1/95 (defun sas-comment-start-col () "If the current line is inside a /* */ comment, returns column in which the opening /* appears. returns 0 otherwise." (let ((pos (point))) (save-excursion (if (and (search-backward "*/" (point-min) 1 1) (search-forward "/*" pos 1 1)) (current-indentation) 0)))) ;; Created 6/27/94 to verify that RUN; statements match PROC and DATA ;; statements. Useful since indentation my be goofy w/o "RUN;" (defun sas-check-run-statements () "Check to see that \"run\" statements are matched with proc, data statements." (interactive) (let (pos (ok t) (eob-ok t)) (save-excursion (beginning-of-line) (while ok (if (re-search-forward "\\(^[ \t]*run[ ;]\\)\\|\\(^[ \t]*proc \\|^[ \t]*data[ ;]\\)" nil 1) (if (match-beginning 2) (if (re-search-forward "\\(^[ \t]*run[ ;]\\)\\|\\(^[ \t]*proc \\|^[ \t]*data[ ;]\\)" nil t) (progn (setq pos (point)) (setq ok (match-beginning 1))) (setq eob-ok nil pos (point-max)))) (setq ok nil))) (setq ok (eobp))) (if (and ok eob-ok) (message "Run statements match") (goto-char pos) (beep) (message "Missing Run Statement.")))) (defun sas-fix-life-tables () "Remove censored and duplicate observations from life tables generated by Proc Lifetest. Operates on current region. A major space saver if there is heavy censoring." (interactive) (if buffer-read-only (setq buffer-read-only nil)) (goto-char (point-min)) (while (re-search-forward "^.*[ ]+[.][ ]+[.][ ]+[.][ ]+.*$" nil t) (replace-match "" nil nil))) ; (save-excursion ; (shell-command-on-region ; start end ; "sed '/[ ][.][ ]/d'" t))) ;;"sed \"\\? *\\. *\\. *\\. ?d\"" t))) ;;(vip-goto-line 1) ;;(setq ex-g-flag nil ;;ex-g-variant nil) ;;(vip-ex "1,$g/ \\. \\. \\. /d"))) (defun sas-fix-page-numbers (offset &optional page-num) "Fix number of current page in sas output files after editing. Add OFFSET to actual page number." (interactive "P") (if (not offset) (setq offset 0)) (if (not page-num) (setq page-num (sas-page-number))) (save-excursion (if (/= (preceding-char) ?\C-l) (backward-page 1)) (let (end len mstart mend) (save-excursion (forward-line sas-page-number-max-line) (setq end (point))) (if (re-search-forward "\\(^[0-9]+[ ]\\)\\|\\([ ][0-9]+$\\)" end t) (progn (setq len (- (match-end 0) (match-beginning 0)) mstart (match-beginning 0) mend (match-end 0)) (delete-region mstart mend) (if (eolp) (insert (format (concat "%" len "d") (+ page-num offset))) (insert (substring (concat (+ (sas-page-number) offset) " ") 0 len)))))))) (defun sas-page-fix (start) "Fix page numbers in sas output from point to end of file. If START is given this will be the number for the current page." (interactive "P") (let (offset (pnum (sas-page-number))) (if (not start) (setq offset 0) (setq offset (- start pnum))) (while (not (eobp)) (sas-fix-page-numbers offset pnum) (setq pnum (1+ pnum)) (forward-page 1)))) (defun fix-page-breaks () "Fix page breaks in SAS 6 print files." (interactive) (save-excursion (goto-char (point-min)) (if (looking-at "\f") (delete-char 1)) ;(replace-regexp "^\\(.+\\)\f" "\\1\n\f\n") (while (re-search-forward "^\\(.+\\)\f" nil t) (replace-match "\\1\n\f\n" nil nil)) (goto-char (point-min)) ;(replace-regexp "^\f\\(.+\\)" "\f\n\\1") (while (re-search-forward "^\f\\(.+\\)" nil t) (replace-match "\f\n\\1" nil nil)) ; (goto-char (point-min)) ;(replace-regexp " $" "") ;(while (re-search-forward "$" nil t) ; (replace-match "" nil nil)) (goto-char (point-min)) ;(replace-regexp " \\([^\\$]+\\)" "\n\\1") (while (re-search-forward " \\([^\\$]+\\)" nil t) (replace-match "\n\\1" nil nil)) (goto-char (point-max)) (if (not (bobp)) (progn (backward-char 1) (if (not (looking-at "\n")) (progn (forward-char 1) (open-line 1))))))) (defun sas-page-number () ;; like what-page except it returns an integer page number "Return page number of point in current buffer." (let ((opoint (point))) (save-excursion (goto-char (point-min)) (1+ (sas-how-many page-delimiter opoint))))) (defun sas-how-many (regexp &optional end) ;; a copy of `how-many' which returns an integer ;; rather than a message "Return number of matches for REGEXP following point." (let ((count 0) opoint) (save-excursion (while (and (not (eobp)) (progn (setq opoint (point)) (re-search-forward regexp end t))) (if (= opoint (point)) (forward-char 1) (setq count (1+ count)))) count))) (defun beginning-of-sas-proc () "Move point to beginning of sas proc, macro or data step." (interactive) (let ((case-fold-search t)) (forward-char -1) (while (not (or (looking-at "data\\|proc\\|%macro") (bobp))) (re-search-backward "proc\\|data\\|%macro" (point-min) 1) (beginning-of-sas-statement 1)))) (defun next-sas-proc (arg) "Move point to beginning of next sas proc." (interactive "P") (let ((case-fold-search t)) (forward-char 1) (if (re-search-forward "^[ \t]*\\(data[ ;]\\|proc[ ;]\\|endsas[ ;]\\|g?options[ ;]\\|%macro[ ;]\\)" nil t arg) (beginning-of-sas-statement 1) (forward-char -1)))) (defun set-sas-file-name () "Stores the name of the current sas file." (let ((name (buffer-file-name))) (cond ((not name)) ((string-match (substring name -4 nil) "\\.sas\\|\\.lst\\|\\.log") (setq sas-file-name (substring name 0 (- (length name) 4))) (setq sas-buffer-name (buffer-name)) (setq sas-file-root (substring sas-buffer-name 0 (- (length sas-buffer-name) 4)))) (t (message "This file does not have a standard suffix"))))) ;; created 6/27/94 (defun sas-set-alternate-file-name (name) "Stores the NAME of an alternate sas file. When this file is submitted with `submit-sas', the alternate file will be submitted instead. `sas-submitable' is automatically sets to t." (interactive "f") (cond ((string-match (substring name -4 nil) "\\.sas\\|\\.lst\\|\\.log") (setq sas-file-name (substring name 0 (- (length name) 4))) (setq sas-submitable t)) (t (message "This file does not have a standard suffix")))) (defun switch-to-sas-source () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file "sas")) (defun switch-to-sas-lst () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file "lst")) (defun switch-to-sas-log () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file "log")) (defun switch-to-sas-source-other-window () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file-other-window "sas")) (defun switch-to-sas-lst-other-window () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file-other-window "lst")) (defun switch-to-sas-log-other-window () "Switches to sas source file associated with the current file." (interactive) (switch-to-sas-file-other-window "log")) ;;(defun switch-to-sas-file (suff &optional revert silent) ;; "Switches to sas \"SUFF\" file associated with the current file" ;; (let* ((sfile sas-file-name) ;; (buf (get-file-buffer (concat sfile "." suff))) ;; (sas-require-confirmation ;; (and sas-require-confirmation (not revert)))) ;; (if (or sas-require-confirmation (string-equal suff "sas") (not buf)) ;; (find-file (concat sfile "." suff)) ;; (progn (switch-to-buffer buf) ;; (if (not (verify-visited-file-modtime (current-buffer))) ;; (progn (revert-buffer t t) ;; (if (not silent) ;; (message "File has changed on disk. Buffer automatically updated.")))))) ;; (setq sas-file-name sfile)) ;; (if (string-equal suff "sas") ;; (if (not (string-equal major-mode "sas-mode")) ;; (sas-mode)) ;; (if (not (string-equal major-mode "sasl-mode")) ;; (sasl-mode)))) ;; ;;(defun switch-to-sas-file-other-window (suff) ;; "Switches to sas \"SUFF\" file associated with the current file" ;; (let* ((sfile sas-file-name) ;; (buf (get-file-buffer (concat sfile "." suff)))) ;; (if (or sas-require-confirmation (string-equal suff "sas") (not buf)) ;; (find-file-other-window (concat sfile "." suff)) ;; (progn (switch-to-buffer-other-window buf) ;; (if (not (verify-visited-file-modtime (current-buffer))) ;; (progn (revert-buffer t t) ;; (message "File has changed on disk. Buffer automatically updated."))))) ;; (setq sas-file-name sfile)) ;; (if (string-equal suff "sas") ;; (if (not (string-equal major-mode "sas-mode")) ;; ;;(sas-mode) ;; ) ;; (if (not (string-equal major-mode "sasl-mode")) ;; ;;(sasl-mode) ;; ))) (defun switch-to-sas-file (suff) "Switches to sas \"SUFF\" file associated with the current file." (switch-to-buffer (set-sas-file-buffer suff))) (defun switch-to-sas-file-other-window (suff) "Switches to sas \"SUFF\" file associated with the current file." (switch-to-buffer-other-window (set-sas-file-buffer suff))) ;; The following was created 6/7/94 to handle buffers without messing up ;; windows. (defun set-sas-file-buffer (suff &optional revert silent) "Sets current buffer to sas \"SUFF\" file associated with the current file." (let* ((sfile sas-file-name) (buf (get-file-buffer (concat sfile "." suff))) (sas-require-confirmation (and sas-require-confirmation (not revert)))) (if (or sas-require-confirmation (string-equal suff "sas") (not buf)) (set-buffer (find-file-noselect (concat sfile "." suff))) (progn (set-buffer buf) (if (not (verify-visited-file-modtime (current-buffer))) (progn (revert-buffer t t) (if (not silent) (message "File has changed on disk. Buffer automatically updated.")))))) (setq sas-file-name sfile)) ;;(if (string-equal suff "sas") ;; (if (not (string-equal major-mode "sas-mode")) (sas-mode)) ;; (if (not (string-equal major-mode "sasl-mode"))(sasl-mode)) (current-buffer)) (defun switch-to-sas-process-buffer () "Switch to sas-process-buffer." (interactive) (let (buf proc-name) (setq proc-name (concat "SAS" sas-file-name) buf (concat "*" proc-name "*")) (switch-to-buffer-other-window buf))) (defun submit-sas () ;; 6/17/94 added sas-submitable local variable. "Submit SAS file as shell command." (interactive) (if ;; can file be run, or is it only for inclusion? (or sas-submitable (progn (beep) (y-or-n-p (format "Submission is disabled for this file. Submit it anyway? ")))) (progn ;; if buffer name has changed, tell user (if (or (string-equal sas-buffer-name (buffer-name)) (not (y-or-n-p (format "The name of this buffer has changed. Submit the new file? ")))) (setq sas-buffer-name (buffer-name)) (set-sas-file-name)) (let ((sas-file sas-file-name) (sas-root sas-file-root) ;;(sas-buf sas-buffer-name) proc-name buf) ;; Save buffer to SAS the right file :-). (if (buffer-modified-p) (if (y-or-n-p (format "Buffer %s is modified. Save it? " (buffer-name))) (save-buffer))) (setq proc-name (concat "SAS" sas-file) buf (concat "*" proc-name "*")) (if (get-buffer buf) (save-window-excursion (switch-to-buffer buf) (erase-buffer) (setq default-directory (file-name-directory sas-file)))) (run-hooks 'sas-pre-run-hook) ;; added 8/24/94 (message "---- Submitting SAS job ----") ;; (switch-to-buffer buf) (make-comint proc-name sas-program ;added sas-program 4/29/94 nil sas-root) (save-window-excursion (switch-to-buffer buf) (setq sas-file-name sas-file) (bury-buffer buf)) (message "---- SAS job submitted ---- ") (if sas-notify;; added 4/7/94 (set-process-sentinel (get-process proc-name) 'sas-sentinel) (display-buffer buf t)))) (message "---- File not submitted ----"))) ;; 5/2/94 Modified sas-sentinel to check for errors in log file upon ;; completion. (defun sas-sentinel (proc arg);; created 4/7/94 "Notify user that SAS run is done." (beep) ;;(if (string-equal arg "finished\n") (save-excursion (let (msg buf win (sbuf (concat "*" (process-name proc) "*"))) (setq msg (format "SAS %s %s" (substring arg 0 -1) (if sas-error-notify ;;(save-window-excursion (progn (set-buffer sbuf) (setq buf (set-sas-file-buffer "log" t t)) (goto-char (point-min)) (setq win (get-buffer-window buf)) (save-window-excursion (if win (progn (select-window win) (if (re-search-forward "^ERROR" nil t) " (See .log file for errors)" "")) (switch-to-buffer buf) (if (re-search-forward "^ERROR" nil t) " (See .log file for errors)" "")))) ""))) (set-buffer sbuf) (goto-char (point-max)) (insert msg) (bury-buffer (get-buffer sbuf)) ;;(if (and sas-notify-popup window-system) ;; (x-popup-dialog t ;; (list "SAS Menu" (cons msg nil) ))) ;;(if (not (minibuffer-window-active-p)) (princ msg)) (princ msg)))) ;; 5/2/94 Modified run-sas-on-region to separate log and output buffers. ;; ;;(defun run-sas-on-region (start end append &optional buffer) ;; "Submit region to SAS" ;; (interactive "r\nP") ;; (message "---- Running SAS ----") ;; (let ((sfile sas-file-name) ;; (shell-file-name "/bin/sh") ;; serror buff) ;; (setq buffer (or buffer "*SAS output*")) ;; (save-excursion ;; (shell-command-on-region ;; start end;; added sas-program ;; (concat sas-program " -nonews -stdio 2> /tmp/_temp_.log" nil)) ;; (get-buffer-create "*SAS Log*") ;; (save-window-excursion ;; (switch-to-buffer "*SAS Log*") ;; (erase-buffer) ;; (insert-file-contents "/tmp/_temp_.log") ;; (delete-file "/tmp/_temp_.log") ;; (setq serror (re-search-forward "^ERROR" nil t)) ;; (if serror () (bury-buffer))) ;; (setq buff (get-buffer-create buffer)) ;; (save-window-excursion ;; (switch-to-buffer buff) ;; (setq sas-file-name sfile) ;; (if append ;; (progn ;; (end-of-buffer) ;; (insert "\f\n")) ;; (erase-buffer)) ;; (if (get-buffer "*Shell Command Output*") ;; (progn (insert-buffer "*Shell Command Output*") ;; (kill-buffer "*Shell Command Output*")) ;; (insert "SAS completed with no output.")) ;; (if append () (sasl-mode)) ;; (message "---- SAS Complete ----"))) ;; (if (not serror) ;; (switch-to-buffer-other-window buff) ;; (switch-to-buffer-other-window "*SAS Log*") ;; (goto-char serror) ;; (beep) ;; (message "Error found in log file.") ;; ))) (defun switch-to-dataset-log-buffer () "Switch to log buffer for run-sas-on-region." (interactive) (switch-to-buffer-other-window "*SAS Log*")) (defun switch-to-dataset-source-buffer () "Switch to source buffer for run-sas-on-region." (interactive) (switch-to-buffer-other-window (format " *sas-tmp-%s*" sas-dataset))) ;;(defun sas-get-dataset (filename &optional arg opts-p append buffer vars) ;; "Run proc contents and proc print on SAS dataset. Automatically prompts ;;for SAS options to use. Default options are defined by the variable ;;`sas-get-options'. Output may be updated from within output buffer with ;;C-cr if dataset changes. Also, the source code which generates the output ;;may be edited with C-cs. Typing C-cr within the output buffer reexecutes ;;the (modified) source code." ;; (interactive "fName of SAS dataset (file name):") ;; (let ((file (file-name-nondirectory filename)) ;; (dir (file-name-directory filename)) ;; (opts sas-get-options) ;; (minibuffer-history sas-get-options-history) ;; buf); fsize) ;; (setq buffer (or buffer (concat "*" file "*"))) ;; (setq opts (if opts-p opts (read-string "SAS options: " opts))) ;; (setq sas-get-options-history minibuffer-history) ;; (cond ((string-match (substring file -6 nil) "\\.ssd01") ;; (setq file (substring file 0 (- (length file) 6)))) ;; (t (error "This file is not a SAS dataset."))) ;; (setq buf (format " *sas-tmp-%s*" file)) ;; (get-buffer-create buf) ;; (save-window-excursion ;; (switch-to-buffer buf) ;; (erase-buffer) ;; (setq default-directory dir) ;; (if opts ;; (insert (format "options %s ;\n" opts))) ;; (insert (format "title \"Contents of SAS dataset `%s'\" ;\n" file)) ;; (insert (format "libname %s '%s' ;\n" sas-tmp-libname dir)) ;; (if (not (equal arg 1)) ;; (insert (format "proc contents data = %s.%s ;\n" sas-tmp-libname file))) ;; (if (equal arg 2) () ;; (insert (format "proc print data = %s.%s ;\n" sas-tmp-libname file)) ;; (if vars (insert (format " var %s ;\n" vars)))) ;; (run-sas-on-region (point-min) (point-max) append ;; buffer) ;; (get-buffer buffer) ;; (if append () (sasd-mode)) ;; added 5/5/94 ;; (setq sas-dataset file)) ;; (if (get-buffer-window buffer t) ;; (raise-frame (window-frame (get-buffer-window buffer t))) ;; (display-buffer buffer (not append))) ;; )) ;;(defun revert-sas-dataset () ;; "Revert current sas dataset from disk version" ;; (interactive) ;; (let* ((file sas-dataset) ;; (buf (format " *sas-tmp-%s*" file)) ;; (pos (point))) ;; (save-window-excursion ;; (switch-to-buffer buf) ;; (run-sas-on-region (point-min) (point-max) nil ;; (concat "*" file ".ssd01*")) ;; ) ;; (goto-char pos) ;; added 6/9/94 ;; (sasd-mode) ;; added 5/5/94 ;; (setq sas-dataset file))) (defun sas-insert-local-variables () ;; created 6/17/94 "Add local variables code to end of sas source file." (interactive) (save-excursion (if (re-search-forward "* *Local Variables: *;" nil t) () (goto-char (point-max)) (insert " ** Local Variables: ; ** End: ; page ; ")))) ;;-*-emacs-lisp-*- ;;; file name: sas-data.el ;;; ;;; Version 1.0 ;;; ;;; sas-data-mode: manage sas datasets ;;; Copyright (C) 1994 Tom Cook ;;; ;;; This program is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2 of the License, or ;;; (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; A copy of the GNU General Public License is available at ;;; http://www.r-project.org/Licenses/ ;;; ;;; Author: Tom Cook ;;; Dept. of Biostatistics ;;; University of Wisconsin - Madison ;;; Madison, WI 53706 ;;; cook@biostat.wisc.edu ;; Created: 8/11/94 ;; variables section (defvar sas-dir-mode-map nil) (defvar sas-directory-name nil "Name of directory associated with this buffer.") (make-variable-buffer-local 'sas-directory-name) (defvar sas-dir-buf-end nil) (make-variable-buffer-local 'sas-dir-buf-end) (defvar sas-sorted-by-num nil) (make-variable-buffer-local 'sas-sorted-by-num) ;; user variables ;; keymaps etc... (if sas-dir-mode-map () (setq sas-dir-mode-map (make-sparse-keymap)) ;;(define-key sas-dir-mode-map "c" 'sas-contents) (define-key sas-dir-mode-map "p" 'sas-print) (define-key sas-dir-mode-map "m" 'sas-mark-item) (define-key sas-dir-mode-map "u" 'sas-unmark-item) (define-key sas-dir-mode-map " " 'sas-next-line) (define-key sas-dir-mode-map "\C-n" 'sas-next-line) (define-key sas-dir-mode-map "\C-p" 'sas-prev-line) (define-key sas-dir-mode-map "\177" 'sas-prev-line-undo) (define-key sas-dir-mode-map "\C-b" 'sas-backward-page-narrow) (define-key sas-dir-mode-map "\C-v" 'sas-forward-page-narrow) (define-key sas-dir-mode-map "\C-m" 'sas-goto-dataset) (define-key sas-dir-mode-map [mouse-2] 'sas-mouse-goto-dataset) (define-key sas-dir-mode-map "t" 'sas-dir-goto-page) (define-key sas-dir-mode-map "q" 'bury-buffer) (define-key sas-dir-mode-map "g" 'sas-revert-library) (define-key sas-dir-mode-map "1" 'digit-argument) (define-key sas-dir-mode-map "2" 'digit-argument) (define-key sas-dir-mode-map "3" 'digit-argument) (define-key sas-dir-mode-map "4" 'digit-argument) (define-key sas-dir-mode-map "5" 'digit-argument) (define-key sas-dir-mode-map "6" 'digit-argument) (define-key sas-dir-mode-map "7" 'digit-argument) (define-key sas-dir-mode-map "8" 'digit-argument) (define-key sas-dir-mode-map "9" 'digit-argument) (define-key sas-dir-mode-map [menu-bar sas run] '("Submit File " . submit-sas)) ) ;(require 'sas) (defun sas-dir-mode () "Major mode for managing sas files." (interactive) (kill-all-local-variables) (use-local-map sas-dir-mode-map) (setq major-mode 'sas-dir-mode) (setq mode-name "SAS") (setq sas-directory-name (expand-file-name default-directory)) (setq buffer-read-only 1)) ;;(defun sas-make-library (directory &optional update) ;; "Create a buffer with the names of all sas datasets from DIRECTORY." ;; (interactive "DDirectory Name: ") ;; (let ((dir (expand-file-name directory)) buf out cont pos) ;; (setq buf (format " *sas-tmp-%s*" dir)) ;; (setq out (concat "*SAS-dir-" dir)) ;; (setq cont (concat "*SAS-cont-" dir)) ;; (get-buffer-create buf) ;; (if (get-buffer out) ;; (if update ;; (progn ;; (set-buffer out) ;; (setq buffer-read-only nil))) ;; (setq update t)) ;; (pop-to-buffer out) ;; (setq default-directory dir) ;; (setq pos (point)) ;; (if update ;; (progn ;; (save-window-excursion ;; (set-buffer buf) ;; (erase-buffer) ;; (setq default-directory dir) ;; (insert "options linesize=70 pagesize=1000 ;\n") ;; (insert (format "title \"Contents of SAS directory `%s'\" ;\n" ;; dir)) ;; (insert (format "libname %s '%s' ;\n" sas-tmp-libname dir)) ;; (insert (format "proc contents data = %s._all_ directory details memtype=data ;\n" sas-tmp-libname)) ;; (run-sas-on-region (point-min) (point-max) nil ;; out) ;; (set-buffer out) ;; (goto-char (point-min)) ;; (if (= (sas-how-many page-delimiter (point-max)) 0) ;; (let ((buffer-read-only nil)) ;; (erase-buffer) ;; (insert "There are no SAS datasets in this directory") ;; (pop-to-buffer out)) ;; (save-excursion ;; (set-buffer (get-buffer-create cont)) ;; (setq buffer-read-only t) ;; (let ((buffer-read-only nil)) ;; (erase-buffer) ;; (insert-buffer out) ;; (delete-region (point-min) ;; (or (re-search-forward page-delimiter nil t) ;; (point-min))) ;; (sas-page-fix 1) ;; (goto-char (point-min)) ;; (sas-dir-mode) ;; (sas-narrow-to-page))) ;; (if (re-search-forward page-delimiter nil t) ;; (delete-region (progn (beginning-of-line) (point)) ;; (point-max))) ;; (sas-insert-set-properties (point-min) (point-max)) ;; ) ;; (switch-to-buffer out t) ;; (goto-char (point-min)) ;; (sas-dir-mode) ;; (setq sas-dir-buf-end (point-max))) ;; (goto-char pos) ;; (sas-move-to-filename (point-max)))))) (defun sas-move-to-filename (&optional eol) (or eol (setq eol (progn (end-of-line) (point)))) (beginning-of-line) (if (re-search-forward "\\(^ *[0-9]+ *<*\\)[^:0-9\n]" eol t) (goto-char (match-end 1)))) (defun sas-next-line (arg) "Move down one line." (interactive "p") (forward-line arg) (sas-move-to-filename (point-max))) ;;(and (< (point) sas-dir-buf-end) ;;(forward-line arg) ;;(sas-move-to-filename sas-dir-buf-end))) (defun sas-prev-line (arg) "Move up one line." (interactive "p") (beginning-of-line) (re-search-backward "^ *[0-9]+ *<*[^:0-9\n]" (point-min) t) (sas-move-to-filename sas-dir-buf-end)) (defun sas-insert-set-properties (beg end) (save-excursion (goto-char beg) (while (< (point) end) (if (sas-move-to-filename) (put-text-property (point) (+ 8 (point)) 'mouse-face 'highlight)) (forward-line 1)))) (defun sas-get-filename () "Return name of dataset on current line." (interactive) (save-excursion (if (string-equal "*SAS-dir" (substring (buffer-name) 0 8)) (sas-move-to-filename) (goto-char (point-min)) (re-search-forward "Data Set Name: [^.]*\\.")) (expand-file-name (downcase (concat sas-directory-name (buffer-substring (point) (save-excursion (skip-chars-forward "A-Z0-9_") (point))) ".ssd01"))))) (defun sas-get-file-number () "Return name of dataset on current line." (interactive) (if (sas-move-to-filename) (progn (forward-word -1) (re-search-forward "[0-9]*") (string-to-number (buffer-substring (match-beginning 0) (match-end 0)))))) ;;(defun sas-contents () ;; "Run proc contents on current file." ;; (interactive) ;; (let ((buffer-read-only nil) (sas-get-options "linesize=70")) ;; (sas-get-dataset (sas-get-filename) 2 t t (buffer-name)) ;; (end-of-buffer) ;; (backward-page-top-of-window 1))) ;; ;;(defun sas-print () ;; "Run proc contents on current file." ;; (interactive) ;; (sas-get-dataset (sas-get-filename) 1 nil nil nil ;; (sas-create-var-string))) (defun sas-goto-page (arg) "Goto top of page ARG. If no ARG, then goto top of file." (interactive "P") (goto-char 1) (if arg (if (> arg 1) (progn (re-search-forward page-delimiter (point-max) 1 (1- arg))))) (skip-chars-forward sas-white-chars); was " \f\n" till 5.1.13 (recenter 1)) (defun forward-page-top-of-window (arg) "Move forward to page boundary and leave first line at top of window. With arg, repeat, or go back if negative. A page boundary is any line whose beginning matches the regexp `page-delimiter'." (interactive "p") (forward-page arg) (recenter 0)) (defun backward-page-top-of-window (arg) "Move backward to page boundary and leave first line at top of window. With arg, repeat, or go back if negative. A page boundary is any line whose beginning matches the regexp `page-delimiter'." (interactive "p") (forward-page (- arg)) (recenter 0)) (defun sas-narrow-to-page () (save-excursion (let* ((min (point-min)) (max (point-max))) ;;(omin (point-min)) ;;(omax (point-max))) (if (or (bolp) (beginning-of-line) (looking-at page-delimiter)) (forward-char 1) (forward-page -1)) (setq min (point)) (forward-page 1) (beginning-of-line) (setq max (point)) (narrow-to-region min max)))) (defun sas-forward-page-narrow (arg) "Move forward to page boundary and narrow to page. With arg, repeat, or go back if negative. A page boundary is any line whose beginning matches the regexp `page-delimiter'." (interactive "p") (widen) (forward-page arg) (sas-narrow-to-page) (goto-char (point-min))) (defun sas-backward-page-narrow (arg) "Move backward to page boundary and narrow to page. With arg, repeat, or go back if negative. A page boundary is any line whose beginning matches the regexp `page-delimiter'." (interactive "p") (goto-char (point-min)) (widen) (forward-page (- arg)) (sas-narrow-to-page)) (defun sas-goto-dataset (&optional page) (interactive) (and sas-directory-name (let ((page (or page (sas-get-file-number)))) ;;(dir sas-directory-name)) (if page (progn (switch-to-buffer-other-window (concat "*SAS-cont-" sas-directory-name)) (widen) (sas-goto-page page) (sas-narrow-to-page) (goto-char (point-min))))))) ;;(defun sas-mouse-goto-dataset (event) ;; (interactive "e") ;; (let (page buf) ;; (save-window-excursion ;; (save-excursion ;; (set-buffer (window-buffer (posn-window (event-end event)))) ;; (save-excursion ;; (goto-char (posn-point (event-end event))) ;; (setq page (sas-get-file-number))) ;; (sas-goto-dataset page) ;; (setq buf (buffer-name)))) ;; (set-buffer buf) ;; (goto-char (point-min)) ;; (display-buffer buf))) (defun sas-dir-goto-page (page) (interactive "p") (widen) (sas-goto-page page) (sas-narrow-to-page)) (defun sas-mark-item (&optional next) (interactive) (sas-move-to-filename) (beginning-of-line) (let ((buffer-read-only nil)) (if (re-search-forward "^\\( *[0-9]+ *\\) \\([A-Z][A-Z_0-9]*\\) " (save-excursion (end-of-line) (point)) t) (replace-match "\\1<\\2>"))) (or next (sas-next-line 1))) (defun sas-unmark-item () (interactive) (save-excursion (beginning-of-line) (let ((buffer-read-only nil)) (if (re-search-forward "^\\( *[0-9]+ *\\)<\\([A-Z][A-Z_0-9]*\\)>" (save-excursion (end-of-line) (point)) t) (replace-match "\\1 \\2 "))))) (defun sas-prev-line-undo (arg) (interactive "p") (sas-prev-line arg) (sas-unmark-item) (sas-move-to-filename)) (defun sas-create-var-string () (and (string-equal "*SAS-cont" (substring (buffer-name) 0 9)) (let (str) (goto-char (point-min)) (while (re-search-forward "^\\( *[0-9]+ *\\)<\\([A-Z][A-Z_0-9]*\\)>" nil t) (setq str (concat str " " (buffer-substring (match-beginning 2) (match-end 2))))) str))) (defun ess-imenu-SAS (&optional arg) "SAS language Imenu support for ESS." (interactive) (setq imenu-generic-expression '( (nil "[ \t\n=]\\([a-zA-Z_][a-zA-Z_0-9]*[.][a-zA-Z_][a-zA-Z_0-9]*\\)[ ,()\t\n;]" 1))) (imenu-add-to-menubar "SAS Datasets")) ;;(defun sas-revert-library () ;; "Update current library." ;; (interactive) ;; (if sas-directory-name ;; (sas-make-library sas-directory-name t))) (provide 'ess-sas-l) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sas-l.el ends here ess/lisp/ess-bugs-d.el0000664000175000017500000003327012423756516013206 0ustar eddedd;;; ess-bugs-d.el --- ESS[BUGS] dialect ;; Copyright (C) 2008-2011 Rodney Sparapani ;; Author: Rodney Sparapani ;; Created: 13 March 2008 ;; Maintainer: ESS-help ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: (require 'ess-bugs-l) (require 'ess-utils) (require 'ess-inf) (setq auto-mode-alist (append '(("\\.[bB][uU][gG]\\'" . ess-bugs-mode)) auto-mode-alist)) (defvar ess-bugs-command "OpenBUGS" "Default BUGS program in PATH.") (make-local-variable 'ess-bugs-command) (defvar ess-bugs-monitor '("") "Default list of variables to monitor.") (make-local-variable 'ess-bugs-monitor) (defvar ess-bugs-thin 1 "Default thinning parameter.") (make-local-variable 'ess-bugs-thin) (defvar ess-bugs-chains 1 "Default number of chains.") (make-local-variable 'ess-bugs-chains) (defvar ess-bugs-burnin 10000 "Default burn-in.") (make-local-variable 'ess-bugs-burnin) (defvar ess-bugs-update 10000 "Default number of updates after burnin.") (make-local-variable 'ess-bugs-update) (defvar ess-bugs-system nil "Default whether BUGS recognizes the system command.") (defvar ess-bugs-font-lock-keywords (list ;; .bug files (cons "#.*\n" font-lock-comment-face) (cons "^[ \t]*\\(model\\|var\\)\\>" font-lock-keyword-face) (cons (concat "\\ " ess-bugs-file-root ".bog 2>&1 " ;; ess-bugs-batch-post-command "' > " ess-bugs-file-root ".bsh") ;; (comint-send-input) ;; (insert "at -f " ess-bugs-file-root ".bsh now") ;; (comint-send-input) (insert "echo '" ess-bugs-batch-pre-command " " bugs-command " < " ess-bugs-file-root ".bmd > " ess-bugs-file-root ".bog 2>&1 " ess-bugs-batch-post-command "' | at now") (comint-send-input) )) (defun ess-bugs-na-bug () "ESS[BUGS]: Perform Next-Action for .bug" (if (equal 0 (buffer-size)) (ess-bugs-switch-to-suffix ".bug") ;else (ess-save-and-set-local-variables) (ess-bugs-switch-to-suffix ".bmd" ess-bugs-chains ess-bugs-monitor ess-bugs-thin ess-bugs-burnin ess-bugs-update)) ) (defun ess-bugs-mode () "ESS[BUGS]: Major mode for BUGS." (interactive) (kill-all-local-variables) (ess-setq-vars-local '((comment-start . "#"))) (setq major-mode 'ess-bugs-mode) (setq mode-name "ESS[BUGS]") (use-local-map ess-bugs-mode-map) (setq font-lock-auto-fontify t) (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(ess-bugs-font-lock-keywords nil t)) (setq ess-language "S") ; mimic S for ess-smart-underscore (run-hooks 'ess-bugs-mode-hook) (if (not (w32-shell-dos-semantics)) (add-hook 'comint-output-filter-functions 'ess-bugs-exit-notify-sh)) ) (setq features (delete 'ess-bugs-d features)) (provide 'ess-bugs-d) ;;; ess-bugs-d.el ends here ess/lisp/ess-r-a.el0000664000175000017500000001216712423756516012506 0ustar eddedd;;; ess-r-a.el -- Possible local customizations for R with ESS. ;; Copyright (C) 1997--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 17 November 1999 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; The purpose of this file is to demonstrate some of the extras that ;; have been constructed for the ESS R mode; if they prove ;; interesting, then they might be migrated to ess-r-d, the primary ;; ESS R mode tools. ;;; Code: ;; you can invoke ESS/R from emacs by typing ;; C-u M-x essr ;; with vsize set to (for example) 40M, and nsize set to 600000. (defalias 'essr (read-kbd-macro "C-u M-x R RET - - vsize = 40M SPC - - nsize = 600000 2*RET")) (defun ess-r-do-region (start end &optional message) "Send the current region to R via AppleScript." (interactive "r\nP") (message "Starting evaluation...") (do-applescript (concat "try\n" "tell application \"R\"\n" "activate\n" "with timeout of 0 seconds\n" "cmd \"" (buffer-substring start end) "\"\n" "end timeout\n" "end tell\n" "end try\n")) (message "Finished evaluation")) (defun ess-r-do-line () "Send the current line to R via AppleScript." (interactive) ;; "r\nP") (message "Starting evaluation...") (save-excursion (let ((end (point))) (move-to-column 0) (do-applescript (concat "try\n" "tell application \"R\"\n" "activate\n" "with timeout of 0 seconds\n" "cmd \"" (buffer-substring (point) end) "\"\n" "end timeout\n" "end tell\n" "end try\n")))) (message "Finished evaluation")) (defun ess-r-var (beg end) "Load the current region of numbers into an R variable. Prompts for a variable name. If none is given, it uses a default variable name, e. BEG and END denote the region in the current buffer to be sent." (interactive "r") (save-window-excursion (let ((tmp-file (make-temp-file "ess-r-var")) cmd var) (write-region beg end tmp-file) ;; Decide on the variable name to use in R; could use completion. (setq var (read-string "R Variable name (default e): ")) (if (equal var "") (setq var "e")) ;; Command to send to the R process. Get R to delete the file ;; rather than Emacs in case it takes R a long time to run the ;; scan command. (setq cmd (concat var " <- scan(\"" tmp-file "\"); " "unlink(\"" tmp-file "\")" )) ;; Put the output from the scan command into the process buffer so ;; the user has a record of it. (ess-execute cmd 'buffer)))) ;;; Peter Dalgaard's code. ;;; This needs to be cleaned and validated! (defun pd::set-up-demo () ;; (if (not xemacs) (set-default-font "*courier-bold-r*--14**")) (R) (split-window-vertically 6) (find-file "demos.R") ;; Don't need to run this as a function -- ought to be fine if set ;; just once. (defun ajr::scroll-to-end::peterD (emacs) "Goal: map prompt to bottom of the screen after every command. Alternatively, use the scroll-in-place package, not sure where that is)." (interactive) (other-buffer 1) (if (= emacs "emacs") (setq scroll-up-aggressively t) (setq scroll-conservatively -4)) ;; <- change this (other-buffer -1)) (defun show-max-other-window () (interactive) (other-window 1) (comint-show-maximum-output) (other-window -1)) ;; call this once ;; (ajr::scroll-to-end::peterD "xemacs") ;; (ajr::scroll-to-end::peterD "emacs") (global-set-key [f11] 'show-max-other-window) (global-set-key [f12] 'ess-eval-line-and-step)) ; Provide package (provide 'ess-r-a) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-r-a.el ends here ess/lisp/ess-sp3-d.el0000664000175000017500000000644212423756516012754 0ustar eddedd;;; ess-sp3-d.el --- S-PLUS 3.x customization ;; Copyright (C) 1997--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 12 Jun 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the S-PLUS 3.x customizations for ess-mode. ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (require 'ess-s-l) (defvar S+3-dialect-name "S+3" "Name of 'dialect' for S-PLUS 3.x.");easily changeable in a user's .emacs (defvar S+3-customize-alist (append '((ess-local-customize-alist . 'S+3-customize-alist) (ess-dialect . S+3-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-object-name-db-file . "ess-s+3-namedb.el" ) (inferior-ess-program . inferior-S+3-program-name) (inferior-ess-help-command . "help(\"%s\", pager=\"cat\", window=FALSE)\n") (inferior-ess-help-filetype . nil) (inferior-ess-search-list-command . "search()\n") (inferior-ess-start-file . nil) ;"~/.ess-S+3") (inferior-ess-start-args . "") (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for S+3.") (defun S+3 (&optional proc-name) "Call 'S-PLUS 3.x', the 'Real Thing' from StatSci." (interactive) (setq ess-customize-alist S+3-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+3): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start))) (defun S+3-mode (&optional proc-name) "Major mode for editing S+3 source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+3-customize-alist) (ess-mode S+3-customize-alist proc-name) (if ess-imenu-use-S (ess-imenu-S))) (defun S+3-transcript-mode () "S-PLUS 3.x transcript mode." (interactive) (ess-transcript-mode S+3-customize-alist)) ; Provide package (provide 'ess-sp3-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sp3-d.el ends here ess/lisp/ess-send2.el0000664000175000017500000000344412423756516013040 0ustar eddedd;;(defun ess-eval-string (string) "" body) ;;(defun ess-eval-string-popup (string) "" body) ;;(defun ess-eval-string-buffer (string) "" body) (defun ess-region-or-word-at-point () "If the region is active, return the contents of the region. If the region is not active, return the word-at-point." (interactive) (if mark-active (buffer-substring-no-properties (region-beginning) (region-end)) (word-at-point))) (defun ess-eval-expanded (&optional head tail commands-buffer) "Send the expanded region or word-at-point to the inferior-ess process after first concating the head and tail. If the region is active, the function uses the current region. If the region is not active, the function uses the word-at-point" (interactive) (if (not head) (setq head "summary(")) (if (not tail) (setq tail ")")) (if (not commands-buffer) (setq commands-buffer (get-buffer-create "tmp-buffer"))) (ess-command (concat head (ess-region-or-word-at-point) tail) commands-buffer)) (define-key ess-mode-map "\C-c\C-w" 'ess-eval-expanded) ;; (defun ess-expand-string (string &optional head tail) ;; "Expand the STRING by concating the HEAD and TAIL. ;; Default result is 'summary(string)'." ;; (interactive) ;; (if (not head) (setq head "summary(")) ;; (if (not tail) (setq tail ")")) ;; (concat head string tail)) ;; Write a popup Edit-data-menubar that will allow attributes and components ;; to be displayed. ;; ;; popup menu items: ;; summary ;; print ;; show ;; help ;; dump to buffer ;; Edit.data (with optional location: window/buffer/frame) ;; drilldown ;; place in quotes (needed to get help on "[[" for example) ;; browser on ;; browser off ;; browser popup menu ;; add your own item to this menu ess/lisp/ess-mode.el0000664000175000017500000013352612632537307012753 0ustar eddedd;;; ess-mode.el --- Support for editing ESS source code ;; Copyright (C) 1989-1994 Doug Bates, Ed Kademan, Frank Ritter, David Smith. ;; Copyright (C) 1997--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; Author: David Smith ;; Created: 7 Jan 1994 ;; Maintainer: ESS-core ;; Package-Requires: ((julia-mode "0.3")) ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for editing ESS source code. ;;; Code: (require 'cl) (autoload 'ess-turn-on-eldoc "ess-r-d" "" nil) ;; (autoload 'ess-ddeclient-p "ess-inf" "(autoload)" nil) (autoload 'ess-dump-object-ddeclient "ess-dde" "(autoload)" nil) (autoload 'SAS "ess-sas-d.el" "(autoload)" t) (require 'ess-utils) (defun ess-line-end-position (&optional N) "return the 'point' at the end of N lines. N defaults to 1, i.e., current line." (save-excursion (end-of-line N) (point))) ;;; ESS mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; In this section: ;;;; ;;;; * The major mode ess-mode ;;;; * Commands for ess-mode ;;;; * Code evaluation commands ;;;; * Indenting code and commands ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;*;; Major mode definition (defvar ess-mode-map (let ((map (make-sparse-keymap))) ;; By popular demand: (define-key map "\C-m" 'newline-and-indent); = [RETURN] (define-key map [remap yank] 'ess-yank) (define-key map "\C-c\C-r" 'ess-eval-region) (define-key map "\C-c\M-r" 'ess-eval-region-and-go) (define-key map "\C-c\C-b" 'ess-eval-buffer) (define-key map "\C-c\M-b" 'ess-eval-buffer-and-go) (define-key map (kbd "C-c C-") 'ess-eval-buffer-from-beg-to-here) (define-key map (kbd "C-c C-") 'ess-eval-buffer-from-here-to-end) (define-key map "\C-c\C-f" 'ess-eval-function) (define-key map "\C-c\M-f" 'ess-eval-function-and-go) (define-key map "\C-c\C-c" 'ess-eval-region-or-function-or-paragraph-and-step) (define-key map "\C-c\C-p" 'ess-eval-paragraph-and-step) (define-key map "\C-c\M-p" 'ess-eval-paragraph-and-go) (define-key map "\C-\M-x" 'ess-eval-region-or-function-or-paragraph) (define-key map "\C-c\C-n" 'ess-eval-line-and-step) (define-key map "\C-c\C-j" 'ess-eval-line) (define-key map [(control return)] 'ess-eval-region-or-line-and-step) (define-key map "\C-c\M-j" 'ess-eval-line-and-go) ;; the next three can only work in S/R - mode {FIXME} (define-key map "\C-\M-a" 'ess-goto-beginning-of-function-or-para) (define-key map "\C-\M-e" 'ess-goto-end-of-function-or-para) (define-key map "\C-xnd" 'ess-narrow-to-defun-or-para) (define-key map "\C-xnf" 'ess-narrow-to-defun-or-para) (define-key map "\C-c\C-y" 'ess-switch-to-ESS-deprecated) (define-key map "\C-c\C-z" 'ess-switch-to-inferior-or-script-buffer) (define-key map "\C-c\C-l" 'ess-load-file) (define-key map "\C-c\M-l" 'ess-load-file); alias, as in 'iESS' where C-c C-l is comint-list-* (define-key map "\C-c\C-v" 'ess-display-help-on-object) ;;(define-key map "\C-c5\C-d"'ess-dump-object-into-edit-buffer-other-frame) (define-key map "\C-c\C-s" 'ess-switch-process) ; use a ;; different process for the buffer. ;; (define-key map "\C-c\C-t" 'ess-execute-in-tb) (define-key map "\C-c\t" 'ess-complete-object-name-deprecated) ;;M (define-key map "\C-c\t" 'comint-dynamic-complete-filename) (unless (and (featurep 'emacs) (>= emacs-major-version 24)) (define-key map "\M-\t" 'comint-dynamic-complete)) (define-key map "\M-?" 'ess-list-object-completions) ;; wrong here (define-key map "\C-c\C-k" 'ess-request-a-process) (define-key map "\C-c\C-k" 'ess-force-buffer-current) (define-key map "\C-c`" 'ess-show-traceback) (define-key map [(control ?c) ?~] 'ess-show-call-stack) (define-key map "\C-c." (lambda () (interactive) (message "ess-set-style moved to C-c C-e C-s. Sorry for the inconvenience"))) (define-key map "{" 'ess-electric-brace) (define-key map "}" 'ess-electric-brace) (define-key map "\C-\M-q" 'ess-indent-exp) (define-key map "\C-\M-h" 'ess-mark-function-or-para) (if (featurep 'xemacs) ;; work around Xemacs bug (\C-\M-h redefines M-BS): (define-key map [(meta backspace)] 'backward-kill-word)) ;;(define-key map [delete] 'backward-delete-char-untabify) (define-key map "\t" 'ess-indent-or-complete) (define-key map "\C-c\C-q" 'ess-quit) (define-key map "\M-\r" 'ess-use-this-dir) ;; smart operators; most likely will go in the future into a separate local map (define-key map "," 'ess-smart-comma) (define-key map "\C-c\C-d" 'ess-doc-map) (define-key map "\C-c\C-e" 'ess-extra-map) (define-key map "\C-c\C-t" 'ess-dev-map) map) "Keymap for `ess-mode'.") ;; Redefine substituted commands (substitute-key-definition 'newline-and-indent 'ess-newline-and-indent ess-mode-map global-map) (substitute-key-definition 'indent-new-comment-line 'ess-indent-new-comment-line ess-mode-map global-map) (defvar ess-eval-map (let ((map (make-sparse-keymap))) ;; (define-key map "\C-r" 'ess-eval-region) ;; (define-key map "\M-r" 'ess-eval-region-and-go) ;; (define-key map "\C-b" 'ess-eval-buffer) ;; (define-key map "\M-b" 'ess-eval-buffer-and-go) ;; (define-key map "\C-f" 'ess-eval-function) ;; (define-key map "\M-f" 'ess-eval-function-and-go) ;; (define-key map "\C-x" 'ess-eval-function) ;; (define-key map "\C-n" 'ess-eval-line-and-step) ;; (define-key map "\C-j" 'ess-eval-line) ;; (define-key map "\M-j" 'ess-eval-line-and-go) map) "Keymap for ess-eval functions.") (make-obsolete-variable 'ess-eval-map nil "ESS[12.09.1]") (defvar ess-extra-map (let (ess-extra-map) (define-prefix-command 'ess-extra-map) (define-key ess-extra-map "\C-d" 'ess-dump-object-into-edit-buffer) (define-key ess-extra-map "d" 'ess-dump-object-into-edit-buffer) (define-key ess-extra-map "\C-e" 'ess-execute) (define-key ess-extra-map "e" 'ess-execute) (define-key ess-extra-map "\C-i" 'ess-install-library) (define-key ess-extra-map "i" 'ess-install-library) (define-key ess-extra-map "\C-l" 'ess-load-library) (define-key ess-extra-map "l" 'ess-load-library) (define-key ess-extra-map "\C-s" 'ess-set-style) (define-key ess-extra-map "s" 'ess-set-style) (define-key ess-extra-map "\C-t" 'ess-build-tags-for-directory) (define-key ess-extra-map "t" 'ess-build-tags-for-directory) (define-key ess-extra-map "\C-w" 'ess-execute-screen-options) (define-key ess-extra-map "w" 'ess-execute-screen-options) (define-key ess-extra-map "/" 'ess-set-working-directory) ess-extra-map) "ESS extra map") (require 'ess-noweb-mode) (easy-menu-define ess-mode-menu ess-mode-map "Menu for use in `ess-mode'." '("ESS" ; ESS-mode ["What is this? (beta)" ess-mouse-me t] ["Load file" ess-load-file t] ["Eval region | func | para" ess-eval-region-or-function-or-paragraph t] ["Eval region | func | para & step" ess-eval-region-or-function-or-paragraph-and-step t] ["Eval region | line" ess-eval-region-or-line-and-step t] ["Enter expression" ess-execute t] ;; sub menus "------" ("Process" ["Goto end of process buffer" ess-switch-to-end-of-ESS t] ["Switch to process buffer" ess-switch-to-inferior-or-script-buffer t] ["Switch Process" ess-switch-process t] ["Recreate R and S versions known to ESS" (ess-r-s-versions-creation+menu) t] ("Start Process" ;; SJE - :help not yet recognised in XEmacs. ["R" R t] ;; :help "Start a new R process" :active t ["S" S t] ;; :help "Start a new S process" :active t ["Sqpe" Sqpe ess-microsoft-p] ;; :help "Start a new Sqpe process" :active t ["S+6-exisiting" S+6-existing ess-microsoft-p] ;; :help "Access an existing S process" :active t ["SAS" SAS-menu t] ;; :help "Start a new SAS process" :active t ;; The following menu item "Other" is a place-holder that will ;; be replaced with the other versions of R and Sqpe that can be run. ;; See `ess-r-versions-create' and ess-site.el ("Other" ["No other R or Sqpe versions" nil nil]) ["About" (ess-goto-info "Starting up") t] ;; :help "Read about starting a new ESS process" :active t] ) ("Eval visibly " :filter ess--generate-eval-visibly-submenu)) "------" ("ESS Eval" ["Eval region | func | para" ess-eval-region-or-function-or-paragraph t] ["Eval region | func | para & step" ess-eval-region-or-function-or-paragraph-and-step t] ["Eval region | line" ess-eval-region-or-line-and-step t] "-----" ["Eval buffer" ess-eval-buffer t] ["Eval buffer till here" ess-eval-buffer-from-beg-to-here t] ["Eval buffer from here" ess-eval-buffer-from-here-to-end t] ["Eval region" ess-eval-region t] ["Eval function" ess-eval-function t] ["Eval line" ess-eval-line t] ["Eval line & step" ess-eval-line-and-step t] ["Eval paragraph" ess-eval-paragraph t] ["Eval paragraph & step" ess-eval-paragraph-and-step t] ["Eval chunk" ess-eval-chunk ess-noweb-mode] ["Eval chunk and step" ess-eval-chunk-and-step ess-noweb-mode] ["Eval thread" ess-eval-thread ess-noweb-mode] ["About" (ess-goto-info "Evaluating code") t] ) ("Eval and Go" ["Eval buffer" ess-eval-buffer-and-go t] ["Eval region" ess-eval-region-and-go t] ["Eval function" ess-eval-function-and-go t] ["Eval line" ess-eval-line-and-go t] ["Eval paragraph" ess-eval-paragraph-and-go t] ["Eval chunk" ess-eval-chunk-and-go ess-noweb-mode] ["Eval thread" ess-eval-thread-and-go ess-noweb-mode] ["About" (ess-goto-info "Evaluating code") t] ) ("Motion" ["Beginning of function or para" ess-goto-beginning-of-function-or-para t] ["End of function or para" ess-goto-end-of-function-or-para t] "-----" ["Backward list" backward-list t] ["Forward list" forward-list t] ["Next parenthesis" down-list t] ["Enclosing parenthesis" backward-up-list t] ["Backward sexp" backward-sexp t] ["Forward sexp" forward-sexp t] ["About" (Info-goto-node "(Emacs)Lists") t] ) ("ESS Edit" ["Edit new object" ess-dump-object-into-edit-buffer t] ["Complete Filename" comint-replace-by-expanded-filename t] ["Complete File or Object" ess-indent-or-complete t] ["Kill sexp" kill-sexp t] ["Mark function" ess-mark-function-or-para t] ["Indent expression" ess-indent-exp t] ["Indent line" ess-indent-command t] ["Toggle Auto-Fill Mode" auto-fill-mode t] ["Undo" undo t] ["About" (ess-goto-info "Edit buffer") t] ) "------" ("start-dev" :visible nil) ("end-dev" :visible nil) "------" ("Font Lock" :active ess-font-lock-keywords :filter ess--generate-font-lock-submenu) "------" ["Describe" describe-mode t] ["About editing" (ess-goto-info "Editing") t] ["Read ESS info" (ess-goto-info "") t] ["Send bug report" ess-submit-bug-report t] )) ;; (defun test-gen-menu (men) ;; '( ;; ["About editing" (ess-goto-info "Editing") t] ;; ["Read ESS info" (ess-goto-info "") t] ;; ["Send bug report" ess-submit-bug-report t])) (defun SAS-menu () "Start SAS from the menu." (interactive) (if ess-microsoft-p ;; replace with other choices for starting SAS under XEmacs? (error "SAS cannot be started this way in ESS on Windows.") (SAS))) (defun ess-mode-xemacs-menu () "Hook to install `ess-mode' menu for XEmacs (w/ easymenu)." (if 'ess-mode (easy-menu-add ess-mode-menu) (easy-menu-remove ess-mode-menu))) (if (featurep 'xemacs) (add-hook 'ess-mode-hook 'ess-mode-xemacs-menu)) (defun ess-mode (&optional alist proc-name is-derived) "Major mode for editing ESS source. Optional arg ALIST describes how to customize the editing mode. Optional arg PROC-NAME is name of associated inferior process. \\{ess-mode-map} Extra binding to note: 'ESC C-\\' indent-region. Entry to this mode runs the hooks in ess-mode-hook. You can send text to the inferior ESS process from other buffers containing ESS source. `ess-eval-region' sends the current region to the ESS process. `ess-eval-buffer' sends the current buffer to the ESS process. `ess-eval-function' sends the current function to the ESS process. `ess-eval-line' sends the current line to the ESS process. `ess-beginning-of-function' and `ess-end-of-function' move the point to the beginning and end of the current ESS function. `ess-switch-to-ESS' switches the current buffer to the ESS process buffer. `ess-switch-to-end-of-ESS' switches the current buffer to the ESS process buffer and puts point at the end of it. `ess-eval-region-and-go', `ess-eval-buffer-and-go', `ess-eval-function-and-go', and `ess-eval-line-and-go' switch to the S process buffer after sending their text. `ess-load-file' sources a file of commands to the ESS process. \\[ess-indent-command] indents for ESS code. \\[backward-delete-char-untabify] converts tabs to spaces as it moves back. Comments are indented in a similar way to Emacs-lisp mode: `###' beginning of line `##' the same level of indentation as the code `#' the same column on the right, or to the right of such a column if that is not possible.(default value 40). \\[indent-for-comment] command automatically inserts such a `#' in the right place, or aligns such a comment if it is already inserted. \\[ess-indent-exp] command indents each line of the syntactic unit following point. Variables controlling indentation style: `ess-tab-always-indent' Non-nil means TAB in ESS mode should always reindent the current line, regardless of where in the line point is when the TAB command is used. `ess-auto-newline' Non-nil means automatically newline before and after braces inserted in S code. `ess-indent-offset' Indentation of ESS statements within surrounding block. The surrounding block's indentation is the indentation of the line on which the open-brace appears. `ess-offset-block' Indentation of blocks opened with curly braces or anonymous parentheses. `ess-offset-arguments' Indentation of function arguments or bracket indices. `ess-offset-arguments-newline' Indentation of function arguments or bracket indices when the opening delimiter is immediately followed by a newline. `ess-offset-continued' Indentation style for continued statements. `ess-align-nested-calls' Functions whose nested calls should be aligned. `ess-align-arguments-in-calls' Calls in which arguments should be aligned. `ess-align-continuations-in-calls' Whether ignore indentation after an operator in calls `ess-align-blocks' Blocks that should always be aligned vertically. `ess-indent-from-lhs' Whether function calls given as argument should be indented from the parameter name. `ess-indent-from-chain-start' Whether to indent arguments from the first of several consecutive calls. `ess-indent-with-fancy-comments' Non-nil means distinguish between #, ##, and ### for indentation. Furthermore, \\[ess-set-style] command enables you to set up predefined ess-mode indentation style. At present, predefined style are `BSD', `GNU', `K&R', `C++', `CLB' (quoted from C language style)." (setq alist (or alist (buffer-local-value 'ess-local-customize-alist (current-buffer)) (error "Customise alist is not specified, nor ess-local-customize-alist is set."))) (unless is-derived (kill-all-local-variables)) ;; NOTICE THIS! *** NOTICE THIS! *** NOTICE THIS! *** (ess-setq-vars-local alist) ;; must happen here, since the mode map is set up too early: (if ess-r-args-electric-paren (define-key ess-mode-map "(" 'ess-r-args-auto-show)) (ess-write-to-dribble-buffer (format "(ess-mode-1): ess-language=%s, ess-dialect=%s buf=%s \n" ess-language ess-dialect (current-buffer))) ;; (ess-write-to-dribble-buffer ;; (format "(ess-mode-1.2): ess-process=%s \n" ;; (ess-local-process-name ess-local-process-name "none"))) (ess-write-to-dribble-buffer (format "(ess-mode-1.5): alist=%s \n" alist)) (unless is-derived (setq major-mode 'ess-mode) (setq mode-name (concat "ESS[" ess-language "]"))) ; was ess-dialect ;; The following line does the next 20 or so :-). (ess-write-to-dribble-buffer (format "(ess-mode-1.6): editing-alist=%s \n" ess-mode-editing-alist)) (ess-setq-vars-local ess-mode-editing-alist) (ess-set-style ess-style t) (use-local-map ess-mode-map) (when ess-mode-syntax-table (set-syntax-table ess-mode-syntax-table)) ;; Keep out of the code. (make-local-variable 'indent-tabs-mode) (setq indent-tabs-mode nil) (put 'ess-local-process-name 'permanent-local t) ; protect from RCS (setq mode-line-process '(" [" (:eval (ess--get-mode-line-indicator)) ess--local-mode-line-process-indicator "]")) ;; completion (if (and (featurep 'emacs) (>= emacs-major-version 24)) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (add-hook 'comint-dynamic-complete-functions 'ess-complete-filename nil 'local) (delq t comint-dynamic-complete-functions) ) (set (make-local-variable 'comint-completion-addsuffix) (cons "/" "")) ;; timer (add-hook 'ess-idle-timer-functions 'ess-synchronize-dirs nil 'local) ;;; extras (ess-load-extras) ;; SJE Tue 28 Dec 2004: do not attempt to load object name db. ;; (ess-load-object-name-db-file) (if (> emacs-major-version 21) (run-mode-hooks 'ess-mode-hook) ;; old emacs 21.x (run-hooks 'ess-mode-hook)) (ess-write-to-dribble-buffer "\nFinished setting up ESS-mode.\n")) (defun ess--get-mode-line-indicator () "Get `ess--mode-line-process-indicator' from process buffer. Internal function to be used for dynamic mode-line dysplay in ess-mode." (if ess-local-process-name (let* ((proc (get-process ess-local-process-name)) (buff (when proc (process-buffer proc)))) (if (and proc (buffer-live-p buff)) (with-current-buffer buff (mapcar 'eval ess--mode-line-process-indicator)) "none")) "none")) ;;*;; User commands in ess-mode ;;;*;;; Handy commands (defun ess-execute-in-tb () "Like `ess-execute', but always evaluates in temp buffer." (interactive) (let ((ess-execute-in-process-buffer nil)) (call-interactively 'ess-execute))) (defun ess-goto-line (line) (save-restriction (widen) (goto-char (point-min)) (forward-line (1- line)))) (defun ess-containing-sexp-position () (cadr (syntax-ppss))) (defun ess-code-end-position () "Like (line-end-position) but stops at comments" (save-excursion (or (and (re-search-forward "#" (line-end-position) t) (match-beginning 0)) (line-end-position)))) ;;;*;;; Buffer motion/manipulation commands (defvar ess-set-function-start ;; setAs, setGeneric; setMethod, setReplaceMethod, setGroupMethod "^set[MGAR][Ma-z]+\\s-?(" ) ;; common R and S ;; SJE: 2007-07-16 add to quieten byte-compiler. (defvar ess-function-pattern nil "Regexp to match the beginning of a function in S buffers.") (defvar ess-R-symbol-pattern "\\(\\sw\\|\\s_\\)" "The regular expression for matching an R symbol") (defvar ess-R-name-pattern (concat "\\(" ess-R-symbol-pattern "+\\|\\(`\\).+`\\)") "The regular expression for matching a R name.") (let* ((Q "\\s\"") ; quote (repl "\\(<-\\)?") ; replacement (function) (Sym-0 "\\(\\sw\\|\\s_\\)") ; symbol (Symb (concat Sym-0 "+")) (xSymb "[^ \t\n\"']+") ;; (concat "\\[?\\[?" Sym-0 "*")); symbol / [ / [[ / [symbol / [[symbol ;; FIXME: allow '%foo%' but only when quoted; don't allow [_0-9] at beg. (_or_ "\\)\\|\\(") ; OR (space "\\(\\s-\\|\n\\)*") ; white space (part-1 (concat "\\(" ;;--------outer Either------- "\\(\\(" ; EITHER Q xSymb Q ; any function name between quotes _or_ "\\(^\\|[ ]\\)" Symb ; (beginning of name) + ess-R-symbol-pattern "\\)\\)")) ; END EITHER OR (set-S4-exp (concat "^set\\(As\\|Method\\|Generic\\|GroupMethod\\|ReplaceMethod\\)(" ; S4 ... Q xSymb Q "," space ;; and now often `` signature(......), : '' ".*" ;; <<< FIXME ??? )) (part-2 (concat "\\|" ;;--------outer Or --------- set-S4-exp "\\)" ;;--------end outer Either/Or------- "\\(" space "\\s<.*\\s>\\)*" ; whitespace, comment ;; FIXME: in principle we should skip 'definition *= *' here space "function\\s-*(" ; whitespace, function keyword, parenthesis )) ) (defvar ess-R-function-pattern (concat part-1 "\\s-*\\(<-\\|=\\)" ; whitespace, assign part-2) "The regular expression for matching the beginning of an R function.") (defvar ess-S-function-pattern (concat part-1 "\\s-*\\(<-\\|_\\|=\\)" ; whitespace, assign (incl. "_") part-2) "The regular expression for matching the beginning of an S function.") ); {end let} (defun ess-beginning-of-function (&optional no-error) "Leave (and return) the point at the beginning of the current ESS function. If the optional argument NO-ERROR is non-nil, the function returns nil when it cannot find a function beginning." ;; FIXME: should not throw error in accordance with beginning-of-defun and ;; beginning-of-defun-function specification (interactive) (let ((init-point (point)) (in-set-S4 nil) beg end done) ;; Note that we must be sure that we are past the 'function (' text, ;; such that ess-function-pattern is found in BACKwards later. ;; In case we're sitting in a function or setMethod() header, ;; we need to move further. ;; But not too far! {wrongly getting into next function} (if (search-forward "(" (ess-line-end-position 2) t) ; at most end of next line (forward-char 1)) ;; TODO: replace the above by hopefully more sucessful logic: ;; 1. If we have 'function *(' in the same line, move to end of that line ;; 2. if *not*, skip all comment lines (concat space comment-char .* "\n") ;; and only* then do something like the ;; (search-forward '(' .. (..line-end.. 2) ) above (setq end (point)) ; = init-point when nothing found (ess-write-to-dribble-buffer (format "ess-BEG-of-fun after 'search-FWD (': Ini-pt %d, (p)-Ini-pt = %d\n" init-point (- end init-point))) (if (and (> end 1) (re-search-backward ;; in case of setMethod() etc .. ess-set-function-start ;; at most 1 line earlier {2 is too much: finds previous sometimes} (+ 1 (ess-line-end-position -1)) t)) (progn ;; yes we *have* an S4 setMethod(..)-like (setq in-set-S4 t beg (point)) (ess-write-to-dribble-buffer (format " set*() function start at position %d" beg)) ;; often need to move even further to have 'function(' to our left ;; (if (search-forward "function" end t) ;; (ess-write-to-dribble-buffer ;; (format " -> 'function' already at pos %d\n" (point))) ;; ;; else need to move further (goto-char end) ;; search 4 lines, we are pretty sure now: (search-forward "function" (ess-line-end-position 4) t) ;; ) (search-forward "(" (ess-line-end-position) t)) ;; else: regular function; no set*Method(..) (ess-write-to-dribble-buffer "ELSE not in setMethod() header ...\n")) (while (not done) ;; Need this while loop to skip over local function definitions ;; In the case of non-success, it is inefficiently ;; going back in the buffer through all function definitions... (unless (and (re-search-backward ess-function-pattern (point-min) t) (not (ess-inside-string-or-comment-p (point)))) (goto-char init-point) (if no-error (setq done t beg nil) ;; else [default]: (error "Point is not in a function according to 'ess-function-pattern'."))) (unless done (setq beg (point)) (ess-write-to-dribble-buffer (format "\tMatch,Pt:(%d,%d),%d\n" (match-beginning 0) (match-end 0) beg)) (setq in-set-S4 (looking-at ess-set-function-start)) (forward-list 1) ; get over arguments ;; The following used to bomb "Unbalanced parentheses", n1, n2 ;; when the above (search-forward "(" ..) wasn't delimited : (unless in-set-S4 (forward-sexp 1)) ; move over braces ;;DBG (ess-write-to-dribble-buffer "|") (setq end (point)) (goto-char beg) ;; current function must begin and end around point (setq done (and (>= end init-point) (<= beg init-point))))) beg)) (defun ess-end-of-function (&optional beginning no-error) "Leave the point at the end of the current ESS function. Optional argument for location of beginning. Return '(beg end)." (interactive) (if beginning (goto-char beginning) (setq beginning (ess-beginning-of-function no-error))) (if beginning ;; *hack* only for S (R || S+): are we in setMethod(..) etc? (let ((in-set-S4 (looking-at ess-set-function-start)) (end-pos) (npos)) (ess-write-to-dribble-buffer (format "ess-END-of-fun: S4=%s, beginning = %d\n" in-set-S4 beginning)) (forward-list 1) ; get over arguments || whole set*(..) (unless in-set-S4 (forward-sexp 1)) ; move over braces (ess-write-to-dribble-buffer (format "ess-END-of-fun: found #1 : %d\n" (point))) ;; For one-line functions withOUT '{ .. }' body -- added 2008-07-23 -- ;; particularly helpful for C-c C-c (ess-eval-function-or-paragraph-and-step): (setq end-pos (ess-line-end-position)) (while (< (point) end-pos) ; if not at end of line, move further forward (goto-char ;; careful not to move too far; e.g. *not* over empty lines: (min (save-excursion (forward-sexp 1) (point)) (save-excursion (forward-paragraph 1) (point))))) (list beginning (point))) ;; else: 'no-error': we are not in a function nil)) (defun ess-goto-beginning-of-function-or-para () "If inside a function go to the beginning of it, otherwise go to the beginning of paragraph." (interactive) (or (ess-beginning-of-function 'no-error) (backward-paragraph)) (point)) (defun ess-goto-end-of-function-or-para () "If inside a function go to end of it, otherwise go to the end of paragraph." (interactive) (or (ess-end-of-function nil 'no-error) (forward-paragraph)) (point)) (defun ess-mark-function-or-para () "Put mark at end of ESS function, point at beginning." (interactive) (ess-goto-beginning-of-function-or-para) (push-mark (point)) (ess-goto-end-of-function-or-para) (exchange-point-and-mark)) (define-obsolete-function-alias 'ess-mark-function 'ess-mark-function-or-para "15.09") (defun ess-narrow-to-defun-or-para () "Make text outside current function invisible. If text is already narrowed, this is removed before narrowing to the current function." (interactive) ;; if point is not in a function, ess-end-of-function catches the error. (save-excursion (widen) (let* ((beg (ess-goto-beginning-of-function-or-para)) (end (ess-goto-end-of-function-or-para))) (narrow-to-region beg end)))) (define-obsolete-function-alias 'ess-narrow-to-defun 'ess-narrow-to-defun-or-para "15.09") (defun ess-newline-and-indent () (interactive) (cond ((string= ess-dialect "R") (ess-roxy-newline-and-indent)) (t (newline-and-indent)))) (defun ess-indent-new-comment-line () (interactive) (cond ((string= ess-dialect "R") (ess-roxy-indent-new-comment-line)) (t (indent-new-comment-line)))) ;;*;; Loading files (defun ess-check-modifications nil "Check whether loading this file would overwrite some ESS objects which have been modified more recently than this file, and confirm if this is the case." ;; FIXME: this should really cycle through all top-level assignments in ;; the buffer ;;VS[02-04-2012|ESS 12.03]: this is sooo ugly (when (> (length ess-change-sp-regexp) 0) (and (buffer-file-name) ess-filenames-map (let ((sourcemod (nth 5 (file-attributes (buffer-file-name)))) (objname)) (save-excursion (goto-char (point-min)) ;; Get name of assigned object, if we can find it (setq objname (and (re-search-forward "^\\s *\"?\\(\\(\\sw\\|\\s_\\)+\\)\"?\\s *[<_]" nil t) (buffer-substring (match-beginning 1) (match-end 1))))) (and sourcemod ; the file may have been deleted objname ; may not have been able to ; find name (ess-modtime-gt (ess-object-modtime objname) sourcemod) (not (y-or-n-p (format "The ESS object %s is newer than this file. Continue?" objname))) (error "Aborted")))))) (defun ess-check-source (fname) "If file FNAME has an unsaved buffer, offer to save it. Returns t if the buffer existed and was modified, but was not saved." (let ((buff (get-file-buffer fname))) ;; RMH: Corrections noted below are needed for C-c C-l to work ;; correctly when issued from *S* buffer. ;; The following barfs since ;; 1. `if' does not accept a buffer argument, `not' does. ;; 2. (buffer-file-name) is not necessarily defined for *S* ;;(if buff ;; (let ((deleted (not (file-exists-p (buffer-file-name))))) ;; Next 2 lines are RMH's solution: (if (not(not buff)) (let ((deleted (not (file-exists-p fname)))) (if (and deleted (not (buffer-modified-p buff))) ;; Buffer has been silently deleted, so silently save (with-current-buffer buff (set-buffer-modified-p t) (save-buffer)) (if (and (buffer-modified-p buff) (or ess-mode-silently-save (y-or-n-p (format "Save buffer %s first? " (buffer-name buff))))) (with-current-buffer buff (save-buffer)))) (buffer-modified-p buff))))) (defvar ess-error-regexp "^\\(Syntax error: .*\\) at line \\([0-9]*\\), file \\(.*\\)$" "Regexp to search for errors.") (defun ess-parse-errors (&optional showerr reset) "Jump to error in last loaded ESS source file. With prefix argument, only shows the errors ESS reported." ;; reset argument is for compatibility with emacs next-error (tracebug ;; rebinds ess-parse-errors to next-error), This silences the compiler. (interactive "P") (ess-make-buffer-current) (let ((errbuff (get-buffer ess-error-buffer-name))) (if (not errbuff) (error "You need to do a load first!") (set-buffer errbuff) (goto-char (point-max)) (if (re-search-backward ;; FIXME: R does not give "useful" error messages - ;; ----- by default: We (ESS) could try to use a more useful one, via ;; options(error=essErrorHandler) ess-error-regexp nil t) (let* ((filename (buffer-substring (match-beginning 3) (match-end 3))) (fbuffer (get-file-buffer filename)) (linenum (string-to-number (buffer-substring (match-beginning 2) (match-end 2)))) (errmess (buffer-substring (match-beginning 1) (match-end 1)))) (if showerr (ess-display-temp-buffer errbuff) (if fbuffer nil (setq fbuffer (find-file-noselect filename)) (with-current-buffer fbuffer (ess-mode))) (pop-to-buffer fbuffer) (ess-goto-line linenum)) (princ errmess t)) (message "Not a syntax error.") (ess-display-temp-buffer errbuff))))) ;;*;; ESS code formatting/indentation ;;;*;;; User commands (defun ess-electric-brace (arg) "Insert character and correct line's indentation." (interactive "P") ;; skeleton-pair takes precedence (if (and (boundp 'skeleton-pair) skeleton-pair (featurep 'skeleton)) (skeleton-pair-insert-maybe "{") ;; else (let (insertpos) (if (and (not arg) (eolp) (or (save-excursion (skip-chars-backward " \t") (bolp)) (if ess-auto-newline (progn (ess-indent-line) (newline) t) nil))) (progn (insert (if (featurep 'xemacs) (event-to-character last-command-event) last-command-event)) (ess-indent-line) (if ess-auto-newline (progn (newline) ;; (newline) may have done auto-fill (setq insertpos (- (point) 2)) (ess-indent-line))) (save-excursion (if insertpos (goto-char (1+ insertpos))) (delete-char -1)))) (if insertpos (save-excursion (goto-char insertpos) (self-insert-command (prefix-numeric-value arg))) (self-insert-command (prefix-numeric-value arg)))))) ;; fixeme: move into ess-indent-or-complete, indentation functions are overly ;; scattered around (defun ess-indent-command (&optional whole-exp) "Indent current line as ESS code, or in some cases insert a tab character. If `ess-tab-always-indent' is non-nil (the default), always indent current line. Otherwise, indent the current line only if point is at the left margin or in the line's indentation; otherwise insert a tab. A numeric argument, regardless of its value, means indent rigidly all the lines of the expression starting after point so that this line becomes properly indented. The relative indentation among the lines of the expression are preserved." (interactive "P") (if whole-exp ;; If arg, always indent this line as S ;; and shift remaining lines of expression the same amount. (let ((shift-amt (ess-indent-line)) beg end) (save-excursion (if ess-tab-always-indent (beginning-of-line)) (setq beg (point)) (backward-up-list 1) (forward-list 1) (setq end (point)) (goto-char beg) (forward-line 1) (setq beg (point))) (if (> end beg) (indent-code-rigidly beg end shift-amt))) (if (and (not ess-tab-always-indent) (save-excursion (skip-chars-backward " \t") (not (bolp)))) (insert-tab) ;; call ess-indent-line (funcall indent-line-function)))) (defun ess-indent-or-complete () "When region is selected indent the region, otherwise, if `ess-tab-complete-in-script' is non-nil, try to indent, if code is already indented, complete instead. The default of `ess-tab-complete-in-script' is nil. Also see `ess-first-tab-never-complete'." (interactive) (if (use-region-p) (indent-region (region-beginning) (region-end)) (let ((shift (ess-indent-command))) (when (and ess-tab-complete-in-script (numberp shift) ;; can be nil if ess-tab-always-indent is nil (equal shift 0) (or (eq last-command 'ess-indent-or-complete) (null ess-first-tab-never-complete) (and (eq ess-first-tab-never-complete 'unless-eol) (looking-at "\\s-*$")) (and (eq ess-first-tab-never-complete 'symbol) (not (looking-at "\\w\\|\\s_"))) (and (eq ess-first-tab-never-complete 'symbol-or-paren) (not (looking-at "\\w\\|\\s_\\|\\s)"))) (and (eq ess-first-tab-never-complete 'symbol-or-paren-or-punct) (not (looking-at "\\w\\|\\s_\\|\\s)\\|\\s."))) )) (if (and (featurep 'emacs) (>= emacs-major-version 24)) (completion-at-point) (comint-dynamic-complete) ))))) (defun ess-indent-exp () "Indent each line of the ESS grouping following point." (interactive) (cond ((string= ess-dialect "R") (ess-r-indent-exp)) (t (save-excursion (if (fboundp ess-indent-exp-function) (funcall ess-indent-exp-function) (let ((start (point)) (end (ignore-errors (forward-sexp 1) (point)))) (when end (indent-region start end)))))))) (defun ess-indent-line () "Indent current line as ESS code. Return the amount the indentation changed by." ;; fixme: make this work with standard indent-line-function (if (fboundp ess-indent-line-function) (funcall ess-indent-line-function) ;; else S and R default behavior (ess-r-indent-line))) ;;;*;;; Predefined indentation styles (defun ess-set-style (&optional style quiet) "Set up the `ess-mode' style variables from the `ess-style' variable or if STYLE argument is given, use that. It makes the ESS indentation style variables buffer local." (interactive) (let ((ess-styles (mapcar 'symbol-name (mapcar 'car ess-style-alist)))) (unless style (setq style (intern (ess-completing-read "Set ESS mode indentation style" ess-styles nil t nil nil ess-default-style)))) (setq style (or style ess-style)) (make-local-variable 'ess-style) (if (memq (symbol-name style) ess-styles) (setq ess-style style) (error (format "Bad ESS style: %s" style))) (if (not quiet) (message "ESS-style: %s" ess-style)) ;; finally, set the indentation style variables making each one local (mapc (lambda (ess-style-pair) (make-local-variable (car ess-style-pair)) (set (car ess-style-pair) (cdr ess-style-pair))) (cdr (assq ess-style ess-style-alist))) ess-style)) ;;*;; Creating and manipulating dump buffers ;;;*;;; The user command (defun ess-dump-object-into-edit-buffer (object) "Edit an ESS object in its own buffer. Without a prefix argument, this simply finds the file pointed to by `ess-source-directory'. If this file does not exist, or if a prefix argument is given, a dump() command is sent to the ESS process to generate the source buffer." (interactive (progn (ess-force-buffer-current "Process to dump from: ") (if (ess-ddeclient-p) (list (read-string "Object to edit: ")) (ess-read-object-name "Object to edit")))) (let* ((dirname (file-name-as-directory (if (stringp ess-source-directory) ess-source-directory (with-current-buffer (process-buffer (ess-get-process ess-local-process-name)) (ess-setq-vars-local ess-customize-alist) (apply ess-source-directory nil))))) (filename (concat dirname (format ess-dump-filename-template object))) (old-buff (get-file-buffer filename))) ;; If the directory doesn't exist, offer to create it (if (file-exists-p (directory-file-name dirname)) nil (if (y-or-n-p ; Approved (format "Directory %s does not exist. Create it? " dirname)) (make-directory (directory-file-name dirname)) (error "Directory %s does not exist." dirname))) ;; Three options: ;; (1) Pop to an existing buffer containing the file in question ;; (2) Find an existing file ;; (3) Create a new file by issuing a dump() command to S ;; Force option (3) if there is a prefix arg (if current-prefix-arg (ess-dump-object object filename) (if old-buff (progn (pop-to-buffer old-buff) (message "Popped to edit buffer.")) ;; No current buffer containing desired file (if (file-exists-p filename) (progn (ess-find-dump-file-other-window filename) (message "Read %s" filename)) ;; No buffer and no file (ess-dump-object object filename)))))) (defun ess-dump-object (object filename) "Dump the ESS object OBJECT into file FILENAME." (let ((complete-dump-command (format inferior-ess-dump-command object filename))) (if (file-writable-p filename) nil (error "Can't dump %s as %f is not writeable." object filename)) (if (ess-ddeclient-p) ;; ddeclient version (ess-dump-object-ddeclient object filename) ;; else: "normal", non-DDE behavior: ;; Make sure we start fresh (if (get-file-buffer filename) (kill-buffer (get-file-buffer filename))) (ess-command complete-dump-command) (message "Dumped in %s" filename) (ess-find-dump-file-other-window filename) ;; PD, 1Apr97 ;;This ensures that the object gets indented according to ess-mode, ;;not as the R/S deparser does it. At the same time, it gets rid ;;of the mess generated by sending TAB characters to the readline ;;functions in R when you eval-buffer-*. (indent-region (point-min-marker) (point-max-marker) nil) (set-buffer-modified-p nil) ; no need to safe just because of indenting ;; Don't make backups for temporary files; it only causes clutter. ;; The ESS object itself is a kind of backup, anyway. (unless ess-keep-dump-files (make-local-variable 'make-backup-files) (setq make-backup-files nil)) ;; Don't get confirmation to delete dumped files when loading (if (eq ess-keep-dump-files 'check) (setq ess-keep-dump-files nil)) ;; Delete the file if necessary (if ess-delete-dump-files (delete-file (buffer-file-name)))))) (defun ess-find-dump-file-other-window (filename) "Find ESS source file FILENAME in another window." (if (file-exists-p filename) nil (ess-write-to-dribble-buffer (format "%s does not exist. Bad dump, starting fresh." filename))) ;; Generate a buffer with the dumped data (find-file-other-window filename) (ess-mode ess-customize-alist) (auto-save-mode 1) ; Auto save in this buffer (setq ess-local-process-name ess-current-process-name) (if ess-function-template (progn (goto-char (point-max)) (if (re-search-backward ess-dumped-missing-re nil t) (progn (replace-match ess-function-template t t) (set-buffer-modified-p nil) ; Don't offer to save if killed now (goto-char (point-min)) (condition-case nil ;; This may fail if there are no opens (down-list 1) (error nil))))))) ;; AJR: XEmacs, makes sense to dump into "other frame". (defun ess-dump-object-into-edit-buffer-other-frame (object) "Edit an ESS object in its own frame." (switch-to-buffer-other-frame (ess-dump-object-into-edit-buffer object))) (provide 'ess-mode) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-mode.el ends here ess/lisp/ChangeLog0000664000175000017500000047721112632537307012471 0ustar eddedd2015-11-18 * ess-sas-d.el (SAS): fix for issue #249: SAS has no prompt 2015-04-07 Stephen Eglen * ess-r-d.el (ess-prefer-higher-bit): Test code to prefer higher bit (i.e 64 bit rather than 32 bit) Rterm versions for R-newest. Should affect only Windows. 2015-03-18 Sam Steingold * ess-inf.el (ess-show-buffer-action): Add user option. (ess-show-buffer): Use it instead of a hard-coded value. 2015-01-31 Rodney Sparapani * ess-sas-a.el (ess-sas-goto-log): Added Truncated record warning to list of error messages. (ess-sas-cd): fixed bug for directories with embedded blanks; also commented out unnecessary calls to ess-sas-goto-shell because ess-sas-cd already calls ess-sas-goto-shell (ess-sas-graph-view): fixed wrong directory bug and added support for ODS 2013-12-05 Rodney Sparapani * ess-sas-a.el (ess-sas-edit-keys-toggle): the default returns to nil; indentation has improved somewhat and will probably improve a bit more in the near future 2013-10-19 Martin Maechler * ess-trns.el (ess-transcript-clean-region): use t and nil, not 1 and 0 for boolean 'buffer-read-only 2013-10-19 Rodney Sparapani * ess-r-d.el (ess--R-load-ESSR): install.packages need type='source' on Mac OS X and Windows 2013-10-13 Henning Redestig * ess-roxy.el (ess-roxy-mode-map): better key-mappings and behavior of html preview as agreed on ess-help 2013-08-30 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-defaults): added PROCs sgdesign and sgrender 2013-08-23 Rodney Sparapani * ess-sas-a.el (ess-sas-interactive): remove '< /dev/tty' 2013-07-27 Henning Redestig * ess-roxy.el (ess-roxy-mode): add interoperability with auto-fill-mode 2013-07-15 Rodney Sparapani * ess-site.el: Here is a workaround for an Emacs bug related to indirect buffers and spurious lockfiles that rears its ugly head with .Rd files http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-02/msg01368.html http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14328 2013-07-11 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-defaults): remove annoying 9.3 note/news from the comment category; it's not a one-time 9.3 specific message; it is also in 12.1 and presumably it is now eternally annoying; but we can't font-lock it since it changes with every new SAS release and it is not worth the maintenance/vigilance 2013-06-12 Rodney Sparapani * ess-sas-d.el: see discussion in the thread: "patch: identing quit statement like run statement in ess-sas" at http://article.gmane.org/gmane.emacs.ess.general/7340 2013-06-09 Stephen Eglen * ess-julia.el: Checkdoc modifications, and other whitespace cleanup. Many docstrings were missing, so I've made initial guesses at what they should be. * ess-site.el (ess-etc-directory): Remove * from docstring. Fix most points noted by checkdoc. 2013-06-07 Stephen Eglen * ess-s-l.el (S-common-cust-alist): Change default for comment-use-syntax to t. Dirk Eddelbuettel reported the follownig bug: With a line like the following in an R buffer, when M-TAB is hit on the line to add a comment, the hash within the string is interpeted as an existing comment, causing the string to be disrupted. rug( foo, col="#00000030") This is now fixed such that M-TAB would add a hash at the end of the line, allowing for a comment. 2013-04-11 Rodney Sparapani * ess-sas-a.el (ess-sas-edit-keys-toggle): `sas-indent-line' still broken (going on 15 years AFAIK) resulting in futile bug reports (and precious little bug-fixing): changing the default to t so TAB is bound to `ess-sas-tab-to-tab-stop' by default 2013-04-06 Henning Redestig * ess-s-l.el (ess-smart-S-assign): rename (ess-smart-underscore-*) to (ess-smart-S-assign-*) and create aliases to remain compatible. 2013-03-07 Rodney Sparapani * ess-custom.el/ess-sas-d.el (SAS-mode-hook): creation 2013-03-02 Henning Redestig * ess-s-l.el (ess-insert-S-assign): deleting horizontal space is not desirable when using alternative smart underscore like < (ess-smart-underscore): customizable smart underscore (ess-toggle-underscore): remove key assignments for both the default underscore and the potentially modified ess-smart-underscore-key * ess-custom.el (ess-smart-underscore-key): customizable the smart underscore 2012-12-09 Richard Heiberger * ess-tracebug.el (ess-bp-type-spec-alist): remove unnecessary "browser();" call when recover() is used. 2012-10-21 Henning Redestig * ess-roxy.el (mark-paragraph): move function advice activations to ess-r-d.el instead so that functions are not advice in all modes. This also appears to fix bug reported by Dirk Eddelbuettel. 2012-10-07 Henning Redestig * ess-roxy.el (ess-roxy-previous-entry): new behavior, ess-roxy uses the prefix string of the current block instead of only the prefix specified in ess-roxy-str 2012-10-06 Henning Redestig * ess-roxy.el (ess-roxy-hide-all): introduce new ess-roxy-re to fontify roxygen blocks that are done with different prefix than the actually used prefix 2012-09-29 Martin Maechler * ess-r-args.el (ess-r-object-tooltip): new 2012-09-13 Richard M. Heiberger * ess-site.el add new customizable variable (ess-directory-containing-R) to allow ess-r-versions-created to find R exectuables on Windows in directories other than the default install location. 2012-09-13 Richard M. Heiberger * *.el files: uniformly changed my name to "Richard M. Heiberger" and uniformly changed my email address to "rmh@temple.edu" 2012-09-06 Sam Steingold * ess-custom.el (ess-source-directory): Init as per http://stat.ethz.ch/R-manual/R-patched/library/base/html/tempfile.html from $TMPDIR, $TMP, $TEMP on all platforms. 2012-09-06 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): added PROC SETINIT 2012-08-22 Rodney Sparapani * ess-sas-a.el (ess-sas-rtf-portrait/landscape): bug-fix: make new file buffer by adding .rtf; this fixes nagging issue; also ess-sas-rtf-*-landscape replaced by ess-sas-rtf-landscape on Emacs; but Emacs and XEmacs implementations have diverged; XEmacs currently untested, continue using ess-sas-rtf-*-landscape 2012-07-23 Stephen Eglen * ess-help.el, ess-r-gui.el, ess-sas.el, ess-sp4-d.el, ess-sp6w-d.el, ess-trns.el, essd-els.el: Set `buffer-read-only' rather than using toggle-read-only (recommended by byte compiler). 2012-07-02 Martin Maechler * ess-developer.el (ess-developer-add-package): new first argument (prefix!) 'from-attached'. Essential for large list of packages on slow (e.g., NFS mounted) file systems. 2012-06-05 Stephen Eglen * ess-r-d.el (ess-dirs): Do not set ess-directory. 2012-05-21 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): add an annoying 9.3 note/news to the comment category 2012-05-15 Rodney Sparapani * ess-sas-a.el (ess-sas-goto): bug-fix; if the root of file name contains a suffix, then still goto correctly, e.g. logit.sas has log in it 2012-05-12 Martin Maechler * ess-sas-d.el: Set C-c C-w only in SAS (e.g. *not* in R). 2012-05-11 Rodney Sparapani * ess-sas-a.el (ess-sas-rtf-*): XEmacs support returns! 5.13 era functions are used if (featurep 'xemacs) otherwise, 5.14+ Emacs variants 2012-05-10 Martin Maechler * ess.el (ess-version-string): make robust against wrong/empty SVN-REVISION 2012-05-07 Martin Maechler * ess-rd.el (Rd-mode): set ess-language "S" and ess-dialect "R", so R may be autostarted, when desired. 2012-05-06 Sam Steingold * ess-site.el: Do not quote lambda expressions. * noweb-font-lock-mode.el (noweb-font-lock-fontify-chunk-by-number): Use `syntax-begin-function' when available instead of `font-lock-beginning-of-syntax-function' (obsolete in Emacs 23.3). Avoid `progn' in `cond' and some other minor code cleanup. 2012-05-05 Vitalie Spinu * ess-custom.el (inferior-STA-program-name): is now "stata" as it should be and not "env" + all the support modifications. * ess-sta-l.el (ess-help-STA-sec-keys-alist): corrections and additions to sections keys and regular expressions for STATA. * ess-s-l.el (S-common-cust-alist) * ess-sta-d.el (ess--STA-retrive-topics-from-search) (ess-get-STA-help-topics): customizable topic retrieval. Stata has same interactive facilities as R. * ess-custom.el (inferior-STA-args): customizable stata arguments. (inferior-STA-program-name): program name is "stat" as it should be (and not "env"). 2012-05-02 Sam Steingold * ess-r-args.el (tooltip-show-at-point): Do not use the assoc package (which is obsoleted by Emacs 24.2 anyway), use let instead, it is cleaner and more reliable. 2012-04-23 Vitalie Spinu * merged Daniel Hackney's changes Squashed commit of the following: commit 708101bef3e5c1f20f53736a9e93799eddaf4f0c Author: Daniel Hackney Date: Mon Apr 23 00:28:53 2012 -0400 Remove incorrect description of the GPL A couple files had the following in their header: In short: you may use this code any way you like, as long as you don't charge money for it, remove this notice, or hold anyone liable for its results. This is not an accurate description of the GPL, and should therefore not appear in the headers. commit c93848d930783f0c38fec1ff07af40fb623799d1 Author: Daniel Hackney Date: Sun Apr 22 23:03:42 2012 -0400 Clean up all whitespace according to settings from ".dir-locals.el" Uses `whitespace-cleanup' to set a consistent style for whitespace throughout the project. This can be applied with: (defun recursive-files (dir func) (loop with before-save-hook for (file is-dir) in (directory-files-and-attributes dir t ".*\.el$") if is-dir do (recursive-files file form) else do (with-current-buffer (find-file-noselect file) (apply func) (basic-save-buffer) (kill-buffer)))) (recursive-files 'whitespace-cleanup) Again, this can be run from "emacs -Q" after "(require 'cl)" commit 3c9c0857d67bda1e9161e37ed426e97a8c61223c Author: Daniel Hackney Date: Sun Apr 22 22:51:54 2012 -0400 Directory-local variables for whitespace cleanup. Use the `whitespace' library for the cleaning. commit 8dc3d6db1d40956ab96c33b18a80a95a047b46b3 Author: Daniel Hackney Date: Sun Apr 22 22:40:28 2012 -0400 Convert files to `utf-8-unix' coding system. The default coding system to use going forward, `utf-8-unix', is set as a directory-local variable in ".dir-locals.el". To force all elisp files to use the `utf-8-unix' coding system, the following code will recursively walk through all elisp files in the specified directory set the encoding system, and save the file. (require 'cl) (defun recursive-files (dir func) (loop with before-save-hook for (file is-dir) in (directory-files-and-attributes dir t ".*\.el$") if is-dir do (recursive-files file form) else do (with-current-buffer (find-file-noselect file) (apply func) (basic-save-buffer) (kill-buffer)))) This can be invoked as follows: (recursive-files "/path/to/ess" '(lambda () (set-buffer-file-coding-system 'utf-8-unix))) To ensure no other variables from the user environment impact the process, this code can be run in "emacs -Q", which doesn't load any startup files (outside of the emacs core). This function could perhaps be split out, named better, and put in its own file. commit 6352290fe13ce9048abaa0e401679a67bbcafe43 Author: Daniel Hackney Date: Tue Apr 17 21:01:36 2012 -0400 Reformat all headers to be consistent. Summary of changes made: * Correct first- and last-line format. Preferred is three semicolons, file name, either three dashes and the description (first line) or the string "ends here" (last line). * Changed header comment lines to match conventions. "Author" and "Maintainer" headers are singular, even when there are multiple authors or maintainers. * Use the correct number of semicolons for each header section. Regular comments should have two semicolons; section headers, such as "Commentary" or "Code" should have three. * Fixed "Keywords" header comments. There is a standard-ish set of keywords used in Emacs, available through `finder-by-keyword'; this commit uses those conventions. Also, keywords are now separated by comma then space and do not have a trailing period. * Trailing newline at end of file. A few files lacked this, which makes subsequent diffs which modify the last line unnecessarily noisy. * Moved "Code" section marker before any and all code in a file. 2012-04-21 Martin Maechler * ess.el (ess-version-string): new, and (ess-version) uses it. 2012-04-12 Martin Maechler * ess-s-l.el (ess-use-this-dir): add 'no-force-current, and switch default to *try* finding a current *R* buffer. 2012-04-11 Rodney Sparapani * ess-bugs-d.el (ess-bugs-mode): * ess-jags-d.el (ess-jags-mode): (setq ess-language "S") ; mimic S for ess-smart-underscore 2012-04-05 Rodney Sparapani * ess-custom.el (ess-revision): extraordinary attempts to get revision number 2012-04-03 Martin Maechler * ess-inf.el (ess-force-buffer-current): use no-autostart, instead of autostart (each with the emacs default of nil). This re-instantiates ESS 5.x behavior. 2012-04-03 Vitalie Spinu * ess-custom.el (ess-first-tab-never-completes-p): defalias for ess-first-tab-never-complete (ess-first-tab-never-complete): plenty of options for every taste. (ess-tab-complete-in-script): new option. 2012-04-02 Vitalie Spinu * ess-mode.el (ess-mode): try hard to find an alist if not suplied * ess-utils.el (ess-inside-string-or-comment-p) (ess-inside-string-p): rewrote this facilities to take advantage of font-lock * ess-julia.el (julia-customize-alist) (julia-get-help-topics-list-function) (julia-send-string-function, julia) (julia-imenu-generic-expression): ess-julia.el 2012-04-01 Vitalie Spinu * ess-mode.el (ess-error-regexp): custom error messages for dialects 2012-04-02 Sam Steingold * ess-help.el (ess-help-mode-map): Older XEmacs misses `special-mode-map', check for that. * ess-tracebug.el (ess-watch-mode-map): Likewise. 2012-04-02 Sam Steingold * ess-tracebug.el (ess-bp-kill): Bug fix: `called-interactively-p' requires an argument; fix it as recommended in the doc for `called-interactively-p' by avoiding it altogether; this also takes care of compatibility. 2012-04-02 Sam Steingold * ess-help.el (ess-help-mode-map): All supported emacsen have `set-keymap-parent'. * ess-inf.el (inferior-ess-mode-map, ess-mode-minibuffer-map): Likewise. * ess-tracebug.el (ess-watch-mode-map): Likewise. * ess-trns.el (ess-transcript-mode-map): Likewise. * ess-mode.el (ess-mode-map): Likewise. 2012-04-02 Sam Steingold * ess-inf.el (update-ess-process-name-list, ess-cleanup): Use `dolist' instead of `mapc'+`lambda' for clarity and speed. * ess-help.el (ess-help-mode, ess-describe-sec-map) (ess-get-help-files-list, ess-get-help-aliases-list): Likewise. 2012-04-02 Sam Steingold * ess-custom.el, ess-custom.el, ess-mous.el, ess-mouse.el: * ess-r-args.el, ess-r-d.el, ess-rd.el, ess-s-l.el, ess-s4-d.el: * ess-site.el, ess-sp5-d.el, ess-sp6-d.el, ess-swv.el: * ess-tracebug.el, ess-utils.el, ess.el, make-regexp.el, mouseme.el: * noweb-mode.el: Do not quote lambda forms, this is never needed. 2012-04-02 Sam Steingold * ess-site.el: Rise up to the challenge: use `locate-file' instead of horrible adhockery to check if info can find ess.info. 2012-03-30 Vitalie Spinu * ess-custom.el (ess-arg-function-offset-new-line): If a list of the form '(N), indent at the indentation + N * ess-r-d.el (ess-R-get-rcompletions, ess--funargs-command): workaround for enableJIT warnings for R > 2.14.2 2012-03-26 Rodney Sparapani * ess-help.el (ess-skip-to-help-section): this issue is documented in 2 places http://www.xemacs.org/About/XEmacsVsGNUemacs.html http://www.xemacs.org/Documentation/21.5/html/cl_4.html So, the schism goes back many years: circa 1997-1998. The fix is simple. If the keypress is meant to be a character, then you wrap last-command-event as follows... (if (featurep 'xemacs) last-command-char last-command-event) 2012-03-25 Vitalie Spinu * ess-inf.el (ess-get-object-list): new arg exclude-first to allow exclusion of objects from .GlobalEnv in help completion. 2012-03-21 Vitalie Spinu * ess-r-d.el (ess--funargs-command): "error" option is reset to NULL in critical completion and eldoc actions. * ess-inf.el (inferior-ess-set-status): new argument no-timestamp to allow ess-command not to set the timestamp. 2012-03-20 Vitalie Spinu * noweb-mode.el (noweb-minor-mode-map): adjusted [tab] and [return] keys not to interfere with ac-mode 2012-03-19 Vitalie Spinu * ess-r-d.el (ess-eldoc-docstring-format): smart for-mating of a doc string in minibuffer. * ess-custom.el (ess-eldoc-abbreviation-style): level to filter/truncate the doc string. 2012-03-16 Vitalie Spinu * ess-r-d.el (ess--funname.start): is limiting the search from the process marker only (bug reported by Sam Steingold on Mon Mar 12 19:40:22 CET 2012) * ess-inf.el (ess-object-completion, ess-complete-object-name): give suggestive info if proc is not associated. (ess-filename-completion): :exclusive 'no (inferior-ess-mode): completely removed dependence on comint-dynamic-complete. * ess-r-d.el (ess-R-complete-object-name): added info message on missing proc. * ess-roxy.el: (ess-roxy-tag-completion): new completion function for emacs 24 (ess-roxy-mode): adjusted roxy tag completion to new ESS and emacs 24 system. 2012-03-14 Henning Redestig * ess-roxy.el (ess-roxy-complete-tag): removed function advice for (ess-internal-complete-object-name) to reflect the new tab behavior and also made tab not hide roxy entry unless point is at the beginning of the line (so similar to org-mode's visibility cycling) (comint-dynamic-complete-functions): and dropped the advice to (ess-R-complete-object-name) as well. 2012-03-13 Henning Redestig * ess-roxy.el (ess-roxy-preview): put all R-code on one line to get rid f the +s 2012-03-13 Vitalie Spinu * ess-inf.el (inferior-ess-mode-map): don't bind M-TAB in emacs 24. * ess-mode.el (ess-mode-map): Don't bind M-TAB in emacs 24, it's the emacs standard to call completion-at-point or comlete-symbol which do the same thing. * ess-r-d.el (ess-R-get-rcompletions): return a token as a first element of a list. (R-mode): init emacs 24 completions. 2012-03-12 Vitalie Spinu * ess-inf.el (ess-filename-completion): filename completion to comply with emacs 24 standard. (ess-complete-filename): modified quote detection. 2012-03-11 Henning Redestig * ess-roxy.el (ess-roxy-preview): semi-working version for roxygen2 without creating directories. Unfortunately appends lots '+'s at the created Rd file. 2012-03-09 Vitalie Spinu * ess-help.el (ess-help-kill, ess-help-quit): smarter quit and kill behavior. (ess-display-help-on-object): fixed the help display bug. 2012-03-08 Vitalie Spinu * ess-custom.el (ess-arg-function-offset-new-line): new indentation offset, better handling of long funargs. See the doc. 2012-03-05 Vitalie Spinu * ess-custom.el (ess-first-tab-never-completes-p): if t never complete on first TAB in ess-mode. * ess-mode.el (ess-indent-or-complete): improved handling of the nil process * ess-s-l.el: removed S-calculate-indent and S-indent-line (these are ess-indent-line and ess-calculate-indent from 2004 already, and created confusion) 2012-03-04 Vitalie Spinu * ess-swv.el (ess-swv-PDF): ess-completing-read * noweb-mode.el (noweb-goto-chunk): ess-completing-read * ess-inf.el (ess-request-a-process, ess-request-a-process) (ess-read-object-name): ess-completing-read * ess-tracebug.el (ess-dbg-command-digit): ess-completing-read * ess-rd.el (Rd-mode-insert-section): ess-completing-read * ess-mode.el (ess-set-style): ess-completing-read 2012-03-02 Martin Maechler * ess-custom.el (ess-roxy-package): new variable, (FIXME potentially) with new default "roxygen2". %% FIXME, 'roxygen2' fails * ess-roxy.el (ess-roxy-preview): now using ess-roxy-package instead of "roxygen". 2012-03-02 Rodney Sparapani * ess-bugs-l.el (ess-bugs-hot-arrow): add a space before arrow 2012-03-01 Vitalie Spinu * ess.el (ess-yank-cleaned-commands, ess-yank): C-u C-u C-y yanks only the commands from the kill ring (as proposed by Richard M. Heiberger). It uses ess-transcript-clean-region. 2012-02-29 Vitalie Spinu * ess-mode.el (ess-mode): use comint-dynamic-completion. * ess-r-d.el (R-mode): use comint-dynamic-completion. * ess-mode.el (ess-mode-map): TAB is bound to ess-indent-or-complete. 2012-02-27 Vitalie Spinu * ess-r-d.el (ess-function-arguments): works with current instead of local process. That means eldoc and completion are available even if buffer is not associated with a process. * ess-help.el (ess-help-bogus-buffer-p): regexp includes the name of the doc object. (ess-display-help-on-object): killed buffer display bug fix, reported and fixed by Sam Steingold. (ess-help-mode-map): inherits form special-mode-map, "k" is kill-this-buffer instead of kill-buffer. "q" is quit-window instead of bury-buffer. (pointed by Sam Steingold) * ess-r-d.el (ess-funname.start, ess-function-arguments): execution bugs corrected and robustified caching. * ess-r-args.el (ess-r-args-get): relies on ess-function-arguments now. * ess.el (ess-load-extras): new function to load extra features. * ess-tracebug.el (ess-tracebug-map): a couple of renames. * ess-mode.el (ess-mode): (ess-load-extras) * ess-eldoc.el (ess-eldoc): moved the code into ess-r-d.el. * ess-developer.el: moved documentation into the user manual * ess-custom.el (ess-use-eldoc, ess-eldoc-show-on-symbol) (ess-use-auto-complete): Implemented ess-use-xxx system. 2012-02-26 Vitalie Spinu * ess-tracebug.el (ess-tracebug-prefix): set to nil, as to require the user to choose the binging. 2012-02-25 Vitalie Spinu * ess-tracebug.el (ess-long+replacement): it's shorter "+ . +" now. * ess-custom.el (inferior-ess-S-prompt): small adjustment of the prompt for tracebug cuts. * ess-r-d.el (ess-function-arguments): modified the form of the returned value. 2012-02-23 Vitalie Spinu * ess-inf.el: (ess-switch-to-ESS): force-buffer-current instead of make-buffer-current. Much more useful in interactive use, which this function is almost always used. (ess-force-buffer-current): New argument to auto-start process if the process died. This case was not treated before. 2012-02-21 Vitalie Spinu * ess-eldoc.el (ess-eldoc-everywhere-p): controls whether to show args everywhere or only inside function call. (ess-eldoc): complete rewrite of ess-eldoc, to use argument completion api. Automatic caching + generic args + handling of complex expressions + calling process only when really needed. * ess-r-d.el (ess-function-arguments): optimized funarg retrieval. (ess-get-object-at-point): a very permissive version of symbol-at-point. Allows almost any R object. 2012-02-20 Vitalie Spinu * ess-inf.el (inferior-ess-set-status): set 'last-eval property giving the time of the last interaction with the process. * ess-r-d.el (ess--funargs-cache, ess-function-arguments): New uniform caching support for argument completion. Arg are reliably cached on first completion invocation. All completion mechanisms should use ess-function-arguments. (ess-funname.point): Retrieve the name of a function call and starting point of a call. All interfaces should use it for argument completion. * ess-r-args.el (ess-r-args-get): completes arguments for S3 generic if found. * ess-r-d.el (ac-source-R, ac-source-R-objects) (ac-source-R-args): Completely rewrote the ac support. ESS now provides the above 3 sources to accomplish any completion taste. 2012-02-19 Vitalie Spinu * ess-inf.el (ess-switch-to-ESS): Associates the buffer with current process. Make sense when the buffer is not yet associated with any process. (with-current-process-buffer): new macro to execute the &body inside current ess process buffer. (ess-command): removed PROMPT argument. (ess-command): removed sleeping, not relevant anymore argument still stays, apparently needed for dde. 2012-02-04 Vitalie Spinu * ess-tracebug.el (ess-watch-mode): corrected watch-mode documentation and added the ? and d keys. 2012-02-03 Vitalie Spinu * ess-inf.el (inferior-ess--get-old-input:regexp): silent byte-compile on free var. * ess-tracebug.el (ess-tracebug-inject-source-p): better control source injection. (ess-eval-region2): removed eva-region, eva-linewise, eval-function fixes from tracebug (everything incorporated into the core). * ess-inf.el (ess-eval-function): complete rewrite to accommodate developer and tracebug and potentially other addons in the future. (ess-load-file) calls ess-tracebug-source-current-file if tb is active. * ess-developer.el: Many unifying changes, bug fixes. Follows ess-eval-visibly-p whenever possible. Implemented region and function devEvals. * ess-inf.el (ess-eval-region): moved ddeclient to lower level `ess-send-region' (ess-send-string, ess-send-region): consolidated these low-level work-horse functions. 2012-02-02 Vitalie Spinu * ess-inf.el (ess-eval-region): removed the archaic ess-synchronize-evals, a workaround for emacs 18.57. (ess-eval-region): is now aware of ess-tracebug and ess-developer. 2012-02-01 Vitalie Spinu * ess-r-d.el (ess-sos, ess-setRepositories, ess-setCRANMiror): added two more handy commands. * ess-roxy.el (ess-roxy-mode-map): new key C-c C-e t for preview-text (ess-roxyb-preview-text): new function for preview in text format * ess-rd.el (Rd-preview-help): solved nil file-name bug with roxy preview. 2012-01-28 Vitalie Spinu * ess-developer.el (ess-developer-assign-function): integrated with ess-eval-function; also takes care of tracebug. * ess-tracebug.el (ess-tracebug-assign-function): tracebug doesn't reassign ess-eval-function anymore (it's integrated now in ESS) (ess-process-send-string): moved into ess-inf.el * ess-inf.el (ess-process-send-string): low level wrapper for process-send to enable pre-processing of input string. Currently removes empty lines when debugging is active. * ess-inf.el (ess-load-file): if in developer mode call ess-developer-source-current-file. (ess-process-get): new function, wrapper for process-get (ess-eval-function): is now aware of ess-developer and ess-tracebug (ess-command): added two new arguments wait and prompt 2012-01-27 Vitalie Spinu * ess-tracebug.el (ess-dbg-mode-line-indicator): dynamic mode line support. * ess-custom.el (ess-mode-line-indicator): doc string * ess-tracebug.el (ess-dbg-flag-for-debugging): added support for org mode and file free buffers. 2012-01-23 Vitalie Spinu * ess-r-d.el (ess-library): set ess-sp-change to t. * ess-inf.el (ess-smart-comma): made smart operators customizable. New ess-smart-variables local var to hold smart ops which are active in the mode. * ess-r-d.el: further work on AC. * ess-custom.el (inferior-ess-S-prompt): small adjustment of S prompt regexp. 2012-01-21 Vitalie Spinu * ess-tracebug.el : several corrections to silent the compiler. * Makefile (ELC): added developer and tracebug. * ess-r-d.el (ac-source-R-objects, ac-source-R-args): two sources for ac. (ess-init-ac): default initialization of ac. * ess.el (ess-completing-read): added automatic handling of ': '. * ess-tracebug.el (ess-dbg-flag-for-debugging) (ess-dbg-unflag-for-debugging): modiefied to use ess-completing-read. (require): removed ido dependency. 2012-01-20 Rodney Sparapani * ess-bugs-d.el (ess-bugs-font-lock-keywords): add censoring notation: C( , ) 2012-01-20 Vitalie Spinu * ess-inf.el (inferior-ess--goto-input-start:regexp): new function for regexp based input search. (inferior-ess-get-old-input): ESS now fully supports both field and regexp input handling. Fields are not used though; may be in the future. (inferior-ess-mode): removed ac inits (ess-mode): removed ac inits (was too intrusive) * ess-custom.el (inferior-ess-S-prompt): new custom var. User can customize this regexp to enhance navigation in comint and transcript buffers. 2012-01-19 Vitalie Spinu * ess-r-d.el (ess-R-get-rcompletions): require 'ess-tracebug * ess-tracebug.el Added and integrated with ESS. * ess-inf.el (inferior-ess-set-status): returns the process busy status for convenience 2012-01-18 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): generalized support for NOTEs/WARNINGs/ERRORs with numeric call signs that match the regexp [0-9]+-[0-9]+ 2012-01-18 Vitalie Spinu * ess-mode.el (ess-mode): added ac support * ess-inf.el (inferior-ess-mode): added ac support * ess-r-d.el (R): added ac support * ess-custom.el (ess-use-ac-p, ess-ac-source-R) (ess-ac-sources-R, ess-ac-source): added auto-complete integration. * ess-r-d.el (ess-R-complete-object-name): simplified ess-R-complete-object-name by reducing huge number of invocations of ess-command to 2 (ess-R-get-rcompletions): new function - workhorse of internal r-completions. * ess-r-args.el (ess-r-args-get): new TRIM argument (ess-r-args-show): rearrangement of the code. * ess-eldoc.el (ess-eldoc): moved new-line replacement into ess-r-args-get. 2012-01-17 Vitalie Spinu * ess.el: added xemacs support for process-plist, set-process-plist, process-put and process-get. All should be removed when xemacs finally supports them. * ess-site.el: removed the piece on customizing prompts, it does not work and is misleading for the users. * ess-r-d.el (R): write proc version into dribble. * ess-inf.el (ess-multi): marking newly created ess process as busy and wait for the proc afterward. 2012-01-16 Vitalie Spinu * ess-trns.el (ess-transcript-mode): small adjustment of the prompt. * ess-inf.el (inferior-ess-get-old-input): supports both fields and regexp comint and acts in accordance with the value of 'comint-use-prompt-regexp. (ess-smart-comma): improved usability. * ess-custom.el (ess-handy-commands): improved handy commands for smart comma. * ess-trns.el (ess-transcript-mode): set comint-use-prompt-regexp to t in trns-mode and adjusted regexp of the inferior-ess-prompt. 2012-01-15 Vitalie Spinu Major re-factoring of ess-inf.el - new waiting-for-prompt mechanism. * ess-inf.el (ordinary-insertion-filter): complete cleanup. (inferior-ess-output-filter): sets process status (i.e. busy, sec-prompt properties) * ess-inf.el (ess-multi): removed inferior-ess-wait-for-prompt and replaces with ess-wait-for-process which uses new prompt monitoring mechanism (ess-eval-linewise): removed timeout-ms and replaced with wait-sec to be parsed to ess-wait-for-process. Default is 0s. Removed kludges and prompt waiting loop. (inferior-ess-get-old-input): completely redefined to take advantage of fields. (inferior-ess-goto-input-end): (inferior-ess-goto-input-end): new functions to navigate through input by means of fields in inferior-buffer or transcript. * ess-custom.el (inferior-ess-primary-prompt): simplified default prompts to "> " and "+ " * ess-arc-d.el (xxx-customize-alist): replaced deprecated comint-use-prompt-regexp-instead-of-fields with comint-use-prompt-regexp. 2012-01-14 Vitalie Spinu * ess-r-d.el (R-customize-alist): removed inferior-ess-command-prompt. It is no longer necessary with recent changes in the waiting mechanism. 2012-01-14 Vitalie Spinu * ess-eldoc.el (ess-eldoc): remove new lines from argument list to avoid frequent distortion of emacs windows. 2012-01-07 Martin Maechler * ess-mode.el (ess-mode-map): C-c . sets style (as in C-mode) 2011-12-23 Vitalie Spinu * ess-inf.el (ess-smart-comma): inspired by slime-repl ,shortcut. If "," is the first character typed in the inferior-ess buffer it requests for execution one of the commands in ess-handy-commands list. 2011-12-14 Vitalie Spinu * ess-mode.el (ess-calculate-indent): let bind beginning-of-defun-function to nil in ess-calculate-indent to prevent the use of ess-beginning-of-function 2011-12-13 Vitalie Spinu * ess-mode.el (ess-mode): set beginning-of-defun-function and end-of-defun-function to make swank/slime work. (ess-function-pattern): allowed for function names of the form '.+', '.+', ".+" in ess-R-function-pattern. 2011-12-12 Vitalie Spinu * ess-developer.el (ess-developer): the bulk of ess-developer.el and ess-developer.R is finished. See the file header for the full details. 2011-12-01 Vitalie Spinu * ess-r-d.el (ess-library): ido interface to library() 2011-11-24 Vitalie Spinu * ess-inf.el (ess-prompt-wait): ess-prompt-wait is more sophisticated now. It checks for prompt only if no more output has been received from the process. Looking-at is replaced with re-search-forward in order to avoid anchoring the prompt to the bol. 2011-11-18 Vitalie Spinu * ess-developer.el (ess-developer-source-current-file): interface to insertSource. * ess-inf.el (ess-get-process-variable): added (boundedp var) check. If var is not defined ess-get-process-variable returns nil. Useful when some vars are defined for one mode and not for others. 2011-11-17 Vitalie Spinu * ess-inf.el (ess-eval-function-or-paragraph-and-step): now calls ess-eval-function in order to reuse ess-developer and ess-tracebug improvements of ess-eval-function. (ess-eval-function): new argument 'no-error 2011-11-14 Vitalie Spinu * ess-help.el (ess-read-helpobj-name-default): defined alias for ess-helpobj-at-point. 2011-11-13 Vitalie Spinu * ess-help.el (ess-helpobj-at-point): modified the name of ess-read-helpobj-name-default to a more intuitive one and consistent with emacs conventions. * ess-custom.el (ess-help-pop-to-buffer): If non-nil ess-help buffers are given focus during the display. (ess-ido-flex-matching): if you don't use ido flex matching but still want it for ESS, here it is. * ess-help.el (ess-display-help-on-object): put cache update on universal argument, it also regenerates the help buffer as before. Removed curr-* kludge which was not necessary. Removed the handling of help buffer into separate function. (ess-help-type): local variable in help files holding the help type symbol. So far, 'help, 'index, 'vignette. (ess-help-object): local in help files holding the name of the help object, i.e. name of the package for index and help topic for ordinary help. (ess-help-mode-map): new keys - i for index, v for vignette, w for help in web-browser. "q" key is not burring the buffer instead of jumping to the end of ESS. C-c C-z is standard combination for that action. (ess-help-mode-menu): new menu entries for index vignette and browse in web-browser. (ess-find-help-file): This one does not do the prompt processing anymore. Everything is done in ess-completing-read now. (ess-get-help-topics-list): topics are now list of strings instead of alist. IDO and emacs handles them better. A workaround is implemented for Xemacs to use alist in ess-completing-read. ------------- New functions: (ess-display-index): linked index with ido request. (ess-R-display-vignettes, ess-display-vignettes): display vignettes in nicely formatted, linked help buffer. In xemacs emits the call to browseVignettes() instead. (ess-display-help-in-browser): pop the current help page in browser. (ess--switch-to-help-buffer): display help buffers, consistently with `ess-help-pop-to-buffer' and `ess-help-own-frame'. * ess.el (ess-completing-read): moved code around. * ess-inf.el (ess-eval-function): integrated ess-developer in ess-eval-function Works only for R, useful for S as well? * ess-mode.el (ess-mode): integrated mode-line-indicator. * ess-inf.el (inferior-ess-mode): integrated mode-line-indicator. * ess-custom.el (ess-mode-line-indicator): added dynamic mode-line indicator. Mode line of ess-mode is now in sync with the associated process. This feature is used by ess-developer and ess-tracebug. Xemacs does not have the necessary support for it. 2011-11-12 Vitalie Spinu * ess.el (ess-completing-read): new function to use for completion in ESS. It uses ido completion mechanism whenever available, and falls back on classical completing-read otherwise. * ess-r-d.el (ess-install.packages): fast way to instal packages with ido interface. * ess-custom.el (ess-use-ido): users can disable ido if they don't want it. (ess--completing-hist): new internal variable to store completion history. * ess-inf.el (ess-get-words-from-vector): addapted regular expression to match "\"", this was breaking the command before. See etc/R-ESS-bugs.el (bug 1). Added comment on max.print truncating the vector in the doc string (bug 2 in etc/R-ESS-bugs.el). Sill not sure if should wrap the code automatically or leave it to the user. 2011-11-11 Vitalie Spinu * ess-r-d.el (R-customize-alist): added `inferior-ess-command-prompt' to R-customize-alist. Solves bug 3 in etc/R-ESS-bugs.el. * ess-custom.el (inferior-ess-command-prompt): new prompt regexp to be used specifically in ess-command. If nil (the default) ess-command uses `inferior-ess-primary-prompt' as it was before. * ess-inf.el (ess-command): Anchoring the prompt to the end of buffer in order to avoid premature prompt detection (see etc/R-ESS-bugs.el bug 4). Moved ..ok{ess-command} inside unwind-protect. Before it was ..ok even when ess-command failed. (ess-prompt-wait): Added new required parameter PROMPT-REG for the local prompt regexp to be passed explicitly. Before, it was using global value of the prompt regexp. Dropped start-of-output argument. It's never used in ess-code and had confusing meaning wich was not even documented. 2011-11-03 Rodney Sparapani * ess-sas-l.el (sas-fix-life-tables): if read-only, then toggle to read-write first (SAS-listing-mode): name ESS[LST] for emacs functionality that cares about names like tabbar 2011-09-30 Rodney Sparapani * ess-sas-a.el (ess-sas-graph-view): search for GSASFILE more robust to handle recent versions of SAS and embedded dots in filename 2011-09-17 Henning Redestig * ess-roxy.el (ess-roxy-fill-field): Filling text inside roxygen entries now operate on individual paragraphs instead of the whole field. 2011-09-16 Sebastian P. Luque * ess-swv.el (ess-swv-remove-TeX-commands): Simplify removal of commands from TeX-command-list (AUCTeX users). Thanks to Stephen. (ess-swv-toggle-plug-into-AUCTeX): Fixed doc string. 2011-09-11 Henning Redestig * ess-roxy.el (ess-roxy-update-entry): fixes problem with roxy entries in the beginning of a file 2011-09-03 Henning Redestig * ess-roxy.el (ess-roxy-in-header-p): fix introduced bug in update-entry 2011-09-01 Henning Redestig * ess-roxy.el (ess-roxy-get-args-list-from-entry): couldnt really handle the ... argument param description before. can now. 2011-09-01 Martin Maechler * ess-custom.el (ess-history-file): now three-valued; (nil, t, ). If nil, *no* history is read or written. * ess-inf.el (inferior-ess, ess-multi): ess-history-file changes; finally *use* the ess-history-directory. 2011-08-31 Henning Redestig * ess-roxy.el (ess-roxy-end-of-field): attempt to handle mutiple paragraphs inside @param fields etc. 2011-08-31 Sebastian P. Luque * ess-help.el (ess-get-help-aliases-list): Choose whether to use .readRDS() or readRDS() based on R version. 2011-08-30 Sebastian P. Luque * ess-swv.el (ess-swv-plug-into-AUCTeX): Evaluate this function after loading tex. 2011-08-18 Rodney Sparapani * ess-bugs-d.el (ess-bugs-switch-to-suffix): let's not magnify burn-in (via the thinning multiple) 2011-08-17 Stephen Eglen * ess-r-d.el (ess-r-versions): Add "R32" and "R64" if working on a mac. 2011-07-28 Rodney Sparapani * ess-bugs-d.el (ess-bugs-switch-to-suffix): complete support for thinning: ESS[BUGS] appears to be ready for release 2011-07-27 Martin Maechler * ess-s-l.el (ess-insert-S-assign): factored out from ess-smart-underscore; now also assigned to A-- for *-MM-keys. 2011-07-22 Rodney Sparapani * ess-bugs-d.el (ess-bugs-na-bmd): workaround the OpenBUGS nohup bug with "at"; this time without creating additional files, i.e. piping to "at" 2011-07-20 Rodney Sparapani * ess-sas-a.el (ess-sas-cd): attempt to workaround Emacs bug; shell buffer snarfing the cd command. * ess-bugs-d.el (ess-bugs-na-bmd): ditto 2011-07-08 Rodney Sparapani * ess-bugs-d.el (ess-bugs-font-lock-keywords): adding keywords that are members of both the OpenBUGS script language and BRUGS (why the 2 sets are not the same; I don't know) 2011-07-05 Rodney Sparapani * ess-bugs-d.el (ess-bugs-na-bmd): workaround the OpenBUGS nohup bug with "at" 2011-06-24 Rodney Sparapani * ess-jags-d.el (ess-jags-na-jmd): we now support bash 2011-06-23 Rodney Sparapani * ess-bugs-l.el (ess-bugs-next-action): separation of ESS[BUGS] and ESS[JAGS] is now functional. ESS[JAGS] is pretty complete, but ESS[BUGS] is still in development, however, it does appear to work. 2011-06-22 Rodney Sparapani * ess-bugs-d.el (ess-bugs-font-lock-keywords): updating to new OpenBUGS scripting language (incomplete so far, but serviceable) 2011-06-21 Rodney Sparapani * ess-sas-a.el (ess-rtf-replace-chars): fixing form feed bug * ess-bugs-d.el/ess-custom.el/ess-compat.el: fix a bunch of bugs and get ESS[BUGS] working for GNU Emacs utilize (ess-sleep) after (shell) which, apparently, is necessary for GNU Emacs; rename ess-sleep-for to ess-sleep-for-shell and move to ess-custom 2011-06-20 Henning Redestig * ess-roxy.el (ess-roxy-get-function-args): Enhancement to handle in-definition comments per Tengfei Yin's request 2011-06-14 Rodney Sparapani * ess-utils.el (ess-revert-wisely): stores and restores the point after revert 2011-06-07 Rodney Sparapani * ess-sas-l.el (SAS-log-mode): change mode-name to ESS[LOG] so that tabbar-mode knows to list the .log's separately from the .sas buffers 2011-05-31 Rodney Sparapani * ess-sas-l.el (sas-fix-life-tables): re-implemented with re-search-forward/replace-match (fix-page-breaks): re-implemented with re-search-forward/replace-match; unfortunately, not really sure what this function is meant to do; probably not very useful to anyone at this point, but it does compile without any warnings! 2011-05-27 Rodney Sparapani * ess-sas-a.el: re-implemented rudimentary RTF support since GNU Emacs does not work with rtf-support.el (sadly, XEmacs has had this for over a decade); does NOT support font re-sizing; you are stuck with a point size of 8. Enjoy! 2011-05-26 Stephen Eglen * ess-inf.el (ess-eval-paragraph-and-step): Apply Erik Iverson's patch from Feb 2011, so that after evaluating the paragraph, it skips any blank lines and comments, just like ess-eval-line-and-step. (ess-eval-function-or-paragraph-and-step): As above. 2011-05-08 Sebastian P. Luque * ess-inf.el (ess-show-buffer): Fixed minor typo in doc string. 2011-05-05 Rodney Sparapani * ess-sas-a.el: several changes necessary to support GNU Emacs for ESS[SAS] batch 2011-04-06 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): most common SAS/Graph statements now added 2011-04-01 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): adding a few common SAS/Graph statements, but much more is left to be done 2011-03-25 Rodney Sparapani * ess-sas-l.el (sas-fix-life-tables): I assume that sed command worked for someone at some point, but it was not working for me; and it was overly complicated, so I simplified; hopefully it works now; please test. 2011-03-02 Sebastian P. Luque * ess-rutils.el: Standardized function names for consistency. Thanks to Cesar Rabak (ESS-help). 2011-02-28 Rodney Sparapani * ess-site.el, ess-bugs-l.el, ess-bugs-d.el, ess-jags-d.el: Batch BUGS is back! With OpenBUGS, a batch BUGS script is available for Linux. Therefore, since it seems that BUGS and JAGS must co-exist (rather than a transition from BUGS to JAGS), .bug files are in ESS[BUGS] mode and .jug files are in ESS[JAGS] mode. ESS[BUGS] now works like ESS[JAGS] rather than the orignal mode ESS[BUGS] mode which was difficult to maintain. However, ESS[BUGS] needs a lot of work such as support for thinning, multiple data files, etc. 2011-02-14 Sebastian P. Luque * ess-swv.el (ess-swv-add-TeX-commands): Use "%t" instead of "%s" when Sweave'ing via AUCTeX. 2011-02-13 Sebastian P. Luque * ess-custom.el (ess-swv-plug-into-AUCTeX-p): New customizable variable, which defaults to nil, to determine whether AUCTeX interface is enabled or not. * ess-swv.el: New functions to allow working with Sweave via AUCTeX. 2011-02-02 Richard M. Heiberger * ess-custom.el (ess-program-files, ess-program-files-64) (ess-SHOME-versions, ess-SHOME-versions-64) (inferior-S+6-program-name, inferior-Sqpe+6-program-name) (inferior-Sqpe+6-SHOME-name): Pathnames for all 32-bit and 64-bit versions of Sqpe. Add the most recent "/TIBCO/splus82" and make it the default. * ess-sp6w-d.el (ess-sqpe-versions-create): Give the function an argument of pathnames and an indicator whether they are 32-bit or 64bit pathnames. * ess-site.el (ess-s-versions-created): Use the revised functions and variables to find all 32-bit and 64-bit versions of Sqpe. 2011-02-01 Martin Maechler * ess-r-d.el (R): change use-dialog-box (to nil) only on windows. * ess-inf.el (ess-get-directory): now use new inferior-R-version which is set in the created R-X.Y version functions. 2011-01-31 Martin Maechler * ess-site.el (ess-rterm-version-paths): now use *long* filenames * ess-r-d.el (ess-r-versions-create): ditto; now produce "proper" version names. * ess-r-d.el (ess-rterm-arch-version): extend to return cons; and use "-32bit" / "-64bit" in the bi-arch cases. 2011-01-19 Stephen Eglen * ess-rd.el (Rd-preview-help): Quote filename to prevent spaces in filenames causing problems running the shell-command. Fix up so that navigation shortcuts present in normal R Help buffers work in the output buffer. Add a short docstring and tidy code. 2011-01-12 Richard M. Heiberger * ess-site.el (ess-rterm-version-paths): extend to find all 32-bit and 64-bit versions of R using both the newer R-2.12.x naming convention using the architecture-specific i386 and x64 subdirectories and the older R-2.11.x naming convention. * ess-r-d.el (ess-rterm-arch-version): Isolate this function from within ess-r-versions-create to construct an architecture-specific name for VERSION, an absolute path to R on Windows. * ess-r-d.el (ess-r-versions-create): Remove ess-rterm-arch-version into its own function. 2010-12-13 Stephen Eglen * ess-inf.el (ess-request-a-process): Set default to ess-dialect rather than ess-language. Patch from Vitalie S. 2010-11-27 Martin Maechler * ess-inf.el (ess-eval-buffer-from-beg-to-here, *-from-here-to-end): new functions thanks to Roland Rau, with * ess-mode.el (ess-mode-map, ess-mode-menu): key bindings C-c [up] / [down] and corresponding menu entries. 2010-11-25 Henning Redestig * ess-roxy.el (ess-roxy-preview): Fixed introduced bug that broke preview for functions with empty lines. 2010-11-24 Henning Redestig * ess-roxy.el (ess-roxy-get-function-args): fix bug that stopped ess-roxy from updating setMethod definitions. 2010-11-23 Henning Redestig * ess-roxy.el (ess-roxy-preview): enable preview for all types of entries (not only for functions) (ess-roxy-toggle-roxy-region): make toggle region operate on the visible region instead of the actual start and the beginning of the region (behave more like comment-region) * ess-mode.el (ess-mode-menu): link to new ess-roxy-preview-HTML function in the roxygen menu * ess-roxy.el (ess-roxy-preview-HTML): New function that generates (and opens) a HTML version of a roxygen entry. Request from Kevin Wright. 2010-11-02 Sebastian P. Luque * ess-help.el: Do not use (mapcar 'list ...) construct in `ess-get-help-files-list', and `ess-get-help-aliases-list', since we only need to create lists of lists in `ess-find-help-file', where it's needed for useful completion. Always return the existing `ess-help-topics-list' list if one exists for the current process. 2010-11-01 Sebastian P. Luque * ess-help.el (ess-find-help-file): Implemented caching of help topics (thanks to Vitalie Spinu). * ess-custom.el (ess-help-topics-list): New buffer-local variable needed for caching help topics. 2010-10-30 Martin Maechler * ess-rd.el (Rd-section-names, Rd-keywords): "subsection" etc 2010-10-28 Henning Redestig * ess-custom.el (ess-roxy-tags-param): Vinh Nguyens patch for updating the available roxygen tags 2010-10-21 Stephen Eglen * ess-site.el (interpreter-mode-alist): Condition upon XEmacs to prevent "r" regexp from matching interpreters like "perl". Bug reported by Alex Lancaster. 2010-10-14 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): bringing the PROCs up to v. 9.22 2010-09-30 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): many ERROR and WARNING messages end in period, period single space or period double space (the double space coming from ancient typewriter trained typists like myself) 2010-09-21 Rodney Sparapani * ess-mode.el (ess-electric-brace): fix curly braces bug for XEmacs as reported by Joshua Wiley 2010-09-20 Henning Redestig * ess-roxy.el (ess-roxy-update-entry): optionally do not fill parameter descriptions upon ess-roxy-update-entry. 2010-08-21 Stephen Eglen * ess-inf.el (ess-load-file): Check that tramp-tramp-file-p is defined before using. 2010-08-20 Stephen Eglen * ess-rdired.el (ess-rdired-objects): R variable names can include spaces; handle this case. Bug report by Sigve Berge Hofland 2010-08-14. * ess-inf.el (ess-load-file): If filename is a tramp-filename, preserve just the localname of the file. Bug report and patch provided by Erik Iverson 2010-08-13. 2010-08-11 Martin Maechler * ess-trns.el (ess-transcript-clean-region): give error (instead of "hang") when inferior-ess-prompt is empty. 2010-08-11 Henning Redestig * ess-custom.el: advice user that no empty lines are allowed in description * ess-roxy.el (ess-roxy-update-entry): improved documentation 2010-08-10 Henning Redestig * ess-custom.el (ess-roxy-template-alist): less cryptic default for description and details fields 2010-08-06 Henning Redestig * ess-roxy.el (ess-roxy-get-function-args): fixed bug: function args could not be fetched if 'function' was part of the function name 2010-07-29 Sebastian P. Luque * Makefile (clean): 4394 Reverted this rule to the previous version since it was intended to also clean files with older names. Removed 'ess-rdired.elc' from this rule, since it is already in the ELC variable, and "clean" removes those files. However, kept the fixed 'ess-xls-d.elc' and 'ess-vst-d.elc' rules. 2010-07-28 Sebastian P. Luque * ess-inf.el: 4369 Corrected autoloading of `ess-R-complete-object-name' (due to old renaming below). * Makefile: 4350 Corrected the "clean" target to account for old renaming of essd-* files. 2010-07-12 Martin Maechler * ess-s-l.el (ess-use-this-dir): renamed and moved here: For S and R. (ess-mode-hook): bind ess-use-this-dir to M- 2010-07-05 Stephen Eglen * ess-r-d.el (ess-R-use-this-dir): New defun. 2010-07-01 Stephen Eglen * ess-eldoc.el (ess-use-eldoc): Use the new R-mode-hook instead of ess-mode-hook. 2010-06-26 Martin Maechler * ess-custom.el (R-mode-hook): new, use in * ess-site.el: add ess-roxy-mode to R-mode-hook instead of ess-mode-hook. 2010-06-22 Martin Maechler * ess-swv.el: allow customizable "pdflatex" command, via * ess-custom.el (ess-swv-pdflatex-commands, ess-sweave): new variable, in new group; 2010-06-22 Stephen Eglen * ess-inf.el (ess-complete-filename): Use comint-dynamic-complete-filename so that filename is not expanded. * ess-r-d.el (ess-R-complete-object-name): If there are no possible-completions, should return nil, so that when this function is called from comint-dynamic-complete-functions, other functions can then be tried. This should fix bug that history expansion was not working (reported by Vinu Jacob). 2010-06-10 Martin Maechler * ess-r-d.el (ess-dirs): give a message, and also set ess-directory. 2010-06-06 Sebastian P. Luque * ess-swv.el (ess-swv-PDF): 4308 Fixed cmdstr-*. * ess-rutils.el (ess-rutils-updatepkgs): 4352 Use better defaults. 2010-06-03 Sebastian P. Luque * ess-help.el (ess-find-help-file): 4318 Replaced `delete-dups' by `ess-uniq-list', since XEmacs doesn't know about it. * ess-rutils.el: 4345 Redesigned menu generation and key binding definitions so that Xemacs understands them. 2010-06-03 Stephen Eglen * ess-inf.el (inferior-ess-mode): Bind M-RET to 'ess-dirs in *R* and *S* buffers only. * ess-r-d.el (ess-dirs): New function. 2010-05-26 Sebastian P. Luque * ess-rutils.el (ess-rutils-objs): 4299 Added `fit-frame' (if available) after calling rdired. 2010-05-23 Richard M. Heiberger * ess-site.el, ess-r-d.el: Detect cases when `R/R-x.y.x' exists and `R/R-x.y.z/bin/Rterm.exe' does not exist. In `ess-find-rterm' in file `ess-r-d.el', replace such values with `nil'. In `ess-site.el', use `ess-flatten-list' to remove the `nil'. 2010-05-20 Rodney Sparapani * ess-sas-a.el (ess-sas-file-path/ess-sas-rtf-portrait): creation of portrait RTFs with the ESS[SAS] font sizes for non-ESS[SAS]-related buffers, such as .el, now allowed, but functionality is somewhat limited TODO: ess-sas-rtf-landscape 2010-05-19 Rodney Sparapani * ess-custom.el (ess-eval-deactivate-mark): The default is true since ESS version 5.9, except on XEmacs which doesn't have \\[deactivate-mark] and friends 2010-05-18 Rodney Sparapani * ess-inf.el (ess-eval-linewise): Partially work around a bug in GNU Emacs 23.x; thanks to Markus Triska; see http://article.gmane.org/gmane.emacs.ess.general/4366 2010-05-18 Stephen Eglen * ess-custom.el (ess-own-style-list): New customized variable. (ess-add-style): New function, to allow new indentation styles to be added. Nine indentation variables no longer defcustom, as they are set through the `ess-set-style' code, and thus not directly changeable by the user via customize. 2010-05-17 Sebastian P. Luque * ess-help.el: 4278 `ess-find-help-file' now calls the additional function `ess-get-help-aliases-list' so that it offers completion on aliases, in addition to object names, removing duplicates. 2010-05-17 Richard M. Heiberger * ess-site.el: I added a call to `w32-short-file-name' on each item in `ess-rterm-version-path'. Otherwise Windows can't find files with embedded spaces in the directory name. I redefined S in Windows. Now it gives a message to start the S GUI from the icon and then connect to it with M-x `S-existing'. This applies to M-x S, to the S menu item, and to clicking on the icon. * ess-sp6w-d.el: turned off a few more `use-dialog-box' and put in some more `w32-short-file-name' calls. 2010-05-16 Richard M. Heiberger * ess-sp6w-d.el, ess-r-d.el: set `use-dialog-box' to nil for Windows. Old version of Windows can't load directories from the dialog. * ess-site.el: I revised `ess-rterm-version-path' so it will find both 64-bit and 32-bit versions of R on 64-bit Windows. I tested it on 64-bit Windows 7 and 32-bit Windows XP. * ess-toolbar.el: add C-c C-c `ess-eval-function-or-paragraph-and-step' to `ess-toolbar-items'. Started to change spluslogo to splus_icon_small logo (from S-Plus 7 and earlier to S+ 8). This needs an xpm and ppm file and permission from TIBCO. I wrote to Lou Bajuk asking for permission. 2010-05-13 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): we can safely assume that any line starting with @ is not a NOTE, ERROR or WARNING. TODO; create separate .sas and .log keywords 2010-05-10 Sebastian P. Luque * ess-swv.el (ess-swv-PDF): 4251 Fixed command string for `shell-command' to view file. 2010-05-05 Martin Maechler * ess-site.el (ess-font-lock-mode): is alone determining the turn-on-font-lock setting in the major modes' hooks. * ess-roxy.el (ess-roxy-preview-Rd): more careful checking if require(roxygen) works. 2010-05-03 Rodney Sparapani * ess-inf.el (ess-eval-region): don't call deactivate-mark unless it is bound 2010-04-26 Henning Redestig * ess-roxy.el (ess-roxy-insert-args): do not add param field to functions without arguments * ess-mode.el (ess-mode-menu): menu entries for editing roxygen entries 2010-04-16 Sebastian P. Luque * ess-rutils.el (ess-rutils-keys): 4298 Turn on by default, now that bindings do not interfere with anything. 2010-04-15 Sebastian P. Luque * ess-rutils.el: 4297 Unconditionally activate submenu Rutils, and changed key bindings to avoid using 'C-c c' (reserved for users). 2010-04-14 Sebastian P. Luque * ess-rutils.el (ess-rutils-htmldocs): 4296 Fixed doc string. 2010-04-13 Sebastian P. Luque * ess-rutils.el: 4290 Incorporated R function .rutils.help.start(), defined in etc/ess-rutils-help-start.R so that `ess-rutils-htmldocs' is now fully functional. (ess-rutils-rhtml-fn): 4294 Use `expand-file-name' to define path to ess-rutils-help-start.R. Reintroduced autoloading of ess-rdired.el; we really need it. 2010-04-11 Sebastian P. Luque * ess-rutils.el: 4271 Provided optional argument REMOTE to `ess-rutils-htmldocs', fixed doc strings throughout. 2010-04-10 Martin Maechler * ess-s-l.el (S-indent-line): also consider '#!'; using patch from Jeffrey Arnold * ess-site.el (interpreter-mode-alist): ditto * ess-mode.el (ess-comment-indent): ditto 2010-03-25 Martin Maechler * ess-roxy.el (ess-roxy-get-function-args): also remove tabs 2010-03-24 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): although note is a keyword in SAS/GRAPH, it is not used very much, but the false positive %put note: ...; is used quite often; therefore, the note statement is no longer fontified 2010-03-24 Martin Maechler * ess-roxy.el (ess-roxy-mode): font-lock-add-keywords etc is not available and hence not called for XEmacs. 2010-03-22 Martin Maechler * ess-custom.el (ess-eval-deactivate-mark): change default to t 2010-02-16 Sebastian P. Luque * ess-rutils.el: 4268 Removed `ess-rutils-chgdir', already available as `ess-change-directory' in ess-utils.el, and rebound key to that function in menu and optional key bindings. 2010-02-15 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): more statement names 2010-02-05 Stephen Eglen * ess-custom.el: Tidy up docstrings for defcustom items. Asterisk is not used at start of docstring; prefer 'Non-nil means ...' notation for binary variables. 2010-02-05 Sebastian P. Luque * ess-rutils.el: 4265 Placed `ess-rutils-keys' under the ess-R customization group, not under the inexistent ess-r. 2010-02-05 Henning Redestig * ess-custom.el (ess-user-full-name): defines the user name which is also becomes default for the author field in roxy entries 2010-02-04 Sebastian P. Luque * ess-rutils.el: New file 2010-02-03 Rodney Sparapani * Makefile (clean): remove more (and hopefully all) legacy .elc files * renamed ess-mous.el to ess-mouse.el (renames appear to be complete) 2010-02-02 Henning Redestig * ess-roxy.el (ess-roxy-update-entry): corrected behavior when adding roxygen entries to function with preceeding comments * deleted ess-roxygen.el * ess-r-d.el removed references to ess-roxygen.el * ess-site.el removed references to ess-roxygen.el, replaced with ess-roxy.el 2010-02-01 Rodney Sparapani * Makefile: add ess-comp.el to dependencies for targets with PRELOAD (as it should be) 2010-01-27 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): new procedure names for SAS/STAT 9.0/9.1/9.2 2010-01-26 Rodney Sparapani * renamed essl-s.el to ess-s-l.el * renamed essddr.el to ess-rd.el * renamed essd-sp6w.el to ess-sp6w-d.el * renamed essd-sp6.el to ess-sp6-d.el * renamed essd-sp5.el to ess-sp5-d.el * renamed essd-sp4.el to ess-sp4-d.el * renamed essd-sp3.el to ess-sp3-d.el * renamed essd-s4.el to ess-s4-d.el * renamed essd-s3.el to ess-s3-d.el * renamed essd-rgui.el to ess-r-gui.el * renamed essd-r.el to ess-r-d.el * renamed essd-r-args.el to ess-r-args.el * renamed essa-r.el to ess-r-a.el * renamed ess-cust.el to ess-custom.el * renamed ess-emcs.el to ess-compat.el 2010-01-22 Martin Maechler * ess-roxy.el: new file from Henning Redestig, after moving customizations to * ess-cust.el: + ess-roxy things 2010-01-20 Rodney Sparapani * ess-sas-l.el (SAS-mode-font-lock-keywords): add some common survival analysis statements to keywords (SAS-mode-font-lock-keywords): remove some common false positives for 1 and 2 letter SAS statements * Makefile (clean): remove old-fashioned names too (see below) 2010-01-18 Rodney Sparapani * essl-bugs.el renamed to ess-bugs-l.el * essd-bugs.el renamed to ess-bugs-d.el * essd-jags.el renamed to ess-jags-d.el * essl-sas.el renamed to ess-sas-l.el * essd-sas.el renamed to ess-sas-d.el * essa-sas.el renamed to ess-sas-a.el * essl-sta.el renamed to ess-sta-l.el * essd-sta.el renamed to ess-sta-d.el 2010-01-18 Stephen Eglen * essd-els.el (ess-remote): Use `ess-current-process-name' as the local process name if none passed to ess-remote. 2010-01-18 Martin Maechler * ess-utils.el: drop (ess-chop1) * essd-r.el (ess-r-versions-create): no longer use ess-chop1 2009-12-07 Martin Maechler * ess-inf.el (ess-ddeclient-p): fix blunder; add (ess-force-buffer-current) for now. 2009-12-04 Martin Maechler * ess-inf.el (ess-load-file): use microsoft-p instead of (ess-ddeclient-p) as that fails to start R automagically. 2009-12-01 Rodney Sparapani * essa-sas.el (ess-sas-graph-view-viewer-default): kodakimg went the way of the dodo 2009-11-30 Rodney Sparapani * essa-sas.el (ess-sas-rtf-portrait): oops, 11 is too big, but 10.5 is just right; also, refresh the file before making an RTF out of it 2009-10-28 Martin Maechler * ess-site.el (ess-microsoft-p): add 'help_type = "text"' to post-run-hook in the microsoft case. 2009-10-26 Martin Maechler * ess-cust.el (inferior-ess-r-help-command): use .help.ESS() now * essd-r.el (R): define .help.ESS(), R-version dependently 2009-10-09 Rodney Sparapani * essa-sas.el (ess-sas-rtf-portrait): boost portrait font point size to 11 2009-10-07 Rodney Sparapani * essa-sas.el (ess-sas-rtf-font-name): now you can specify the font that MS RTF are created with; previously, these were created with courier, however, this font is thin and hard to read with MS Office and OpenOffice 2009-10-06 Stephen Eglen * ess-cust.el (inferior-ess-r-help-command): New variable to allow htmlhelp to be set. * essd-r.el (R-customize-alist): Use above var. 2009-09-21 Rodney Sparapani * ess-mode.el (ess-electric-brace): skeleton-pair takes precedence 2009-09-02 Rodney Sparapani * essa-sas.el (ess-sas-rtf-portrait): OpenOffice Writer and Microsoft Word have different default margins which often leads to the same document displayed differently in each of the applications. The wider OOWriter margins are now enforced so that either application can be used to view the documents correctly. 2009-08-05 Rodney Sparapani * ess-cust.el (ess-r-args-electric-paren): must default to nil requires a conscious decision to turn on since it will mysteriously override smart-paren features like skeleton-pair * ess-mode.el (ess-mode): define "(" key only when ess-r-args-electric-paren is t for similar reasons 2009-06-16 Rodney Sparapani * ess-trns.el (ess-transcript-send-command-and-move): patch supplied by tyler.smith@mail.mcgill.ca see the related discussion at https://stat.ethz.ch/pipermail/ess-bugs/2008q1/000489.html 2009-06-08 Martin Maechler * ess-inf.el (ess-eval-linewise): keep deactivate-mark local 2009-06-05 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): missed an abbreviated keyword 2009-06-05 Stephen Eglen * ess-utils.el (ess-change-directory): New function. 2009-06-04 Rodney Sparapani * ess-utils.el (ess-num-or-zero): added (ess-num-or-zero arg) If arg is a number, then return that number, otherwise return 0 * essa-sas.el (ess-sas-goto): fix the long-time bug of generating an error in (ess-sas-goto "log") when .log does not exist 2009-06-03 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): adding a few more rare NOTES * ess-mode.el (ess-mode): turn off annoying message by default, pass nil to turn it back on (ess-set-style something nil) 2009-06-02 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): kill a false positive bug for ERRORs/WARNINGs 2009-06-01 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): in: needs to be a special case for some reason 2009-05-28 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): last tweak to comment statement identification (very optimistic) * essa-sas.el (ess-sas-goto-log): no longer highlighting error messages this feature never worked quite right (and was XEmacs only which is worse) after highlighting an error message, moving point would cause an unwanted highlighting between point and mark; why god, why?!? 2009-05-27 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): get MPRINT right in the case where it is followed by a comment and add Pipe command= and fix functions finally 2009-05-26 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): make call functions explicit, correct a few omissions, add RX functions... note that not all functions are yet on the list as there are LOTS of functions also, fixing a bug... int( should only be matched at the beginning of a word, however, it seems to also be finding MPRINT(. there must be a bug in the font-locking code somewhere 2009-05-22 Rodney Sparapani * essl-bugs.el, essd-bugs.el, essd-jags.el, essl-sas.el, essa-sas.el: update headers/copyrights * essl-sas.el (SAS-mode-font-lock-keywords): fine-tuning ERRORs/WARNINGs 2009-05-21 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): a few minor changes, ERRORs/NOTEs/WARNINGs 2009-05-20 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): fix error messages that go to two lines and kill a long-running bug biting adjacent comments /* comment type 1 */ followed by * comment type 2 ; migration complete! (should have done it 9 years ago) there are certainly going to be some special/missed cases of false positives/negatives (bug reports and patches welcome!) 2009-05-19 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): more alphabetizing, re-arranging, etc. 99.95% 2009-05-18 Rodney Sparapani * essa-sas.el (ess-sas-toggle-sas-log-mode): really, really fixed now (3rd times a charm) 2009-05-15 Rodney Sparapani * ess-eldoc.el/ess-roxygen.el/ess-toolbar.el: added GPLv2 or later header, etc. * essl-sas.el (SAS-mode-font-lock-keywords): a few fixes for functions and a missed NOTE 2009-05-14 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): major overhaul complete (99.9%) PROCs now highlighted most keywords recognized (however, some dataset options are still needed) NOTEs and WARNINGs better detected in .log (ess-sas-run-regexp-opt): the new font-locking is better in many ways than the old font-locking so the default is now to use it; set this variable to nil to use the old font-lock code * essa-sas.el (ess-sas-toggle-sas-log-mode): still trying to get this right, first kill .log buffer, then re-open (see below) 2009-05-13 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): a few more keywords, a bug-fix and some comment re-organization, 99.5% 2009-05-12 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): even more fixes 2009-05-11 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): more simplification/alphabetization; 99% complete 2009-05-08 Rodney Sparapani * ess-font-lock.el (ess-font-lock-rmh, etc.): modify so they work on XEmacs * essl-sas.el (SAS-mode-font-lock-keywords): more fixes and some alphabetizing (seriously, let's keep these in order, otherwise, it is very difficult to maintain) 95% of the hand-coded regexps now handled by regexp-opt, 2009-05-04 Rodney Sparapani * essa-sas.el (ess-sas-toggle-sas-log-mode): to re-font-lock, reverting may not be enough; killing buffer and re-opening is necessary in some circumstances * essl-sas.el (SAS-mode-font-lock-keywords): 3/4's of the way there. regexp-opt code updated to a reasonable fax of the font-lock code it replaced. 2009-04-20 Rodney Sparapani * essl-sas.el (ess-sas-run-regexp-opt): the long overdue change from make-regexp to regexp-opt is under way. Setting ess-sas-run-regexp-opt to something other than nil will result in the old make-regexp code to be used by regexp-opt. This is a half-step in the right direction. The regexp-opt code will be easier to maintain than the hand-coded regexps. However, this means that the font-locking will revert to what it was circa 2001-2 :o( Over time, this code will be upgraded so that the font-locking will be up-to-date with what is currently available and incorporate the changes necessary for v. 9.2 and beyond. 2009-04-01 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): add PROC MAPIMPORT 2009-03-16 Stephen Eglen * ess-toolbar.el (ess-make-toolbar-emacs): For Emacs 23, images need to be on image-load-path. This variable is set at bottom of the file. 2009-03-13 Stephen Eglen * essd-bugs.el (ess-bugs-mode): Set comment-start to provide basic comment functionality. 2009-03-05 Rodney Sparapani * essa-sas.el (ess-sas-rtf-portrait, ess-sas-rtf-us-landscape, ess-sas-rtf-a4-landscape): after creation, close rtf buffer, avoids an annoying confirmation question about visiting buffer 2009-02-26 Rodney Sparapani * essl-bugs.el (ess-bugs-hot-arrow): Substitute <- for = key press 2009-01-30 Stephen Eglen * essd-r-args.el (tooltip-show-at-point): New function. Contributed by Erik Iverson . (ess-r-args-show): Use tooltip-show-at-point. 2009-01-22 Martin Maechler * ess-mode.el (ess-mode): use run-mode-hooks only in newer Emacsen 2009-01-08 Martin Maechler * essddr.el (Rd-keywords): new + shuffling + comment * essd-sas.el (SAS-mode): activate a bug fix; BTW, it's for 22.3 and 22.2 2009-01-07 Rodney Sparapani * essd-sas.el (SAS-mode): fix a bug in GNU Emacs 22.3.1 which erroneously performs font-lock on lowercase only 2008-12-17 Rodney Sparapani * ess-site.el: we no longer should be encouraging users to edit this file (except possibly in extraordinary circumstances in 2 places). Therefore, I have removed all but 2 references to uncommenting of code. However, the examples are instructive so they remain, but the wording does not suggest uncommenting. This is only a half-step in the direction that we want to go. 2008-12-15 Rodney Sparapani * essd-jags.el (ess-jags-switch-to-suffix, ess-jags-na-bug): adding 2 new local variables: ess-jags-burnin and ess-jags-update. ESS[BUGS] has similar variables, but the modern defaults are an order of magnitude bigger, so it seemed like creating new variables was warranted also, the "log" of the run is now .jog (like BUGS which is .bog); .out created too many problems since the BOA output files have that extension as well 2008-12-11 Martin Maechler * noweb-mode.el (noweb-indent-line): update chunk vector first: fixes buglet {[Enter] in almost empty *.Rnw buffer} reported by Henric Nilsson. (noweb-code-quotes-handling): now *disables* by default the calling of the (noweb-hide-code-quotes) .. (noweb-restore-code-quotes) pair, consequently preventing catastrophic behavior in large *.Rnw files with "[[" in R output. 2008-12-04 Rodney Sparapani * ess-mode.el/ess-trns.el: delete key no longer remapped to "backspace" 2008-12-04 Martin Maechler * ess-site.el: ess-r-versions-created currently needed too. 2008-11-29 Martin Maechler * noweb-mode.el: TODO cleanup; notably replacing more (stringp (car (noweb-find-chunk))) by (noweb-in-code-chunk). * noweb-mode.el (noweb-mode): use before-change-functions, noweb-chunk-boundary-changed etc; code from Markus Triska. 2008-11-28 Martin Maechler * noweb-mode.el (noweb-electric-<): {from Markus Triska}: also insert a (closing) "@". * ess-emcs.el (w32-short-file-name): Xemacs 21.5(beta) on Windows does not know win32-short-file-name anymore, but mswindows-*. 2008-11-27 Martin Maechler * ess-emcs.el (ess-has-tooltip): move from ./ess-cust.el and test for Emacs >= 21.x. Consequently ESS works again in 'emacs-20.7 -nw'. 2008-11-26 Martin Maechler * ess-swv.el (ess-swv-menu): a version that "works" with Xemacs; still with a FIXME. * noweb-mode.el, ess-rdired.el: replace (next-line .) by (forward-line .); also get rid of compilation warning about noweb-font-lock-mode. 2008-11-25 Martin Maechler * noweb-mode.el (noweb-mode): fix "add-local-hook" thinko; also correctly indent (and use ';;' for full-line comments) 2008-11-24 Rodney Sparapani * essd-jags.el (ess-jags-mode): adding comment-region functionality to ESS[JAGS] * essd-jags.el (ess-jags-switch-to-suffix): JAGS 1.0.3 is very finicky about monitor-ing AND thin-ing; the syntax and semantics are primitive; most likely this will be re-visited in a future release of JAGS; in the time being, a minor change to ESS[JAGS] and the recommendation that variables be monitor-ed implicitly via the Local Variable ess-jags-monitor 2008-11-20 Martin Maechler * ess-swv.el (noweb-minor-mode-menu): add to "Noweb" menubar menu. 2008-11-17 Rodney Sparapani * Makefile (essl-sas.elc): Added formerly unaccounted for essa-sas.el dependency. * Makefile (essl-bugs.elc/essd-bugs.elc/essd-jags.elc): Added formerly unaccounted for BUGS/JAGS targets/dependencies. 2008-11-14 Stephen Eglen * essd-r.el (R-mode): Add keybinding (C-c C-o) for ess-roxygen-fn. * ess-site.el (ess-roxygen-fn): Add autoload. * ess-roxygen.el (ess-roxygen-fn): Ensure that newlines before and after template are inserted correctly. 2008-11-13 Rodney Sparapani * essl-sas.el (SAS-editing-alist): M-x comment-region was not using /* */ style comments for some reason that I can't fathom. It is now. 2008-11-10 Rodney Sparapani * noweb-mode.el (noweb-mode): Only the local value of after-change-functions should be modified to avoid problems in other modes. Special thanks for the bug report/fix from markus.triska@gmx.at * noweb-mode.el (noweb-mode): By convention, every major mode starts by calling `kill-all-local-variables'. Importantly, this automatically calls `change-major-mode-hook'. This is documented in the "Major Mode Conventions" of the Elisp info manual. Special thanks (again :o) for the bug report/fix from markus.triska@gmx.at * ess-mode.el (ess-mode): `ess-mode' should use `run-mode-hooks' rather than `run-hooks', because it is a major mode. This way, you ensure that `change-major-mode-hook' is called (and everything else). Special thanks for the bug report/fix from david.reitter@gmail.com 2008-11-06 Rodney Sparapani * ess-swv.el: fix for embedded blanks in PDF reader and PDF files 2008-10-28 Rodney Sparapani * ess-cust.el (ess-sta-delimiter-friendly): see below * ess-inf.el (ess-eval-linewise): Stata allows semi-colons to be used in batch, but not interactive processing. This leads to madness when you are trying to step through a file that was written for batch with semi-colons. Now, if you set ess-sta-delimiter-friendly to t (in the ess-Stata group), iESS[Stata] will convert semi-colons to newlines on-the-fly. Beware if you have string literals with embedded semi-colons as this simple fix does not check for such complexity. 2008-08-30 Martin Maechler * ess-cust.el (ess-R-common-font-lock-keywords): new variable for better modularization (inferior-ess-R-font-lock-keywords): now with*OUT* the keywords. Ditto for -S- instead of -R- . 2008-08-25 Martin Maechler * ess-mode.el (ess-end-of-function): more careful final advance. 2008-08-24 Stephen Eglen * ess-roxygen.el (ess-roxygen-fn): Use ##' for markup so that comments don't move upon reindentation. 2008-08-23 Stephen Eglen * ess-roxygen.el: New file. 2008-08-20 Martin Maechler * noweb-mode.el (noweb-set-chunk-code-mode): use (regexp-quote chunk-name) instead of just chunk-name, here and in another few cases. Thanks to a patch from Rafael Laboissiere at Debian. 2008-07-30 Martin Maechler * ess-inf.el (ess-eval-region): (deactivate-mark) when the new customizable variable * ess-cust.el (ess-eval-deactivate-mark): is non-nil. 2008-07-28 Martin Maechler * ess-mode.el (ess-end-of-function): tweak 2008-07-23 Martin Maechler * ess-mode.el (ess-end-of-function): if not at end of line move further. 2008-07-22 Martin Maechler * essd-r-args.el (ess-r-args-auto-show): only "act" if ess process is still active 2008-07-18 Rodney Sparapany * essd-jags.el (ess-jags-switch-to-suffix): using ess-jags-system; see long svn message 2008-06-12 Stephen Eglen * essd-r.el (ess-R-complete-object-name): comint-bol given nil argument to work on XEmacs (the arg is optional on Emacs, but not in XEmacs). 2008-06-09 Martin Maechler * ess-inf.el (get-ess-process): if NAME is not running, do not automatically restart a new process, if there are others running. 2008-06-03 Stephen Eglen * ess-cust.el (ess-default-style): Remove quote from RRR value. 2008-05-24 Martin Maechler * ess-inf.el (ess-start-process-specific): new function, implementing the process (re)start of yesterday (get-ess-process): also call ess-start-process-specific) if the process is no longer running. (ess-eval-line-and-step): (save-excursion ..) even earlier. 2008-05-23 Martin Maechler * ess-inf.el (ess-request-a-process): when there is no associated ess process, start R automagically if ess-language is "S" 2008-05-22 Stephen Eglen * Makefile (ELC): Add ess-eldoc.elc to the ELC variable list. Debian bug 482351 reported by Sebastian Luque. 2008-05-19 Martin Maechler * ess-inf.el: use make-local-variable 'comint-use... to silence warning 2008-04-10 Martin Maechler * ess-cust.el (ess-use-R-completion): customizable boolean for this: * ess-inf.el (ess-internal-complete-object-name): new name for original (ess-complete-object-name). * ess-inf.el (ess-complete-object-name): now simple wrapper to either ess-R-complete-object-name or ess-internal-complete-object-name. * essd-r.el (R): use ess-R-complete-object-name for R versions >= 2.5.0 {where pkg 'rcompgen' became recommended}; check for baseenv() only for older versions of R. 2008-04-07 Martin Maechler * ess-emcs.el (ess-line-beginning-position): defalias renamed from original 'line-beg...' in order to be good emacs citizens. 2008-03-31 Martin Maechler * essd-r.el (R-fix-T-F): remove "_" (and extraneous "\"); thanks to Stephen 2008-03-31 Stephen Eglen * ess-mode.el (ess-continued-statement-p): remove _ from regexp to fix Kurt's bug re indendation after NA_INTEGER_ 2008-03-11 Stephen Eglen * ess-cust.el (custom): Remove old code checking if custom package is provided; custom is now in all recent versions of Emacs and XEmacs. 2008-03-11 Martin Maechler * essd-r.el (ess-current-R-version, ess-current-R-at-least): two new utilities. * essd-r.el (ess-R-complete-object-name): modified from Jim MacDonald's 'alt-ess-complete-object-name, to work in R >= 2.7.0. 2008-03-05 Martin Maechler * ess-inf.el (inferior-R-input-sender): wrap into (save-current-buffer . ); thanks to patch from Lawrence Mitchell. 2008-01-17 Martin Maechler * ess-noweb.el (ess-noweb-use-font-lock): change default from window-system to font-lock-mode 2008-01-08 Martin Maechler * essl-s.el (ess-fix-miscellaneous): no 'literal in fixing "; #" 2007-12-28 Stephen Eglen * essd-sp6w.el (S+6-dialect-name): Make defcustom and change default to "S". Change of default suggested by Tim Hesterberg. 2007-12-27 Martin Maechler * ess-mode.el (ess-mode): set style to ess-style which is now in ess-mode-editing-alist .. which is now correctly defined in * essl-s.el (R-editing-alist): etc 2007-12-11 Martin Maechler * essd-r.el (inferior-ess-primary-prompt): s / * / ? / * ess-inf.el (ess-command): new optional argument 'no-prompt-check (ess-get-words-from-vector): ditto; make use of (ess-if-verbose-write); trailing white space "nuking" * ess.el: (ess-if-verbose-write): new shortcut for more compact code in other places. 2007-11-08 Stephen Eglen * ess-eldoc.el (ess-eldoc): Prefix the docstring by the name of the function, for readability. 2007-11-07 Stephen Eglen * ess-cust.el (ess-font-lock-mode): New variable. * ess-site.el: Use ess-font-lock-mode. 2007-09-28 Martin for Rodney Sparapany * essd-r.el (ess-find-rterm): yet another "replace \\ by /", needed for Xemacs (on Windows). 2007-09-12 Martin Maechler * essd-r.el (ess-r-versions-create): merged ess-rterm-versions-create into this one, using (if ..microsoft..); * ess-site.el: ditto * essd-r.el (ess-find-newest-R): fix M$: use ess-rterm-version-paths (ess-check-R-program-name): renamed from ess-check-R-name * ess-cust.el (ess-rterm-version-paths): add to doc string * ess-site.el: cleanup comments in "finding R versions" part 2007-09-11 Martin Maechler * ess-site.el (ess-versions-created): slightly more parallelism between microsoft and "normal". * ess-utils.el: remove long deprecated (defun ess-directory-sep) (ess-chop1, ess-drop-non-directories): new utilities. * essd-r.el (ess-r-versions-create): and (ess-rterm-versions-create): parallelized much more, to be merged later. (ess-find-rterm): now make use of ess-drop-non-directories: a "zip" file starting with R-2.6 now longer harms. 2007-09-10 Martin Maechler * ess-cust.el (R-editor et al): use "gnuclient" instead of "... -q" for Xemacs 2007-09-03 Martin Maechler * ess-comp.el (ess-message): use format-string - exactly * ess-site.el: {ditto} paralleling (message .); such that we can use (... "%s" msg) as recommended in here: * essd-r-args.el (ess-r-args-show): 2007-08-23 Martin Maechler * ess-cust.el (ess-SHOME-versions, et al): use (getenv "ProgramFiles") instead of "c:/progra~1..."; ditto in * essd-r.el etc. 2007-08-22 Martin Maechler * ess-site.el: replace kludgey (defun find-load-file-directory) by simple (locate-library .) thanks to a hint from Philipp Lord. 2007-08-15 Martin Maechler * essd-r-args.el (require 'tooltip): only when ess-has-tooltip is set; which is the case by default when *not* in Xemacs. 2007-07-26 Martin Maechler * ess-cust.el (ess-r-args-electric-paren): default changed to t; newbies should see the new feature automatically. 2007-07-24 Stephen Eglen * essd-r.el (ess-find-newest-R): New defun, to find the newest version of R, either for Unix or Windows. Result is cached in a variable, ess-newest-R. (ess-check-R-name): New defun to check that inferior-R-program-name points to an executable. (R-newest): Use ess-find-newest-R defun. (ess-find-newest-R): Add message whilst searching. * ess-site.el: Call ess-check-R-name once, upon startup. Searching for newest version takes place only if inferior-R-program-name is invalid. 2007-07-23 Stephen Eglen * ess-eldoc.el (ess-eldoc): Use ess-local-process-name rather than ess-current-process-name. 2007-07-21 Stephen Eglen * ess-inf.el (ess-command): Use with-current-buffer and simplify. * ess-help.el (ess-help-underline): Fix indenting. (ess-describe-sec-map): Use with-current-buffer. 2007-07-21 Martin Maechler * ess.el (ess-write-to-dribble-buffer): patch from Markus Triska . Most importantly, deactivate-mark is set to nil so that any active region is not affected. (Without this, in transient-mark-mode in GNU Emacs, highlighting of the region is lost when moving over chunks, and M-h (= mark-paragraph) on chunks doesn't work as expected.). Now also use with-current-buffer. 2007-07-16 Stephen Eglen * ess-site.el (ess-sqpe-versions-created): Remove call to ess-newest-R, and instead allow R-newest to find the newest version of R. This relies on a new devar, ess-r-versions-created, to store the other versions of R that were found when ess-site was loaded. * essd-r.el (R-newest): New defun. First time it is called, try to find the newest version of R. (ess-newest-r): Just return the name of the newst version of R; let R-newest do the fset call. * ess-mode.el (ess-function-pattern): Add defvar to quieten byte compiler. * ess-help.el (ess-help-mode): No need to make ess-local-process-name buffer local; that's done elsewhere. * ess-inf.el (ess-execute): Ditto. * ess-cust.el: Update many doc strings, and change some vars from defcustom to defvar. 2007-07-14 Stephen Eglen * essd-r.el (ess-find-newest-date): this-r should be a local var. 2007-07-13 Stephen Eglen * essd-r.el (ess-r-version-date): New defun, replacing ess-r-version-time as it returns the date stamp of R as a string rather than a time in seconds. (ess-find-newest-date): New defun, replacing ess-which-newest-date. 2007-07-11 Stephen Eglen * essd-r.el (ess-newest-r, ess-r-version-time, ess-which-newest): New defuns to find the newest version of R. * ess-site.el (ess-sqpe-versions-created): Use ess-newest-r. 2007-07-01 Stephen Eglen * ess-eldoc.el: New file: add support for ELDOC in R buffers. * essd-r-args.el (ess-r-args-get): Use ?\( rather than using string-to-char. Other small typo/doc fixes. 2007-06-29 Stephen Eglen * essl-sta.el (ordinary-insertion-filter): Delete this defun, it is also in ess-inf.el * ess-inf.el (inferior-ess-mode): Ensure font-lock-keywords-only is t (to fix bug in Emacs 22.1). Other small changes: - using `member' rather than lots of `string=' comparisons. - replacing (if cond (progn ...)) by (when cond ...) - replacing: (make-local-variable some-var) (setq some-var val) with (set (make-local-variable some-var) val) 2007-06-27 Stephen Eglen * ess-site.el (ess-restore-asm-extns): use `when' rather than `(if x (progn ...))'. 2007-06-13 Martin Maechler * ess-cust.el (ess-r-args-electric-paren): new custom variable to be used to toggle the `electric "(" behavior' in essd-r-args.el * ess-mode.el (ess-mode): define-key .. "(" if ..-electric-paren is set. * essd-r-args.el (ess-r-args-auto-show): new small function; activated by the above custom variable. (ess-r-args-get): use 'force ==> less asking for process 2007-06-13 Rodney Sparapani * essl-sas.el (SAS-mode-font-lock-keywords): fix in the "dlreg|hreg|..." regular expresseion. 2007-05-21 Martin Maechler * ess-inf.el (ess-request-a-process): give (message .) when not asking {see 2007-05-03}. 2007-05-11 Martin Maechler * ess-cust.el (ess-r-args-show-as): and others: moved (defvar ...) to * essd-r-args.el: and changed to (defcustom ...) * ess-cust.el (ess-S-non-functions): new variable to be used by * ess-cust.el (ess-r-args-keep-silent): new customizable variable. 2007-05-04 Stephen Eglen * essd-r.el(?`): define the backquote (`) character to be in the quote character syntax class. * ess-cust.el: Doc fix to comment regarding regexps for finding R functions. 2007-05-03 Martin Maechler * ess-inf.el (ess-request-a-process): Don't ask if there's only one process. * ess.el (ess-get-ps-viewer, ess-get-pdf-viewer): new functions, currently used in * ess-swv.el (ess-swv-PS, ess-swv-PDF): cleaned up; using the above and (ess-swv-run-in-R): fix bug in (message .); start R automatically if none is running. (ess-swv-PDF): use (call-process .) return value to detect errors from pdflatex. * ess-cust.el (ess-pdf-viewer-pref, ess-ps-viewer-pref): new user customizable variables. 2007-05-01 Martin Maechler * essd-r-args.el: new functionality donated from Sven Hartenstein, see http://www.svenhartenstein.de/emacs-ess.php 2007-04-26 Stephen Eglen * ess-inf.el (ess-get-words-from-vector): Doc fix. 2007-03-16 Martin Maechler * ess-swv.el (ess-swv-tangle): new; also rename all the ess-make to ess-swv-; and add back-compatibility wrappers (with warning) 2007-01-27 Stephen Eglen * essd-sp6w.el (S+6-msdos-initiate, S+6-initiate): Do not use (beginning-of-buffer), as it clobbers the mark. 2007-01-22 Martin Maechler * ess-cust.el (inferior-ess-safe-names-command): new try(names(.)); this finally gets rid of "hanging" in object completion, e.g., when options(error=recover) is active in R. * ess-inf.el (ess-object-names): using the above ..-safe-names-.. 2007-01-08 Martin Maechler * essa-sas.el (ess-sleep): eliminated, since no xemacs/emacs distinction needed: GNU emacs can well (sleep-for 0.12) 2007-01-06 Martin Maechler * ess-site.el (ess-microsoft-p): issue "options(chmhelp = FALSE)" for microsoft-p 2007-01-05 Martin Maechler * ess-inf.el (ess-eval-linewise): new argument 'wait-last-prompt' and 'sleep-sec' * ess-inf.el (ess-execute-screen-options): use wait-last.. and sleep-sec * ess-dde.el (ess-eval-linewise-ddeclient): use sleep-sec * essd-r.el (R): using ess-eval-linewise + 'wait (2 x) * ess-cust.el (ess-eval-linewise-sleep): new variable; default 0.06 2006-12-08 Stephen Eglen * ess-cust.el (Rnw-mode-hook): New hook. * essd-r.el (Rnw-mode): Use Rnw-mode-hook. 2006-12-07 Stephen Eglen * ess-utils.el (ess-sci-to-dec), essl-bug.el (ess-bugs-sci-to-round-4-dp), essl-bugs.el (ess-bugs-sci-to-round-4-dp), essd-s4.el: string-to-int is deprecated; use string-to-number. 2006-12-03 Stephen Eglen * noweb-mode.el (noweb-newline): Add noweb-indent-line. 2006-11-25 Martin Maechler * ess-swv.el (ess-makePS, ess-makePDF): search for PS and PDF viewer instead of using having 'gv' and 'acroread' hardcoded; thanks to patch from Leo . 2006-10-27 Stephen Eglen * ess-help.el (ess-submit-bug-report): Add note to use C-c C-c to send bug report. 2006-09-23 Martin Maechler * essddr.el (Rd-mode-insert-skeleton): add final "\n" 2006-09-22 Martin Maechler * ess-mode.el (ess-mode-menu): move "ess-execute" up; the menus are for beginners after all. * ess-inf.el (ess-command): make sure final prompt is deleted (again!). * ess-cust.el (ess-display-buffer-reuse-frames): new variable, defaulting to 't which is now used by * ess-inf.el (ess-display-temp-buffer): uses the above. Consequently, (ess-execute) reuses an *ess-output* frame. 2006-09-15 Martin Maechler * ess-inf.el (ess-command): get rid of ess-save-lastvalue-command * .... also in some other places. Consequently we no longer mess with .Last.value in the S dialects. 2006-09-14 Martin Maechler * ess-inf.el (ess-complete-object-name): add comment (ess-get-object-list): some more (ess-write-to-dribble-..) diagnostic output. 2006-08-31 Martin Maechler * ess-swv.el (ess-makeLatex): improved 2006-08-30 Martin Maechler * noweb-mode.el (noweb-mode-prefix-map): do *not* override M-n C-h 2006-08-28 Martin Maechler * ess-swv.el (ess-makeSweave): improve to show *R* buffer; also add comments about more "TODO"s * ess-swv.el (ess-make*): using (search .) needs 'cl. 2006-07-31 Martin Maechler * essddr.el (Rd-mode-map): add C-c C-c (as in ess-mode) 2006-05-23 Martin Maechler * essd-r.el (Snw-mode): synonym for Rnw-mode * ess-site.el (auto-mode-alist): *.Snw -> Snw-mode * essl-s.el (ess-toggle-S-assign-key): changes (ess-S-assign-key): new default -- the one Seth uses. 2006-05-16 Stephen Eglen * ess-utils.el (ess-find-exec): Remove explicit loop counter (i) and rewrite while loop. (ess-find-exec-completions): Remove explicit loop counters (i,j) and rewrite while loops. Add test to check that a directory on exec-path is not "" (which signifies current working directory) as that confuses tramp. (ess-return-list): Indent/doc fix. (ess-clone-local-variables): Indent. (ess-directory-sep): Indent (perhaps this should be deleted?) 2006-05-12 Martin Maechler * essd-r.el (R-site-search): experimental function provided by Sebastian Luque on ess-help, May 1--2, 2006 2006-05-03 Martin Maechler * ess-inf.el (ess-eval-function): and *-or-para...: use (ess-read-object-name-default) instead of simpler but slightly buggy (ess-extract-word-name). 2006-04-29 Martin Maechler * ess-mode.el (ess-mode-map): work around Xemacs bug ("Meta backspace") 2006-04-04 Richard M. Heiberger * essd-sp6w.el (S+6) and (S+6-msdos): change string to detect S-Plus 6.0, previous string was catching the date 2006.03.30. * ess-cust.el (ess-SHOME-versions): add splus80 2006-04-03 Richard M. Heiberger * ess-help.el (inferior-ess-help-filetype): distinguish between regular S language help files that can appear in an emacs buffer and "chm" (compiled html) used by S-Plus that cannot appear in an emacs buffer. * essd-r.el * essd-s*[3456]*.el * ess-cust.el * ess-inf.el * ess-mode.el 2006-04-03 Stephen Eglen * ess-inf.el (ess-show-buffer): Use ess-select-frame-set-input-focus. * ess-utils.el (ess-select-frame-set-input-focus): New defun. 2006-03-26 Stephen Eglen * ess-help.el (ess-help-mode): Dynamically set section keys. (ess-submit-bug-report): Use insert-buffer-substring, not insert-buffer (byte compiler warning). 2006-03-25 Stephen Eglen * ess-help.el (ess-describe-sec-map): make sure to get proper *-sec-keys-alist 2006-03-24 Martin Maechler * ess-inf.el (ess-eval-linewise): now calls (ess-eval-linewise-ddeclient .) when appropriate; similar in other functions; the same applies to * ess-help.el: autoload and *-ddeclient functions when needed. * ess-mode.el: dito * ess-dde.el: renamed from ess-iw32.el: removed all function *RE*definitions and all (require .) leaving only `*-ddeclient' function definitions; * ess-help.el(ess-help-mode-map): and menu; added one of the new ess-eval-*and-step (of a week ago). 2006-03-23 Richard M. Heiberger * ess-iw32.el (ess-display-help-on-object) repair prompt on Windows to suggest a default as on Unix. 2006-03-21 Martin Maechler * essl-s.el (ess-toggle-S-assign-key): based on code by Seth Falcon; see ESS-help; TODO: a better 'toggle' 2006-03-17 Martin Maechler * ess-inf.el (ess-eval-paragraph-and-step): new; (ess-eval-paragraph-and-go): dito. (ess-eval-region): now returns a (beg end) list (ess-eval-function-or-paragraph-and-step): new, to be bound to C-cC-c * ess-mode.el (ess-beginning-of-function): &optional no-error (ess-mode-map): add ess-eval-paragraph-and-(go|step) and ess-eval-function-or-paragraph-and-step (ess-mode-menu): dito 2006-03-02 Stephen Eglen * ess-utils.el (ess-find-exec-completions): Doc fix. 2006-03-01 Martin Maechler * ess-inf.el (ess-execute-screen-options): fix for case where there's more than one S process. 2006-02-09 AJ Rossini * ess-comp.el: copyright dates changed. * ess-debug.el: added minimal documentation. Removed cruft (this is cruft?). copyright dates changed. 2006-02-09 Anthony Rossini * ess-inf.el (ess-proc-name): better logic, cleanup. * ess-cust.el (ess-use-inferior-program-name-in-buffer-name): new variable. * ess-site.el: documentation for this * ess-inf.el (inferior-ess): use new variable for buffername construction. 2006-02-09 Anthony Rossini * ess-inf.el (ess-proc-name): cleaned up truly ugly logic. 2006-02-08 Martin Maechler * essl-s.el (ess-dump-to-src): minimal improvement 2006-02-04 Martin Maechler * essl-sas.el (SAS-mode-font-lock-keywords): font-lock in any case, also for dumb terminals 2006-01-20 Martin Maechler * essl-s.el (ess-add-MM-keys): add *-execute-screen-options 2006-01-06 Stephen Eglen * ess-install.el (ess-install-byte-compile): New defun. * msdos.el (msdos-minor-mode): Shouldn't msdos-minor-mode be defined earlier in the file? Have not moved yet, as I cannot test on Unix. * ess-swv.el (ess-makePS): let* needed so that namestem can be used within definitions of let. * ess-inf.el (ess-bufs-in-frame): Defvar. * mouseme.el (mouse-me-execute): This function is broken, so I've made it just report an error [w32-shell-execute not present]. * essddr.el (Rd-font-list): Move to top of document, before it is used in defuns. (Rd-active-mark): Put empty definition of defun before defining conditional on Emacs/Xemacs. This silences the compiler. * essd-sp4.el (S+4, S+4-msdos): Replace (beginning-of-buffer) with (goto-char (point-min)). * essd-sp3.el (S+3-mode): Correct call to imenu (defun was broken). * essd-r.el (ess-rterm-versions-create): version-root should be a local variable. * ess.el (ess-write-to-dribble-buffer): Chnage insert-string to insert. * ess-swv.el (ess-makeSweave): ess-command is local variable. * ess-rdired.el (ess-rdired-sort-num): Make defvar. * ess-mode.el (ess-parse-errors): Change string-to-int (obsolete) to string-to-number. * ess-iw32.el (ess-eval-region-ddeclient): Replace (beginning-of-buffer) with (goto-char (point-min)). * ess-emcs.el: Change string-to-int (obsolete) to string-to-number. * ess-cust.el (inferior-ess-primary-prompt): Add group, type. (inferior-ess-secondary-prompt): Add group, type. (ess-process-name-list): Make defvar. * ess-install.el: Add call to byte compiler to recompile all files in the new lisp directory. 2005-12-29 Stephen Eglen * essd-sp6.el (ess-s-versions-create): If ess-s-versions is nil, do not search for other versions of S using this method (ess-s-versions-list will still be examined). * essd-r.el (ess-r-versions-create): If ess-r-versions is nil, do not search for other versions of R. 2005-12-13 Martin Maechler * essd-r.el (R-customize-alist): ess-*lastvalue-command's now use baseenv(). (R): make sure 'baseenv()' will work. 2005-11-24 Martin Maechler * essl-s.el (ess-fix-EQ-assign): slight improvement in regexp. 2005-11-24 AJ Rossini * essd-r.el (R): cygwin, at least older versions, probably need to consider adding the --ess flag rather than the --no-readline, since we most likely are using Rterm and not R. 2005-11-22 Martin Maechler * essl-s.el (ess-dump-args-and-go): don't use (replace-string ..) (ess-fix-miscellaneous): also remove trailing ";" 2005-11-09 Stephen Eglen * ess-inf.el (inferior-ess): Update doc string to describe inferior-ess-same-window and inferior-ess-same-window. * essd-sp6.el (ess-s-versions-create): kill temporary buffer after new defuns have been loaded. 2005-11-07 AJ Rossini * essa-sas.el (ess-sas-submit-pre-command): make sure that if there is no shell, i.e. (= (getenv "SHELL") nil), that we don't die. This is true for old cygwins. 2005-10-12 Stephen Eglen * ess-toolbar.el (ess-add-icon-xemacs): Swap caddr for (nth 2) * essd-sp6.el (ess-s-versions-create): Use nth rather than car, cadr, caddr. Much more readable and removes reliance on cl library for caddr. 2005-10-03 Stephen Eglen * essd-sp6.el (ess-s-versions-list): New variable. (ess-s-versions): New variable. (ess-s-versions-create): New defun to allow other versions of S to be added to ESS, similar to ess-r-versions-create. 2005-09-26 Martin Maechler * essd-r.el (R): add space after inferior-R-args 2005-09-07 Martin Maechler * ess-inf.el (ess-complete-filename): work around Xemacs bug: (comint-dynamic-complete-filename) fails in Xemacs 21.4.17 2005-09-06 Martin Maechler * ess-trns.el (ess-transcript-mode-menu): add entry "Switch S process" 2005-09-02 Stephen Eglen * essd-r.el, ess-cust.el (ess-r-versions): Moved this variable from ess-cust.el. (As a custom variable, it could be set after ess-site had been loaded, which is the time when its value is used. Hence customized values were ignored.) (ess-r-versions-create): Apply unique to list of list of R binaries after stripping off the directory. This prevents multiple entries with the same name occuring in the ESS -> Start Process -> Other menu. 2005-08-20 Martin Maechler * essl-sta.el (STA-syntax-table): allow // for comments 2005-08-03 Martin Maechler * ess-inf.el (inferior-R-1-input-help): '^ *help': do not trigger for, e.g., showMyhelp(). 2005-07-28 Stephen Eglen * ess-help.el (ess-nuke-help-bs): Add doc string and remove interactive specification. 2005-07-09 Martin Maechler * ess-mode.el (ess-beginning-of-function): * ess-mode.el (ess-R-function-pattern) etc: moved here from * ess-cust.el: greatly improved to also catch things like "names<-.foo" <- function(.) { .... } 2005-07-08 Martin Maechler * ess-menu.el (ess-imenu-S-generic-expression): adding SetAs(..), but also e.g., setGroupMethod(..) 2005-07-05 Stephen Eglen * ess-help.el (ess-help-bogus-buffer-p): Document NR-FIRST, and reinstate code such that if NR-FIRST is nil, we search just the first 120 characters of a help buffer to see if it is bogus. Have removed check for R text of the form "Help for topic `rlm'..." since this is caught elsewhere (see below). (ess-display-help-on-object): In R help buffers, if options("help.try.all.packages" = TRUE) then ?rlm will list which packages rlm is defined in. This help buffer is not bogus, but instead is now relabelled *help[R](rlm in packages)*. 2005-07-05 Martin Maechler * ess-mode.el (ess-beginning-of-function): more helpful error message for finding the bug with A <- # comment ... function(.){..} 2005-06-23 Martin Maechler * essl-s.el (ess-fix-EQ-assign): extend to propose more s/=/<-/ 2005-05-05 Stephen Eglen * ess-inf.el (ess-complete-filename): Add doc string. (inferior-ess-mode): Change order of functions added to comint-dynamic-complete-functions local hook. Removed the value `t' from that hook to prevent the global value of that hook also being used. 2005-04-16 Stephen Eglen * ess-toolbar.el (ess-make-toolbar): If Emacs is running in a terminal, tool-bar-map is not defined (because tool-bars cannot be displayed) and hence we should not bother trying to make a tool-bar. 2005-04-15 A.J. Rossini * ess-swv.el: New file for Sweave, slightly modified from code done by David Whiting. 2005-04-08 Stephen Eglen * essl-s.el (R-editing-alist): Changed comment-start to # and set comment-add to 1 so that ## is put on empty lines at correction indentation. 2005-04-07 Martin Maechler * ess-mode.el (ess-mode-menu): add "Toggle Auto-Fill Mode" 2005-04-06 Stephen Eglen * ess-toolbar.el (ess-toolbar-items): Use :set so that when this variable is customized, the toolbar is remade for the current session. 2005-04-06 Martin Maechler * essl-s.el (ess-mode-hook): set *normal-*auto-fill-function, not auto-fill-function itself. 2005-03-21 Martin Maechler * ess-emcs.el (enable-multibyte-characters): define (to nil) if not bound. Workaround for Xemacs problems with (ess-do-auto-fill). 2005-03-08 Stephen Eglen * ess-inf.el (inferior-ess-output-filter, inferior-ess-strip-ctrl-g): New defuns. (inferior-ess-output-filter): Add filter to catch ^G for ringing bell. Code taken from Kurt's octave-mod.el. 2005-03-07 Martin Maechler * ess-cust.el (ess-S-keywords): add "terminate" 2005-03-04 Martin Maechler * ess-cust.el: use (regexp-opt .) constructor 2005-03-03 Martin Maechler based on much from Kurt Hornik * ess-cust.el (ess-R-function-pattern): and ess-S-function-pattern instead of ess-function-pattern. * essl-s.el (S+common-cust-alist): set ess-function-pattern * essd-r.el (R-customize-alist): set ess-function-pattern * ess-cust.el (ess-R-mode-font-lock-keywords): and ess-S-* instead of just one ess-mode-font-lock * essl-s.el (R-editing-alist): additionally to S-editing-alist * essd-r.el (R-customize-alist): use R-editing-alist * ess-cust.el (inferior-ess-R-font-lock-keywords): and ess-S-* instead of just one; building on auxiliary variables. * essl-s.el (S+common-cust-alist): set inferior-ess-font-lock-* * essd-r.el (R-customize-alist): dito 2005-03-03 Martin Maechler from Kurt Hornik * essl-s.el (add-hook 'ess-mode-hook): new ess-do-auto-fill * ess-emcs.el (line-beginning-position): if needed by older Xemacsen * ess-utils.el (ess-do-auto-fill): new - slight change of GNU emacs' do-auto-fill. * ess-utils.el (ess-inside-string-p): new (ess-inside-string-or-comment-p): renamed from 'inside-string/comment-p' 2005-02-11 Rodney Sparapani * essl-sas.el: do not turn on sas-listing-mode via auto-mode-alist. 2005-02-09 Martin Maechler really 2005-02-09 Kurt Hornik * essd-r.el (R): do not (let .. default-process-coding-system) !! 2005-01-29 Martin Maechler * ess-inf.el (ess-quit-r): comment out all "questioning": it's wrong to do this when a user had something like "--save" on startup. 2005-01-24 Martin Maechler * ess-inf.el (ess-quit): drop 'dont-cleanup' argument 2005-01-24 Stephen Eglen * ess-inf.el (ess-cleanup): Use ess-S-quit-kill-buffers-p. * ess-cust.el (ess-S-quit-kill-buffers-p): New variable. 2005-01-22 Stephen Eglen * ess-inf.el (ess-quit-r): Default response (if RET pressed on its own) is that workspace image will not be saved. Do not append "-exited" to iESS buffers (likewise for ess-quit). 2005-01-18 Stephen Eglen * ess-inf.el (ess-quit-r): New function to handle killing an *R* process. (ESS asks whether you wish to save image.) * ess-inf.el (ess-quit): Use ess-quit-R only for *R* processes. Document the dont-cleanup argument. 2005-01-18 Martin Maechler * ess-inf.el (ess-complete-object-name): add S4 object slot name completion. * ess-inf.el (ess-slot-names): new (simplistic) function 2005-01-05 Martin Maechler * ess-inf.el (ess-prompt-wait): new 3rd argument sleep (ess-command): move the (sleep-for *) part into to ess-prompt-wait. * ess-inf.el (ess-get-object-list): use ess-uniq-list to get completion list of unique entries. 2005-01-04 Martin Maechler * ess-cust.el (ess-cmd-delay): use this instead of `ess-need-delay': Either 'nil or a number specifying the delay *factor* to be used. * ess-inf.el, essl-s.el, essd-r.el: ditto 2005-01-01 Martin Maechler * ess-inf.el (ess-command): 3rd argument sleep; internally using ess-need-delay; decreased sleep factors to (.05, .4, .05). * ess-cust.el (ess-need-delay): and ess-R-*, ess-S+-*: instead of ess-ms-slow. (ess-editor): and (ess-pager): defvar instead of defcustom * essl-s.el (S+common-cust-alist): and (S-common-cust-alist): new variables to store all common S language and S+ "customize-alist"s * essd*.el (-customize-alist): append the above variables 2004-12-30 Martin Maechler * ess-inf.el (ess-save-lastvalue-command): newly (defvar .) and buffer local, {instead of defcustom}; ditto for ess-retr-last.... * ess-cust.el: drop them here 2004-12-29 Stephen Eglen * ess-mode.el (ess-mode): Remove call to ess-load-object-name-db-file. * ess-menu.el (ess-imenu-S): Shorten doc string. * ess-inf.el (inferior-ess-mode): Remove vall to ess-load-object-name-db-file. (ess-create-object-name-db): Comment out for now, maybe delete later? * ess-cust.el (ess-object-name-db-file): Change from defcustom to defvar. Also, add note that probably this variable (and others) can be deleted in future ESS versions. 2004-12-24 Stephen Eglen * ess-emcs.el (ess-replace-regexp-in-string): New function, reapplied from Camm's patch. This time the function is now used in all relevant customization-alists. This function is needed since other elisp packages may also define replace-regexp-in-string. 2004-12-20 Stephen Eglen * ess-cust.el (ess-ms-slow): New variable. * ess-inf.el (ess-command): Condition use of sleep-for (to add delays) upon ess-microsoft-p [not 'window-system] and a new variable ess-ms-slow. 2004-12-04 Stephen Eglen * ess-inf.el (inferior-ess-mode): setq inferior-ess-prompt at the start of function so that its value can be used later in the function (e.g. to set comint-prompt-regexp). 2004-12-03 Martin Maechler * ess-cust.el: replace inferior-ess-objects-command by the two inferior-R-objects-command and inferior-Splus-... (which differ). * ess-inf.el (inferior-ess-objects-command): defvar here, instead * essd-r.el, essd-sp6.el -- and all essd-sp*.el essdsp6w.el: replace inferior-ess-objects-command 2004-12-03 Stephen Eglen * ess-cust.el (inferior-ess-prompt): Make this a defvar as the value is constructed from other values, rather than being set by the user. * essd-els.el (ess-add-ess-process): Check first that the current buffer has a process. (ess-select-alist-dialect): Add colon to prompt string. * ess-inf.el (inferior-ess-mode): Set inferior-ess-mode here, rather than within ess-multi. (ess-multi is not run when ess-remote is used, and so prompt was not set for remote buffers running ESS processes.) 2004-11-24 Martin Maechler * essl-s.el (S-editing-alist): change comment-start from "#" to "##" 2004-11-19 Martin Maechler * ess-noweb.el: remove setting of global-font-lock-mode 2004-11-09 Stephen Eglen * ess-inf.el (inferior-ess-mode): Add elements to comint-dynamic-complete-functions using `add-hook' rather than `setq', on advice from Emacs developers. 2004-11-07 Stephen Eglen * ess-inf.el (ess-multi): Fix bug: when inferior-ess-own-frame is non-nil, it should override the value of inferior-ess-same-window. 2004-10-28 Martin Maechler * ess-help.el: ess-help-mode-hook is now run correctly. 2004-10-27 Martin Maechler * essd-sp6.el: added Debian patches from Camm Maguire * ess-help.el: dito for these: * ess-utils.el * ess.el * ess-latex.el * ess-emcs.el 2004-10-14 Stephen Eglen * ess-cust.el (ess-default-style): Customize. 2004-08-29 Stephen Eglen * ess-inf.el (ess-multi): Use inferior-ess-same-window to decide whether to replace or split current window. * ess-cust.el (inferior-ess-same-window): New variable. 2004-08-25 Stephen Eglen * essd-sp6.el (S+6-customize-alist): Use inferior-Splus-args. * ess-cust.el (inferior-Splus-args): New variable. 2004-08-24 Stephen Eglen * ess-cust.el (inferior-R-args): New variable. * essd-r.el (R): pass inferior-R-args to R when starting up. 2004-08-23 Martin Maechler * ess-inf.el (inferior-R-page): only match "page()", not "grid.newpage()" !! 2004-08-09 Stephen Eglen * ess-inf.el (ess-prompt-for-directory): use the XEmacs read-directory-name routine (dialog box when using mouse differs from read-file-name). Thanks to John Fox for reporting this. 2004-08-03 Stephen Eglen * ess-mode.el (ess-mode-menu): Change function name for the default entry in "Start Process -> Other" submenu from R to nil. When it was set to R, this caused the R toolbar icon to not work since this menu entry was being found rather than the real menu entry for R. 2004-07-09 Stephen Eglen * ess-utils.el (ess-find-exec-completions): After checking that ess-tmp-file is executable, check that it is not a directory. 2004-07-04 Stephen Eglen * essdsp6w.el (ess-sqpe-versions-created): Variable deleted. * essd-r.el (ess-r-versions-created): Variable deleted. (ess-rterm-versions-created): Variable deleted. * ess-site.el: Use let binding for storing local values of ess-r-versions-created etc, rather than global variables. Global variables deleted. 2004-07-02 Richard Heiberger * essdsp6w.el (ess-sqpe-versions-create): New function to auto-generate defuns to allow other versions of Sqpe to be called. * essd-r.el (ess-rterm-versions-create): New function to auto-generate defuns to allow other Windows versions of R to be called. 2004-07-02 Stephen Eglen * essd-r.el (ess-r-versions-create): Do not set the value of ess-r-versions-created here, just return the required value. * ess-site.el (ess-versions-created): Tidy up the code for calling older versions of R and Sqpe. Old version did not work on Unix, since ess-sqpe-versions-created was not bound. New version checks that variable is bound before using it. * ess-utils.el (ess-flatten-list): Standard defun needed for flattening a list. Copied from lpr.el. 2004-07-01 Stephen Eglen * ess-inf.el (ess-quit): Delete call to ess-switch-to-ESS; ess-cleanup will have already done that. (ess-cleanup): Add save-excursion to preserve current buffer. * essd-r.el (ess-r-versions-created): New variable to store the names of the new defuns created. (ess-r-versions-create): Set ess-r-versions-created. Doc string update. * ess-site.el: Add the new R defuns, if any, to the "Other" menu under "Start Process". * ess-mode.el (ess-mode-menu): Add new submenu "Other" to "Start Process" where the other versions of R will be placed. 2004-06-30 Stephen Eglen * ess-mode.el (ess-mode-menu): Add entries to jump to top-level of ESS info file. * ess-cust.el (ess-rterm-versions): Condition initial value on ess-microsoft-p. 2004-06-29 Stephen Eglen * Makefile (ELC): Add ess-toolbar.elc to list of .elc files. 2004-06-24 Stephen Eglen * ess-toolbar.el (ess-use-toolbar): Set to nil if images cannot be displayed on the running Emacs. * essd-r.el (ess-r-versions-create): Remove full pathname from versions of R executables. Add note in the *ESS* buffer to say which new defuns have been created. 2004-06-23 Stephen Eglen * ess-toolbar.el (ess-use-toolbar): Default value should check if we are running XEmacs. Other small doc updates to file made. * ess-utils.el (ess-uniq-list): New defun for removing duplicate strings from a list. * ess-site.el: Set up call to `ess-r-versions-create'. * essd-r.el (ess-r-versions-create): New function to auto-generate defuns to allow other versions of R to be called. * ess-cust.el (ess-r-versions): New variable to control which other versions of R are found. 2004-06-21 Stephen Eglen * ess-toolbar.el: Add test at end to check for toolbar support. * ess-mode.el (ess-mode-menu): Add Sqpe and S+6-existing to "Start Process" menu but their active state is determined by ess-microsoft-p and so will be greyed out unless on microsoft. (SAS-menu): Simple wrapper to report error if SAS invoked on microsoft machine. 2004-06-20 Stephen Eglen * essd-sp6.el (S+6-mode): Hook in toolbar support. * essd-r.el (R-mode): Hook in toolbar support. * ess-toolbar.el: Update toolbar support so that we have only one ESS toolbar that can be used over multiple modes. This makes it simpler to use I feel. 2004-05-22 Stephen Eglen * ess-inf.el (ess-eval-linewise): Try again to get the point at the end of the S buffer after evaluation. Previous attempt still didn't work, but I forgot that I had set comint-scroll-to-bottom-on-output. This version should work even with that comint var set to nil. 2004-05-18 Stephen Eglen * ess-inf.el (ess-eval-linewise): If eob, remember to go to the end of the S buffer after evaluation. This was a bug that I introduced when introducing the ability to have R in different frames. 2004-05-17 Martin Maechler * essl-s.el (ess-fix-EQ-assign): new S source cleaners; (ess-fix-dot-more) : ditto added to ess-MM-fix-src's actions 2004-05-17 Stephen Eglen * ess-toolbar.el (ess-icon-directory): Need / after etc directory. * ess-mode.el (ess-mode-menu): Remove :help elements from menus, since XEmacs does not yet recognise it. * essd-els.el (ess-remote): Update doc string. (S+elsewhere, ESS-elsewhere): Add note in doc string to say these commands are obsolete and ess-remote should be used instead. 2004-05-13 Stephen Eglen * ess.el: Update copyright; remove old comments; update URL. * ess-site.el (ess-etc-directory): Move out of ess-cust.el and into ess-site.el, otherwise various other .el files that are loaded before ess-cust will complain. * essl-bug.el: Comment possible use of ess-etc-directory here. * essl-s.el (ess-function-outline-file): Use ess-etc-directory. * essd-sas.el (ess-SAS-pre-run-hook): Use ess-etc-directory. * ess-toolbar.el (ess-icon-directory): Use ess-etc-directory. * ess-cust.el (ess-etc-directory): New variable. * ess-toolbar.el (ess-make-toolbar-R-emacs, ess-make-toolbar-S-emacs): Since R and S are now on the menubar, use tool-bar-add-item-from-menu for consistency. * ess-mode.el (ess-mode-menu): Add sub menu to allow S, R, SAS to be started from menu. Each menu item has a little tooltip help. 2004-05-10 Stephen Eglen * ess-toolbar.el (ess-make-toolbar-R-emacs,ess-make-toolbar-S-emacs): Check that tool-bar-map is non-nil before attempting copy-keymap (generates error on Emacs 21.3+). 2004-05-08 Stephen Eglen * ess-toolbar.el (ess-icon-directory): Guess default value based upon ess-lisp-directory. (ess-toolbar-R, ess-toolbar-S): Store toolbars here. (ess-make-toolbar-S): Make toolbar for S mode too, similar to R mode, but using new S-plus icons from David Smith. (ess-make-toolbar-S-emacs,ess-make-toolbar-S-xemacs): New defuns. 2004-05-07 Stephen Eglen * essa-sas.el (ess-sas-submit-mac-virtual-pc): Assign :type to be boolean. Reformat defcustoms (whitespace changes only). * essl-sas.el (sas-get-options, sas-file-name, ess-sas-run-make-regexp): Correct :type to prevent mismatch in customization. * essa-sas.el (ess-sas-shell-buffer-remote-host): Ditto. 2004-05-06 Stephen Eglen * ess-toolbar.el (ess-make-toolbar-r-emacs): Use ess-load-file rather than ess-eval-buffer in toolbars. * ess-help.el (ess-display-help-on-object): Use ess-help-frame-alist. * ess-inf.el (ess-multi): Use inferior-ess-frame-alist. * ess-cust.el (ess-help-frame-alist, inferior-ess-frame-alist): New variables to store frame parameters for iESS buffers and help frames. (ess-help-own-frame, inferior-ess-own-frame): Doc fixes. * ess-help.el (ess-display-help-on-object): Fix bug introduced in 5.2.0 (reported by Robert Hankin). If ess-help-own-frame is nil, and we are currently in a help buffer, show new help buffer in same window. 2004-05-05 Stephen Eglen * ess-inf.el (ess-request-a-process): Use ess-show-buffer to display iESS buffer; update doc string. 2004-05-02 A.J. Rossini * essd-sp6.el (S+6-mode): * essd-sp5.el (S+5-mode): * essd-sp4.el (S+4-mode): * essd-s4.el (S4-mode): * essd-sp3.el (S+3-mode): * essd-s3.el (S3-mode): fixed imenu variable name, extended copyrights from 1997 to 2004. * essa-sas.el (ess-sas-image-viewer): Moved function after ess-sas-submit-method defvar, since we need that value to set this function. 2004-04-27 Stephen Eglen * ess.el (ess-write-to-dribble-buffer): Check if ess-dribble-buffer has been deleted. Remove the defadvice code that used to do this. 2004-04-26 Stephen Eglen * ess-inf.el (ess-switch-to-ESS): Use `ess-show-buffer' to show the iESS buffer. (ess-show-buffer): New function to be used when an iESS buffer is to be displayed. See its doc string for the rules it follows as to how to display the iESS buffer. (ess-get-bufname,ess-get-buffers-in-frames, ess-buffer-visible-this-frame,ess-buffer-visible-other-frame): New helper functions for ess-show-buffer, adapted from iswitchb.el. 2004-04-22 Stephen Eglen * ess-cust.el (ess-speedbar-use-p, ess-funcmenu-use-p): Use fboundp. * ess-menu.el (ess-imenu-use-S): Change default value and update doc string. (ess-imenu-regexp-S-function): Delete unused variable. * ess-cust.el (ess-use-menus): Delete unused variable. (ess-imenu-use-p): Set default value to (fboundp 'imenu) rather than (featurep 'imenu) since the former is more useful for seeing whether Imenu is available. (The latter is true only if Imenu has already been loaded.) 2004-04-19 Stephen Eglen * ess-help.el (ess-display-help-on-object): If ess-help-own-frame is 'one, use the dedicated frame. Use pop-to-buffer rather than switch-to-buffer if currently in a help buffer, * ess-cust.el (ess-help-own-frame): Add new value 'one to specify that all help buffers should be displayed in one frame. 2004-04-18 Stephen Eglen * ess-help.el (ess-display-help-on-object): If ess-help-own-frame is true, use ess-help-own-frame function to display help buffer. (ess-help-own-frame): New function and variable to display all ESS help buffers into one frame. * ess-cust.el (ess-help-own-frame): New variable. (ess-help-kill-bogus-buffers): Change to ess-help group. (ess-help): New customize group. * ess-cust.el (inferior-ess-own-frame): New variable. * ess-inf.el (ess-switch-to-ESS): Respect inferior-ess-own-frame. (ess-multi): Use pop-to-buffer if process already running, and respect inferior-ess-own-frame. 2004-04-16 Stephen Eglen * ess-inf.el (ess-multi): Use pop-to-buffer rather than switch-to-buffer, so that special-display-regexps should work. 2004-04-15 Stephen Eglen * ess-cust.el (inferior-ess-client-command): Set :group and :type. (R-editor, S-editor): reformat. (R-pager, ess-pager): reformat and allow type to be nil or string. 2004-03-31 A.J. Rossini * ess-site.el: added a more explicit commented out Windows example. Cleaned up documentation inconsistencies for noweb/Rnw modes. * essd-r.el (R): added autoload cookie for XEmacs. doc edits. (R-mode): added autoload cookie for XEmacs. Removed R-package generator; a better version is part of R (package.skeleton()). * ess-menu.el (ess-imenu-S-generic-expression): fixed imenu routine -- now provides links to functions, classes, methods, and "other" objects. 2004-03-23 Martin Maechler * essd-els.el (ess-select-alist-dialect): (let* ..) : thanks to Na Li. 2004-03-04 Martin Maechler * ess-site.el (ess-restore-asm-extns): thanks to Ed Cashin 2004-02-19 Stephen Eglen * essd-els.el (ess-select-alist-dialect): Use completing-read to select dialect. 2004-02-12 Stephen Eglen * essl-s.el (ess-smart-underscore): Only be smart in buffers where `ess-language' is "S". * ess-site.el ("[ess-site:] require 'essd-els ..."): oRemove the code that fixes ess-smart-underscore in SAS mode. 2004-01-20 Stephen Eglen * essl-s.el (ess-smart-underscore): Pressing _ twice inserts _ rather than the assignment operator. 2004-01-19 Stephen Eglen * ess-cust.el (inferior-R-program-name): Customize. Add description of file to line 1. (ess-version): Change from defcustom to defvar; presumably no-one will want to customize this variable! Comment line prior to definiton already says that this variable is not user-changeable. (ess-dialect): Change from defcustom to defvar. 2003-12-08 Stephen Eglen * ess-noweb.el (ess-eval-chunk): The code chunk is evaluated in a temp buffer, and should inherit the value of ess-local-process-name from the source value. If the source buffer did not set ess-local-process-name, it is set once the chunk has been evaluated. 2003-11-24 Martin Maechler * ess-emcs.el (replace-regexp-in-string): also needed for Emacs 20. 2003-11-06 Martin Maechler * ess-cust.el (ess-S-loop-timeout): new variable (and same for -XLS-) * essd-*.el use these new customizable variables. 2003-11-05 Martin Maechler * ess-inf.el (inferior-ess): make comint-use-prompt-... buffer-local such that we no longer "pollute" other comint modes such as M-x shell 2003-10-29 Martin Maechler * ess-trns.el (ess-transcript-mode-map): add C-a := comint-bol * ess-inf.el (inferior-ess-mode-map): ditto 2003-09-25 Martin Maechler * ess-cust.el (ess-dump-filename-template-proto): renamed, new functionality: used as prototype * essd-*.el: ess-dump-filename-template now uses and modifies the above prototype. 2003-08-19 Stephen Eglen * ess-help.el (ess-help-underline): New function to convert ^_H in help buffers to the underline face. 2003-08-05 Stephen Eglen * ess.el (ess-setq-vars-local): Prevent e.g. ess-local-process-name getting reset to nil when re-entering a code chunk in mixed mode buffers (like Latex/R). 2003-07-24 Stephen Eglen * essa-r.el (ess-r-var): New function for loading numbers from any Emacs buffer into an existing *R* process. 2003-01-01 Stephen Eglen * ess-site.el (ess-rdired): Add autoload for ess-rdired. * ess-rdired.el: New file. 2002-11-12 Martin Maechler * essd-r.el (Rnw-mode): new (experimental) for Sweave{R} editing. 2002-11-01 Stephen Eglen * essl-s.el (ess-help-R-sec-regex): Restrict regex so that capital letter must be at start of line. 2002-04-27 Martin Maechler * essd-sp6.el (S+6-customize-alist): ess-setup-directory-function and other changes from Jeff Mincy; not yet fully tested. 2002-04-23 Martin Maechler * ess-trns.el (ess-transcript-mode-menu): add ..DO-clean-region to menu, using new argument (prefix) for escaping read-only state. 2002-02-15 Martin Maechler * essl-s.el (S-editing-alist): introduce S "global" `inferior-S-language-start' * essd-r.el (R-customize-alist): use inferior-S-language-start above. * essd-sp[3-6].el, essd-s[34].el, essdsp6w.el, essd-els.elc -- ditto. 2002-02-13 Martin Maechler * ess-cust.el (S-pager) and others: s/emacslient/emacsclient/ 2002-01-26 Martin Maechler * essddr.el (Rd-font): new function, put on C-c C-f ├а la TeX-font (Rd-font-list): e.g. `C-c C-f l' now surrounds word by \code{\link{.}}! 2002-01-16 Martin Maechler * ess-menu.el (ess-imenu-S): use improved ess-S-imenu-generic-expression (and clean up), by Stephen Eglen. 2002-01-15 Martin Maechler * essl-s.el (S-editing-alist): new add-log-...regep from Stephen Eglen. Allows `C-x 4 a' (adding to Changelog) find the S function name. (R-help-sec-keys-alist): "Usage" and "Details" as the S lists. 2002-01-14 Richard Heiberger * ess-mous.el: ess-mous is now on submenu of C-mouse-3 in ess-transript-mode, inferior-ess-mode, ess-mode. This feature is still beta. 2002-01-11 Richard Heiberger * ess-inf.el: remove .in.ESS * essd-r.el: first draft of options("STERM") 2002-01-10 Richard Heiberger * ess-mous.el: S-mouse-3 gets information from S/R about the highlighted phrase or about the word at the cursor location. 2002-01-10 Martin Maechler * ess-help.el (ess-help-bogus-buffer-p): now also works in R when help.try.all.packages = TRUE. 2002-01-03 Martin Maechler * ess-inf.el (ess-ddeclient-p): new function from Rich and a few related changes 2001-10-16 Martin Maechler * ess-inf.el (ess-execute-objects): use (number-to-string ..) for Emacs 21 (thanks to Stephen Eglen). * ess-trns.el: typo "o" fixed (S.Eglen) 2001-09-27 Martin Maechler * ess-inf.el (ess-multi): .in.ESS <- TRUE for S dialects 2001-09-20 Martin Maechler * ess-mode.el and others: do use ess-running-xemacs from ess-emcs.el! * ess-menu.el: fix the (require 'imenu ..) [for E 19.34] 2001-09-05 Martin Maechler * essddr.el (Rd-mode-map): add C-c C-v (help) 2001-08-31 Martin Maechler * ess-menu.el (require 'imenu): try to do this only when available [not tested; I have imenu "everywhere"] 2001-08-30 Martin Maechler * ess-mode.el (ess-narrow-to-defun): new function 2001-08-21 Martin Maechler * ess-inf.el (ess-directory-function): also ess-cust.el, essd-sp6.el: Implement Jeff Mincy's patches for new function --- currently only for S+6 (Unix) -- FIXME: Support R, other Spluses 2001-08-10 Martin Maechler * ess.el: (defadvice ess-write-to-dribble-buffer ....) from Jeff Mincy 2001-06-19 Martin Maechler * ess-utils.el (nuke-trailing-whitespace-p): make interactive; cosmetic 2001-03-02 Martin Maechler * ess-site.el: On Linux, default to S+5, since there's no S+3 2001-02-28 Martin Maechler * ess-utils.el (ess-space-around): new utility * essd-r.el (R-fix-T-F): also fix after "_" * essl-s.el (ess-fix-miscellaneous): Fix bug which broke "<=" & ">=" Further fix bug which broke "<<-" (and "->"). separate e.g., "){" ; space around "else". 2000-10-23 Martin Maechler * essl-s.el (ess-smart-underscore): remove extra spaces when ess-S-assign is used. 2000-10-11 Martin Maechler * essl-s.el (ess-smart-underscore): new function, assigned to "_" key. 2000-10-09 A.J. Rossini * /home/ess/src/cvsroot/gnu/ess/lisp/ess-vars.el: Merged with changes in another location. 2000-10-09 maechler * /home/ess/src/cvsroot/gnu/ess/lisp/ChangeLog, /home/ess/src/cvsroot/gnu/ess/lisp/essl-s.el: new (ess-fix-miscellaneous) & (ess-toggle-underscore) 2000-10-09 Martin Maechler * essl-s.el (ess-fix-miscellaneous): new function for prettifying S language code. (ess-toggle-underscore): new function for "_" toggling. 2000-10-04 Martin Maechler * essl-s.el (ess-add-MM-keys): define-key "_" to ess-S-assign. * ess-cust.el (ess-S-assign): new variable (" <- ") for left assign. * ess-vars.el (ess-S-assign): --ditto-- 2000-08-16 Martin Maechler * essd-r.el (R): Win32: don't give spurious warning anymore. 2000-08-09 Martin Maechler * ess-help.el (ess-display-help-on-object): Inherit syntax-table; this should make the "default prompt" work for "help inside help". 2000-07-08 Martin Maechler * essl-sas.el (SAS-mode-font-lock-keywords): only when window-system! fixes "emacs -nw -f R" 2000-06-28 Martin Maechler * ess-site.el : load-path setting *MUST* come first. 2000-04-14 Martin Maechler * ess-inf.el (ess-dir-modtime): RMH: use file-directory-p instead of string-match. 2000-04-04 Martin Maechler * ess-inf.el (ess-eval-line-and-step): new even-empty argument, [prefix] allowing to send even empty lines to the ESS process. * ess-vars.el: New logical variable ess-eval-empty. * ess-inf.el (ess-command): applied the "FIXME": ess-command should have two arguments only. -- Few adjustments in other *.el files. 2000-04-03 Martin Maechler * ess-inf.el and other files: Replace (function) ess-eval-visibly by ess-eval-linewise Replace (function) ess-eval-line-and-next-line by *-line-and-step 2000-03-31 Martin Maechler * ess-inf.el (ess-next-code-line): new function from Stephen Eglen (ess-eval-line-and-next-line): new prefix arg for turning off the use of new ess-next-code-line. Further : Use (forward-line 1) instead of (next-line 1). * ess-mode.el: added a few autoloads (and a comment for AJR !?). s/"Step through line"/"Eval line & step"/ white space [n*8 column starts] * ess-inf.el (inferior-R-input-sender): Fixed the regexps for help() and {even more} for ?<...>, using new variable ess-help-arg-regexp {in ess-vars.el}. 2000-03-30 Martin Maechler * almost ALL lisp files : Docstring fixes, thanks to Stephen Eglen . 2000-03-21 Martin Maechler * ess-vars.el (ess-temp-point): new for fixing multiline commands in transcript. Similar fix in * ess-trns.el, and * ess-inf.el. --- really all by RMH! * ess.el (cadr): define if not available. 2000-03-20 Martin Maechler * ess-help.el (ess-help-error-buffer-p): new utility, improve detection of help error messages for (ess-display-help-on-object). * essl-sas.el: new variables sas-white-chars & sas-comment-comment-chars * essl-sas.el: (beginning-of-sas-statement): don't quote blank 2000-02-10 Martin Maechler * ess-help.el: Add menu; fix ess-display-sec-map * essddr.el (Rd-mode): one menu entry. * essd-sp5.el (S+5-customize-alist): search-list-command=search("paths") 1999-12-21 Martin Maechler * essd-sp5.el: S+5-customize-alist was there *TWICE* finally replaced cat by "slynx -dump" 1999-12-08 Martin Maechler * essl-sta.el (setq max-lisp-eval-depth): increase necessary 1999-11-22 ess * ess-vars.el: Updated to 5.1.11 1999-11-17 ess * essddr.el: 'bold isn't defined in XEmacs. Using reference-face instead of Rd-bold-face. 1999-11-16 ess * ess-vars.el: Fixed small version update errors * Makefile, ess-help.el, ess-site.el, essd-els.el, make-regexp.el, noweb-mode.el: updated version numbers * essl-sta.el: added local variables for editing and indexing. * essl-sta.el: added Brendan's suggested function. * essl-sta.el: added make-regexp to ESS, and finished integrating Brendan's code. Need to test it now! * make-regexp.el: needed for Stata-mode extensions * essl-sta.el: added Brendan Halpin's corrections. * ess-inf.el: concat needs number-to-string conversion. * essd-omg.el: Omegahat fixes (for commandline flags) 1999-11-11 ess * noweb-mode.el: C-c C-n shouldn't be TeX-normalmode, since it is too close to submit-line with ESS! (overwrite). * essd-omg.el: Use prefix for setting Omegahat arguments. 1999-11-10 rossini * essl-omg.el: S- becomes OMG- Comments redone (to use //, ///, and //// for levels of indentation) OMG-syntax started, variable defined, needs to be fixed. * essd-omg.el: further Omegahat dialect changes (use OMG syntax, which needs fixing!) 1999-11-05 Martin Maechler * ess.el: added a definition of (functionp ..) if there isn't any 1999-11-05 Martin Maechler * ChangeLog, ess.el, noweb-mode.el: functionp definition if necessary * noweb-mode.el: functionp for emacs-19.34 1999-11-04 A.J. Rossini * TONS of things -- see ../ChangeLog 1999-11-04 rossini * essd-els.el: fixed paren error. * Makefile, ess-site.el, ess-vars.el, essd-sas.el: Changed version numbers 1999-11-03 rossini * Makefile, ess-inf.el, ess-site.el, ess-vars.el, essd-sp5.el: Changes for ESS-elsewhere. * essd-els.el: added a generic ESS-elsewhere function. 1999-10-06 Anthony Rossini * ess-inf.el: fixed extraneous echoes in Stata. 1999-10-04 rossini * essd-sta.el: fset both stata-mode and Stata-mode. * ess-site.el: cleaned up autoload conflicts between 2 local (AJR) copies. 1999-09-27 Martin Maechler * ChangeLog, Makefile: don't byte-compile ess-debug.el * ChangeLog, essd-r.el: for R, use help(. , htmlhelp=F) 1999-09-27 Martin Maechler * Makefile (SOURCES): use new $(TOCOMPILE) -- don't ess-debug.el ! 1999-09-27 Martin Maechler * essd-r.el (R-customize-alist): help( .. htmlhelp = FALSE) Wed Sep 15 22:34:37 1999 A.J. Rossini * ess-inf.el (inferior-ess-mode): preliminary support for Omegahat. Wed Sep 15 22:21:42 1999 A.J. Rossini * essd-omg.el (omegahat-mode): fset for OMG-mode. use it. (omegahat): fset for OMG. use it. Documentation fixes. Wed Sep 15 22:20:37 1999 A.J. Rossini * ess-site.el (essd-omg): require this, now. Wed Sep 15 22:19:08 1999 A.J. Rossini * ess-site.el: added omegahat, comment about ssh (for ess-elsewhere) Wed Sep 15 22:17:04 1999 A.J. Rossini * ess-vars.el (inferior-STA-program-name): documentation fixes Wed Sep 15 22:16:55 1999 A.J. Rossini * ess-vars.el (inferior-OMG-program-name): new variable Tue Sep 14 22:55:55 1999 A.J. Rossini * essd-xls.el (xlispstat-mode): added as a synonym. Tue Sep 14 16:53:21 1999 A.J. Rossini * noweb-mode.el: Emacs/XEmacs compatibility done. Tue Sep 14 16:53:07 1999 A.J. Rossini * ess-debug.el: This is customized for me (AJR). Tue Sep 14 16:52:35 1999 A.J. Rossini * ess-site.el: added noweb-mode by default. Tue Sep 14 16:10:04 1999 A.J. Rossini * ess-noweb.el (global-font-lock-mode): set true to prevent XEmacs from barfing. Tue Sep 14 13:26:36 1999 A.J. Rossini * ess?-sta.el: cleaned up stata mode to work. Tue Sep 14 11:06:38 1999 A.J. Rossini * ess-inf.el: white space, documentation, stata hacks. 1999-09-06 Martin Maechler * essddr.el (Rd-indent-level): default 2 (back from 4): We need horizontal space, and there's not a lot of nesting. 1999-09-01 Martin Maechler * ess-mode.el : add "Switch Process" menu entry to [ESS] menu. 1999-07-22 Martin Maechler * ess-mode.el : Define cheap (line-end-position) if not there [e.g. for GNU emacs 19.34] 1999-07-22 Martin Maechler * ess-mode.el (ess-beginning-of-function): Delimit (search-forward "(" ..) ---> fixed bug ! 1999-07-21 Martin Maechler * ess-inf.el (ess-eval-function): Use (ess-end-function) only, since that now returns beginning & end; further, use (ess-extract-word-name) only once. * ess-mode.el (ess-beginning-of-function): return beginning * (ess-end-of-function): accept optional `beginning' argument; return BOTH beginning & end * (ess-mark-function): use new beg/end functions. 1999-07-06 Martin Maechler * essd-r.el (R-fix-T-F): Fix buglet: should catch more cases 1999-06-17 Martin Maechler * essd-*.el (ess-loop-timeout): Default multiplied by 5 to 500000. * essd-R.el -- simplified primary-prompt ! 1999-04-23 Martin Maechler * ess-site.el (auto-mode-alist): Change regexp's in order to work with NTemacs which is has a non-case-sensitive `find-file'. 1999-04-05 A.J. Rossini * ess-site.el, ess-vars.el: text from 5.1.7 to 5.1.8 * ess-site.el: cleaned up misguided comment. * ess-site.el: cleaned up, removed R unix/microsoft hack. * essd-r.el: using a solitary R. * ess-inf.el: conditioned out the slowdown in ess-prompt-wait for Microsoft. * ChangeLog: doc updates 1999-04-05 A.J. Rossini * ess.el: franz.stat.wisc.edu -> ess.stat.wisc.edu * ess-site.el, ess-vars.el: 5.1.6 to 5.1.7 changes for possible release * ess-inf.el: ess-prompt-wait duration changed? 1999-04-01 maechler * ess-inf.el: typo 1999-04-01 A.J. Rossini * ess-site.el: about to release 5.1.6 * ess-vars.el: anything else? 1999-03-31 A.J. Rossini * ess-iw32.el: whitespace modifications. * ChangeLog: *** empty log message *** * essd-r.el: reverted. We can simply leave R as given, and not worry about R-unix (thanks to Martin). * essd-r.el: R -> R-unix. * ess-inf.el: sleep-fors are commented out except for Microsoft "operating systems", sigh... * essd-r.el: preliminary changes Wed Mar 31 15:46:37 1999 A.J. Rossini * essd-r.el (R): reverted. Martin fixed this right in ess-site. * essd-r.el (R-unix): renamed from R. * ess-inf.el (ess-command): sleep-for only used for Splus 4.5, i.e. Microsoft "operating systems", sigh. 1999-03-18 Martin Maechler * ess-site.el (auto-mode-alist): OOps for last change *.sty became ESS S-transcript; now fixed 1999-03-17 A.J. Rossini * essd-r.el, ess-site.el, ess-vars.el: RMH's changes 1999-03-16 A.J. Rossini * essd-r32-sh-dos.el, essd-sp4com.el: MS Dos stuff for R, S+4.x * ChangeLog: Prep for 5.1.4 * essd-sp4.el, ess-iw32.el: RMH changes. * ess-site.el: Merged RMH's work. * ess-vars.el: incremented. * ess-inf.el: RMH's changes. 1999-03-16 Martin Maechler * ChangeLog: mini change "foobar.Sout-45" * ess-site.el: auto-mode-alist: "foobar.Sout-4.5" also turns on S-transcript-mode 1999-03-16 A.J. Rossini * essd-sp4.el, ess-iw32.el: RMH changes. * ess-site.el: Merged RMH's work. * ess-vars.el: incremented. * ess-inf.el: RMH's changes. 1999-03-16 maechler * ChangeLog: mini change "foobar.Sout-45" * ess-site.el: auto-mode-alist: "foobar.Sout-4.5" also turns on S-transcript-mode 1999-03-16 Martin Maechler * ess-site.el (auto-mode-alist): "foobar.Sout-4.5" also turns on S-transcript-mode 1999-03-03 A.J. Rossini * Makefile: updated version information converted s+3 to sp3. * ess-vars.el: updated version information. * ess-iw32-load-file.el, essd-s+3.el, essd-s+4.el, essd-s+5.el, essd-s_2b4-msdos-existing.el, essd-s_2b4-msdos.el: Tidied up ess-iw32*.el files. * ess-iw32.el: copied all changes from ess-iw32-load-file.el here. * ess-iw32-load-file.el: fixed. * essd-s_2b4.el: essd-s_2b4-msdos*.el were not needed. Contents moved into base file. * ess-iw32-load-file.el, ess-iw32.el, essd-r32.el, essd-s_2b4-msdos-existing.el, essd-s_2b4-msdos.el, essd-s_2b4.el, msdos.el: RMH's changes, up to March 2nd 1999-02-24 A.J. Rossini * ess-iw32.el: temp val left in distribution. whoops (RMH). 1999-02-22 A.J. Rossini * essd-els.el, essd-s3.el, essd-s4.el, essd-sta.el, ess-site.el, essd-sp4.el, essd-sp5.el, essd-sp3.el: Removed s+# to sp# for S-PLUS commands 1999-02-12 Martin Maechler * Makefile: emacs, not "19.34" 1999-02-10 Martin Maechler * essd-sas.el: added RMH's new fixes for the 5.1.2 version. 1999-02-02 Martin Maechler * ess-inf.el: (last commit was with unsaved file) * ChangeLog, ess-inf.el: fix regex for "help(..);" also work for "?" with R-input-sender 1999-02-02 Martin Maechler * ess-inf.el (inferior-R-input-sender): Change the regexp such that e.g. "help(pt, offline=T)" is treated as normal command; New: "?lm" (e.g.) is also recognized as help command Mon Dec 14 18:04:45 1998 A.J. Rossini * ess-mode.el: fixed copyright and header information * ess-site.el: commented out SHOME definition. Fri Dec 11 19:51:18 1998 A.J. Rossini * ess-vars.el: fixed copyright, rossini's email address. * ess-iw32.el: fixed rossini's email address, headers, copyright. * essd-els.el, essd-s+4.el: fixed rossini's email address. * essd-sq4.el: fixed copyright and header attributions. * essd-els.el: fixed header files and copyright. * essd-s+4.el: added changes to copyright and header docs. * ess-vars.el: Merged RMH's changes. * ess-iw32.el, essd-els.el, essd-s+4.el, essd-sq4.el: New files for ESS for Splus/MSW/NT/98/95 New files for remote-ESS on Unix. * ess-site.el: Added RMH's changes for Microsoft Windows and Splus. Mon Nov 30 17:37:57 1998 hornik * Makefile: Add essd-s+5.el to SOURCES (as it gets required in ess-site). Mon Nov 23 20:03:17 1998 A.J. Rossini * ChangeLog: *** empty log message *** Fri Nov 20 20:57:33 1998 A.J. Rossini * ess-vars.el: ess-help-w3-url-prefix points to pyrite. * ess-vars.el: removed spurrious comment about generic function, in front of a variable. * essd-s+5.el: trimmed out old S4 stuff. Mon Nov 16 17:29:25 1998 Martin Maechler * ess-inf.el: do not need comint echo anymore.. Sat Nov 14 00:23:19 1998 A.J. Rossini * ChangeLog: whitespace editing. Fri Nov 13 18:25:51 1998 A.J. Rossini * ess-site.el: added sample entry for S+5. * ChangeLog: *** empty log message *** * ess-site.el: added suffix for StatSci's script files. Thu Nov 12 17:27:30 1998 Martin Maechler * essd-r.el, essd-s+3.el, essd-s+5.el, essd-s3.el: newline in dribble buff * ess-inf.el: more details in prompt for ess-get-dir; more dribble; WHITE SPACE * ess.el: slightly better dribble output * essd-s4.el: drop doubled comments * ess-vars.el: . Wed Nov 11 12:45:15 1998 Martin Maechler * essd-s+5.el: omit .Smode() extras; new "S+" instead of "S+3" * essl-s.el: new "S+" instead of "S+3" * ess-inf.el: comint-echo : OFF for S+5 * essd-s3.el: comments only * essd-s+3.el: comment out ess-mode-edit * Makefile, ess-vars.el: new version numbers * essd-s+5.el: several more s4 -> s+5 changes; still not ok * essd-s+3.el: transpose to defs * ess-vars.el: require s+5 Tue Nov 10 17:45:11 1998 Martin Maechler * ess-site.el: s+5 is now distributed * essd-s+5.el: provide typo fixed Mon Nov 9 23:28:14 1998 A.J. Rossini * ChangeLog, Makefile, ess-site.el: New material for Makefiles * essl-sta.el: removed possible problems from stata mode. -- provide 'essl-sta * essd-s+5.el: This is for Splus5, based on S4. * ess-web.nw: last change, sigh. * ess-web.nw: emacs lisp mode is wrong, sigh. * ess-web.nw: Contains interface code between Noweb and ESS * ChangeLog: added stata-dialect/lang to makefile * Makefile: added Stata stuff. Thu Sep 24 23:32:14 1998 A.J. Rossini * ChangeLog: more stuff. * essd-sta.el: should be sta, not stt * ChangeLog: update for ess-site. * ess-site.el: added stata mode, which is now STA (ref: Thomas Lumley) Thu Sep 17 09:11:51 1998 Martin Maechler * ChangeLog, ess-utils.el: several small things Fri Sep 11 16:20:14 1998 Martin Maechler * essd-r.el: (R-fix-T-F): new function Fri Sep 11 15:39:57 1998 Martin Maechler * essd-s4.el: Extraneous end deleted * ess.el ess-inf.el ess-mode.el Makefile: Adaptions to new ess-utils. * ess-utils.el: new file for ``General Utilities'' useful and usable *outside* ESS. 1998-09-09 A.J. Rossini * essd-sta.el: new file (STA-customize-alist): edited according to essl-sta.el. (STA-mode): New function (stata): New function (STA-transcript-mode): New function * Makefile (BATCHFLAGS): --no-init-file, not --no-init-fil Tue Sep 8 19:18:07 1998 Martin Maechler * essl-s.el: added "&optional dont-ask" argument to ess-dump-to-src, ess-fix-comments,.... ess-MM-fix-src Mon Sep 7 18:26:47 1998 Martin Maechler * essl-s.el (ess-time-string): 4 digit year! Wed Aug 26 14:16:35 1998 Martin Maechler * essl-s.el (S-editing-alist): font-lock-defaults: treat "." as word constituent (from Kurt). Thu Aug 20 08:45:11 1998 Martin Maechler * essddr.el (Rd-section-names): and (Rd-keywords): expanded according to Kurt's suggestion. Tue Aug 18 10:42:08 1998 Martin Maechler maechler * essd-s+3.el (S+3-dialect-name): new variable for customization. Tue Aug 18 10:28:22 1998 Martin Maechler * essd-r.el (R): add the "--no-readline" argument to r-start-args. Tue Aug 14 18:32:11 1998 Martin Maechler * ess-vars.el: new version "pre5.1" * Makefile: ditto * essl-s.el: renamed "ease:time-string" to "ess-time-string"; cleaned up Mon Apr 6 11:27:52 1998 Tony Rossini * ess-inf.el (ess-object-names): * ess-inf.el (ess-execute-objects): add argument to call to inferior-ess-objects-command, for S4 (suggested by Stephen Pope). Mon Apr 6 11:22:22 1998 Tony Rossini * ess-vars.el (inferior-ess-font-lock-keywords): change, as suggested by Stephen Pope (remove parens). Mon Dec 15 19:17:27 1997 Anthony Rossini * essd-s4.el (S4-mode): New function, use it. Wed Dec 10 10:33:59 1997 Anthony Rossini * essd-xls.el: make sure that the major-mode is 'XLS-mode (might need to do this for _all_ modes :-(. But let's first see if anything breaks. Tue Dec 9 17:54:31 1997 Anthony Rossini * essd-r.el: removed non-necessary autoload for a non-existant function (was intended for start-args, but never was written or used). Tue Dec 9 15:45:18 1997 Anthony Rossini * essddr.el: one too many parens. Tue Dec 9 15:44:23 1997 Anthony Rossini * essddr.el: added commented out face. DB's error doesn't exist for me, though. Fri Dec 5 10:12:54 1997 Anthony Rossini * ess-site.el: added comments about Emacs 20.2 errors. Fri Dec 5 10:09:59 1997 Anthony Rossini * CVS (ChangeLog): Starting 5.1 series. ess/lisp/ess-tracebug.el0000664000175000017500000035174412632537307013627 0ustar eddedd;; ess-tracebug.el --- Tracing and debugging facilities for ESS. ;; ;; Copyright (C) 2011--2015 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; ;; Filename: ess-tracebug.el ;; Author: Vitalie Spinu ;; Maintainer: Vitalie Spinu ;; Copyright (C) 2010-2012, Vitalie Spinu, all rights reserved. ;; Created: Oct 14 14:15:22 2010 ;; URL: http://code.google.com/p/ess-tracebug/ ;; Keywords: tools, languages ;; ;; This file is *NOT* part of GNU Emacs. ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, any later version. ;; ;; This program is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ;; details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; Features that might be required by this library: ;; ;; ESS - required ;; ido, face-remap, cl - desirable and are part of default emacs ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; Ess-tracebug is a package for interactive debugging of R code from ;; ESS and provides such features as: ;; - visual debugging ;; - browser, recover and conditional breakpoints ;; - watch window and loggers ;; - on the fly debug/undebug of R functions and methods ;; - highlighting of error source references and easy error navigation ;; - interactive traceback. ;; ;; For a complete description please see the documentation at ;; http://code.google.com/p/ess-tracebug/ and a brief tutorial at ;; http://code.google.com/p/ess-tracebug/wiki/GettingStarted ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Code: (require 'ess) (require 'format-spec) (eval-when-compile (require 'tramp) (require 'compile) (require 'overlay) (require 'cl)) (autoload 'ess-helpobjs-at-point "ess-help" "[autoload]" nil) ;;todo: rename and put into a more neutral place (defvar text-scale-mode-amount) (autoload 'text-scale-mode "face-remap" "[autoload]" nil) (defgroup ess-tracebug nil "Error navigation and debugging for ESS. Currently only R is supported." :link '(emacs-library-link :tag "Source Lisp File" "ess-tracebug.el") :group 'ess ) (defvar ess-tracebug-indicator " TB" "String to be displayed in mode-line alongside the process name. Indicates that ess-tracebug-mode is turned on. ") ;; (defvar ess--tracebug-p nil ;; "Non nil if ess-tracebug is turned on for current process. ;; Function `ess-tracebug' toggles on/off this variable.") ;; (make-variable-buffer-local 'ess--tracebug-p) ;; (add-to-list 'minor-mode-alist '(ess--tracebug-p ess-tracebug-indicator)) (defcustom ess-tracebug-prefix nil "*Key to be used as prefix for all ess-tracebug commands. Set this to a key cominbation you don't use often, like: (setq ess-tracebug-prefix \"\\M-t\") The postfix keys are defined in `ess-tracebug-map': \\{ess-tracebug-map} " :type 'string :group 'ess-tracebug) ;; (make-obsolete-variable 'ess-tracebug-prefix "ess-tracebug-prefix will be removed in future versions. ;; Electric debug keys are now on C-c and ess-dev maps." "ESS 13.05") ;; (define-obsolete-variable-alias 'ess-tracebug-command-prefix 'ess-tracebug-prefix) (defcustom ess-inject-source 'function-and-buffer "Control the source injection into evaluated code. If t, always inject source reference. If function, inject only for functions, If function-and-buffer, inject for functions and whole buffer (the default), If nil, never inject. When tracebug is active (the default), ESS instructs the subprocess to keep the source code references. If this variable is t, you won't be able to execute blocks which don't form a valid R expression. That is, if your expression spreads multiple paragraphs, and you call C-c C-c on first paragraph, R will report an error." :group 'ess-tracebug :type '(choice (const nil) (const function) (const function-and-buffer) (const t))) (define-obsolete-variable-alias 'ess-tracebug-inject-source-p 'ess-inject-source "ESS v13.09") (defcustom ess-tracebug-enter-hook nil "List of functions to call on entry to ess-tracebug mode. Use `add-hook' to insert append your functions to this list. " :group 'ess-tracebug :type 'hook) (defcustom ess-tracebug-exit-hook nil "List of functions to call on exit of ess-tracebug mode. Use `add-hook' to insert append your functions to this list. " :group 'ess-tracebug :type 'hook) (autoload 'ess-dev-map "ess-r-d" "[autoload]" nil) (defvaralias 'ess-tracebug-map 'ess-dev-map) (defvar ess--tracebug-eval-index 0 "This is used by to track source references in evaluation with source. For example, each time ess-eval-function is called the evaluated region is marked. When debugger enteres the code it desplayes this reference number. Ess-debug finds this number in the referenced buffer.") ;; these vars are org variables that store the src block locations (defvar org-edit-src-beg-marker nil) (defvar org-babel-current-src-block-location nil "Marker pointing to the src block currently being executed. This may also point to a call line or an inline code block. If multiple blocks are being executed (e.g., in chained execution through use of the :var header argument) this marker points to the outer-most code block.") ;; hash to store soruce references of the form: tmpname -> (filename . src_start) (defvar ess--srcrefs (make-hash-table :test 'equal :size 100)) (defvar ess-tracebug-original-buffer-marker nil "Marker pointing to the beginning of original source code. If non-nil, tracebug will insert the source references based on this location instead of the current buffer. This is useful for applications, like org-babel, that call ess evaluation functions from temporary buffers.") (defun ess--make-source-refd-command (beg end &optional visibly) "Transform region string in order to add source references. Return new command, a string." (let* ((filename buffer-file-name) (proc-dir (ess-get-process-variable 'default-directory)) (remote (when (file-remote-p proc-dir) (require 'tramp) ;; should this be done in process buffer? (tramp-dissect-file-name proc-dir))) (orig-marker (or ess-tracebug-original-buffer-marker org-edit-src-beg-marker org-babel-current-src-block-location)) orig-beg) (setq ess--tracebug-eval-index (1+ ess--tracebug-eval-index)) (goto-char beg) (skip-chars-forward " \t\n") (setq beg (point)) (goto-char end) (skip-chars-backward " \t\n") (setq end (point) orig-beg beg) ;; delete all old temp files (when (and (not (ess-process-get 'busy)) (< 1 (float-time (time-subtract (current-time) (ess-process-get 'last-eval))))) (dolist (f (ess-process-get 'temp-source-files)) (and (file-exists-p f) (delete-file f))) (ess-process-put 'temp-source-files nil)) (when (markerp orig-marker) (setq filename (buffer-file-name (marker-buffer orig-marker))) (setq orig-beg (+ beg (marker-position orig-marker)))) (let ((tmpfile (expand-file-name (make-temp-name (concat (file-name-nondirectory (or filename "unknown")) "!")) (if remote (tramp-get-remote-tmpdir remote) temporary-file-directory))) (eval-format (if visibly ess-eval-visibly-command (or ess-eval-visibly-noecho-command ess-eval-command)))) (ess-process-put 'temp-source-files (cons tmpfile (ess-process-get 'temp-source-files))) (when remote ;; get local name (should this be done in process buffer?) (setq tmpfile (with-parsed-tramp-file-name tmpfile nil localname))) (if (not filename) (puthash tmpfile (list nil ess--tracebug-eval-index nil) ess--srcrefs) (puthash tmpfile (list filename ess--tracebug-eval-index orig-beg) ess--srcrefs) (puthash (file-name-nondirectory tmpfile) ; R sometimes strips dirs (list filename ess--tracebug-eval-index orig-beg) ess--srcrefs) (with-silent-modifications (put-text-property beg end 'tb-index ess--tracebug-eval-index))) ;; sending string to subprocess is considerably faster than tramp file ;; transfer. So, give priority to ess-eval-*-command if available (if eval-format (format-spec eval-format `((?s . ,(ess-quote-special-chars (buffer-substring-no-properties beg end))) (?f . ,tmpfile))) ;; else: use ess-load-*-command (write-region beg end tmpfile nil 'silent) (if (and visibly ess-load-visibly-command) (format ess-load-visibly-command tmpfile) (format (or ess-load-visibly-noecho-command ess-load-command) tmpfile)))))) (defun ess-tracebug-send-region (proc start end &optional visibly message type) "Send region to process adding source references as specified by `ess-inject-source' variable." (let* ((inject-p (cond ((eq type 'function) ess-inject-source) ((eq type 'buffer) (or (eq ess-inject-source t) (eq ess-inject-source 'function-and-buffer))) (t (eq ess-inject-source t)))) (ess--debug-del-empty-p (if inject-p nil ess--dbg-del-empty-p)) ;; don't call ess-eval-linewise when subprocess does the job (vis (unless (and inject-p ess-load-visibly-command) (if (eq visibly 'no-wait) (buffer-substring start end) visibly))) (string (if inject-p (ess--make-source-refd-command start end visibly) (buffer-substring start end)))) (ess-send-string proc string vis message))) (defun ess-tracebug-send-function (proc start end &optional visibly message) "Like `ess-tracebug-send-region' but with tweaks for functions." (ess-tracebug-send-region proc start end visibly message 'function)) (defvar ess-tracebug-help nil " ess-dev-map prefix: \\[ess-dev-map] * Breakpoints (`ess-dev-map'): b . Set BP (repeat to cycle BP type) . `ess-bp-set' B . Set conditional BP . `ess-bp-set-conditional' k . Kill BP . `ess-bp-kil' K . Kill all BPs . `ess-bp-kill-all' o . Toggle BP state . `ess-bp-toggle-state' l . Set logger BP . `ess-bp-set-logger' n . Goto next BP . `ess-bp-next' p . Goto previous BP . `ess-bp-previous' (C- prefixed equivalents are also defined) * Debugging (`ess-dev-map'): ` . Show traceback . `ess-show-traceback' (also on C-c `) ~ . Show callstack . `ess-show-call-stack' (also on C-c ~) e . Toggle error action (repeat to cycle). `ess-debug-toggle-error-action' d . Flag for debugging . `ess-debug-flag-for-debugging' u . Unflag for debugging . `ess-debug-unflag-for-debugging' w . Watch window . `ess-watch' (C- prefixed equivalents are also defined) * Interactive Debugging (`ess-debug-minor-mode-map'): M-C . Continue . `ess-debug-command-continue' M-C-C . Continue multi . `ess-debug-command-continue-multi' M-N . Next step . `ess-debug-command-next' M-C-N . Next step multi . `ess-debug-command-next-multi' M-U . Up frame . `ess-debug-command-up' M-Q . Quit debugging . `ess-debug-command-quit' * Navigation to errors (general emacs functionality): C-x `, M-g n . `next-error' M-g p . `previous-error' ") ;; * Input Ring: ;; i . Goto input event marker forwards . `ess-debug-goto-input-event-marker' ;; I . Goto input event marker backwards . `ess-debug-goto-input-event-marker' (defun ess-tracebug-show-help (&optional ev) (interactive) (describe-variable 'ess-tracebug-help)) (defun ess-tracebug--propertize (dummy bitmap face &optional string ) "If window-system propertize DUMMY with fringe BITMAP and FACE, else propertize line-prefix and margin with STRING and FACE" (unless string (setq string dummy)) (if window-system (propertize dummy 'display (list 'left-fringe bitmap face)) (propertize dummy 'display (list '(margin left-margin) (propertize string 'font-lock-face face 'face face))))) (defun ess-tracebug (&optional arg) "Toggle ess-tracebug mode. With ARG, turn ess-tracebug mode on if and only if ARG is positive. This mode adds to ESS the interactive debugging, breakpoint and error navigation functionality. Strictly speaking ess-tracebug is not a minor mode. It integrates globally into ESS and iESS. Note: Currently, ess-tracebug does not detect some of R's debug related messages in non-English locales. To set your R messages to English add the following line to your .Rprofile init file: Sys.setlocale(\"LC_MESSAGES\", \"C\") See `ess-tracebug-help' for the overview of ess-tracebug functionality." ;; Note: The functionality in ess-tracebug is divided on conceptual ;; grounds in tracing and debugging and could be ;; activated/deactivate separately with `ess--tb-start' and ;; `ess-debug-start' respectively. (interactive "P") (ess-force-buffer-current "R process to activate tracebug in: ") (with-current-buffer (process-buffer (get-process ess-local-process-name)) (when (equal ess-dialect "R") (setq arg (if arg (prefix-numeric-value arg) (if (ess-process-get 'tracebug) -1 1))) (if (> arg 0) (unless (ess-process-get 'tracebug) ;; only if already not active (ess--tb-start) (ess-debug-start) ;; (dolist (bf (buffer-list)) ;; (with-current-buffer bf ;; (when (and (eq major-mode 'ess-mode) ;; (equal ess-dialect "R")) ;; (ess-bp-recreate-all)))) ;; watch functionality (if ess-tracebug-prefix (let ((comm (key-binding ess-tracebug-prefix))) ;; (message "ess-tracebug-prefix will be removed in future versions. Electric debug keys are now on [C-c] and [C-c C-t] maps.") ;; (sit-for 1) (when (commandp comm) (define-key ess-tracebug-map ess-tracebug-prefix comm)) (define-key ess-mode-map ess-tracebug-prefix ess-tracebug-map) (define-key inferior-ess-mode-map ess-tracebug-prefix ess-tracebug-map) (define-key ess-watch-mode-map ess-tracebug-prefix ess-tracebug-map))) (run-hooks 'ess-tracebug-enter-hook) (ess-process-put 'tracebug t) (message "ess-tracebug mode enabled")) (when (ess-process-get 'tracebug) ;;only when active (ess-process-put 'tracebug nil) ;; unset the map (when ess-tracebug-prefix (define-key ess-mode-map ess-tracebug-prefix nil) (define-key inferior-ess-mode-map ess-tracebug-prefix nil)) (ess--tb-stop) (ess-debug-stop) (run-hooks 'ess-tracebug-exit-hook) (message "ess-tracebug mode disabled")))))) (defalias 'ess-toggle-tracebug 'ess-tracebug) ;;;_* TRACEBACK ;; (defface ess--tb-last-input-face ;; '((((class grayscale) ;; (background light)) (:background "DimGray")) ;; (((class grayscale) ;; (background dark)) (:background "LightGray")) ;; (((class color) (background light) (min-colors 88)) ;; (:overline "medium blue" )) ;; (((class color) (background dark) (min-colors 88)) ;; (:overline "deep sky blue" )) ;; (((background light)) (:weight bold)) ;; (((background dark)) (:weight bold)) ;; ) ;; "Face to highlight currently debugged line." ;; :group 'ess-tracebug ) (defface ess-tracebug-last-input-fringe-face '((((background light) (min-colors 88)) (:foreground "medium blue" :overline "medium blue")) (((background dark) (min-colors 88)) (:foreground "deep sky blue" :overline "deep sky blue")) (((background light) (min-colors 8)) (:foreground "blue")) (((background dark) (min-colors 8)) (:foreground "syan"))) "Face for fringe bitmap for last-input position." :group 'ess-tracebug) (if (fboundp 'define-fringe-bitmap) (define-fringe-bitmap 'last-input-arrow [#b00011111 #b00010000 #b00010000 #b00010000 #b00010000 #b00010000 #b00010000 #b00010000 #b00010000 #b00010000 #b11010111 #b01111100 #b00111000 #b00010000] nil nil 'top)) (defvar ess--tb-last-input (make-marker) "Marker pointing to the last user input position in iESS buffer. This is the place where `ess--tb-last-input-overlay' is moved. Local in iESS buffers with `ess-tracebug' mode enabled.") (defvar ess--tb-last-input-overlay nil "Overlay to highlight the position of last input in iESS buffer. Local in iESS buffers.") (defvar ess--busy-count 0 "Used to compute the busy indicator") (make-variable-buffer-local 'ess--busy-count) ;; (unless (boundp 'ess--busy-slash) ;; (defvar ess--busy-slash '(32 ?\u2014 92 47)) ;; (setq ess--busy-slash (mapcar (lambda (el) (format " %c " el)) ;; ess--busy-slash)) ;; ) (defvar ess--busy-slash '(" " " - " " \\ " " / ")) (defvar ess--busy-B '(" " " B " " ")) (defvar ess--busy-stars '(" " " " " * " " ** " " *** " " **** ")) (defvar ess--busy-vbars '(" " " " " | " " || " " ||| " " |||| ")) (defcustom ess-busy-strings ess--busy-slash "List of strings to replace in turn for busy indication. The first element of the list is used as an indicator of the process being ready (i.e. not busy). Implemented lists that you can use `ess--busy-slash', `ess--busy-B',`ess--busy-stars', `ess--busy-vbars'" :group 'ess) (defvar ess--busy-timer nil "Timer used for busy process indication") (defcustom inferior-ess-split-long-prompt t "If non-nil, long prompt '> > > > > + + + + > ' is split." :group 'ess-tracebug) (defcustom inferior-ess-replace-long+ t "If non-nil, '+ + + + ' containing more than 4 + is replaced by `ess-long+replacement'" :group 'ess-tracebug) (defvar ess-long+replacement "+ . + " "Replacement used for long + prompt. Customization of this variable is not recommended. You can set it to '. '. If you set it to anything else you will have to change `inferior-S-prompt' to assure the correct prompt navigation in inferior buffers. ") (defmacro ess-copy-key (from-map to-map fun) `(define-key ,to-map (car (where-is-internal ,fun ,from-map)) ,fun)) ;;;_ + traceback functions (defun ess--tb-make-last-input-overlay (beg end) "Create an overlay to indicate the last input position." (let ((ove (make-overlay beg end))) (overlay-put ove 'before-string (ess-tracebug--propertize "!" 'last-input-arrow 'ess-tracebug-last-input-fringe-face)) ;; (overlay-put ove 'face 'ess--tb-last-input-face) (overlay-put ove 'evaporate t) ove)) (defun ess--tb-start () "Start traceback session " (with-current-buffer (process-buffer (get-process ess-local-process-name)) (unless ess-error-regexp-alist (error "Can not activate the traceback for %s dialect" ess-dialect)) (set (make-local-variable 'compilation-error-regexp-alist) ess-error-regexp-alist) (let (compilation-mode-font-lock-keywords) (compilation-setup t)) (setq next-error-function 'ess-tracebug-next-error-function) ;; new locals (make-local-variable 'ess--tb-last-input) (make-local-variable 'ess--tb-last-input-overlay) (make-local-variable 'compilation-search-path) (setq compilation-search-path ess-tracebug-search-path) ;; todo: make this dialect specific (ess-tracebug--set-left-margin) (save-excursion (goto-char comint-last-input-start) (setq ess--tb-last-input (point)) (setq ess--tb-last-input-overlay (ess--tb-make-last-input-overlay (point-at-bol) (point-at-eol)))) ;; busy timer (setq mode-line-buffer-identification (list (car (propertized-buffer-identification "%3b")) `(:eval (nth ess--busy-count ess-busy-strings)))) ;; 'face 'mode-line-buffer-id)))) (make-local-variable 'ess--busy-timer) (setq ess--busy-timer (run-with-timer 2 .5 (ess--make-busy-timer-function (get-buffer-process (current-buffer))))) (add-hook 'kill-buffer-hook (lambda () (when ess--busy-timer (cancel-timer ess--busy-timer)))) (add-hook 'comint-input-filter-functions 'ess-tracebug-set-last-input nil 'local) ;; redefine ;; todo: all this part should go (when (equal ess-dialect "R") (process-put (get-buffer-process (current-buffer)) 'source-file-function 'ess--tb-R-source-current-file)) (unless (fboundp 'orig-ess-parse-errors) (defalias 'orig-ess-parse-errors (symbol-function 'ess-parse-errors)) (defalias 'ess-parse-errors (symbol-function 'next-error))))) (defun ess--tb-stop () "Stop ess traceback session in the current ess process" (with-current-buffer (process-buffer (get-process ess-current-process-name)) ;; restore original definitions (when (equal ess-dialect "R") (when (fboundp 'orig-ess-parse-errors) (defalias 'ess-parse-errors (symbol-function 'orig-ess-parse-errors)) (fmakunbound 'orig-ess-parse-errors))) (if (local-variable-p 'ess--tb-last-input-overlay) (delete-overlay ess--tb-last-input-overlay)) (kill-local-variable 'ess--tb-last-input-overlay) (kill-local-variable 'ess--tb-last-input) (font-lock-remove-keywords nil (compilation-mode-font-lock-keywords)) (font-lock-fontify-buffer) (kill-local-variable 'compilation-error-regexp-alist) (kill-local-variable 'compilation-search-path) (cancel-timer ess--busy-timer) (remove-hook 'comint-input-filter-functions 'ess-tracebug-set-last-input 'local) (setq mode-line-buffer-identification (propertized-buffer-identification "%12b")))) (defvar ess--dbg-forward-ring (make-ring 10) "Ring of markers to the positions of the user inputs when the debugger or traceback events are initiated. It is used in `ess--dbg-goto-input-point'.") (defvar ess--dbg-backward-ring (make-ring 10) "Ring of markers to the positions from which `ess--dbg-goto-input-point' is called. See the also `ess--dbg-goto-debug-point'") ;; (setq ess-R--tb-regexp-alist '(R R2 R3 R-recover)) ;;(pop compilation-error-regexp-alist-alist) (defun ess-show-traceback () "Display R traceback and last error message. Pop up a compilation/grep/occur like buffer. Usual global key bindings are available \(\\[next-error] and \\[previous-error]\) for `next-error' and `previous-error' respectively. You can bind 'no-select' versions of this commands: \(define-key compilation-minor-mode-map [(?n)] 'next-error-no-select\) \(define-key compilation-minor-mode-map [(?p)] 'previous-error-no-select\) " (interactive) (if (null ess-traceback-command) (error "Not implemented for dialect %s" ess-dialect) (ring-insert ess--dbg-forward-ring (point-marker)) (ess-force-buffer-current "R process to use: ") (let ((trbuf (get-buffer-create "*ess-traceback*")) (lproc-name ess-local-process-name) (alist ess-mode-editing-alist) (cmd ess-traceback-command)) (setq next-error-last-buffer trbuf) (with-current-buffer trbuf (setq buffer-read-only nil) (setq ess-local-process-name lproc-name) (ess-command cmd trbuf) (goto-char (point-min)) ;; fixme: this is R specific check (if (re-search-forward "No traceback available" nil t) (message "No traceback available") (ess-dirs) (message nil) (make-local-variable 'compilation-error-regexp-alist) (setq compilation-error-regexp-alist ess-R-error-regexp-alist) (make-local-variable 'compilation-search-path) (setq compilation-search-path ess-tracebug-search-path) (ess-setq-vars-local alist) (font-lock-refresh-defaults) (compilation-minor-mode 1) (setq next-error-function 'ess-tracebug-next-error-function) ;(use-local-map ess-traceback-minor-mode-map) ;; ess keys (local-set-key "\C-c\C-s" 'ess-watch-switch-process) (local-set-key "\C-c\C-y" 'ess-switch-to-ESS) (local-set-key "\C-c\C-z" 'ess-switch-to-end-of-ESS) (setq buffer-read-only t) (pop-to-buffer trbuf)))))) (defvar ess-call-stack-command nil) (defun ess-show-call-stack () "Display current call stack. Also see `ess-show-traceback'" (interactive) (let ((ess-traceback-command ess-call-stack-command)) (ess-show-traceback))) (defalias 'ess-show-R-traceback 'ess-show-traceback) (defun ess--tb-next-error-goto-process-marker () ;; assumes current buffer is the process buffer with compilation enabled ;; used in ess-tracebug-next-error-function ; (with-current-buffer (process-buffer (get-process ess-local-process-name)) ; already in comint buffer .. no need (comint-goto-process-mark) (set-window-point (get-buffer-window) (point)) ;moves the cursor ;; FIXME: Should jump to current-debug-position, but messes the things if in recover ;; (when (ess-debug-is-active) ;; (ess-debug-goto-current-debug-position) ;; ) ) (defun ess-tracebug-next-error-function (n &optional reset) "Advance to the next error message and visits the file. This is the value of `next-error-function' in iESS buffers." ;; Modified version of `compilation-next-error-function'. (interactive "p") (if reset (goto-char (point-max))) (let* ((columns compilation-error-screen-columns) ; buffer's local value ;; (proc (or (get-buffer-process (current-buffer)) ;; (error "Current buffer has no process"))) (pbuff-p (get-buffer-process (current-buffer))) (last 1) (n (or n 1)) timestamp (beg-pos ; from where the search for next error starts (if (and pbuff-p (>= n 0) (comint-after-pmark-p)) ess--tb-last-input (point))) (at-error t) (msg (condition-case err (compilation-next-error n nil beg-pos) (error (when pbuff-p (ess--tb-next-error-goto-process-marker)) (if (< n 0) (message "Before first reference") (message "Beyond last reference"));(error-message-string err)) (setq at-error nil)))) (msg (if (or (not pbuff-p) (eq n 0) (> (point) ess--tb-last-input)) msg (ess--tb-next-error-goto-process-marker) (message "Beyond last-input marker") (setq at-error nil))) (marker (point-marker)) loc end-loc) (when at-error (setq compilation-current-error (point-marker) overlay-arrow-position (if (bolp) compilation-current-error (copy-marker (line-beginning-position))) loc (if (fboundp 'compilation--message->loc) (compilation--message->loc msg) (car msg)) end-loc (if (fboundp 'compilation--message->end-loc) ;; emacs 24 (compilation--message->end-loc msg) (nth 2 msg))) (let* ((file (caar (nth 2 loc))) (col (car loc)) (line (cadr loc)) (mkrs (ess--dbg-create-ref-marker file line col))) (if mkrs ;; is this really needed? Shall we go directly to the location? (compilation-goto-locus marker (car mkrs) (cadr mkrs)) (message "Reference to '%s' not found" file)))))) (defun inferior-ess-move-last-input-overlay () "Move the overlay to the point." (let ((pbol (point-at-bol))) (move-overlay ess--tb-last-input-overlay pbol (max (- (point) 2) (+ pbol 2))))) ;;;_* DEBUGGER (defgroup ess-debug nil "Debugging for ESS" :link '(emacs-library-link :tag "Source Lisp File" "ess-tracebug.el") :group 'ess-tracebug :prefix "ess-debug-") (defcustom ess-debug-error-action-alist '(( "-" "NONE" "NULL" ) ( "r" "RECOVER" "utils::recover") ( "t" "TRACEBACK" "base::traceback")) "Alist of 'on-error' actions. Toggled with `ess-debug-toggle-error-action'. Each element must have the form (DISP SYMB ACTION) where DISP is the string to be displayed in the mode line when the action is in place. SYMB is the symbolic name of an action. ACTION is the string giving the actual expression to be assigned to 'error' user option. See R's help ?options for more details. " :type '(alist :key-type string :value-type (string string)) :group 'ess-debug) (defvar ess--dbg-output-buf-prefix " *ess.dbg" "The prefix of the buffer name the R debug output is directed to." ) (defvar ess--dbg-current-ref (make-marker) "Current debug reference in *ess.dbg* buffers (a marker).") (make-variable-buffer-local 'ess--dbg-current-ref) (defvar ess--dbg-last-ref-marker (make-marker) "Last debug reference in *ess.dbg* buffer (a marker).") (make-variable-buffer-local 'ess--dbg-last-ref-marker) (defcustom ess-tracebug-search-path nil "List of directories to search for source files. Elements should be directory names, not file names of directories. " :type '(choice (const :tag "Unset" nil) (repeat :tag "Directory list" (string :tag "Directory"))) :group 'ess-debug) (defalias 'ess--dbg-search-path 'ess-tracebug-search-path) (make-obsolete 'ess--dbg-search-path 'ess-tracebug-search-path "ESS[12.09]") (defvar ess--dbg-buf-p nil "This is t in ess.dbg buffers.") (make-variable-buffer-local 'ess--dbg-buf-p) ;; (defcustom ess--dbg-auto-single-key-p t ;; "If t entering the debug state triggers single-key mode. ;; Set it to nil if you want to trigger single-key mode manually ;; with the `ess-tracebug-prefix' key. ;; ") (defvar ess--dbg-current-debug-position (make-marker) "Marker to the current debugged line. It always point to the beginning of the currently debugged line and is used by overlay-arrow. In no-windowed emacs an `overlay-arrow' is displayed at this position.") (unless window-system (add-to-list 'overlay-arrow-variable-list 'ess--dbg-current-debug-position)) (defface ess-debug-current-debug-line-face '((default (:inherit highlight))) "Face used to highlight currently debugged line." :group 'ess-debug) (defvar ess--dbg-current-debug-overlay (let ((overlay (make-overlay (point) (point)))) (overlay-put overlay 'face 'ess-debug-current-debug-line-face) (overlay-put overlay 'evaporate t) overlay) ;; should be global variable!! "The overlay for currently debugged line.") (defcustom ess-debug-blink-interval .2 "Time in seconds to blink the background of the current debug line on exceptional events. Currently two exceptional events are defined 'ref-not-found' and 'same-ref'. Blinking colors for these events can be customized by corresponding faces." :group 'ess-debug :type 'float) (defface ess-debug-blink-ref-not-found-face '((((class grayscale) (background light)) (:background "DimGray")) (((class grayscale) (background dark)) (:background "LightGray")) (((class color) (background light) (min-colors 88)) (:background "IndianRed4")) (((class color) (background dark) (min-colors 88)) (:background "dark red")) (((background light) (min-colors 8)) (:foreground "red")) (((background dark) (min-colors 8)) (:foreground "red"))) "Face used to blink currently debugged line's background when the reference file is not found. See also `ess-debug-ask-for-file'" :group 'ess-debug ) (defface ess-debug-blink-same-ref-face '((((class grayscale) (background light)) (:background "DimGray")) (((class grayscale) (background dark)) (:background "LightGray")) (((class color) (background light) (min-colors 88)) (:background "steel blue")) (((class color) (background dark) (min-colors 88)) (:background "midnight blue")) (((background light) (min-colors 8)) (:foreground "blue")) (((background dark) (min-colors 8)) (:foreground "cyan"))) "Face used to highlight currently debugged line when new debug reference is the same as the preceding one. It is highlighted for `ess-debug-blink-interval' seconds." :group 'ess-debug ) (defcustom ess-debug-indicator " db " "String to be displayed in mode-line alongside the process name. Indicates that ess-debug-mode is turned on. When the debugger is in active state this string is shown in upper case and highlighted." :group 'ess-debug :type 'string) (defcustom ess-debug-ask-for-file nil "If non nil, ask for file if the current debug reference is not found. If nil, the currently debugged line is highlighted for `ess-debug-blink-interval' seconds." :group 'ess-debug :type 'boolean) (defcustom ess-debug-skip-first-call t "If non-nil, skip first debugger call. In R first call doesn't contain source references and is skipped by default." :group 'ess-debug :type 'boolean) (defvar ess-electric-selection-map (let (ess-electric-selection-map) (define-prefix-command 'ess-electric-selection-map) ;; command-c and command-Q are not always working reliably (define-key ess-electric-selection-map "\M-N" 'ess-debug-command-continue) (define-key ess-electric-selection-map "\M-C" 'ess-debug-command-continue) (define-key ess-electric-selection-map "\M-Q" 'ess-debug-command-quit) (define-key ess-electric-selection-map "0" 'ess-debug-command-digit) (define-key ess-electric-selection-map "1" 'ess-debug-command-digit) (define-key ess-electric-selection-map "2" 'ess-debug-command-digit) (define-key ess-electric-selection-map "3" 'ess-debug-command-digit) (define-key ess-electric-selection-map "4" 'ess-debug-command-digit) (define-key ess-electric-selection-map "5" 'ess-debug-command-digit) (define-key ess-electric-selection-map "6" 'ess-debug-command-digit) (define-key ess-electric-selection-map "7" 'ess-debug-command-digit) (define-key ess-electric-selection-map "8" 'ess-debug-command-digit) (define-key ess-electric-selection-map "9" 'ess-debug-command-digit) (define-key ess-electric-selection-map "?" 'ess-tracebug-show-help) ess-electric-selection-map) "Keymap used to define commands for single key input mode. This commands are triggered by `ess-electric-selection' . \\{ess-electric-selection-map} ") (ess-if-verbose-write "\n<- debug-vars done") ;;;_ + debug functions (defun ess-debug-set-error-action (spec) "Set the on-error action. The ACTION should be one of components of `ess-debug-error-action-alist' (a cons!)." (let ((proc (get-process ess-local-process-name))) (if spec (with-current-buffer (process-buffer proc) (process-put proc 'on-error-action (car spec)) (ess-command (format "options(error= %s )\n" (nth 2 spec)))) (error "Unknown action.")))) (defun ess-debug-toggle-error-action () "Toggle the 'on-error' action. The action list is in `ess-debug-error-action-alist'. " (interactive) (ess-force-buffer-current) (let* ((alist ess-debug-error-action-alist) (ev last-command-event) (com-char (event-basic-type ev)) (cur-action (or (ess-process-get 'on-error-action) "-")) actions act) (setq actions (cdr (member (assoc cur-action ess-debug-error-action-alist) ess-debug-error-action-alist))) (unless actions (setq actions ess-debug-error-action-alist)) (setq act (pop actions)) (ess-debug-set-error-action act) (message "On-error action set to: %s" (propertize (cadr act) 'face 'font-lock-function-name-face)) (while (eq (event-basic-type (setq ev (read-event))) com-char) (unless actions (setq actions ess-debug-error-action-alist)) (setq act (pop actions)) (ess-debug-set-error-action act) (message "On-error action set to: %s" (propertize (cadr act) 'face 'font-lock-function-name-face))) (push ev unread-command-events))) (defun ess--dbg-activate-overlays () "Initialize active debug line overlays." (move-overlay ess--dbg-current-debug-overlay (point-at-bol) (1+ (point-at-eol)) (current-buffer)) ;; used by overlay-arrow functionality on no-X, should be bol (move-marker ess--dbg-current-debug-position (point-at-bol))) (defun ess--dbg-deactivate-overlays () "Deletes markers and overlays. Overlay arrow remains to indicate the last debug position." (delete-overlay ess--dbg-current-debug-overlay) (set-marker ess--dbg-current-debug-position nil)) ;;;_ + Work Flow (defun ess-debug-goto-input-event-marker () "Jump to the point where the last debugger/traceback etc event occurred. Mainly useful during/after debugging, to jump to the place from where the code was initialy executed. This is an electric-command, which means that after the command is triggered a single key event is enough to navigate through the input-event-S-ring. If the key-event which triggered the command is Shift modified the input-event-S-ring is traversed backwards. The input-event-S-ring is a virtual object which consists of two rings `ess--dbg-forward-ring' and `ess--dbg-backward-ring' which are joint at their tops. See the more info at http://code.google.com/p/ess-tracebug/#Work-Flow " (interactive) (let* ((ev last-command-event) (com-char (event-basic-type ev)) (ring-el 0) input-point) (if (memq 'shift (event-modifiers ev)) (setq input-point (ring-ref ess--dbg-backward-ring 0)) (ring-insert ess--dbg-backward-ring (point-marker)) ;; insert in backward ring ;;todo: check if the marker to this (close by?) position is already in the ring (setq input-point (ring-ref ess--dbg-forward-ring 0))) (when (marker-buffer input-point) ;; todo: give a message here if buff is not found (switch-to-buffer (marker-buffer input-point)) (when (marker-position input-point) (goto-char (marker-position input-point)))) (while (eq (event-basic-type (event-basic-type (setq ev (read-event)))) com-char) (if (memq 'shift (event-modifiers ev)) (setq ring-el (1- ring-el)) (setq ring-el (1+ ring-el))) (if (< ring-el 0) (setq input-point (ring-ref ess--dbg-backward-ring (- ring-el))) ;; get it from backward-ring ;; get it from forward-ring (setq input-point (ring-ref ess--dbg-forward-ring ring-el)) ) (when (marker-buffer input-point) (switch-to-buffer (marker-buffer input-point)) (when (marker-position input-point) (goto-char (marker-position input-point))))) (push ev unread-command-events))) (defun ess-debug-goto-debug-point () "Returns to the debugging position. Jump to markers stored in `ess--dbg-backward-ring'. If debug session is active, first jump to current debug line. This is an electric-command. Shift triggers the opposite traverse of the ring." (interactive) (let* ((debug-point (ring-ref ess--dbg-backward-ring 0)) (ev last-command-event) (com-char (event-basic-type ev)) (ring-el 0)) (if (ess--dbg-is-active-p) (progn (switch-to-buffer (marker-buffer ess--dbg-current-debug-position)) (goto-char (marker-position ess--dbg-current-debug-position )) (back-to-indentation)) (switch-to-buffer (marker-buffer debug-point)) (goto-char (marker-position debug-point))) (while (eq (event-basic-type (setq ev (read-event))) com-char) (if (memq 'shift (event-modifiers ev)) (setq ring-el (1- ring-el)) (setq ring-el (1+ ring-el))) (setq debug-point (ring-ref ess--dbg-backward-ring ring-el)) (when (marker-buffer debug-point) (switch-to-buffer (marker-buffer debug-point)) (when (marker-position debug-point) (goto-char (marker-position debug-point))))) (push ev unread-command-events))) (defun ess-debug-insert-in-forward-ring () (interactive) "Inserts point-marker into the forward-ring." (ring-insert ess--dbg-forward-ring (point-marker)) (message "Point inserted into the forward-ring")) (defvar ess--dbg-mode-line-indicator '(:eval (let ((proc (get-process ess-local-process-name))) (if (and proc (process-get proc 'dbg-active)) (let ((str (upcase ess-debug-indicator))) (setq ess-debug-minor-mode t) ; activate the keymap (put-text-property 1 (1- (length str)) 'face '(:foreground "white" :background "red") str) str) (setq ess-debug-minor-mode nil) ess-debug-indicator)))) (make-variable-buffer-local 'ess--dbg-mode-line-indicator) (put 'ess--dbg-mode-line-indicator 'risky-local-variable t) (defvar ess--dbg-mode-line-error-action '(:eval (or (and (ess-process-live-p) (ess-process-get 'on-error-action)) "-"))) (make-variable-buffer-local 'ess--dbg-mode-line-error-action) (put 'ess--dbg-mode-line-error-action 'risky-local-variable t) (defun ess--dbg-remove-empty-lines (string) "Remove empty lines (which interfere with evals) during debug. This function is placed in `ess-presend-filter-functions'. " ;; the process here is an ugly reliance on dynamic scope (if (and ess--dbg-del-empty-p (process-get process 'dbg-active)) (replace-regexp-in-string "\n\\s *$" "" string) string)) (defun ess-debug-start () "Start the debug session. Add to ESS the interactive debugging functionality, breakpoints, watch and loggers. Integrates into ESS and iESS modes by binding `ess-tracebug-map' to `ess-tracebug-prefix' in `ess-mode-map' and `inferior-ess-mode-map' respectively." (interactive) (let ((dbuff (get-buffer-create (concat ess--dbg-output-buf-prefix "." ess-current-process-name "*"))) ;todo: make dbuff a string! (proc (ess-get-process ess-local-process-name)) (lpn ess-local-process-name)) (process-put proc 'dbg-buffer dbuff); buffer were the look up takes place (process-put proc 'dbg-active nil) ; t if the process is in active debug state. ; Active debug states are usually those, in which prompt start with Browser[d]> (set-process-filter proc 'inferior-ess-tracebug-output-filter) (with-current-buffer (process-buffer proc) (unless (equal ess-dialect "R") (error "Can not activate the debugger for %s dialect" ess-dialect)) (add-to-list 'ess--mode-line-process-indicator 'ess--dbg-mode-line-indicator t) (add-to-list 'ess--mode-line-process-indicator 'ess--dbg-mode-line-error-action t) (add-hook 'ess-presend-filter-functions 'ess--dbg-remove-empty-lines nil 'local)) (with-current-buffer dbuff (setq ess-local-process-name lpn) (buffer-disable-undo) ;; (setq buffer-read-only nil) (make-local-variable 'overlay-arrow-position) ;; indicator for next-error functionality in the *ess.dbg*, useful?? (goto-char (point-max)) (setq ess--dbg-buf-p t ;; true if in *ess.dbg* buffer ess--dbg-current-ref (point-marker) ;; used by goto-error functionality ess--dbg-last-ref-marker (point-marker) ;; gives marker to reference of the last debugged line ) ;; (beginning-of-line) ;; (setq buffer-read-only t) ))) (defun ess-debug-stop () "End the debug session. Kill the *ess.dbg.[R_name]* buffer." ;;; process plist is not removed, todo?low priority (interactive) (let ((proc (get-process ess-current-process-name))) ;;local? (with-current-buffer (process-buffer proc) (if (member ess-dialect '("XLS" "SAS" "STA")) (error "Can not deactivate the debugger for %s dialect" ess-dialect)) (delq 'ess--dbg-mode-line-indicator ess--mode-line-process-indicator) (delq 'ess--dbg-mode-line-error-action ess--mode-line-process-indicator) (remove-hook 'ess-presend-filter-functions 'ess--dbg-remove-empty-lines 'local)) (set-process-filter proc 'inferior-ess-output-filter) (kill-buffer (process-get proc 'dbg-buffer)) (process-put proc 'dbg-buffer nil) (process-put proc 'dbg-active nil) ;; (when (buffer-live-p ess--dbg-buffer) ;; ;; (with-current-buffer ess--dbg-buffer ;; ;; (set-buffer-modified-p nil) ;; ;; ) ;; (kill-buffer ess--dbg-buffer) ;; ) )) (defun ess--make-busy-timer-function (process) "Display the spiner of prompt if ess-process is busy." `(lambda () (let ((pb ,process)) (when (eq (process-status pb) 'run) ;; only when the process is alive (with-current-buffer (process-buffer pb) (if (not (process-get pb 'busy)) ;; if ready (when (> ess--busy-count 0) (setq ess--busy-count 0) (force-mode-line-update) (redisplay)) (setq ess--busy-count (1+ (mod ess--busy-count (1- (length ess-busy-strings))))) (force-mode-line-update) ;; looks like redisplay is necessary for emacs > 24.4 (redisplay))))))) ;; (ess--make-busy-prompt-function (get-process "R")) (defun ess--dbg-is-active-p () "Return t if the current R process is in active debugging state." (and (ess-process-live-p) (ess-process-get 'dbg-active))) (defun ess--dbg-is-recover-p () "Return t if the current R process is in active debugging state." (and (ess-process-live-p) (ess-process-get 'is-recover))) (defvar ess--dbg-regexp-reference "debug \\w+ +\\(.+\\)#\\([0-9]+\\):") (defvar ess--dbg-regexp-jump "debug \\w+ ") ;; debug at ,debug bei ,etc (defvar ess--dbg-regexp-skip ;; VS[21-03-2012|ESS 12.03]: sort of forgot why recover() was for:( ;; don't anchor to bol secondary prompt can occur before (anything else?) ;; "\\(\\(?:Called from: \\)\\|\\(?:debugging in: \\)\\|\\(?:#[0-9]*: +recover()\\)\\)") "\\(\\(?:Called from: \\)\\|\\(?:#[0-9]*: +recover()\\)\\)") (defvar ess--dbg-regexp-debug "\\(\\(?:Browse[][0-9]+\\)\\|\\(?:debug: \\)\\)") (defvar ess--dbg-regexp-selection "\\(Selection: \\'\\)") (defvar ess--dbg-regexp-input (concat ess--dbg-regexp-debug "\\|" ess--dbg-regexp-selection)) (defvar ess--suppress-next-output? nil) (defun ess--flush-process-output-cache (proc) (let ((string (with-current-buffer (get-buffer-create (process-get proc 'accum-buffer-name)) (prog1 (buffer-string) (erase-buffer))))) (when (> (length string) 0) (process-put proc 'last-flush-time (and (process-get proc 'busy) (float-time))) (comint-output-filter proc string) (ess--show-process-buffer-on-error string proc)))) (defun inferior-ess-tracebug-output-filter (proc string) "Standard output filter for the inferior ESS process when `ess-debug' is active. Call `inferior-ess-output-filter'. Check for activation expressions (defined in `ess--dbg-regexp-debug',...), when found puts iESS in the debugging state. If in debugging state, mirrors the output into *ess.dbg* buffer." (let* ((is-iess (member major-mode (list 'inferior-ess-mode 'ess-watch-mode))) (pbuf (process-buffer proc)) (dbuff (process-get proc 'dbg-buffer)) (wbuff (get-buffer ess-watch-buffer)) (was-in-dbg (process-get proc 'dbg-active)) (was-in-recover (process-get proc 'is-recover)) (input-point (point-marker)) (match-jump (string-match ess--dbg-regexp-jump string)) (match-input (string-match ess--dbg-regexp-input string)) (match-selection (and match-input (match-string 2 string))) ;; Selection: (match-skip (and ess-debug-skip-first-call (string-match ess--dbg-regexp-skip string))) (match-dbg (or match-skip (and match-input (not match-selection)))) ;;check for main prompt!! the process splits the output and match-end == nil might indicate this only ;; (prompt-regexp "^>\\( [>+]\\)*\\( \\)$") ;; default prompt only (prompt-replace-regexp "\\(^> \\|^\\([>+] \\)\\{2,\\}\\)\\(?1: \\)") ;; works only with the default prompt (is-ready (not (inferior-ess-set-status proc string))) (new-time (float-time)) (last-time (process-get proc 'last-flush-time)) (flush-timer (process-get proc 'flush-timer))) ;; current-buffer is still the user's input buffer here (ess--if-verbose-write-process-state proc string) (inferior-ess-run-callback proc string) (process-put proc 'is-recover match-selection) (if (or (process-get proc 'suppress-next-output?) ess--suppress-next-output?) ;; works only for surpressing short output, for time being is enough (for callbacks) (process-put proc 'suppress-next-output? nil) ;; FIXME: this should be in comint filters!! ;; insert \n after the prompt when necessary (setq string (replace-regexp-in-string prompt-replace-regexp " \n" string nil nil 1)) ;; replace long prompts (when inferior-ess-replace-long+ (setq string (replace-regexp-in-string "\\(\\+ \\)\\{4\\}\\(\\+ \\)+" ess-long+replacement string))) ;; COMINT (with-current-buffer (get-buffer-create (process-get proc 'accum-buffer-name)) (goto-char (point-max)) (insert string)) ;; Need this timer here; process might be waiting for user's input! (when (timerp flush-timer) ;; cancel the timer each time we enter the filter (cancel-timer flush-timer) (process-put proc 'flush-timer nil)) ;; ... and setup a new one (process-put proc 'flush-timer (run-at-time .2 nil 'ess--flush-process-output-cache proc)) (when (or (null last-time) (> (- new-time last-time) .5)) ;; Very slow in long comint buffers. Not a real issue, as it is executed ;; periodically, or only on first output after the command. (with-current-buffer pbuf (save-excursion (let ((pmark (process-mark proc)) (inhibit-modification-hooks t)) (goto-char pmark) (when (looking-back inferior-ess-primary-prompt) (insert-before-markers "\n") (set-marker pmark (point))))))) (unless last-time ;; don't flush first time (setq last-time new-time) (process-put proc 'last-flush-time new-time)) (when (or is-ready (process-get proc 'sec-prompt) ; for the sake of ess-eval-linewise ;; flush periodically (> (- new-time last-time) .6)) (ess--flush-process-output-cache proc))) ;; WATCH (when (and is-ready wbuff) ;; refresh only if the process is ready and wbuff exists, (not only in the debugger!!) (ess-watch-refresh-buffer-visibly wbuff)) ;; JUMP to line if debug expression was matched (when match-jump (with-current-buffer dbuff ;; insert string in *ess.dbg* buffer (goto-char (point-max)) (insert (concat "|-" string "-|"))) (ess--dbg-goto-last-ref-and-mark dbuff is-iess)) ;; (with-current-buffer dbuff ;; uncomment to see the value of STRING just before debugger exists ;; (let ((inhibit-read-only t)) ;; (goto-char (point-max)) ;; (insert (concat " ---\n " string "\n ---")) ;; )) ;; SKIP if needed (when (and match-skip (not was-in-recover)) (process-send-string proc "n\n")) ;; EXIT the debugger (when (and was-in-dbg (not (or match-jump match-dbg)) (or is-ready match-selection)) (ess--dbg-deactivate-overlays) (process-put proc 'dbg-active nil) ;; (message "|<-- exited debugging -->|") (when wbuff (ess-watch-refresh-buffer-visibly wbuff))) ;; ACTIVATE the debugger and trigger electric COMMAND if entered for the first time (when (and (not was-in-dbg) (not match-selection) (or match-jump match-dbg)) (unless is-iess (ring-insert ess--dbg-forward-ring input-point)) (process-put proc 'dbg-active t) (message (ess--debug-keys-message-string)) ;; (when ess--dbg-auto-single-key-p ;; (ess-electric-debug t)) ) (when match-selection ;(and (not was-in-recover) match-selection) (ess-electric-selection t)))) (defvar ess-debug-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map (kbd "M-C") 'ess-debug-command-continue) (define-key map [(control meta ?C)] 'ess-debug-command-continue-multi) (define-key map (kbd "M-N") 'ess-debug-command-next) (define-key map [(control meta ?N)] 'ess-debug-command-next-multi) (define-key map (kbd "M-Q") 'ess-debug-command-quit) (define-key map (kbd "M-U") 'ess-debug-command-up) map) "Keymap active when ESS process is in debugging state. \\{ess-debug-minor-mode-map}") (define-minor-mode ess-debug-minor-mode "Minor mode activated when ESS process is in debugging state." :lighter nil :keymap ess-debug-minor-mode-map) (defun ess--dbg-goto-last-ref-and-mark (dbuff &optional other-window) "Open the most recent debug reference, and set all the necessary marks and overlays. It's called from `inferior-ess-tracebug-output-filter'. DBUFF must be the *ess.dbg* buffer associated with the process. If OTHER-WINDOW is non nil, attempt to open the location in a different window." (interactive) (let (t-debug-position ref) (with-current-buffer dbuff (setq ref (ess--dbg-get-next-ref -1 (point-max) ess--dbg-last-ref-marker ess--dbg-regexp-reference)) ; sets point at the end of found ref (when ref (move-marker ess--dbg-last-ref-marker (point-at-eol)) ;; each new step repositions the current-ref! (move-marker ess--dbg-current-ref ess--dbg-last-ref-marker))) (when ref (let ((buf (apply 'ess--dbg-goto-ref other-window ref))) (if buf ;; if referenced buffer has been found, put overlays: (with-current-buffer buf (setq t-debug-position (copy-marker (point-at-bol))) (if (equal t-debug-position ess--dbg-current-debug-position) (progn ;; highlights the overlay for ess--dbg-blink-interval seconds (overlay-put ess--dbg-current-debug-overlay 'face 'ess--dbg-blink-same-ref-face) (run-with-timer ess-debug-blink-interval nil (lambda () (overlay-put ess--dbg-current-debug-overlay 'face 'ess-debug-current-debug-line-face)))) ;; else (ess--dbg-activate-overlays))) ;;else, buffer is not found: highlight and give the corresponding message (overlay-put ess--dbg-current-debug-overlay 'face 'ess--dbg-blink-ref-not-found-face) (run-with-timer ess-debug-blink-interval nil (lambda () (overlay-put ess--dbg-current-debug-overlay 'face 'ess-debug-current-debug-line-face))) (message "Reference %s not found" (car ref))))))) (defun ess--dbg-goto-ref (other-window file line &optional col) "Opens the reference given by FILE, LINE and COL, Try to open in a different window if OTHER-WINDOW is nil. Return the buffer if found, or nil otherwise be found. `ess--dbg-find-buffer' is used to find the FILE and open the associated buffer. If FILE is nil return nil." (let ((mrk (car (ess--dbg-create-ref-marker file line col))) (lpn ess-local-process-name)) (when mrk (let ((buf (marker-buffer mrk))) (if (not other-window) (switch-to-buffer buf) (let ((this-frame (window-frame (get-buffer-window (current-buffer))))) (display-buffer buf) ;; simple save-frame-excursion (unless (eq this-frame (window-frame (get-buffer-window buf t))) (ess-select-frame-set-input-focus this-frame)))) ;; set or re-set to lpn as this is the process with debug session on (with-current-buffer buf (setq ess-local-process-name lpn) (goto-char mrk) (set-window-point (get-buffer-window buf) mrk)) buf)))) ;; temporary, hopefully org folks implement something similar (defvar org-babel-tangled-file nil) (defun ess--dbg-create-ref-marker (file line &optional col) "Create markers to the reference given by FILE, LINE and COL. Return list of two markers MK-start and MK-end. MK-start is the position of error. Mk-end is the end of the line where error occurred. If buffer associated with FILE is not found, or line is nil, or TB-INDEX is not found return nil." (if (stringp line) (setq line (string-to-number line))) (if (stringp col) (setq col (string-to-number col))) (let* ((srcref (gethash file ess--srcrefs)) (file (replace-regexp-in-string "^\n" "" ;; hack for gnu regexp (or (car srcref) file))) (tb-index (cadr srcref)) (buffer (ess--dbg-find-buffer file)) pos) (when (and buffer line) (save-excursion (with-current-buffer buffer (save-restriction (widen) ;; how does this behave in narrowed buffers? tothink: (goto-char 1) (setq pos (point)) (when tb-index (while (and (not (eq tb-index (get-text-property pos 'tb-index))) (setq pos (next-single-property-change pos 'tb-index))))) (unless pos ;; use beg position if index not found (setq pos (nth 2 srcref))) (when pos (goto-char pos) (forward-line (1- line)) (if col (goto-char (+ (point-at-bol) col)) (back-to-indentation)) (when org-babel-tangled-file (org-babel-tangle-jump-to-org)) (list (point-marker) (copy-marker (point-at-eol)))))))))) (defun ess--dbg-find-buffer (filename) "Find a buffer for file FILENAME. If FILENAME is not found at all, ask the user where to find it if `ess--dbg-ask-for-file' is non-nil. Search the directories in `ess-tracebug-search-path'." (let ((dirs ess-tracebug-search-path) (spec-dir default-directory) buffsym buffer thisdir fmts name buffername) (setq dirs (cons spec-dir dirs)) ;; current does not have priority!! todo:should be R working dir ;; 1. search already open buffers for match (associated file might not even exist yet) (dolist (bf (buffer-list)) (with-current-buffer bf (when (and buffer-file-name (or (and (file-name-absolute-p filename) (string-match (format "%s\\'" filename) buffer-file-name)) (equal filename (file-name-nondirectory buffer-file-name)))) (setq buffer bf) (return)))) ;; 2. The file name is absolute. Use its explicit directory as ;; the first in the search path, and strip it from FILENAME. (when (and (null buffer) (file-name-absolute-p filename)) (setq filename (abbreviate-file-name (expand-file-name filename)) dirs (cons (file-name-directory filename) dirs) filename (file-name-nondirectory filename))) ;; 3. Now search the path. (while (and (null buffer) dirs ) (setq thisdir (car dirs)) (setq name (expand-file-name filename thisdir) buffer (and (file-exists-p name) (find-file-noselect name))) (setq dirs (cdr dirs))) ;; 4. Ask for file if not found (tothink: maybe remove this part?) (if (and (null buffer) ess-debug-ask-for-file) (save-excursion ;This save-excursion is probably not right. (let* ((pop-up-windows t) (name (read-file-name (format "Find next line in (default %s): " filename) spec-dir filename t nil)) (origname name)) (cond ((not (file-exists-p name)) (message "Cannot find file `%s'" name) (ding) (sit-for 2)) ((and (file-directory-p name) (not (file-exists-p (setq name (expand-file-name filename name))))) (message "No `%s' in directory %s" filename origname) (ding) (sit-for 2)) (t (setq buffer (find-file-noselect name))))))) ;; nil if not found buffer)) (defun ess--dbg-get-next-ref (n &optional pt BOUND REG nF nL nC) "Move point to the next reference in the *ess.dbg* buffer. Must be called from *ess.dbg* buffer. It returns the reference in the form (file line col) /all strings/ , or NIL if not found . Prefix arg N says how many error messages to move forwards (or backwards, if negative). Optional arg PT, if non-nil, specifies the value of point to start looking for the next message, default to (point). BOUND is the limiting position of the search. REG is the regular expression to search with. nF - sub-expression of REG giving the 'file'; defaults to 1. nL - giving the 'line'; defaults to 2. nC - sub-expr giving the 'column'; defaults to 3. " (interactive "p") (unless ess--dbg-buf-p (error "Not in *ess.dbg* buffer.")) (setq nF (or nF 1) nL (or nL 2) nC (or nC 3)) (or pt (setq pt (point))) ;; (message "ess--dbg-last-ref-marker%s vs pt%s vs point-max%s" ess--dbg-last-ref-marker pt (point-max)) (goto-char pt) (if (search-forward-regexp REG BOUND t n) (list (match-string nF) (match-string-no-properties nL) (match-string-no-properties nC)) nil)) (defun ess--dbg-next-ref-function (n &optional reset) "Advance to the next reference and visit the location given by the reference. This is the value of `next-error-function' in *ess.dbg* buffers." (interactive "p") (if reset (set-marker ess--dbg-current-ref ess--dbg-last-ref-marker)) (let ((loc (ess--dbg-get-next-ref n nil ess--dbg-current-ref)) ;; moves point to next/prev ref if any ; loc is (file . line_nr) dbuff) (if loc (progn (set-marker ess--dbg-current-ref (line-end-position)) (set-marker overlay-arrow-position (line-beginning-position)) (setq dbuff (ess--dbg-find-buffer (car loc))) (switch-to-buffer dbuff) (save-restriction (widen) (goto-char 1) (forward-line (1- (cdr loc)))) (move-marker ess--dbg-current-debug-position (line-beginning-position)) ; move the overlay-arrow (back-to-indentation)) (if (>= 0 (or n 1)) (error "Moved past first debug line") (error "Moved past last debug line"))))) ;; not used; remove in 13.09 (defvar ess-electric-debug-map (let ((map (make-sparse-keymap))) (define-key map "c" 'ess-debug-command-continue) (define-key map "C" 'ess-debug-command-continue-multi) (define-key map "n" 'ess-debug-command-next) (define-key map "N" 'ess-debug-command-next-multi) (define-key map "q" 'ess-debug-command-quit) (define-key map "u" 'ess-debug-command-up) map) "Keymap used to define commands for single key input mode. This commands are triggered by `ess-electric-debug' . \\{ess-electric-debug-map}") (make-obsolete-variable 'ess-electric-debug-map nil "ESS 13.05") (defun ess--debug-keys-message-string (&optional map) (let ((overriding-local-map (or map ess-debug-minor-mode-map))) (substitute-command-keys (mapconcat 'identity '("(\\[ess-debug-command-continue])cont" "(\\[ess-debug-command-continue-multi])cont-multi" "(\\[ess-debug-command-next])next" "(\\[ess-debug-command-next-multi])next-multi" "(\\[ess-debug-command-up])up" "(\\[ess-debug-command-quit])quit") " ")))) ;; not used anywhere; remove in ESS 13.09 (defun ess-electric-debug (&optional wait) "Call commands defined in `ess-electric-debug-map'. Single-key input commands are those that once invoked do not requre the prefix command for subsequent invocation. For example, if the prefix key is 'C-c C-t' and `ess-debug-command-next' is bound to 'n' and `ess-debug-command-continue' is bound to 'c' then 'C-c C-t n n c' executes `ess-debug-command-next' twice and `ess-debug-command-continue' once. Any other input not defined in `ess-electric-debug-map' will cause the exit from single-key input mode. If WAIT is t, wait for next input and ignore the keystroke which triggered the command." (interactive) (let ((help-mess (ess--debug-keys-message-string ess-electric-debug-map))) (ess--execute-electric-command ess-electric-debug-map help-mess wait (not (ess-process-get 'dbg-active))))) (define-obsolete-function-alias 'ess-singlekey-debug 'ess-electric-debug "ESS 13.05") (make-obsolete 'ess-electric-debug nil "ESS 13.05") (defun ess-electric-selection (&optional wait) "Call commands defined in `ess-electric-selection-map'. Single-key input commands are those, which once executed do not requre the prefix command for subsequent invocation. See `ess-electric-debug' for more. If WAIT is t, wait for next input and ignore the keystroke which triggered the command." (interactive) (ess--execute-electric-command ess-electric-selection-map "Selection: " wait (not (ess-process-get 'is-recover)))) (make-obsolete 'ess-singlekey-selection 'ess-electric-selection "ESS 13.05") (defun ess-debug-command-digit (&optional ev) "Digit commands in selection mode. If suplied ev must be a proper key event or a string representing the digit." (interactive) (unless ev (setq ev last-command-event)) (let* ((ev-char (if (stringp ev) ev (char-to-string (event-basic-type ev)))) (proc (get-process ess-current-process-name)) (mark-pos (marker-position (process-mark proc))) (comint-prompt-read-only nil) prompt depth) (if (process-get proc 'is-recover) (with-current-buffer (process-buffer proc) (goto-char mark-pos) (save-excursion (when (re-search-backward "\\(?: \\|^\\)\\([0-9]+\\):[^\t]+Selection:" ess--tb-last-input t) (setq depth (string-to-number (match-string 1))) (when (> depth 9) (setq ev-char (ess-completing-read "Selection" (mapcar 'number-to-string (number-sequence depth 0 -1)) nil t ev-char nil))))) (setq prompt (delete-and-extract-region (point-at-bol) mark-pos)) (insert (concat prompt ev-char "\n")) (ess-send-string proc ev-char) (move-marker (process-mark proc) (max-char))) (error "Recover is not active")))) (defun ess-debug-command-next (&optional ev) "Step next in debug mode. Equivalent to 'n' at the R prompt." (interactive) (if (not (ess--dbg-is-active-p)) (error "Debugger is not active") (if (ess--dbg-is-recover-p) (ess-send-string (get-process ess-current-process-name) "0") (ess-send-string (get-process ess-current-process-name) "n")))) (defun ess-debug-command-next-multi (&optional ev N) "Ask for N and step (n) N times in debug mode." (interactive) (if (not (ess--dbg-is-active-p)) (error "Debugger is not active") (let ((N (or N (read-number "Number of steps: " 10))) (proc (get-process ess-local-process-name)) (ess--suppress-next-output? t)) (while (and (ess--dbg-is-active-p) (> N 0)) (ess-debug-command-next) (ess-wait-for-process proc) (setq N (1- N)))) (ess-debug-command-next))) (defun ess-debug-command-continue-multi (&optional ev N) "Ask for N, and continue (c) N times in debug mode." (interactive) (if (not (ess--dbg-is-active-p)) (error "Debugger is not active") (let ((N (or N (read-number "Number of continuations: " 10))) (proc (get-process ess-local-process-name)) (ess--suppress-next-output? t)) (while (and (ess--dbg-is-active-p) (> N 1)) (ess-debug-command-continue) (ess-wait-for-process proc) (setq N (1- N)))) (ess-debug-command-continue))) (defun ess-debug-command-up (&optional ev) "Step up one call frame. Equivalent to 'n' at the R prompt." (interactive) (if (not (ess--dbg-is-active-p)) (error "Debugger is not active") (let ((proc (get-process ess-local-process-name))) (ess-send-string proc "try(browserSetDebug(), silent=T)\nc\n")))) ;; (defun ess-debug-previous-error (&optional ev) ;; "Go to previous reference during the debug process. ;; R doesn't support step backwards. This command just takes you through ;; debug history." ;; (interactive) ;; (previous-error)) (defun ess-debug-command-quit (&optional ev) "Quits the browser/debug in R process. Equivalent to 'Q' at the R prompt." (interactive) (let ((proc (get-process ess-current-process-name) )) (if (not (or (process-get proc 'dbg-active) (process-get proc 'is-recover))) (error "Debugger is not active") (when (ess--dbg-is-recover-p) (ess-send-string proc "0") ;; if recover is called in a loop the following stalls emacs ;; (ess-wait-for-process proc nil 0.05) ) (if (and (process-get proc 'dbg-active) (not (process-get proc 'is-recover))); still in debug mode (ess-send-string proc "Q"))))) (defun ess-debug-command-continue (&optional ev) "Continue the code execution. Equivalent of 'c' at the R prompt." (interactive) (let ((proc (get-process ess-current-process-name))) (if (not (or (process-get proc 'dbg-active) (process-get proc 'is-recover))) (error "Debugger is not active") (when (ess--dbg-is-recover-p) (ess-send-string proc "0") ;; (ess-wait-for-process proc nil 0.05) <- when in a loop, gets stuck ) ;; get out of recover mode (if (and (process-get proc 'dbg-active) ; still in debug mode (not (process-get proc 'is-recover))); still in debug mode (ess-send-string proc "c"))))) (defun ess-tracebug-set-last-input (&rest ARGS) "Move `ess--tb-last-input' marker to the process mark. ARGS are ignored to allow using this function in process hooks." (let* ((last-input-process (get-process ess-local-process-name)) (last-input-mark (copy-marker (process-mark last-input-process)))) (with-current-buffer (process-buffer last-input-process) (when (local-variable-p 'ess--tb-last-input) ;; TB might not be active in all processes (save-excursion (setq ess--tb-last-input last-input-mark) (goto-char last-input-mark) (inferior-ess-move-last-input-overlay)))))) (defun ess--tb-R-source-current-file (&optional filename) "Save current file and source it in the .R_GlobalEnv environment." ;; fixme: this sucks as it doesn't use ess-load-command and the whole thing ;; seems redundand to the ess-load-file (interactive) (ess-force-buffer-current "R process to use: ") (let ((proc (get-process ess-local-process-name)) (file (or filename buffer-file-name))) (if (or ess-developer (ess-get-process-variable 'ess-developer)) (ess-developer-source-current-file filename) (if (not file) ;; source the buffer content, org-mode, *scratch* etc. (let ((ess-inject-source t)) (ess-tracebug-send-region proc (point-min) (point-max) nil (format "Sourced buffer '%s'" (propertize (buffer-name) 'face 'font-lock-function-name-face)))) (when (buffer-modified-p) (save-buffer)) (save-selected-window (ess-switch-to-ESS t)) (ess-send-string (get-process ess-current-process-name) (concat "\ninvisible(eval({source(file=\"" filename "\")\n cat(\"Sourced file '" filename "'\\n\")}, env=globalenv()))")))))) ;;;_ + BREAKPOINTS (defface ess-bp-fringe-inactive-face '((((class color) (background light) (min-colors 88)) (:foreground "DimGray")) (((class color) (background dark) (min-colors 88)) (:foreground "LightGray")) (((background light) (min-colors 8)) (:foreground "blue")) (((background dark) (min-colors 8)) (:foreground "cyan"))) "Face used to highlight inactive breakpoints." :group 'ess-debug) (defface ess-bp-fringe-logger-face '((((class color) (background light) (min-colors 88)) (:foreground "dark red")) (((class color) (background dark) (min-colors 88)) (:foreground "tomato1")) (((background light) (min-colors 8)) (:foreground "blue")) (((background dark) (min-colors 8)) (:foreground "cyan"))) "Face used to highlight loggers." :group 'ess-debug) (defface ess-bp-fringe-browser-face '((((class color) (background light) (min-colors 88)) (:foreground "medium blue")) (((class color) (background dark) (min-colors 88)) (:foreground "deep sky blue")) (((background light) (min-colors 8)) (:foreground "blue")) (((background dark) (min-colors 8)) (:foreground "cyan"))) "Face used to highlight 'browser' breakpoints." :group 'ess-debug) (defface ess-bp-fringe-recover-face '((((class color) (background light) (min-colors 88)) (:foreground "dark magenta")) (((class color) (background dark) (min-colors 88)) (:foreground "magenta")) (((background light) (min-colors 8)) (:foreground "magenta")) (((background dark) (min-colors 8)) (:foreground "magenta"))) "Face used to highlight 'recover' breakpoints fringe." :group 'ess-debug) (defvar ess--bp-identifier 1) (defcustom ess-bp-type-spec-alist '((browser "browser(expr=is.null(.ESSBP.[[%s]]))" "B>\n" filled-square ess-bp-fringe-browser-face) (recover "recover()" "R>\n" filled-square ess-bp-fringe-recover-face)) "List of lists of breakpoint types. Each sublist has five elements: 1- symbol giving the name of specification 2- R expression to be inserted (%s is substituted with unique identifier). 3- string to be displayed instead of the expression 4- fringe bitmap to use 5- face for fringe and displayed string." :group 'ess-debug :type '(alist :key-type symbol :value-type (group string string symbol face))) (defcustom ess-bp-inactive-spec '(inactive "##" filled-square ess-bp-fringe-inactive-face) "List giving the inactive breakpoint specifications." ;; List format is identical to that of the elements of ;; `ess-bp-type-spec-alist' except that the second element giving ;; the R expression is meaningless here." ;;fixme: second element is missing make it nil for consistency with all other specs :group 'ess-debug) (defcustom ess-bp-conditional-spec '(conditional "browser(expr={%s})" "CB[ %s ]>\n" question-mark ess-bp-fringe-browser-face) "List giving the conditional breakpoint specifications. List format is identical to that of the elements of `ess-bp-type-spec-alist'. User is asked for the conditional expression to be replaced instead of %s in the second and third elements of the specifications." :group 'ess-debug) (defcustom ess-bp-logger-spec '(logger ".ess_log_eval('%s')" "L[ \"%s\" ]>\n" hollow-square ess-bp-fringe-logger-face) "List giving the loggers specifications. List format is identical to that of `ess-bp-type-spec-alist'." :group 'ess-debug) (defun ess-bp-get-bp-specs (type &optional condition no-error) "get specs for TYPE " (let ((spec-alist (cond ((eq type 'conditional) (let ((tl (copy-sequence ess-bp-conditional-spec))) (when (eq (length condition) 0) (setq condition "TRUE")) (setcar (cdr tl) (format (cadr tl) condition)) (setcar (cddr tl) (format (caddr tl) condition)) (list tl))) ((eq type 'logger) (let ((tl (copy-sequence ess-bp-logger-spec))) (when (eq (length condition) 0) (setq condition "watchLog")) (setcar (cdr tl) (format (cadr tl) condition)) (setcar (cddr tl) (format (caddr tl) condition)) (list tl))) (t ess-bp-type-spec-alist)))) (or (assoc type spec-alist) (if no-error nil (error "Undefined breakpoint type %s" type))))) (defun ess-bp-create (type &optional condition no-error) "Set breakpoint for the current line. Returns the begging position of the hidden text." (let* ((bp-specs (ess-bp-get-bp-specs type condition no-error)) (init-pos (point-marker)) (fringe-bitmap (nth 3 bp-specs)) (fringe-face (nth 4 bp-specs)) (displ-string (nth 2 bp-specs)) (bp-id (format "\"@%s@\"" (setq ess--bp-identifier (1+ ess--bp-identifier)))) (bp-command (concat (format (nth 1 bp-specs) bp-id) "##:ess-bp-end:##\n")) (bp-length (length bp-command)) (dummy-string (format "##:ess-bp-start::%s@%s:##\n" (car bp-specs) condition)) (dummy-length (length dummy-string)) insertion-pos) (when bp-specs (set-marker init-pos (1+ init-pos)) (setq displ-string (propertize displ-string 'face fringe-face 'font-lock-face fringe-face)) (setq bp-command (propertize bp-command 'ess-bp t 'bp-id bp-id 'bp-active t 'intangible 'ess-bp 'rear-nonsticky '(intangible ess-bp bp-type) 'bp-type type 'bp-substring 'command 'display displ-string)) (setq dummy-string (propertize (ess-tracebug--propertize dummy-string fringe-bitmap fringe-face "*") 'ess-bp t 'intangible 'ess-bp 'bp-type type 'bp-substring 'dummy)) (ess-tracebug--set-left-margin) (back-to-indentation) (setq insertion-pos (point) ) (insert (concat dummy-string bp-command)) (indent-for-tab-command) (goto-char (1- init-pos)) ;; sort of save-excursion insertion-pos))) (defun ess-bp-recreate-all () "internal function to recreate all bp" (save-excursion (save-restriction (with-silent-modifications (widen) (goto-char (point-min)) (while (re-search-forward "\\(##:ess-bp-start::\\(.*\\):##\n\\)\\(.+##:ess-bp-end:##\n\\)" nil t) (let ((dum-beg (match-beginning 1)) (dum-end (match-end 1)) (comm-beg (match-beginning 3)) (comm-end (match-end 3)) (type (match-string 2)) (bp-command (match-string 3)) bp-id dum-props condition) (when (string-match "^\\(\\w+\\)@\\(.*\\)\\'" type) (setq condition (match-string 2 type)) (setq type (match-string 1 type))) (setq bp-id (if (string-match "\"@[0-9]+@\"" bp-command) (match-string 0 bp-command) (setq ess--bp-identifier (1+ ess--bp-identifier)))) (setq type (intern type)) (let* ((bp-specs (ess-bp-get-bp-specs type condition t)) (displ-string (nth 2 bp-specs)) (fringe-face (nth 4 bp-specs)) (fringe-bitmap (nth 3 bp-specs))) (when bp-specs (setq displ-string (propertize displ-string 'face fringe-face 'font-lock-face fringe-face)) (add-text-properties comm-beg comm-end (list 'ess-bp t 'bp-id bp-id 'intangible 'ess-bp 'rear-nonsticky '(intangible ess-bp bp-type) 'bp-type type 'bp-substring 'command 'display displ-string)) (setq dum-props (if window-system (list 'display (list 'left-fringe fringe-bitmap fringe-face)) (list 'display (list '(margin left-margin) (propertize "dummy" 'font-lock-face fringe-face 'face fringe-face))))) (add-text-properties dum-beg dum-end (append dum-props (list 'ess-bp t 'intangible 'ess-bp 'bp-type type 'bp-substring 'dummy))) ;; (when comment-beg ;; (add-text-properties comment-beg comment-end ;; (list 'ess-bp t ;; 'bp-id bp-id ;; 'intangible 'ess-bp ;; 'display (propertize (nth 1 ess-bp-inactive-spec) 'face fringe-face) ;; 'bp-type type ;; 'bp-substring 'comment))) )))))))) (add-hook 'R-mode-hook 'ess-bp-recreate-all) (defun ess-bp-get-bp-position-nearby () "Return the cons (beg . end) of breakpoint limit points closest to the current position. Only currently visible region of the buffer is searched. This command is intended for use in interactive commands like `ess-bp-toggle-state' and `ess-bp-kill'. Use `ess-bp-previous-position' in programs." (interactive) (let* ( (pos-end (if (get-char-property (1- (point)) 'ess-bp) (point) (previous-single-property-change (point) 'ess-bp nil (window-start)))) (pos-start (if (get-char-property (point) 'ess-bp) ;;check for bobp (point) (next-single-property-change (point) 'ess-bp nil (window-end)))) pos dist-up dist-down) (if (not (eq pos-end (window-start))) (setq dist-up (- (point) pos-end))) (if (not (eq pos-start (window-end))) (setq dist-down (- pos-start (point)))) (if (and dist-up dist-down) (if (< dist-up dist-down) (cons (previous-single-property-change pos-end 'ess-bp nil (window-start)) pos-end) (cons pos-start (next-single-property-change pos-start 'ess-bp nil (window-end)))) (if dist-up (cons (previous-single-property-change pos-end 'ess-bp nil (window-start)) pos-end) (if dist-down (cons pos-start (next-single-property-change pos-start 'ess-bp nil (window-end)))))))) (defun ess-bp-previous-position () "Returns the cons (beg . end) of breakpoint limit points closest to the current position, nil if not found. " (let* ( (pos-end (if (get-char-property (1- (point)) 'ess-bp) (point) (previous-single-property-change (point) 'ess-bp )))) (if pos-end (cons (previous-single-property-change pos-end 'ess-bp) pos-end)))) (defun ess-bp-set () (interactive) (let* ((pos (ess-bp-get-bp-position-nearby)) (same-line (and pos (<= (point-at-bol) (cdr pos)) (>= (point-at-eol) (car pos)))) (types ess-bp-type-spec-alist) (ev last-command-event) (com-char (event-basic-type ev)) bp-type) (when same-line ;; set bp-type to next type in types (setq bp-type (get-text-property (car pos) 'bp-type)) (setq types (cdr (member (assq bp-type types) types))) ; nil if bp-type is last in the list (if (null types) (setq types ess-bp-type-spec-alist)) (ess-bp-kill) (indent-for-tab-command)) (setq bp-type (pop types)) (ess-bp-create (car bp-type)) (while (eq (event-basic-type (setq ev (read-event (format "'%c' to cycle" com-char)))) com-char) (if (null types) (setq types ess-bp-type-spec-alist)) (setq bp-type (pop types)) (ess-bp-kill) (ess-bp-create (car bp-type)) (indent-for-tab-command)) (push ev unread-command-events))) (defun ess-bp-set-conditional (condition) (interactive "sBreakpoint condition: ") (ess-bp-create 'conditional condition) (indent-for-tab-command)) (defun ess-bp-set-logger (name) (interactive "sLogger name : ") (ess-bp-create 'logger name) (indent-for-tab-command)) (defun ess-bp-kill (&optional interactive?) "Remove the breakpoint nearby" (interactive "p") (let ((pos (ess-bp-get-bp-position-nearby)) (init-pos (make-marker))) (if (null pos) (if interactive? (message "No breakpoints nearby")) (if (eq (point) (point-at-eol)) (goto-char (1- (point)))) ;; work-arround for issue 3 (set-marker init-pos (point)) (goto-char (car pos)) (delete-region (car pos) (cdr pos)) (indent-for-tab-command) (goto-char init-pos) (if (eq (point) (point-at-eol)) (forward-char))))) (defun ess-bp-kill-all nil "Delete all breakpoints in current buffer." (interactive) (let ((count 0) (init-pos (make-marker)) pos) (set-marker init-pos (1+ (point))) (save-excursion ;; needed if error (goto-char (point-max)) (while (setq pos (ess-bp-previous-position)) (goto-char (car pos)) (delete-region (car pos) (cdr pos)) (indent-for-tab-command) (setq count (1+ count))) (if (eq count 1) (message "Killed 1 breakpoint") (message "Killed %d breakpoint(s)" count))) (goto-char (1- init-pos)))) (defun ess-bp-toggle-state () "Toggle the breakpoint between active and inactive states. For standard breakpoints, the effect of this command is immediate, that is you don't need to source your code and it works even in the process of debugging. For loggers, recover and conditional breakpoints this command just comments the breakpoint in the source file. If there is no active R session, this command triggers an error." (interactive) (unless (and ess-local-process-name (get-process ess-local-process-name)) (error "No R session in this buffer")) (save-excursion (let ((pos (ess-bp-get-bp-position-nearby)) (fringe-face (nth 3 ess-bp-inactive-spec)) (inhibit-point-motion-hooks t) ;; deactivates intangible property bp-id beg-pos-dummy end-pos-comment bp-specs beg-pos-command) (if (null pos) (message "No breakpoints in the visible region") (goto-char (car pos)) (setq beg-pos-command (previous-single-property-change (cdr pos) 'bp-substring nil (car pos)) bp-id (get-char-property beg-pos-command 'bp-id)) (goto-char beg-pos-command) (if (get-char-property beg-pos-command 'bp-active) (progn (put-text-property (car pos) beg-pos-command ;; dummy display change 'display (list 'left-fringe (nth 2 ess-bp-inactive-spec) fringe-face)) (put-text-property beg-pos-command (cdr pos) 'bp-active nil) (ess-command (format ".ESSBP.[[%s]] <- TRUE\n" bp-id))) (setq bp-specs (assoc (get-text-property (point) 'bp-type) ess-bp-type-spec-alist)) (put-text-property beg-pos-command (cdr pos) 'bp-active t) (put-text-property (car pos) beg-pos-command 'display (list 'left-fringe (nth 3 bp-specs) (nth 4 bp-specs))) (ess-command (format ".ESSBP.[[%s]] <- NULL\n" bp-id)) ;; (insert (propertize "##" ;; 'ess-bp t ;; 'intangible 'ess-bp ;; 'display (propertize (nth 1 ess-bp-inactive-spec) 'face fringe-face) ;; 'bp-type (get-char-property (point) 'bp-type) ;; 'bp-substring 'comment)) ))))) (defun ess-bp-make-visible () "Makes bp text visible." (interactive) (let ((pos (ess-bp-get-bp-position-nearby))) (set-text-properties (car pos) (cdr pos) (list 'display nil)))) (defun ess-bp-next nil "Goto next breakpoint." (interactive) (let ((cur-pos (point)) (bp-pos (next-single-property-change (point) 'ess-bp))) (when bp-pos (save-excursion (goto-char bp-pos) (when (get-text-property (1- (point)) 'ess-bp) (setq bp-pos (next-single-property-change bp-pos 'ess-bp))))) (if bp-pos (goto-char bp-pos) (message "No breakpoints found")))) (defun ess-bp-previous nil "Goto previous breakpoint." (interactive) (let ((cur-pos (point)) (bp-pos (previous-single-property-change (point) 'ess-bp))) (if bp-pos (goto-char (or (previous-single-property-change bp-pos 'ess-bp) bp-pos)) ;; (message "No breakpoints before the point found")))) ;;;_ + WATCH (defvar ess-watch-command ;; assumes that every expression is a structure of length 1 as returned by parse. ".ess_watch_eval()\n") (if (fboundp 'define-fringe-bitmap) ;;not clear to me why is this not bound in SSH session? - :todo check (define-fringe-bitmap 'current-watch-bar [#b00001100] nil nil '(top t))) (defun ess-tracebug--set-left-margin () "Set the margin on non-X displays" (unless window-system (when (= left-margin-width 0) (setq left-margin-width 1) (set-window-buffer (selected-window) (current-buffer))))) (defun ess-watch-mode () "Major mode in ess-watch window. \\{ess-watch-mode-map}" (let ((cur-block (max 1 (ess-watch-block-at-point))) (dummy-string (ess-tracebug--propertize "|" 'current-watch-bar 'font-lock-keyword-face))) (kill-all-local-variables) (ess-tracebug--set-left-margin) (make-local-variable 'revert-buffer-function) (setq revert-buffer-function 'ess-watch-revert-buffer) (use-local-map ess-watch-mode-map) (setq major-mode 'ess-watch-mode) (setq mode-name (concat "watch " ess-current-process-name)) (turn-on-font-lock) (setq ess-watch-current-block-overlay (make-overlay (point-min) (point-max))) (overlay-put ess-watch-current-block-overlay 'line-prefix dummy-string) (overlay-put ess-watch-current-block-overlay 'face 'ess-watch-current-block-face) (ess-watch-set-current cur-block) ;; (when (require 'face-remap nil t) ;; scale the font (setq text-scale-mode-amount ess-watch-scale-amount) (text-scale-mode 1) ; (text-scale-mode -1) ;;restore to default ))) (defun ess-watch () "Run ess-watch mode on R objects. This is the trigger function. See documentation of `ess-watch-mode' for more information. \\{ess-watch-mode-map} " (interactive) (ess-force-buffer-current) (let ((wbuf (get-buffer-create ess-watch-buffer)) (pname ess-local-process-name) (alist (symbol-value ess-local-customize-alist))) (set-buffer wbuf) (ess-setq-vars-local alist) (setq ess-local-process-name pname) (ess-watch-mode) (ess-watch-refresh-buffer-visibly wbuf) ;; evals the ess-command and displays the buffer if not visible (pop-to-buffer wbuf) (set-window-dedicated-p (selected-window) 1) ;; not strongly dedicated )) (defun ess-watch-refresh-buffer-visibly (wbuf &optional sleep no-prompt-check) "Eval `ess-watch-command' and direct the output into the WBUF. Call `ess-watch-buffer-show' to make the buffer visible, without selecting it. This function is used for refreshing the watch window after each step during the debugging." ;; assumes that the ess-watch-mode is on!! ;; particularly ess-watch-current-block-overlay is installed (interactive) (ess-watch-buffer-show wbuf) ;; if visible do nothing (let ((pname ess-local-process-name)) ;; watch might be used from different dialects, need to reset (with-current-buffer wbuf (let ((curr-block (max 1 (ess-watch-block-at-point)))) ;;can be 0 if (setq buffer-read-only nil) (when pname (setq ess-local-process-name pname)) (ess-command ess-watch-command wbuf sleep no-prompt-check) ;; delete the ++++++> line ;; not very reliable but works fine so far. (goto-char (point-min)) (delete-region (point-at-bol) (+ 1 (point-at-eol))) (ess-watch-set-current curr-block) (set-window-point (get-buffer-window wbuf) (point)) (setq buffer-read-only t))))) (defun ess-watch-buffer-show (buffer-or-name) "Make watch buffer BUFFER-OR-NAME visible, and position acordingly. If already visible, do nothing. Currently the only positioning rule implemented is to split the R process window in half. The behavior is controlled by `split-window-sensibly' with parameters `split-height-threshold' and `split-width-threshold' replaced by `ess-watch-height-threshold' and `ess-watch-width-threshold' respectively." (interactive) (unless (get-buffer-window ess-watch-buffer 'visible) (save-selected-window (ess-switch-to-ESS t) (let* ((split-width-threshold (or ess-watch-width-threshold split-width-threshold)) (split-height-threshold (or ess-watch-height-threshold split-height-threshold)) (win (split-window-sensibly (selected-window)))) (if win (set-window-buffer win buffer-or-name) (display-buffer buffer-or-name) ;; resort to usual mechanism if could not split ))))) (defun ess-watch-revert-buffer (ignore noconfirm) "Update the watch buffer Arguments IGNORE and NOCONFIRM currently not used." (ess-watch) (message "Watch reverted")) (defvar ess-watch-mode-map nil "Keymap for the *R watch* buffer. \\{ess-watch-mode-map} ") (unless ess-watch-mode-map (setq ess-watch-mode-map (make-sparse-keymap)) (when (boundp 'special-mode-map) (set-keymap-parent ess-watch-mode-map special-mode-map)) (define-key ess-watch-mode-map "?" 'ess-watch-help) (define-key ess-watch-mode-map "k" 'ess-watch-kill) ;; (define-key ess-watch-mode-map "u" 'ess-watch-undelete) ;; editing requires a little more work. (define-key ess-watch-mode-map "a" 'ess-watch-add) (define-key ess-watch-mode-map "i" 'ess-watch-insert) (define-key ess-watch-mode-map "e" 'ess-watch-edit-expression) (define-key ess-watch-mode-map "r" 'ess-watch-rename) (define-key ess-watch-mode-map "q" 'ess-watch-quit) (define-key ess-watch-mode-map "u" 'ess-watch-move-up) (define-key ess-watch-mode-map "U" 'ess-watch-move-down) (define-key ess-watch-mode-map "d" 'ess-watch-move-down) (define-key ess-watch-mode-map "n" 'ess-watch-next-block) (define-key ess-watch-mode-map "p" 'ess-watch-previous-block) ;; R mode keybindings. (define-key ess-watch-mode-map "\C-c\C-s" 'ess-watch-switch-process) (define-key ess-watch-mode-map "\C-c\C-y" 'ess-switch-to-ESS) (define-key ess-watch-mode-map "\C-c\C-z" 'ess-switch-to-end-of-ESS) ;; Debug keys: ) (defface ess-watch-current-block-face '((default (:inherit highlight))) "Face used to highlight current watch block." :group 'ess-debug) (defvar ess-watch-current-block-overlay nil "The overlay for currently selected block in the R watch buffer .") (make-variable-buffer-local 'ess-watch-current-block-overlay) (defvar ess-watch-buffer "*R watch*" "Name of the watch buffer.") (defvar ess-watch-start-block "@----" ;; fixme: make defcustom and modify the injected command correspondingly "String indicating the beginning of a block in watch buffer." ;; :group 'ess-debug ;; :type 'string ) (defvar ess-watch-start-expression "@---:" "String indicating the beginning of an R expression in watch buffer." ;; :group 'ess-debug ;; :type 'string ) (defcustom ess-watch-height-threshold nil "Minimum height for splitting *R* windwow sensibly to make space for watch window. See `split-height-threshold' for a detailed description. If nil, the value of `split-height-threshold' is used." :group 'ess-debug :type 'integer) (defcustom ess-watch-width-threshold nil "Minimum width for splitting *R* windwow sensibly to make space for watch window. See `split-width-threshold' for a detailed description. If nil, the value of `split-width-threshold' is used." :group 'ess-debug :type 'integer) (defcustom ess-watch-scale-amount -1 "The number of steps to scale the watch font down (up). Each step scales the height of the default face in the watch window by the variable `text-scale-mode-step' (a negative number of steps decreases the height by the same amount)") (defvar ess-watch-help nil "Keymap for the *R watch* buffer. \\{ess-watch-mode-map} ") (defun ess-watch-help () (interactive) (describe-variable 'ess-watch-help)) (defun ess-watch-block-limits-at-point () "Return start and end positions of the watch block." (interactive) (save-excursion (let ((curr (point)) start-pos end-pos) (end-of-line) (setq start-pos (if (re-search-backward ess-watch-start-block nil t ) (point) (point-min))) (goto-char curr) (beginning-of-line) (setq end-pos (if (re-search-forward ess-watch-start-block nil t) (match-beginning 0) (point-max))) (list start-pos end-pos)))) (defun ess-watch-block-at-point () "return the current block's order count, 0 if no block was found." (save-excursion (let ((cur-point (point)) (count 0)) (goto-char (point-min)) (while (re-search-forward ess-watch-start-block cur-point t) (setq count (1+ count))) count))) (defun ess-watch-set-current (nr) "Move the overlay over the block with count NR in current watch buffer" (goto-char (point-min)) (re-search-forward ess-watch-start-expression nil t nr) (goto-char (match-end 0)) (apply 'move-overlay ess-watch-current-block-overlay (ess-watch-block-limits-at-point))) (defun ess-watch--make-alist () "Create an association list of expression from current buffer (better be a watch buffer). Each element of assoc list is of the form (pos name expr) where pos is an unique integer identifying watch blocks by position, name is a string giving the name of expression block, expr is a string giving the actual R expression." (interactive) (save-excursion (let* ((reg-name (concat "^" ess-watch-start-block " *\\(\\S-*\\).*$")) (reg-expr (concat "^" ess-watch-start-expression "\\s-*\\(.*\\)$")) (reg-all (concat "\\(" reg-name "\\)\n\\(" reg-expr "\\)")) (pos 0) wal name expr) (goto-char (point-min)) (while (re-search-forward reg-all nil t) (setq pos (+ 1 pos)) (setq name (match-string-no-properties 2)) (setq expr (match-string-no-properties 4)) (if (not (eq (string-to-number name) 0)) ;;if number of any kind set the name to "" (setq name "")) (setq wal (append wal (list (list pos name expr))))) wal))) (defun ess-watch--parse-assoc (al) "Return a string of the form 'assign(\".ess_watch_expressions\", list(a = parse(expr_a), b= parse(expr_b)), envir = .GlobalEnv)' ready to be send to R process. AL is an association list as return by `ess-watch--make-alist'" (concat ".ess_watch_assign_expressions(list(" (mapconcat (lambda (el) (if (> (length (cadr el) ) 0) (concat "`" (cadr el) "` = parse(text = '" (caddr el) "')") (concat "parse(text = '" (caddr el) "')"))) al ", ") "))\n")) (defun ess-watch--install-.ess_watch_expressions () ;; used whenever watches are added/deleted/modified from the watch ;; buffer. this is the only way to insert expressions into ;; .ess_watch_expressions object in R. Assumes R watch being the current ;; buffer, otherwise will most likely install empty list. (interactive) (process-send-string (ess-get-process ess-current-process-name) (ess-watch--parse-assoc (ess-watch--make-alist))) ;;todo: delete the prompt at the end of proc buffer todo: defun ess-send-string!! (sleep-for 0.05) ;; need here, if ess-command is used immediately after, for some weird reason the process buffer will not be changed ) (defun ess-watch-quit () "Quit (kill) the watch buffer. If watch buffer exists, it is displayed during the debug process. The only way to avoid the display, is to kill the buffer." (interactive) (kill-buffer) ;; dedicated, window is deleted unless not the only one ) ;;;_ + MOTION (defun ess-watch-next-block (&optional n) "Move the overlay over the next block. Optional N if supplied gives the number of steps forward backward-char." (interactive "P") (setq n (prefix-numeric-value n)) (goto-char (overlay-end ess-watch-current-block-overlay)) (unless (re-search-forward ess-watch-start-expression nil t n) (goto-char (point-min)) ;;circular but always moves to start! (re-search-forward ess-watch-start-expression nil t 1)) (apply 'move-overlay ess-watch-current-block-overlay (ess-watch-block-limits-at-point))) (defun ess-watch-previous-block (&optional n) "Move the overlay over the previous block. Optional N if supplied gives the number of backward steps." (interactive "P") (setq n (prefix-numeric-value n)) (goto-char (overlay-start ess-watch-current-block-overlay)) (unless (re-search-backward ess-watch-start-expression nil t n) (goto-char (point-max)) ;;circular but always moves to last! (re-search-backward ess-watch-start-expression nil t 1)) (goto-char (match-end 0)) (apply 'move-overlay ess-watch-current-block-overlay (ess-watch-block-limits-at-point))) ;;;_ + BLOCK MANIPULATION and EDITING (defun ess-watch-rename () "Rename the currently selected watch block. " (interactive) (end-of-line) (unless (re-search-backward ess-watch-start-block nil 1) (error "Can not find a watch block")) (let ((reg-name (concat ess-watch-start-block " *\\(\\S-*\\).*$")) name start end) ;; (reg-expr (concat "^" ess-watch-start-expression "\\s-*\\(.*\\)$")) ;; (reg-all (concat "\\(" reg-name "\\)\n\\(" reg-expr "\\)")) ;; (pos 0) wal name expr) (unless (re-search-forward reg-name (point-at-eol) 1) (error "Can not find the name substring in the current watch block ")) (setq name (match-string-no-properties 1)) (setq start (match-beginning 1)) (setq end (match-end 1)) (goto-char start) ;; todo: highlight the name in R-watch here (setq name (read-string (concat "New name (" name "): ") nil nil name) ) (setq buffer-read-only nil) (delete-region start end) (insert name) (setq buffer-read-only t) (ess-watch--install-.ess_watch_expressions) (ess-watch-refresh-buffer-visibly (current-buffer)))) (defun ess-watch-edit-expression () "Edit in the minibuffer the R expression from the current watch block. " (interactive) (end-of-line) (unless (re-search-backward ess-watch-start-block nil 1) (error "Can not find a watch block")) (let ((reg-expr (concat ess-watch-start-expression " *\\(.*\\)$")) expr start end) (unless (re-search-forward reg-expr nil 1) (error "Can not find an expression string in the watch block")) (setq expr (match-string-no-properties 1)) (setq start (match-beginning 1)) (setq end (match-end 1)) (goto-char start) ;; todo: highlight the name in R-watch here (setq expr (read-string "New expression: " expr nil expr) ) (setq buffer-read-only nil) (delete-region start end) (insert expr) (setq buffer-read-only t) (ess-watch--install-.ess_watch_expressions) (ess-watch-refresh-buffer-visibly (current-buffer)))) (defun ess-watch-add () "Ask for new R expression and name and append it to the end of the list of watch expressions" (interactive) (let (nr expr name) (goto-char (point-max)) (setq nr (number-to-string (1+ (ess-watch-block-at-point)))) (setq name nr) ;; (setq name (read-string (concat "Name (" nr "):") nil nil nr )) ;;this one is quite annoying and not really needed than for logging (setq expr (read-string "New expression: " nil nil "\"Empty watch!\"")) (setq buffer-read-only nil) (insert (concat "\n" ess-watch-start-block " " name " -@\n" ess-watch-start-expression " " expr "\n")) (setq buffer-read-only t) (ess-watch--install-.ess_watch_expressions))) (defun ess-watch-insert () "Ask for new R expression and name and insert it in front of current watch block" (interactive) (let (nr expr name) (setq nr (number-to-string (ess-watch-block-at-point))) (setq name nr) ;; (setq name (read-string (concat "Name (" nr "):") nil nil nr )) (setq expr (read-string "New expression: " nil nil "\"Empty watch!\"")) (re-search-backward ess-watch-start-block nil 1) ;;point-min if not found (setq buffer-read-only nil) (insert (concat "\n" ess-watch-start-block " " name " -@\n" ess-watch-start-expression " " expr "\n")) (setq buffer-read-only t) (ess-watch--install-.ess_watch_expressions))) (defun ess-watch-move-up () "Move the current block up." (interactive) (let ((nr (ess-watch-block-at-point)) wbl) (when (> nr 1) (setq buffer-read-only nil) (setq wbl (apply 'delete-and-extract-region (ess-watch-block-limits-at-point))) (re-search-backward ess-watch-start-block nil t 1) ;; current block was deleted, point is at the end of previous block (insert wbl) (ess-watch--install-.ess_watch_expressions) (setq buffer-read-only t)))) (defun ess-watch-move-down () "Move the current block down." (interactive) (let ((nr (ess-watch-block-at-point)) (nr-all (save-excursion (goto-char (point-max)) (ess-watch-block-at-point))) wbl) (when (< nr nr-all) (setq buffer-read-only nil) (setq wbl (apply 'delete-and-extract-region (ess-watch-block-limits-at-point))) (end-of-line) (when (re-search-forward ess-watch-start-block nil 1 1) ;; current block was deleted, point is at the end of previous block or point-max (goto-char (match-beginning 0))) (insert wbl) (ess-watch--install-.ess_watch_expressions) (setq buffer-read-only t)))) (defun ess-watch-kill () "Kill the current block" (interactive) (setq buffer-read-only nil) (apply 'delete-region (ess-watch-block-limits-at-point)) (ess-watch--install-.ess_watch_expressions)) ;;;_ + Debug/Undebug at point (defun ess--dbg-get-signatures (method) "Get signatures for the method METHOD" (let ((tbuffer (get-buffer-create " *ess-command-output*")); initial space: disable-undo signatures curr-point) (save-excursion (ess-if-verbose-write (format "ess-get-signatures*(%s).. " method)) (ess-command (concat "showMethods(\"" method "\")\n") tbuffer) (message ess-local-process-name) (message ess-current-process-name) (ess-if-verbose-write " [ok] ..\n") (set-buffer tbuffer) (goto-char (point-min)) (if (not (re-search-forward "Function:" nil t)) (progn (ess-if-verbose-write "not seeing \"Function:\".. \n") (error (buffer-string)) ;; (error "Cannot trace method '%s' (Is it a primitive method which you have already traced?)" method) ) ;; (setq curr-point (point)) ;; (while (re-search-forward ", " nil t) ;replace all ", " with ":" for better redability in completion buffers?? ;; (replace-match ":")) ;; (goto-char curr-point) (while (re-search-forward "^.+$" nil t) (setq signatures (cons (match-string-no-properties 0) signatures)))) ; (kill-buffer tbuffer) ) signatures)) (defun ess-debug-flag-for-debugging () "Set the debugging flag on a function. Ask the user for a function and if it turns to be generic, ask for signature and trace it with browser tracer." (interactive) (ess-force-buffer-current "Process to use: ") (let* ((tbuffer (get-buffer-create " *ess-command-output*")) ;; output buffer name is hard-coded in ess-inf.el (all-functions (ess-get-words-from-vector (if ess-developer-packages (format ".ess_all_functions(c('%s'))\n" (mapconcat 'identity ess-developer-packages "', '")) ".ess_all_functions()\n"))) (obj-at-point (car (ess-helpobjs-at-point all-functions))) (ufunc (ess-completing-read "Debug" all-functions nil nil nil nil obj-at-point)) signature default-string out-message) ;; is it generic (if (equal "TRUE" (car (ess-get-words-from-vector (format "as.character(isGeneric('%s'))\n" ufunc)))) (save-excursion ;; if so, find the signature (setq signature (ess-completing-read (concat "Method for generic '" ufunc "'") (ess--dbg-get-signatures ufunc) ;signal an error if not found nil t nil nil "*default*")) (if (equal signature "*default*") ;;debug, the default ufunc (ess-command (format "trace('%s', tracer = browser)\n" ufunc) tbuffer) (ess-command (format "trace('%s', tracer = browser, signature = c('%s'))\n" ufunc signature) tbuffer)) (set-buffer tbuffer) ;; give appropriate message or error (setq out-message (buffer-substring-no-properties (point-min) (point-max)))) ;;else, not an S4 generic (when (car (ess-get-words-from-vector (format "as.character(.knownS3Generics['%s'])\n" ufunc))) ;; if S3 generic: (setq all-functions (ess-get-words-from-vector (format "local({gens<-methods('%s');as.character(gens[attr(gens, 'info')$visible])})\n" ufunc))) (setq all-functions ;; cannot debug non-visible methods (delq nil (mapcar (lambda (el) (if (not (char-equal ?* (aref el (1- (length el))))) el)) all-functions))) ;; tothink: ess-developer? (setq ufunc (ess-completing-read (format "Method for S3 generic '%s'" ufunc) (cons ufunc all-functions) nil t))) (save-excursion ;; no quotes (ess-command (format "debug(%s)\n" ufunc) tbuffer) (set-buffer tbuffer) (if (= (point-max) 1) (setq out-message (format "Flagged function '%s' for debugging" ufunc)) ;; error occurred (setq out-message (buffer-substring-no-properties (point-min) (point-max)))))) (message out-message))) (defun ess-debug-unflag-for-debugging () "Prompt for the debugged/traced function or method and undebug/untrace it." (interactive) (let ((tbuffer (get-buffer-create " *ess-command-output*")); initial space: disable-undo\ (debugged (ess-get-words-from-vector (if ess-developer-packages (format ".ess_dbg_getTracedAndDebugged(c('%s'))\n" (mapconcat 'identity ess-developer-packages "', '")) ".ess_dbg_getTracedAndDebugged()\n"))) out-message fun def-val) ;; (prin1 debugged) (if (eq (length debugged) 0) (setq out-message "No debugged or traced functions/methods found") (setq def-val (if (eq (length debugged) 1) (car debugged) "*ALL*")) (setq fun (ess-completing-read "Undebug" debugged nil t nil nil def-val)) (if (equal fun "*ALL*" ) (ess-command (concat ".ess_dbg_UndebugALL(c(\"" (mapconcat 'identity debugged "\", \"") "\"))\n") tbuffer) (ess-command (format ".ess_dbg_UntraceOrUndebug(\"%s\")\n" fun) tbuffer)) (with-current-buffer tbuffer (if (= (point-max) 1) ;; not reliable todo: (setq out-message (format "Undebugged '%s' " fun)) (setq out-message (buffer-substring-no-properties (point-min) (point-max))) ;; untrace info or warning, or error occurred ))) (message out-message))) ;;;_ * Kludges and Fixes ;;; delete-char and delete-backward-car do not delete whole intangible text (defadvice delete-char (around ess-delete-backward-char-intangible activate) "When about to delete a char that's intangible, delete the whole intangible region Only do this when #chars is 1" (if (and (eq major-mode 'ess-mode) (= (ad-get-arg 0) 1) (get-text-property (point) 'intangible)) (progn (kill-region (point) (or (next-single-property-change (point) 'intangible) (point-max))) (indent-for-tab-command)) ad-do-it)) (defadvice delete-backward-char (around ess-delete-backward-char-intangible activate) "When about to delete a char that's intangible, delete the whole intangible region Only do this when called interactively and #chars is 1" (if (and (eq major-mode 'ess-mode) (= (ad-get-arg 0) 1) (> (point) (point-min)) (get-text-property (1- (point)) 'intangible)) (progn (let ((beg (or (previous-single-property-change (point) 'intangible) (point-min)))) (kill-region beg (point)))) ad-do-it)) ;; reported as bug#21368 ;; ;; previous-line gets stuck if next char is intangible ;; reported ;; (defadvice previous-line (around ess-fix-cursor-stuck-at-intangible-text activate) ;; "When about to move to previous line when next char is ;; intangible, step char backward first" ;; (when (and (eq major-mode 'ess-mode) ;; (or (null (ad-get-arg 0)) ;; (= (ad-get-arg 0) 1)) ;; (get-text-property (point) 'intangible)) ;; (goto-char (1- (point)))) ;; ad-do-it) ;; (ad-remove-advice 'previous-line 'around 'ess-fix-cursor-stuck-at-intangible-text) (make-obsolete-variable 'ess-dbg-blink-ref-not-found-face 'ess-debug-blink-ref-not-found-face "ESS 13.05") (make-obsolete-variable 'ess-dbg-blink-same-ref-face 'ess-debug-blink-same-ref-face "ESS 13.05") (make-obsolete-variable 'ess-dbg-current-debug-line-face 'ess-debug-current-debug-line-face "ESS 13.05") (make-obsolete-variable 'ess-dbg-error-action nil "ESS 13.05") (make-obsolete-variable 'ess-dbg-error-action-alist 'ess-debug-error-action-alist "ESS 13.05") (make-obsolete-variable 'ess-dbg-blink-interval 'ess-debug-blink-interval "ESS 13.05") (make-obsolete-variable 'ess-dbg-indicator 'ess-debug-indicator "ESS 13.05") (make-obsolete-variable 'ess-dbg-ask-for-file 'ess-debug-ask-for-file "ESS 13.05") (make-obsolete 'ess-dbg-set-error-action 'ess-debug-set-error-action "ESS 13.05") (make-obsolete 'ess-dbg-toggle-error-action 'ess-debug-toggle-error-action "ESS 13.05") (make-obsolete 'ess-dbg-goto-input-event-marker 'ess-debug-goto-input-event-marker "ESS 13.05") (make-obsolete 'ess-dbg-goto-debug-point 'ess-debug-goto-debug-point "ESS 13.05") (make-obsolete 'ess-dbg-insert-in-forward-ring 'ess-debug-insert-in-forward-ring "ESS 13.05") (make-obsolete 'ess-dbg-start 'ess-debug-start "ESS 13.05") (make-obsolete 'ess-dbg-stop 'ess-debug-stop "ESS 13.05") (make-obsolete 'ess-dbg-command-digit 'ess-debug-command-digit "ESS 13.05") (make-obsolete 'ess-dbg-command-n 'ess-debug-command-next "ESS 13.05") (make-obsolete 'ess-dbg-command-Q 'ess-debug-command-quit "ESS 13.05") (make-obsolete 'ess-dbg-command-c 'ess-debug-command-continue "ESS 13.05") (make-obsolete 'ess-dbg-flag-for-debugging 'ess-debug-flag-for-debugging "ESS 13.05") (make-obsolete 'ess-dbg-unflag-for-debugging 'ess-debug-unflag-for-debugging "ESS 13.05") (make-obsolete-variable 'ess-tb-last-input-fringe-face 'ess-tracebug-last-input-fringe-face "ESS 13.05") (make-obsolete-variable 'ess-tb-next-error-function 'ess-tracebug-next-error-function "ESS 13.05") (ess-if-verbose-write "\n<- debug done") (provide 'ess-tracebug) ;;; ess-tracebug.el ends here ess/lisp/ess-s-l.el0000664000175000017500000011326712577152666012533 0ustar eddedd;;; ess-s-l.el --- Support for editing S source code ;; Copyright (C) 1989-1997 D. Bates, Kademan, Ritter, D.M. Smith, K. Hornik, ;; R.M. Heiberger, M. Maechler, and A.J. Rossini. ;; Copyright (C) 1998-2015 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 26 Aug 1997 ;; Maintainer: ESS-core ;; This file is part of ESS (Emacs Speaks Statistics). ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Code for general editing S source code (specializes to S, S+, R). ;;; Code: ; Requires and autoloads (ess-message "[ess-s-l:] (def** ) only ...") ; Configuration variables (defvar S-syntax-table (let ((S-syntax-table (make-syntax-table))) (modify-syntax-entry ?\\ "\\" S-syntax-table) (modify-syntax-entry ?+ "." S-syntax-table) (modify-syntax-entry ?- "." S-syntax-table) (modify-syntax-entry ?= "." S-syntax-table) (modify-syntax-entry ?% "." S-syntax-table) (modify-syntax-entry ?< "." S-syntax-table) (modify-syntax-entry ?> "." S-syntax-table) (modify-syntax-entry ?& "." S-syntax-table) (modify-syntax-entry ?| "." S-syntax-table) (modify-syntax-entry ?\' "\"" S-syntax-table) (modify-syntax-entry ?\" "\"" S-syntax-table) (modify-syntax-entry ?# "<" S-syntax-table) ; open comment (modify-syntax-entry ?\n ">" S-syntax-table) ; close comment ;;(modify-syntax-entry ?. "w" S-syntax-table) ; "." used in S obj names (modify-syntax-entry ?. "_" S-syntax-table) ; see above/below, ; plus consider separation. (modify-syntax-entry ?$ "_" S-syntax-table); foo$comp = 1 symbol(completion) (modify-syntax-entry ?@ "_" S-syntax-table); foo@slot = 1 symbol(completion) (modify-syntax-entry ?_ "_" S-syntax-table) (modify-syntax-entry ?: "_" S-syntax-table) (modify-syntax-entry ?* "." S-syntax-table) (modify-syntax-entry ?< "." S-syntax-table) (modify-syntax-entry ?> "." S-syntax-table) (modify-syntax-entry ?/ "." S-syntax-table) S-syntax-table) "Syntax table for S code." ) (defvar S-editing-alist '((paragraph-start . (concat "\\s-*$\\|" page-delimiter)) (paragraph-separate . (concat "\\s-*$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (require-final-newline . mode-require-final-newline) ;;(comment-indent-function . 'S-comment-indent) ;;(ess-comment-indent . 'S-comment-indent) ;;(ess-indent-line . 'S-indent-line) ;;(ess-calculate-indent . 'ess-calculate-indent) (indent-line-function . 'ess-indent-line) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . S-syntax-table) ;; For Changelog add, require ' ' before <- : "attr<-" is a function name : (add-log-current-defun-header-regexp . "^\\(.+\\)\\s-+<-[ \t\n]*function") (ess-font-lock-keywords . 'ess-S-font-lock-keywords) (ess-font-lock-defaults . (ess--extract-default-fl-keywords ess-S-font-lock-keywords)) (font-lock-defaults . '(ess-font-lock-defaults nil nil ((?\. . "w") (?\_ . "w")))) ) "General options for S and S+ source files.") (defvar inferior-S-language-start '(concat "options(" "STERM='" ess-STERM "'" ", str.dendrogram.last=\"'\"" (if ess-editor (concat ", editor='" ess-editor "'")) (if ess-pager (concat ", pager='" ess-pager "', help.pager='" ess-pager "'")) ", show.error.locations=TRUE" ")") "S language expression for startup -- default for all S dialects.") (defconst S-common-cust-alist '((ess-language . "S") (inferior-ess-exit-command . "q()\n") (inferior-ess-language-start . (eval inferior-S-language-start)) (comint-use-prompt-regexp . t) ;;use fields if nil (comint-process-echoes . t) ;; these prompt are the same for all S-languages As long as custom prompt ;; ends in inferior-ess-primary-prompt everything should work as expected. (inferior-ess-primary-prompt . "> ") ;; (inferior-ess-secondary-prompt . "[+:] ") ;; catch Selection: and alike (inferior-ess-secondary-prompt . "+ ") ;; catch Selection: and alike (comment-start . "#") (ess-imenu-generic-expression . ess-imenu-S-generic-expression) (comment-add . 1) (comment-start-skip . "#+ *") (comment-use-syntax . t) ; see log for bug report 2013-06-07 (comment-column . 40) (ess-no-skip-regexp . (concat "^ *@\\|" (default-value 'ess-no-skip-regexp))) ;; inferior-ess-prompt is used by comint for navigation, only if ;; comint-use-prompt-regexp is t; (transcript-mode also relies on this regexp) (inferior-ess-prompt . inferior-S-prompt) ;customizable (ess-get-help-topics-function . 'ess-get-S-help-topics-function) (ess-getwd-command . "getwd()\n") (ess-setwd-command . "setwd('%s')\n") (ess-funargs-command . ".ess_funargs(\"%s\")\n") (fill-nobreak-predicate . 'ess-inside-string-p) (normal-auto-fill-function . 'ess-do-auto-fill) ) "S-language common settings for all -customize-alist s") (defconst S+common-cust-alist (append '((ess-suffix . "S") (ess-mode-syntax-table . S-syntax-table) (ess-help-sec-regex . ess-help-S+-sec-regex) (ess-help-sec-keys-alist . ess-help-S+sec-keys-alist) (ess-change-sp-regexp . ess-S+-change-sp-regexp) (ess-cmd-delay . (if (featurep 'xemacs); needs much less delay (* 0.1 ess-S+-cmd-delay) ess-S+-cmd-delay)) (ess-function-pattern . ess-S-function-pattern) (ess-function-template . " <- \n#\nfunction()\n{\n\n}\n") (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-traceback-command . "traceback()\n") (ess-mode-editing-alist . S-editing-alist) (ess-dumped-missing-re . "\\(\\(<-\\|=\\)\nDumped\n\\'\\)\\|\\(\\(<-\\|=\\)\\(\\s \\|\n\\)*\\'\\)") (ess-syntax-error-re . "\\(Syntax error: .*\\) at line \\([0-9]*\\), file \\(.*\\)$") (inferior-ess-objects-command . inferior-Splus-objects-command) (ess-describe-object-at-point-commands . 'ess-S-describe-object-at-point-commands) (inferior-ess-font-lock-keywords . 'inferior-S-font-lock-keywords) (ess-editor . S-editor) (ess-pager . S-pager) ) S-common-cust-alist) "Common settings for all S+<*>-customize-alist s" ) ;;; Changes from S to S-PLUS 3.x. (standard S3 should be in ess-s-l!). (defconst ess-help-S+sec-keys-alist '((?a . "ARGUMENTS:") (?b . "BACKGROUND:") (?B . "BUGS:") (?d . "DESCRIPTION:") (?D . "DETAILS:") (?e . "EXAMPLES:") (?n . "NOTE:") (?O . "OPTIONAL ARGUMENTS:") (?R . "REQUIRED ARGUMENTS:") (?r . "REFERENCES:") (?s . "SEE ALSO:") (?S . "SIDE EFFECTS:") (?u . "USAGE:") (?v . "VALUE:")) "Alist of (key . string) pairs for use in section searching.") ;;; `key' indicates the keystroke to use to search for the section heading ;;; `string' in an S help file. `string' is used as part of a ;;; regexp-search, and so specials should be quoted. ;; S ver.3 (NOT S-Plus) (defconst ess-help-S3-sec-keys-alist '((?a . "ARGUMENTS:") (?b . "BACKGROUND:") (?B . "BUGS:") (?d . "DESCRIPTION:") (?D . "DETAILS:") (?e . "EXAMPLES:") (?n . "NOTE:") (?r . "REFERENCES:") (?s . "SEE ALSO:") (?S . "SIDE EFFECTS:") (?u . "USAGE:") (?v . "VALUE:")) "Help section keys for S ver.3.") ;; S ver.4 (NOT S-Plus) (defconst ess-help-S4-sec-keys-alist '((?a . "ARGUMENTS:") (?b . "BACKGROUND:") (?B . "BUGS:") (?d . "DESCRIPTION:") (?D . "DETAILS:") (?e . "EXAMPLES:") (?n . "NOTE:") (?r . "REFERENCES:") (?s . "SEE ALSO:") (?S . "SIDE EFFECTS:") (?u . "USAGE:") (?v . "VALUE:")) "Help section keys for S4.") ;; R (defconst ess-help-R-sec-keys-alist '((?a . "\\s *Arguments:") (?d . "\\s *Description:") (?D . "\\s *Details:") (?t . "\\s *Details:") (?e . "\\s *Examples:") (?n . "\\s *Note:") (?r . "\\s *References:") (?s . "\\s *See Also:") (?u . "\\s *Usage:") (?v . "\\s *Value[s]?") ; ) "Alist of (key . string) pairs for use in help section searching.") (defconst ess-help-S+-sec-regex "^[A-Z. ---]+:$" "Reg(ular) Ex(pression) of section headers in help file.") (defconst ess-help-R-sec-regex "^[A-Z][A-Za-z].+:$" "Reg(ular) Ex(pression) of section headers in help file.") ;;; S-mode extras of Martin Maechler, Statistik, ETH Zurich. ;;; See also ./ess-utils.el (defvar ess-function-outline-file (concat ess-etc-directory "/function-outline.S") "The file name of the ess-function outline that is to be inserted at point, when \\[ess-insert-function-outline] is used. Placeholders (substituted `at runtime'): $A$ for `Author', $D$ for `Date'.") ;; Use the user's own ~/S/emacs-fun.outline if (s)he has one : --- (let ((outline-file (concat (getenv "HOME") "/S/function-outline.S"))) (if (file-exists-p outline-file) (setq ess-function-outline-file outline-file))) ;; Seth's idea; see ess-toggle-S-assign-key below (defvar ess-S-assign-key [?\C-=] ;; = "\C-c=" ; old-default: "_" "This key is mapped to insert `ess-S-assign' (by default '<-'), when \\[ess-toggle-S-assign-key] is called.") (defvar ess-S-assign-key-last nil "This caches the previous value (binding) of `ess-S-assign-key'. It allows \\[ess-toggle-S-assign-key] to toggle back to the previous definition.") ; Function Definitions (defun S-comment-indent () "Indentation for S comments." (if (or (looking-at "###") (and (looking-at "#!") (= 1 (line-number-at-pos)))) (current-column) (if (looking-at "##") (let ((tem (ess-calculate-indent))) (if (listp tem) (car tem) tem)) (skip-chars-backward " \t") (max (if (bolp) 0 (1+ (current-column))) comment-column)))) ;; VS: these are ess-indent-line and ess-calculate-indent from 2004 already,so ;; commented out to avoid confusion: ;; (defun S-indent-line () ;; "Indent current line as S code. ;; Return the amount the indentation changed by." ;; (let ((indent (S-calculate-indent nil)) ;; beg shift-amt ;; (case-fold-search nil) ;; (pos (- (point-max) (point)))) ;; (beginning-of-line) ;; (setq beg (point)) ;; (cond ((eq indent nil) ;; (setq indent (current-indentation))) ;; (t ;; (skip-chars-forward " \t") ;; (cond ((and ess-indent-with-fancy-comments ;; ### or #! ;; (or (looking-at "###") ;; (and (looking-at "#!") (= 1 (line-number-at-pos))))) ;; (setq indent 0)) ;; ;; Single # comment ;; ((and ess-indent-with-fancy-comments ;; (looking-at "#") (not (looking-at "##"))) ;; (setq indent comment-column)) ;; (t ;; (if (eq indent t) (setq indent 0)) ;; (if (listp indent) (setq indent (car indent))) ;; (cond ((and (looking-at "else\\b") ;; (not (looking-at "else\\s_"))) ;; (setq indent (save-excursion ;; (ess-backward-to-start-of-if) ;; (+ ess-else-offset (current-indentation))))) ;; ((= (following-char) ?}) ;; (setq indent ;; (+ indent ;; (- ess-close-brace-offset ess-indent-offset)))) ;; ((= (following-char) ?{) ;; (setq indent (+ indent ess-brace-offset)))))))) ;; (skip-chars-forward " \t") ;; (setq shift-amt (- indent (current-column))) ;; (if (zerop shift-amt) ;; (if (> (- (point-max) pos) (point)) ;; (goto-char (- (point-max) pos))) ;; (delete-region beg (point)) ;; (indent-to indent) ;; ;; If initial point was within line's indentation, ;; ;; position after the indentation. ;; ;; Else stay at same point in text. ;; (if (> (- (point-max) pos) (point)) ;; (goto-char (- (point-max) pos)))) ;; shift-amt)) ;; (defun S-calculate-indent (&optional parse-start) ;; "Return appropriate indentation for current line as S code. ;; In usual case returns an integer: the column to indent to. ;; Returns nil if line starts inside a string, t if in a comment." ;; (save-excursion ;; (beginning-of-line) ;; (let ((indent-point (point)) ;; (beginning-of-defun-function nil) ;; don't call ess-beginning-of-function ;; (case-fold-search nil) ;; state ;; containing-sexp) ;; (if parse-start ;; (goto-char parse-start) ;; (beginning-of-defun)) ;; (while (< (point) indent-point) ;; (setq parse-start (point)) ;; (setq state (parse-partial-sexp (point) indent-point 0)) ;; (setq containing-sexp (car (cdr state)))) ;; (cond ((or (nth 3 state) (nth 4 state)) ;; ;; return nil or t if should not change this line ;; (nth 4 state)) ;; ((null containing-sexp) ;; ;; Line is at top level. May be data or function definition, ;; (beginning-of-line) ;; (if (and (/= (following-char) ?\{) ;; (save-excursion ;; (ess-backward-to-noncomment (point-min)) ;; (ess-continued-statement-p))) ;; ess-continued-statement-offset ;; 0)) ; Unless it starts a function body ;; ((/= (char-after containing-sexp) ?{) ;; ;; line is expression, not statement: ;; ;; indent to just after the surrounding open. ;; (goto-char containing-sexp) ;; (let ((bol (save-excursion (beginning-of-line) (point)))) ;; ;; modified by shiba@isac 7.3.1992 ;; (cond ((and (numberp ess-expression-offset) ;; (re-search-backward "[ \t]*expression[ \t]*" bol t)) ;; ;; This regexp match every "expression". ;; ;; modified by shiba ;; ;;(forward-sexp -1) ;; (beginning-of-line) ;; (skip-chars-forward " \t") ;; ;; End ;; (+ (current-column) ess-expression-offset)) ;; ((and (numberp ess-arg-function-offset) ;; (re-search-backward ;; "=[ \t]*\\s\"?\\(\\w\\|\\s_\\)+\\s\"?[ \t]*" ;; bol ;; t)) ;; (forward-sexp -1) ;; (+ (current-column) ess-arg-function-offset)) ;; ;; "expression" is searched before "=". ;; ;; End ;; (t ;; (progn (goto-char (1+ containing-sexp)) ;; (current-column)))))) ;; (t ;; ;; Statement level. Is it a continuation or a new statement? ;; ;; Find previous non-comment character. ;; (goto-char indent-point) ;; (ess-backward-to-noncomment containing-sexp) ;; ;; Back up over label lines, since they don't ;; ;; affect whether our line is a continuation. ;; (while (eq (preceding-char) ?\,) ;; (ess-backward-to-start-of-continued-exp containing-sexp) ;; (beginning-of-line) ;; (ess-backward-to-noncomment containing-sexp)) ;; ;; Now we get the answer. ;; (if (ess-continued-statement-p) ;; ;; This line is continuation of preceding line's statement; ;; ;; indent ess-continued-statement-offset more than the ;; ;; previous line of the statement. ;; (progn ;; (ess-backward-to-start-of-continued-exp containing-sexp) ;; (+ ess-continued-statement-offset (current-column) ;; (if (save-excursion (goto-char indent-point) ;; (skip-chars-forward " \t") ;; (eq (following-char) ?{)) ;; ess-continued-brace-offset 0))) ;; ;; This line starts a new statement. ;; ;; Position following last unclosed open. ;; (goto-char containing-sexp) ;; ;; Is line first statement after an open-brace? ;; (or ;; ;; If no, find that first statement and indent like it. ;; (save-excursion ;; (forward-char 1) ;; (while (progn (skip-chars-forward " \t\n") ;; (looking-at "#")) ;; ;; Skip over comments following openbrace. ;; (forward-line 1)) ;; ;; The first following code counts ;; ;; if it is before the line we want to indent. ;; (and (< (point) indent-point) ;; (current-column))) ;; ;; If no previous statement, ;; ;; indent it relative to line brace is on. ;; ;; For open brace in column zero, don't let statement ;; ;; start there too. If ess-indent-offset is zero, use ;; ;; ess-brace-offset + ess-continued-statement-offset ;; ;; instead. ;; ;; For open-braces not the first thing in a line, ;; ;; add in ess-brace-imaginary-offset. ;; (+ (if (and (bolp) (zerop ess-indent-offset)) ;; (+ ess-brace-offset ess-continued-statement-offset) ;; ess-indent-offset) ;; ;; Move back over whitespace before the openbrace. ;; ;; If openbrace is not first nonwhite thing on the line, ;; ;; add the ess-brace-imaginary-offset. ;; (progn (skip-chars-backward " \t") ;; (if (bolp) 0 ess-brace-imaginary-offset)) ;; ;; If the openbrace is preceded by a parenthesized exp, ;; ;; move to the beginning of that; ;; ;; possibly a different line ;; (progn ;; (if (eq (preceding-char) ?\)) ;; (forward-sexp -1)) ;; ;; Get initial indentation of the line we are on. ;; (current-indentation)))))))))) (defun ess-insert-function-outline () "Insert an S function definition `outline' at point. Uses the file given by the variable `ess-function-outline-file'." (interactive) (let ((oldpos (point))) (save-excursion (insert-file-contents ess-function-outline-file) (if (search-forward "$A$" nil t) (replace-match (user-full-name) 'not-upcase 'literal)) (goto-char oldpos) (if (search-forward "$D$" nil t) (replace-match (ess-time-string 'clock) 'not-upcase 'literal))) (goto-char (1+ oldpos)))) ;; typically bound to M-Enter (defun ess-use-this-dir (&optional no-force-current) "Synchronise the current directory of the S or R process to the one of the current buffer. If that buffer has no associated *R* process, use \\[ess-force-buffer-current], unless prefix argument NO-FORCE-CURRENT is non-nil." (interactive "P") (unless no-force-current (ess-force-buffer-current "R process to use: ")) (if ess-local-process-name (let ((cmd (format "setwd('%s')\n" default-directory)) ) (unless (string= ess-language "S") ;; FIXME: generalize this for Stata, SAS, Xlispstat... -- then move to ess-mode.el (error "ESS setting working directory in *%s* not yet implemented for language %s" ess-local-process-name ess-language)) (ess-command cmd) (message "Directory of *%s* process set to %s" ess-local-process-name default-directory)) ;; no local process (message "No *%s* process associated with this buffer." ess-dialect))) ;;*;; S/R Pretty-Editing (defun ess-fix-comments (&optional dont-query verbose) "Fix ess-mode buffer so that single-line comments start with at least '##', and ensure space before subsequent text." (interactive "P") (ess-replace-regexp-dump-to-src "#\\([A-Za-z0-9]\\)" "# \\1" nil verbose) (ess-replace-regexp-dump-to-src "^\\([ \t]*#\\)\\([^#]\\)" "\\1#\\2" dont-query verbose)) (defun ess-dump-to-src (&optional dont-query verbose) "Make the changes in an S - dump() file to improve human readability." (interactive "P") (ess-replace-regexp-dump-to-src "^\"\\([a-z.][a-z.0-9]*\\)\" *<-\n" "\n\\1 <- " dont-query verbose 'ensure-ess)) (defun ess-num-var-round (&optional dont-query verbose) "Is VERY useful for dump(.)'ed numeric variables; ROUND some of them by replacing endings of 000000*.. and 999999*. Martin Maechler" (interactive "P") (save-excursion (goto-char (point-min)) (let ((num 0) (str "") (rgxp "000000+[1-9]?[1-9]?\\>") (to "")) (if dont-query (ess-rep-regexp rgxp to nil nil verbose) (query-replace-regexp rgxp to nil)) (while (< num 9) (setq str (concat (int-to-string num) "999999+[0-8]*")) (if (and (numberp verbose) (> verbose 1)) (message (format "\nregexp: '%s'" str))) (goto-char (point-min)) (ess-rep-regexp str (int-to-string (1+ num)) 'fixedcase 'literal verbose) (setq num (1+ num)))))) (defun ess-fix-dot (before-chars &optional dont-query verbose) "Remove trailing decimal '.' (\"dot\"), before BEFORE; typically from S-plus" ;; typically, before-chars = "]:" or more (ess-replace-regexp-dump-to-src (concat "\\([0-9]\\)\\.\\( *[" before-chars "]\\)") ;; 111 ^ "\\1\\2" dont-query verbose)) (defun ess-fix-dot-1 (&optional do-query verbose) "Remove trailing decimal '.' (\"dot\"), before ':' or ']', i.e., in cases where it's ugly and nonsense. DO-QUERY(prefix) asks before replacing." (interactive "P") (ess-fix-dot "]:" (not do-query) verbose)) (defun ess-fix-dot-more (&optional dont-query verbose) "Remove trailing decimal '.' (\"dot\", typically from S+) in more cases than `ess-fix-dot-1'." (interactive "P") (ess-fix-dot-1 nil verbose) (ess-fix-dot ",)" dont-query verbose)) (defun ess-fix-EQ-assign (&optional dont-query verbose not-all) "Replace \"=\" by \"<-\" in places where it 'might make sense', e.g., for function assignments and lines not ending in \",\". Be *careful* for list()s of functions and when argument not-all is nil (as by default) !" ;;TODO: "in the few places we can be very sure.." ;;---- is hard in general: local functions: ok; but functions in ;; list(a = function(x) abs(x), b= function(y) bound(y)) *NOT* ok! (interactive "P") (ess-replace-regexp-dump-to-src "^\\( *[a-z.][_a-z.0-9]*\\) *= *\\(function *(\\)" "\\1 <- \\2" dont-query verbose) (unless not-all ;; "too" aggressive {proposing to replace function argument specs}: (ess-replace-regexp-dump-to-src ;; all those *not* ending in "," ;; including Mat[ i, ] = ..., ;; but not `names(x) = "..."' for that is "confused" with plot(x=x,..) "^\\( *[a-z.][][, \"_a-z.0-9]*\\) *= *\\([a-z.0-9({]\\(.*[^,]\\)? *$\\)" "\\1 <- \\2" nil ;; always query - often has many "false positives" verbose) )) ;;; All of the above three : (defun ess-MM-fix-src (&optional dont-query verbose) "Clean up ess-source code which has been produced by dump(..), and other code typically produced by other tools. Produces more readable code, and one that is well formatted in emacs ess-mode." (interactive "P") ;; each of the following does a save-excursion: (ess-dump-to-src dont-query) (ess-fix-comments dont-query) (ess-num-var-round dont-query verbose) (ess-fix-dot-more dont-query verbose) (ess-fix-EQ-assign dont-query verbose 'not-all) ) (defun ess-fix-miscellaneous (&optional from verbose) "Fix Miscellaneous S/R `ill-formation's from current \\[point]. Particularly use \"<-\"and put spaces around operators." (interactive "d\nP"); Defaults: point and prefix (C-u) ;; activate by (setq ess-verbose t) (ess-if-verbose-write (format "ess-fix-misc begin (from = %s, verbose = %s)\n" from verbose)) (save-excursion (if (string= ess-dialect "R") (progn (require 'ess-r-d) (R-fix-T-F from (not verbose)))) ;; activate by (setq ess-verbose t) (ess-if-verbose-write "ess-fix-misc: after fix-T-F\n");___D___ ;; former C and matlab programmers leave trailing ";" : ;; (goto-char from) (ess-rep-regexp "; *$" "" nil 'literal verbose) ;; (ess-if-verbose-write "ess-fix-misc: after trailing ';'\n");___D___ (goto-char from) (ess-rep-regexp ";\\( *\\)#" "\\1#" nil nil verbose) (ess-if-verbose-write "ess-fix-misc: after ';' before #\n");___D___ ;;from R 1.9.x "_" is valid in names; here assume no initial / trailing '_' ;; BUG: The following changes "beta_ " or " _abc" ;; (goto-char from) (ess-rep-regexp " +_ *" " <- " nil 'literal verbose) ;; (goto-char from) (ess-rep-regexp "_ +" " <- " nil 'literal verbose) (ess-if-verbose-write "ess-fix-misc: before 'around \"<-\"' :\n");___D___ ;; ensure space around "<-" ---- but only replace if necessary: (goto-char from) (ess-rep-regexp "\\([^< \t\n]\\)\\(<" (not ">=") : (goto-char from);; --> " <", care with "->": (ess-rep-regexp "\\([^-< \t\n]\\)\\([<>]\\)" "\\1 \\2" nil nil verbose) ;; ">" -> "> " , for "<", don't split "<-" nor "<<-": (goto-char from) (ess-rep-regexp "\\(>=?\\)\\([^= \t\n]\\)" "\\1 \\2" nil nil verbose) (goto-char from) (ess-rep-regexp "\\(<=?\\)\\([^-<= \t\n]\\)" "\\1 \\2" nil nil t) (ess-if-verbose-write "ess-fix-misc: before \"=\" \"==\" .. :\n");___D___ ;; -- ensure space around "=", "==", "!=" : (goto-char from) ;; --> " =" (ess-rep-regexp "\\([^=!<> ]\\)\\([=!]?\\)=" "\\1 \\2=" nil nil verbose) (goto-char from) (ess-rep-regexp "=\\([^= ]\\)" "= \\1" nil nil verbose) (goto-char from) ;; add a space between "{" and surrounding ..char: (ess-rep-regexp "{\\([.A-Za-z()]\\)" "{ \\1" 'fix nil verbose) (ess-rep-regexp "\\([()]\\){" "\\1 {" 'fix nil verbose) (goto-char from) ;; add a space between "}" and a preceding wordchar: (ess-rep-regexp "\\([A-Za-z0-9()]\\)}" "\\1 }" 'fix nil verbose) (ess-space-around "else" from verbose) (ess-if-verbose-write "ess-fix-misc: after \"{ ... }\" :\n");___D___ (goto-char from) ;; add a space inside "){" (ess-rep-regexp "){" ") {" 'fix nil verbose) ;; add a newline and indent before a "}" ;; --- IFF there's NO "{" or "#" AND some NON-white text on the same line: ;;D (if verbose (message "\t R-fix-misc..: Hard.. '}'")) (goto-char from) (ess-rep-regexp "^\\([^#{\n]*[^#{ \t\n]+[ \t]*\\)}[ \t]*$" "\\1\n}" 'fix nil verbose) (ess-if-verbose-write "ess-fix-misc __end__\n");___D___ )) ;; This is by Seth Falcon, modeled after ess-toggle-underscore (see below). (defun ess-toggle-S-assign-key (force) "Possibly bind the key in `ess-S-assign-key' to inserting `ess-S-assign'. If `ess-S-assign-key' is \"_\", simply use \\[ess-toggle-underscore]. Otherwise, unless the prefix argument FORCE is set, toggle between the new and the previous assignment." (interactive "P") (require 'ess-mode) (require 'ess-inf) (let ((current-action (lookup-key ess-mode-map ess-S-assign-key)) (insert-S-assign (lambda() (interactive) (delete-horizontal-space) (insert ess-S-assign)))) (if (and (stringp ess-S-assign-key) (string= ess-S-assign-key "_")) (ess-toggle-underscore force) ;; else "do things here" (let* ((current-is-S-assign (eq current-action insert-S-assign)) (new-action (if force insert-S-assign ;; else "not force" (default): (if (or current-is-S-assign (eq ess-S-assign-key-last insert-S-assign)) ess-S-assign-key-last insert-S-assign)))) (message "[ess-toggle-S-assign-key:] current: '%s', new: '%s'" current-action new-action) (define-key ess-mode-map ess-S-assign-key new-action) (define-key inferior-ess-mode-map ess-S-assign-key new-action) (if (not (and force current-is-S-assign)) (setq ess-S-assign-key-last current-action)))))) (defvar polymode-mode) (defun ess-smart-S-assign () "Act as smart `ess-S-assign' key: insert `ess-S-assign', unless in string/comment. If the underscore key is pressed a second time, the assignment operator is removed and replaced by the underscore. `ess-S-assign', typically \" <- \", can be customized. In ESS modes other than R/S, the underscore is always inserted." (interactive) ;;(insert (if (ess-inside-string-or-comment-p (point)) "_" ess-S-assign)) (save-restriction (ignore-errors (when (and (eq major-mode 'inferior-ess-mode) (> (point) (process-mark (get-buffer-process (current-buffer))))) (narrow-to-region (process-mark (ess-get-process)) (point-max))) (and ess-noweb-mode (ess-noweb-in-code-chunk) (ess-noweb-narrow-to-chunk)) (and (fboundp 'pm/narrow-to-span) polymode-mode (pm/narrow-to-span))) (if (or (ess-inside-string-or-comment-p (point)) (not (equal ess-language "S"))) (insert ess-smart-S-assign-key) ;; else: (ess-insert-S-assign)))) (defalias 'ess-smart-underscore 'ess-smart-S-assign) (defun ess-insert-S-assign () "Insert the assignment operator `ess-S-assign', unless it is already there. In that case, it is removed and replaced by `ess-smart-S-assign-key'. `ess-S-assign', typically \" <- \", can be customized." (interactive) ;; one keypress produces ess-S-assign; a second keypress will delete ;; ess-S-assign and instead insert _ ;; Rather than trying to count a second _ keypress, just check whether ;; the current point is preceded by ess-S-assign. (let ((assign-len (length ess-S-assign))) (if (and (>= (point) (+ assign-len (point-min))) ;check that we can move back (save-excursion (backward-char assign-len) (looking-at ess-S-assign))) ;; If we are currently looking at ess-S-assign, replace it with _ (progn (delete-char (- assign-len)) (insert ess-smart-S-assign-key)) (if (string= ess-smart-S-assign-key "_") (delete-horizontal-space)) (insert ess-S-assign)))) ;;; Setting / Unsetting the smart S-assign-key behavior ----------------- ;; Two basic building blocks, used below: (defun ess--unset-smart-S-assign-key () (define-key ess-mode-map "_" nil) (define-key inferior-ess-mode-map "_" nil) (define-key ess-mode-map ess-smart-S-assign-key nil); 'self-insert-command (define-key inferior-ess-mode-map ess-smart-S-assign-key nil)) (defun ess--activate-smart-S-assign-key () (define-key ess-mode-map ess-smart-S-assign-key 'ess-smart-S-assign) (define-key inferior-ess-mode-map ess-smart-S-assign-key 'ess-smart-S-assign)) ;; Written such that whimps can have (ess-disable-smart-S-assign) in .emacs : (defun ess-disable-smart-S-assign (activate) "Disable or activate (if prefix argument ACTIVATE is set) the smart assignment operator `ess-S-assign'. That, typically \" <- \", can be customized." (interactive "P") (if activate (ess--activate-smart-S-assign-key) (ess--unset-smart-S-assign-key))) (defalias 'ess-disable-smart-underscore 'ess-disable-smart-S-assign) (defun ess-toggle-S-assign (force) "Set the `ess-smart-S-assign-key' (by default \"_\" [underscore]) key to \\[ess-smart-S-assign] or back to `ess-smart-S-assign-key'. Toggle the current definition, unless FORCE is non-nil, where \\[ess-smart-S-assign] is set unconditionally. If you as per default have `ess-smart-S-assign-key' set to underscore, note that using \"C-q _\" will always just insert the underscore character." (interactive "P") (let ((current-key (lookup-key ess-mode-map ess-smart-S-assign-key)) (default-key (lookup-key ess-mode-map "_"))) (if (and (or default-key current-key) ;; (stringp current-key) (string= current-key ess-S-assign) (not force)) (ess--unset-smart-S-assign-key) ;; else : "force" or current-key is "nil", i.e. default (ess--activate-smart-S-assign-key)))) (defalias 'ess-toggle-underscore 'ess-toggle-S-assign) ;; NOTA BENE: "_" is smart *by default* : ;; ----- The user can always customize `ess-S-assign' ... (ess-toggle-S-assign 'force-to-S-assign) (defun ess-add-MM-keys () "Define MM's user keys, currently \\\\[ess-insert-function-outline], and \\\\[ess-execute-screen-options]." (interactive) (require 'ess-mode); typically unnecessary (require 'ess-inf); dito (define-key ess-mode-map "\C-cf" 'ess-insert-function-outline) (define-key inferior-ess-mode-map "\C-cw" 'ess-execute-screen-options) ;; Make M-- : [Alt] + [-] (in addition to / instead of "_" = (on US-keyboard) [Shift]+ [-] ;; Note this overwrites 'M--' as "negative argument" (still on 'C--'): (define-key ess-mode-map [?\M--] 'ess-insert-S-assign) (define-key inferior-ess-mode-map [?\M--] 'ess-insert-S-assign) ) (defun ess-dump-args-and-go (Sfunc) ; &optional buff) "Dump the function name, with arguments, to a buffer for editing. Currently, this needs to: 1. set the buffer to the right mode, with the right settings 2. format the statement, 3. c/function/Sfunc/ and I need to relearn emacs lisp (but I had to, anyway." (interactive "sFunction ? ") (let* ((buffname "ess-complete.R") (buf (ess-execute (format "args(%s)" Sfunc) t buffname))) (pop-to-buffer buf) (message "here yet?") (while (search-forward "function" nil t) (replace-match Sfunc nil t)) (ess-setq-vars-local ess-customize-alist); (current-buffer)) (setq major-mode 'ess-mode) (use-local-map ess-mode-map) (set-syntax-table ess-mode-syntax-table) )) ;;; S imenu support ;; don't use syntax classes, bad for etags (defvar ess-imenu-S-generic-expression '(("Functions" "^\\(.+\\)[ \t\n]*<-[ \t\n]*function[ ]*(" 1) ("Classes" "^.*setClass(\\(.*\\)," 1) ("Coercions" "^.*setAs(\\([^,]+,[^,]*\\)," 1) ; show from and to ("Generics" "^.*setGeneric(\\([^,]*\\)," 1) ("Methods" "^.*set\\(Group\\|Replace\\)?Method(\\([^,]+,[^,]*\\)" 2) ;;[ ]*\\(signature=\\)?(\\(.*,?\\)*\\)," 1) ;; ;;("Other" "^\\(.+\\)\\s-*<-[ \t\n]*[^\\(function\\|read\\|.*data\.frame\\)]" 1) ("Package" "^.*\\(library\\|require\\)(\\(.*\\)" 2) ("Data" "^\\(.+\\)[ \t\n]-*<-[ \t\n]*\\(read\\|.*data\.frame\\).*(" 1))) (defun ess-imenu-S (&optional arg) "S Language Imenu support for ESS." (interactive) (setq imenu-generic-expression ess-imenu-generic-expression) (imenu-add-to-menubar "Imenu-S")) (defalias 'ess-imenu-R 'ess-imenu-S) ;;; Speedbar stuff. (defun ess-S-initialize-speedbar () "Extend to all extensions; see initialization, and edit." (speedbar-add-supported-extension ".R") (speedbar-add-supported-extension ".S") (speedbar-add-supported-extension ".s") (speedbar-add-supported-extension ".q")) ;(if (featurep 'speedbar) ; (progn ; (message "enabling speedbar support") ; (require 'speedbar) ; (ess-S-initialize-speedbar))) (eval-when-compile (condition-case nil (progn (require 'speedbar) (when (featurep 'speedbar) (defun S-speedbar-buttons (buffer) "attempted hack." ;;(speedbar-make-tag-line) ;;(speedbar-insert-button) (speedbar-with-writable)) (fset 'R-speedbar-buttons 'S-speedbar-buttons) (defun S-speedbar-menu-items ( ) "Need to write.") (ess-S-initialize-speedbar))) (error nil))) (provide 'ess-s-l) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-s-l.el ends here ess/lisp/ess-install.el0000664000175000017500000002140112423756516013464 0ustar eddedd;;; ess-install.el --- Automatic installation of ESS. ;; Auto-install procedure. EXPERIMENTAL! ;; Copyright (C) 2006 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Stephen Eglen ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; ;; In short: you may use this code any way you like, as long as you ;; don't charge more than a distribution fee for it, do distribute the ;; source with any binaries, remove this notice, or hold anyone liable ;; for its results. ;;; Commentary: ;; Although installing ESS is relatively simple, sometimes people get ;; confused as to what to add to their init files, or even where their ;; init files are located. The following procedure should be a bit ;; simpler, as Emacs will add the necessary start-up lines itself. ;; (The instructions below assume you have downloaded ess as a zip ;; package, but it will work also for the .tar.gz version of ESS as ;; long as you know how to unpack a .tar.gz in step 3.) ;; ;; Installing ESS for the first time. ;; ;; 1. Create a folder (e.g C:/emacs) where you will store ESS. We will ;; assume that you are installing ESS into C:/emacs (unix users can use ;; ~/emacs). ;; ;; 2. Download ess-5.2.12.zip and store it in the folder you created. ;; ;; 3. Unpack the files from the zip archive, e.g. by right-clicking on it ;; within Windows explorer and selecting "Extract all". On unix, use ;; "unzip ess-5.2.12.zip". ;; ;; 4. Start a new emacs (or xemacs). ;; ;; 5. In the new emacs, you need to open the file "ess-install.el" which ;; is part of ESS. To do this, type: ;; ;; C-x C-f c:/emacs/ess-5.2.12/lisp/ess-install.el RET ;; ;; You should now see a lisp file with the top line: ;; ;;; ess-install.el --- Automatic installation of ESS. ;; ;; 6. Type M-x eval-buffer RET ;; ;; What does this do? This will find your emacs initialisation file, and ;; it will add the following two lines to the end of the file: ;; ;; ;;; ESS setup for version 5.2.12 ;; (load "c:/emacs/ess-5.2.12/lisp/ess-site") ;; ;; Do not edit those two lines! They are useful if later you come to ;; upgrade ESS. ;; ;; 7. Start a new Emacs and you should find then that ESS is loaded. For ;; example, create a new file called "foo.R" and check that it opens ;; in R mode by looking at the mode line and menubar. ;; ;; Upgrading your version of ESS. ;; ;; If (and only if) you use the above instructions for installing ESS, ;; when a new version of ESS is released, you can use the same method to ;; install the new version. Repeat steps 2-7 for the new release of ESS, ;; and this time in step 6, if emacs finds that you already have the ;; special line ";;; ESS setup for version 5.2.12", it will highlight ;; those lines, and query whether you want to replace those two lines ;; with the new setup code. ;; ;; If you do upgrade ESS this way, bear in mind that your old version ;; will not be deleted from your filespace -- you will have to delete it ;; yourself. ;; TODO: possibly add a call to (byte-recompile-directory ess-lisp-dir ;; 0) so that lisp files are byte compiled. ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Location where the new lisp files are stored. (defvar ess-lisp-dir (file-name-directory (abbreviate-file-name buffer-file-name)) "Location where the new lisp files are stored.") (defvar ess-site-file (concat ess-lisp-dir "ess-site") "Full path to the new ess-site file. Do not include .el extension in case there is also a .elc around.") (defvar ess-new-version nil "Version number of new ESS to be installed.") (defvar ess-installed nil) (defun ess-install-byte-compile () "Byte compile the ESS files. This will probably generate warnings, but they can hopefully be ignored." ;; To do byte compilation, XEmacs seems to want the files on its ;; load-path so that it can do the (require 'xyz) statements. (add-to-list 'load-path ess-lisp-dir) (byte-recompile-directory ess-lisp-dir 0)) ;; Check that ess-site-file is written using unix directory separators. ;; i.e. need to change c:\\some\\dir\\ess-site.el to ;; c:/some/dir/ess-site.el ;; To do this, we have to load in ess-replace-in-string, from ;; the file ess-inf.el (save-window-excursion (find-file (concat ess-lisp-dir "ess-inf.el")) (goto-char (point-min)) (search-forward-regexp "^(defun ess-replace-in-string " nil t) (eval-defun nil) (setq ess-site-file (ess-replace-in-string ess-site-file "\\\\" "/" t)) ) ;; Get the version number of the new software. Open the file ;; ess-custom.el and then find the definition of the variable ;; ess-version. (save-window-excursion (let ((beg)) (find-file (concat ess-lisp-dir "ess-custom.el")) ;; go back to start, just in case file was previously open. (goto-char (point-min)) (search-forward "defvar ess-version \"") (setq beg (point)) (search-forward "\"") (setq ess-new-version (buffer-substring beg (1- (point)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Highlighting (copied from reftex.el -- cheers Carsten!) ;; Only one highlight region is needed, whereas two are provided here, ;; so this code could be simplified. But we may want it again later. ;; Highlighting uses overlays. If this is for XEmacs, we need to load ;; the overlay library, available in version 19.15 (and (not (fboundp 'make-overlay)) (condition-case nil (require 'overlay) ('error (error "Fm needs overlay emulation (available in XEmacs 19.15)")))) ;; We keep a vector with several different overlays to do our highlighting. (defvar ess-highlight-overlays [nil nil]) ;; Initialize the overlays (here we provide two overlays) (aset ess-highlight-overlays 0 (make-overlay 1 1)) (overlay-put (aref ess-highlight-overlays 0) 'face 'highlight) (aset ess-highlight-overlays 1 (make-overlay 1 1)) (overlay-put (aref ess-highlight-overlays 1) 'face 'highlight) ;; Two functions for activating and deactivation highlight overlays (defun ess-highlight (index begin end &optional buffer) "Highlight a region with overlay INDEX." (move-overlay (aref ess-highlight-overlays index) begin end (or buffer (current-buffer)))) (defun ess-unhighlight (index) "Detatch overlay INDEX." (delete-overlay (aref ess-highlight-overlays index))) ;;; End of highlighting code. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Try to find the .emacs init file and edit it. (save-window-excursion ;; Try to find the init file if one already exists, ;; or create a new one if we can't find any. (if (stringp user-init-file) (find-file user-init-file) ;; else, let's guess that the init file should be called ".emacs" ;; and the tilde will be resolved okay. (find-file "~/.emacs")) (goto-char (point-min)) (let ((ess-commands (concat "\n;;; ESS setup for version " ess-new-version "\n" "(load \"" ess-site-file "\")\n")) (new-install) (beg)) (if (search-forward ";;; ESS setup for version " nil t) (progn (message "You already have ESS installed.") (setq ess-installed (buffer-substring (point) (save-excursion (end-of-line) (point)))) (beginning-of-line) (setq beg (point)) ;; We assume the next line contains a sexp that loads the ;; the ess-site; this sexp can be multiple lines. (forward-line 1) (forward-list 1) (ess-highlight 0 beg (point)) (setq new-install (yes-or-no-p (concat "Replace ESS version " ess-installed " with version " ess-new-version "? "))) (when new-install (kill-region beg (point)) (insert ess-commands) (save-buffer) (ess-install-byte-compile) (message (concat "ESS updated to version " ess-new-version)) )) ;; else, just insert commands at end. (goto-char (point-max)) (insert ess-commands) (save-buffer) (ess-install-byte-compile) (message (concat "ESS version "ess-new-version" installed.")) ))) ;;; ess-install.el ends here ess/lisp/mouseme.el0000664000175000017500000003264312423756516012712 0ustar eddedd;;; mouseme.el --- mouse menu with commands that operate on strings ;; Copyright (C) 1997 by Free Software Foundation, Inc. ;; Author: Howard Melman ;; Keywords: mouse, menu ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This package provides a command `mouse-me' to be bound to a mouse ;; button. It pops up a menu of commands that operate on strings or a ;; region. The string passed to the selected command is the word or ;; symbol clicked on (with surrounding quotes or other punctuation ;; removed), or the region (if either it was just selected with the ;; mouse or if it was active with `transient-mark-mode' on). If the ;; command accepts a region, the selected region (or the region of the ;; word or symbol clicked on) will be passed to the command. ;; The idea is that for any given string in a buffer you may want to ;; do different things regardless of the mode of the buffer. URLs ;; now appear in email, news articles, comments in code, and in plain ;; text. You may want to visit that URL in a browser or you may just ;; want to copy it to the kill-ring. For an email address you might ;; want to compose mail to it, finger it, look it up in bbdb, copy it to ;; the kill ring. For a word you may want to spell check it, copy it, ;; change its case, grep for it, etc. Mouse-me provides a menu to ;; make this easy. ;; The menu popped up is generated by calling the function in the ;; variable `mouse-me-build-menu-function' which defaults to calling ;; `mouse-me-build-menu' which builds the menu from the variable ;; `mouse-me-menu-commands'. See the documentation for these ;; functions and variables for details. ;; To install, add something like the following to your ~/.emacs: ;; (require 'mouseme) ;; (global-set-key [S-mouse-2] 'mouse-me) ;;; Code: (require 'browse-url) (require 'thingatpt) (eval-when-compile (require 'compile)) ;;;; Variables (defgroup mouseme nil "Popup menu of commands that work on strings." :prefix "mouse-me-" :group 'hypermedia) (defcustom mouse-me-get-string-function 'mouse-me-get-string "*Function used by `mouse-me' to get string when no region selected. The default is `mouse-me-get-string' but this variable may commonly be made buffer local and set to something more appropriate for a specific mode (e.g., `word-at-point'). The function will be called with no arguments and with point at where the mouse was clicked. It can return either the string or to be most efficient, a list of three elements: the string and the beginning and ending points of the string in the buffer." :type 'function :options '(mouse-me-get-string) :group 'mouseme) (defcustom mouse-me-build-menu-function 'mouse-me-build-menu "*Function used by `mouse-me' to build the popup menu. The default is `mouse-me-build-menu' but this variable may commonly be made buffer local and set to something more appropriate for a specific mode. The function will be called with one argument, the string selected, as returned by `mouse-me-get-string-function'." :type 'function :options '(mouse-me-build-menu) :group 'mouseme) (defvar mouse-me-grep-use-extension 't "*If non-nil `mouse-me-grep' grep's in files with current file's extension.") (defcustom mouse-me-menu-commands '(("Copy" . kill-new) ("Kill" . kill-region) ("Capitalize" . capitalize-region) ("Lowercase" . downcase-region) ("Uppercase" . upcase-region) ("ISpell" . ispell-region) "----" ("Browse URL" . browse-url) ("Dired" . dired) ("Execute File" . mouse-me-execute) ("Mail to" . compose-mail) ("Finger" . mouse-me-finger) ("BBDB Lookup" . mouse-me-bbdb) "----" ("Imenu" . imenu) ("Find Tag" . find-tag) ("Grep" . mouse-me-grep) ("Find-Grep" . mouse-me-find-grep) "----" ("Apropos" . apropos) ("Describe Function" . mouse-me-describe-function) ("Describe Variable" . mouse-me-describe-variable) ("Command Info" . mouse-me-emacs-command-info) ("Man Page" . (if (fboundp 'woman) 'woman 'man)) ("Profile Function" . mouse-me-elp-instrument-function)) "*Command menu used by `mouse-me-build-menu'. A list of elements where each element is either a cons cell or a string. If a cons cell the car is a string to be displayed in the menu and the cdr is either a function to call passing a string to, or a list which evals to a function to call passing a string to. If the element is a string it makes a non-selectable element in the menu. To make a separator line use a string consisting solely of hyphens. The function returned from this menu will be called with one string argument. Or if the function has the symbol property `mouse-me-type' and if its value is the symbol `region' it will be called with the beginning and ending points of the selected string. If the value is the symbol `string' it will be called with one string argument." :type '(repeat sexp) :group 'mouseme) (put 'kill-region 'mouse-me-type 'region) (put 'ispell-region 'mouse-me-type 'region) (put 'capitalize-region 'mouse-me-type 'region) (put 'downcase-region 'mouse-me-type 'region) (put 'upcase-region 'mouse-me-type 'region) ;;;; Commands ;;;###autoload (defun mouse-me (event) "Popup a menu of functions to run on selected string or region." (interactive "e") (mouse-me-helper event (lambda () (or (x-popup-menu event (funcall mouse-me-build-menu-function name)) (error "No command to run"))))) ;;;; Exposed Functions ;; Some tests: ;; ;; ;; http://foo.bar.com/sss/ss.html ;; http://www.ditherdog.com/howard/ ;; mailto:howard@silverstream.com ;; howard@silverstream.com ;; ;; import com.sssw.srv.agents.AgentsRsrc; ;; public AgoHttpRequestEvent(Object o, String db, Request r) ;;
;; d:\howard\elisp\spoon ;; \howard\elisp\spoon ;; \\absolut\howard\elisp\spoon ;; //absolut/d/Howard/Specs/servlet-2.1.pdf ;; \\absolut\d\Howard\Specs\servlet-2.1.pdf ;; gnuserv-frame. (defun mouse-me-get-string () "Return a string from the buffer of text surrounding point. Returns a list of three elements, the string and the beginning and ending positions of the string in the buffer in that order." (save-match-data (save-excursion (let ((start (point)) beg end str p) (skip-syntax-forward "^ >()\"") (setq end (point)) (goto-char start) (skip-syntax-backward "^ >()\"") (setq beg (point)) (setq str (buffer-substring-no-properties beg end)) ;; remove junk from the beginning (if (string-match "^\\([][\"'`.,?:;!@#$%^&*()_+={}|<>-]+\\)" str) (setq str (substring str (match-end 1)) beg (+ beg (match-end 1)))) ;; remove URL: from the front, it's common in email (if (string-match "^\\(URL:\\)" str) (setq str (substring str (match-end 1)) beg (+ beg (match-end 1)))) ;; remove junk from the end (if (string-match "\\([][\"'.,?:;!@#$%^&*()_+={}|<>-]+\\)$" str) (setq end (- end (length (match-string 1 str))) ; must set end first str (substring str 0 (match-beginning 1)))) (list str beg end))))) (defun mouse-me-build-menu (name) "Return a menu tailored for NAME for `mouse-me' from `mouse-me-menu-commands'." (list "Mouse Me" (cons "Mouse Me" (append (list (cons (if (< (length name) 65) name "...Long String...") 'kill-new) "---") mouse-me-menu-commands)))) ;;;; Commands for the menu (defun mouse-me-emacs-command-info (string) "Look in Emacs info for command named STRING." (interactive "sCommand: ") (let ((s (intern-soft string))) (if (and s (commandp s)) (Info-goto-emacs-command-node s) (error "No command named `%s'" string)))) (defun mouse-me-describe-function (string) "Describe function named STRING." (interactive "sFunction: ") (let ((s (intern-soft string))) (if (and s (fboundp s)) (describe-function s) (error "No function named `%s'" string)))) (defun mouse-me-describe-variable (string) "Desribe variable named STRING." (interactive "sVariable: ") (let ((s (intern-soft string))) (if (and s (boundp s)) (describe-variable s) (error "No variable named `%s'" string)))) (defun mouse-me-elp-instrument-function (string) "Instrument Lisp function named STRING." (interactive "sFunction: ") (let ((s (intern-soft string))) (if (and s (fboundp s)) (elp-instrument-function s) (error "Must be the name of an existing Lisp function")))) (defun mouse-me-execute (string) "Execute STRING as a filename." (interactive "sFile: ") (if (fboundp 'w32-shell-execute) (w32-shell-execute "open" (convert-standard-filename string)) (message "This function currently working only in W32."))) (defun mouse-me-bbdb (string) "Lookup STRING in bbdb." (interactive "sBBDB Lookup: ") (if (fboundp 'bbdb) (bbdb string nil) (error "BBDB not loaded"))) (defun mouse-me-finger (string) "Finger a STRING mail address." (interactive "sFinger: ") (save-match-data (if (string-match "\\(.*\\)@\\([-.a-zA-Z0-9]+\\)$" string) (finger (match-string 1 string) (match-string 2 string)) (error "Not in user@host form: %s" string)))) (defun mouse-me-grep (string) "Grep for a STRING." (interactive "sGrep: ") (require 'compile) (grep-compute-defaults) (let ((ext (mouse-me-buffer-file-extension))) (grep (concat grep-command string (if mouse-me-grep-use-extension (if ext (concat " *" ext) " *")))))) (defun mouse-me-find-grep (string) "Grep for a STRING." (interactive "sGrep: ") (grep-compute-defaults) (let ((reg grep-find-command) (ext (mouse-me-buffer-file-extension)) beg end) (if (string-match "\\(^.+-type f \\)\\(.+$\\)" reg) (setq reg (concat (match-string 1 reg) (if mouse-me-grep-use-extension (concat "-name \"*" ext "\" ")) (match-string 2 reg)))) (grep-find (concat reg string)))) ;;;; Internal Functions (defun mouse-me-buffer-file-extension () "Return the extension of the current buffer's filename or nil. Returned extension is a string begining with a period." (let* ((bfn (buffer-file-name)) (filename (and bfn (file-name-sans-versions bfn))) (index (and filename (string-match "\\.[^.]*$" filename)))) (if index (substring filename index) ""))) (defun mouse-me-helper (event func) "Determine the string to use to process EVENT and call FUNC to get cmd." (let (name sp sm mouse beg end cmd mmtype) ;; temporarily goto where the event occurred, get the name clicked ;; on and enough info to figure out what to do with it (save-match-data (save-excursion (setq sp (point)) ; saved point (setq sm (mark t)) ; saved mark (set-buffer (window-buffer (posn-window (event-start event)))) (setq mouse (goto-char (posn-point (event-start event)))) ;; if there is a region and point is inside it ;; check for sm first incase (null (mark t)) ;; set name to either the thing they clicked on or region (if (and sm (or (and transient-mark-mode mark-active) (eq last-command 'mouse-drag-region)) (>= mouse (setq beg (min sp sm))) (<= mouse (setq end (max sp sm)))) (setq name (buffer-substring beg end)) (setq name (funcall mouse-me-get-string-function)) (if (listp name) (setq beg (nth 1 name) end (nth 2 name) name (car name)) (goto-char mouse) (while (not (looking-at (regexp-quote name))) (backward-char 1)) (setq beg (point)) (setq end (search-forward name)))))) ;; check if name is null, meaning they clicked on no word (if (or (null name) (and (stringp name) (string= name "" ))) (error "No string to pass to function")) ;; popup a menu to get a command to run (setq cmd (funcall func)) ;; run the command, eval'ing if it was a list (if (listp cmd) (setq cmd (eval cmd))) (setq mmtype (get cmd 'mouse-me-type)) (cond ((eq mmtype 'region) (funcall cmd beg end)) ((eq mmtype 'string) (funcall cmd name)) (t (funcall cmd name))))) (provide 'mouseme) ;;; mouseme.el ends here ess/lisp/ess-bugs-l.el0000664000175000017500000002350712423756516013220 0ustar eddedd;;; ess-bugs-l.el --- ESS[BUGS] languages ;; Copyright (C) 2006-2011 Rodney Sparapani ;; Author: Rodney Sparapani ;; Created: 16 August 2006 ;; Maintainer: ESS-help ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Code: (require 'font-lock) (require 'comint) (require 'ess-compat) (defgroup ess-bugs nil "ESS: BUGS." :group 'ess :prefix "ess-") (defcustom ess-bugs-batch-method (if ess-microsoft-p (if (w32-shell-dos-semantics) 'dos 'sh) 'sh) "Method used by `ess-bugs-batch'. The default is based on the value of the emacs variable `system-type' and, on Windows machines, the function `w32-shell-dos-semantics'. 'sh if *shell* runs a Bourne-like or a C-like Unix shell 'dos if *shell* runs a DOS-like Windows shell Unix users will get 'sh by default. Windows users running a DOS-like *shell* will get 'dos by default, while those running a Unix-like *shell* will get 'sh by default. Users whose default is not 'sh, but are accessing a remote machine with `telnet' or `ssh', should have the following in their init file: (setq-default ess-bugs-batch-method 'sh)" :group 'ess-bugs ) (defcustom ess-bugs-batch-post-command (if (equal ess-bugs-batch-method 'sh) "&" " ") "*ESS[BUGS]: Modifiers at the end of the batch BUGS command line." :group 'ess-bugs :type 'string ) (defcustom ess-bugs-batch-pre-command (if (equal ess-bugs-batch-method 'sh) "nohup nice time" (if ess-microsoft-p "start")) "*ESS[BUGS]: Modifiers at the beginning of the batch BUGS command line." :group 'ess-bugs :type 'string ) (defcustom ess-bugs-default-burn-in "500" "ESS[BUGS]: Burn-in iterations to discard." :group 'ess-bugs :type 'string ) (defcustom ess-bugs-default-update "1000" "ESS[BUGS]: Iterations to store." :group 'ess-bugs :type 'string ) (defvar ess-bugs-batch-command ";" "*ESS[BUGS]: The name of the command to run BUGS in batch mode." ) (defvar ess-bugs-file "." "ESS[BUGS]: BUGS file with PATH.") (defvar ess-bugs-file-root "." "ESS[BUGS]: Root of BUGS file.") (defvar ess-bugs-file-suffix "." "ESS[BUGS]: Suffix of BUGS file.") (defvar ess-bugs-file-dir "." "ESS[BUGS]: Directory of BUGS file.") (defvar ess-bugs-file-data "..." "ESS[BUGS]: BUGS data file.") (defcustom ess-bugs-inits-suffix ".in" "ESS[BUGS]: BUGS init file suffix." :group 'ess-bugs :type 'string ) (defcustom ess-bugs-data-suffix ".dat" "ESS[BUGS]: BUGS data file suffix." :group 'ess-bugs :type 'string ) (defcustom ess-bugs-mode-hook nil "*ESS[BUGS]: List of functions to call upon entering mode." :group 'ess-bugs :type 'hook) (defvar ess-bugs-monitor-vars " " "ESS[BUGS]: List of BUGS variables to be written out to a file.") (defvar ess-bugs-stats-vars " " "ESS[BUGS]: List of BUGS variables to be summarized with statistics.") (defvar ess-bugs-mode-map nil "ESS[BUGS]: Keymap for mode.") (if ess-bugs-mode-map nil (setq ess-bugs-mode-map (make-keymap))) (define-key ess-bugs-mode-map (quote [f2]) 'ess-revert-wisely) ;(define-key ess-bugs-mode-map (quote [f12]) 'ess-bugs-next-action) (define-key ess-bugs-mode-map "\C-c\C-c" 'ess-bugs-next-action) (define-key ess-bugs-mode-map "=" 'ess-bugs-hot-arrow) (define-key ess-bugs-mode-map "_" 'ess-bugs-hot-arrow) (defvar ess-bugs-syntax-table nil "ESS[BUGS]: Syntax table for mode.") (if ess-bugs-syntax-table nil (setq ess-bugs-syntax-table (make-syntax-table))) (modify-syntax-entry ?\\ "." ess-bugs-syntax-table) (modify-syntax-entry ?# "<" ess-bugs-syntax-table) (modify-syntax-entry ?\n ">" ess-bugs-syntax-table) (modify-syntax-entry ?( "()" ess-bugs-syntax-table) (modify-syntax-entry ?) ")(" ess-bugs-syntax-table) (modify-syntax-entry ?. "w" ess-bugs-syntax-table) (defun ess-bugs-file () "ESS[BUGS]: Set internal variables dealing with BUGS files. Set `ess-bugs-file', `ess-bugs-file-root', `ess-bugs-file-suffix' and `ess-bugs-file-dir'." (let ((ess-bugs-temp-string (buffer-name))) (setq ess-bugs-file (expand-file-name ess-bugs-temp-string)) (setq ess-bugs-file-dir (convert-standard-filename (file-name-directory ess-bugs-file))) (setq ess-bugs-file-root (file-name-nondirectory (file-name-sans-extension ess-bugs-file))) (if (fboundp 'file-name-extension) (setq ess-bugs-file-suffix (file-name-extension ess-bugs-temp-string)) ;;else (setq ess-bugs-file-suffix (car (last (split-string ess-bugs-temp-string "[.]"))))) (setq ess-bugs-file-suffix (downcase (car (split-string (concat "." ess-bugs-file-suffix) "[<]")))) (setq ess-bugs-file (concat ess-bugs-file-dir ess-bugs-file-root ess-bugs-file-suffix)) ) ) (defun ess-bugs-exit-notify-sh (string) "ESS[BUGS]: Detect completion or failure of submitted job and notify the user." (let* ((exit-done "\\[[0-9]+\\]\\ *\\+*\\ *\\(Exit\\|Done\\)[^\r\n]*") (beg (string-match exit-done string))) (if beg (message (substring string beg (match-end 0)))))) (defun ess-bugs-hot-arrow () "*ESS[BUGS]: Substitute <- for = key press" (interactive) (insert " <- ")) (defun ess-bugs-next-action () "ESS[BUGS/JAGS]: Perform the appropriate next action." (interactive) (ess-bugs-file) (cond ((equal ".bug" ess-bugs-file-suffix) (ess-bugs-na-bug)) ((equal ".jag" ess-bugs-file-suffix) (ess-jags-na-bug)) ((equal ".bmd" ess-bugs-file-suffix) (ess-save-and-set-local-variables) (ess-bugs-na-bmd ess-bugs-command ess-bugs-chains)) ((equal ".jmd" ess-bugs-file-suffix) (ess-save-and-set-local-variables) (ess-jags-na-jmd ess-jags-command ess-jags-chains))) ) (defun ess-bugs-sci-to-round-4-dp () "ESS[BUGS]: round output from +/-0.000E+/-0 to 4 decimal places." (interactive) (setq buffer-read-only nil) (save-excursion (goto-char 0) (save-match-data (let ((ess-bugs-replacement-string nil) (ess-bugs-replacement-9 0) (ess-bugs-replacement-diff 0)) (while (search-forward-regexp "-?[0-9][.][0-9][0-9][0-9]E[+-][0-9]" nil t) (setq ess-bugs-replacement-string (int-to-string (string-to-number (match-string 0)))) (setq ess-bugs-replacement-diff (- (match-end 0) (match-beginning 0))) (save-match-data (setq ess-bugs-replacement-9 (string-match "99999999999$" ess-bugs-replacement-string)) (if (not ess-bugs-replacement-9) (setq ess-bugs-replacement-9 (string-match "000000000001$" ess-bugs-replacement-string)))) (if ess-bugs-replacement-9 (setq ess-bugs-replacement-string (substring ess-bugs-replacement-string 0 ess-bugs-replacement-9))) (setq ess-bugs-replacement-diff (- ess-bugs-replacement-diff (string-width ess-bugs-replacement-string))) (while (> ess-bugs-replacement-diff 0) (setq ess-bugs-replacement-string (concat ess-bugs-replacement-string " ")) (setq ess-bugs-replacement-diff (- ess-bugs-replacement-diff 1))) (replace-match ess-bugs-replacement-string)))))) ;;; ESS[BUGS-Shell] for running BUGS interactively (defgroup ess-bugs-shell nil "ESS: BUGS-Shell." :group 'ess-bugs :prefix "ess-") (defcustom ess-bugs-shell-buffer-name "BUGS" "*ESS[BUGS-Shell]: The name of the BUGS-Shell buffer." :group 'ess-bugs-shell :type 'string) (defcustom ess-bugs-shell-command "OpenBUGS" "*ESS[BUGS-Shell]: The name of the command to run BUGS interactively. Set to the name of the batch BUGS script that comes with ESS or to the name of BUGS command. Make sure it is in your PATH or add path to the command name." :group 'ess-bugs-shell :type 'string) (defcustom ess-bugs-shell-default-output-file-root "bugs" "*ESS[BUGS-Shell]: Default value for the root of output files." :group 'ess-bugs-shell :type 'string) (defcustom ess-bugs-shell-mode-hook nil "*ESS[BUGS-Shell]: List of functions to call upon entering mode." :group 'ess-bugs-shell :type 'hook) (defun ess-bugs-shell () "Create a buffer with BUGS running as a subprocess." (interactive) (require 'shell) (switch-to-buffer (concat "*" ess-bugs-shell-buffer-name "*")) (make-comint ess-bugs-shell-buffer-name ess-bugs-shell-command nil ess-bugs-default-bins ess-bugs-shell-default-output-file-root) (comint-mode) (setq shell-dirtrackp t major-mode 'bugs-shell-mode mode-name "ESS[BUGS-Shell]" comint-prompt-regexp "^Bugs> *") (make-local-variable 'font-lock-defaults) (setq font-lock-defaults '(ess-bugs-font-lock-keywords nil t)) (run-hooks 'ess-bugs-shell-mode-hook) ) (provide 'ess-bugs-l) ;;; ess-bugs-l.el ends here ess/lisp/ess-debug.el0000664000175000017500000000616312423756516013114 0ustar eddedd;;; ess-debug.el --- debugging start up for ESS ;; Copyright (C) 1997--2001 A.J. Rossini ;; Copyright (C) 2001--2006 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: November 1997 ;; Maintainer: ESS-core ;; Keywords: languages, tools ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Commentary: ;; Strictly for debugging and development. usage is: ;; xemacs -no-site-file -no-init-file -load ess-debug.el -f S4 ;; (or similar!) ;; ;; The whole point of this file is to enable debugging from a vanilla ;; environment. It probably isn't needed too much right now. ;;; Code: (defun ess-add-path (path &rest options) "Add PATH to `load-path' if it exists under `default-load-path' directories and it does not exist in `load-path'. You can use following PATH styles: load-path relative: \"PATH/\" (it is searched from `default-load-path') home directory relative: \"~/PATH/\" \"~USER/PATH/\" absolute path: \"/HOO/BAR/BAZ/\" You can specify following OPTIONS: 'all-paths search from `load-path' instead of `default-load-path' 'append add PATH to the last of `load-path'. For ESS, ONLY use load-path, since Emacs doesn't have default-load-path." (let ((rest load-path) p) (if (and (catch 'tag (while rest (setq p (expand-file-name path (car rest))) (if (file-directory-p p) (throw 'tag p)) (setq rest (cdr rest)))) (not (member p load-path))) (setq load-path (if (memq 'append options) (append load-path (list p)) (cons p load-path)))))) (setq-default debug-on-error t) (ess-add-path "~rossini/Repos/repos-svn/ess/lisp") ;; ^^adapt!!!^^^^^^^^^^^^^^^ (require 'ess-site) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-debug.el ends here ess/lisp/ess-site.el0000664000175000017500000010014212577152666012770 0ustar eddedd;;; ess-site.el --- user customization of ESS ;; Copyright (C) 1993 David M. Smith ;; Copyright (C) 1997--2012 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: David Smith ;; Created: 12 Nov 1993 ;; Maintainer: ESS-core ;; Keywords: local ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the site-specific customizations for ESS. It should be ;; edited on a per-site basis. Read the comments (1.1 in Section 1 to see if ;; ess-site.el must be edited. The final directory location of this file must be ;; supplied in ess-lisp-directory. The editing of remaining sections is ;; optional. It should then be byte-compiled, and users who wish to use ESS ;; should add the line: ;; ;; (load "/PATH/TO/THIS/FILE/ess-site") ;; ;; (where /PATH/TO/THIS/FILE is the path to ess-site.elc: i.e. the value of ;; `ess-lisp-directory', below) to their .emacs file. ;; ;; Alternatively, if the file is already in a directory specified by ;; the load-path variable: ;; ;; (require 'ess-site) ;; ;; will work. ;; ;; with XEmacs, this is simply: ;; ;; (add-path "/path/to/ess/lisp-directory") ;; ;; with Emacs (and in general): ;; ;; (setq load-path (cons "/path/to/ess/lisp-directory" load-path)) ;;; Code: ;; provide here; otherwise we'll get infinite loops of (require ..): (provide 'ess-site) ;;(require 'ess-sp6-d) ;;;; 1. Load path, autoloads, and major modes ;;;; ======================================== ;;; ;;; (1.1) For most users the variable ess-lisp-directory will ;;; automatically be set correctly. If you are working with an old ;;; emacs, one in which file-truename is not defined, then you might ;;; need to change the value of ess-lisp-directory to the directory ;;; which is to contain the file ess-site.elc. This is probably the ;;; current directory, or the value of LISPDIR if it was set in the ;;; Makefile. (eval-and-compile ;; Not important in XEmacs, if unpacking from ../xemacs/site-lisp/ ;; directory. ;; WARNING: with Emacs 20.2 (and 20.3 in one case), ;; ======= MUST USE ONE OF THE NON-DEFAULT SETTINGS BELOW ;; NOTE again: MOST people should NOT change anything here !!! ;; ==== ==== ================ ;; A nice default (defvar ess-lisp-directory (directory-file-name (file-name-directory (if (and (boundp 'load-file-name) load-file-name) ;; A nice default (file-truename load-file-name) (locate-library "ess-site") ))) "Directory containing ess-site.el(c) and other ESS lisp files.") ;; NON DEFAULTS: ;;(defvar ess-lisp-directory ;;(directory-file-name "/usr/local/lib/xemacs/site-lisp/ess-/lisp")) ;; >> or replace "ess-" above by "ESS" which would be a symbolic link.. ;; >> This way, your .emacs (or default.el or site-start.el) ;; >> won't have to change with each version of ESS ;; example of "local" or personal use ;;(defvar ess-lisp-directory ;;(directory-file-name "/stat2/faculty/rossini/ESS/lisp")) ;;) ;; emacs 19.28 and 19.29 don't have functions we need. (if (not (fboundp 'file-name-sans-extension)) ;; take the definition from emacs-20.6/lisp/files.el: (defun file-name-sans-extension (filename) "Return FILENAME sans final \"extension\". The extension, in a file name, is the part that follows the last `.'." (save-match-data (let ((file (file-name-sans-versions (file-name-nondirectory filename))) directory) (if (string-match "\\.[^.]*\\'" file) (if (setq directory (file-name-directory filename)) (expand-file-name (substring file 0 (match-beginning 0)) directory) (substring file 0 (match-beginning 0))) filename))))) (add-to-list 'load-path (file-name-as-directory ess-lisp-directory)) ;; Need these as early as here [also in ./ess-comp.el] : (if (not (boundp 'ess-show-load-messages)) (defvar ess-show-load-messages nil "If t, show many more \"loading ..\" messages.")) (if (not (fboundp 'ess-message)) (defun ess-message (format-string &rest args) "Shortcut for \\[message] only if `ess-show-load-messages' is non-nil." (if ess-show-load-messages (message format-string args))) )); eval-*-compile ;; DEBUG: (setq ess-show-load-messages t); instead of nil above (ess-message (format "[ess-site:] ess-lisp-directory = '%s'" ess-lisp-directory)) ;; load code to figure out what version/strain of Emacs we are running ;; must come *AFTER* load-path is set ! ;;; The following require sets ess-local-custom-available to ;;; true if custom is provided at this point. (require 'ess-compat) ;;; If it is not provided, but we think it will be available when necessary, ;;; then we can use the following line (uncommented) to make sure that ;;; it will be used. If you have to ask, then you don't need this. ;;(setq ess-local-custom-available t) ;; SJE Thu 13 May 2004 ;; Maybe ess-etc-directory should not be defcustom, since its value ;; depends on ess-lisp-directory, and is needed by other modes that are ;; loaded before the custom code. (defvar ess-etc-directory nil "Location of the ESS etc/ directory. The ESS etc directory stores various auxillary files that are useful for ESS, such as icons.") (defvar ess-etc-directory-list '("../etc/ess/" "../etc/" "../../etc/ess/" "./etc/") "List of directories, relative to `ess-lisp-directory', to search for etc.") (while (and (listp ess-etc-directory-list) (consp ess-etc-directory-list)) (setq ess-etc-directory (expand-file-name (concat ess-lisp-directory "/" (car ess-etc-directory-list)))) (if (file-directory-p ess-etc-directory) (setq ess-etc-directory-list nil) (setq ess-etc-directory nil) (setq ess-etc-directory-list (cdr ess-etc-directory-list)) (when (null ess-etc-directory-list) (beep 0) (beep 0) (message (concat "ERROR:ess-site.el:ess-etc-directory\n" "Relative to ess-lisp-directory, one of the following must exist:\n" "../etc/ess, ../etc, ../../etc/ess or ./etc")) (sit-for 4)))) ;;-- no longer used thanks to the (unless ...) clause below -- ;; (defvar ess-info-directory nil ;; "*Location of the ESS info/ directory. ;; The ESS info directory stores the ESS info files.") ;;(1.2) If ess.info is not found, then ess-lisp-directory/../doc/info is added ;; resurrecting Stephen's version with a bug-fix & xemacs compatibility (if (fboundp 'locate-file) (progn (unless (locate-file "ess.info" (if (featurep 'xemacs) Info-directory-list Info-default-directory-list)) (add-to-list (if (featurep 'xemacs) 'Info-directory-list 'Info-default-directory-list) (expand-file-name "../doc/info/" ess-lisp-directory))))) ;; ALWAYS: (ess-message "[ess-site:] require 'ess *ITSELF* ...") (require 'ess); -> loads ess-custom.el and more (ess-message "[ess-site:] .. after requiring 'ess ...") ;;; (1.3) Files ending in .q and .S are considered to be S source files ;;; Files ending in .St are considered to be S transcript files ;;; ;;; NB: in standard Emacs, files ending in .s are assembler files. If you ;;; want to use assembler. If a user wants to ;;; restore the default modes for assembly file extensions, the ;;; following can go into ~/.emacs or ~/.xemacs/init.el ;;; ;;; (add-hook 'ess-mode-hook 'ess-restore-asm-extns) ;;; (add-hook 'inferior-ess-mode-hook 'ess-restore-asm-extns) (autoload 'Rd-mode "ess-rd" "Major mode for editing R documentation." t) ; Here is a workaround for an Emacs bug related to indirect buffers and ; spurious lockfiles that rears its ugly head with .Rd files ; http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-02/msg01368.html ; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14328 (if (featurep 'xemacs) nil ;; (add-hook 'Rd-mode-hook (lambda () ;; (set (make-local-variable create-lockfiles) nil))) (make-local-variable 'create-lockfiles) (add-hook 'Rd-mode-hook (lambda () (setq create-lockfiles nil))) ) ;; This is thanks to Ed L Cashin , 03 Mar 2004 : (defun ess-restore-asm-extns () "Remove the S-Plus mode association for .s and .S files added by ESS. Putting the following in ~/.emacs restores emacs' default association between .s or .S files and assembly mode. (add-hook 'ess-mode-hook 'ess-restore-asm-extns) (add-hook 'inferior-ess-mode-hook 'ess-restore-asm-extns)" (interactive) (when (assoc "\\.[qsS]\\'" auto-mode-alist) (setq auto-mode-alist (remassoc "\\.[qsS]\\'" auto-mode-alist)) ;; put .q extention back ;; (add-to-list is in xemacs and GNU emacs) ;; R-mode when in a R/ subdirectory, otherwise S-mode: (add-to-list 'auto-mode-alist '("/R/.*\\.q\\'" . R-mode)) (add-to-list 'auto-mode-alist '("\\.q\\'" . S-mode)) )) ;; Be careful when editing the following. MISTAKES WILL RESULT IN ;; *.sty BEING TREATED AS ESS[S], rather than LaTeX-mode! (if (assoc "\\.[rR]\\'" auto-mode-alist) nil (setq auto-mode-alist (append '(("\\.sp\\'" . S-mode) ;; re: Don MacQueen ("/R/.*\\.q\\'" . R-mode) ;; R/*.q is R code (e.g., in package) ("\\.[qsS]\\'" . S-mode) ;; s,S [see ess-restore-asm-extns above!] ("\\.ssc\\'" . S-mode) ;; Splus (>= 4.x) script files. ("\\.SSC\\'" . S-mode) ;; ditto for windoze ("\\.[rR]\\'" . R-mode) ("\\.[rR]nw\\'" . Rnw-mode) ("\\.[sS]nw\\'" . Snw-mode); currently identical to Rnw-mode ("\\.[rR]profile\\'" . R-mode) ("NAMESPACE\\'" . R-mode) ("CITATION\\'" . R-mode) ("\\.omg\\'" . omegahat-mode) ("\\.hat\\'" . omegahat-mode) ;; Duncan's pref'd... ("\\.lsp\\'" . XLS-mode) ("\\.do\\'" . STA-mode) ("\\.ado\\'" . STA-mode) ("\\.[Ss][Aa][Ss]\\'" . SAS-mode) ;; Many .log/.lst files, not just SAS ;;("\\.log\\'" . SAS-log-mode) ;;("\\.[Ll][Ss][Tt]\\'" . SAS-listing-mode) ("\\.[Ss]t\\'" . S-transcript-mode) ("\\.Sout" . S-transcript-mode) ;;("\\.[Rr]t\\'" . R-transcript-mode) ("\\.[Rr]out" . R-transcript-mode) ("\\.Rd\\'" . Rd-mode) ("\\.[Bb][Uu][Gg]\\'" . ess-bugs-mode) ("\\.[Bb][Oo][Gg]\\'" . ess-bugs-mode) ("\\.[Bb][Mm][Dd]\\'" . ess-bugs-mode) ("\\.[Jj][Aa][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode) ) auto-mode-alist))) ;; Rscript and littler interpreters recognized. XEmacs entries can ;; be regexps, which complicates matters as "r" on its own matches ;; other interpeters like "perl". (add-to-list 'interpreter-mode-alist '("Rscript" . r-mode)) (add-to-list 'interpreter-mode-alist (cons (if (featurep 'xemacs) "r$" "r") 'r-mode)) ;; (1.4) Customize the dialects for your setup. ;;; AS OF ESS 5.1.14, if you are using Emacs 20.x, x>3, or XEmacs ;;; 21.x, x>0, you can now use the "Customize" facility for ;;; customization. ;;;; Choices for *(), where * is from inferior-*-program.... ;;; Most sites will not need to use these customized program-names. They are ;;; provided for cases where the program is not on the standard default path. ;;; If the program doesn't get located correctly by the default use of ;;; M-x S+3 (for example), then put the path name for your system into the ;;; the variable inferior-S+3-program-name. If for any reason you want the ;;; default use of M-x S to refer to a different program than S+3, then ;;; redefine inferior-S-program-name. ;;(setq-default inferior-S3-program-name "/disk05/s/S") ;;(setq-default inferior-S+3-program-name "Splus34") ;;(setq-default inferior-S4-program-name "/disk05/s4/S") ;;(setq-default inferior-S+4-program-name "Splus") ;;(setq-default inferior-S+5-program-name "Splus5") ;;(setq-default inferior-S+-program-name "Splus7") ; unix systems ; or ;;(setq-default inferior-S+-program-name "Splus") ; unix systems ;; ;; If you wish to call other versions of R on a Unix system, ESS ;; should auto-detect other versions of R, according to matches to the ;; variable `ess-r-versions' as described in its docstring. Consider ;; changing that variable rather than changing inferior-R-program-name ;; if your version of R is not already auto-detected. ;;(setq-default inferior-R-program-name "R") ; unix systems ;;(setq-default inferior-R-program-name "Rterm") ; MS Windows, see below for path as well ;;(setq-default inferior-R-program-name "C:\\Program Files\\R\\R-2.5.0\\bin\\Rterm.exe") ;;(setq-default inferior-XLS-program-name "xlispstat") ;;(setq-default inferior-ARC-program-name "arc") ;;(setq-default inferior-VST-program-name "vista") ;;(setq-default inferior-SAS-program-name "sas") ;;(setq-default inferior-OMG-program-name "/home/rossini/src/anoncvs/Omegahat/org/omegahat/bin/omegahat") (setq-default inferior-OMG-program-name "omegahat") ;;; The line below is the ESS default and sends the commands window ;;; to emacs, giving the user the opportunity to ;;; (1) edit the output into a clean ess-transcript file before printing, or ;;; (2) print a region of the file. ;;(setq-default inferior-S+4-print-command "S_PRINT_COMMAND=emacsclientw.exe") ;;; The editor and pager output from S+4 and Sqpe+4 are sent by ;;; StatSci default to notepad, effectively using the definition: ;;(setq-default inferior-S+4-editor-pager-command ;; "options(editor='notepad', pager='notepad')") ;;; ;;; ESS sends the output from both commands to an emacs buffer using ;;; the definition: ;;(setq-default inferior-S+4-editor-pager-command ;; "options(editor='emacsclient.exe', pager='emacsclientw.exe')") ;;; These commands are for running the PC version of Sqpe of S+4 and ;;; S+6 in an emacs buffer, using the same technology as ESS uses for ;;; Unix S-Plus. Interactive graphics with javagraph are available ;;; in this mode beginning with S-Plus 6.1. ;;; See ess-sp4-d.el or ess-sp6w-d.el ;;; -----> configuration now via custom, see ./ess-custom.el and look for ;;; inferior-Sqpe+... e.g. inferior-Sqpe+6-program-name ;;; These ddeclient values will be buffer-local on MS-Windows 9x/NT (setq-default inferior-ess-ddeclient "Initial") (setq-default inferior-ess-client-name "Initial") (setq-default inferior-ess-client-command "Initial") ;;; S-Plus 6 for Windows startup time depends on the amount of RAM and ;;; the processor speed. ESS needs to build a delay into the M-x S+6 ;;; sequence to allow time for S-Plus 6 to open the Commands window. ;;; We then send several lines to the Commands window before returning ;;; control to the user. On a 300 MHz machine with 96MB of RAM the ;;; delay is 60 seconds. On a ???? MHz machine with 523MB the delay is ;;; 10 seconds. The user may need to adjust this number. (defvar ess-S+6-startup-delay 15 ;; <- 2005-01-03; MM "*Number of seconds to wait for the Commands window to appear before sending `inferior-ess-language-start' to S-Plus.") ;;; see essd-els.el ;;(setq-default inferior-S-elsewhere-program-name "sh") ;;(setq-default inferior-S-elsewhere-program-name "ssh") ;;; You might consider using ssh, if you can! (and if you really do ;;; this, use ssh-agent, etc, for securing your sessions). ;;;; Choice for S(). ;;(setq-default inferior-S-program-name inferior-S+3-program-name) ;; (1.5) Require the needed dialects for your setup. (ess-message "[ess-site:] Before requiring dialect 'ess-*-d ....") (ess-message "[ess-site:] require 'ess-r-d ...") (require 'ess-r-d) ;; R (require 'ess-julia) ;; (ess-message "[ess-site:] require 'ess-s4-d ...") ;; (require 'ess-s4-d) ; has become VERY RARE .. ;;(ess-message "[ess-site:] require 'ess-s3-d ...") ;;(require 'ess-s3-d) ; THIS IS RARE. You probably do not have this. ;; "sp" refers to S-PLUS (MathSoft/StatSci/Insightful/TIBCO): (ess-message "[ess-site:] require 'ess-sp3-d ...") (require 'ess-sp3-d) (if ess-microsoft-p (progn ;; (ess-message "[ess-site:] require 'ess-sp4-d ...") ;; (require 'ess-sp4-d) (ess-message "[ess-site:] require 'ess-sp6w-d ...") (require 'ess-sp6w-d)) ;; else: decent OS ;; (ess-message "[ess-site:] require 'ess-sp5-d ...") ;; (require 'ess-sp5-d) (ess-message "[ess-site:] require 'ess-sp6-d ...") (require 'ess-sp6-d)) (ess-message "[ess-site:] require 'ess-sta-d ...") (require 'ess-sta-d) ;; for Stata. ;; (ess-message "[ess-site:] require 'ess-xls-d ...") ;; (require 'ess-xls-d) ;; XLispStat ;; (ess-message "[ess-site:] require 'ess-vst-d ...") ;; (require 'ess-vst-d) ;; ViSta ;; (ess-message "[ess-site:] require 'ess-arc-d ...") ;; (require 'ess-arc-d) ;; Arc (ess-message "[ess-site:] require 'ess-sas-d ...") (require 'ess-sas-d) (ess-message "[ess-site:] require 'essd-els ...") (require 'essd-els) ;; S-elsewhere, on another machine by telnet ;; (ess-message "[ess-site:] require 'ess-omg-d ...") ;; (require 'ess-omg-d) ;; for omegahat (ess-message "[ess-site:] require 'ess-bugs-l ...") (require 'ess-bugs-l) ;; for batch BUGS (ess-write-to-dribble-buffer (format "[ess-site.el]: ess-customize-alist=%s \n" ess-customize-alist)) ;;; (1.7) Literate Data Analysis (require 'ess-noweb) (require 'ess-swv); for Sweave (ess-write-to-dribble-buffer (format "[ess-site.el _2_]: ess-customize-alist=%s \n" ess-customize-alist)) ;; (1.8) Speedbar and mouse (ess-message "[ess-site:] require 'ess-menu ...") (require 'ess-menu) (require 'ess-mouse) ;; (1.9) Toolbar support ;; To remove toolbar support under ESS, add "(setq ess-use-toolbar nil)" ;; to your ~/.emacs or ~/.xemacs/init.el before (require 'ess-site) (ess-message "[ess-site:] require 'ess-toolbar ...") (require 'ess-toolbar) ;;; 2. Site Specific setup ;;;; =============================================== ;;; Set this to the name of the program you use to run S or S-PLUS. It ;;; can be an absolute pathname, if you wish. ;;(setq inferior-ess-program "Splus") ;;(setq inferior-ess-program (concat (getenv "SHOME") "/Splus")) ;;; 2.1 Backwards compatibility (roll your own!) ;;; What you want S and R to call... (autoload 'ess-transcript-mode "ess-trns" "Major mode for editing S transcript files." t) (autoload 'ess-transcript-clean-region "ess-trns" no-doc t) (autoload 'ess-rdired "ess-rdired" "View *R* objects in a dired-like buffer." t) ;;; On a PC, the default is S+. ;; Elsewhere (unix and linux) the default is S+ (cond (ess-microsoft-p ;; MS-Windows------------------------------------------------- ;; (fset 'S ;; (if (equal (file-name-nondirectory shell-file-name) "cmdproxy.exe") ;; 'S+-msdos ;; 'S+)) (defun S-by-icon (&rest x) (interactive) (message "Please start S+ from the icon. Then you can connect emacs to it with `M-x S-existing'.") ) (fset 'S 'S-by-icon) (fset 'S-existing (if (equal (file-name-nondirectory shell-file-name) "cmdproxy.exe") 'S+-msdos-existing 'S+-existing)) (fset 'Sqpe 'Sqpe+) (fset 's-mode 'S+-mode) (fset 's-transcript-mode 'S+-transcript-mode)) (t ;;((eq system-type 'gnu/linux) ;; Linux etc (including Mac OSX !?) -------------------------- (fset 'S 'S+) (fset 's-mode 'S+-mode) (fset 's-transcript-mode 'S+-transcript-mode))) ;;;;* Alias S-mode to s-mode ;;; Emacs will set the mode for a file based on the file's header. ;;; The mode name is indicated by putting it between -*- on the top line. ;;; (Other commands can go here too, see an Emacs manual.) ;;; For a file you also load, you will want a leading # (comment to S) ;;; Emacs will downcase the name of the mode, e.g., S, so we must provide ;;; s-mode in lower case too. That is, "#-*- S-*-" invokes s-mode and ;;; not S-mode. (fset 'S-transcript-mode 's-transcript-mode) (fset 'S-mode 's-mode) ;;; Create functions for calling different (older or newer than default) ;;; versions of R and S(qpe). (defvar ess-versions-created nil "List of strings of all S- and R-versions found on the system.") ;; is currently used (updated) by ess-find-newest-R (defvar ess-r-versions-created nil "List of strings of all R-versions found on the system.") (defun ess-r-s-versions-creation () "(Re)Create ESS R-<..> commands FILENAME sans final \"extension\". The extension, in a file name, is the part that follows the last `.'." (interactive) (ess-message "[ess-site:] before creating ess-versions-* ...") ;; Create ess-versions-created, ;; ess-r-versions-created, ;; and on Windows, ess-rterm-version-paths ----------------------------------------- (let ((R-newest-list '("R-newest")) (ess-s-versions-created (if ess-microsoft-p (nconc (ess-sqpe-versions-create ess-SHOME-versions) ;; 32-bit (ess-sqpe-versions-create ess-SHOME-versions-64 "-64-bit")) ;; 64-bit (ess-s-versions-create)))) ;; use ess-s-versions (if ess-microsoft-p (setq ess-rterm-version-paths ;; (ess-find-rterm)) (ess-flatten-list (ess-uniq-list (if (not ess-directory-containing-R) (if (getenv "ProgramW6432") (let ((P-1 (getenv "ProgramFiles(x86)")) (P-2 (getenv "ProgramW6432"))) (nconc ;; always 32 on 64 bit OS, nil on 32 bit OS (ess-find-rterm (concat P-1 "/R/") "bin/Rterm.exe") (ess-find-rterm (concat P-1 "/R/") "bin/i386/Rterm.exe") ;; keep this both for symmetry and because it can happen: (ess-find-rterm (concat P-1 "/R/") "bin/x64/Rterm.exe") ;; always 64 on 64 bit OS, nil on 32 bit OS (ess-find-rterm (concat P-2 "/R/") "bin/Rterm.exe") (ess-find-rterm (concat P-2 "/R/") "bin/i386/Rterm.exe") (ess-find-rterm (concat P-2 "/R/") "bin/x64/Rterm.exe") )) (let ((PF (getenv "ProgramFiles"))) (nconc ;; always 32 on 32 bit OS, depends on 32 or 64 process on 64 bit OS (ess-find-rterm (concat PF "/R/") "bin/Rterm.exe") (ess-find-rterm (concat PF "/R/") "bin/i386/Rterm.exe") (ess-find-rterm (concat PF "/R/") "bin/x64/Rterm.exe") )) ) (let ((PF ess-directory-containing-R)) (nconc (ess-find-rterm (concat PF "/R/") "bin/Rterm.exe") (ess-find-rterm (concat PF "/R/") "bin/i386/Rterm.exe") (ess-find-rterm (concat PF "/R/") "bin/x64/Rterm.exe") )) ))))) (ess-message "[ess-site:] (let ... before (ess-r-versions-create) ...") (setq ess-r-versions-created ;; for Unix *and* Windows, using either (ess-r-versions-create));; ess-r-versions or ess-rterm-version-paths (above!) ;; Add the new defuns, if any, to the menu. ;; Check that each variable exists, before adding. ;; e.g. ess-sqpe-versions-created will not be created on Unix. (setq ess-versions-created (ess-flatten-list (mapcar (lambda(x) (if (boundp x) (symbol-value x) nil)) '(R-newest-list ess-r-versions-created ess-s-versions-created)))))) (defun ess-r-s-versions-creation+menu () "Call `\\[ess-r-s-versions-creation] creaing `ess-versions-created' and update the \"Start Process\" menu." (interactive) (ess-message "[ess-site:] before (ess-r-s-versions-creation) ...") (ess-r-s-versions-creation) (when ess-versions-created ;; new-menu will be a list of 3-vectors, of the form: ;; ["R-1.8.1" R-1.8.1 t] (let ((new-menu (mapcar (lambda(x) (vector x (intern x) t)) ess-versions-created))) (easy-menu-add-item ess-mode-menu '("Start Process") (cons "Other" new-menu)))) (ess-message "[ess-site:] after ess-versions-created ...") ;; return ess-versions-created) ;; call it (ess-r-s-versions-creation+menu) ;; Check to see that inferior-R-program-name points to a working version ;; of R; if not, try to find the newest version: (ess-check-R-program-name) ;; -> (ess-find-newest-R) if needed, in ./ess-r-d.el (ess-message "[ess-site:] after ess-check-R-prog... ...") ;;; 3. Customization (and examples) for your site ;;;; =============================================== ;;; (3.01) SOME PEOPLE (who will remain nameless) worry that novices ;;; won't like fancy buffer names for their first (and only :-) ;;; process. To number all processes: ;;(setq ess-plain-first-buffername nil) ;;; (3.02) Some people have requested using the program name as part ;;; of the buffer. Turned on for R. ;;(setq ess-use-inferior-program-name-in-buffer-name t) ;;; (3.1) Font-lock ;; The following two expressions automatically enable font-lock-mode ;; for ess-mode and inferior-ess-mode buffers. ;; no longer requiring (window-system) here: (when ess-font-lock-mode (add-hook 'ess-mode-hook 'turn-on-font-lock t) (add-hook 'ess-transcript-mode-hook 'turn-on-font-lock t) (add-hook 'Rd-mode-hook 'turn-on-font-lock t) (add-hook 'inferior-ess-mode-hook 'turn-on-font-lock t)) ;;; (3.2) Framepop. Windows produced by ess-execute-objects etc. are ;;; often unnecessarily large. The framepop package makes such ;;; windows appear in a separate, shrink-wrapped frame. This will ;;; also affect other "temporary" windows such as those produced by ;;; C-h k, etc. To enable: ;;; ;;; Works only with Emacs at this time. ;; (cond (window-system ;; (require 'framepop))) ;;; (3.3) ess-keep-dump-files. ;;; Documentation: ;;; *Variable controlling whether to delete dump files after a successful load. ;;; If nil: always delete. If `ask', confirm to delete. If `check', confirm ;;; to delete, except for files created with ess-dump-object-into-edit-buffer. ;;; Anything else (for example `always'): always keep and never delete. ;;; This variable only affects the behavior ;;; of ess-load-file. Dump files are never deleted if an error occurs ;;; during the load. ;;; ;;; RH sez: I find the default `always' keep to be imperative. The previous ;;; default was to throw away ;;; files at the wrong time (I think it was something like, if you M-x ;;; ess-load a file twice, while you are working on it, the file is ;;; deleted). I believe source is real and the ESS object is temporary. ;;; The previous default behavior is dangerous for people who believe this way. ;;; It made sense only for people who believe the object is real ;;; and the source file temporary. (setq ess-keep-dump-files "always") ;;; (3.4) ess-ask-for-ess-directory ;;; If t, will ask for the directory to use. If nil, assumes the ;;; default (usually, the users home directory...). ;;now rather in ./ess-custom.el : (setq ess-ask-for-ess-directory t) ;;; (3.5) ess-directory default (correlated with above) ;;; The default location for running the subprocess is configurable. ;;; By default, that is the default-directory (a lisp variable which ;;; initially contains the directory from which the inferior ESS ;;; statistical package/process is started). ;;; For example, the following function (added to the pre-run-hook, by ;;; the line following it) will set the default directory to be your ;;; home directory: ;;; ;;(defun ajr:ess-set-directory () ;; "Set ess-directory to home." ;; (setq-default ess-directory (file-name-as-directory (getenv "HOME")))) ;;(add-hook 'ess-pre-run-hook 'ajr:ess-set-directory) ;;; ;;; If you replace the setq-default line with: ;;; ;; (setq-default ess-directory (file-name-as-directory ;; (concat (getenv "HOME") "/ess/"))) ;;; ;;; then it will always start up in the directory "ess" in your home ;;; directory. ;;; ;;; The default is to have ess to start up in the current buffer's ;;; directory (the one in which you started the inferior ESS ;;; statistical package/process). This is obtained ;;; by setting ess-directory to nil, i.e. ;; (setq-default ess-directory nil) ; this is the default. (when ess-microsoft-p (add-hook 'ess-post-run-hook (lambda() (when (string= ess-dialect "R") (ess-eval-linewise "options(chmhelp=FALSE, help_type=\"text\")" nil nil nil 'wait))))) ;;; 3.6 Example of formatting changes ;;; Formatting and indentation patterns are defined in ess-custom.el, please ;;; see ess-custom.el for exact definitions of these variable settings. ;;; To change them (eg, follow changes suggested by Terry Therneau), ;;; you need one or both of the following lines: ;;; ;;(setq ess-indent-with-fancy-comments nil) ;;(setq ess-default-style 'CLB) ;;; 4.0 SAS configuration ;;; Beginning with ESS 5.1.13, we have editing options in SAS-mode. ;;; The default behavior is as it was in prior releases. ;;; ;;; There are two sets of alternatives. ;;; 1. Editing SAS-mode files. ;;; 1a. Default: TAB is bound to sas-indent-line. ;;; Current line is correctly indented as SAS code. Equivalent to ;;;(setq ess-sas-edit-keys-toggle nil) ;; default TAB in sas-mode ;;; 1b. Optional: TAB is bound to tab-to-tab-stop and inserts up to 4 ;;; columns at a time. C-TAB moves backwards and deletes characters ;;; up to 4 columns at a time. ;;; The following line is for the optional behavior. ;;;(setq ess-sas-edit-keys-toggle t) ;; optional TAB and C-TAB in sas-mode ;;; Use the function call (ess-sas-edit-keys-toggle) ;;; to change the setting after the first SAS-mode buffer has been created. ;;; 1c. You can also define C-TAB in all modes by Option 2b (below). ;;; ;;; 2. Managing submitted SAS jobs with function keys. ;;; 2a. Default: To define the function keys in ESS[SAS] mode only, ;;; you will need, at most, one of the following two lines. ;;;(setq ess-sas-local-unix-keys t) ;; F2-F12 bound in ESS[SAS] mode ;;;(setq ess-sas-local-pc-keys t) ;; F2-F12 bound in ESS[SAS] mode ;;; ;;; 2b. Options: To define the function keys in all modes, ;;; you will need, at most, one of the following two lines. ;;;(setq ess-sas-global-unix-keys t) ;; F2-F12 bound in all modes ;;;(setq ess-sas-global-pc-keys t) ;; F2-F12 bound in all modes ;;; ;;; 3. If it is more convenient to have "*Async Shell Command*" ;;; in same-window-buffer-names, then: ;;;(ess-same-window-async) ;;; ;;;(defvar sas-program "sas" "*Name of program which runs sas.") ;;; ;;;(defvar sas-indent-width 4 "*Amount to indent sas statements") (ess-message "[ido:]") (if (featurep 'emacs) (require 'ido nil t)) ; Local variables section (ess-message "[ess-site:] *very* end ...") ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-site.el ends here ess/lisp/ess-sp6-d.el0000664000175000017500000002617412423756516012763 0ustar eddedd;;; ess-sp6-d.el --- S-Plus 6 & 7 & 8 customization ;; Copyright (C) 2001--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 2001/02/06 ;; Maintainer: ESS Core Team ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; AJR copied S+5 to be S+6. ;; AJR copied S4 to be S+5. ;; DB contributed the changes from ess-sp3-d.el to ;; ess-s4-d.el. (removed the old ugly approach). ;; This file defines Sp5 customizations for ess-mode. Lots of thanks ;; to RMH and JMC for code and suggestions ;; Thanks to MM for making this sensible. ;;; Code: (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (require 'ess-s-l) ;; You now need to make sure you've defined if you are running 5.0 or 5.1. ;; Lots of things are broken between them, GRR... (defun S+-directory-p (directory) "Splus 5++ directories have a .Data directory and a __Meta directory within." (and directory (file-directory-p (concat directory ".Data")) (file-directory-p (concat directory ".Data/__Meta")))) (defvar S+-directory-function (lambda () (if (S+-directory-p default-directory) default-directory (or ess-directory default-directory)))) (defvaralias 'S+6-setup-directory-function 'S+-setup-directory-function) (defvar S+-setup-directory-function (lambda (startdir) (when (and startdir (S+-directory-p startdir)) (setenv "S_WORK" (if (getenv "S_WORK") (concat startdir ":" (getenv "S_WORK")) ;;(message "adding %s to S_WORK" startdir) startdir))))) (defvaralias 'S+6-customize-alist 'S+-customize-alist) (defvar S+-customize-alist (append '((ess-local-customize-alist . 'S+-customize-alist) (ess-dialect . S+-dialect-name) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-sp6-namedb.el") (inferior-ess-program . inferior-S+-program-name) (inferior-ess-help-command . "help(\"%s\", pager=\"slynx -dump\", window=FALSE)\n") (inferior-ess-help-filetype . nil) (inferior-ess-search-list-command . "searchPaths()\n") (ess-directory-function . S+-directory-function) (ess-setup-directory-function . S+-setup-directory-function) (inferior-ess-start-args . inferior-S+-start-args) (ess-STERM . "iESS") ) S+common-cust-alist) "Variables to customize for S+.") (defvar ess-S+-post-run-hook nil "Functions run in process buffer after the initialization of S+ process.") (defalias 'S+6 'S+) (defun S+ (&optional proc-name) "Call 'Splus6', based on S version 4, from Bell Labs. New way to do it." (interactive) (setq ess-customize-alist S+-customize-alist) (ess-write-to-dribble-buffer (format "\n(S+): ess-dialect=%s, buf=%s\n" ess-dialect (current-buffer))) (inferior-ess) (ess-command ess-S+--injected-code) (if inferior-ess-language-start (ess-eval-linewise inferior-ess-language-start)) (with-ess-process-buffer nil (run-mode-hooks 'ess-S+-post-run-hook))) (defvar ess-S+--injected-code ".ess_funargs <- function(funname){ ## funname <- deparse(substitute(object)) fun <- try(eval(parse(text=funname)), silent = TRUE) if(is.function(fun)) { special <- grepl('[:$@[]', funname) args <- args(fun) fmls <- formals(args) fmls.names <- names(fmls) fmls <- gsub('\\\"', '\\\\\\\"', as.character(fmls), fixed = TRUE) args.alist <- sprintf(\"'(%s)\", paste(\"(\\\"\", fmls.names, \"\\\" . \\\"\", fmls, \"\\\")\", sep = '', collapse = ' ')) ## envname <- environmentName(environment(fun)) envname <- if (special) '' else 'S+' cat(sprintf('(list \\\"%s\\\" %s )\\n', envname, args.alist)) } } ") (defalias 'S+6-mode 'S+-mode) (defun S+-mode (&optional proc-name) "Major mode for editing S+ source. See `ess-mode' for more help." (interactive) (setq ess-customize-alist S+-customize-alist) (ess-mode S+-customize-alist proc-name) (if (fboundp 'ess-add-toolbar) (ess-add-toolbar)) (if ess-imenu-use-S (ess-imenu-S))) (defalias 'S+6-transcript-mode 'S+-transcript-mode) (defun S+-transcript-mode () "S-PLUS 6 transcript mode." (interactive) (ess-transcript-mode S+-customize-alist)) (defvar ess-s-versions-list nil "List of other versions of S to add to ESS. Each element of this list is itself a list: \(FUNCTION PATH ARGS\) e.g. \(\"mysplus\" \"/usr/splus7/bin/splus7\" \"-j\"\) FUNCTION is the name of the function to be created by Emacs. PATH is the full path to the variant of S that you want to run. ARGS (optional) are start-up arguments that you want to pass to S. ") (defvar ess-s-versions '("Splus") "List of partial strings for versions of S to access within ESS. Each string specifies the start of a filename. If a filename beginning with one of these strings is found on `exec-path', a M-x command for that version of S is made available. For example, if the file \"Splus7\" is found and this variable includes the string \"Splus\", a function called `M-x Splus7' will be available to run that version of S. If duplicate versions of the same program are found (which happens if the same path is listed on `exec-path' more than once), they are ignored by calling `ess-uniq-list'. Set this variable to nil to disable searching for other versions of S using this method. If you set this variable, you need to restart Emacs (and set this variable before ess-site is loaded) for it to take effect. See also `ess-s-versions-list' for another way to add other S processes to ESS. ") (defun ess-s-versions-create () "Generate defuns for starting other versions of S. See `ess-s-versions' for strings that determine which functions are created. It assumes these versions of S can be run as a substitute for Splus6. This function returns the list of S defuns, if any, that were created. The defuns will normally be placed on the menubar upon ESS initialisation." ;; This works by creating a temp buffer where the template function is ;; edited so that X.Y is replaced by the version name (let ((template "") (template-args) (beg) (versions) (version) (eval-buf (get-buffer-create "*ess-temp-s-evals*")) (ess-s-versions-created) (ess-s-versions-list ess-s-versions-list) ;; make local copy so it won't be destroyed globally ) ;; ;; This is the template function used for creating M-x Splus (setq template "(defun S-X.Y () \"Call S-X.Y, i.e., the S version 'S-X.Y' using ESS. This function was generated by `ess-s-versions-create'.\" (interactive \"\") (let ((inferior-S+-program-name \"S-X.Y\")) (S+))) ") (with-current-buffer eval-buf ;; clear the buffer. (delete-region (point-min) (point-max)) (when ess-s-versions ;; Find which versions of S we want. Remove the pathname, leaving just ;; the name of the executable. (setq versions (ess-uniq-list (mapcar 'file-name-nondirectory (apply 'nconc (mapcar 'ess-find-exec-completions ess-s-versions))))) (ess-write-to-dribble-buffer (format "(S): ess-s-versions-create making M-x defuns for \n %s\n" (mapconcat 'identity versions "\n "))) (setq ess-s-versions-created versions) ;keep copy for returning at end. ;; Iterate over each string in VERSIONS, creating a new defun each time. (while versions (setq version (car versions) versions (cdr versions)) (setq beg (point)) (insert template) (goto-char beg) (while (search-forward "S-X.Y" nil t) (replace-match version t t)) (goto-char (point-max)) )) ;; Check if we have any static defuns to evaluate. (when ess-s-versions-list ;; Need a slightly different template for static defuns. (setq template "(defun S-X.Y () \"Call S-X.Y, i.e., the S version 'S-X.Y' using ESS. This function will run S-FULL-PATH This function was generated by `ess-s-versions-create'.\" (interactive \"\") (let ((inferior-S+-program-name \"S-FULL-PATH\")) (S+))) ") ;; need another version of template, with args. (setq template-args "(defun S-X.Y () \"Call S-X.Y, i.e., the S version 'S-X.Y' using ESS. This function will run S-FULL-PATH This function was generated by `ess-s-versions-create'.\" (interactive \"\") (let ((inferior-S+-program-name \"S-FULL-PATH\") (inferior-S+-start-args \"S-MYARGS\")) (S+))) ") (while ess-s-versions-list (let* ((this-S-version (car ess-s-versions-list)) (S-defun (nth 0 this-S-version)) (S-path (nth 1 this-S-version)) (S-args (nth 2 this-S-version))) (setq ess-s-versions-list (cdr ess-s-versions-list)) ;; Could do error checking here, that S-defun is not defined ;; before, and that S-path is valid. (setq beg (point)) (insert (if S-args template-args template)) (goto-char beg) (while (search-forward "S-X.Y" nil t) (replace-match S-defun t t)) (goto-char beg) (while (search-forward "S-FULL-PATH" nil t) (replace-match S-path t t)) (when S-args (goto-char beg) (while (search-forward "S-MYARGS" nil t) (replace-match S-args t t))) (goto-char (point-max)) (add-to-list 'ess-s-versions-created S-defun 'append)))) ;; buffer has now been created with defuns, so eval them! (eval-buffer) (kill-buffer eval-buf); < comment this for debugging ess-s-versions-created))) ; Provide package (provide 'ess-sp6-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sp6-d.el ends here ess/lisp/ess-arc-d.el0000664000175000017500000000610212423756516013005 0ustar eddedd;;; ess-arc-d.el --- ARC customization ;; Copyright (C) 2000 A. J. Rossini ;; Copyright (C) 2001--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 30 Jun 2000 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file extends the XLispStat configuration for ARC, the extension of the ;; R-Code. ;;; Code: (require 'ess-lsp-l) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (defvar ARC-customize-alist '((ess-customize-alist . ARC-customize-alist ) (ess-language . "XLS" ) (ess-dialect . "ARC" ) (ess-loop-timeout . ess-XLS-loop-timeout) (ess-object-name-db-file . "ess-xls-namedb.el" ) (ess-help-sec-regex . " ") (ess-help-sec-keys-alist . " ") (inferior-ess-primary-prompt . "> ?" ) (comint-use-prompt-regexp . t) (inferior-ess-program . inferior-ARC-program-name) (inferior-ess-help-command . "(help '%s)\n" ) (inferior-ess-objects-command . "(variables)\n" ) (inferior-ess-exit-command . "(exit)\n" ) ;;(inferior-ess-start-args . nil) (inferior-ess-start-file . nil)) ; "~/.ess-ARC") "Variables to customize for ARC, a dialect of XLS.") (defun ARC-mode (&optional proc-name) "Major mode for editing ARC source. NOT EVEN STARTED." (interactive) (setq ess-customize-alist ARC-customize-alist) (lisp-mode)) (defun ARC () "Call 'ARC', the extend XLispStat statistical system, from Forrest Young." (interactive) (setq ess-customize-alist ARC-customize-alist) (ess-write-to-dribble-buffer (format "(ARC): ess-dialect=%s , buf=%s\n" ess-dialect (current-buffer))) (inferior-ess)) (fset 'arc 'ARC) ; Provide package (provide 'ess-arc-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-arc-d.el ends here ess/lisp/ess-gretl.el0000664000175000017500000006226012423756516013143 0ustar eddedd;; ess-gretl.el --- ESS gretl mode and inferior interaction ;; ;; Copyright (C) 2012 Allin Cottrell ;; Copyright (C) 2012 Ahmadou DICKO ;; Copyright (C) 2013 ESS core team ;; ;; Filename: ess-gretl.el ;; Author: Ahmadou DICKO, Spinu Vitalie and Allin Cottrell (based on ess-julia.el and gretl.el) ;; Maintainer: Ahmadou DICKO ;; Created: 01-10-2012 (ESS 12.09) ;; Keywords: ESS, gretl, econometrics ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; This file is *NOT* part of GNU Emacs. ;; This file is *NOT YET* part of ESS ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, any later version. ;; ;; This program is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ;; details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; start the inferior with M-x gretl. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (require 'compile); for compilation-* below ;;; Code: (defvar gretl-mode-hook nil) (add-to-list 'auto-mode-alist '("\\.inp$" . gretl-mode)) (defvar gretl-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?_ "w" table) ; underscores in words (modify-syntax-entry ?@ "w" table) (modify-syntax-entry ?# "<" table) ; # single-line comment start (modify-syntax-entry ?\n ">" table) ; \n single-line comment end (modify-syntax-entry ?\{ "(} " table) (modify-syntax-entry ?\} "){ " table) (modify-syntax-entry ?\[ "(] " table) (modify-syntax-entry ?\] ")[ " table) (modify-syntax-entry ?\( "() " table) (modify-syntax-entry ?\) ")( " table) (modify-syntax-entry ?\r " " table) (modify-syntax-entry ?+ "." table) (modify-syntax-entry ?- "." table) (modify-syntax-entry ?= "." table) (modify-syntax-entry ?* "." table) (modify-syntax-entry ?/ "." table) (modify-syntax-entry ?> "." table) (modify-syntax-entry ?< "." table) (modify-syntax-entry ?& "." table) (modify-syntax-entry ?| "." table) (modify-syntax-entry ?! "." table) (modify-syntax-entry ?\\ "\\" table) (modify-syntax-entry ?\' "." table) (modify-syntax-entry ?\` "w" table) (modify-syntax-entry ?\" "\"" table) (modify-syntax-entry ?. "w" table) (modify-syntax-entry ?_ "w" table) (modify-syntax-entry ?\% "." table) (modify-syntax-entry ?\# "<" table) (modify-syntax-entry ?\n ">" table) table) "Syntax table for `gretl-mode'.") ;; syntax table that holds within strings (defvar gretl-mode-string-syntax-table (let ((table (make-syntax-table))) table) "Syntax table for `gretl-mode' that holds within strings.") (defcustom gretl-continuation-offset 4 "*Extra indentation applied to Gretl continuation lines." :type 'integer :group 'ess-gretl) (defvar gretl-continuation-regexp "[^#%\n]*\\(\\\\\\|\\.\\.\\.\\)\\s-*\\(\\s<.*\\)?$") (defcustom gretl-continuation-string "\\" "*Character string used for Gretl continuation lines. Normally \\." :type 'string :group 'ess-gretl) ;; (defconst gretl-string-regex ;; "\"[^\"]*?\\(\\(\\\\\\\\\\)*\\\\\"[^\"]*?\\)*\"") (defconst gretl-function-header-regexp (concat "^\\s-*\\<\\(function\\)\\>" "\\([^=;\n]*=[ \t]*\\|[ \t]*\\)\\(\\w+\\)\\>") "Regexp to match a Gretl function header. The string `function' and its name are given by the first and third parenthetical grouping.") ;; (defconst ess-function-call-regexp ;; "\\s\"?\\(\\(\\sw\\|\\s_\\)+\\(<-\\)?\\)\\s\"?*\\s-*(" ;; "Regexp for function names") (defvar gretl-command-words '("add" "adf" "anova" "append" "ar" "ar1" "arbond" "arch" "arima" "biprobit" "break" "boxplot" "chow" "clear" "coeffsum" "coint" "coint2" "corr" "corrgm" "cusum" "data" "dataset" "delete" "diff" "difftest" "discrete" "dpanel" "dummify" "duration" "elif" "else" "end" "endif" "endloop" "eqnprint" "equation" "estimate" "fcast" "foreign" "fractint" "freq" "function" "funcerr" "garch" "genr" "gmm" "gnuplot" "graphpg" "hausman" "heckit" "help" "hsk" "hurst" "if" "include" "info" "intreg" "kalman" "kpss" "labels" "lad" "lags" "ldiff" "leverage" "levinlin" "logistic" "logit" "logs" "loop" "mahal" "makepkg" "meantest" "mle" "modeltab" "modprint" "modtest" "mpols" "negbin" "nls" "normtest" "nulldata" "ols" "omit" "open" "orthdev" "outfile" "panel" "pca" "pergm" "textplot" "poisson" "print" "printf" "probit" "pvalue" "quantreg" "qlrtest" "qqplot" "quit" "rename" "reset" "restrict" "rmplot" "run" "runs" "scatters" "sdiff" "set" "setinfo" "setobs" "setmiss" "shell" "smpl" "spearman" "sprintf" "square" "sscanf" "store" "summary" "system" "tabprint" "tobit" "tsls" "var" "varlist" "vartest" "vecm" "vif" "wls" "xcorrgm" "xtab" "debug" "return" "catch" "for" "foreach" "funcerr" "return" "while" "elif" "const" "3sls" "liml" "fiml" "sur" "params" "deriv" "orthog" "weights" "series" "scalar" "genr") "Commands in Gretl (these names are also reserved).") (defvar gretl-genr-functions '("abs" "sin" "cos" "tan" "asin" "acos" "atan" "sinh" "cosh" "tanh" "asinh" "acosh" "atanh" "log" "ln" "log10" "log2" "exp" "sqrt" "diff" "ldiff" "sdiff" "lags" "int" "round" "ceil" "floor" "sort" "dsort" "sortby" "ranking" "orthdev" "nobs" "firstobs" "lastobs" "uniform" "normal" "cum" "missing" "ok" "misszero" "lrvar" "quantile" "median" "gini" "zeromiss" "sum" "mean" "min" "max" "sd" "var" "sst" "cnorm" "dnorm" "qnorm" "gammafun" "lngamma" "digamma" "resample" "pnobs" "pmin" "pmax" "pmean" "psd" "hpfilt" "bkfilt" "bwfilt" "fracdiff" "boxcox" "cov" "corr" "movavg" "I" "zeros" "ones" "seq" "replace" "muniform" "mnormal" "sumc" "sumr" "meanc" "meanr" "sdc" "minc" "maxc" "minr" "maxr" "iminc" "imaxc" "iminr" "imaxr" "fft" "ffti" "cmult" "cdiv" "mcov" "mcorr" "mxtab" "cdemean" "cholesky" "psdroot" "inv" "invpd" "ginv" "diag" "transp" "vec" "vech" "unvech" "upper" "lower" "rows" "cols" "det" "ldet" "tr" "onenorm" "infnorm" "rcond" "rank" "qform" "mlag" "qrdecomp" "eigensym" "eigengen" "nullspace" "princomp" "mexp" "fdjac" "BFGSmax" "obsnum" "isseries" "isscalar" "islist" "isstring" "isnull" "nelem" "pdf" "cdf" "invcdf" "pvalue" "critical" "randgen" "urcpval" "values" "mshape" "svd" "mols" "mpols" "mrls" "mread" "mwrite" "selifc" "selifr" "polroots" "dummify" "wmean" "wvar" "wsd" "xpx" "filter" "kfilter" "ksmooth" "ksimul" "trimr" "getenv" "argname" "obslabel" "readfile" "grab" "strstr" "strncmp" "strlen" "sscanf" "varname" "varnum" "tolower" "colnames" "rownames" "ljungbox" "msortby" "lincomb" "imhof" "toepsolv" "diagcat" "xmin" "xmax" "corrgm" "mcovg" "fcstats" "bessel" "fraclag" "mreverse" "deseas" "pergm" "irr" "npv" "logistic" "weekday" "kdensity" "monthlen" "epochday" "setnote" "invmills" "polyfit" "chowlin" "varsimul" "strsplit" "inlist" "errmsg" "isconst" "irf" "inbundle") "Builtin functions for Gretl's genr command.") (defvar gretl-option-flags '("addstats" "all" "anova" "append" "arch" "arma-init" "asymptotic" "autocorr" "auto" "autocorr" "auxiliary" "balanced" "bartlett" "between" "bootstrap" "both" "breusch-pagan" "byobs" "by" "c" "close" "coded" "cols" "column" "comfac" "complete" "conditional" "contiguous" "continue" "continuous" "control" "covariance" "cross" "cross-section" "crt" "csv" "ct" "ctt" "cubes-only" "dat" "database" "dataset" "db" "degrees" "dhansen" "difference" "diffuse" "discrete" "dpdstyle" "drop-empty" "drop-first" "drop-last" "dummy" "dynamic" "equal" "exit" "exponential" "fcp" "fixed-effects" "from-file" "full" "func" "gamma" "geomean" "gls" "gmm" "gnu-R" "gnu-octave" "gph" "gzipped" "hausman-reg" "hessian" "hilu" "impulse-responses" "input" "inst" "integrate" "intervals" "inverse-fit" "iterate" "jackknife" "jbera" "jitter" "jmulti" "kendall" "lags" "lagselect" "lbfgs" "lillie" "liml" "linear-fit" "list" "loess-fit" "log" "loglogistic" "lognormal" "logs" "matrix" "matrix-diff" "medians" "ml" "model1" "multi" "multinomial" "nc" "next" "no-corc" "no-dates" "no-df-corr" "no-gradient-check" "no-header" "no-missing" "no-scaling" "no-stats" "normal" "normality" "notches" "numerical" "odbc" "omit-obs" "one-scale" "opg" "orthdev" "other" "out-of-sample" "output" "overwrite" "p-values" "panel" "panel-vars" "plot" "pooled" "preserve" "print-final" "progress-bar" "progressive" "pwe" "quadratic-fit" "quiet" "quit" "radians" "random" "random-effects" "rank-sum" "raw" "rc" "replace" "restrict" "restructure" "reverse" "robust" "rolling" "row" "rtf" "save" "save-all" "save-ehat" "save-xbeta" "scalars" "seasonals" "send-data" "sign" "signed-rank" "silent" "simple" "simple-print" "single-yaxis" "skip-df" "spearman" "special-time-series" "squares" "squares-only" "stacked-cross-section" "stacked-time-series" "static" "stdresid" "suppress-fitted" "swilk" "system" "t-ratios" "tall" "test-down" "tex" "time-dummies" "time-series" "to-file" "to_file" "traditional" "trend" "two-step" "unequal-vars" "uniform" "unit-weights" "variance-decomp" "vcv" "verbose" "wald" "weibull" "weights" "white" "white-nocross" "with-impulses" "with-lines" "write" "www" "x-12-arima" "y-diff-only" "z-scores" "zeros") "Gretl option flags.") (defvar gretl-internal-vars '("Fstat" "T" "ahat" "aic" "bic" "chisq" "coeff_ci" "coeff" "compan" "datatype" "df" "dwpval" "ec" "ehat" "error" "ess" "fcast" "fcerr" "gmmcrit" "hausman" "hqc" "h" "jalpha" "jbeta" "jvbeta" "kalman_llt" "kalman_lnl" "kalman_s2" "kalman_t" "kalman_uhat" "llt" "lnl" "mnlprobs" "ncoeff" "nobs" "nscan" "nvars" "obs" "pd" "pvalue" "rho" "rlnl" "rsq" "s00" "s01" "s11" "sample" "sargan" "sigma" "stderr" "stopwatch" "sysA" "sysB" "sysGamma" "t1" "t2" "test" "trsq" "uhat" "unit" "vcv" "version" "vma" "windows" "xlist" "xtxinv" "yhat" ) "Model- and dataset-related variables.") (defconst gretl-block-start-keywords (list "loop" "foreign" "function" "gmm" "if" "system" "mle" "nls" "restrict")) (defconst gretl-block-other-keywords (list "else" "elif")) (defconst gretl-block-end-keywords (list "end" "endif" "endloop")) (defvar gretl-keywords (append gretl-block-start-keywords gretl-block-other-keywords gretl-block-end-keywords '("break")) "Reserved words in Gretl.") (defun gretl-at-keyword (kw-list) ; not a keyword if used as a field name, X.word, or quoted, :word (and (or (= (point) 1) (and (not (equal (char-before (point)) ?.)) (not (equal (char-before (point)) ?:)))) (not (ess-inside-string-or-comment-p (point))) (not (ess-inside-brackets-p (point))) (member (current-word) kw-list))) (defconst gretl-font-lock-defaults (list ;; Fontify all builtin keywords. (cons (concat "\\<\\(" (mapconcat 'identity gretl-keywords "\\|") "\\)\\>") 'font-lock-keyword-face) ;; Fontify all option flags. (cons (concat "[ \t]--\\(" (mapconcat 'identity gretl-option-flags "\\|") "\\)") 'font-lock-constant-face) ;; Fontify all command words. (cons (concat "\\<\\(" (mapconcat 'identity gretl-command-words "\\|") "\\)\\>") 'font-lock-builtin-face) ;; Fontify all builtin operators. (cons "\\(&\\||\\|<=\\|>=\\|==\\|<\\|>\\|!=\\|!\\)" (if (boundp 'font-lock-builtin-face) 'font-lock-builtin-face 'font-lock-preprocessor-face)) ;; Fontify all internal variables. (cons (concat "\\$\\(" (mapconcat 'identity gretl-internal-vars "\\|") "\\)\\>") 'font-lock-variable-name-face) ;; Fontify all genr functions. (cons (concat "\\<\\(" (mapconcat 'identity gretl-genr-functions "\\|") "\\)\\>") 'font-lock-variable-name-face) ;; Fontify all function declarations. (list gretl-function-header-regexp '(1 font-lock-keyword-face) '(3 font-lock-function-name-face nil t))) "Additional Gretl expressions to highlight.") (defvar gretl-block-begin-regexp (concat "\\<\\(" (mapconcat 'identity gretl-block-start-keywords "\\|") "\\)\\>")) (defvar gretl-block-else-regexp (concat "\\<\\(" (mapconcat 'identity gretl-block-other-keywords "\\|") "\\)\\>")) (defvar gretl-block-end-regexp (concat "\\<\\(" (mapconcat 'identity gretl-block-end-keywords "\\|") "\\)\\>")) (defvar gretl-block-begin-or-end-regexp (concat gretl-block-begin-regexp "\\|" gretl-block-end-regexp)) (defvar gretl-block-else-or-end-regexp (concat gretl-block-else-regexp "\\|" gretl-block-end-regexp)) (defvar gretl-block-match-alist '(("loop" . ("endloop")) ("if" . ("else" "elif" "endif")) ("nls" . ("end")) ("mle" . ("end")) ("gmm" . ("end")) ("foreign" . ("end")) ("restrict" . ("end")) ("kalman" . ("end")) ("system" . ("end"))) "Alist with Gretl's matching block keywords. Has Gretl's begin keywords as keys and a list of the matching else or end keywords as associated values.") ; get the position of the last open block (defun gretl-last-open-block-pos (min) (let ((count 0)) (while (not (or (> count 0) (<= (point) min))) (backward-word 1) (setq count (cond ((gretl-at-keyword gretl-block-start-keywords) (+ count 1)) ((and (zerop (string-match "\\(?:e\\(?:l\\(?:if\\|se\\)\\|nd\\(?:if\\|loop\\)?\\)\\)" (current-word))) (not (ess-inside-comment-p)) (not (ess-inside-brackets-p))) (- count 1)) (t count)))) (if (> count 0) (point) nil))) (defun gretl-last-open-block (min) (let ((pos (gretl-last-open-block-pos min))) (and pos (progn (goto-char pos) (+ gretl-basic-offset (current-indentation)))))) ; return indent implied by a special form opening on the previous line, if any (defun gretl-form-indent () (forward-line -1) (end-of-line) (backward-sexp) (if (gretl-at-keyword gretl-block-other-keywords) (+ gretl-basic-offset (current-indentation)) (if (char-equal (char-after (point)) ?\() (progn (backward-word 1) (let ((cur (current-indentation))) (if (gretl-at-keyword gretl-block-start-keywords) (+ gretl-basic-offset cur) nil))) nil))) (defun gretl-indent-line () "Indent current line of gretl code" (interactive) ; (save-excursion (end-of-line) (indent-line-to (or (and (ess-inside-string-p (point-at-bol)) 0) (save-excursion (ignore-errors (gretl-form-indent))) (save-excursion (let ((endtok (progn (beginning-of-line) (forward-to-indentation 0) (gretl-at-keyword gretl-block-end-keywords)))) (ignore-errors (+ (gretl-last-open-block (point-min)) (if endtok (- gretl-basic-offset) 0))))) ;; previous line ends in = (save-excursion (if (and (not (equal (point-min) (line-beginning-position))) (progn (forward-line -1) (end-of-line) (backward-char 1) (equal (char-after (point)) ?=))) (+ gretl-basic-offset (current-indentation)) nil)) ;; take same indentation as previous line (save-excursion (forward-line -1) (current-indentation)) 0)) (when (gretl-at-keyword gretl-block-end-keywords) (forward-word 1))) (defvar gretl-editing-alist '((paragraph-start . (concat "\\s-*$\\|" page-delimiter)) (paragraph-separate . (concat "\\s-*$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (require-final-newline . mode-require-final-newline) (comment-start . "# ") (comment-add . 1) (comment-start-skip . "\\s<+\\s-*") (comment-column . 40) ;;(comment-indent-function . 'S-comment-indent) ;;(ess-comment-indent . 'S-comment-indent) ;;(ess-indent-line . 'S-indent-line) (ess-calculate-indent . 'ess-calculate-indent) (ess-indent-line-function . 'gretl-indent-line) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) ;; ignored (ess-local-process-name . nil) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . gretl-syntax-table) ;; (add-log-current-defun-header-regexp . "^.*function[ \t]*\\([^ \t(]*\\)[ \t]*(") (font-lock-defaults . '(gretl-font-lock-defaults)) ) "General options for gretl source files.") (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") ;; (defun gretl-send-string-function (process string visibly) ;; (let ((gretl-process (get-process "gretlcli"))) ;; (process-send-string process (format ess-load-command file))) ;; (defun gretl-send-string-function (process string visibly) ;; (let ((file (concat temporary-file-directory "gretl_eval_region.inp"))) ;; (with-temp-file file ;; (insert string)) ;; (process-send-string process (format ess-load-command file)))) (defun gretl--get-words-from-command (command start-reg end-reg) (with-current-buffer (ess-command command) (goto-char (point-min)) (let ((beg (or (re-search-forward start-reg nil t) (point-min))) (end (progn (goto-char (point-max)) (or (re-search-backward end-reg) (point-max)))) acum) (goto-char beg) (skip-chars-forward "\n") (while (re-search-forward "[^ \t\n]+" end t) (push (match-string-no-properties 0) acum)) acum))) (defun gretl-get-help-topics-function (name) (delete-dups (append gretl-command-words gretl-genr-functions gretl-block-end-keywords gretl-block-other-keywords gretl-block-start-keywords (gretl--get-words-from-command "help\n" "are:" "^For") (gretl--get-words-from-command "help functions\n" "Accessors:" "^Functions") (gretl--get-words-from-command "help functions\n" "^Functions" "^For") ))) ;; (defvar ess-gretl-error-regexp-alist '(gretl-in gretl-at) ;; "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.") ;; (add-to-list 'compilation-error-regexp-alist-alist ;; '(gretl-in "^\\s-*in [^ \t\n]* \\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) ;; (add-to-list 'compilation-error-regexp-alist-alist ;; '(gretl-at "^\\s-*\\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) (defvar gretl-customize-alist '((comint-use-prompt-regexp . t) (inferior-ess-primary-prompt . "\\? ") (inferior-ess-secondary-prompt . "\\ ") (inferior-ess-prompt . "\\? ") (ess-local-customize-alist . 'gretl-customize-alist) (inferior-ess-program . "gretlcli") (inferior-ess-font-lock-defaults . gretl-font-lock-defaults) (ess-get-help-topics-function . 'gretl-get-help-topics-function) (ess-load-command . "open \"%s\"\n") ;; (ess-dump-error-re . "in \\w* at \\(.*\\):[0-9]+") ;; (ess-error-regexp . "\\(^\\s-*at\\s-*\\(?3:.*\\):\\(?2:[0-9]+\\)\\)") ;; (ess-error-regexp-alist . ess-gretl-error-regexp-alist) (ess-send-string-function . 'gretl-send-string-function) ;; (inferior-ess-objects-command . inferior-gretl-objects-command) ;; (inferior-ess-search-list-command . "search()\n") ;; inferior-ess-help-command . gretl-help-command) (inferior-ess-help-command . "help %s\n") (ess-language . "gretl") (ess-dialect . "gretl") (ess-suffix . "inp") (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-mode-syntax-table . gretl-syntax-table) (ess-mode-editing-alist . gretl-editing-alist) (ess-change-sp-regexp . nil );ess-R-change-sp-regexp) (ess-help-sec-regex . ess-help-R-sec-regex) (ess-help-sec-keys-alist . ess-help-R-sec-keys-alist) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-cmd-delay . ess-R-cmd-delay) (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-r-namedb.el" ) ;; (ess-imenu-mode-function . nil) (ess-smart-operators . ess-R-smart-operators) (inferior-ess-help-filetype . nil) (inferior-ess-exit-command . "exit\n") ;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help? (inferior-ess-start-file . nil) ;; "~/.ess-R" (inferior-ess-start-args . "") (inferior-ess-language-start . nil) (ess-STERM . "iESS") ) "Variables to customize for Gretl -- set up later than emacs initialization.") ;; (defcustom inferior-gretl-program-name "gretlcli" ;; "*The program to use for running gretl scripts." ;; :type 'string ;; :group 'ess-gretl) ;; (defvar ess-gretl-versions '("gretcli") ;; "List of partial strings for versions of Julia to access within ESS. ;; Each string specifies the start of a filename. If a filename ;; beginning with one of these strings is found on `exec-path', a M-x ;; command for that version of Julia is made available. ") (defcustom inferior-gretl-args "" "String of arguments used when starting gretl. These arguments are currently not passed to other versions of gretl that have been created using the variable `ess-r-versions'." :group 'ess-gretl :type 'string) (defvar gretl-basic-offset 4) ;;;###autoload (defun gretl-mode (&optional proc-name) "Major mode for editing gretl source. See `ess-mode' for more help." (interactive "P") ;; (setq ess-customize-alist gretl-customize-alist) ;;(setq imenu-generic-expression R-imenu-generic-expression) (ess-mode gretl-customize-alist proc-name) ;; for emacs < 24 ;; (add-hook 'comint-dynamic-complete-functions 'ess-complete-object-name nil 'local) ;; for emacs >= 24 ;; (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first ;; (add-hook 'completion-at-point-functions 'ess-object-completion nil 'local) ;; (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (if (fboundp 'ess-add-toolbar) (ess-add-toolbar)) (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function) ;; (local-set-key "\t" 'gretl-indent-line) ;; temp workaround ;; (set (make-local-variable 'indent-line-function) 'gretl-indent-line) ;; (ess-imenu-gretl) (run-hooks 'gretl-mode-hook)) (defvar ess-gretl-post-run-hook nil "Functions run in process buffer after the initialization of Gretl process.") ;;;###autoload (defun gretl (&optional start-args) "Call 'gretl', Optional prefix (C-u) allows to set command line arguments, such as --vsize. This should be OS agnostic. If you have certain command line arguments that should always be passed to gretl, put them in the variable `inferior-gretl-args'." (interactive "P") ;; get settings, notably inferior-R-program-name : ;; (if (null inferior-gretl-program-name) ;; (error "'inferior-gretl-program-name' does not point to 'gretl-release-basic' executable") (setq ess-customize-alist gretl-customize-alist) (ess-write-to-dribble-buffer ;; for debugging only (format "\n(Gretl): ess-dialect=%s, buf=%s" ess-dialect (current-buffer))) (let* ((r-start-args (concat inferior-gretl-args " " ; add space just in case (if start-args (read-string (concat "Starting Args [other than `" inferior-gretl-args "'] ? ")) nil)))) (inferior-ess r-start-args) (set (make-local-variable 'indent-line-function) 'gretl-indent-line) (set (make-local-variable 'gretl-basic-offset) 4) (setq indent-tabs-mode nil) (goto-char (point-max)) ;; (if inferior-ess-language-start ;; (ess-eval-linewise inferior-ess-language-start ;; nil nil nil 'wait-prompt))) (with-ess-process-buffer nil (run-mode-hooks 'ess-gretl-post-run-hook)) )) ;;;; IMENU ;; (defvar gretl-imenu-generic-expression ;; '(("Function (_)" "^\\s-*function\\s-+\\(_[^ \t\n]*\\)" 1) ;; ("Function" "^\\s-*function\\s-+\\([^_][^ \t\n]*\\)" 1) ;; ("Const" "^\\s-*const \\([^ \t\n]*\\)" 1) ;; ("Type" "^\\s-*\\w*type\\w* \\([^ \t\n]*\\)" 1) ;; ("Load" " *\\(load\\)(\\([^ \t\n)]*\\)" 2) ;; ;; ("Classes" "^.*setClass(\\(.*\\)," 1) ;; ;; ("Coercions" "^.*setAs(\\([^,]+,[^,]*\\)," 1) ; show from and to ;; ;; ("Generics" "^.*setGeneric(\\([^,]*\\)," 1) ;; ;; ("Methods" "^.*set\\(Group\\|Replace\\)?Method(\"\\(.+\\)\"," 2) ;; ;; ;;[ ]*\\(signature=\\)?(\\(.*,?\\)*\\)," 1) ;; ;; ;; ;; ;; ;;("Other" "^\\(.+\\)\\s-*<-[ \t\n]*[^\\(function\\|read\\|.*data\.frame\\)]" 1) ;; ;; ("Package" "^.*\\(library\\|require\\)(\\(.*\\)," 2) ;; ;; ("Data" "^\\(.+\\)\\s-*<-[ \t\n]*\\(read\\|.*data\.frame\\).*(" 1))) ;; )) ;; (defun ess-imenu-gretl (&optional arg) ;; "Gretl Language Imenu support for ESS." ;; (interactive) ;; (setq imenu-generic-expression gretl-imenu-generic-expression) ;; (imenu-add-to-menubar "Imenu-gretl")) ;; (defun ess-imenu-gretl (&optional arg) ;; "Gretl Language Imenu support for ESS." ;; (interactive) ;; (setq imenu-generic-expression gretl-imenu-generic-expression) ;; (imenu-add-to-menubar "Imenu-jl")) (provide 'ess-gretl) ;; (provide 'ess-gretl) (provide 'ess-gretl) ;;; ess-gretl.el ends here ess/lisp/ess-mouse.el0000664000175000017500000002400212423756516013146 0ustar eddedd;;; ess-mouse.el --- Support for mouse- or cursor-sensitive actions ;; Copyright (C) 2001 Richard M. Heiberger ;; Copyright (C) 2002--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: 25 Mar 2001 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Support for mouse- or cursor-sensitive actions. This is based on ;; and uses mouseme.el. mouseme.el only does mouse sensititivity. ;; The new functions ess-mouse-me and ess-mouse-me-helper do similar ;; things based on the cursor, not the mouse, and can be bound to a ;; keystroke. ;;; Code: ; Requires and autoloads ;;*;; Requires (require 'mouseme) ;;(if (or (equal window-system 'w32) ;; (equal window-system 'win32) ;; (equal window-system 'mswindows)) ;; (require 'essiw32b)) (defun ess-mouse-me () "Popup a menu of functions to run on selected string or region." (interactive) (ess-mouse-me-helper (lambda () (or (x-popup-menu (list '(0 0) (get-buffer-window (get-buffer (buffer-name)))) (funcall mouse-me-build-menu-function name)) (error "No command to run"))))) (defun ess-mouse-me-helper (func) "Determine the string to use to process EVENT and call FUNC to get cmd." (let (name sp sm mouse beg end cmd mmtype) ;; temporarily goto where the event occurred, get the name clicked ;; on and enough info to figure out what to do with it (save-match-data (save-excursion (setq sp (point)) ; saved point (setq sm (mark t)) ; saved mark ;;; (set-buffer (window-buffer (posn-window (event-start event)))) ;;; (setq mouse (goto-char (posn-point (event-start event)))) (setq mouse (point)) ;; ess-mouse-me-helper ;; if there is a region and point is inside it ;; check for sm first incase (null (mark t)) ;; set name to either the thing they clicked on or region (if (and sm (or (and transient-mark-mode mark-active) (eq last-command 'mouse-drag-region)) (>= mouse (setq beg (min sp sm))) (<= mouse (setq end (max sp sm)))) (setq name (buffer-substring beg end)) (setq name (funcall mouse-me-get-string-function)) (if (listp name) (setq beg (nth 1 name) end (nth 2 name) name (car name)) (goto-char mouse) (while (not (looking-at (regexp-quote name))) (backward-char 1)) (setq beg (point)) (setq end (search-forward name)))))) ;; check if name is null, meaning they clicked on no word (if (or (null name) (and (stringp name) (string= name "" ))) (error "No string to pass to function")) ;; popup a menu to get a command to run (setq cmd (funcall func)) ;; run the command, eval'ing if it was a list (if (listp cmd) (setq cmd (eval cmd))) (setq mmtype (get cmd 'mouse-me-type)) (cond ((eq mmtype 'region) (funcall cmd beg end)) ((eq mmtype 'string) (funcall cmd name)) (t (funcall cmd name))))) (defcustom ess-S-mouse-me-menu-commands-alist '("S-Plus 4 and 6 GUI under Windows" ("Edit.data" . ess-mouse-me-Edit.data) "----" ("print" . ess-mouse-me-print) ("summary" . ess-mouse-me-summary) ("plot" . ess-mouse-me-plot) ("show" . ess-mouse-me-show) ("help" . ess-display-help-on-object) ("args" . ess-mouse-me-args) "----" ("Browser on" . ess-mouse-me-browser-on) ("Browser off" . ess-mouse-me-browser-off)) "*Command menu used by `mouse-me-build-menu'. A alist of elements where each element is either a cons cell or a string. If a cons cell the car is a string to be displayed in the menu and the cdr is either a function to call passing a string to, or a list which evals to a function to call passing a string to. If the element is a string it makes a non-selectable element in the menu. To make a separator line use a string consisting solely of hyphens. The function returned from this menu will be called with one string argument. Or if the function has the symbol property `mouse-me-type' and if its value is the symbol `region' it will be called with the beginning and ending points of the selected string. If the value is the symbol `string' it will be called with one string argument." :type '(repeat sexp) :group 'mouseme) (defun ess-mouse-me-Edit.data (string) (ess-mouse-me-eval-expanded string "Edit.data(" ")" nil nil nil)) (defun ess-mouse-me-print (string) (ess-mouse-me-eval-expanded string "" "" nil (ess-ddeclient-p) t)) (defun ess-mouse-me-summary (string) (ess-mouse-me-eval-expanded string "summary(" ")" nil (ess-ddeclient-p) t)) (defun ess-mouse-me-plot (string) (ess-mouse-me-eval-expanded string "plot(" ")") nil nil nil) (defun ess-mouse-me-show (string) (ess-mouse-me-eval-expanded string "show(" ")") nil nil nil) (defun ess-mouse-me-args (string) (ess-mouse-me-eval-expanded string "args(" ")" nil (ess-ddeclient-p) t)) (defun ess-mouse-me-browser-on (string) (if (equal (substring ess-dialect 0 1) "R") (ess-eval-linewise (concat "debug(" string ")")) (ess-mouse-me-eval-expanded string "trace(" ", exit=browser)") nil nil nil)) (defun ess-mouse-me-browser-off (string) (if (equal (substring ess-dialect 0 1) "R") (ess-eval-linewise (concat "undebug(" string ")")) (ess-mouse-me-eval-expanded string "untrace(" ")") nil nil nil)) (defun ess-mouse-me-eval-expanded (string &optional head tail commands-buffer page value-returned) "Send the expanded STRING to the inferior-ess process using `ess-command' after first concating the HEAD and TAIL. Put answer in COMMANDS-BUFFER if specified and not using ddeclient, otherwise in \"tmp-buffer\". In either case the buffer containing the answer is renamed to the value of the constructed command. If PAGE is non-nil and using ddeclient, expand the string one more time by embedding it in a \"page()\" command." (interactive) (let* (scommand page-scommand (lproc-name ess-local-process-name) (ess-mouse-customize-alist ess-local-customize-alist)) (if (not head) (setq head "summary(")) (if (not tail) (setq tail ")")) (if (not commands-buffer) (setq commands-buffer (get-buffer-create "tmp-buffer"))) (setq scommand (concat head string tail)) (if (ess-ddeclient-p) (progn (setq page-scommand (if page (concat "page(" scommand ")") scommand)) (set-buffer-file-coding-system 'undecided-dos) (ess-command page-scommand commands-buffer) (if (not value-returned) nil (sleep-for 2) (switch-to-buffer (car (buffer-list))))) (ess-make-buffer-current) (switch-to-buffer commands-buffer) (ess-setq-vars-local (eval ess-mouse-customize-alist) (current-buffer)) (setq ess-local-process-name lproc-name) (ess-command (concat scommand "\n") commands-buffer) (if (not value-returned) (switch-to-buffer (nth 1 (buffer-list))))) (if (not value-returned) nil (if ess-microsoft-p ;; there ought to be a filter (while (search-forward "\r" nil t) ;; function to keep the ^M (replace-match "" nil t))) ;; from showing up at all (ess-transcript-mode (eval ess-mouse-customize-alist)) (setq ess-local-process-name lproc-name) (rename-buffer scommand)))) ; Provide package (provide 'ess-mouse) ;;;;;;;; STARTUP STUFF ;;;;;;;;;;;; (make-variable-buffer-local 'mouse-me-menu-commands) (defun ess-S-mouse-me-menu-commands () (if (equal ess-language "S") (setq mouse-me-menu-commands ess-S-mouse-me-menu-commands-alist))) ;; (if (not (featurep 'xemacs)) ;; (progn ;; ;;gnu emacs ;; (define-key ess-mode-map [S-mouse-3] 'ess-mouse-me) ;; (define-key inferior-ess-mode-map [S-mouse-3] 'ess-mouse-me) ;; (defun ess-S-mouse-me-ess-transcript-mode () ;; (define-key ess-transcript-mode-map [S-mouse-3] 'ess-mouse-me))) ;; ;; xemacs ;; (define-key ess-mode-map [(shift button3)] 'ess-mouse-me) ;; (define-key inferior-ess-mode-map [(shift button3)] 'ess-mouse-me) ;; (defun ess-S-mouse-me-ess-transcript-mode () ;; (define-key ess-transcript-mode-map [(shift button3)] 'ess-mouse-me))) ;; (add-hook 'ess-mode-hook 'ess-S-mouse-me-menu-commands) (add-hook 'inferior-ess-mode-hook 'ess-S-mouse-me-menu-commands) (add-hook 'ess-transcript-mode-hook 'ess-S-mouse-me-menu-commands) ;; (add-hook 'ess-transcript-mode-hook 'ess-S-mouse-me-ess-transcript-mode) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-mouse.el ends here ess/lisp/ess-noweb-mode.el0000664000175000017500000023315712423756516014067 0ustar eddedd;;; ess-noweb-mode.el --- edit noweb files with GNU Emacs ;; Copyright (C) 1995 by Thorsten.Ohl @ Physik.TH-Darmstadt.de ;; with a little help from Norman Ramsey ;; and Mark Lunt ;; and A.J. Rossini ;; Copyright (C) 1999--2010 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Copyright (C) 2011--2012 A.J. Rossini, Richard M. Heiberger, Martin Maechler, ;; Kurt Hornik, Rodney Sparapani, Stephen Eglen and Vitalie Spinu. ;; ESS-related Changes first added by Mark Lunt and A.J. Rossini, March, 1999. ;; Maintainer: ESS-core ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; See bottom of this file for information on language-dependent ;; highlighting, and recent changes. ;; ;; BASED ON: (from Mark Lunt). ;; -- Id: ess-noweb-mode.el,v 1.11 1999/03/21 20:14:41 root Exp -- ;; Put this into your ~/.emacs to use this mode automagically. ;; ;; (autoload 'ess-noweb-mode "ess-noweb-mode" "Editing noweb files." t) ;; (setq auto-mode-alist (append (list (cons "\\.nw$" 'ess-noweb-mode)) ;; auto-mode-alist)) ;;; NEWS: ;; * [tho] M-n q, aka: M-x ess-noweb-fill-chunk ;; ;; * [tho] `M-n TAB', aka: `M-x ess-noweb-complete-chunk' ;; ;; * [tho] ess-noweb-occur ;; ;; * [nr] use `M-n' instead of `C-c n' as default command prefix ;; ;; * [nr] don't be fooled by ;; ;; @ ;; <>= ;; int foo; ;; @ %def foo ;; Here starts a new documentation chunk! ;; <>= ;; int bar; ;; ;; * [nr] switch mode changing commands off during isearch-mode ;; ;; * [tho] ess-noweb-goto-chunk proposes a default ;; ;; * commands for tangling, weaving,.. for Sweave: --> ./ess-swv.el ;; ;;; TODO: ;; * _maybe_ replace our `ess-noweb-chunk-vector' by text properties. We ;; could then use highlighting to jazz up the visual appearance. ;; (Highlighting is sorted: `ess-noweb-chunk-vector' can be ;; ditched. It is simple to determine if we are in a doc or code ;; chunk.) ;; ;; * wrapped `ess-noweb-goto-next' and `ess-noweb-goto-previous' ;; ;; * more range checks and error exits ;; ;; * `ess-noweb-hide-code-quotes' should be superfluous now, and could ;; be removed. For ESS 5.3.10, we disable these, using the new variable ;; ess-noweb-code-quote-handling. If nobody misses that code-protecting ;; behavior, all that should be removed entirely. ;;; Code: ;; Want to use these now in order to cater for all obscure kinds of emacsen (eval-and-compile (require 'ess-compat) (autoload 'ess-write-to-dribble-buffer "ess")) ;;; Variables ;; (defconst ess-noweb-mode-RCS-Id ;; "Imported to ESS Subversion repository and RCS ids not maintained.") ;; (defconst ess-noweb-mode-RCS-Name ;; " ") (defvar ess-noweb-mode-prefix "\M-n" "*Prefix key to use for noweb mode commands. The value of this variable is checked as part of loading noweb mode. After that, changing the prefix key requires manipulating keymaps.") (defvar ess-noweb-mode-load-hook nil "Hook that is run after noweb mode is loaded.") (defvar ess-noweb-mode-hook nil "Hook that is run after entering noweb mode.") (defvar ess-noweb-select-code-mode-hook nil "Hook that is run after the code mode is selected. This is the place to overwrite keybindings of the ess-noweb-CODE-MODE.") (defvar ess-noweb-select-doc-mode-hook nil "Hook that is run after the documentation mode is selected. This is the place to overwrite keybindings of the ess-noweb-DOC-MODE.") (defvar ess-noweb-select-mode-hook nil "Hook that is run after the documentation or the code mode is selected. This is the place to overwrite keybindings of the other modes.") (defvar ess-noweb-changed-chunk-hook nil "Hook that is run every time point moves from one chunk to another. It will be run whether or not the major-mode changes.") (defvar ess-noweb-default-code-mode 'fundamental-mode "Default major mode for editing code chunks. This is set to FUNDAMENTAL-MODE by default, but you might want to change this in the Local Variables section of your file to something more appropriate, like C-MODE, FORTRAN-MODE, or even INDENTED-TEXT-MODE.") (defvar ess-noweb-code-mode 'c-mode "Major mode for editing this particular code chunk. It defaults to ess-noweb-default-code-mode, but can be reset by a comment on the first line of the chunk containing the string \"-*- NEWMODE -*-\" or \"-*- NEWMODE-mode -*-\" or \"-*- mode: NEWMODE -*- \" or \"-*- mode: NEWMODE-mode -*- \" Option three is recommended, as it is the closest to standard emacs usage.") (defvar ess-noweb-default-doc-mode 'latex-mode "Major mode for editing documentation chunks. Sensible choices would be tex-mode, latex-mode, sgml-mode, or html-mode. Maybe others will exist someday.") (defvar ess-noweb-doc-mode-syntax-table nil "A syntax-table syntax table that makes quoted code in doc chunks to behave.") (defvar ess-noweb-last-chunk-index 0 "This keeps track of the chunk we have just been in. If this is not the same as the current chunk, we have to check if we need to change major mode.") (defvar ess-noweb-chunk-vector nil "Vector of the chunks in this buffer.") (defvar ess-noweb-narrowing nil "If not NIL, the display will always be narrowed to the current chunk pair.") (defvar ess-noweb-electric-@-and-< t "If not nil, the keys `@' and `<' will be bound to ess-noweb-ELECTRIC-@ and ess-noweb-ELECTRIC-<, respectively.") (defvar ess-noweb-use-mouse-navigation t "If not nil, enables moving between chunks using mouse-1. Clicking on the '<<' at the beginning of a chunk name takes you to the previous occurence of that chunk name, clicking on the '>>' takes you to the next. Assumes mouse-1 is bound to mouse-set-point, so if you have rebound mouse-1, this will override your binding.") (defvar ess-noweb-code-quotes-handling nil "If not nil, the function pair \\[ess-noweb-hide-code-quotes] and \\[ess-noweb-restore-code-quotes] are used to \"protect\" code inside \"[[\" .. \"]]\" pairs. Note that rarely this has been found to be buggy with the \"catastrophic\" consequence of whole parts of your document being replaced by sequences of '*'.") ;; The following is apparently broken -- dangling code that was ;; commented out. Need to see if we can get it working? (defvar ess-noweb-weave-options "-delay") (defvar ess-noweb-latex-viewer "xdvi") (defvar ess-noweb-html-viewer "netscape") (defun ess-noweb-weave (&optional name) (interactive) (let ((buffer (get-buffer-create "Weave Buffer"))) (if (not name) (progn ;; Assume latex documentation, but set to html if appropriate (if (eq ess-noweb-doc-mode html-mode) (setq name (concat (substring (buffer-file-name) 0 (string-match ".nw" name)) ".html")) (setq name (concat (substring (buffer-file-name) 0 (string-match ".nw" name)) ".tex"))))) (setq name (concat "> " name)) (setq ess-noweb-weave-options (concat ess-noweb-weave-options name)) (start-process weave-process buffer "noweave" ess-noweb-weave-options))) ;;(defun ess-noweb-view ()) ;;; Setup (defvar ess-noweb-mode nil "Buffer local variable, T iff this buffer is edited in noweb mode.") ;; For some reason that I do not understand, `newline' does not do the ;; right thing in quoted code. If point is not preceded by whitespace, ;; it moves to the beginning of the current line, not the beginning of ;; the new line. `newline 1' works fine, hence the kludge. I'd love to ;; understand what's going on, though. Try running M-x newline in the ;; middle of a code quote in a doc chunk to see ;; what I mean: its odd. (defun ess-noweb-newline (&optional arg) "A kludge to get round very odd behaviour of newline in quoted code." (interactive "p") (if arg (newline arg) (newline 1)) (ess-noweb-indent-line)) (defvar ess-noweb-mode-prefix-map (let ((map (if (featurep 'xemacs) (make-keymap) ;; XEmacs/Emacs problems... (make-sparse-keymap)))) (define-key map "\C-\M-x" 'ess-eval-chunk) (define-key map "\C-c" 'ess-eval-chunk-and-step) (define-key map "\C-n" 'ess-noweb-next-chunk) (define-key map "\C-p" 'ess-noweb-previous-chunk) (define-key map "\M-n" 'ess-noweb-goto-next) (define-key map "\M-m" 'ess-noweb-insert-default-mode-line) (define-key map "\M-p" 'ess-noweb-goto-previous) (define-key map "c" 'ess-noweb-next-code-chunk) (define-key map "C" 'ess-noweb-previous-code-chunk) (define-key map "d" 'ess-noweb-next-doc-chunk) (define-key map "D" 'ess-noweb-previous-doc-chunk) (define-key map "g" 'ess-noweb-goto-chunk) (define-key map "\C-l" 'ess-noweb-update-chunk-vector) (define-key map "\M-l" 'ess-noweb-update-chunk-vector) (define-key map "w" 'ess-noweb-copy-chunk-as-kill) (define-key map "W" 'ess-noweb-copy-chunk-pair-as-kill) (define-key map "k" 'ess-noweb-kill-chunk) (define-key map "K" 'ess-noweb-kill-chunk-pair) (define-key map "m" 'ess-noweb-mark-chunk) (define-key map "M" 'ess-noweb-mark-chunk-pair) (define-key map "n" 'ess-noweb-narrow-to-chunk) (define-key map "N" 'ess-noweb-narrow-to-chunk-pair) (define-key map "t" 'ess-noweb-toggle-narrowing) (define-key map "\t" 'ess-noweb-complete-chunk) (define-key map "q" 'ess-noweb-fill-chunk) (define-key map "i" 'ess-noweb-new-chunk) (define-key map "o" 'ess-noweb-occur) ;;(define-key map "v" 'ess-noweb-mode-version) (define-key map "h" 'ess-noweb-describe-mode) ;; do *NOT* override C-h (give all keybindings startings with M-n! map) "noweb minor-mode prefix keymap") (defvar ess-noweb-minor-mode-map (let ((map (make-sparse-keymap))) (if ess-noweb-electric-@-and-< (progn (define-key map "@" 'ess-noweb-electric-@) (define-key map "<" 'ess-noweb-electric-<))) (define-key map "\M-q" 'ess-noweb-fill-paragraph-chunk) (define-key map "\C-ch" 'ess-handy-commands) (define-key map [(control meta ?\\)] 'ess-noweb-indent-region) ;;(define-key map "\C-c\C-n" 'ess-noweb-indent-line) ; Override TeX-normal! (define-key map "\t" 'ess-noweb-indent-line) ;; (define-key map [tab] 'ess-noweb-indent-line) ;; interferes with ac (define-key map "\r" 'ess-noweb-newline) ;; (define-key map [return] 'ess-noweb-newline) ;; interferes with ac (define-key map [mouse-1] 'ess-noweb-mouse-first-button) (define-key map ess-noweb-mode-prefix ess-noweb-mode-prefix-map) map) "ESS Noweb minor mode keymap") (easy-menu-define ess-noweb-minor-mode-menu ess-noweb-minor-mode-map "Menu keymap for noweb." '("Noweb" ("Movement" ["Previous chunk" ess-noweb-previous-chunk t] ["Next chunk" ess-noweb-next-chunk t] ["Previous chunk of same name" ess-noweb-goto-previous t] ["Next chunk of same name" ess-noweb-goto-next t] ["Goto chunk" ess-noweb-goto-chunk t] ["Previous code chunk" ess-noweb-previous-code-chunk t] ["Next code chunk" ess-noweb-next-code-chunk t] ["Previous documentation chunk" ess-noweb-previous-doc-chunk t] ["Next documentation chunk" ess-noweb-next-doc-chunk t]) ("Editing" ["Copy chunk" ess-noweb-copy-chunk-as-kill t] ["Copy chunk pair" ess-noweb-copy-chunk-pair-as-kill t] ["Kill chunk" ess-noweb-kill-chunk t] ["Kill chunk pair" ess-noweb-kill-chunk-pair t] ["Mark chunk" ess-noweb-mark-chunk t] ["Mark chunk pair" ess-noweb-mark-chunk-pair t]) ("Narrowing" ["Narrow to chunk" ess-noweb-narrow-to-chunk t] ["Narrow to chunk pair" ess-noweb-narrow-to-chunk-pair t] ["Toggle auto narrowing" ess-noweb-toggle-narrowing t] ["Widen" widen t]) ("Modes" ["Set documentation mode" ess-noweb-set-doc-mode t] ["Set default code mode" ess-noweb-set-code-mode t] ["Set code mode for this chunk" ess-noweb-set-this-code-mode t] ["Insert default mode line" ess-noweb-insert-default-mode-line t]) ("Tangling" ["Tangle current chunk" ess-noweb-tangle-chunk t] ["Tangle current thread" ess-noweb-tangle-current-thread t] ["Tangle named thread" ess-noweb-tangle-thread t]) ("Miscellaneous" ["Complete chunk name" ess-noweb-complete-chunk t] ["Fill current chunk" ess-noweb-fill-chunk t] ["Insert new chunk" ess-noweb-new-chunk t] ["Update the chunk vector" ess-noweb-update-chunk-vector t] ["Chunk occurrences" ess-noweb-occur t]) "--" ["Help" ess-noweb-describe-mode t] ;;["Version" ess-noweb-mode-version t] )) ;; Add ess-noweb-mode to the list of minor modes (if (not (assq 'ess-noweb-mode minor-mode-alist)) (setq minor-mode-alist (append minor-mode-alist (list '(ess-noweb-mode " Noweb"))))) ;; Add ess-noweb-minor-mode-map to the list of minor-mode keymaps ;; available. Then, whenever ess-noweb-mode is activated, the keymap is ;; automatically activated (if (not (assq 'ess-noweb-mode minor-mode-map-alist)) (setq minor-mode-map-alist (cons (cons 'ess-noweb-mode ess-noweb-minor-mode-map) minor-mode-map-alist))) ;; Old XEmacs hacks. (defun ess-noweb-mode-xemacs-menu () "Hook to install ess-noweb-mode menu for XEmacs (w/ easymenu)." (if 'ess-noweb-mode (easy-menu-add ess-noweb-minor-mode-menu) (easy-menu-remove ess-noweb-minor-mode-menu) )) (if (string-match "XEmacs" emacs-version) (progn (add-hook 'ess-noweb-select-mode-hook 'ess-noweb-mode-xemacs-menu) ;; Next line handles some random problems... (easy-menu-add ess-noweb-minor-mode-menu))) (defun ess-noweb-minor-mode (&optional arg) "Minor meta mode for editing noweb files. See ess-noweb-mode." (interactive) (ess-noweb-mode arg)) ; this was ess-noweb-minor-mode??? (truly recursive) (defun ess-noweb-mode ( &optional arg ) "Minor meta mode for editing noweb files. `Meta' refers to the fact that this minor mode is switching major modes depending on the location of point. The following special keystrokes are available in noweb mode: Movement: \\[ess-noweb-next-chunk] \tgoto the next chunk \\[ess-noweb-previous-chunk] \tgoto the previous chunk \\[ess-noweb-goto-previous] \tgoto the previous chunk of the same name \\[ess-noweb-goto-next] \tgoto the next chunk of the same name \\[ess-noweb-goto-chunk] \t\tgoto a chunk \\[ess-noweb-next-code-chunk] \t\tgoto the next code chunk \\[ess-noweb-previous-code-chunk] \t\tgoto the previous code chunk \\[ess-noweb-next-doc-chunk] \t\tgoto the next documentation chunk \\[ess-noweb-previous-doc-chunk] \t\tgoto the previous documentation chunk Copying/Killing/Marking/Narrowing: \\[ess-noweb-copy-chunk-as-kill] \t\tcopy the chunk the point is in into the kill ring \\[ess-noweb-copy-chunk-pair-as-kill] \t\tcopy the pair of doc/code chunks the point is in \\[ess-noweb-kill-chunk] \t\tkill the chunk the point is in \\[ess-noweb-kill-chunk-pair] \t\tkill the pair of doc/code chunks the point is in \\[ess-noweb-mark-chunk] \t\tmark the chunk the point is in \\[ess-noweb-mark-chunk-pair] \t\tmark the pair of doc/code chunks the point is in \\[ess-noweb-narrow-to-chunk] \t\tnarrow to the chunk the point is in \\[ess-noweb-narrow-to-chunk-pair] \t\tnarrow to the pair of doc/code chunks the point is in \\[widen] \twiden \\[ess-noweb-toggle-narrowing] \t\ttoggle auto narrowing Filling and Indenting: \\[ess-noweb-fill-chunk] \tfill (or indent) the chunk at point according to mode \\[ess-noweb-fill-paragraph-chunk] \tfill the paragraph at point, restricted to chunk \\[ess-noweb-indent-line] \tindent the line at point according to mode Insertion: \\[ess-noweb-insert-default-mode-line] \tinsert a line to set this file's code mode \\[ess-noweb-new-chunk] \t\tinsert a new chunk at point \\[ess-noweb-complete-chunk] \tcomplete the chunk name before point \\[ess-noweb-electric-@] \t\tinsert a `@' or start a new doc chunk \\[ess-noweb-electric-<] \t\tinsert a `<' or start a new code chunk Modes: \\[ess-noweb-set-doc-mode] \t\tset the major mode for editing doc chunks \\[ess-noweb-set-code-mode] \tset the major mode for editing code chunks \\[ess-noweb-set-this-code-mode] \tset the major mode for editing this code chunk Misc: \\[ess-noweb-occur] \t\tfind all occurrences of the current chunk \\[ess-noweb-update-chunk-vector] \tupdate the markers for chunks \\[ess-noweb-describe-mode] \tdescribe ess-noweb-mode " (interactive "P") ;; This bit is tricky: copied almost verbatim from bib-cite-mode.el ;; It seems to ensure that the variable ess-noweb-mode is made ;; local to this buffer. It then sets ess-noweb-mode to `t' if ;; 1) It was called with an argument greater than 0 ;; or 2) It was called with no argument, and ess-noweb-mode is ;; currently nil ;; ess-noweb-mode is nil if the argument was <= 0 or there ;; was no argument and ess-noweb-mode is currently `t' (kill-all-local-variables) (set (make-local-variable 'ess-noweb-mode) (if arg (> (prefix-numeric-value arg) 0) (not ess-noweb-mode))) ;; Now, if ess-noweb-mode is true, we want to turn ;; ess-noweb-mode on (cond (ess-noweb-mode ;Setup the minor-mode (mapcar 'ess-noweb-make-variable-permanent-local '(ess-noweb-mode ess-local-process-name ;; also made permanent in ess-mode, but let it be ess-dialect ess-language after-change-functions before-change-functions ess-noweb-narrowing ess-noweb-chunk-vector post-command-hook isearch-mode-hook isearch-mode-end-hook ess-noweb-doc-mode ess-noweb-code-mode ess-noweb-default-code-mode ess-noweb-last-chunk-index)) (ess-noweb-update-chunk-vector) (if (equal 0 (ess-noweb-find-chunk-index-buffer)) (setq ess-noweb-last-chunk-index 1) (setq ess-noweb-last-chunk-index 0)) (if font-lock-mode (progn (font-lock-mode -1) (require 'ess-noweb-font-lock-mode); which requires ess-noweb-mode .. hmm.. (ess-noweb-font-lock-mode 1))) (add-hook 'post-command-hook 'ess-noweb-post-command-function) (when (or (<= emacs-major-version 20) (featurep 'xemacs)) ;; Xemacs or very old GNU Emacs (make-local-hook 'after-change-functions) (make-local-hook 'before-change-functions)) (add-hook 'after-change-functions 'ess-noweb-after-change-function nil t) (add-hook 'before-change-functions 'ess-noweb-before-change-function nil t) (add-hook 'ess-noweb-select-doc-mode-hook 'ess-noweb-auto-fill-doc-mode) (add-hook 'ess-noweb-select-code-mode-hook 'ess-noweb-auto-fill-code-mode) (add-hook 'isearch-mode-hook 'ess-noweb-note-isearch-mode) (add-hook 'isearch-mode-end-hook 'ess-noweb-note-isearch-mode-end) (setq ess-noweb-doc-mode-syntax-table nil) (run-hooks 'ess-noweb-mode-hook) (message "noweb mode: use `M-x ess-noweb-describe-mode' for further information")) ;; If we didn't do the above, then we want to turn ess-noweb-mode ;; off, no matter what (hence the condition `t') (t (remove-hook 'post-command-hook 'ess-noweb-post-command-function) (if (fboundp 'remove-local-hook) (progn (remove-local-hook 'after-change-functions 'ess-noweb-after-change-function) (remove-local-hook 'before-change-functions 'ess-noweb-before-change-function)) (remove-hook 'after-change-functions 'ess-noweb-after-change-function t) (remove-hook 'before-change-functions 'ess-noweb-before-change-function t)) (remove-hook 'ess-noweb-select-doc-mode-hook 'ess-noweb-auto-fill-doc-mode) (remove-hook 'ess-noweb-select-code-mode-hook 'ess-noweb-auto-fill-code-mode) (remove-hook 'isearch-mode-hook 'ess-noweb-note-isearch-mode) (remove-hook 'isearch-mode-end-hook 'ess-noweb-note-isearch-mode-end) (if (and (boundp 'ess-noweb-font-lock-mode) ess-noweb-font-lock-mode) (progn (ess-noweb-font-lock-mode -1) (message "ESS-Noweb and ESS-Noweb-Font-Lock Modes Removed")) (message "ESS-Noweb mode removed"))))) (defun ess-noweb-make-variable-permanent-local (var) "Declare VAR buffer local, but protect it from beeing killed by major mode changes." (make-variable-buffer-local var) (put var 'permanent-local 't)) (defun ess-noweb-note-isearch-mode () "Take note of an incremental search in progress" (remove-hook 'post-command-hook 'ess-noweb-post-command-function)) (defun ess-noweb-note-isearch-mode-end () "Take note of an incremental search having ended" (add-hook 'post-command-hook 'ess-noweb-post-command-function)) (defun ess-noweb-post-command-function () "The hook being run after each command in noweb mode." (ess-noweb-select-mode)) (defvar ess-noweb-chunk-boundary-changed nil "Whether the current change affects a chunk boundary.") (defvar ess-noweb-chunk-boundary-regexp "^\\(@[^@]\\)\\|\\(<<\\)") (defun ess-noweb-before-change-function (begin end) "Record changes to chunk boundaries." (save-excursion (goto-char begin) (setq ess-noweb-chunk-boundary-changed (re-search-forward ess-noweb-chunk-boundary-regexp end t)))) (defun ess-noweb-after-change-function (begin end length) "Function to run after every change in a noweb buffer. If the changed region contains a chunk boundary, it will update the chunk vector" (save-excursion (goto-char begin) (when (or ess-noweb-chunk-boundary-changed (re-search-forward ess-noweb-chunk-boundary-regexp end t)) (ess-noweb-update-chunk-vector) (setq ess-noweb-chunk-boundary-changed nil)))) ;;; Chunks (defun ess-noweb-update-chunk-vector () "Scan the whole buffer and place a marker at each \"^@\" and \"^<<\". Record them in ess-noweb-CHUNK-VECTOR." (interactive) (save-excursion (goto-char (point-min)) (let ((chunk-list (list (cons 'doc (point-marker))))) (while (re-search-forward "^\\(@\\( \\|$\\|\\( %def\\)\\)\\|<<\\(.*\\)>>=\\)" nil t) (goto-char (match-beginning 0)) ;; If the 3rd subexpression matched @ %def, we're still in a code ;; chunk (sort of), so don't place a marker here. (if (not (match-beginning 3)) (setq chunk-list ;; If the 4th subexpression matched inside <<...>>, ;; we're seeing a new code chunk. (cons (cons (if (match-beginning 4) ;;buffer-substring-no-properties better ;;than buffer-substring if highlighting ;;may be used (buffer-substring-no-properties (match-beginning 4) (match-end 4)) 'doc) (point-marker)) chunk-list)) ;; Scan forward either to !/^@ %def/, which will start a docs chunk, ;; or to /^<<.*>>=$/, which will start a code chunk. (progn (forward-line 1) (while (looking-at "@ %def") (forward-line 1)) (setq chunk-list ;; Now we can tell code vs docs (cons (cons (if (looking-at "<<\\(.*\\)>>=") (buffer-substring-no-properties (match-beginning 1) (match-end 1)) 'doc) (point-marker)) chunk-list)))) (forward-line 1)) (setq chunk-list (cons (cons 'doc (point-max-marker)) chunk-list)) (setq ess-noweb-chunk-vector (vconcat (reverse chunk-list)))))) (defun ess-noweb-find-chunk () "Return a pair consisting of the name (or 'DOC) and the marker of the current chunk." (if (not ess-noweb-chunk-vector) (ess-noweb-update-chunk-vector)) (aref ess-noweb-chunk-vector (ess-noweb-find-chunk-index-buffer))) (defun ess-noweb-chunk-is-code (index) "Return t if the chunk 'index' is a code chunk, nil otherwise" (interactive) (stringp (car (ess-noweb-chunk-vector-aref index)))) (defun ess-noweb-in-code-chunk () "Return t if we are in a code chunk, nil otherwise." (interactive) (ess-noweb-chunk-is-code (ess-noweb-find-chunk-index-buffer))) (defun ess-noweb-in-mode-line () "Return the name of the mode to use if we are in a mode line, nil otherwise." (interactive) (let (beg end mode) (save-excursion (beginning-of-line 1) (and (progn (ess-write-to-dribble-buffer (format "(n-i-m-l: 1)")) (search-forward "-*-" (save-excursion (end-of-line) (point)) t)) (progn (ess-write-to-dribble-buffer (format "(n-i-m-l: 2)")) (skip-chars-forward " \t") (setq beg (point)) (search-forward "-*-" (save-excursion (end-of-line) (point)) t)) (progn (ess-write-to-dribble-buffer (format "(n-i-m-l: 3)")) (forward-char -3) (skip-chars-backward " \t") (setq end (point)) (goto-char beg) (setq mode (concat (downcase (buffer-substring beg end)) "-mode")) (if (and (>= (length mode) 11)) (progn (if (equal (substring mode -10 -5) "-mode") (setq mode (substring mode 0 -5))) (if (equal (substring mode 0 5) "mode:") (setq mode (substring mode 6)))))) (progn (ess-write-to-dribble-buffer (format "(n-i-m-l: 3) mode=%s" mode)) (intern mode)))))) (defun ess-noweb-find-chunk-index-buffer () "Return the index of the current chunk in ess-noweb-CHUNK-VECTOR." (ess-noweb-find-chunk-index 0 (1- (length ess-noweb-chunk-vector)))) (defun ess-noweb-find-chunk-index (low hi) (if (= hi (1+ low)) low (let ((med (/ (+ low hi) 2))) (if (< (point) (cdr (aref ess-noweb-chunk-vector med))) (ess-noweb-find-chunk-index low med) (ess-noweb-find-chunk-index med hi))))) (defun ess-noweb-chunk-region () "Return a pair consisting of the beginning and end of the current chunk." (interactive) (let ((start (ess-noweb-find-chunk-index-buffer))) (cons (marker-position (cdr (aref ess-noweb-chunk-vector start))) (marker-position (cdr (aref ess-noweb-chunk-vector (1+ start))))))) (defun ess-noweb-copy-code-chunk () "Copy the current code chunk to the kill ring, excluding the chunk name. This will be particularly useful when interfacing with ESS." (interactive) (let ((r (ess-noweb-chunk-region))) (save-excursion (goto-char (car r)) (if (ess-noweb-in-code-chunk) (progn (beginning-of-line 2) (copy-region-as-kill (point) (cdr r))))))) (defun ess-noweb-extract-code-chunk () "Create a new buffer with the same name as the current code chunk, and copy all code from chunks of the same name to it." (interactive) (save-excursion (if (ess-noweb-in-code-chunk) (progn (let ((chunk-name (car (ess-noweb-find-chunk))) (chunk-counter 0) (copy-counter 0) (this-chunk) (oldbuf (current-buffer))) (if (get-buffer chunk-name) (progn (set-buffer-modified-p nil) (kill-buffer chunk-name))) (get-buffer-create chunk-name) (message "Created buffer %s" chunk-name) (while (< chunk-counter (- (length ess-noweb-chunk-vector) 2)) (setq this-chunk (ess-noweb-chunk-vector-aref chunk-counter)) (message "Current buffer is %s" (car this-chunk)) (if (equal chunk-name (car this-chunk)) (progn (setq copy-counter (+ copy-counter 1)) (goto-char (cdr this-chunk)) (ess-noweb-copy-code-chunk) (set-buffer chunk-name) (goto-char (point-max)) (yank) (set-buffer oldbuf))) (setq chunk-counter (+ chunk-counter 1))) (message "Copied %d bits" copy-counter) (set-buffer chunk-name) (copy-region-as-kill (point-min)(point-max))))))) (defun ess-noweb-chunk-pair-region () "Return a pair consisting of the beginning and end of the current pair of documentation and code chunks." (interactive) (let* ((start (ess-noweb-find-chunk-index-buffer)) (end (1+ start))) (if (ess-noweb-chunk-is-code start) (cons (marker-position (cdr (aref ess-noweb-chunk-vector (1- start)))) (marker-position (cdr (aref ess-noweb-chunk-vector end)))) (while (not (ess-noweb-chunk-is-code end)) (setq end (1+ end))) (cons (marker-position (cdr (aref ess-noweb-chunk-vector start))) (marker-position (cdr (aref ess-noweb-chunk-vector (1+ end)))))))) (defun ess-noweb-chunk-vector-aref (i) (if (< i 0) (error "Before first chunk.")) (if (not ess-noweb-chunk-vector) (ess-noweb-update-chunk-vector)) (if (>= i (length ess-noweb-chunk-vector)) (error "Beyond last chunk.")) (aref ess-noweb-chunk-vector i)) (defun ess-noweb-complete-chunk () "Complete the chunk name before point, if any." (interactive) (if (ess-noweb-in-code-chunk) (let ((end (point)) (beg (save-excursion (if (re-search-backward "<<" (save-excursion (beginning-of-line) (point)) t) (match-end 0) nil)))) (if beg (let* ((pattern (buffer-substring beg end)) (alist (ess-noweb-build-chunk-alist)) (completion (try-completion pattern alist))) (cond ((eq completion t)) ((null completion) (message "Can't find completion for \"%s\"" pattern) (ding)) ((not (string= pattern completion)) (delete-region beg end) (insert completion) (if (not (looking-at ">>")) (insert ">>"))) (t (message "Making completion list...") (with-output-to-temp-buffer "*Completions*" (display-completion-list (all-completions pattern alist))) (message "Making completion list...%s" "done")))) (message "Not at chunk name..."))) (message "Not in code chunk..."))) ;;; Filling, etc (defun ess-noweb-hide-code-quotes () "Replace all non blank characters in [[...]] code quotes in the current buffer (you might want to narrow to the interesting region first) by `*'. Return a list of pairs with the position and value of the original strings." (save-excursion (let ((quote-list nil)) (goto-char (point-min)) (while (re-search-forward "\\[\\[" nil 'move) (let ((beg (match-end 0)) (end (if (re-search-forward "\\]\\]" nil t) (match-beginning 0) (point-max)))) (goto-char beg) (while (< (point) end) ;; Move on to the next word: (let ((b (progn (skip-chars-forward " \t\n" end) (point))) (e (progn (skip-chars-forward "^ \t\n" end) (point)))) (if (> e b) ;; Save the string and a marker to the end of the ;; replacement text. A marker to the beginning is ;; useless. See ess-noweb-RESTORE-CODE-QUOTES. (save-excursion (setq quote-list (cons (cons (copy-marker e) (buffer-substring b e)) quote-list)) (goto-char b) (insert-char ?* (- e b) t) (delete-char (- e b)))))))) (reverse quote-list)))) (defun ess-noweb-restore-code-quotes (quote-list) "Reinsert the strings modified by `ess-noweb-hide-code-quotes'." (save-excursion (mapcar (lambda (q) (let* ((e (marker-position (car q))) ;; Slightly inefficient, but correct way to find ;; the beginning of the word to be replaced. ;; Using the marker at the beginning will loose ;; if whitespace has been rearranged (b (save-excursion (goto-char e) (skip-chars-backward "*") (point)))) (delete-region b e) (goto-char b) (insert (cdr q)))) quote-list))) (defun ess-noweb-fill-chunk () "Fill the current chunk according to mode. Run `fill-region' on documentation chunks and `indent-region' on code chunks." (interactive) (save-excursion (save-restriction (ess-noweb-narrow-to-chunk) (if (ess-noweb-in-code-chunk) (progn ;; Narrow to the code section proper; w/o the first and any ;; index declaration lines. (narrow-to-region (progn (goto-char (point-min)) (forward-line 1) (point)) (progn (goto-char (point-max)) (forward-line -1) (while (looking-at "@") (forward-line -1)) (forward-line 1) (point))) (if (or indent-region-function indent-line-function) (indent-region (point-min) (point-max) nil) (error "No indentation functions defined in %s!" major-mode))) (if ess-noweb-code-quotes-handling (let ((quote-list (ess-noweb-hide-code-quotes))) (fill-region (point-min) (point-max)) (ess-noweb-restore-code-quotes quote-list)) (fill-region (point-min) (point-max))))))) (defun ess-noweb-indent-region (beg end) "If region fits inside current chunk, narrow to chunk and then indent according to mode." (interactive "r") (let* ((inx (ess-noweb-find-chunk-index-buffer)) (ch-beg (marker-position (cdr (aref ess-noweb-chunk-vector inx)))) (ch-end (marker-position (cdr (aref ess-noweb-chunk-vector (1+ inx)))))) (if (and (< ch-beg beg) (> ch-end end)) (save-excursion (save-restriction (setq beg (max beg (progn (goto-char ch-beg) (forward-line 1) (point)))) (setq end (min end (progn (goto-char ch-end) (forward-line -1) (point)))) (narrow-to-region beg end) (indent-region beg end))) (indent-region beg end)))) (defun ess-noweb-indent-line () "Indent the current line according to mode, after narrowing to this chunk." (interactive) (ess-noweb-update-chunk-vector) (save-restriction (ess-noweb-narrow-to-chunk) (if (ess-noweb-in-code-chunk) (progn ;; Narrow to the code section proper; w/o the first and any ;; index declaration lines. (save-excursion (narrow-to-region (progn (goto-char (point-min)) (forward-line 1) (point)) (progn (goto-char (point-max)) (forward-line -1) (while (looking-at "@") (forward-line -1)) (forward-line 1) (point)))))) (indent-according-to-mode))) (defun ess-noweb-fill-paragraph-chunk (&optional justify) "Fill a paragraph in the current chunk." (interactive "P") (ess-noweb-update-chunk-vector) (save-excursion (save-restriction (ess-noweb-narrow-to-chunk) (if (ess-noweb-in-code-chunk) (progn ;; Narrow to the code section proper; w/o the first and any ;; index declaration lines. (narrow-to-region (progn (goto-char (point-min)) (forward-line 1) (point)) (progn (goto-char (point-max)) (forward-line -1) (while (looking-at "@") (forward-line -1)) (forward-line 1) (point))) (fill-paragraph justify)) (if ess-noweb-code-quotes-handling (let ((quote-list (ess-noweb-hide-code-quotes))) (fill-paragraph justify) (ess-noweb-restore-code-quotes quote-list)) (fill-paragraph justify)))))) (defun ess-noweb-auto-fill-doc-chunk () "Replacement for `do-auto-fill'." (save-restriction (narrow-to-region (car (ess-noweb-chunk-region)) (save-excursion (end-of-line) (point))) (if ess-noweb-code-quotes-handling (let ((quote-list (ess-noweb-hide-code-quotes))) (do-auto-fill) (ess-noweb-restore-code-quotes quote-list)) (do-auto-fill)))) (defun ess-noweb-auto-fill-doc-mode () "Install the improved auto fill function, iff necessary." (if auto-fill-function (setq auto-fill-function 'ess-noweb-auto-fill-doc-chunk))) (defun ess-noweb-auto-fill-code-chunk () "Replacement for do-auto-fill. Cancel filling in chunk headers" (unless (save-excursion (beginning-of-line) (looking-at "<<")) (do-auto-fill))) (defun ess-noweb-auto-fill-code-mode () "Install the default auto fill function, iff necessary." (if auto-fill-function (setq auto-fill-function 'ess-noweb-auto-fill-code-chunk))) ;;; Marking (defun ess-noweb-mark-chunk () "Mark the current chunk." (interactive) (let ((r (ess-noweb-chunk-region))) (goto-char (car r)) (push-mark (cdr r) nil t))) (defun ess-noweb-mark-chunk-pair () "Mark the current pair of documentation and code chunks." (interactive) (let ((r (ess-noweb-chunk-pair-region))) (goto-char (car r)) (push-mark (cdr r) nil t))) ;;; Narrowing (defun ess-noweb-toggle-narrowing (&optional arg) "Toggle if we should narrow the display to the current pair of documentation and code chunks after each movement. With argument: switch narrowing on." (interactive "P") (if (or arg (not ess-noweb-narrowing)) (progn (setq ess-noweb-narrowing t) (ess-noweb-narrow-to-chunk-pair)) (setq ess-noweb-narrowing nil) (widen))) (defun ess-noweb-narrow-to-chunk () "Narrow the display to the current chunk." (interactive) (let ((r (ess-noweb-chunk-region))) (narrow-to-region (car r) (cdr r)))) (defun ess-noweb-narrow-to-chunk-pair () "Narrow the display to the current pair of documentation and code chunks." (interactive) (let ((r (ess-noweb-chunk-pair-region))) (narrow-to-region (car r) (cdr r)))) ;;; Killing (defun ess-noweb-kill-chunk () "Kill the current chunk." (interactive) (let ((r (ess-noweb-chunk-region))) (kill-region (car r) (cdr r)))) (defun ess-noweb-kill-chunk-pair () "Kill the current pair of chunks." (interactive) (let ((r (ess-noweb-chunk-pair-region))) (kill-region (car r) (cdr r)))) (defun ess-noweb-copy-chunk-as-kill () "Place the current chunk on the kill ring." (interactive) (let ((r (ess-noweb-chunk-region))) (copy-region-as-kill (car r) (cdr r)))) (defun ess-noweb-copy-chunk-pair-as-kill () "Place the current pair of chunks on the kill ring." (interactive) (let ((r (ess-noweb-chunk-pair-region))) (copy-region-as-kill (car r) (cdr r)))) ;;; Movement (defun ess-noweb-sign (n) "Return the sign of N." (if (< n 0) -1 1)) (defun ess-noweb-next-doc-chunk (&optional cnt) "Goto to the Nth documentation chunk from point." (interactive "p") (widen) (let ((start (ess-noweb-find-chunk-index-buffer)) (i 1)) (while (<= i (abs cnt)) (setq start (+ (ess-noweb-sign cnt) start)) (while (ess-noweb-chunk-is-code start) (setq start (+ (ess-noweb-sign cnt) start))) (setq i (1+ i))) (goto-char (marker-position (cdr (ess-noweb-chunk-vector-aref start)))) (forward-char 1)) (if ess-noweb-narrowing (ess-noweb-narrow-to-chunk-pair))) (defun ess-noweb-previous-doc-chunk (&optional n) "Goto to the -Nth documentation chunk from point." (interactive "p") (ess-noweb-next-doc-chunk (- n))) (defun ess-noweb-next-code-chunk (&optional cnt) "Goto to the Nth code chunk from point." (interactive "p") (widen) (let ((start (ess-noweb-find-chunk-index-buffer)) (i 1)) (while (<= i (abs cnt)) (setq start (+ (ess-noweb-sign cnt) start)) (while (not (ess-noweb-chunk-is-code start)) (setq start (+ (ess-noweb-sign cnt) start))) (setq i (1+ i))) (goto-char (marker-position (cdr (ess-noweb-chunk-vector-aref start)))) (forward-line 1)) (if ess-noweb-narrowing (ess-noweb-narrow-to-chunk-pair))) (defun ess-noweb-previous-code-chunk (&optional n) "Goto to the -Nth code chunk from point." (interactive "p") (ess-noweb-next-code-chunk (- n))) (defun ess-noweb-next-chunk (&optional n) "If in a documentation chunk, goto to the Nth documentation chunk from point, else goto to the Nth code chunk from point." (interactive "p") ;; (dbg (current-buffer)) (if (ess-noweb-in-code-chunk) (ess-noweb-next-code-chunk n) (ess-noweb-next-doc-chunk n))) (defun ess-noweb-previous-chunk (&optional n) "If in a documentation chunk, goto to the -Nth documentation chunk from point, else goto to the -Nth code chunk from point." (interactive "p") (ess-noweb-next-chunk (- n))) (defvar ess-noweb-chunk-history nil "") (defun ess-noweb-goto-chunk () "Goto the named chunk." (interactive) (widen) (let* ((completion-ignore-case t) (alist (ess-noweb-build-chunk-alist)) (chunk (ess-completing-read "Chunk" (delete "" (mapcar 'car alist)) nil t nil ess-noweb-chunk-history (ess-noweb-goto-chunk-default)))) (goto-char (cdr (assoc chunk alist)))) (if ess-noweb-narrowing (ess-noweb-narrow-to-chunk-pair))) (defun ess-noweb-goto-chunk-default () (save-excursion (if (re-search-backward "<<" (save-excursion (beginning-of-line) (point)) 'move) (goto-char (match-beginning 0))) (if (re-search-forward "<<\\(.*\\)>>" (save-excursion (end-of-line) (point)) t) (buffer-substring (match-beginning 1) (match-end 1)) nil))) (defun ess-noweb-build-chunk-alist () (if (not ess-noweb-chunk-vector) (ess-noweb-update-chunk-vector)) ;; The naive recursive solution will exceed MAX-LISP-EVAL-DEPTH in ;; buffers w/ many chunks. Maybe there is a tail recursivce solution, ;; but iterative solutions should be acceptable for dealing with vectors. (let ((alist nil) (i (1- (length ess-noweb-chunk-vector)))) (while (>= i 0) (let* ((chunk (aref ess-noweb-chunk-vector i)) (name (car chunk)) (marker (cdr chunk))) (if (and (stringp name) (not (assoc name alist))) (setq alist (cons (cons name marker) alist)))) (setq i (1- i))) alist)) (defun ess-noweb-goto-next (&optional cnt) "Goto the continuation of the current chunk." (interactive "p") (widen) (if (not ess-noweb-chunk-vector) (ess-noweb-update-chunk-vector)) (let ((start (ess-noweb-find-chunk-index-buffer))) (if (not (ess-noweb-chunk-is-code start)) (setq start (1+ start))) (if (ess-noweb-chunk-is-code start) (let ((name (car (ess-noweb-chunk-vector-aref start))) (i 1)) (while (<= i (abs cnt)) (setq start (+ (ess-noweb-sign cnt) start)) (while (not (equal (car (ess-noweb-chunk-vector-aref start)) name)) (setq start (+ (ess-noweb-sign cnt) start))) (setq i (1+ i))) (goto-char (marker-position (cdr (ess-noweb-chunk-vector-aref start)))) (forward-line 1)))) (if ess-noweb-narrowing (ess-noweb-narrow-to-chunk-pair))) (defun ess-noweb-goto-previous (&optional cnt) "Goto the previous chunk." (interactive "p") (ess-noweb-goto-next (- cnt))) (defun ess-noweb-occur (arg) "Find all occurences of the current chunk. This function simply runs OCCUR on \"<>\"." (interactive "P") (let ((n (if (and arg (numberp arg)) arg 0)) (idx (ess-noweb-find-chunk-index-buffer))) (if (ess-noweb-chunk-is-code idx) (occur (regexp-quote (concat "<<" (car (aref ess-noweb-chunk-vector idx)) ">>")) n) (setq idx (1+ idx)) (while (not (ess-noweb-chunk-is-code idx)) (setq idx (1+ idx))) (occur (regexp-quote (concat "<<" (car (aref ess-noweb-chunk-vector idx)) ">>")) n)))) ;;; Insertion (defun ess-noweb-new-chunk (name) "Insert a new chunk." (interactive "sChunk name: ") (insert "@ \n<<" name ">>=\n") (save-excursion (insert "@ %def \n")) (ess-noweb-update-chunk-vector)) (defun ess-noweb-at-beginning-of-line () (equal (save-excursion (beginning-of-line) (point)) (point))) (defun ess-noweb-electric-@ (arg) "Smart incarnation of `@', starting a new documentation chunk, maybe. If given an numerical argument, it will act just like the dumb `@'. Otherwise and if at the beginning of a line in a code chunk: insert \"@ \" and update the chunk vector." (interactive "P") (if arg (self-insert-command (if (numberp arg) arg 1)) (if (and (ess-noweb-at-beginning-of-line) (ess-noweb-in-code-chunk)) (progn (insert "@ ") (ess-noweb-update-chunk-vector)) (self-insert-command 1)))) (defun ess-noweb-electric-< (arg) "Smart incarnation of `<', starting a new code chunk, maybe. If given an numerical argument, it will act just like the dumb `<'. Otherwise and if at the beginning of a line in a documentation chunk: insert \"<<>>=\", a closing \"@\" and a newline if necessary. Leave point in the middle and and update the chunk vector." (interactive "P") (if arg (self-insert-command (if (numberp arg) arg 1)) (if (and (ess-noweb-at-beginning-of-line) (not (ess-noweb-in-code-chunk))) (progn (insert "<<") (save-excursion (insert ">>=\n@ ") (if (not (looking-at "\\s *$")) (newline))) (ess-noweb-update-chunk-vector)) (self-insert-command 1)))) ;;; Modes (defun ess-noweb-set-chunk-code-mode () "Set the ess-noweb-code-mode for the current chunk" (interactive) (if (ess-noweb-in-code-chunk) (progn ;; Reset code-mode to default and then check for a mode comment. (setq ess-noweb-code-mode ess-noweb-default-code-mode) (let (mode chunk-name) (save-excursion (save-restriction (end-of-line) (re-search-backward "^[ \t]*<<\\(.*\\)>>=" nil t) (setq chunk-name (match-string 1)) (widen) (goto-char (point-min)) (re-search-forward (concat "^<<" (regexp-quote chunk-name) ">>=") nil t) (beginning-of-line 2) (setq mode (ess-noweb-in-mode-line)) (if (functionp mode) (setq ess-noweb-code-mode mode)))))) (error "This only makes sense in a code chunk"))) (defun ess-noweb-set-doc-syntax-table () "Sets the doc-mode syntax-table to treat code quotes as comments." (interactive) (let ((square-bracket-string (char-to-string (char-syntax ?\[)))) (if (string= square-bracket-string "(") (progn (modify-syntax-entry ?\[ "(]12b" ess-noweb-doc-mode-syntax-table) (modify-syntax-entry ?\] ")[34b" ess-noweb-doc-mode-syntax-table)) (progn (modify-syntax-entry ?\[ (concat square-bracket-string " 12b") ess-noweb-doc-mode-syntax-table) (modify-syntax-entry ?\] (concat square-bracket-string " 34b") ess-noweb-doc-mode-syntax-table))))) (defun ess-noweb-select-mode () "Select ess-noweb-DOC-MODE or ess-noweb-CODE-MODE, as appropriate." (interactive) (let ((this-chunk-index (ess-noweb-find-chunk-index-buffer))) ;; Has the last change to the buffer taken us into a different ;; chunk ? (if (not (equal this-chunk-index ess-noweb-last-chunk-index)) (progn (setq ess-noweb-last-chunk-index this-chunk-index) (if (ess-noweb-in-code-chunk) ;; Inside a code chunk (progn ;; Find out which code mode to use (ess-noweb-set-chunk-code-mode) ;; If we aren't already using it, use it. (if (not (equal major-mode ess-noweb-code-mode)) (progn (funcall ess-noweb-code-mode) (run-hooks 'ess-noweb-select-mode-hook) (run-hooks 'ess-noweb-select-code-mode-hook)))) ;; Inside a documentation chunk (progn (if (not (equal major-mode ess-noweb-doc-mode)) (progn (funcall ess-noweb-doc-mode))) (if (not ess-noweb-doc-mode-syntax-table) (progn (message "Setting up syntax table") (setq ess-noweb-doc-mode-syntax-table (make-syntax-table (syntax-table))) (ess-noweb-set-doc-syntax-table))) (set-syntax-table ess-noweb-doc-mode-syntax-table) (run-hooks 'ess-noweb-select-mode-hook) (run-hooks 'ess-noweb-select-doc-mode-hook))) (run-hooks 'ess-noweb-changed-chunk-hook))))) (defvar ess-noweb-doc-mode ess-noweb-default-doc-mode "Default major mode for editing noweb documentation chunks. It is not possible to have more than one doc-mode in a file. However, this variable is used to determine whether the doc-mode needs to by added to the mode-line") (defun ess-noweb-set-doc-mode (mode) "Change the major mode for editing documentation chunks." (interactive "CNew major mode for documentation chunks: ") (setq ess-noweb-doc-mode mode) (setq ess-noweb-doc-mode-syntax-table nil) ;;Pretend we've changed chunk, so the mode will be reset if necessary (setq ess-noweb-last-chunk-index (1- ess-noweb-last-chunk-index)) (ess-noweb-select-mode)) (defun ess-noweb-set-code-mode (mode) "Change the major mode for editing all code chunks." (interactive "CNew major mode for all code chunks: ") (setq ess-noweb-default-code-mode mode) ;;Pretend we've changed chunk, so the mode will be reset if necessary (setq ess-noweb-last-chunk-index (1- ess-noweb-last-chunk-index)) (ess-noweb-select-mode)) (defun ess-noweb-set-this-code-mode (mode) "Change the major mode for editing this code chunk. The only sensible way to do this is to add a mode line to the chunk" (interactive "CNew major mode for this code chunk: ") (if (ess-noweb-in-code-chunk) (progn (setq ess-noweb-code-mode mode) (save-excursion (save-restriction (let (chunk-name) (widen) (end-of-line) (re-search-backward "^[ \t]*<<\\(.*\\)>>=" nil t) (setq chunk-name (match-string 1)) (goto-char (point-min)) (re-search-forward (concat "^<<" (regexp-quote chunk-name) ">>=") nil t) (beginning-of-line 2)) ;; remove mode-line, if there is one (if (ess-noweb-in-mode-line) (progn (kill-line) (kill-line))) (if (not (equal ess-noweb-code-mode ess-noweb-default-code-mode)) (progn (setq mode (substring (symbol-name mode) 0 -5)) ;; Need to set major mode so that we can comment out ;; the mode line (funcall ess-noweb-code-mode) (if (not (boundp 'comment-start)) (setq comment-start "#")) (insert comment-start " -*- " mode " -*- " comment-end "\n"))) (setq ess-noweb-last-chunk-index (1- ess-noweb-last-chunk-index))))) (message "This only makes sense in a code chunk."))) ;;; Misc (defun ess-noweb-mode-version () "Echo the RCS identification of noweb mode." (interactive) (message "Thorsten's ess-noweb-mode, now part of ESS version %s" ess-version)) (defun ess-noweb-describe-mode () "Describe noweb mode." (interactive) (describe-function 'ess-noweb-mode)) (defun ess-noweb-insert-default-mode-line () "Insert line that will set the noweb mode of this file in emacs. The file is set to use the current doc and default-code modes, so ensure they are set correctly (with ess-noweb-set-code-mode and ess-noweb-set-doc-mode) before calling this function" (interactive) (save-excursion (goto-char 1) (if (ess-noweb-in-mode-line) (progn (kill-line) (kill-line))) (if (not (eq major-mode ess-noweb-doc-mode)) (ess-noweb-select-mode)) (insert comment-start " -*- mode: noweb; ess-noweb-default-code-mode: " (symbol-name ess-noweb-default-code-mode) (if (not (eq ess-noweb-doc-mode ess-noweb-default-doc-mode)) (concat "; ess-noweb-doc-mode: " (symbol-name ess-noweb-doc-mode) ";") ";") " -*-" comment-end "\n")) (ess-noweb-select-mode)) (defun ess-noweb-mouse-first-button (event) (interactive "e") (mouse-set-point event) (if (and ess-noweb-use-mouse-navigation (eq (save-excursion (end-of-line) (re-search-backward "^[\t ]*\\(<<\\)\\(.*\\)\\(>>\\)" nil t)) (save-excursion (beginning-of-line) (point)))) (progn (if (< (point) (match-beginning 2)) (let ((chunk-name (buffer-substring-no-properties (match-beginning 2) (match-end 2)))) (re-search-backward (concat "<<" (regexp-quote chunk-name) ">>") nil t)) (if (and (<= (match-end 2) (point)) (> (+ 2 (match-end 2)) (point))) (let ((chunk-name (buffer-substring-no-properties (match-beginning 2) (match-end 2)))) (re-search-forward (concat "<<" (regexp-quote chunk-name) ">>") nil t))))))) ;;; Debugging (defun ess-noweb-log (s) (let ((b (current-buffer))) (switch-to-buffer (get-buffer-create "*noweb-log*")) (goto-char (point-max)) (setq buffer-read-only nil) (insert s) (setq buffer-read-only t) (switch-to-buffer b))) (defvar ess-noweb-thread-alist nil "A list of threads in the current buffer. Each entry in the list contains 5 elements: 1) The name of the threads 2) The name of the immdiate parent thread in which it is used (nil if it is a \"top-level\" thread which is not used anywhere). 3) The name of the top-level parent thread in which it is used (i.e. a thread in which it is used but which is not itself used anywhere: nil if this thread is not used anywhere. 4) The format string to use to define line numbers in the output file of this thread. Should only be set if this thread is not used anywhere: if a thread is used as part of another thread, the parent thread's format string should be used. 5) If this is nil, tabs are converted to spaces in the tangled file. If it is a number, tabs are copied to the tangled file unchanged, and tabs are also used for indentation, with the number of spaces per tab defined by this number. This MUST be set in order to tangle makefiles, which depend on tabs.Should only be set if this thread is not used anywhere. otherwise set to nil. " ) (defun ess-noweb-update-thread-alist () "Updates the list of threads in the current buffer. Each entry in the list contains 5 elements: 1) The name of the thread 2) The name of the immdiate parent thread in which it is used (nil if it is a \"top-level\" thread which is not used anywhere). 3) The name of the top-level parent thread in which it is used (i.e. a thread in which it is used but which is not itself used anywhere: nil if this thread is not used anywhere. 4) The format string to use to define line numbers in the output file of this thread. Should only be set if this thread is not used anywhere: if a thread is used as part of another thread, the parent thread's format string should be used. 5) If this is nil, tabs are converted to spaces in the tangled file. If it is a number, tabs are copied to the tangled file unchanged, and tabs are also used for indentation, with the number of spaces per tab defined by this number. This MUST be set in order to tangle makefiles, which depend on tabs.Should only be set if this thread is not used anywhere. otherwise set to nil. " (interactive) (save-excursion (goto-char (point-min)) (let ((thread-alist) (thread-list-entry) (chunk-use-name) (current-thread) (new-thread-alist)) (while (re-search-forward "^[ \t]*<<\\(.*\\)>>\\(=\\)?" nil t) (goto-char (match-beginning 0)) ;; Is this the definition of a chunk ? (if (match-beginning 2) ;;We have a chunk definition (progn ;; Get the thread name (setq current-thread (buffer-substring-no-properties (match-beginning 1) (match-end 1))) ;; Is this thread already in our list ? (if (assoc current-thread thread-alist) nil (progn ;; If not, create an entry with 4 nils at the end (setq thread-list-entry (list (cons current-thread (make-list 4 nil)))) ;; And add it to the list (setq thread-alist (append thread-alist thread-list-entry))))) ;; Not a definition but a use (progn ;; Get the thread name (setq chunk-use-name (buffer-substring-no-properties (match-beginning 1) (match-end 1))) ;; Has the thread already been defined before being used ? (if (setq thread-list-entry (assoc chunk-use-name thread-alist)) ;; If it has, set its parent to be the thread we are in at the moment (setcar (cdr thread-list-entry) current-thread) ;; If not, add it to the list, with its parent name and 3 nils (progn (setq thread-list-entry (list (cons chunk-use-name (cons current-thread (make-list 3 nil))))) (setq thread-alist (append thread-alist thread-list-entry))))) ) ;;Go to the next line (beginning-of-line 2)) ;; Now, the second element of each entry points to that thread's ;; immediate parent. Need to set it to the thread's ultimate ;; parent. (let ((thread-counter 0) (this-thread) (this-thread-parent)) (while (<= thread-counter (1- (length thread-alist))) (setq this-thread (nth thread-counter thread-alist)) (setq this-thread-parent (assoc (car (cdr this-thread)) thread-alist)) (while (not (equal nil (car (cdr this-thread-parent)))) (setq this-thread-parent (assoc (car (cdr this-thread-parent)) thread-alist))) (setq this-thread (cons (car this-thread) (cons (car (cdr this-thread)) (cons (car this-thread-parent) (nthcdr 2 this-thread))))) (setq new-thread-alist (append new-thread-alist (list this-thread))) (setq thread-counter (1+ thread-counter)))) (setq ess-noweb-thread-alist new-thread-alist)))) ; Option setting functions to go here (defun ess-noweb-set-thread-line-format ()) (defun ess-noweb-set-thread-tabs ()) (defvar ess-noweb-default-line-number-format nil "The format string to use to define line numbers in this thread. If nil, do not use line numbers.") (defvar ess-noweb-default-line-number-skip-lines 0 "The number of initial lines to output before the line number. This may be useful in shell scripts, where the first line (or two) must have a specific form.") (defvar ess-noweb-default-tab-width 8 "If a number, convert tabs to that number of spaces in the output. If nil, let tabs through to the output unaltered.") (defvar ess-noweb-line-number-format ess-noweb-default-line-number-format "The format string to use to define line numbers in this thread. If nil, do not use line numbers.") (defvar ess-noweb-line-number-skip-lines ess-noweb-default-line-number-skip-lines "The number of initial lines to output before the line number. This may be useful in shell scripts, where the first line (or two) must have a specific form.") (defvar ess-noweb-tab-width ess-noweb-default-tab-width "If a number, convert tabs to that number of spaces in the output. If nil, let tabs through to the output unaltered.") (defun ess-noweb-get-thread-local-variables () "Get the values of the variables that are local to a thread." (interactive) (save-excursion (save-restriction (end-of-line) (re-search-backward "^[ \t]*<<\\(.*\\)>>=" nil t) (let ((chunk-name (match-string 1))) (widen) (goto-char (point-min)) (re-search-forward (concat "^<<" (regexp-quote chunk-name) ">>=") nil t) (beginning-of-line 2) (while (looking-at ".*-\*-.*-\*-") (let ((this-line (buffer-substring-no-properties (point) (progn (end-of-line) (point))))) (if (string-match "mode:[ \t]*\\([^\t ]*\\)" this-line) (setq ess-noweb-code-mode (if (featurep 'xemacs) (match-string 1 this-line) (match-string-no-properties 1 this-line)) )) (if (string-match "ess-noweb-line-number-format:[ \t]*\"\\([^\"]*\\)\"" this-line) (setq ess-noweb-line-number-format (if (featurep 'xemacs) (match-string 1 this-line) (match-string-no-properties 1 this-line)) )) (if (string-match "ess-noweb-line-number-skip-lines:[ \t]*\\([^\t ]*\\)" this-line) (setq ess-noweb-line-number-skip-lines (string-to-number (if (featurep 'xemacs) (match-string 1 this-line) (match-string-no-properties 1 this-line))))) (if (string-match "ess-noweb-tab-width:[ \t]*\\([^\t ]*\\)" this-line) (setq ess-noweb-tab-width (string-to-number (if (featurep 'xemacs) (match-string 1 this-line) (match-string-no-properties 1 this-line))))) (beginning-of-line 2))))))) (defun ess-noweb-reset-thread-local-variables () "Resets the thread-local variables to their default values" (setq ess-noweb-tab-width ess-noweb-default-tab-width) (setq ess-noweb-line-number-format ess-noweb-default-line-number-format) (setq ess-noweb-line-number-skip-lines ess-noweb-default-line-number-skip-lines)) (defun ess-noweb-write-line-number (line-number-format buffer) (if line-number-format (progn (let ((this-line (count-lines (point-min)(point)))) (while (string-match ".*\\(%L\\).*" line-number-format) (setq line-number-format (replace-match (format "%d" this-line) t t line-number-format 1))) (while (string-match ".*\\(%F\\).*" line-number-format) (setq line-number-format (replace-match (format "%s" (buffer-file-name)) t t line-number-format 1))) (while (string-match ".*\\(%N\\).*" line-number-format) (setq line-number-format (replace-match "\n" t t line-number-format 1))) (save-excursion (set-buffer buffer) (insert line-number-format)))))) (defun ess-noweb-tangle-chunk ( &optional buffer prefix-string) "Generate the code produced by this chunk, & any threads used in this chunk." (interactive) (save-excursion (ess-noweb-reset-thread-local-variables) (ess-noweb-get-thread-local-variables) (ess-noweb-update-chunk-vector) (let* ((chunk-end (progn (end-of-line) (re-search-forward "^@" nil t) (beginning-of-line) (point))) ;;get name and start point of this chunk (chunk-start (progn (re-search-backward "^<<\\([^>]*\\)>>=$" nil t) (beginning-of-line 2) (point))) (chunk-name (buffer-substring-no-properties (match-end 1) (match-beginning 1))) ;; get end of this chunk ;; Get information we need about this thread (thread-info (assoc chunk-name ess-noweb-thread-alist)) (thread-tabs (nth 4 thread-info)) (line-number-format (nth 3 thread-info)) (thread-name-re) (post-chunk) (pre-chunk) (first-line t) (tangle-buffer (generate-new-buffer "Tangle Buffer"))) (progn (goto-char chunk-start) ;; If this is a mode-line, ignore it (while (looking-at ".*-\\*-.*-\\*-") (beginning-of-line 2)) ;; If we want to include line numbers, write one (if line-number-format (while (> ess-noweb-line-number-skip-lines 0) (append-to-buffer tangle-buffer (point) (save-excursion (progn (end-of-line) (point)))) (beginning-of-line 2) (1- ess-noweb-line-number-skip-lines)) (ess-noweb-write-line-number line-number-format buffer)) (message "Now at %d" (point)) (while (< (point) chunk-end) (untabify (point) (save-excursion (beginning-of-line 2)(point))) ;; This RE gave me trouble. Without the `\"', it ;; recognised itself and so could not copy itself ;; correctly. (if (looking-at "\\([^\n\"@]*\\)<<\\(.*\\)\\(>>\\)\\([^\n\"]*\\)$") (progn (save-excursion (save-restriction (setq thread-name-re (concat "<<" (regexp-quote (match-string 2)) ">>=")) (setq pre-chunk (match-string 1)) (if prefix-string (setq pre-chunk (concat prefix-string pre-chunk))) (setq post-chunk (match-string 4)) (widen) (goto-char (point-min)) (while (re-search-forward thread-name-re nil t) (ess-noweb-tangle-chunk tangle-buffer pre-chunk) (forward-line 1))) (if post-chunk (save-excursion (set-buffer tangle-buffer) (backward-char) (insert post-chunk) (beginning-of-line 2))))) ;; Otherwise, just copy this line (setq pre-chunk (buffer-substring (point) (save-excursion (beginning-of-line 2) (point)))) ;; Add a prefix if necessary (if (and prefix-string (> (length pre-chunk) 1)) (setq pre-chunk (concat prefix-string pre-chunk))) ;; And copy it to the buffer (save-excursion (set-buffer tangle-buffer) (insert pre-chunk))) ;; If this is the first line of the chunk, we need to change ;; prefix-string to consist solely of spaces (if (and first-line prefix-string) (progn (setq prefix-string (make-string (length prefix-string) ?\ )) (setq first-line nil))) ;; Either way, go to the next line (beginning-of-line 2)) (save-excursion (set-buffer tangle-buffer) (goto-char (point-min)) (while (re-search-forward "\@\<<" nil t) (replace-match "<<" nil nil) (forward-char 3)) (if thread-tabs (progn (setq tab-width thread-tabs) (tabify (point-min)(point-max))) (untabify (point-min)(point-max)))) (if buffer (save-excursion (set-buffer buffer) (insert-buffer-substring tangle-buffer) (kill-buffer tangle-buffer))) )))) (defun ess-noweb-tangle-thread ( name &optional buffer) "Given the name of a thread, tangles the thread to buffer. If no buffer is given, create a new one with the same name as the thread." (interactive "sWhich thread ? ") (if (not buffer) (progn (setq buffer (get-buffer-create name)) (save-excursion (set-buffer buffer) (erase-buffer)))) (save-excursion (goto-char (point-min)) (let ((chunk-counter 0)) (while (re-search-forward "^<<\\(.*\\)>>=[\t ]*" nil t) (if (string= (match-string 1) name) (progn (setq chunk-counter (1+ chunk-counter)) (message "Found %d chunks" chunk-counter) (ess-noweb-tangle-chunk buffer))))))) (defun ess-noweb-tangle-current-thread ( &optional buffer) (interactive) (save-excursion (let* ((chunk-start (progn (re-search-backward "^<<\\([^>]*\\)>>=[\t ]*$" nil t) (beginning-of-line 2) (point))) (chunk-name (buffer-substring-no-properties (match-end 1) (match-beginning 1)))) (ess-noweb-tangle-thread chunk-name buffer)))) ;menu functions ;;; Finale (run-hooks 'ess-noweb-mode-load-hook) (provide 'ess-noweb-mode) ;; Changes made by Mark Lunt (mark.lunt@mrc-bsu.cam.ac.uk) 22/03/1999 ;; The possibility of having code chunks using more than one language ;; was added. This was first developed by Adnan Yaqub ;; (AYaqub@orga.com) for syntax highlighting, but even people who hate ;; highlighting may like to maintain their Makefile with their code, ;; or test-scripts with their programs, or even user documentation as ;; latex-mode code chunks. ;; This required quite a few changes to ess-noweb-mode: ;; 1) A new variable `ess-noweb-default-code-mode' was create to do the job ;; `ess-noweb-code-mode' used to. ;; 2) ess-noweb-code-mode now contains the code-mode of the current chunk ;; 3) Each chunk can now have its own mode-line to tell emacs what ;; mode to use to edit it. The function `ess-noweb-in-mode-line' ;; recognises such mode-lines, and the function ;; `ess-noweb-set-this-code-mode' sets the code mode for the current ;; chunk and adds a mode-line if necessary. If several chunks have ;; the same name, the mode-line must appear in the first chunk with ;; that name. ;; 4) The mechanism for deciding whether to change mode was altered, ;; since the old method assumed a single code mode. Now, ;; `ess-noweb-last-chunk-index' keeps track of which chunk we were in ;; last. If we have moved to a different chunk, we have to check ;; which mode we should be in, and change if necessary. ;; The keymap and menu-map handling was changed. Easymenu was used to ;; define the menu, and it the keymap was attached to the 'official' ;; minor-modes-keymaps list. This means that ;; 1) It was automatically loaded when ess-noweb-mode was active and ;; unloaded when it was inactive. ;; 2) There was no need to worry about the major mode map clobbering ;; it , since it takes precedence over the major mode ;; map. `ess-noweb-setup-keymap' is therefore now superfluous ;; The menu was also reorganised to make it less cluttered, so there ;; would be room for adding tangling and weaving commands (one day). ;; Mouse navigation (at least under Emacs (AJR)) is supported, in so ;; far as clicking mouse-1 on the '<<' of a chunk name moves to the ;; previous instance of that chunk name, and clicking in the '>>' ;; moves to the next instance. They are not mouse-hightlighted, ;; though: too much hassle for zero added functionality. ;; ess-noweb-doc-mode has been given its own syntax-table. It is the same ;; as the current doc-mode syntax-table, except that [[ is a comment ;; start and ]] a comment end. Fixes some ugliness in LaTeX-mode if ;; `$' or `%' appear in quoted code (or even `<<', which happens often ;; in C++). ;; (This should make ess-noweb-hide-code-quotes and ;; ess-noweb-restore-code-quotes unnecessary, but I have not yet removed ;; them, nor the calls to them). ;; A new function `ess-noweb-indent-line' was defined and bound by default ;; to the tab key. This should indent the current line correctly in ;; whichever mode we are currently in. Previously, c-mode in ;; particular did not behave well with indentation (although ;; `ess-noweb-fill-chunk' worked fine). Indentation is only accurate ;; within the chunk: it does not know the syntax at the end of the ;; previous chunk, so it does not know where to start indenting in ;; this chunk. However, provided the indentation within each chunk is correct, ;; notangle will correctly indented code. ;; (I think it would be good to separate filling and indenting, ;; though, since `indent-region' and `fill-region' have completely ;; different meanings in LaTeX-mode (and both are useful)) ;; ess-noweb-mode and ess-noweb-minor-mode were given an optional argument, so ;; that (ess-noweb-mode -1) turns it off, (ess-noweb-mode 1) turns it on, and ;; (ess-noweb-mode) toggles it. This is considered normal for minor modes. ;; buffer-substring changed to buffer-substring-no-properties: ;; comparisons with buffer-substring can be unreliable if highlighting ;; is used. ;; New functions `ess-noweb-in-code-chunk' & `ess-noweb-chunk-is-code' created ;; to replace (if (stringp (car (ess-noweb-find-chunk)))) and ;; (if (stringp (car (ess-noweb-chunk-vector-aref index)))). ;; `ess-noweb-insert-mode-line' was renamed ;; `ess-noweb-insert-default-mode-line' and modified to put the mode-line ;; at the start of the file and remove any existing mode-line. ;; a '<=' in `ess-noweb-find-chunk-index' changed to '<', so we get the ;; right answer if point is on the first character in a chunk ;; The name of `ess-noweb-post-command-hook' changed to ;; `ess-noweb-post-command-function', since it is a function. ;; All the highlighting code moved to a separate file: ;; (ess-noweb-font-lock-mode.el) ;; Menu driven tangling is in the process of being added. It can ;; currently tangle a single chunk or a series of chunks with the ;; same name (which I refer to as a thread) into a separate ;; buffer. This buffer can then be saved to a file, sent to an ;; interpreter, whatever. I haven't tested using line-numbers as yet. ;;; ess-noweb-mode.el ends here ess/lisp/ess-julia.el0000664000175000017500000004232112601651046013114 0ustar eddedd;; ess-julia.el --- ESS julia mode and inferior interaction ;; ;; Copyright (C) 2012-2015 Vitalie Spinu and the ESS Core team. ;; ;; Filename: ess-julia.el ;; Author: Vitalie Spinu (based on julia-mode.el from julia-lang project) ;; Maintainer: Vitalie Spinu ;; Created: 02-04-2012 (ESS 12.03) ;; Keywords: ESS, julia ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; This file is *NOT* part of GNU Emacs. ;; This file is part of ESS ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, or ;; (at your option) any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; ;; Customise inferior-julia-program-name to point to your julia binary ;; and start the inferior with M-x julia. ;; ;; As of Sept 2015, this file depends heavily on julia-mode.el from the Julia ;; sources. If you install ESS using `make', this will work fine, otherwise ;; ensure that julia-mode.el is on your path before loading this file. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Code: (require 'compile); for compilation-* below (require 'ess-utils) ;;;--- ALL the following only if julia-mode is found and loaded correctly : ---------- (condition-case nil (progn (require 'julia-mode) (when (featurep 'julia-mode) (eval-when-compile (require 'cl)) (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defun ess-julia-send-string-function (process string visibly) "Send the Julia STRING to the PROCESS. VISIBLY is not currently used." (let ((file (concat temporary-file-directory "julia_eval_region.jl"))) (with-temp-file file (insert string)) (process-send-string process (format ess-load-command file)))) ;;; HELP (defun ess-julia-get-help-topics (&optional proc) (append (ess-get-words-from-vector "ESS.all_help_topics()\n") (ess-julia--get-objects))) ;; (ess-command com))) (defun ess-julia--retrive-topics (url) (with-current-buffer (url-retrieve-synchronously url) (require 'url) (goto-char (point-min)) (let (out) (while (re-search-forward "toctree.*href=\"\\(.+\\)\">\\(.+\\)Introduction (let* ((pages (or ess-julia--manual-topics (setq ess-julia--manual-topics (ess-julia--retrive-topics "http://docs.julialang.org/en/latest/manual/")))) (page (ess-completing-read "Lookup:" pages nil t))) (browse-url (get-text-property 1 :manual page)))) (defun ess-julia-input-sender (proc string) (save-current-buffer (let* ((help-?-regexp "^ *\\(?:\\(?1: *?\\? *\\)\\(?2:.+\\)\\)") (help-?-match (string-match help-?-regexp string))) (cond (help-?-match (ess-display-help-on-object (match-string 2 string)) (process-send-string proc "\n")) (t ;; normal command (inferior-ess-input-sender proc string)))))) ;; julia 0.3.0 doesn't provide categories. Thus we don't support this anymore. ;; (defun ess-julia-reference-lookup-function (&rest args) ; args are not used ;; (interactive) ;; "Look up reference topics" ;; ;;
  • Introduction
  • ;; (let* ((pages (ess-get-words-from-vector "ESS.help_categories()\n"))) ;; (ess-display-help-on-object ;; (ess-completing-read "Category" pages nil t)))) ;;; COMPLETION (defun ess-julia-object-completion () "Return completions at point in a format required by `completion-at-point-functions'. " (let ((proc (ess-get-next-available-process ess-dialect t)) (beg (ess-symbol-start))) (if proc (when beg (let* ((prefix (buffer-substring-no-properties beg (point))) (obj (and (string-match "\\(.*\\)\\..*$" prefix) (match-string 1 prefix))) (beg (if obj (+ beg 1 (length obj)) beg))) (list beg (point) (nreverse (mapcar 'car (ess-julia--get-objects proc obj))) :exclusive 'no))) (when (string-match "complet" (symbol-name last-command)) (message "No ESS process of dialect %s started" ess-dialect) nil)))) (defun ess-julia-objects (prefix) "Get all cached objects" (when prefix (let ((proc (ess-get-next-available-process nil t))) (if (string-match "\\(.*\\)\\..*$" prefix) (let ((module (match-string 1 prefix))) (mapcar (lambda (el) (concat module "." (car el))) (ess-julia--get-objects proc module))) (ess-julia--get-objects proc))))) (defun ess-julia--get-objects (&optional proc obj) "Return all available objects. Local caching might be used. If MODULE is givven, return only objects from that MODULE." (setq proc (or proc (get-process ess-local-process-name))) (when (process-live-p proc) (let ((objects (process-get proc 'objects))) (if (process-get proc 'busy) (if obj (assoc obj objects) (process-get proc 'objects)) (if obj (or (cdr (assoc obj objects)) ;; don't cache composite objects and datatypes (ess-julia--get-components proc obj)) ;; this segment is entered when user completon at top level is ;; requested, either Tab or AC. Hence Main is always updated. (let ((modules (ess-get-words-from-vector "ESS.main_modules()\n" nil nil proc)) (loc (process-get proc 'last-objects-cache)) (lev (process-get proc 'last-eval))) (prog1 (apply #'nconc (mapcar (lambda (mod) ;; we are caching all modules, and reinit Main every ;; time user enters commands (copy-sequence (or (and (or (not (equal mod "Main")) (ignore-errors (time-less-p lev loc))) (cdr (assoc mod objects))) (ess-julia--get-components proc mod t)))) modules)) (process-put proc 'last-objects-cache (current-time))))))))) (defun ess-julia--get-components (proc obj &optional cache?) (with-current-buffer (ess-command (format "ESS.components(%s)\n" obj) nil nil nil nil proc) (goto-char (point-min)) (let (list) (while (re-search-forward "^\\([^ \t\n]+\\) +\\([^ \t\n]+\\)$" nil t) (push (cons (match-string 1) (match-string 2)) list)) (when cache? (let ((objects (process-get proc 'objects))) (push (cons obj list) objects) (process-put proc 'objects objects))) list))) (defun ess-julia-get-object-help-string (sym) "Help string for ac." (let ((proc (ess-get-next-available-process nil t))) (if (null proc) "No free ESS process found" (let ((buf (get-buffer-create " *ess-command-output*"))) (with-current-buffer (process-buffer proc) (ess-with-current-buffer buf (ess--flush-help-into-current-buffer sym nil t))) (with-current-buffer buf (ess-help-underline) (goto-char (point-min)) (buffer-string)))))) (defvar ac-source-ess-julia-objects '((prefix . ess-symbol-start) (requires . 2) (candidates . ess-ac-julia-objects) (document . ess-julia-get-object-help-string)) "Auto-completion source for julia objects") (defun ess-ac-julia-objects () (ess-julia-objects ac-prefix)) (defun company-ess-julia-objects (command &optional arg &rest ignored) (interactive (list 'interactive)) (cl-case command (interactive (company-begin-backend 'company-ess-julia-objects)) (prefix (unless (company-in-string-or-comment) (let ((start (ess-symbol-start))) (when start (buffer-substring-no-properties start (point)))))) (candidates (all-completions arg (mapcar #'car (ess-julia-objects arg)))) (doc-buffer (company-doc-buffer (ess-julia-get-object-help-string arg))))) ;;; ERRORS (defvar ess-julia-error-regexp-alist '(ess-julia-in ess-julia-at ess-julia-while-load) "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.") (add-to-list 'compilation-error-regexp-alist-alist '(ess-julia-in "^\\s-*in [^ \t\n]* \\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) (add-to-list 'compilation-error-regexp-alist-alist '(ess-julia-at "^\\S-+\\s-+\\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) (add-to-list 'compilation-error-regexp-alist-alist '(ess-julia-while-load "^\\s-*\\(while loading\\s-\\(.*\\), in .* on line +\\([0-9]+\\)\\)" 2 3 nil 2 1)) ;;; ELDOC (defun ess-julia-eldoc-function () "Return the doc string, or nil. If an ESS process is not associated with the buffer, do not try to look up any doc strings." (interactive) (when (and (ess-process-live-p) (not (ess-process-get 'busy))) (let ((funname (or (and ess-eldoc-show-on-symbol ;; aggressive completion (symbol-at-point)) (car (ess--funname.start))))) (when funname (let* ((args (copy-sequence (nth 2 (ess-function-arguments funname)))) (W (- (window-width (minibuffer-window)) (+ 4 (length funname)))) (doc (concat (propertize funname 'face font-lock-function-name-face) ": "))) (when args (setq args (sort args (lambda (s1 s2) (< (length s1) (length s2))))) (setq doc (concat doc (pop args))) (while (and args (< (+ (length doc) (length (car args))) W)) (setq doc (concat doc " " (pop args)))) (when (and args (< (length doc) W)) (setq doc (concat doc " {--}")))) doc))))) ;;; IMENU (defvar ess-julia-imenu-generic-expression ;; don't use syntax classes, screws egrep '(("Function (_)" "[ \t]*function[ \t]+\\(_[^ \t\n]*\\)" 1) ("Function" "^[ \t]*function[ \t]+\\([^_][^\t\n]*\\)" 1) ("Const" "[ \t]*const \\([^ \t\n]*\\)" 1) ("Type" "^[ \t]*[a-zA-Z0-9_]*type[a-zA-Z0-9_]* \\([^ \t\n]*\\)" 1) ("Require" " *\\(\\brequire\\)(\\([^ \t\n)]*\\)" 2) ("Include" " *\\(\\binclude\\)(\\([^ \t\n)]*\\)" 2) )) ;;; CORE (defvar ess-julia-customize-alist '((comint-use-prompt-regexp . t) (ess-eldoc-function . 'ess-julia-eldoc-function) (inferior-ess-primary-prompt . "a> ") ;; from julia> (inferior-ess-secondary-prompt . nil) (inferior-ess-prompt . "\\w*> ") (ess-local-customize-alist . 'ess-julia-customize-alist) (inferior-ess-program . inferior-julia-program-name) (ess-get-help-topics-function . 'ess-julia-get-help-topics) (ess-help-web-search-command . "http://docs.julialang.org/en/latest/search/?q=%s") (ess-manual-lookup-command . 'ess-julia-manual-lookup-function) ;; (ess-reference-lookup-command . 'ess-julia-reference-lookup-function) (ess-load-command . "include(\"%s\")\n") (ess-funargs-command . "ESS.fun_args(\"%s\")\n") (ess-dump-error-re . "in \\w* at \\(.*\\):[0-9]+") (ess-error-regexp . "\\(^\\s-*at\\s-*\\(?3:.*\\):\\(?2:[0-9]+\\)\\)") (ess-error-regexp-alist . ess-julia-error-regexp-alist) (ess-send-string-function . nil);'ess-julia-send-string-function) (ess-imenu-generic-expression . ess-julia-imenu-generic-expression) ;; (inferior-ess-objects-command . inferior-R-objects-command) ;; (inferior-ess-search-list-command . "search()\n") (inferior-ess-help-command . "ESS.help(\"%s\")\n") ;; (inferior-ess-help-command . "help(\"%s\")\n") (ess-language . "julia") (ess-dialect . "julia") (ess-suffix . "jl") (ess-ac-sources . '(ac-source-ess-julia-objects)) (ess-company-backends . '(company-ess-julia-objects)) (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-mode-editing-alist . nil) (ess-change-sp-regexp . nil );ess-R-change-sp-regexp) (ess-help-sec-regex . ess-help-R-sec-regex) (ess-help-sec-keys-alist . ess-help-R-sec-keys-alist) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-cmd-delay . ess-R-cmd-delay) (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-jl-namedb.el" ) (ess-smart-operators . ess-R-smart-operators) (inferior-ess-help-filetype . nil) (inferior-ess-exit-command . "exit()\n") ;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help? (inferior-ess-start-file . nil) ;; "~/.ess-R" (inferior-ess-start-args . "") (inferior-ess-language-start . nil) (ess-STERM . "iESS") (ess-editor . R-editor) (ess-pager . R-pager) ) "Variables to customize for Julia -- set up later than emacs initialization.") (defcustom inferior-julia-args "" "String of arguments (see 'julia --help') used when starting julia." :group 'ess-julia :type 'string) (defvar ess-julia-mode-map ess-mode-map) ;;;###autoload (define-derived-mode ess-julia-mode julia-mode "ESS[julia-derived]" "Major mode for editing julia source. See `ess-mode' for more help." (ess-mode ess-julia-customize-alist nil t) ;; for emacs >= 24 (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first (add-hook 'completion-at-point-functions 'ess-julia-object-completion nil 'local) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (if (fboundp 'ess-add-toolbar) (ess-add-toolbar)) (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function) (set (make-local-variable 'ess-julia-basic-offset) 4) (setq imenu-generic-expression ess-julia-imenu-generic-expression) (imenu-add-to-menubar "Imenu-jl") (run-hooks 'ess-julia-mode-hook)) (defvar ess-julia-mode-hook nil) (defvar ess-julia-post-run-hook nil "Functions run in process buffer after starting julia process.") ;;;###autoload (defun julia (&optional start-args) "Call 'julia'. Optional prefix (C-u) allows to set command line arguments, such as --load=. This should be OS agnostic. If you have certain command line arguments that should always be passed to julia, put them in the variable `inferior-julia-args'." (interactive "P") ;; get settings, notably inferior-julia-program-name : (if (null inferior-julia-program-name) (error "'inferior-julia-program-name' does not point to 'julia' or 'julia-basic' executable") (setq ess-customize-alist ess-julia-customize-alist) (ess-write-to-dribble-buffer ;; for debugging only (format "\n(julia): ess-dialect=%s, buf=%s, start-arg=%s\n current-prefix-arg=%s\n" ess-dialect (current-buffer) start-args current-prefix-arg)) (let* ((jl-start-args (concat inferior-julia-args " " ; add space just in case (if start-args (read-string (concat "Starting Args" (if inferior-julia-args (concat " [other than '" inferior-julia-args "']")) " ? ")) nil)))) (inferior-ess jl-start-args) (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first (add-hook 'completion-at-point-functions 'ess-julia-object-completion nil 'local) (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (setq comint-input-sender 'ess-julia-input-sender) (ess--tb-start) (set (make-local-variable 'ess-julia-basic-offset) 4) ;; remove ` from julia's logo (goto-char (point-min)) (while (re-search-forward "`" nil t) (replace-match "'")) (goto-char (point-max)) ;; --> julia helpers from ../etc/ess-julia.jl : (ess--inject-code-from-file (format "%sess-julia.jl" ess-etc-directory)) (with-ess-process-buffer nil (run-mode-hooks 'ess-julia-post-run-hook)) ))) (add-to-list 'auto-mode-alist '("\\.jl\\'" . ess-julia-mode)) )) (error nil)) (provide 'ess-julia) ;;; ess-julia.el ends here ess/lisp/ess-menu.el0000664000175000017500000001243412423756516012770 0ustar eddedd;;; ess-menu.el --- Menu and Speedbar support for statistical ;;; programming and analysis ;; Copyright (C) 2000--2005 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: September 4, 2000 ;; Maintainer: ESS Core Team ;; Keywords: statistics, languages ;; Summary: general functions for ESS ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;;; Code: ;;*;; Requires and autoloads ;;;===================================================== (require 'ess-custom) (if (and (featurep 'xemacs); need this, since require in XEmacs has only 2 arg (not (require 'imenu "imenu.elc"))) (message "** warning: 'imenu not available for this version of XEmacs")) ;;(defgroup ess-menu nil ;; "ESS: object menu systems." ;; :group 'ess ;; :prefix "ess-") ;;; Function Menu (func-menu) for XEmacs: ;; (if ess-funcmenu-use-p ;; (defvar fume-function-name-regexp-S ;; (append ;; '((s-mode . fume-function-name-regexp-smode) ;; (r-mode . fume-function-name-regexp-smode)) ;; fume-function-name-regexp-alist) ;; "Expression to get function names")) ;;; Imenu for Emacs/XEmacs... ;;; XLS imenu support ;; (defun ess-imenu-XLS (&optional arg) ;; "XLispStat Language Imenu support for ESS." ;; (interactive) ;; (setq imenu-generic-expression ;; '( (nil "New one needed" 1))) ;; (imenu-add-to-menubar "XLS-fcts")) ;; (defun imenu-example--XLS-extract-index-name () ;; ;; Example of a candidate for `imenu-extract-index-name-function'. ;; ;; This will generate a flat index of definitions in a lisp file. ;; (save-match-data ;; (and (looking-at "(def") ;; (condition-case nil ;; (progn ;; (down-list 1) ;; (forward-sexp 2) ;; (let ((beg (point)) ;; (end (progn (forward-sexp -1) (point)))) ;; (buffer-substring beg end))) ;; (error nil))))) ;; (defun imenu-example--create-XLS-index () ;; ;; Example of a candidate for `imenu-create-index-function'. ;; ;; It will generate a nested index of definitions. ;; (let ((index-alist '()) ;; (index-var-alist '()) ;; (index-type-alist '()) ;; (index-unknown-alist '()) ;; prev-pos) ;; (goto-char (point-max)) ;; (imenu-progress-message prev-pos 0) ;; ;; Search for the function ;; (while (beginning-of-defun) ;; (imenu-progress-message prev-pos nil t) ;; (save-match-data ;; (and (looking-at "(def") ;; (save-excursion ;; (down-list 1) ;; (cond ;; ((looking-at "def\\(var\\|const\\)") ;; (forward-sexp 2) ;; (push (imenu-example--name-and-position) ;; index-var-alist)) ;; ((looking-at "def\\(un\\|subst\\|macro\\|advice\\)") ;; (forward-sexp 2) ;; (push (imenu-example--name-and-position) ;; index-alist)) ;; ((looking-at "def\\(type\\|struct\\|class\\|ine-condition\\)") ;; (forward-sexp 2) ;; (if (= (char-after (1- (point))) ?\)) ;; (progn ;; (forward-sexp -1) ;; (down-list 1) ;; (forward-sexp 1))) ;; (push (imenu-example--name-and-position) ;; index-type-alist)) ;; (t ;; (forward-sexp 2) ;; (push (imenu-example--name-and-position) ;; index-unknown-alist))))))) ;; (imenu-progress-message prev-pos 100) ;; (and index-var-alist ;; (push (cons "Variables" index-var-alist) ;; index-alist)) ;; (and index-type-alist ;; (push (cons "Types" index-type-alist) ;; index-alist)) ;; (and index-unknown-alist ;; (push (cons "Syntax-unknown" index-unknown-alist) ;; index-alist)) ;; index-alist)) ;; (defun ess-imenu-STA (&optional arg) ;; "Stata Language Imenu support for ESS." ;; (interactive) ;; (setq imenu-generic-expression ;; '( (nil "New one needed" 1))) ;; (imenu-add-to-menubar "Stata-fcts")) ; Run load hook and provide package (provide 'ess-menu) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-menu.el ends here ess/lisp/ess-comp.el0000664000175000017500000000431412423756516012760 0ustar eddedd;;; ess-comp.el --- setting for compiling, only. ;; Copyright (C) 1997--2006 A. J. Rossini ;; Copyright (C) 1997--2006 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: A.J. Rossini ;; Created: 25 July 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file sets up all compilation needs. ;;; Code: (provide 'ess-comp) ;; Emacs doesn't include '.' in the emacs lisp load path. (add-to-list 'load-path nil) ;; defvar'ed to nil in ./ess-site.el (setq ess-show-load-messages t) (defun ess-message (format-string &rest args) "Shortcut for \\[message] only if `ess-show-load-messages' is non-nil." (if ess-show-load-messages (message format-string args))) ;; These are required by every other file. (ess-message "loading 'ess-compat ..") (require 'ess-compat) ;set Emacsen diffs (ess-message "loading 'ess-custom ..") (require 'ess-custom) ;set variables (ess-message "loading 'ess ..") (require 'ess) ;configure (ess-message "loading 'ess-site ..") (require 'ess-site) ;overload defaults ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-comp.el ends here ess/lisp/ess-eldoc.el0000664000175000017500000001430612423756516013112 0ustar eddedd;;; ess-eldoc.el --- Use eldoc to report R function names. ;; Copyright (C) 1997--2009 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Stephen Eglen ;; Created: 2007-06-30 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;;;;; eldoc funcitonality has been moved into the core ;;;;; ;;;;; this file has no effect and is left in ESS in order not to break ;;;;; users configuration ;; This is an initial attempt to use the emacs facility ELDOC in R ;; buffers. Eldoc is used in Emacs lisp buffers to show the function ;; arglist and docstrings for variables. To try it, view an emacs ;; lisp buffer, and then do M-x turn-on-eldoc-mode, and move over ;; function and variable names. ;; This file extends eldoc to work in R buffers. It currently uses ;; Sven's ess-r-args.el file to retrieve args for a given R function ;; (via ess-r-args-get). Note that it works slightly different to ;; Sven's code, in that you just need to have the point over the name ;; of an R function, or inside its arguments list, for eldoc to show ;; the arg list. ;; To use this functionality, simply add ;; ;; (require 'ess-eldoc) ;; ;; to your .emacs file. When you visit a R mode, eldoc will be turned ;; on. However, you will first need to associate the R buffer with an ;; *R* process so that args can be looked up -- otherwise, eldoc will ;; silently not report anything. So, e.g. try: ;; C-x C-f somefile.R ;; M-x R (so that somefile.R is associated with *R*) ;; eldoc should then work. ;; e.g. put the following rnorm() command in an R buffer. The line ;; underneath shows a key of what arg list will be shown as you move ;; across the rnorm line. ;; rnorm(n=100, mean=sqrt(20), sd=10) ;; 1111111111111222223333333311444111 ;; 1: rnorm ;; 2: mean ;; 3: sqrt ;; 4: sd ;; ;; Note that the arg list for rnorm() should be shown either when you ;; are on the function name, or in the arg list. However, since the ;; 2nd and 3rd arguments are also function names, the arg lists of ;; those function names are reported instead. This might be seen as ;; undesirable behaviour, in which case a solution would be to only ;; look up the function name if it is followed by (. ;; If you want to use this feature in *R* buffers, add the following ;; to .emacs: ;; (add-hook 'inferior-ess-mode-hook 'ess-use-eldoc) ;; In the current version, I do not cache the arg list, but that was ;; done in an earlier version, to save repeated calls to ;; ess-r-args-get. ;; This code has been tested only in Emacs 22.1. It will not work on ;; Emacs 21, because it needs the variable ;; eldoc-documentation-function. ;;;; VS [25-02-2012]: all these issues were at least partially addresed in the ;;;; new implementation: ;; Bug (in eldoc?): the arg list for legend() is too long to fit in ;; minibuffer, and it seems that we see the last N lines of the arg ;; list, rather than the first N lines. It would be better to see the ;; first N lines since the more important args come first. ;; Doc issue: the eldoc vars (e.g. eldoc-echo-area-use-multiline-p) ;; work only for elisp mode. ;; Issue: You will probably see the message "Using process 'R'" flash; ;; this is generated by `ess-request-a-process', and I'd like to avoid ;; that appearing, non-interactively. ;; If *R* is currently busy (e.g. processing Sys.sleep(999)), then the ;; eldoc commands won't work; ess-command could be silenced in this ;; regard perhaps with a new SILENT arg for example to prevent the ;; call to (ess-error). ;;; Code: ;; ;; This could be done on buffer local basis. ;; (setq ess-r-args-noargsmsg "") ;; ;; following two defvars are not currently used. ;; (defvar ess-eldoc-last-name nil ;; "Name of the last function looked up in eldoc. ;; We remember this to see whether we need to look up documentation, or used ;; the cached value in `ess-eldoc-last-args'.") ;; (defvar ess-eldoc-last-args nil ;; "Args list last looked up for eldoc. Used as cache.") ;; (defun ess-eldoc-2 () ;; ;; simple, old version. ;; (interactive) ;; (ess-r-args-get (ess-read-object-name-default))) ;; (defun ess-eldoc-1 () ;; "Return the doc string, or nil. ;; This is the first version; works only on function name, not within arg list." ;; (interactive) ;; ;; Possible ways to get the function at point. ;; ;;(setq name (thing-at-point 'sexp)) ;; ;;(setq name (ess-read-object-name-default)) ;; ;;(setq name (find-tag-default)) ;; (if ess-current-process-name ;; (progn ;; (setq name (ess-guess-fun)) ;guess the word at point. ;; (if (equal (length name) 0) ;; nil ;; ;; else ;; (unless (equal name ess-eldoc-last-name) ;; ;; name is different to the last name we lookedup, so get ;; ;; new args from R and store them. ;; (setq ess-eldoc-last-args (ess-r-args-get name) ;; ess-eldoc-last-name name)) ;; ess-eldoc-last-args)) ;; ;; no ESS process current. ;; nil) ;; ) ;; (defsubst ess-guess-fun () ;; "Guess what the function at point is." ;; ;; Derived from Man-default-man-entry in man.el ;; (let (word) ;; (save-excursion ;; (skip-chars-backward "-a-zA-Z0-9._+:") ;; (let ((start (point))) ;; (skip-chars-forward "-a-zA-Z0-9._+:") ;; (setq word (buffer-substring-no-properties start (point))))) ;; word)) (defun ess-use-eldoc () "Does nothing. Defined not to break old users' code." (interactive)) ;; For now, while testing, switch on ess-eldoc. Later, ths could be removed ;; and instead ask user to add it. ;; (add-hook 'R-mode-hook 'ess-use-eldoc) (provide 'ess-eldoc) ;;; ess-eldoc.el ends here ess/lisp/ess-sas-d.el0000664000175000017500000003155412632537307013034 0ustar eddedd;;; ess-sas-d.el --- SAS customization ;; Copyright (C) 1997--2001 Richard M. Heiberger and A. J. Rossini ;; Copyright (C) 2002--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Author: Richard M. Heiberger ;; Created: 20 Aug 1997 ;; Maintainer: ESS-core ;; Keywords: languages ;; This file is part of ESS. ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; This file defines all the SAS customizations for ESS behaviors. See ;; ess-sas-l and ess-sas-a for the underlying general modifications. ;;; Code: ;;; Autoloads: (ess-message "[ess-sas-d:] require 'comint & 'shell ...") (require 'comint) (require 'shell) (require 'executable) ;;(ess-message "[ess-sas-d:] require 'ess-sas-a ...") ;;(require 'ess-sas-a) (ess-message "[ess-sas-d:] require 'ess-sas-l ...") (require 'ess-sas-l) (ess-message "[ess-sas-d:] (autoload ..) (def** ..) ...") (autoload 'inferior-ess "ess-inf" no-doc t) (autoload 'ess-mode "ess-mode" no-doc t) (autoload 'ess-proc-name "ess-inf" no-doc nil) (defvar inferior-SAS-args "-stdio -linesize 80 -noovp -nosyntaxcheck" "*Arguments to use for starting SAS.") (defvar inferior-SAS-args-temp nil "Hack variable, needed for args preprocessing. Better logic needed! (see 2 uses, in this file).") (defun ess-SAS-pre-run-hook (temp-ess-dialect) "Set up log and list files for interactive SAS." (let* ((ess-shell-buffer-name-flag (get-buffer "*shell*")) ess-shell-buffer-name ;; isn't pretty yet. ;; ess-local-process-name is defined after this function. ;; it needs to be defined prior to this function. (tmp-procname (let ((ntry 0) (done nil)) ;; find a non-existent process (while (not done) (setq ntry (1+ ntry) done (not (get-process (ess-proc-name ntry temp-ess-dialect))))) (ess-proc-name ntry temp-ess-dialect))) ;; Following was tmp-local-process-name. Stolen from inferior-ess (ess-sas-lst-bufname (concat "*" tmp-procname ".lst*")) (ess-sas-log-bufname (concat "*" tmp-procname ".log*")) (explicit-shell-file-name "/bin/sh") inferior-SAS-redirect-args ess-sas-lst ess-sas-log) (ess-write-to-dribble-buffer (format "(ess-SAS-pre-run-hook 1): ess-lang=%s, ess-dialect=%s, temp-dialect=%s, buf=%s \n" ess-language ess-dialect temp-ess-dialect (current-buffer))) ;; If someone is running a *shell* buffer, rename it to avoid ;; inadvertent nuking. (if ess-shell-buffer-name-flag (save-excursion (set-buffer "*shell*") (setq ess-shell-buffer-name (rename-buffer "*ess-shell-regular*" t)))) ;; Construct the LST buffer for output (if (get-buffer ess-sas-lst-bufname) nil (shell) (accept-process-output (get-buffer-process (current-buffer))) (sleep-for 2) ; need to wait, else working too fast! (setq ess-sas-lst (ess-insert-accept "tty")) (SAS-listing-mode) (shell-mode) (ess-listing-minor-mode t) (rename-buffer ess-sas-lst-bufname t)) ;; Construct the LOG buffer for output (if (get-buffer ess-sas-log-bufname) nil (shell) (accept-process-output (get-buffer-process (current-buffer))) (sleep-for 2) ; need to wait, else working too fast! (setq ess-sas-log (ess-insert-accept "tty")) ;(SAS-log-mode) (shell-mode) (ess-transcript-minor-mode t) (rename-buffer ess-sas-log-bufname t)) (setq inferior-SAS-redirect-args (concat " " ess-sas-lst " " ess-sas-log " ") inferior-SAS-args-temp (concat inferior-SAS-redirect-args inferior-SAS-args)) ;; Restore the *shell* buffer (if ess-shell-buffer-name-flag (save-excursion (set-buffer ess-shell-buffer-name) (rename-buffer "*shell*"))) (delete-other-windows) (split-window-vertically) (split-window-vertically) (switch-to-buffer (nth 2 (buffer-list))) (other-window 2) (switch-to-buffer ess-sas-log-bufname) (split-window-vertically) (other-window 1) (switch-to-buffer ess-sas-lst-bufname) (other-window 2) ;;workaround (setq inferior-SAS-program-name (concat (file-name-as-directory ess-etc-directory) "ess-sas-sh-command")) (setq inferior-ess-program inferior-SAS-program-name))) (defun ess-insert-accept (command) "Submit command to process, get next line." (interactive) (goto-char (point-max)) (insert command) (comint-send-input) (accept-process-output (get-buffer-process (current-buffer))) (forward-line -1) (let* ((beg (point)) (ess-tty-name (progn (end-of-line) (buffer-substring beg (point))))) (goto-char (point-max)) ess-tty-name)) (defvar SAS-customize-alist '((ess-local-customize-alist . 'SAS-customize-alist) (ess-language . "SAS") (ess-dialect . "SAS") (ess-mode-editing-alist . SAS-editing-alist) ; from ess-sas-l.el (ess-mode-syntax-table . SAS-syntax-table) (inferior-ess-program . inferior-SAS-program-name) (ess-help-sec-regex . "^[A-Z. ---]+:$") (ess-help-sec-keys-alist . " ") (ess-object-name-db-file . "ess-sas-namedb.el") (inferior-ess-objects-command . "objects(%d)");;FIXME (inferior-ess-help-command . "help(\"%s\",pager=\"cat\",window=F)\n");;FIXME (inferior-ess-exit-command . "endsas;\n") (ess-loop-timeout . 500000 ) (inferior-ess-primary-prompt . "^") (inferior-ess-secondary-prompt . "^") (comint-use-prompt-regexp . t) (inferior-ess-start-file . nil) ;"~/.ess-SAS") (inferior-ess-start-args . inferior-SAS-args-temp) (inferior-ess-font-lock-defaults . SAS-mode-font-lock-defaults) ;; (ess-pre-run-hook . 'ess-SAS-pre-run-hook) ;; (ess-local-process-name . nil) ) "Variables to customize for SAS") ;;; The functions of interest (mode, inferior mode) (defvar sas-mode-local-map nil "contains modified local keymap for SAS") (defun SAS-mode (&optional proc-name) "Major mode for editing SAS source. See ess-mode for more help." (interactive) (setq ess-customize-alist SAS-customize-alist) (ess-mode SAS-customize-alist proc-name) ;; Local map settings, AFTER initialization (only if not yet defined) (if sas-mode-local-map nil (setq sas-mode-local-map (copy-keymap (current-local-map))) (ess-sas-edit-keys-set ess-sas-edit-keys-toggle) (if ess-sas-local-unix-keys (ess-sas-local-unix-keys)) (if ess-sas-local-pc-keys (ess-sas-local-pc-keys)) (if ess-sas-global-unix-keys (ess-sas-global-unix-keys)) (if ess-sas-global-pc-keys (ess-sas-global-pc-keys))) (define-key sas-mode-local-map "\C-ci" 'ess-eval-line-and-step-invisibly) (define-key sas-mode-local-map ";" 'ess-electric-run-semicolon) ;; this is a mess ;; interactive and batch commands share sas-mode-local-map, ;; but the associated commands are very different ;; what would be better is two maps like ;; sas-batch-mode-local-map and sas-interactive-mode-local-map ;; or smart function definitions that would do the appropriate ;; thing for either batch or interactive sessions ;; however, neither of these solutions are planned ;; therefore, no key definitions can be shared between ;; batch and interactive at this time, hence the lines that ;; are commented below: uncomment at your own risk ;; (define-key sas-mode-local-map "\C-c\C-p" 'ess-sas-file-path) ;; (define-key sas-mode-local-map "\C-c\C-b" 'ess-sas-submit) ;; (define-key sas-mode-local-map "\C-c\C-r" 'ess-sas-submit-region) ;; (define-key sas-mode-local-map "\C-c\C-x" 'ess-sas-goto-log) ;; (define-key sas-mode-local-map "\C-c\C-y" 'ess-sas-goto-lst) (use-local-map sas-mode-local-map) (set (make-local-variable 'font-lock-defaults) ;; KEYWORDS KEYWORDS-ONLY CASE-FOLD ..... '(SAS-mode-font-lock-defaults nil t)) ;; ^^ this *should* set ;; font-lock-keywords-case-fold-search, but it fails for Emacs 22.[23] ;; hence : (setq font-lock-keywords-case-fold-search t) (run-hooks 'SAS-mode-hook)) ;; rmh Jul 10 2003 (defun ess-electric-run-semicolon (arg) "Insert character. If the line contains \"run;\" or \"quit;\" and nothing else then indent line." (interactive "P") (if ess-sas-edit-keys-toggle (insert ";") (let (insertpos) (if (and (not arg) (eolp) (save-excursion (skip-chars-backward " \t") (backward-word 1) (and (looking-at "run\\|quit") (progn (skip-chars-backward " \t") (bolp))))) (progn (insert last-command-event) (ess-indent-line) (save-excursion (if insertpos (goto-char (1+ insertpos))) (delete-char -1)))) (if insertpos (save-excursion (goto-char insertpos) (self-insert-command (prefix-numeric-value arg))) (self-insert-command (prefix-numeric-value arg)))))) (defun SAS () "Call 'SAS', from SAS Institute." (interactive) (setq-default ess-customize-alist SAS-customize-alist) (let* ((temp-dialect "SAS")) ;(cdr (rassoc ess-dialect SAS-customize-alist)))) (ess-write-to-dribble-buffer (format "(SAS): ess-dial=%s, temp-dial=%s\n" ess-dialect temp-dialect)) (ess-SAS-pre-run-hook temp-dialect) (setq ess-eval-visibly-p nil) (inferior-ess) (save-excursion (set-buffer "*SAS*") (use-local-map sas-mode-local-map)))) (defun ess-multi-frame-SAS () "Put running SAS buffers into separate frames. Load this function M-x load-file essx-sas.el RET. Then find-file myfile.sas. If myfile.sas is already in a buffer, kill-buffer it and then find-file it again. Place the cursor in a myfile.sas buffer. Run SAS with M-x SAS, Return the cursor to the myfile.sas buffer, then enter C-c C-w to put *SAS* *SAS.log* *SAS.lst* buffers into their own frames." (interactive) (delete-other-windows) (save-excursion (set-buffer "*SAS*") (make-frame) (set-buffer "*SAS.log*") (make-frame) (set-buffer "*SAS.lst*") (make-frame))) (add-hook 'ess-mode-hook (lambda () (when (string= ess-language "SAS") ;; e.g. not for R-only users (local-set-key "\C-c\C-w" 'ess-multi-frame-SAS)))) ; Provide package (provide 'ess-sas-d) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; outline-minor-mode: nil ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-sas-d.el ends here ess/lisp/ess-r-syntax.el0000664000175000017500000010030612632537307013602 0ustar eddedd;;; ess-r-syntax.el --- Utils to work with R code ;; Copyright (C) 2015 Lionel Henry ;; Author: Lionel Henry ;; Created: 12 Oct 2015 ;; Maintainer: ESS-core ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; API is not yet stable. ;;; Code: ;;*;; Utils ;; The three following wrappers return t if successful, nil on error (defun ess-backward-sexp (&optional N) (ess-forward-sexp (- (or N 1)))) (defun ess-forward-sexp (&optional N) (or N (setq N 1)) (condition-case nil (prog1 t (goto-char (or (scan-sexps (point) N) (buffer-end N)))) (error nil))) (defun ess-up-list (&optional N) (condition-case nil (progn (up-list N) t) (error nil))) ;; Going forth and back is a fast and reliable way of skipping in ;; front of the next sexp despite blanks, newlines and comments that ;; may be in the way. (defun ess-forth-and-back-sexp () (ess-save-excursion-when-nil (and (ess-forward-sexp) (ess-backward-sexp)))) (defun ess-back-and-forth-sexp () (ess-save-excursion-when-nil (and (ess-backward-sexp) (ess-forward-sexp)))) ;; Avoids let-binding a variable just to check a returned position is ;; not nil (defun ess-goto-char (pos) (when pos (goto-char pos))) (defun ess-looking-at (regex &optional newlines) "Compared to a simple `(looking-at)', this uses sexp motions to skip any blanks, newlines and comments. Should be more reliable and possibly faster than using complicated regexes." (save-excursion (ess-skip-blanks-forward newlines) (looking-at regex))) (defun ess-back-to-indentation () "Move point to the first non-whitespace character on this line. This non-interactive version of (back-to-indentation) should not be advised" (beginning-of-line 1) (skip-syntax-forward " " (line-end-position)) ;; Move back over chars that have whitespace syntax but have the p flag. (backward-prefix-chars)) (defmacro ess-save-excursion-when-nil (&rest body) (declare (indent 0) (debug (&rest form))) `(let ((orig-point (point))) (cond ((progn ,@body)) (t (prog1 nil (goto-char orig-point)))))) (defmacro ess-while (test &rest body) "Like (while) but return `t' when body gets executed once." (declare (indent 1) (debug (&rest form))) `(let (executed) (while ,test (setq executed t) ,@body) executed)) (defmacro ess-at-indent-point (&rest body) (declare (indent 0) (debug (&rest form))) `(save-excursion (goto-char indent-point) (ess-back-to-indentation) (progn ,@body))) (defmacro ess-at-containing-sexp (&rest body) (declare (indent 0) (debug (&rest form))) '(when (null containing-sexp) (error "Internal error: containing-sexp is nil")) `(save-excursion (goto-char containing-sexp) (progn ,@body))) (defmacro ess-any (&rest forms) "Evaluates all arguments and return non-nil if one of the arguments is non-nil. This is useful to trigger side-effects. FORMS follows the same syntax as arguments to `(cond)'." (declare (indent 0) (debug nil)) `(let ((forms (list ,@(mapcar (lambda (form) `(progn ,@form)) forms)))) (some 'identity (mapcar 'eval forms)))) ;;*;; Point predicates (defun ess-point-in-call-p (&optional call) "Is point in a function or indexing call?" (let ((containing-sexp (or (bound-and-true-p containing-sexp) (ess-containing-sexp-position)))) (save-excursion (and (prog1 (ess-goto-char containing-sexp) (ess-climb-chained-delims)) (save-excursion (forward-char) (ess-up-list)) (or (ess-looking-at-call-opening "(") (looking-at "\\[")) (ess-point-on-call-name-p call))))) (defun ess-point-in-continuation-p () (unless (or (looking-at ",") (ess-looking-at-call-opening "[[(]")) (or (save-excursion (ess-jump-object) (and (not (ess-looking-at-parameter-op-p)) (ess-looking-at-operator-p))) (save-excursion (ess-climb-object) (ess-climb-operator) (and (ess-looking-at-operator-p) (not (ess-looking-at-parameter-op-p))))))) (defun ess-point-on-call-name-p (&optional call) (save-excursion (ess-climb-call-name call))) (defun ess-point-in-prefixed-block-p (&optional call) "Is point in a prefixed block? Prefixed blocks refer to the blocks following function declarations, control flow statements, etc. If CALL not nil, check if the prefix corresponds to CALL. If nil, return the prefix." (save-excursion (ess-climb-outside-prefixed-block call))) (defun ess-point-in-comment-p (&optional state) (let ((state (or state (syntax-ppss)))) (eq (syntax-ppss-context state) 'comment))) (defun ess-point-in-string-p (&optional state) (let ((state (or state (syntax-ppss)))) (eq (syntax-ppss-context state) 'string))) ;;*;; Syntactic Travellers and Predicates ;;;*;;; Blanks, Characters and Comments (defun ess-skip-blanks-backward (&optional newlines) "Skip blanks and newlines backward, taking end-of-line comments into account." (ess-any ((ess-skip-blanks-backward-1)) ((when newlines (ess-while (and (/= (point) (point-min)) (= (point) (line-beginning-position))) (forward-line -1) (goto-char (ess-code-end-position)) (ess-skip-blanks-backward-1)))))) (defun ess-skip-blanks-backward-1 () (and (/= (point) (point-min)) (/= 0 (skip-chars-backward " \t")))) (defun ess-skip-blanks-forward (&optional newlines) "Skip blanks and newlines forward, taking end-of-line comments into account." (ess-any ((/= 0 (skip-chars-forward " \t"))) ((ess-while (and newlines (= (point) (ess-code-end-position)) (when (ess-save-excursion-when-nil ;; Handles corner cases such as point being on last line (let ((orig-point (point))) (forward-line) (ess-back-to-indentation) (> (point) orig-point))) (skip-chars-forward " \t") t)))))) (defun ess-jump-char (char) (ess-save-excursion-when-nil (ess-skip-blanks-forward t) (when (looking-at char) (goto-char (match-end 0))))) (defun ess-climb-comment () (when (and (ess-point-in-comment-p) (not (ess-roxy-entry-p))) (prog1 (comment-beginning) (skip-chars-backward "#+[ \t]*")))) (defun ess-looking-back-closing-p () (memq (char-before) '(?\] ?\} ?\)))) (defun ess-looking-back-boundary-p () (looking-back "[][ \t\n(){},]" (1- (point)))) ;;;*;;; Blocks (defun ess-block-opening-p () (save-excursion (cond ((looking-at "{")) ;; Opening parenthesis not attached to a function opens up a ;; block too. Only pick up those that are last on their line ((ess-looking-at-block-paren-p))))) (defun ess-block-closing-p () (save-excursion (cond ((looking-at "}")) ((looking-at ")") (forward-char) (backward-sexp) (not (looking-back (concat ess-R-name-pattern "[[:blank:]]*") (line-beginning-position))))))) (defun ess-block-p () (or (save-excursion (when containing-sexp (goto-char containing-sexp) (ess-block-opening-p))) (ess-unbraced-block-p))) ;; Parenthesised expressions (defun ess-looking-at-block-paren-p () (and (looking-at "(") (not (ess-looking-back-attached-name-p)))) (defun ess-climb-block (&optional ignore-ifelse) (ess-save-excursion-when-nil (cond ((and (not ignore-ifelse) (ess-climb-if-else 'to-start))) ((and (eq (char-before) ?\}) (prog2 (forward-char -1) (ess-up-list -1) (ess-climb-block-prefix))))))) (defvar ess-prefixed-block-patterns (mapcar (lambda (fun) (concat fun "[ \t\n]*(")) '("function" "if" "for" "while"))) (defun ess-looking-at-prefixed-block-p (&optional call) (if call (looking-at (concat call "[ \t]*(")) (some 'looking-at ess-prefixed-block-patterns))) (defun ess-unbraced-block-p (&optional ignore-ifelse) "This indicates whether point is in front of an unbraced prefixed block following a control flow statement. Returns position of the control flow function (if, for, while, etc)." (save-excursion (and (ess-backward-sexp) (or (and (looking-at "else\\b") (not ignore-ifelse)) (and (looking-at "(") (ess-backward-sexp) (some 'looking-at ess-prefixed-block-patterns) (if ignore-ifelse (not (looking-at "if\\b")) t))) (point)))) (defun ess-climb-block-prefix (&optional call ignore-ifelse) "Climb the prefix of a prefixed block. Prefixed blocks refer to the blocks following function declarations, control flow statements, etc. Should be called either in front of a naked block or in front of the curly brackets of a braced block. If CALL not nil, check if the prefix corresponds to CALL. If nil, return the prefix." (ess-save-excursion-when-nil (or (and (not ignore-ifelse) (prog1 (and (ess-climb-if-else-call) (or (null call) (looking-at call))) (when (looking-at "else\\b") (ess-skip-curly-backward)))) (let ((pos (ess-unbraced-block-p ignore-ifelse))) (and (ess-goto-char pos) (if call (looking-at call) (cond ((looking-at "function") "function") ((looking-at "for") "for") ((looking-at "if") "if") ((looking-at "else") "else")))))))) (defun ess-climb-outside-prefixed-block (&optional call) "Climb outside of a prefixed block." (let ((containing-sexp (or (bound-and-true-p containing-sexp) (ess-containing-sexp-position)))) (or (ess-save-excursion-when-nil (and (ess-goto-char containing-sexp) (looking-at "{") (ess-climb-block-prefix call))) (ess-climb-outside-unbraced-block call)))) (defun ess-climb-outside-unbraced-block (&optional call) (ess-save-excursion-when-nil (while (and (not (ess-unbraced-block-p)) (or (ess-climb-outside-continuations) (ess-climb-outside-call)))) (ess-climb-block-prefix call))) (defun ess-jump-block () (cond ;; if-else blocks ((ess-jump-if-else)) ;; Prefixed blocks such as `function() {}' ((ess-looking-at-prefixed-block-p) (ess-jump-prefixed-block)) ;; Naked blocks ((and (or (looking-at "{") (ess-looking-at-block-paren-p)) (ess-forward-sexp))))) (defun ess-jump-prefixed-block (&optional call) (ess-save-excursion-when-nil (when (ess-looking-at-prefixed-block-p call) (ess-forward-sexp 2) (ess-skip-blanks-forward t) (if (looking-at "{") (ess-forward-sexp) (prog1 (ess-jump-expression) (ess-jump-continuations)))))) ;;;*;;; Calls (defun ess-call-closing-p () (save-excursion (when (cond ((looking-at ")") (ess-up-list -1)) ((looking-at "]") (when (ess-up-list -1) (prog1 t (ess-climb-chained-delims))))) (ess-looking-back-attached-name-p)))) (defun ess-looking-at-call-opening (pattern) (and (looking-at pattern) (ess-looking-back-attached-name-p))) ;; Should be called just before the opening brace (defun ess-looking-back-attached-name-p () (save-excursion (ess-climb-object))) (defun ess-looking-at-parameter-op-p () "Are we looking at a function argument? To be called just before the `=' sign." (save-excursion (and (looking-at "[ \t]*=[^=]") (ess-climb-object) (looking-back "[(,][ \t\n]*" (line-beginning-position 0))))) (defun ess-looking-at-arg-p () (save-excursion (ess-jump-arg))) (defun ess-looking-at-parameter-p () (save-excursion (ess-jump-parameter))) (defun ess-jump-parameter () (ess-save-excursion-when-nil (and (ess-jump-name) (when (looking-at "[ \t]*=\\([^=]\\)") (goto-char (match-beginning 1)) (ess-skip-blanks-forward) t)))) (defun ess-jump-arg () (ess-save-excursion-when-nil (ess-skip-blanks-forward t) (ess-any ((ess-jump-parameter)) ((ess-jump-expression)) ((ess-jump-continuations))))) (defun ess-arg-bounds () "Should be called in front of the argument." (save-excursion (let ((beg (point))) (and (ess-jump-arg) (list beg (point)))))) (defun ess-climb-call (&optional call) "Climb functions (e.g. ggplot) and parenthesised expressions." (or (ess-while (ess-save-excursion-when-nil (ess-climb-name) (and (ess-climb-chained-delims ?\]) ;; (ess-climb-expression) (if (eq (char-before) ?\)) (ess-climb-call) (ess-climb-name)) ))) (ess-save-excursion-when-nil (when (and (memq (char-before) '(?\] ?\) ?\})) (ess-backward-sexp)) (if call (and (ess-climb-name) (looking-at call))) (prog1 t (ess-climb-name)))))) (defun ess-climb-call-name (&optional call) (ess-save-excursion-when-nil (ess-jump-name) (ess-skip-blanks-forward) (and (ess-looking-at-call-opening "[[(]") (ess-climb-name) (or (null call) (looking-at call))))) (defun ess-step-to-first-arg () (let ((containing-sexp (ess-containing-sexp-position))) (cond ((ess-point-in-call-p) (goto-char containing-sexp) (forward-char) t) ((ess-point-on-call-name-p) (ess-jump-name) (ess-skip-blanks-forward) (forward-char) t)))) (defun ess-jump-to-next-arg () (and (ess-jump-arg) (prog1 (ess-jump-char ",") (ess-skip-blanks-forward t)))) (defun ess-jump-call () (ess-save-excursion-when-nil (or (and (ess-jump-object) (cond ((eq (char-before) ?\))) ((looking-at "\\[") (ess-jump-chained-brackets)) ((looking-at "(") (ess-forward-sexp)))) (and (looking-at "[ \t]*(") (ess-forward-sexp))))) (defun ess-looking-at-call-p () (save-excursion (ess-jump-object) (ess-skip-blanks-forward) (looking-at "[[(]"))) (defun ess-climb-chained-delims (&optional delim) "Should be called with point between delims, e.g. `]|['." (setq delim (if delim (list delim) '(?\] ?\)))) (ess-while (ess-save-excursion-when-nil (when (memq (char-before) delim) (ess-backward-sexp))))) (defun ess-jump-chained-brackets () (ess-while (ess-save-excursion-when-nil (when (eq (char-after) ?\[) (ess-forward-sexp))))) (defun ess-climb-outside-call (&optional call) (let ((containing-sexp (ess-containing-sexp-position))) (if (ess-point-in-call-p) (ess-save-excursion-when-nil (goto-char containing-sexp) (ess-climb-chained-delims) (and (ess-climb-name) (or (null call) (looking-at call)))) ;; At top level or inside a block, check if point is on the ;; function name. (ess-save-excursion-when-nil (let ((orig-pos (point))) (and (ess-jump-name) (looking-at "[[(]") (ess-climb-name) (or (null call) (looking-at call)) (/= (point) orig-pos))))))) (defun ess-climb-outside-calls () (ess-while (ess-climb-outside-call))) (defun ess-jump-inside-call () (ess-save-excursion-when-nil (when (ess-jump-name) (ess-skip-blanks-forward) (when (looking-at "(") (forward-char) t)))) (defun ess-args-bounds (&optional marker) (let ((containing-sexp (ess-containing-sexp-position))) (when (ess-point-in-call-p) (save-excursion (let ((beg (1+ containing-sexp)) (call-beg (ess-at-containing-sexp (ess-climb-name) (point)))) ;; (ess-up-list) can't find its way when point is on a ;; backquoted name, so start from `beg'. (and (goto-char beg) (ess-up-list) (prog1 t (forward-char -1)) (let ((end (if marker (point-marker) (point)))) (list beg end call-beg)))))))) (defun ess-args-alist () "Return all arguments as an alist with cars set to argument names and cdrs set to the expressions given as argument. Both cars and cdrs are returned as strings." (save-excursion (when (ess-step-to-first-arg) (let (args current-arg) (while (and (setq current-arg (ess-cons-arg)) (setq args (nconc args (list current-arg))) (ess-jump-to-next-arg))) args)))) (defun ess-cons-arg () "Return a cons cell of the current argument with car set to the parameter name (nil if not specified) and cdr set to the argument expression." (save-excursion (ess-skip-blanks-forward t) (let ((param (when (ess-looking-at-parameter-p) (buffer-substring-no-properties (point) (prog2 (ess-jump-name) (point) (ess-jump-char "=") (ess-skip-blanks-forward))))) (arg (buffer-substring-no-properties (point) (progn (ess-jump-arg) (point))))) (cons param arg)))) ;;;*;;; Statements (defun ess-looking-back-operator-p (&optional fun-arg) (save-excursion (and (ess-climb-operator) (if (not fun-arg) (not (ess-looking-at-parameter-op-p)) t)))) (defun ess-climb-lhs (&optional no-fun-arg climb-line) (ess-save-excursion-when-nil (let ((start-line (line-number-at-pos))) (ess-climb-operator) (when (and (or climb-line (equal (line-number-at-pos) start-line)) (ess-looking-at-definition-op-p no-fun-arg)) (prog1 t (ess-climb-expression)))))) (defun ess-jump-lhs () (ess-save-excursion-when-nil (and (ess-jump-name) (ess-looking-at-definition-op-p) (ess-jump-operator)))) ;; Useful to check presence of operators. Need to check for ;; (point-min) because that won't work if there is no previous sexp ;; Should be called right at the beginning of current sexp. (defun ess-climb-operator () (ess-save-excursion-when-nil (let ((orig-pos (point))) (when (ess-backward-sexp) ;; When there is only empty space or commented code left to ;; climb (e.g. roxygen documentation), there is no previous ;; SEXP, but (ess-backward-sexp) will nevertheless climb the ;; empty space without failing. So we need to skip it. (while (and (looking-at "[[:space:]]*\\(#\\|$\\)") (/= (point) (point-max))) (forward-line) (ess-back-to-indentation)) ;; Handle %op% operators (when (and (eq (char-before) ?%) (looking-at (concat ess-R-symbol-pattern "+%"))) (ess-backward-sexp)) (when (and (< (point) orig-pos) (ess-forward-sexp) (ess-looking-at-operator-p)) (prog1 t (when (and (equal (char-after) ?=) (equal (char-before) ?:)) (forward-char -1)))))))) ;; Currently doesn't check that the operator is not binary (defun ess-climb-unary-operator () (ess-save-excursion-when-nil (ess-skip-blanks-backward t) (when (memq (char-before) '(?+ ?- ?! ?? ?~)) (forward-char -1) t))) ;; Currently returns t if we climbed lines, nil otherwise. (defun ess-climb-continuations (&optional cascade ignore-ifelse) (let ((start-line (line-number-at-pos)) (moved 0) (last-pos (point)) last-line prev-point def-op expr) (setq last-line start-line) (when (ess-while (and (<= moved 1) (or (ess-save-excursion-when-nil (and (ess-climb-operator) (ess-climb-continuations--update-state 'op) (ess-climb-expression ignore-ifelse))) (ess-climb-unary-operator)) (/= last-pos (point))) (ess-climb-continuations--update-state) (setq last-pos (point))) (when (and prev-point (or (= moved 3) (not expr))) (goto-char prev-point)) (if def-op 'def-op (< (line-number-at-pos) start-line))))) (defun ess-climb-continuations--update-state (&optional op) ;; Climbing multi-line expressions should not count as moving up (when op (setq expr (ess-looking-back-closing-p))) (let ((cur-line (line-number-at-pos))) (when (and last-line (< cur-line last-line) (or cascade (not expr))) (setq moved (1+ moved)) (setq last-line cur-line))) ;; Don't update counter after climbing operator or climbing too high (when (and (not op) (<= moved 1)) (setq prev-point (point))) (when (and (ess-looking-at-definition-op-p) (<= moved 1)) (setq def-op t)) t) (defun ess-jump-operator () (when (ess-looking-at-operator-p) (goto-char (match-end 1)) (ess-skip-blanks-forward t) t)) (defun ess-jump-continuation () (and (ess-jump-operator) (ess-jump-expression))) (defun ess-jump-continuations () (let (last-pos) (when (ess-while (and (or (null last-pos) (/= (point) last-pos)) (setq last-pos (point)) (ess-jump-continuation))) ;; In calls, operators can start on newlines (let ((start-line (line-number-at-pos))) (when (ess-save-excursion-when-nil (and (ess-point-in-call-p) (ess-skip-blanks-forward t) (/= (line-number-at-pos) start-line) (ess-looking-at-operator-p))) (ess-jump-continuations))) t))) (defun ess-looking-at-continuation-p (&optional or-parameter) (or (save-excursion (ess-skip-blanks-backward t) (ess-back-and-forth-sexp) (when (ess-looking-at-operator-p) (if or-parameter t (not (ess-looking-at-parameter-op-p))))) (save-excursion (ess-climb-block-prefix)) (save-excursion (or (looking-at "else\\b") (ess-climb-if-else-call))))) (defvar ess-R-operator-pattern "<-\\|:=\\|!=\\|%[^ \t]*%\\|[-:+*/><=&|~]" "Regular expression for an operator") (defvar ess-R-definition-op-pattern "< ;; Keywords: lisp, matching ;; Version: 1.02 ;; LCD Archive Entry: ;; make-regexp|Simon Marshall|simon@gnu.ai.mit.edu| ;; Generate efficient regexps to match strings.| ;; 11-Jul-1995|1.02|~/functions/make-regexp.el.gz| ;; The archive is archive.cis.ohio-state.edu in /pub/gnu/emacs/elisp-archive. ;;; This file is not part of GNU Emacs. ;;; This program is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;;; Commentary: ;; Purpose: ;; ;; To make efficient regexps from lists of strings. ;; For example: ;; ;; (let ((strings '("cond" "if" "while" "let\\*?" "prog1" "prog2" "progn" ;; "catch" "throw" "save-restriction" "save-excursion" ;; "save-window-excursion" "save-match-data" ;; "unwind-protect" "condition-case" "track-mouse"))) ;; (concat "(" (make-regexp strings t))) ;; ;; => "(\\(c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|if\\|let\\*?\\|prog[12n]\\|save-\\(excursion\\|match-data\\|restriction\\|window-excursion\\)\\|t\\(hrow\\|rack-mouse\\)\\|unwind-protect\\|while\\)" ;; ;; To search for the above regexp takes about 70% of the time as for the simple ;; (concat "(\\(" (mapconcat 'identity strings "\\|") "\\)") regexp. ;; ;; Obviously, the more the similarity between strings, the faster the regexp: ;; ;; (make-regexp '("abort" "abs" "accept" "access" "array" "begin" "body" "case" ;; "constant" "declare" "delay" "delta" "digits" "else" "elsif" ;; "entry" "exception" "exit" "function" "generic" "goto" "if" ;; "others" "limited" "loop" "mod" "new" "null" "out" "subtype" ;; "package" "pragma" "private" "procedure" "raise" "range" ;; "record" "rem" "renames" "return" "reverse" "select" ;; "separate" "task" "terminate" "then" "type" "when" "while" ;; "with" "xor")) ;; ;; => "a\\(b\\(ort\\|s\\)\\|cce\\(pt\\|ss\\)\\|rray\\)\\|b\\(egin\\|ody\\)\\|c\\(ase\\|onstant\\)\\|d\\(e\\(clare\\|l\\(ay\\|ta\\)\\)\\|igits\\)\\|e\\(ls\\(e\\|if\\)\\|ntry\\|x\\(ception\\|it\\)\\)\\|function\\|g\\(eneric\\|oto\\)\\|if\\|l\\(imited\\|oop\\)\\|mod\\|n\\(ew\\|ull\\)\\|o\\(thers\\|ut\\)\\|p\\(ackage\\|r\\(agma\\|ivate\\|ocedure\\)\\)\\|r\\(a\\(ise\\|nge\\)\\|e\\(cord\\|m\\|names\\|turn\\|verse\\)\\)\\|s\\(e\\(lect\\|parate\\)\\|ubtype\\)\\|t\\(ask\\|erminate\\|hen\\|ype\\)\\|w\\(h\\(en\\|ile\\)\\|ith\\)\\|xor" ;; ;; To search for the above regexp takes less than 60% of the time of the simple ;; mapconcat equivalent. ;; ;; But even small regexps may be worth it: ;; ;; (make-regexp '("and" "at" "do" "end" "for" "in" "is" "not" "of" "or" "use")) ;; => "a\\(nd\\|t\\)\\|do\\|end\\|for\\|i[ns]\\|not\\|o[fr]\\|use" ;; ;; as this is 10% faster than the mapconcat equivalent. ;; Installation: ;; ;; (autoload 'make-regexp "make-regexp" ;; "Return a regexp to match a string item in STRINGS.") ;; ;; (autoload 'make-regexps "make-regexp" ;; "Return a regexp to REGEXPS.") ;; ;; Since these functions were written to produce efficient regexps, not regexps ;; efficiently, it is probably not a good idea to in-line too many calls in ;; your code, unless you use the following neat trick with `eval-when-compile': ;; ;; (defvar definition-regexp ;; (let ((regexp (eval-when-compile ;; (make-regexp '("defun" "defsubst" "defmacro" "defalias" ;; "defvar" "defconst" "defadvice") t)))) ;; (concat "^(" regexp))) ;; ;; The `byte-compile' code will be as if you had defined the variable thus: ;; ;; (defvar definition-regexp ;; "^(\\(def\\(a\\(dvice\\|lias\\)\\|const\\|macro\\|subst\\|un\\|var\\)\\)") ;; Feedback: ;; ;; Originally written for font-lock, from an idea from Stig's hl319. ;; Please don't tell me that it doesn't produce optimal regexps; I know that ;; already. But (ideas or) code to improve things (are) is welcome. Please ;; test your code and tell me the speed up in searching an appropriate buffer. ;; ;; Please send me bug reports, bug fixes, and extensions, etc. ;; Simon Marshall ;; History: ;; ;; 1.00--1.01: ;; - Made `make-regexp' take `lax' to force top-level parentheses. ;; - Fixed `make-regexps' for MATCH bug and new `font-lock-keywords'. ;; - Added `unfontify' to user timing functions. ;; 1.01--1.02: ;; - Made `make-regexp' `let' a big `max-lisp-eval-depth'. ;; The basic idea is to find the shortest common non-"" prefix each time, and ;; squirrel it out. If there is no such prefix, we divide the list into two so ;; that (at least) one half will have at least a one-character common prefix. ;; In addition, we (a) delay the addition of () parenthesis as long as possible ;; (until we're sure we need them), and (b) try to squirrel out one-character ;; sequences (so we can use [] rather than ()). ;;; Code: (defun make-regexp (strings &optional paren lax) "Return a regexp to match a string item in STRINGS. If optional PAREN non-nil, output regexp parentheses around returned regexp. If optional LAX non-nil, don't output parentheses if it doesn't require them. Merges keywords to avoid backtracking in Emacs' regexp matcher." (let* ((max-lisp-eval-depth (* 1024 1024)) (strings (let ((l strings)) ; Paranoia---make strings unique! (while l (setq l (setcdr l (delete (car l) (cdr l))))) (sort strings 'string-lessp))) (open-paren (if paren "\\(" "")) (close-paren (if paren "\\)" "")) (open-lax (if lax "" open-paren)) (close-lax (if lax "" close-paren)) (completion-ignore-case nil)) (cond ;; If there's only one string, just return it. ((= (length strings) 1) (concat open-lax (car strings) close-lax)) ;; If there's an empty string, pull it out. ((string= (car strings) "") (if (and (= (length strings) 2) (= (length (nth 1 strings)) 1)) (concat open-lax (nth 1 strings) "?" close-lax) (concat open-paren "\\|" (make-regexp (cdr strings)) close-paren))) ;; If there are only one-character strings, make a [] list instead. ((= (length strings) (apply '+ (mapcar 'length strings))) (concat open-lax "[" (mapconcat 'identity strings "") "]" close-lax)) (t ;; We have a list of strings. Is there a common prefix? (let ((prefix (try-completion "" (mapcar 'list strings)))) (if (> (length prefix) 0) ;; Common prefix! Squirrel it out and recurse with the suffixes. (let* ((len (length prefix)) (sufs (mapcar (lambda (str) (substring str len)) strings))) (concat open-paren prefix (make-regexp sufs t t) close-paren)) ;; No common prefix. Is there a one-character sequence? (let ((letters (let ((completion-regexp-list '("^.$"))) (all-completions "" (mapcar 'list strings))))) (if (> (length letters) 1) ;; Do the one-character sequences, then recurse on the rest. (let ((rest (let ((completion-regexp-list '("^..+$"))) (all-completions "" (mapcar 'list strings))))) (concat open-paren (make-regexp letters) "\\|" (make-regexp rest) close-paren)) ;; No one-character sequence, so divide the list into two by ;; dividing into those that start with a particular letter, and ;; those that do not. (let* ((char (substring (car strings) 0 1)) (half1 (all-completions char (mapcar 'list strings))) (half2 (nthcdr (length half1) strings))) (concat open-paren (make-regexp half1) "\\|" (make-regexp half2) close-paren)))))))))) ;; This stuff is realy for font-lock... ;; Ahhh, the wonders of lisp... (defun regexp-span (regexp &optional start) "Return the span or depth of REGEXP. This means the number of \"\\\\(...\\\\)\" pairs in REGEXP, optionally from START." (let ((match (string-match (regexp-quote "\\(") regexp (or start 0)))) (if (not match) 0 (1+ (regexp-span regexp (match-end 0)))))) ;; The basic idea is to concat the regexps together, keeping count of the span ;; of the regexps so that we can get the correct match for hilighting. (defun make-regexps (&rest regexps) "Return a regexp to match REGEXPS Each item of REGEXPS should be of the form: STRING ; A STRING to be used literally. (STRING MATCH FACE DATA) ; Match STRING at depth MATCH with FACE ; and highlight according to DATA. (STRINGS FACE DATA) ; STRINGS is a list of strings FACE is ; to highlight according to DATA. Returns a list of the form: (REGEXP (MATCH FACE DATA) ...) For example: (make-regexps \"^(\" '((\"defun\" \"defalias\" \"defsubst\" \"defadvice\") keyword) \"[ \t]*\" '(\"\\\\([a-zA-Z-]+\\\\)?\" 1 function-name nil t)) => (\"^(\\\\(def\\\\(a\\\\(dvice\\\\|lias\\\\)\\\\|subst\\\\|un\\\\)\\\\)[ ]*\\\\([a-zA-Z-]+\\\\)?\" (1 keyword) (4 function-name nil t)) Uses `make-regexp' to make efficient regexps." (let ((regexp "") (data ())) (while regexps (cond ((stringp (car regexps)) (setq regexp (concat regexp (car regexps)))) ((stringp (nth 0 (car regexps))) (setq data (cons (cons (+ (regexp-span regexp) (nth 1 (car regexps))) (nthcdr 2 (car regexps))) data) regexp (concat regexp (nth 0 (car regexps))))) (t (setq data (cons (cons (1+ (regexp-span regexp)) (cdr (car regexps))) data) regexp (concat regexp (make-regexp (nth 0 (car regexps)) t))))) (setq regexps (cdr regexps))) (cons regexp (nreverse data)))) ;; timing functions removed due to name collisions with Gnus (provide 'make-regexp) ;;; make-regexp.el ends here ess/lisp/ess-noweb-font-lock-mode.el0000664000175000017500000004431012613523406015737 0ustar eddedd;;; ess-noweb-font-lock-mode.el --- edit noweb files with GNU Emacs ;; Copyright (C) 1999 by Adnan Yaqub (AYaqub@orga.com) ;; and Mark Lunt (mark.lunt@mrc-bsu.cam.ac.uk ;; Copyright (C) 2002 by A.J. Rossini ;; Copyright (C) 2003--2004 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Maintainer: ESS-core ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;;; Commentary: ;; Code-dependent highlighting ;; ***** ;; ;; Adding highlighting to ess-noweb-mode.el ;; ;; Here is a description of how one can add highlighting via the ;; font-lock package to noweb buffers. It uses the hooks provided by ;; ess-noweb-mode.el. The solution provides the following features: ;; 1) The documentation chunks are highlighted in the ess-noweb-doc-mode ;; (e.g., LaTeX). ;; 2) The code chunks without mode comments (-*- mode -*-) are ;; highlighted in the ess-noweb-code-mode. ;; 3) The code chunks with mode comments (-*- mode -*-) on the first ;; line of the first chunk with this name are highlighted in the mode ;; in the comment. ;; ;; For example, given the file: ;; ;; % -*- mode: Noweb; ess-noweb-code-mode: c-mode -*- ;; ;; \begin{itemize} ;; \item a main routine written in C, ;; \item a log configuration file parser written in YACC, and ;; \item a lexical analyzer written in Lex. ;; \end{itemize} ;; ;; <>= ;; /* DO NOT EDIT ME! */ ;; /* This file was automatically generated from %W% (%G%). */ ;; @ ;; ;; <>= ;; .\" -*- nroff -*- ;; .\" DO NOT EDIT ME! ;; .\" This file was automatically generated from %W% (%G%). ;; @ ;; ;; The LaTeX list is highlighted in latex-mode (the default noweb doc ;; mode), the chunk <> is highlighted in c-mode (the ;; default noweb code mode), and the chunk <> is ;; highlighted in nroff-mode due to the "-*- nroff -*-" comment. ;; ;; Chunks are highlighted each time point moves into them from a ;; different mode. They are also fontified 'on the fly', but this is ;; less reliable, since the syntax can depend on the context. It's as ;; good as you would get outside ess-noweb-mode, though. ;; ;; To use it, you must add ;; (require 'ess-noweb-font-lock-mode) to your .emacs file. ;; Then, if you use either global-font-lock or turn-on-font-lock ;; statements, any ess-noweb-mode buffers will be fontified ;; appropriately. (We have to redefine turn-on-font-lock, but it ;; saves breaking other packages (in particular ESS, which I use a ;; lot), that assume that turn-on-font-lock is the way to turn on ;; font locking. ;; Alternatively, you can turn ess-noweb-font-lock-mode on and off by ;; using M-x ess-noweb-font-lock-mode. However, turning ;; ess-noweb-font-lock-mode off when global-font-lock-mode is t makes it ;; impossible to use font-locking in that buffer subsequently, other ;; than by turning ess-noweb-font-lock-mode back on. ;; 2) The highlighting sometimes get confused, but this is no longer ;; a noweb problem. Highlighting should work as well within a chunk ;; as it does without ess-noweb-mode. ;; There are some problems with, for example latex-mode: a `$' in a ;; verbatim environment with throw the font-locking out. ;; One slight blemish is that code-quotes are highlighted as comments ;; as they are being entered. They are only highlighted correctly ;; after `ess-noweb-font-lock-fontify-chunk' has been run, either as a ;; command or through changing to a different chunk and back again ;; (unless they lie on a single line, in which case they are ;; fontified correctly once they are completed). ;;; Code: (require 'ess-noweb-mode) (require 'font-lock) (defvar ess-noweb-font-lock-mode nil "Buffer local variable, t iff this buffer is using ess-noweb-font-lock-mode.") (defvar ess-noweb-use-font-lock-mode t "DO NOT CHANGE THIS VARIABLE If you use nw-turn-on-font-lock to turn on font-locking, then turn it off again, it would come back on again of its own accord when you changed major-mode. This variable is used internally to stop it.") (defvar ess-noweb-font-lock-mode-hook nil "Hook that is run after entering ess-noweb-font-lock mode.") (defvar ess-noweb-font-lock-max-initial-chunks 30 "Maximum number of chunks to fontify initially. If nil, will fontify the entire buffer when ess-noweb-font-lock-initial-fontify-buffer is called" ) ;; (defvar old-beginning-of-syntax nil ;; "Stores the function used to find the beginning of syntax in the ;; current major mode. ess-noweb-font-lock-mode needs a different one." ) ;; ;; (AJR) the next two lines were originally font-lock-warning-face ;; ;; methods; XEmacs 20.4 doesn't define this, sigh... -- KLUDGE --. (defvar ess-noweb-font-lock-doc-start-face font-lock-reference-face "Face to use to highlight the `@' at the start of each doc chunk") (defvar ess-noweb-font-lock-brackets-face font-lock-reference-face "Face to use to highlight `<<', `>>' `[[' and `]]' ") (defvar ess-noweb-font-lock-chunk-name-face font-lock-keyword-face "Face to use to highlight the between `<<' and `>>'") (defvar ess-noweb-font-lock-code-quote-face font-lock-keyword-face "Face to use to highlight the between `[[' and `]]'") ;; Now we add [[ess-noweb-font-lock-mode]] to the list of existing minor ;; modes. The string ``NWFL'' will be added to the mode-line: ugly, but ;; brief. (if (not (assq 'ess-noweb-font-lock-mode minor-mode-alist)) (setq minor-mode-alist (append minor-mode-alist (list '(ess-noweb-font-lock-mode " NWFL"))))) ;; An ugly kludge to get around problems with global-font-lock, which ;; fontifies the entire buffer in the new major mode every time you ;; change mode, which is time-consuming and makes a pigs trotters of ;; it. Trying to stop it looks tricky, but using this function as your ;; `font-lock-fontify-buffer' function stops it wasting your time (defun nwfl-donowt() "This function does nothing at all") ;; The following function is just a wrapper for ess-noweb-font-lock-mode, ;; enabling it to be called as ess-noweb-font-lock-minor-mode instead. (defun ess-noweb-font-lock-minor-mode ( &optional arg) "Minor meta mode for managing syntax highlighting in noweb files. See ess-noweb-font-lock-mode." (interactive) (ess-noweb-font-lock-mode arg)) ;; Here we get to the meat of the problem (defun ess-noweb-font-lock-mode ( &optional arg) "Minor mode for syntax highlighting when using ess-noweb-mode to edit noweb files. Each chunk is fontified in accordance with its own mode" (interactive "P") (if (or ess-noweb-mode ess-noweb-font-lock-mode) (progn ;; This bit is tricky: copied almost verbatim from bib-cite-mode.el ;; It seems to ensure that the variable ess-noweb-font-lock-mode is made ;; local to this buffer. It then sets ess-noweb-font-lock-mode to `t' if ;; 1) It was called with a prefix argument greater than 0 ;; or 2) It was called with no argument, and ess-noweb-font-lock-mode is ;; currently nil ;; ess-noweb-font-lock-mode is nil if the prefix argument was <= 0 or there ;; was no prefix argument and ess-noweb-font-lock-mode is currently `t' (set (make-local-variable 'ess-noweb-font-lock-mode) (if arg (> (prefix-numeric-value arg) 0) (not ess-noweb-font-lock-mode))) ;; Now, if ess-noweb-font-lock-mode is true, we want to turn ;; ess-noweb-font-lock-mode on (cond (ess-noweb-font-lock-mode ;Setup the minor-mode (when (and (boundp 'global-font-lock-mode) global-font-lock-mode) (mapc 'ess-noweb-make-variable-permanent-local '(font-lock-fontify-buffer-function font-lock-unfontify-buffer-function)) (setq font-lock-fontify-buffer-function 'nwfl-donowt) (setq font-lock-unfontify-buffer-function 'nwfl-donowt)) (mapcar 'ess-noweb-make-variable-permanent-local '(ess-noweb-font-lock-mode font-lock-dont-widen ;; font-lock-beginning-of-syntax-function syntax-begin-function ess-noweb-use-font-lock-mode after-change-functions)) (setq ess-noweb-font-lock-mode t font-lock-dont-widen t) (when (< emacs-major-version 21) ; needed for emacs < 21.1 only : (make-local-hook 'after-change-functions)) (add-hook 'after-change-functions 'font-lock-after-change-function nil t) (add-hook 'ess-noweb-font-lock-mode-hook 'ess-noweb-font-lock-mode-fn) (add-hook 'ess-noweb-changed-chunk-hook 'ess-noweb-font-lock-fontify-this-chunk) (run-hooks 'ess-noweb-font-lock-mode-hook) (message "ess-noweb-font-lock mode: use `M-x ess-noweb-font-lock-describe-mode' for more info")) ;; If we didn't do the above, then we want to turn ess-noweb-font-lock-mode ;; off, no matter what (hence the condition `t') (t (when (and (boundp 'global-font-lock-mode) global-font-lock-mode) ;; (setq font-lock-fontify-buffer-function ;; 'font-lock-default-fontify-buffer) ;; Get back our unfontify buffer function (setq font-lock-unfontify-buffer-function 'font-lock-default-unfontify-buffer)) (remove-hook 'ess-noweb-font-lock-mode-hook 'ess-noweb-font-lock-mode-fn) (remove-hook 'ess-noweb-changed-chunk-hook 'ess-noweb-font-lock-fontify-this-chunk) (remove-hook 'after-change-functions 'font-lock-after-change-function ) (font-lock-default-unfontify-buffer) (setq ess-noweb-use-font-lock-mode nil) (message "ess-noweb-font-lock-mode removed")))) (message "ess-noweb-font-lock-mode can only be used with ess-noweb-mode"))) (defun ess-noweb-start-of-syntax () "Go to the place to start fontifying from" (interactive) (goto-char (car (ess-noweb-chunk-region)))) (defun ess-noweb-font-lock-fontify-chunk-by-number ( chunk-num ) "Fontify chunk chunk-num based on the current major mode." (save-excursion (font-lock-set-defaults) ;; (setq old-beginning-of-syntax font-lock-beginning-of-syntax-function) (setq syntax-begin-function 'ess-noweb-start-of-syntax) (setq font-lock-keywords ;; (append font-lock-keywords ;; '(("\\(\\[\\[\\)\\([^]]*\\]*\\)\\(\\]\\]\\|\\$\\)" ;; (1 ess-noweb-font-lock-brackets-face prepend ) ;; (2 ess-noweb-font-lock-code-quote-face prepend) ;; (3 ess-noweb-font-lock-brackets-face prepend)) ;; ("^[ \t\n]*\\(<<\\)\\([^>]*\\)\\(>>=?\\)" ;; (1 ess-noweb-font-lock-brackets-face prepend ) ;; (2 ess-noweb-font-lock-chunk-name-face prepend) ;; (3 ess-noweb-font-lock-brackets-face prepend)) ;; ("^@[ \t\n]+" ;; (0 ess-noweb-font-lock-doc-start-face prepend ))))) (append font-lock-keywords '(("^[ \t\n]*\\(<<\\)\\([^>]*\\)\\(>>=?\\)" (1 font-lock-reference-face prepend ) (2 font-lock-keyword-face prepend) (3 font-lock-reference-face prepend)) ("^@[ \t\n]+" (0 font-lock-reference-face prepend ))))) (let ((r (cons (marker-position (cdr (aref ess-noweb-chunk-vector chunk-num))) (marker-position (cdr (aref ess-noweb-chunk-vector (1+ chunk-num)))))) (font-latex-extend-region-functions nil);; don't extend anything (font-lock-extend-region-functions nil)) ;; this infloops :( (save-restriction (narrow-to-region (car r) (cdr r)) ;; (sit-for 3) (font-lock-fontify-region (car r) (cdr r))) t))) (defun ess-noweb-font-lock-fontify-this-chunk () "Fontify this chunk according to its own major mode. Since we are in the chunk, the major mode will already have been set by ess-noweb-mode.el" (interactive) (ess-noweb-font-lock-fontify-chunk-by-number (ess-noweb-find-chunk-index-buffer))) (defun ess-noweb-font-lock-initial-fontify-buffer () "Applies syntax highlighting to some or all chunks in a noweb buffer. The number of chunks is set by ess-noweb-font-lock-max-initial-chunks: if this is nil, the entire buffer is fontified. It is intended to be called when first entering ess-noweb-font-lock-mode. For other purposes, use ess-noweb-font-lock-fontify-chunks." (interactive) ;; This will be tricky. It will be very slow to go throught the chunks ;; in order, switching major modes all the time. ;; So, we will do the documentation in one pass, the code in a second ;; pass. This could still be a little slow if we have to swap between ;; different code modes regularly, but it should be bearable. It should ;; only happen when the file is first read in, anyway (save-excursion (let (start-chunk end-chunk this-chunk chunk-counter) (setq this-chunk (ess-noweb-find-chunk-index-buffer)) (if ess-noweb-font-lock-max-initial-chunks (progn (setq start-chunk (max 0 (- this-chunk (/ ess-noweb-font-lock-max-initial-chunks 2)))) ;; Don't you just love hairy lisp syntax ? The above means set the ;; starting chunk to the current chunk minus half of ;; ess-noweb-font-lock-max-initial-chunks, unless that is negative in ;; which case set it to 0 (setq end-chunk (+ start-chunk ess-noweb-font-lock-max-initial-chunks)) (if (> end-chunk (- (length ess-noweb-chunk-vector) 2)) (setq end-chunk (- (length ess-noweb-chunk-vector) 2)))) ;; If ess-noweb-font-lock-max-initial-chunks is nil, do the whole buffer (progn (setq start-chunk 0) (setq end-chunk (- (length ess-noweb-chunk-vector) 2)))) (ess-noweb-font-lock-fontify-chunks start-chunk end-chunk)))) (defun ess-noweb-font-lock-fontify-buffer () "This function will fontify each chunk in the buffer appropriately." (interactive) (let ((start-chunk 0) (end-chunk (- (length ess-noweb-chunk-vector) 2))) (ess-noweb-font-lock-fontify-chunks start-chunk end-chunk))) (defun ess-noweb-font-lock-fontify-chunks (start-chunk end-chunk) "Fontify a noweb file from start-chunk to end-chunk" (interactive) (let (chunk-counter) (save-excursion (message "Fontifying from %d to %d" start-chunk end-chunk) ;; Want to set DOC mode for the first Doc chunk, not for the others (setq chunk-counter start-chunk) (while (stringp (car (aref ess-noweb-chunk-vector chunk-counter))) (setq chunk-counter (+ chunk-counter 1))) (goto-char (cdr (aref ess-noweb-chunk-vector chunk-counter))) (ess-noweb-select-mode) ;; Now go through the chunks, fontifying the documentation ones. (while (<= chunk-counter end-chunk) (if (not (stringp (car (aref ess-noweb-chunk-vector chunk-counter)))) (ess-noweb-font-lock-fontify-chunk-by-number chunk-counter)) (message "Fontifying documentation chunks: chunk %d" chunk-counter) (setq chunk-counter (+ 1 chunk-counter))) ;; Go back to the start and go through the chunks, fontifying the code ones. (setq chunk-counter start-chunk) (message "About to do code chunks") (while (<= chunk-counter end-chunk) (when (stringp (car (aref ess-noweb-chunk-vector chunk-counter))) ;; It's a code chunk: goto it to set the correct code mode, then ;; fontify it. (message "Fontifying code chunks: chunk %d" chunk-counter) (goto-char (cdr (aref ess-noweb-chunk-vector chunk-counter))) (ess-noweb-select-mode) (ess-noweb-font-lock-fontify-this-chunk)) (setq chunk-counter (1+ chunk-counter)))) (ess-noweb-select-mode))) (defun ess-noweb-font-lock-mode-fn() "Function that is intended to be attached to ess-noweb-font-lock-mode-hook." (ess-noweb-font-lock-initial-fontify-buffer)) ;; This is a wee bit of a hack. If people attach `turn-on-font-lock' ;; to their major mode hook, it will play hell with ;; ess-noweb-font-lock-mode. I had hoped that providing a replacement ;; `nw-turn-on-font-lock' would solve the problem, but it didn't ;; (sometimes turn-on-font-lock appears in places other than ;; `.emacs', such as in ESS). So rather than have it fall over if ;; turn-on-lock was around, I redefined turn-on-font-lock to do the ;; right thing. (defvar ess-noweb-old-turn-on-font-lock nil) (defun nw-turn-on-font-lock () "Turn on font-lock mode, with due regard to whether we are in ess-noweb-mode" (if (not ess-noweb-mode) (ess-noweb-old-turn-on-font-lock) (if (and (not ess-noweb-font-lock-mode) ess-noweb-use-font-lock-mode) (ess-noweb-font-lock-mode )))) (unless (functionp 'ess-noweb-old-turn-on-font-lock) (fset 'ess-noweb-old-turn-on-font-lock (symbol-function 'turn-on-font-lock)) (fset 'turn-on-font-lock (symbol-function 'nw-turn-on-font-lock))) (provide 'ess-noweb-font-lock-mode) ;; ***** ;; ;; Adnan Yaqub (AYaqub@orga.com) ;; ORGA Kartensysteme GmbH // An der Kapelle 2 // D-33104 Paderborn // Germany ;; Tel. +49 5254 991-823 //Fax. +49 5254 991-749 ;; Local Variables: ;; mode:emacs-lisp ;; End: ;;; ess-noweb-font-lock-mode.el ends here ess/lisp/Makefile0000664000175000017500000001357312632537307012354 0ustar eddedd### Makefile - for compiled e-lisp of ESS distribution. ### ## Before making changes here, please take a look at Makeconf include ../Makeconf ## For noweb extraction of code and documentation. NOTANGLE=notangle -L #NOTANGLE=notangle for no indexing. NOWEAVE=noweave ## SUFFIXES are in ../Makeconf : .nw.html: ; $(NOWEAVE) -filter l2h -index -html $*.nw > $*.html .nw.tex: ; $(NOWEAVE) -index -delay $*.nw | cpif $*.tex .nw.el: ; $(NOTANGLE) -R$*.el | cpif $*.el ##.nw.c: ; $(NOTANGLE) -R$*.c | cpif $*.c ##.nw.h: ; $(NOTANGLE) -R$*.h | cpif $*.h .tex.dvi: ; latex '\scrollmode \input '"$*"; while grep -s 'Rerun to get cross-references right' $*.log; do latex '\scrollmode \input '"$*"; done # have to preload the files that contain macro definitions or the # byte compiler will compile everything that references them # incorrectly. also preload a file that sets byte compiler options. PRELOADS = -l ./ess-comp.el ## files that contain key macro definitions. almost everything ## depends on them because the byte-compiler inlines macro expansions. ## everything also depends on the byte compiler options file since ## this might do odd things like turn off certain compiler ## optimizations. When these change, RECOMPILE. CORE = ess.elc ess-site.elc ### Everything but ess-debug.el, ess-install.el ### ess-send.el , ess-send2.el ### DEPRECATED: essl-bug.el ## ELC = $(CORE) ess-comp.elc ess-custom.elc \ ess-dde.elc ess-compat.elc ess-font-lock.elc \ ess-help.elc ess-inf.elc ess-mode.elc \ ess-menu.elc ess-mouse.elc mouseme.elc \ ess-swv.elc ess-toolbar.elc \ ess-trns.elc ess-utils.elc \ essd-els.elc ess-gretl.elc \ ess-lsp-l.elc ess-xls-d.elc ess-vst-d.elc ess-arc-d.elc \ ess-sas-l.elc ess-sas-d.elc ess-sas-a.elc \ ess-sta-l.elc ess-sta-d.elc make-regexp.elc \ ess-omg-l.elc ess-omg-d.elc \ ess-bugs-l.elc ess-bugs-d.elc ess-jags-d.elc \ ess-noweb.elc ess-noweb-mode.elc ess-noweb-font-lock-mode.elc \ ess-eldoc.elc ess-roxy.elc ess-rutils.elc ess-r-completion.elc \ ess-s-l.elc ess-s3-d.elc ess-s4-d.elc \ ess-sp3-d.elc ess-sp4-d.elc ess-sp5-d.elc ess-sp6-d.elc \ ess-rdired.elc ess-r-args.elc ess-r-syntax.elc ess-r-d.elc ess-rd.elc \ ess-developer.elc ess-tracebug.elc ess-julia.elc\ julia-mode.elc\ ess-sp6w-d.elc msdos.elc ## ^^^^^^^^^^^^^^^^^^^^^^^ Windows only (but be platform-oblivious) ## julia-mode.el : really from the julia sources -- but want in tarball! # ESSR_VER =`cat ../etc/ESSR-VERSION` ##ESSR_VER = $(shell cat ../etc/ESSR-VERSION) ### Targets all: $(ELC) ess-custom.el julia-mode.el .PHONY: dist dist: all ## @touch dist ## svn committing happens in ../Makefile install: dist -$(INSTALLDIR) $(LISPDIR) $(INSTALL) ChangeLog *.elc $(LISPDIR) -export J; for I in *.elc; do J=$$I; $(INSTALL) `basename $$J .elc`.el $(LISPDIR); done if [ -f /etc/debian_version -a -n "$(SITELISP)" -a ! -f "$(SITELISP)/ess-site.el" ] ; \ then \ ln -s $(LISPDIR)/ess-site.el $(SITELISP)/ess-site.el ; \ fi; # test "$(LISPDIR)" = "." || $(INSTALL) *.elc $(LISPDIR) uninstall: -cd $(LISPDIR) && $(UNINSTALL) ChangeLog *.elc *.el if [ -n "$(SITELISP)" -a -h "$(SITELISP)/ess-site.el" ] ; \ then \ cd $(SITELISP) && $(UNINSTALL) ess-site.el ; \ fi; clean: rm -f $(ELC) distclean: clean # and potentially more ### Targets below here are only for developers - and these must have perl ### Replace Version numbers (as in ../doc/Makefile !): ## "../VERSION" if that changes, *definitely* need to update ess-custom.el ess-custom.el: ../VERSION EV='$(ESSVERSION)'; perl -pi -e "s/\".*\"/\"$$EV\"/ if /ess-version/" $@ # ess-r-d.el: ../etc/ESSR-VERSION # sed -i -e '/let.*ESSR-version/s/"[-.0-9]*"/"$(ESSR_VER)"/' $@ ## This should typically happen before building ESS julia-mode.el: $(DOWNLOAD) https://raw.githubusercontent.com/JuliaLang/julia/master/contrib/julia-mode.el > julia-mode.el ### File Dependencies .el.elc: $(EMACSBATCH) $(PRELOADS) -f batch-byte-compile $< ess-custom.elc: ess-custom.el ess-comp.el $(EMACSBATCH) $(PRELOADS) -f batch-byte-compile ess-custom.el ess.elc: ess.el ess-comp.el ess-custom.elc $(EMACSBATCH) $(PRELOADS) -l ess-custom.elc -f batch-byte-compile ess.el ess-site.elc: ess-site.el ess.elc ess-inf.elc: ess-inf.el ess-comp.el $(CORE) # @echo " " # @echo "For the next compile, please disregard the messages" # @echo " ** the function set-keymap-parent is not known to be defined." # @echo " ** assignment to free variable comint-last-input-end" # @echo "from the byte compiler if they occur. It is completely normal." $(EMACSBATCH) $(PRELOADS) -f batch-byte-compile ess-inf.el ess-mode.elc: ess-mode.el ess-comp.el $(CORE) $(EMACSBATCH) $(PRELOADS) -f batch-byte-compile ess-mode.el ess-trns.elc: ess-trns.el ess-comp.el $(CORE) $(EMACSBATCH) $(PRELOADS) -f batch-byte-compile ess-trns.el ess-help.elc: ess-help.el $(CORE) ## S languages ess-s-l.elc : ess-s-l.el ess.elc ess-sas-d.elc : ess-sas-d.el ess.elc ess-s3-d.elc : ess-s3-d.el ess-s-l.elc ess.elc ess-sp3-d.elc : ess-sp3-d.el ess-s-l.elc ess.elc ess-s4-d.elc : ess-s4-d.el ess-s-l.elc ess.elc ess-r-d.elc : ess-r-d.el ess-s-l.elc ess.elc ess-swv.elc: ess-swv.el ess-noweb.elc ## Lisp Languages ess-lsp-l.elc : ess-lsp-l.el ess.elc ess-xls-d.elc : ess-xls-d.el ess-lsp-l.elc ess.elc ess-vst-d.elc : ess-vst-d.el ess-lsp-l.elc ess.elc ## SAS ess-sas-l.elc : ess-sas-l.el ess-sas-a.el ess.elc ess-sas-d.elc : ess-sas-d.el ess-sas-l.elc ess.elc ## Stata ess-sta-l.elc : ess-sta-l.el ess.elc ess-sta-d.elc : ess-sta-d.el ess.elc ## BUGS ess-bugs-l.elc : ess-bugs-l.el ess-compat.elc ess-bugs-d.elc : ess-bugs-d.el ess-bugs-l.elc ## JAGS ess-jags-d.elc : ess-jags-d.el ess-bugs-l.elc ess-utils.elc ess-inf.elc ## GRETL ess-gretl.elc : ess-gretl.el # Ignore this. #(defun S-insert-make-rule (file) # (interactive "sFile:") # (insert (format "%s.elc: %s.el $(CORE)\n\t@echo compiling %s.el...\n\t@$(EMACSBATCH) $(PRELOADS) -f batch-byte-compile %s.el" file file file file))) ess/OONEWS0000664000175000017500000001374712423756516010710 0ustar eddedd== Changes up to version 5.0 : * Works with XLispStat, R, and S(plus). == Changes up to version 4.8.MM6.XE3 : * inferior S-mode: C-c C-a is comint-bol (not attach directories) Output cleaned up (thanks to PD). * Code cleaned up, more according to Emacs-Lisp Style Guide. * Added some code for S4 (not activated yet). (thanks to JMC). * Added some extra configuration code (not activated yet) (thanks to MM). * reports to proper authority (Hornik/Maechler/Rossini). * Makefile updated (i.e. Unpacks into a subdirectory (this has been true for all XE versions, etc)). * Fixed up output from R (KH). == Changes up to version 4.8.MM6.XE2 : * Works with Emacs and XEmacs. I think. Documentation needs to be updated . == Changes up to version 4.8.MM6.XE1 : * XEmacs compatibility added, Emacs compatibility broken. Easymenu now in use. == Changes up to version 4.8.MM6 : * Lots of patches by Martin. S-eval, right? (AJR: I don't know). == Changes up to version 4.8: * Keybinding changes in S Transcript Mode. RET now simply executes the current commant. M-RET executes and moves, C-c RET copies, leaving you in the process buffer. These bindings mirror those in Inferior S mode. * If S-source-directory is a lambda expression, it is evaluated with the process buffer as the current buffer. * The default starting directory is always your home directory. Set S-directory to `nil' to get the old behaviour (use the current buffer's default directory). * In Inferior S mode, S mode and S transcript mode, M-? is now bound to the new function S-list-object-completions. Also, S-resynch is available from the Inf-S menu. * S-request-a-process is now bound to C-c C-k. This frees C-c C-p for the standard comint binding of comint-previous-prompt. * Massive manual update. == Changes in version 4.7: * Probably *only* works with Emacs 19.29 * New semantics for S-keep-dump-files. Values may be nil, check, ask or t; the default is 'check. It's also now buffer-local. See the info file for more details. * New hook, S-post-run-hook, run just after the S process starts. Use this to evaluate code at the start of a session. == Changes in version 4.6: * Works with Emacs 19.29 * Font-lock support in S-mode, inferior-S-mode and S-transcript-mode buffers * M-RET in inferior-S-mode is bound to S-transcript-send-command-and-move * S-site now much more lightweight to load. == Changes in version 4.5: * New, and hopefully simpler, installation procedure. == Changes in version 4.4: * There is now a command to send bug reports: S-submit-bug-report. It is also available from menus (Send bug report). * Keybinding changes: S-view-at-bottom (on C-c C-v) has been deleted. It's functionality is provided by comint's comint-show-maximum-output, on C-c C-e. S-display-help-on-object has moved from C-c C-h onto C-c C-v (and now has an alias, M-x S-help), and S-execute (S-execute-in-tb in S-mode) has moved from C-c C-e to C-c C-t. == Changes in version 4.3: * The variable S-source-directory-generator has been deleted. It's functionality has been subsumed into the variable S-source-directory; if this is not a string it is assumed to be a lambda expression, and behaves in the same was as S-source-directory used to. * New user option S-delete-dump-files. == Changes in version 4.2: * New user variable S-inf-filenames-map. Set this to nil if you are using DOS or some other system with limited filename lengths. * S-local-variables-string and S-temp-buffer-p have been deleted. S-mode no longer adds a local variables section to source files. You should use file extensions to set the major mode. * S-insert-function-templates has been deleted. Its functionality has been taken over by the user variable S-function-template. * S.el has been divided into four separate files, with autoloads. * New file S-site.el for site-level customizations. * S-ask-about-display and X-displays-list have been removed. * User variable: S-ask-about-transfile. If non-nil, asks for a transcript file to use. == Changes in version 4.0: * The TAB key in inferior-S-mode is more versatile; it completes S object names when point follows an object name, and completes filenames when point is in a string. * New mode: S-transcript-mode, for dealing with S transcript files. * Multi-line inputs are now evaluated neatly * inferior-S-prompt is no longer a user variable. Instead, set inferior-S-primary-prompt and inferior-S-secondary-prompt * Uses the comint.el supplied with Emacs 19.20 onwards. * Hook: S-send-input-hook * Emacs version 18 is no longer supported (sorry). Works with Emacs 19 (and, unfortunately, only Emacs 19) * S-tek is no longer supported, and has been removed from the distribution * Works with S version 3.1 == Changes in version 3.5: * Support for multiple S processes. Pass a numeric argument to M-x S to start a new S process. The name of the process associated with the cuurent buffer is shown in the mode line like this: [S2] * In the process buffer, a paragraph is a prompt, a command and its output, to make the paragraph functions useful. Multiple S sessions are delimited by ^L, to make the page functions useful * User variable S-synchronize-evals * New function S-request-a-process, bound to C-c C-p * New function S-clean-region == RELEASE 3.4 INFORMATION * Works with version 3.0 S * Command-line completion of S object names * Recognition of attached data frames * Dedicated S Help mode * Tek graphics support * Several bugfixes and code cleanups * Texinfo documentation == RELEASE 2.1 INFORMATION Improvements since last release (unnumbered of Summer 1990): * Better description provided of functions loaded. * Better header for this file. * S-directory is now a prescriptive rather than just descriptive variable. * better syntax table, so |#; are better recognized and commands using them work better. * we have a version number. Local Variables: mode: text fill-prefix: " " End: ess/test/0000775000175000017500000000000012632537307010713 5ustar eddeddess/test/generate-literate-cases0000775000175000017500000000123512632537307015337 0ustar eddedd#!/usr/bin/emacs --script ;; (Re)generate files with test cases for indentation (let ((current-directory (file-name-directory load-file-name))) (setq ess-test-path (expand-file-name "." current-directory)) (setq ess-literate-path (expand-file-name "./literate/" current-directory)) (setq ess-root-path (expand-file-name "../lisp/" current-directory))) (add-to-list 'load-path ess-root-path) (add-to-list 'load-path ess-test-path) (require 'ess-site) (load (expand-file-name "ess-literate-tests.el" ess-test-path) nil t) (mapc (lambda (file) (ess-ltest-R (expand-file-name file ess-literate-path))) '("roxy.R" "code-fill.R" "misc.R" "syntax.R")) ess/test/literate/0000775000175000017500000000000012632537307012524 5ustar eddeddess/test/literate/roxy.R0000664000175000017500000000533112632537307013652 0ustar eddedd ##### Filling ### 1a --------------------------------------------------------------- ##' Title ##' ##' @param┬╢ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. NULL ##! (fill-paragraph) ##' Title ##' ##' @param┬╢ Lorem ipsum dolor sit amet, consectetur adipiscing elit, ##' sed do eiusmod tempor incididunt ut labore et dolore magna ##' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ##' ullamco laboris nisi ut aliquip ex ea commodo consequat. ##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, ##' sed do eiusmod tempor incididunt ut labore et dolore magna ##' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ##' ullamco laboris nisi ut aliquip ex ea commodo consequat. NULL ### 1b --------------------------------------------------------------- ##' Title ##' ┬╢##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. NULL ##! (fill-paragraph) ##' Title ##' ┬╢##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, ##' sed do eiusmod tempor incididunt ut labore et dolore magna ##' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ##' ullamco laboris nisi ut aliquip ex ea commodo consequat. ##' @param Lorem ipsum dolor sit amet, consectetur adipiscing elit, ##' sed do eiusmod tempor incididunt ut labore et dolore magna ##' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ##' ullamco laboris nisi ut aliquip ex ea commodo consequat. NULL ### 2 ---------------------------------------------------------------- ##' ┬╢ ##! (global-set-key (kbd "RET") 'newline-and-indent) ##! (substitute-key-definition 'newline-and-indent ##! 'ess-newline-and-indent ##! ess-mode-map global-map) ##! "RET" ##' ##' ┬╢ ##> "RET" ##' ##' ##' ┬╢ ##> (setq ess-roxy-insert-prefix-on-newline nil) ##> "RET" ##' ##' ##' ┬╢ ##! "M-j" ##' ##' ┬╢ ess/test/literate/misc.R0000664000175000017500000000054512632537307013606 0ustar eddedd ##### Indentation ### 1 ---------------------------------------------------------------- { fun┬╢_call( argument ) + stuff1 } + stuff2 ##! "C-M-q" { fun┬╢_call( argument ) + stuff1 } + stuff2 ##! "C-u" ##! "C-M-q" { fun┬╢_call( argument ) + stuff1 } + stuff2 ess/test/literate/syntax.R0000664000175000017500000000175412632537307014204 0ustar eddedd ##### Blanks, Characters and Comments ### 1 ---------------------------------------------------------------- text┬╢ text ##! (ess-skip-blanks-forward t) text ┬╢text ### 2 ---------------------------------------------------------------- text┬╢ # comment ##! (when (not (ess-skip-blanks-forward t)) ##! (insert "failure")) text ┬╢# comment ##> (when (ess-skip-blanks-forward t) ##> (insert "failure")) text ┬╢# comment ### 3 ---------------------------------------------------------------- text ┬╢text ##! (ess-skip-blanks-backward) text ┬╢text ##! (ess-skip-blanks-backward t) text┬╢ text ##### Statements ### 1 ---------------------------------------------------------------- (!stuff1 ┬╢|| stuff2) ##! (ess-climb-continuations) (┬╢!stuff1 || stuff2) ##### Bare blocks ### 1 ---------------------------------------------------------------- function_call() ┬╢ ##! (ess-climb-block-prefix) function_call() ┬╢ ##! (ess-climb-block-prefix "function") function_call() ┬╢ ess/test/literate/code-fill.R0000664000175000017500000000373212632537307014512 0ustar eddedd ##### Code Filling ### 1 ---------------------------------------------------------------- fun_call(┬╢argument1, argument2, argument3, argument4, argument5) ##! (setq-local fill-column 40) ##! "M-q" fun_call(┬╢argument1, argument2, argument3, argument4, argument5) ##> "M-q" fun_call(┬╢argument1, argument2, argument3, argument4, argument5) ##> "M-q" fun_call(┬╢argument1, argument2, argument3, argument4, argument5) ##> "M-q" fun_call(┬╢argument1, argument2, argument3, argument4, argument5) ### 2 ---------------------------------------------------------------- fun┬╢_call(argument1, argument2, argument3, argument4, argument5) ##! (setq-local fill-column 40) ##! "M-q" fun┬╢_call(argument1, argument2, argument3, argument4, argument5) ### 3 ---------------------------------------------------------------- fun_call(┬╢ ## comment argument1, ## comment argument2) ##! "M-q" fun_call(┬╢ ## comment argument1, ## comment argument2) ### 4 ---------------------------------------------------------------- ┬╢fun_call(parameter = "string") ##! "M-q" ┬╢fun_call(parameter = "string") ### 5 ---------------------------------------------------------------- `fun_call`(┬╢argument1, argument2) ##! "M-q" ##! "M-q" `fun_call`(┬╢argument1, argument2) ##### Continuation Filling ### 1 ---------------------------------------------------------------- lm(outcome┬╢ ~ pred1 + pred2 + pred3 + pred4, data) ##! "M-q" lm(outcome┬╢ ~ pred1 + pred2 + pred3 + pred4, data) ##> "M-q" lm(outcome┬╢ ~ pred1 + pred2 + pred3 + pred4, data) ##> "M-q" lm(outcome┬╢ ~ pred1 + pred2 + pred3 + pred4, data) ### 2 ---------------------------------------------------------------- fun_call(┬╢argument +) ##! "M-q" fun_call(┬╢argument +) ess/test/run-tests0000775000175000017500000000076212632537307012612 0ustar eddedd#!/usr/bin/emacs --script ;; This script must be run from the test directory (let ((current-directory (file-name-directory load-file-name))) (setq ess-test-path (expand-file-name "." current-directory)) (setq ess-root-path (expand-file-name "../lisp/" current-directory))) (add-to-list 'load-path ess-root-path) (add-to-list 'load-path ess-test-path) (require 'ess-site) (load (expand-file-name "ess-indentation-tests.el" ess-test-path) nil t) ;; run tests (ert-run-tests-batch-and-exit t) ess/test/styles/0000775000175000017500000000000012632537307012236 5ustar eddeddess/test/styles/RRR.R0000664000175000017500000003427712632537307013043 0ustar eddedd ### Function declarations ## 1 { fun <- function(argument1, argument2) { body } } ## 2 { function( argument1, argument2 ) { body } } ## 3 function(argument_fun(sub_argument1, sub_argument2), argument) {} ## 4 function(argument1, parameter = fun_call( sub_argument), argument2) {} ## 5 function() function() body ## 6a object <- function() { body } ## 6b object <- function() { body } ## 6c object = function() { body } ## 6d fun_call(argument) <- function() { body } ## 7 { object <- function() { body } } ## 8 { fun_call(parameter = function() { body }) } ## 9 { fun_call(parameter = function() { body }) } ## 10 fun_call( function() { stuff } ) ## 11 { fun_call1(fun_call2(argument, function() { stuff }) ) } ## 12 { fun_call1(argument, fun_call2(function() { stuff }) ) } ## 13 fun_call(object := function() { body }) ## 14 fun_call(argument, function(x) stuff ) ## 15a `object` <- function() { body } ## 15b "object" <- function() { body } ## 15c 'object' <- function() { body } ### Function calls ## 1 fun_call(argument1, argument2) ## 2 fun_call( argument1, argument2 ) ## 3 fun_call(parameter = ( stuff ), argument) ## 4 fun_call(parameter = fun_argument( argument1 ), argument2) ## 5 fun_call(parameter = fun_argument(argument1, argument2 ) , argument3) ## 6 `fun_call`(argument1, argument2) ## 6b `:=`(argument1, argument2) ## 7 `fun_call`( argument1, argument2 ) ## 7b `:=`( argument1, argument2 ) ## 8 fun_call(argument1 , argument2 , argument3, argument4, ( stuff1 ), argument5, ( stuff2 ) , argument6 ) ## 9 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 10 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 11 { fun_call1( fun_call2 (argument1, argument2, parameter = fun_call3( argument3, argument4 ), function(x) { body }, argument5, fun_call4( argument6 ), argument7 ), { stuff }, argument8 ) } ## 12 object <- fun_call( arg1, arg2 ) ## 13 fun_call1(fun_call2( argument )) ## 14 some_function <- fun_call1(fun_call2( argument )) ## 15 object[, fun_call( argument )] ## 16 fun_call1(argument1, fun_call2(fun_call3( argument2 )) ) ## 17 fun_call({ stuff1 stuff2 stuff3 }) ## 18 fun_call(argument1 %>% stuff, argument2) ## 19 fun_call(argument, ) ### Blocks ## 1 { function() { body } } ## 2 { fun_call({ stuff1 }, { stuff2 } ) } ## 3 fun_call({ stuff1 }, { stuff2 }) ## 4 fun_call( parameter1 = { stuff1 }, parameter2 = { stuff2 } ) ## 5 fun_call(parameter1 = { stuff1 }, { stuff2 }, parameter2 = { stuff3 }, { stuff4 }, parameter3 = stuff5 ~ stuff6 + stuff7, argument) ## 6 fun <- fun_call({ stuff1 }, { stuff2 }, { stuff3 } ) ## 7 fun <- fun_call({ stuff }, argument ) ## 8 fun_call(function(x) { body1 }, function(x) { body2 }) ## 9 fun_call( { stuff }, { stuff } ) ## 10 object <- fun_call({ stuff }, { stuff }) ## 11 object <- fun_call( { body } ) ## 12 fun_call1( fun_call2({ stuff } ) ) ## 13 { stuff1 { stuff2 } } ## 14 {{ stuff } } ## 15 ({ stuff }) ## 16 ( { stuff } ) ## 17 fun_call(argument, function(argument1, argument2) { body } ) ## 18 fun_call( argument, function(argument1, argument2) { body } ) ## 19 fun_call1( fun_call2(argument, function(x) { body }) ) ## 20 fun_call1({ object1 <- fun_call2( argument) object2 }) ## 21 fun_call(argument, function() { stuff } } ## 22 function_call() stuff ### Bracket indexing ## 1 object[ argument1, argument2 ] ## 2 object[argument1, argument2 ] ## 3 object[( argument1 )] ## 4 { object[ fun_call( body ), argument[ ( sub_argument ) ] ] } ## 5 { object[ argument1, argument2, by = argument3 ][ argument4, fun_call1(argument1, argument2) argument5 ][ argument6, fun_call2( argument1, argument2 ) ] } ### Control flow ## 1 { if (condition) { stuff1 } else { stuff2 } } ## 2 { if (condition) { stuff1 } else { stuff2 } } ## 3 { if (condition) { stuff1 } else { stuff2 } } ## 4 { if (condition) { stuff1 } else { stuff2 } } ## 5 { for (sequence) { stuff } } ## 6 { for (sequence) { stuff } } ## 7 if (condition) stuff ## 8 for (sequence) stuff ## 9 object <- if (condition) { stuff1 } else { stuff2 } ## 10 { object <- if (condition) stuff1 else stuff2 } ## 10 { object <- if (condition) fun_call( argument1, argument2 ) else stuff } ## 11 { fun_call(parameter = if (condition) stuff1 else stuff2 ) } ## 12 { if (condition1) { stuff1 } else if (condition2) stuff2 else if (condition3) { stuff3 } else if (condition4) stuff4 else stuff5 } ## 13 fun_call( argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 14 fun_call( argument, parameter = if (condition1) stuff1 else if (condition2) stuff3 else stuff2 ) ## 15 object <- fun_call(argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 16 object <- fun_call(argument, if (condition) stuff1 else if (condition2) stuff2 ) ## 17 while(condition) stuff ## 18 if (condition1) stuff1 else if (condition2) { stuff2 } ## 19 object <- if (condition) fun_call()[index] else stuff ## 20 funcall({ if (test1) stuff1 if (test2) stuff2 }) ## 21 fun_call(argument, function() { if (cond) object1 <- object2 else object3 <- object4 }) ## 22 if (cond1) if (cond2) if (cond3) stuff1 else if (cond4) stuff2 else if (cond5) stuff3 else stuff4 else if (cond6) stuff5 else if (cond7) stuff6 else stuff7 else if (cond8) stuff8 else if (cond9) stuff9 else stuff10 ## 23 if (cond1) if (cond2) for (sequence1) if (cond3) stuff1 else stuff2 else if (cond4) for (sequence2) stuff3 else if (cond5) fun_call( argument ) else stuff5 else stuff6 ## 24 object <- if(cond) stuff1 else stuff2 ## 25 if (condition) { (stuff) } ## 26 { if (condition1) stuff1 else if (condition2) { stuff2 } else if (condition3) stuff3 } ## 27 object <- if (condition) { stuff1 } else { stuff2 } ### Continuation lines ## 1 stuff1 %>% stuff2 %>% stuff3 ## 2 { stuff1 %>% stuff2 %>% stuff3 } %>% stuff4 %>% stuff5 ## 3 ( stuff1 %>% stuff2 %>% stuff3 ) %>% stuff4 %>% stuff5 ## 4 object[ stuff1 %>% stuff2 %>% stuff3 ] %>% stuff4 %>% stuff5 ## 5 stuff1 %>% stuff2 %>% if (condition) { stuff3 %>% stuff4 %>% stuff5 } else { stuff6 %>% stuff7 %>% stuff8 } %>% stuff9 %>% stuff10 ## 6 stuff[stuff1 %>% stuff2 %>% stuff3] %>% stuff4 %>% stuff5 ## 7 ggplot() + geom(lhs - rhs ) + geom() ## 8 { ggplot() + geom1(argument1, argument2 = ( stuff1 ) - stuff2) + geom2() + geom3() } ## 9 stuff + fun_call(parameter = argument1, fun_call((stuff1 - stuff2 + stuff3 ) / stuff4) ) / stuff5 fun_call(arg1 + arg2, arg3 + arg4) ## 10 fun_call(argument1 %>% stuff1, argument2 %>% stuff2, { stuff3 %>% stuff4 } %>% stuff5, argument3 ) ## 11 object1 <- object2 %>% fun_call1() %>% fun_call2() ## 12 object1 <- object2%>%fun_call1() %>% fun_call2()%>% fun_call3() ## 13 { (stuff) %>% fun_call() {stuff} %>% fun_call() } ## 14 { object + ( stuff ) %>% fun_call() object + { stuff } %>% fun_call() } ## 15 object <- stuff1 + stuff2 ~ stuff3 + stuff4 := stuff5 + stuff6 = stuff7 + stuff8 ## 16 object <- stuff1 + stuff2 + stuff3 + stuff4 ~ stuff5 + stuff6 + stuff7 + stuff8 := stuff9 + stuff10 + stuff11 + stuff12 = stuff13 + stuff14 + stuff15 + stuff16 ## 17 object %>% { stuff1 } %>% object[index] %>% {stuff2} %>% fun_call1() + if (condition1) stuff3 else stuff4 + if (condition2) { stuff5 } else if (condition3) { stuff6 } else { stuff7 } %>% (fun_call2()) %>% fun_call3() %>% fun_call3() ## 18 `object`$`elem` <- stuff1 + stuff2 `object`@`elem` <- stuff1 + stuff2 ## 19 { ## comment object1 <- object2 } ## 20 fun_call(stuff1 + stuff2 + stuff3 + (stuff4 + stuff5 + stuff6) + object[stuff7 + stuff8] + {stuff9 + stuff10}) ## 21 object %>% fun_call({ stuff1 }) %>% stuff2 ## 22 "string1" %>% 'string2' %>% `stuff1` %>% stuff2 ## 23 object[index] %>% fun_call1( argument1 )[index2] %>% fun_call2( argument2 )[[index3]] %>% stuff ## 24 fun_call(argument) <- hop ## 25 fun_call1(argument, fun_call2( stuff1 ) + stuff2) ## 26 object <- { stuff1 } %>% ( stuff2 ) ## 27 fun_call1(fun_call2(fun_call3( argument ))) %>% fun_call2() ## 28 fun_call(argument1 %>% stuff, argument2) ## 29 fun_call(stuff1 := (stuff2), argument) ## 30 fun_call1(fun_call2( fun_call3()) %>% stuff) ## 31 fun_call(object1 + object2 ~ object3 + object4 + object5 := object6 + object7, argument) ## 32 fun_call(object ~ ) ## 33 fun_call(object + ) ## 34 fun_call(object[index1]$element[index2][index3]@attribute + stuff) ## 35a fun_call(argument <- object) ## 35b fun_call(argument <<- object) ## 36 funcall(!stuff1 || stuff2) ### Comments ## 1 # Side comment ## 2 { ## Hanging comment 1 fun_call( { ## Hanging comment 2 } ) } ## 3 { ### Section comment } ## 4 fun_call( ## Comment argument ) ## 5 object %>% ## comment, ## comment stuff ## 6a object <- function() { stuff ## comment } ## 6b object <- function() { ## comment } ## 7 { fun_call(lhs + ### Comment rhs ) } ### Logical operators ## 1 stuff1 && stuff2 || stuff3 ## 2 (stuff1 && stuff2 || stuff3) ## 3 if (condition1 && condition2 || (condition3 && condition4) || (condition5 && condition6 && condition7) || condition8) { stuff } && condition8 || condition9 || condition10 ## 4 stuff1 == stuff2 || condition ## 5 (stuff1 == stuff2 || condition ) ## 6 (stuff1 != stuff2 || condition ) ## 7 object <- condition1 | condition2 | condition3 | condition4 ## 8 if (condition1 || object1 %op% object2 || condition3) { stuff } ## 9 any(condition1 | condition2) && all(condition3 & condition4) ### Specific situations and overrides ## 1 fun_call( ifelse(condition1, argument1, ifelse(condition2, argument2, ifelse)) ) ess/test/styles/C++.R0000664000175000017500000003367712632537307012711 0ustar eddedd ### Function declarations ## 1 { fun <- function(argument1, argument2) { body } } ## 2 { function( argument1, argument2 ) { body } } ## 3 function(argument_fun(sub_argument1, sub_argument2), argument) {} ## 4 function(argument1, parameter = fun_call( sub_argument), argument2) {} ## 5 function() function() body ## 6a object <- function() { body } ## 6b object <- function() { body } ## 6c object = function() { body } ## 6d fun_call(argument) <- function() { body } ## 7 { object <- function() { body } } ## 8 { fun_call(parameter = function() { body }) } ## 9 { fun_call(parameter = function() { body }) } ## 10 fun_call( function() { stuff } ) ## 11 { fun_call1(fun_call2(argument, function() { stuff }) ) } ## 12 { fun_call1(argument, fun_call2(function() { stuff }) ) } ## 13 fun_call(object := function() { body }) ## 14 fun_call(argument, function(x) stuff ) ## 15a `object` <- function() { body } ## 15b "object" <- function() { body } ## 15c 'object' <- function() { body } ### Function calls ## 1 fun_call(argument1, argument2) ## 2 fun_call( argument1, argument2 ) ## 3 fun_call(parameter = ( stuff ), argument) ## 4 fun_call(parameter = fun_argument( argument1 ), argument2) ## 5 fun_call(parameter = fun_argument(argument1, argument2 ) , argument3) ## 6 `fun_call`(argument1, argument2) ## 6b `:=`(argument1, argument2) ## 7 `fun_call`( argument1, argument2 ) ## 7b `:=`( argument1, argument2 ) ## 8 fun_call(argument1 , argument2 , argument3, argument4, ( stuff1 ), argument5, ( stuff2 ) , argument6 ) ## 9 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 10 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 11 { fun_call1( fun_call2 (argument1, argument2, parameter = fun_call3( argument3, argument4 ), function(x) { body }, argument5, fun_call4( argument6 ), argument7 ), { stuff }, argument8 ) } ## 12 object <- fun_call( arg1, arg2 ) ## 13 fun_call1(fun_call2( argument )) ## 14 some_function <- fun_call1(fun_call2( argument )) ## 15 object[, fun_call( argument )] ## 16 fun_call1(argument1, fun_call2(fun_call3( argument2 )) ) ## 17 fun_call({ stuff1 stuff2 stuff3 }) ## 18 fun_call(argument1 %>% stuff, argument2) ## 19 fun_call(argument, ) ### Blocks ## 1 { function() { body } } ## 2 { fun_call({ stuff1 }, { stuff2 } ) } ## 3 fun_call({ stuff1 }, { stuff2 }) ## 4 fun_call( parameter1 = { stuff1 }, parameter2 = { stuff2 } ) ## 5 fun_call(parameter1 = { stuff1 }, { stuff2 }, parameter2 = { stuff3 }, { stuff4 }, parameter3 = stuff5 ~ stuff6 + stuff7, argument) ## 6 fun <- fun_call({ stuff1 }, { stuff2 }, { stuff3 } ) ## 7 fun <- fun_call({ stuff }, argument ) ## 8 fun_call(function(x) { body1 }, function(x) { body2 }) ## 9 fun_call( { stuff }, { stuff } ) ## 10 object <- fun_call({ stuff }, { stuff }) ## 11 object <- fun_call( { body } ) ## 12 fun_call1( fun_call2({ stuff } ) ) ## 13 { stuff1 { stuff2 } } ## 14 {{ stuff } } ## 15 ({ stuff }) ## 16 ( { stuff } ) ## 17 fun_call(argument, function(argument1, argument2) { body } ) ## 18 fun_call( argument, function(argument1, argument2) { body } ) ## 19 fun_call1( fun_call2(argument, function(x) { body }) ) ## 20 fun_call1({ object1 <- fun_call2( argument) object2 }) ## 21 fun_call(argument, function() { stuff } } ## 22 function_call() stuff ### Bracket indexing ## 1 object[ argument1, argument2 ] ## 2 object[argument1, argument2 ] ## 3 object[( argument1 )] ## 4 { object[ fun_call( body ), argument[ ( sub_argument ) ] ] } ## 5 { object[ argument1, argument2, by = argument3 ][ argument4, fun_call1(argument1, argument2) argument5 ][ argument6, fun_call2( argument1, argument2 ) ] } ### Control flow ## 1 { if (condition) { stuff1 } else { stuff2 } } ## 2 { if (condition) { stuff1 } else { stuff2 } } ## 3 { if (condition) { stuff1 } else { stuff2 } } ## 4 { if (condition) { stuff1 } else { stuff2 } } ## 5 { for (sequence) { stuff } } ## 6 { for (sequence) { stuff } } ## 7 if (condition) stuff ## 8 for (sequence) stuff ## 9 object <- if (condition) { stuff1 } else { stuff2 } ## 10 { object <- if (condition) stuff1 else stuff2 } ## 10 { object <- if (condition) fun_call( argument1, argument2 ) else stuff } ## 11 { fun_call(parameter = if (condition) stuff1 else stuff2 ) } ## 12 { if (condition1) { stuff1 } else if (condition2) stuff2 else if (condition3) { stuff3 } else if (condition4) stuff4 else stuff5 } ## 13 fun_call( argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 14 fun_call( argument, parameter = if (condition1) stuff1 else if (condition2) stuff3 else stuff2 ) ## 15 object <- fun_call(argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 16 object <- fun_call(argument, if (condition) stuff1 else if (condition2) stuff2 ) ## 17 while(condition) stuff ## 18 if (condition1) stuff1 else if (condition2) { stuff2 } ## 19 object <- if (condition) fun_call()[index] else stuff ## 20 funcall({ if (test1) stuff1 if (test2) stuff2 }) ## 21 fun_call(argument, function() { if (cond) object1 <- object2 else object3 <- object4 }) ## 22 if (cond1) if (cond2) if (cond3) stuff1 else if (cond4) stuff2 else if (cond5) stuff3 else stuff4 else if (cond6) stuff5 else if (cond7) stuff6 else stuff7 else if (cond8) stuff8 else if (cond9) stuff9 else stuff10 ## 23 if (cond1) if (cond2) for (sequence1) if (cond3) stuff1 else stuff2 else if (cond4) for (sequence2) stuff3 else if (cond5) fun_call( argument ) else stuff5 else stuff6 ## 24 object <- if(cond) stuff1 else stuff2 ## 25 if (condition) { (stuff) } ## 26 { if (condition1) stuff1 else if (condition2) { stuff2 } else if (condition3) stuff3 } ## 27 object <- if (condition) { stuff1 } else { stuff2 } ### Continuation lines ## 1 stuff1 %>% stuff2 %>% stuff3 ## 2 { stuff1 %>% stuff2 %>% stuff3 } %>% stuff4 %>% stuff5 ## 3 ( stuff1 %>% stuff2 %>% stuff3 ) %>% stuff4 %>% stuff5 ## 4 object[ stuff1 %>% stuff2 %>% stuff3 ] %>% stuff4 %>% stuff5 ## 5 stuff1 %>% stuff2 %>% if (condition) { stuff3 %>% stuff4 %>% stuff5 } else { stuff6 %>% stuff7 %>% stuff8 } %>% stuff9 %>% stuff10 ## 6 stuff[stuff1 %>% stuff2 %>% stuff3] %>% stuff4 %>% stuff5 ## 7 ggplot() + geom(lhs - rhs ) + geom() ## 8 { ggplot() + geom1(argument1, argument2 = ( stuff1 ) - stuff2) + geom2() + geom3() } ## 9 stuff + fun_call(parameter = argument1, fun_call((stuff1 - stuff2 + stuff3 ) / stuff4) ) / stuff5 fun_call(arg1 + arg2, arg3 + arg4) ## 10 fun_call(argument1 %>% stuff1, argument2 %>% stuff2, { stuff3 %>% stuff4 } %>% stuff5, argument3 ) ## 11 object1 <- object2 %>% fun_call1() %>% fun_call2() ## 12 object1 <- object2%>%fun_call1() %>% fun_call2()%>% fun_call3() ## 13 { (stuff) %>% fun_call() {stuff} %>% fun_call() } ## 14 { object + ( stuff ) %>% fun_call() object + { stuff } %>% fun_call() } ## 15 object <- stuff1 + stuff2 ~ stuff3 + stuff4 := stuff5 + stuff6 = stuff7 + stuff8 ## 16 object <- stuff1 + stuff2 + stuff3 + stuff4 ~ stuff5 + stuff6 + stuff7 + stuff8 := stuff9 + stuff10 + stuff11 + stuff12 = stuff13 + stuff14 + stuff15 + stuff16 ## 17 object %>% { stuff1 } %>% object[index] %>% {stuff2} %>% fun_call1() + if (condition1) stuff3 else stuff4 + if (condition2) { stuff5 } else if (condition3) { stuff6 } else { stuff7 } %>% (fun_call2()) %>% fun_call3() %>% fun_call3() ## 18 `object`$`elem` <- stuff1 + stuff2 `object`@`elem` <- stuff1 + stuff2 ## 19 { ## comment object1 <- object2 } ## 20 fun_call(stuff1 + stuff2 + stuff3 + (stuff4 + stuff5 + stuff6) + object[stuff7 + stuff8] + {stuff9 + stuff10}) ## 21 object %>% fun_call({ stuff1 }) %>% stuff2 ## 22 "string1" %>% 'string2' %>% `stuff1` %>% stuff2 ## 23 object[index] %>% fun_call1( argument1 )[index2] %>% fun_call2( argument2 )[[index3]] %>% stuff ## 24 fun_call(argument) <- hop ## 25 fun_call1(argument, fun_call2( stuff1 ) + stuff2) ## 26 object <- { stuff1 } %>% ( stuff2 ) ## 27 fun_call1(fun_call2(fun_call3( argument ))) %>% fun_call2() ## 28 fun_call(argument1 %>% stuff, argument2) ## 29 fun_call(stuff1 := (stuff2), argument) ## 30 fun_call1(fun_call2( fun_call3()) %>% stuff) ## 31 fun_call(object1 + object2 ~ object3 + object4 + object5 := object6 + object7, argument) ## 32 fun_call(object ~ ) ## 33 fun_call(object + ) ## 34 fun_call(object[index1]$element[index2][index3]@attribute + stuff) ## 35a fun_call(argument <- object) ## 35b fun_call(argument <<- object) ## 36 funcall(!stuff1 || stuff2) ### Comments ## 1 # Side comment ## 2 { ## Hanging comment 1 fun_call( { ## Hanging comment 2 } ) } ## 3 { ### Section comment } ## 4 fun_call( ## Comment argument ) ## 5 object %>% ## comment, ## comment stuff ## 6a object <- function() { stuff ## comment } ## 6b object <- function() { ## comment } ## 7 { fun_call(lhs + ### Comment rhs ) } ### Logical operators ## 1 stuff1 && stuff2 || stuff3 ## 2 (stuff1 && stuff2 || stuff3) ## 3 if (condition1 && condition2 || (condition3 && condition4) || (condition5 && condition6 && condition7) || condition8) { stuff } && condition8 || condition9 || condition10 ## 4 stuff1 == stuff2 || condition ## 5 (stuff1 == stuff2 || condition ) ## 6 (stuff1 != stuff2 || condition ) ## 7 object <- condition1 | condition2 | condition3 | condition4 ## 8 if (condition1 || object1 %op% object2 || condition3) { stuff } ## 9 any(condition1 | condition2) && all(condition3 & condition4) ### Specific situations and overrides ## 1 fun_call( ifelse(condition1, argument1, ifelse(condition2, argument2, ifelse)) ) ess/test/styles/RStudio-.R0000664000175000017500000002704112632537307014033 0ustar eddedd ### Function declarations ## 1 { fun <- function(argument1, argument2) { body } } ## 2 { function( argument1, argument2 ) { body } } ## 3 function(argument_fun(sub_argument1, sub_argument2), argument) {} ## 4 function(argument1, parameter = fun_call( sub_argument), argument2) {} ## 5 function() function() body ## 6a object <- function() { body } ## 6b object <- function() { body } ## 6c object = function() { body } ## 6d fun_call(argument) <- function() { body } ## 7 { object <- function() { body } } ## 8 { fun_call(parameter = function() { body }) } ## 9 { fun_call(parameter = function() { body }) } ## 10 fun_call( function() { stuff } ) ## 11 { fun_call1(fun_call2(argument, function() { stuff }) ) } ## 12 { fun_call1(argument, fun_call2(function() { stuff }) ) } ## 13 fun_call(object := function() { body }) ## 14 fun_call(argument, function(x) stuff ) ## 15a `object` <- function() { body } ## 15b "object" <- function() { body } ## 15c 'object' <- function() { body } ### Function calls ## 1 fun_call(argument1, argument2) ## 2 fun_call( argument1, argument2 ) ## 3 fun_call(parameter = ( stuff ), argument) ## 4 fun_call(parameter = fun_argument( argument1 ), argument2) ## 5 fun_call(parameter = fun_argument(argument1, argument2 ) , argument3) ## 6 `fun_call`(argument1, argument2) ## 6b `:=`(argument1, argument2) ## 7 `fun_call`( argument1, argument2 ) ## 7b `:=`( argument1, argument2 ) ## 8 fun_call(argument1 , argument2 , argument3, argument4, ( stuff1 ), argument5, ( stuff2 ) , argument6 ) ## 9 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 10 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 11 { fun_call1( fun_call2 (argument1, argument2, parameter = fun_call3( argument3, argument4 ), function(x) { body }, argument5, fun_call4( argument6 ), argument7 ), { stuff }, argument8 ) } ## 12 object <- fun_call( arg1, arg2 ) ## 13 fun_call1(fun_call2( argument )) ## 14 some_function <- fun_call1(fun_call2( argument )) ## 15 object[, fun_call( argument )] ## 16 fun_call1(argument1, fun_call2(fun_call3( argument2 )) ) ## 17 fun_call({ stuff1 stuff2 stuff3 }) ## 18 fun_call(argument1 %>% stuff, argument2) ## 19 fun_call(argument, ) ### Blocks ## 1 { function() { body } } ## 2 { fun_call({ stuff1 }, { stuff2 } ) } ## 3 fun_call({ stuff1 }, { stuff2 }) ## 4 fun_call( parameter1 = { stuff1 }, parameter2 = { stuff2 } ) ## 5 fun_call(parameter1 = { stuff1 }, { stuff2 }, parameter2 = { stuff3 }, { stuff4 }, parameter3 = stuff5 ~ stuff6 + stuff7, argument) ## 6 fun <- fun_call({ stuff1 }, { stuff2 }, { stuff3 } ) ## 7 fun <- fun_call({ stuff }, argument ) ## 8 fun_call(function(x) { body1 }, function(x) { body2 }) ## 9 fun_call( { stuff }, { stuff } ) ## 10 object <- fun_call({ stuff }, { stuff }) ## 11 object <- fun_call( { body } ) ## 12 fun_call1( fun_call2({ stuff } ) ) ## 13 { stuff1 { stuff2 } } ## 14 {{ stuff } } ## 15 ({ stuff }) ## 16 ( { stuff } ) ## 17 fun_call(argument, function(argument1, argument2) { body } ) ## 18 fun_call( argument, function(argument1, argument2) { body } ) ## 19 fun_call1( fun_call2(argument, function(x) { body }) ) ## 20 fun_call1({ object1 <- fun_call2( argument) object2 }) ## 21 fun_call(argument, function() { stuff } } ## 22 function_call() stuff ### Bracket indexing ## 1 object[ argument1, argument2 ] ## 2 object[argument1, argument2 ] ## 3 object[( argument1 )] ## 4 { object[ fun_call( body ), argument[ ( sub_argument ) ] ] } ## 5 { object[ argument1, argument2, by = argument3 ][ argument4, fun_call1(argument1, argument2) argument5 ][ argument6, fun_call2( argument1, argument2 ) ] } ### Control flow ## 1 { if (condition) { stuff1 } else { stuff2 } } ## 2 { if (condition) { stuff1 } else { stuff2 } } ## 3 { if (condition) { stuff1 } else { stuff2 } } ## 4 { if (condition) { stuff1 } else { stuff2 } } ## 5 { for (sequence) { stuff } } ## 6 { for (sequence) { stuff } } ## 7 if (condition) stuff ## 8 for (sequence) stuff ## 9 object <- if (condition) { stuff1 } else { stuff2 } ## 10 { object <- if (condition) stuff1 else stuff2 } ## 10 { object <- if (condition) fun_call( argument1, argument2 ) else stuff } ## 11 { fun_call(parameter = if (condition) stuff1 else stuff2 ) } ## 12 { if (condition1) { stuff1 } else if (condition2) stuff2 else if (condition3) { stuff3 } else if (condition4) stuff4 else stuff5 } ## 13 fun_call( argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 14 fun_call( argument, parameter = if (condition1) stuff1 else if (condition2) stuff3 else stuff2 ) ## 15 object <- fun_call(argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 16 object <- fun_call(argument, if (condition) stuff1 else if (condition2) stuff2 ) ## 17 while(condition) stuff ## 18 if (condition1) stuff1 else if (condition2) { stuff2 } ## 19 object <- if (condition) fun_call()[index] else stuff ## 20 funcall({ if (test1) stuff1 if (test2) stuff2 }) ## 21 fun_call(argument, function() { if (cond) object1 <- object2 else object3 <- object4 }) ## 22 if (cond1) if (cond2) if (cond3) stuff1 else if (cond4) stuff2 else if (cond5) stuff3 else stuff4 else if (cond6) stuff5 else if (cond7) stuff6 else stuff7 else if (cond8) stuff8 else if (cond9) stuff9 else stuff10 ## 23 if (cond1) if (cond2) for (sequence1) if (cond3) stuff1 else stuff2 else if (cond4) for (sequence2) stuff3 else if (cond5) fun_call( argument ) else stuff5 else stuff6 ## 24 object <- if(cond) stuff1 else stuff2 ## 25 if (condition) { (stuff) } ## 26 { if (condition1) stuff1 else if (condition2) { stuff2 } else if (condition3) stuff3 } ## 27 object <- if (condition) { stuff1 } else { stuff2 } ### Continuation lines ## 1 stuff1 %>% stuff2 %>% stuff3 ## 2 { stuff1 %>% stuff2 %>% stuff3 } %>% stuff4 %>% stuff5 ## 3 ( stuff1 %>% stuff2 %>% stuff3 ) %>% stuff4 %>% stuff5 ## 4 object[ stuff1 %>% stuff2 %>% stuff3 ] %>% stuff4 %>% stuff5 ## 5 stuff1 %>% stuff2 %>% if (condition) { stuff3 %>% stuff4 %>% stuff5 } else { stuff6 %>% stuff7 %>% stuff8 } %>% stuff9 %>% stuff10 ## 6 stuff[stuff1 %>% stuff2 %>% stuff3] %>% stuff4 %>% stuff5 ## 7 ggplot() + geom(lhs - rhs ) + geom() ## 8 { ggplot() + geom1(argument1, argument2 = ( stuff1 ) - stuff2) + geom2() + geom3() } ## 9 stuff + fun_call(parameter = argument1, fun_call((stuff1 - stuff2 + stuff3 ) / stuff4) ) / stuff5 fun_call(arg1 + arg2, arg3 + arg4) ## 10 fun_call(argument1 %>% stuff1, argument2 %>% stuff2, { stuff3 %>% stuff4 } %>% stuff5, argument3 ) ## 11 object1 <- object2 %>% fun_call1() %>% fun_call2() ## 12 object1 <- object2%>%fun_call1() %>% fun_call2()%>% fun_call3() ## 13 { (stuff) %>% fun_call() {stuff} %>% fun_call() } ## 14 { object + ( stuff ) %>% fun_call() object + { stuff } %>% fun_call() } ## 15 object <- stuff1 + stuff2 ~ stuff3 + stuff4 := stuff5 + stuff6 = stuff7 + stuff8 ## 16 object <- stuff1 + stuff2 + stuff3 + stuff4 ~ stuff5 + stuff6 + stuff7 + stuff8 := stuff9 + stuff10 + stuff11 + stuff12 = stuff13 + stuff14 + stuff15 + stuff16 ## 17 object %>% { stuff1 } %>% object[index] %>% {stuff2} %>% fun_call1() + if (condition1) stuff3 else stuff4 + if (condition2) { stuff5 } else if (condition3) { stuff6 } else { stuff7 } %>% (fun_call2()) %>% fun_call3() %>% fun_call3() ## 18 `object`$`elem` <- stuff1 + stuff2 `object`@`elem` <- stuff1 + stuff2 ## 19 { ## comment object1 <- object2 } ## 20 fun_call(stuff1 + stuff2 + stuff3 + (stuff4 + stuff5 + stuff6) + object[stuff7 + stuff8] + {stuff9 + stuff10}) ## 21 object %>% fun_call({ stuff1 }) %>% stuff2 ## 22 "string1" %>% 'string2' %>% `stuff1` %>% stuff2 ## 23 object[index] %>% fun_call1( argument1 )[index2] %>% fun_call2( argument2 )[[index3]] %>% stuff ## 24 fun_call(argument) <- hop ## 25 fun_call1(argument, fun_call2( stuff1 ) + stuff2) ## 26 object <- { stuff1 } %>% ( stuff2 ) ## 27 fun_call1(fun_call2(fun_call3( argument ))) %>% fun_call2() ## 28 fun_call(argument1 %>% stuff, argument2) ## 29 fun_call(stuff1 := (stuff2), argument) ## 30 fun_call1(fun_call2( fun_call3()) %>% stuff) ## 31 fun_call(object1 + object2 ~ object3 + object4 + object5 := object6 + object7, argument) ## 32 fun_call(object ~ ) ## 33 fun_call(object + ) ## 34 fun_call(object[index1]$element[index2][index3]@attribute + stuff) ## 35a fun_call(argument <- object) ## 35b fun_call(argument <<- object) ## 36 funcall(!stuff1 || stuff2) ### Comments ## 1 # Side comment ## 2 { ## Hanging comment 1 fun_call( { ## Hanging comment 2 } ) } ## 3 { ### Section comment } ## 4 fun_call( ## Comment argument ) ## 5 object %>% ## comment, ## comment stuff ## 6a object <- function() { stuff ## comment } ## 6b object <- function() { ## comment } ## 7 { fun_call(lhs + ### Comment rhs ) } ### Logical operators ## 1 stuff1 && stuff2 || stuff3 ## 2 (stuff1 && stuff2 || stuff3) ## 3 if (condition1 && condition2 || (condition3 && condition4) || (condition5 && condition6 && condition7) || condition8) { stuff } && condition8 || condition9 || condition10 ## 4 stuff1 == stuff2 || condition ## 5 (stuff1 == stuff2 || condition ) ## 6 (stuff1 != stuff2 || condition ) ## 7 object <- condition1 | condition2 | condition3 | condition4 ## 8 if (condition1 || object1 %op% object2 || condition3) { stuff } ## 9 any(condition1 | condition2) && all(condition3 & condition4) ### Specific situations and overrides ## 1 fun_call( ifelse(condition1, argument1, ifelse(condition2, argument2, ifelse)) ) ess/test/styles/RRR+.R0000664000175000017500000003665212632537307013115 0ustar eddedd ### Function declarations ## 1 { fun <- function(argument1, argument2) { body } } ## 2 { function( argument1, argument2 ) { body } } ## 3 function(argument_fun(sub_argument1, sub_argument2), argument) {} ## 4 function(argument1, parameter = fun_call( sub_argument), argument2) {} ## 5 function() function() body ## 6a object <- function() { body } ## 6b object <- function() { body } ## 6c object = function() { body } ## 6d fun_call(argument) <- function() { body } ## 7 { object <- function() { body } } ## 8 { fun_call(parameter = function() { body }) } ## 9 { fun_call(parameter = function() { body }) } ## 10 fun_call( function() { stuff } ) ## 11 { fun_call1(fun_call2(argument, function() { stuff }) ) } ## 12 { fun_call1(argument, fun_call2(function() { stuff }) ) } ## 13 fun_call(object := function() { body }) ## 14 fun_call(argument, function(x) stuff ) ## 15a `object` <- function() { body } ## 15b "object" <- function() { body } ## 15c 'object' <- function() { body } ### Function calls ## 1 fun_call(argument1, argument2) ## 2 fun_call( argument1, argument2 ) ## 3 fun_call(parameter = ( stuff ), argument) ## 4 fun_call(parameter = fun_argument( argument1 ), argument2) ## 5 fun_call(parameter = fun_argument(argument1, argument2 ) , argument3) ## 6 `fun_call`(argument1, argument2) ## 6b `:=`(argument1, argument2) ## 7 `fun_call`( argument1, argument2 ) ## 7b `:=`( argument1, argument2 ) ## 8 fun_call(argument1 , argument2 , argument3, argument4, ( stuff1 ), argument5, ( stuff2 ) , argument6 ) ## 9 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 10 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 11 { fun_call1( fun_call2 (argument1, argument2, parameter = fun_call3( argument3, argument4 ), function(x) { body }, argument5, fun_call4( argument6 ), argument7 ), { stuff }, argument8 ) } ## 12 object <- fun_call( arg1, arg2 ) ## 13 fun_call1(fun_call2( argument )) ## 14 some_function <- fun_call1(fun_call2( argument )) ## 15 object[, fun_call( argument )] ## 16 fun_call1(argument1, fun_call2(fun_call3( argument2 )) ) ## 17 fun_call({ stuff1 stuff2 stuff3 }) ## 18 fun_call(argument1 %>% stuff, argument2) ## 19 fun_call(argument, ) ### Blocks ## 1 { function() { body } } ## 2 { fun_call({ stuff1 }, { stuff2 } ) } ## 3 fun_call({ stuff1 }, { stuff2 }) ## 4 fun_call( parameter1 = { stuff1 }, parameter2 = { stuff2 } ) ## 5 fun_call(parameter1 = { stuff1 }, { stuff2 }, parameter2 = { stuff3 }, { stuff4 }, parameter3 = stuff5 ~ stuff6 + stuff7, argument) ## 6 fun <- fun_call({ stuff1 }, { stuff2 }, { stuff3 } ) ## 7 fun <- fun_call({ stuff }, argument ) ## 8 fun_call(function(x) { body1 }, function(x) { body2 }) ## 9 fun_call( { stuff }, { stuff } ) ## 10 object <- fun_call({ stuff }, { stuff }) ## 11 object <- fun_call( { body } ) ## 12 fun_call1( fun_call2({ stuff } ) ) ## 13 { stuff1 { stuff2 } } ## 14 {{ stuff } } ## 15 ({ stuff }) ## 16 ( { stuff } ) ## 17 fun_call(argument, function(argument1, argument2) { body } ) ## 18 fun_call( argument, function(argument1, argument2) { body } ) ## 19 fun_call1( fun_call2(argument, function(x) { body }) ) ## 20 fun_call1({ object1 <- fun_call2( argument) object2 }) ## 21 fun_call(argument, function() { stuff } } ## 22 function_call() stuff ### Bracket indexing ## 1 object[ argument1, argument2 ] ## 2 object[argument1, argument2 ] ## 3 object[( argument1 )] ## 4 { object[ fun_call( body ), argument[ ( sub_argument ) ] ] } ## 5 { object[ argument1, argument2, by = argument3 ][ argument4, fun_call1(argument1, argument2) argument5 ][ argument6, fun_call2( argument1, argument2 ) ] } ### Control flow ## 1 { if (condition) { stuff1 } else { stuff2 } } ## 2 { if (condition) { stuff1 } else { stuff2 } } ## 3 { if (condition) { stuff1 } else { stuff2 } } ## 4 { if (condition) { stuff1 } else { stuff2 } } ## 5 { for (sequence) { stuff } } ## 6 { for (sequence) { stuff } } ## 7 if (condition) stuff ## 8 for (sequence) stuff ## 9 object <- if (condition) { stuff1 } else { stuff2 } ## 10 { object <- if (condition) stuff1 else stuff2 } ## 10 { object <- if (condition) fun_call( argument1, argument2 ) else stuff } ## 11 { fun_call(parameter = if (condition) stuff1 else stuff2 ) } ## 12 { if (condition1) { stuff1 } else if (condition2) stuff2 else if (condition3) { stuff3 } else if (condition4) stuff4 else stuff5 } ## 13 fun_call( argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 14 fun_call( argument, parameter = if (condition1) stuff1 else if (condition2) stuff3 else stuff2 ) ## 15 object <- fun_call(argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 16 object <- fun_call(argument, if (condition) stuff1 else if (condition2) stuff2 ) ## 17 while(condition) stuff ## 18 if (condition1) stuff1 else if (condition2) { stuff2 } ## 19 object <- if (condition) fun_call()[index] else stuff ## 20 funcall({ if (test1) stuff1 if (test2) stuff2 }) ## 21 fun_call(argument, function() { if (cond) object1 <- object2 else object3 <- object4 }) ## 22 if (cond1) if (cond2) if (cond3) stuff1 else if (cond4) stuff2 else if (cond5) stuff3 else stuff4 else if (cond6) stuff5 else if (cond7) stuff6 else stuff7 else if (cond8) stuff8 else if (cond9) stuff9 else stuff10 ## 23 if (cond1) if (cond2) for (sequence1) if (cond3) stuff1 else stuff2 else if (cond4) for (sequence2) stuff3 else if (cond5) fun_call( argument ) else stuff5 else stuff6 ## 24 object <- if(cond) stuff1 else stuff2 ## 25 if (condition) { (stuff) } ## 26 { if (condition1) stuff1 else if (condition2) { stuff2 } else if (condition3) stuff3 } ## 27 object <- if (condition) { stuff1 } else { stuff2 } ### Continuation lines ## 1 stuff1 %>% stuff2 %>% stuff3 ## 2 { stuff1 %>% stuff2 %>% stuff3 } %>% stuff4 %>% stuff5 ## 3 ( stuff1 %>% stuff2 %>% stuff3 ) %>% stuff4 %>% stuff5 ## 4 object[ stuff1 %>% stuff2 %>% stuff3 ] %>% stuff4 %>% stuff5 ## 5 stuff1 %>% stuff2 %>% if (condition) { stuff3 %>% stuff4 %>% stuff5 } else { stuff6 %>% stuff7 %>% stuff8 } %>% stuff9 %>% stuff10 ## 6 stuff[stuff1 %>% stuff2 %>% stuff3] %>% stuff4 %>% stuff5 ## 7 ggplot() + geom(lhs - rhs ) + geom() ## 8 { ggplot() + geom1(argument1, argument2 = ( stuff1 ) - stuff2) + geom2() + geom3() } ## 9 stuff + fun_call(parameter = argument1, fun_call((stuff1 - stuff2 + stuff3 ) / stuff4) ) / stuff5 fun_call(arg1 + arg2, arg3 + arg4) ## 10 fun_call(argument1 %>% stuff1, argument2 %>% stuff2, { stuff3 %>% stuff4 } %>% stuff5, argument3 ) ## 11 object1 <- object2 %>% fun_call1() %>% fun_call2() ## 12 object1 <- object2%>%fun_call1() %>% fun_call2()%>% fun_call3() ## 13 { (stuff) %>% fun_call() {stuff} %>% fun_call() } ## 14 { object + ( stuff ) %>% fun_call() object + { stuff } %>% fun_call() } ## 15 object <- stuff1 + stuff2 ~ stuff3 + stuff4 := stuff5 + stuff6 = stuff7 + stuff8 ## 16 object <- stuff1 + stuff2 + stuff3 + stuff4 ~ stuff5 + stuff6 + stuff7 + stuff8 := stuff9 + stuff10 + stuff11 + stuff12 = stuff13 + stuff14 + stuff15 + stuff16 ## 17 object %>% { stuff1 } %>% object[index] %>% {stuff2} %>% fun_call1() + if (condition1) stuff3 else stuff4 + if (condition2) { stuff5 } else if (condition3) { stuff6 } else { stuff7 } %>% (fun_call2()) %>% fun_call3() %>% fun_call3() ## 18 `object`$`elem` <- stuff1 + stuff2 `object`@`elem` <- stuff1 + stuff2 ## 19 { ## comment object1 <- object2 } ## 20 fun_call(stuff1 + stuff2 + stuff3 + (stuff4 + stuff5 + stuff6) + object[stuff7 + stuff8] + {stuff9 + stuff10}) ## 21 object %>% fun_call({ stuff1 }) %>% stuff2 ## 22 "string1" %>% 'string2' %>% `stuff1` %>% stuff2 ## 23 object[index] %>% fun_call1( argument1 )[index2] %>% fun_call2( argument2 )[[index3]] %>% stuff ## 24 fun_call(argument) <- hop ## 25 fun_call1(argument, fun_call2( stuff1 ) + stuff2) ## 26 object <- { stuff1 } %>% ( stuff2 ) ## 27 fun_call1(fun_call2(fun_call3( argument ))) %>% fun_call2() ## 28 fun_call(argument1 %>% stuff, argument2) ## 29 fun_call(stuff1 := (stuff2), argument) ## 30 fun_call1(fun_call2( fun_call3()) %>% stuff) ## 31 fun_call(object1 + object2 ~ object3 + object4 + object5 := object6 + object7, argument) ## 32 fun_call(object ~ ) ## 33 fun_call(object + ) ## 34 fun_call(object[index1]$element[index2][index3]@attribute + stuff) ## 35a fun_call(argument <- object) ## 35b fun_call(argument <<- object) ## 36 funcall(!stuff1 || stuff2) ### Comments ## 1 # Side comment ## 2 { ## Hanging comment 1 fun_call( { ## Hanging comment 2 } ) } ## 3 { ### Section comment } ## 4 fun_call( ## Comment argument ) ## 5 object %>% ## comment, ## comment stuff ## 6a object <- function() { stuff ## comment } ## 6b object <- function() { ## comment } ## 7 { fun_call(lhs + ### Comment rhs ) } ### Logical operators ## 1 stuff1 && stuff2 || stuff3 ## 2 (stuff1 && stuff2 || stuff3) ## 3 if (condition1 && condition2 || (condition3 && condition4) || (condition5 && condition6 && condition7) || condition8) { stuff } && condition8 || condition9 || condition10 ## 4 stuff1 == stuff2 || condition ## 5 (stuff1 == stuff2 || condition ) ## 6 (stuff1 != stuff2 || condition ) ## 7 object <- condition1 | condition2 | condition3 | condition4 ## 8 if (condition1 || object1 %op% object2 || condition3) { stuff } ## 9 any(condition1 | condition2) && all(condition3 & condition4) ### Specific situations and overrides ## 1 fun_call( ifelse(condition1, argument1, ifelse(condition2, argument2, ifelse)) ) ess/test/styles/misc1.R0000664000175000017500000003750212632537307013404 0ustar eddedd ### Function declarations ## 1 { fun <- function(argument1, argument2) { body } } ## 2 { function( argument1, argument2 ) { body } } ## 3 function(argument_fun(sub_argument1, sub_argument2), argument) {} ## 4 function(argument1, parameter = fun_call( sub_argument), argument2) {} ## 5 function() function() body ## 6a object <- function() { body } ## 6b object <- function() { body } ## 6c object = function() { body } ## 6d fun_call(argument) <- function() { body } ## 7 { object <- function() { body } } ## 8 { fun_call(parameter = function() { body }) } ## 9 { fun_call(parameter = function() { body }) } ## 10 fun_call( function() { stuff } ) ## 11 { fun_call1(fun_call2(argument, function() { stuff }) ) } ## 12 { fun_call1(argument, fun_call2(function() { stuff }) ) } ## 13 fun_call(object := function() { body }) ## 14 fun_call(argument, function(x) stuff ) ## 15a `object` <- function() { body } ## 15b "object" <- function() { body } ## 15c 'object' <- function() { body } ### Function calls ## 1 fun_call(argument1, argument2) ## 2 fun_call( argument1, argument2 ) ## 3 fun_call(parameter = ( stuff ), argument) ## 4 fun_call(parameter = fun_argument( argument1 ), argument2) ## 5 fun_call(parameter = fun_argument(argument1, argument2 ) , argument3) ## 6 `fun_call`(argument1, argument2) ## 6b `:=`(argument1, argument2) ## 7 `fun_call`( argument1, argument2 ) ## 7b `:=`( argument1, argument2 ) ## 8 fun_call(argument1 , argument2 , argument3, argument4, ( stuff1 ), argument5, ( stuff2 ) , argument6 ) ## 9 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 10 fun_call(parameter = fun_argument( sub_argument ), argument ) ## 11 { fun_call1( fun_call2 (argument1, argument2, parameter = fun_call3( argument3, argument4 ), function(x) { body }, argument5, fun_call4( argument6 ), argument7 ), { stuff }, argument8 ) } ## 12 object <- fun_call( arg1, arg2 ) ## 13 fun_call1(fun_call2( argument )) ## 14 some_function <- fun_call1(fun_call2( argument )) ## 15 object[, fun_call( argument )] ## 16 fun_call1(argument1, fun_call2(fun_call3( argument2 )) ) ## 17 fun_call({ stuff1 stuff2 stuff3 }) ## 18 fun_call(argument1 %>% stuff, argument2) ## 19 fun_call(argument, ) ### Blocks ## 1 { function() { body } } ## 2 { fun_call({ stuff1 }, { stuff2 } ) } ## 3 fun_call({ stuff1 }, { stuff2 }) ## 4 fun_call( parameter1 = { stuff1 }, parameter2 = { stuff2 } ) ## 5 fun_call(parameter1 = { stuff1 }, { stuff2 }, parameter2 = { stuff3 }, { stuff4 }, parameter3 = stuff5 ~ stuff6 + stuff7, argument) ## 6 fun <- fun_call({ stuff1 }, { stuff2 }, { stuff3 } ) ## 7 fun <- fun_call({ stuff }, argument ) ## 8 fun_call(function(x) { body1 }, function(x) { body2 }) ## 9 fun_call( { stuff }, { stuff } ) ## 10 object <- fun_call({ stuff }, { stuff }) ## 11 object <- fun_call( { body } ) ## 12 fun_call1( fun_call2({ stuff } ) ) ## 13 { stuff1 { stuff2 } } ## 14 {{ stuff } } ## 15 ({ stuff }) ## 16 ( { stuff } ) ## 17 fun_call(argument, function(argument1, argument2) { body } ) ## 18 fun_call( argument, function(argument1, argument2) { body } ) ## 19 fun_call1( fun_call2(argument, function(x) { body }) ) ## 20 fun_call1({ object1 <- fun_call2( argument) object2 }) ## 21 fun_call(argument, function() { stuff } } ## 22 function_call() stuff ### Bracket indexing ## 1 object[ argument1, argument2 ] ## 2 object[argument1, argument2 ] ## 3 object[( argument1 )] ## 4 { object[ fun_call( body ), argument[ ( sub_argument ) ] ] } ## 5 { object[ argument1, argument2, by = argument3 ][ argument4, fun_call1(argument1, argument2) argument5 ][ argument6, fun_call2( argument1, argument2 ) ] } ### Control flow ## 1 { if (condition) { stuff1 } else { stuff2 } } ## 2 { if (condition) { stuff1 } else { stuff2 } } ## 3 { if (condition) { stuff1 } else { stuff2 } } ## 4 { if (condition) { stuff1 } else { stuff2 } } ## 5 { for (sequence) { stuff } } ## 6 { for (sequence) { stuff } } ## 7 if (condition) stuff ## 8 for (sequence) stuff ## 9 object <- if (condition) { stuff1 } else { stuff2 } ## 10 { object <- if (condition) stuff1 else stuff2 } ## 10 { object <- if (condition) fun_call( argument1, argument2 ) else stuff } ## 11 { fun_call(parameter = if (condition) stuff1 else stuff2 ) } ## 12 { if (condition1) { stuff1 } else if (condition2) stuff2 else if (condition3) { stuff3 } else if (condition4) stuff4 else stuff5 } ## 13 fun_call( argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 14 fun_call( argument, parameter = if (condition1) stuff1 else if (condition2) stuff3 else stuff2 ) ## 15 object <- fun_call(argument, parameter = if (condition1) { stuff1 } else if (condition2) { stuff3 } else { stuff2 } ) ## 16 object <- fun_call(argument, if (condition) stuff1 else if (condition2) stuff2 ) ## 17 while(condition) stuff ## 18 if (condition1) stuff1 else if (condition2) { stuff2 } ## 19 object <- if (condition) fun_call()[index] else stuff ## 20 funcall({ if (test1) stuff1 if (test2) stuff2 }) ## 21 fun_call(argument, function() { if (cond) object1 <- object2 else object3 <- object4 }) ## 22 if (cond1) if (cond2) if (cond3) stuff1 else if (cond4) stuff2 else if (cond5) stuff3 else stuff4 else if (cond6) stuff5 else if (cond7) stuff6 else stuff7 else if (cond8) stuff8 else if (cond9) stuff9 else stuff10 ## 23 if (cond1) if (cond2) for (sequence1) if (cond3) stuff1 else stuff2 else if (cond4) for (sequence2) stuff3 else if (cond5) fun_call( argument ) else stuff5 else stuff6 ## 24 object <- if(cond) stuff1 else stuff2 ## 25 if (condition) { (stuff) } ## 26 { if (condition1) stuff1 else if (condition2) { stuff2 } else if (condition3) stuff3 } ## 27 object <- if (condition) { stuff1 } else { stuff2 } ### Continuation lines ## 1 stuff1 %>% stuff2 %>% stuff3 ## 2 { stuff1 %>% stuff2 %>% stuff3 } %>% stuff4 %>% stuff5 ## 3 ( stuff1 %>% stuff2 %>% stuff3 ) %>% stuff4 %>% stuff5 ## 4 object[ stuff1 %>% stuff2 %>% stuff3 ] %>% stuff4 %>% stuff5 ## 5 stuff1 %>% stuff2 %>% if (condition) { stuff3 %>% stuff4 %>% stuff5 } else { stuff6 %>% stuff7 %>% stuff8 } %>% stuff9 %>% stuff10 ## 6 stuff[stuff1 %>% stuff2 %>% stuff3] %>% stuff4 %>% stuff5 ## 7 ggplot() + geom(lhs - rhs ) + geom() ## 8 { ggplot() + geom1(argument1, argument2 = ( stuff1 ) - stuff2) + geom2() + geom3() } ## 9 stuff + fun_call(parameter = argument1, fun_call((stuff1 - stuff2 + stuff3 ) / stuff4) ) / stuff5 fun_call(arg1 + arg2, arg3 + arg4) ## 10 fun_call(argument1 %>% stuff1, argument2 %>% stuff2, { stuff3 %>% stuff4 } %>% stuff5, argument3 ) ## 11 object1 <- object2 %>% fun_call1() %>% fun_call2() ## 12 object1 <- object2%>%fun_call1() %>% fun_call2()%>% fun_call3() ## 13 { (stuff) %>% fun_call() {stuff} %>% fun_call() } ## 14 { object + ( stuff ) %>% fun_call() object + { stuff } %>% fun_call() } ## 15 object <- stuff1 + stuff2 ~ stuff3 + stuff4 := stuff5 + stuff6 = stuff7 + stuff8 ## 16 object <- stuff1 + stuff2 + stuff3 + stuff4 ~ stuff5 + stuff6 + stuff7 + stuff8 := stuff9 + stuff10 + stuff11 + stuff12 = stuff13 + stuff14 + stuff15 + stuff16 ## 17 object %>% { stuff1 } %>% object[index] %>% {stuff2} %>% fun_call1() + if (condition1) stuff3 else stuff4 + if (condition2) { stuff5 } else if (condition3) { stuff6 } else { stuff7 } %>% (fun_call2()) %>% fun_call3() %>% fun_call3() ## 18 `object`$`elem` <- stuff1 + stuff2 `object`@`elem` <- stuff1 + stuff2 ## 19 { ## comment object1 <- object2 } ## 20 fun_call(stuff1 + stuff2 + stuff3 + (stuff4 + stuff5 + stuff6) + object[stuff7 + stuff8] + {stuff9 + stuff10}) ## 21 object %>% fun_call({ stuff1 }) %>% stuff2 ## 22 "string1" %>% 'string2' %>% `stuff1` %>% stuff2 ## 23 object[index] %>% fun_call1( argument1 )[index2] %>% fun_call2( argument2 )[[index3]] %>% stuff ## 24 fun_call(argument) <- hop ## 25 fun_call1(argument, fun_call2( stuff1 ) + stuff2) ## 26 object <- { stuff1 } %>% ( stuff2 ) ## 27 fun_call1(fun_call2(fun_call3( argument ))) %>% fun_call2() ## 28 fun_call(argument1 %>% stuff, argument2) ## 29 fun_call(stuff1 := (stuff2), argument) ## 30 fun_call1(fun_call2( fun_call3()) %>% stuff) ## 31 fun_call(object1 + object2 ~ object3 + object4 + object5 := object6 + object7, argument) ## 32 fun_call(object ~ ) ## 33 fun_call(object + ) ## 34 fun_call(object[index1]$element[index2][index3]@attribute + stuff) ## 35a fun_call(argument <- object) ## 35b fun_call(argument <<- object) ## 36 funcall(!stuff1 || stuff2) ### Comments ## 1 # Side comment ## 2 { ## Hanging comment 1 fun_call( { ## Hanging comment 2 } ) } ## 3 { ### Section comment } ## 4 fun_call( ## Comment argument ) ## 5 object %>% ## comment, ## comment stuff ## 6a object <- function() { stuff ## comment } ## 6b object <- function() { ## comment } ## 7 { fun_call(lhs + ### Comment rhs ) } ### Logical operators ## 1 stuff1 && stuff2 || stuff3 ## 2 (stuff1 && stuff2 || stuff3) ## 3 if (condition1 && condition2 || (condition3 && condition4) || (condition5 && condition6 && condition7) || condition8) { stuff } && condition8 || condition9 || condition10 ## 4 stuff1 == stuff2 || condition ## 5 (stuff1 == stuff2 || condition ) ## 6 (stuff1 != stuff2 || condition ) ## 7 object <- condition1 | condition2 | condition3 | condition4 ## 8 if (condition1 || object1 %op% object2 || condition3) { stuff } ## 9 any(condition1 | condition2) && all(condition3 & condition4) ### Specific situations and overrides ## 1 fun_call( ifelse(condition1, argument1, ifelse(condition2, argument2, ifelse)) ) ess/test/generate-indent-cases0000775000175000017500000000267712632537307015022 0ustar eddedd#!/usr/bin/emacs --script ;; (Re)generate files with test cases for indentation (let ((current-directory (file-name-directory load-file-name))) (setq ess-test-path (expand-file-name "." current-directory)) (setq ess-styles-path (expand-file-name "./styles/" current-directory)) (setq ess-root-path (expand-file-name "../lisp/" current-directory))) (add-to-list 'load-path ess-root-path) (add-to-list 'load-path ess-test-path) (require 'ess-site) (load (expand-file-name "ess-indentation-tests.el" ess-test-path) nil t) ;; The RRR file is taken as a model, so modify this file to add or ;; adjust test cases. (let ((ess-style-alist ess-test-style-alist) (RRR-file (expand-file-name "RRR.R" ess-styles-path))) ;; Regenerate indentation in RRR file (set-buffer (find-file-noselect RRR-file)) (setq ess-indent-with-fancy-comments t) (ess-set-style 'RRR) (indent-region (point-min) (point-max)) (save-buffer) (mapc (lambda (test-conf) (let* ((test-name (car test-conf)) (test-file (expand-file-name (concat (symbol-name test-name) ".R") ess-styles-path))) (set-buffer (find-file-noselect test-file)) (setq ess-indent-with-fancy-comments t) (ess-set-style test-name) (insert-file-contents-literally RRR-file nil nil nil 'replace) (indent-region (point-min) (point-max)) (save-buffer))) (assq-delete-all 'RRR ess-test-style-alist))) ess/test/ess-literate-tests.el0000664000175000017500000001640412632537307015003 0ustar eddedd (defvar ess-ltest-R-chunk-pattern "^###[ \t]*[0-9]+") (defvar ess-ltest-R-code-start-pattern "^##!") (defvar ess-ltest-R-code-cont-pattern "^##>") (defvar ess-ltest-R-code-pattern "^##[!>]") (defvar ess-ltest-R-section-pattern "^##### ") (defvar ess-ltest-R-mode-init '((R-mode))) (defun ess-ltest-R (&optional file) (when file (set-buffer (find-file-noselect file))) (let ((ess-ltest-chunk-pattern ess-ltest-R-chunk-pattern) (ess-ltest-code-cont-pattern ess-ltest-R-code-cont-pattern) (ess-ltest-code-pattern ess-ltest-R-code-pattern) (ess-ltest-section-pattern ess-ltest-R-section-pattern) (ess-ltest-mode-init ess-ltest-R-mode-init)) (ess-ltest-this-buffer)) (save-buffer)) (defun ess-ltest-this-buffer () (goto-char 1) (let ((undo-inhibit-record-point t)) (undo-boundary) (when (ess-ltest-search-chunk nil t) (while (looking-at ess-ltest-chunk-pattern) (ess-ltest-process-next-chunk))) (skip-chars-backward "\n") (delete-region (1+ (point)) (point-max)) (undo-boundary))) (defun ess-ltest-search-chunk (&optional n skip-section) (let ((next-chunk (save-excursion (if (re-search-forward ess-ltest-chunk-pattern nil t (or n 1)) (match-beginning 0) (point-max))))) (goto-char (if (and (not skip-section) (re-search-forward ess-ltest-section-pattern next-chunk t)) (match-beginning 0) next-chunk)))) (defun ess-ltest-process-next-chunk () (let* ((chunk-beg (point)) (chunk-end (progn (forward-line) (save-excursion (ess-ltest-search-chunk) (point-marker)))) (test-case (progn (skip-chars-forward " \t\n") (ess-ltest-process-case))) (test-case-state test-case)) (while (looking-at ess-ltest-code-pattern) (ess-ltest-process-next-subchunk)) (insert "\n") (when (looking-at ess-ltest-section-pattern) (insert "\n") (ess-ltest-search-chunk nil t)))) (defun ess-ltest-process-next-subchunk () (let* ((continuation (looking-at ess-ltest-code-cont-pattern)) (test-code (ess-ltest-process-code)) (test-result (ess-ltest- (if continuation test-case-state test-case) test-code ess-ltest-mode-init continuation)) (subchunk-end (save-excursion (if (re-search-forward ess-ltest-code-pattern chunk-end t) (match-beginning 0) chunk-end)))) (setq test-case-state test-result) (delete-region (point) subchunk-end) (insert (concat "\n" test-result "\n\n")))) (defun ess-ltest-process-case () (let ((case-start (progn (skip-chars-forward " \t\n") (goto-char (line-beginning-position)) (point))) (code-start (if (re-search-forward ess-ltest-code-pattern chunk-end t) (goto-char (match-beginning 0)) (error "No test code found"))) (case-end (progn (skip-chars-backward " \t\n") (point)))) (forward-char 1) (delete-region (point) code-start) (insert "\n") (buffer-substring-no-properties case-start case-end))) (defun ess-ltest-process-code () (let* ((test-start (point)) (test-end (if (re-search-forward "^$" chunk-end t) (1- (match-beginning 0)) (goto-char chunk-end))) (test-code (buffer-substring-no-properties test-start test-end))) ;; Remove comment prefix (while (string-match (concat (substring ess-ltest-code-pattern 1) "[ \t]?") test-code) (setq test-code (replace-match "" t t test-code))) ;; Parse elisp (setq test-code (concat "(" test-code ")")) (car (read-from-string test-code)))) ;; The following functions are borrowed from Lispy's testing ;; framework. The main difference is that they restore state when ;; `keep-state' is t. They also run `(kbd)' on strings. (defvar ess-ltest--state-buffer nil "Evaluation buffer of previous test chunk.") (defmacro ess-ltest (init &rest body) (apply 'ess-ltest- `(,init (,@body)))) (defun ess-ltest- (init body mode-init &optional keep-state) (unless keep-state (and ess-ltest--state-buffer (buffer-name ess-ltest--state-buffer) (kill-buffer ess-ltest--state-buffer)) (setq ess-ltest--state-buffer (generate-new-buffer " *temp*"))) (save-window-excursion (switch-to-buffer ess-ltest--state-buffer) (if keep-state (delete-region (point-min) (point-max)) (transient-mark-mode 1) (mapc 'eval mode-init)) (insert init) (goto-char (point-min)) (when (search-forward "├Ч" nil t) (backward-delete-char 1) (set-mark (point))) (goto-char (point-max)) (search-backward "┬╢") (delete-char 1) ;; Reset Emacs state (unless keep-state (setq last-command nil) (setq current-prefix-arg nil)) (mapcar (lambda (x) (cond ((equal x '(kbd "C-u")) (setq current-prefix-arg (list 4))) ((stringp x) (if (string= x "C-u") (setq current-prefix-arg (list 4)) (ess-ltest-unalias (kbd x)))) ((and (listp x) (eq (car x) 'kbd)) (ess-ltest-unalias x)) (t (eval x)))) body) (insert "┬╢") (when (region-active-p) (exchange-point-and-mark) (insert "├Ч")) (buffer-substring-no-properties (point-min) (point-max)))) (defun ess-ltest-decode-keysequence (str) "Decode STR from e.g. \"23ab5c\" to '(23 \"a\" \"b\" 5 \"c\")" (let ((table (copy-seq (syntax-table)))) (loop for i from ?0 to ?9 do (modify-syntax-entry i "." table)) (loop for i from ? to ? do (modify-syntax-entry i "w" table)) (loop for i in '(? ?\( ?\) ?\[ ?\] ?{ ?} ?\" ?\' ?\ ) do (modify-syntax-entry i "w" table)) (cl-mapcan (lambda (x) (let ((y (ignore-errors (read x)))) (if (numberp y) (list y) (mapcar #'string x)))) (with-syntax-table table (split-string str "\\b" t))))) (defun ess-ltest-unalias (seq) "Emulate pressing keys decoded from SEQ." (if (vectorp seq) (ess-ltest--unalias-key seq) (let ((lkeys (ess-ltest-decode-keysequence seq)) key) (while (setq key (pop lkeys)) (if (numberp key) (let ((current-prefix-arg (list key))) (when lkeys (ess-ltest--unalias-key (pop lkeys)))) (ess-ltest--unalias-key key)))))) (defun ess-ltest--unalias-key (key) "Call command that corresponds to KEY. Insert KEY if there's no command." (let ((cmd (key-binding key))) (if (eq cmd 'self-insert-command) (insert key) (setq last-command-event (aref key 0)) (call-interactively cmd) (setq last-command cmd)))) ess/test/ess-indentation-tests.el0000664000175000017500000001012612632537307015501 0ustar eddedd;; ess-tests.el --- Tests for ESS ;; ;; ;; Filename: ess-tests.el ;; Created: 07-05-2015 (ESS 15.09) ;; Keywords: tests, indentation ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; This file is *NOT* part of GNU Emacs. ;; This file is part of ESS ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, or ;; (at your option) any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; ;; To run these tests: ;; All tests: M-x ert t ;; ;; To apply styles for manual testing: ;; M-: (let ((ess-style-alist ess-test-style-alist)) ;; (ess-set-style 'misc1)) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Code: (require 'ert) ;;; Indentation tests (defvar ess-test-style-alist `((RRR ,@(cdr (assq 'RRR ess-style-alist))) (RRR+ ,@(cdr (assq 'RRR+ ess-style-alist))) (RStudio- ,@(cdr (assq 'RStudio- ess-style-alist))) (C++ ,@(cdr (assq 'C++ ess-style-alist))) (misc1 (ess-indent-offset . 3) (ess-offset-block . open-delim) (ess-offset-arguments . (prev-call 5)) (ess-offset-arguments-newline . open-delim) (ess-offset-continued . cascade) (ess-align-nested-calls . ("ifelse")) (ess-align-arguments-in-calls . nil) (ess-align-continuations-in-calls . nil) (ess-align-blocks . (fun-decl bare-blocks)) (ess-indent-from-lhs . nil) (ess-indent-from-chain-start . nil) (ess-indent-with-fancy-comments . t)))) (defun ess-test-get-pos-from-undo-elt (e) "If E represents an edit, return a position value in E, the position where the edit took place. Return nil if E represents no real change. \nE is an entry in the buffer-undo-list." ;; stolen from goto-chg.el (cond ;; ((numberp e) e) ; num==changed position ;; ((atom e) nil) ; nil==command boundary ((numberp (car e)) (cdr e)) ; (beg . end)==insertion ((stringp (car e)) (abs (cdr e))) ; (string . pos)==deletion ;; ((null (car e)) (nthcdr 4 e)) ; (nil ...)==text property change ;; ((atom (car e)) nil) ; (t ...)==file modification time (t nil))) ; (marker ...)==marker moved (defun not-change-on-indent (buffer) "Return t if BUFFER wasn't modified on indent." (with-current-buffer buffer (setq buffer-undo-list nil) (indent-region (point-min) (point-max)) (not (buffer-modified-p buffer)))) (defun ess-test-explain-change-on-indent (buffer) "Explainer function for `not-change-on-indent'." (when (buffer-modified-p buffer) (with-current-buffer buffer (let ((bul buffer-undo-list) (change-pos (point-min))) (while (and bul (null (setq change-pos (ess-test-get-pos-from-undo-elt (car bul))))) (pop bul)) (let ((diff-file (concat (buffer-name) ".diff"))) (diff-buffer-with-file buffer) (with-current-buffer "*Diff*" (write-region (point-min) (point-max) diff-file)) `(,(buffer-name buffer) was modified on line ,(count-lines 1 change-pos) (diff was writen to ,diff-file))))))) (put 'not-change-on-indent 'ert-explainer 'ess-test-explain-change-on-indent) (defun ess-test-R-indentation (file style) (let ((ess-style-alist ess-test-style-alist) (buff (find-file-noselect file t t))) (with-current-buffer buff (R-mode) (ess-set-style style) (set-buffer-modified-p nil) (should (not-change-on-indent buff))))) (ert-deftest test-ess-R-indentation-RRR () (ess-test-R-indentation "styles/RRR.R" 'RRR)) (ert-deftest test-ess-R-indentation-misc1 () (ess-test-R-indentation "styles/misc1.R" 'misc1)) ess/test/Makefile0000664000175000017500000000026312632537307012354 0ustar eddeddEMACS=/usr/bin/emacs cases: indent-cases literate-cases indent-cases: ${EMACS} -Q --script generate-indent-cases literate-cases: ${EMACS} -Q --script generate-literate-cases ess/.gitignore0000664000175000017500000000055012577152666011735 0ustar eddedd*~ *.orig *# *.info doc/ess.* doc/info/ess.info doc/readme.* doc/refcard/refcard.* *history *NEWS *VERSION *REVISION *BACKUP* *REMOTE* *LOCAL* *BASE* lisp/*.elc doc/html/*.html README ANNOUNCE MM-MISC Mail-head RPM*.spec *SVN* ess-[1-9]*.[0-9][0-9] ess-[1-9]*.[0-9][0-9][-.]??? ess-[1-9]*.[0-9][0-9]-[0-9] ess-[1-9]*.[0-9][0-9]-[0-9][-.]??? lisp/julia-mode.el ess/doc/0000775000175000017500000000000012632537307010501 5ustar eddeddess/doc/ess-demo.jpg0000664000175000017500000017564512423756516012744 0ustar eddedd ╪ рJFIF ─  ─  ─╡}!1AQa"q2БСб#B▒┴R╤Ё$3brВ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийк▓│┤╡╢╖╕╣║┬├─┼╞╟╚╔╩╥╙╘╒╓╫╪┘┌стуфхцчшщъёЄєЇїЎў°∙· ─╡w!1AQaq"2БBСб▒┴ #3RЁbr╤ $4с%ё&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийк▓│┤╡╢╖╕╣║┬├─┼╞╟╚╔╩╥╙╘╒╓╫╪┘┌туфхцчшщъЄєЇїЎў°∙· █C   (1#%(:3=<9387@H\N@DWE78PmQW_bghg>Mqypdx\egc █C//cB8Bcccccccccccccccccccccccccccccccccccccccccccccccccc └' ┌ ?█╓uж╥юб╖О╓KЗЫ;5╔рx№kHCЩ\ECт;Ё№HяN}"╧Єб┴wC╘л?НM│ьЯOЪ'■ыоыZ╟═│LЫС ┬}№·?щ■5SРs№'╨ ╧г■ЯуG╒&┴  Ї?єш з°╥·д├ШVё▄iН╓R ММБ╚№ш·д║0ЯЁЯC >П·Н?кL9Г■шч╤ OёгъУ` Д·∙Ї╙№h·д├Ш?с>З■}Ї >й0ц°Oб ЯG№З°╤їIЗ0┬}№·?щ■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■C№h·д├ШO°Oб ЯG¤?╞ПкL9Е Д·∙Ї╚НTШs№'╨ ╧г■C№h·д├Ш?с>З■}Ї >й0ц°Oб ЯG¤?╞ПкL9Г■шч╤ !■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■ЯуG╒&┴  Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЯC >П·НTШs   Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЯC >П·НTШs   Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЮ├ >П·НTШs   Ї?єш з°╤їIЗ0┬}№·?ф?╞ПкL9Д Д·∙Ї╙№h·д├Ш_°Oб ЯG№З°╤їIЗ0┬}№·?ф?╞ПкL9Г■шч╤ OёгъУ` Д·∙Ї╙№h·д├Ш?с>З■}ЄуG╒&┴  Ї?єш з°╤їIЗ0┬}№·?щ■4}Ra╠ЁЯC >П∙ёгъУ` Д·∙Ї╚НTШs   Ї?єш з°╤їIЗ0┐ЁЯC >П∙ёгъУ` Д·∙Ї╚НTШs№'╨ ╧г■ЯуG╒&┴  Ї?єш з°╤їIЗ0┬}№·?ф?╞ПкL9Д Д·∙Ї╙№h·д├Ш_°Oб ЯG№З°╤їIЗ0┬}№·?ф?╞ПкL9Д Д·∙Ї╙№h·д├Ш_°Oб ЯG¤?╞ПкL9Г■шч╤ !■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■ЯуG╒&┴  Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЯC >П·НTШs   Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЯC >П·НTШs   Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0┬}№·?щ■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■C№h·д├ШO°Oб ЯG¤?╞ПкL9Е Д·∙Ї╚НTШs№'╨ ╧г■C№h·д├Ш?с>З■}Ї >й0ц°Oб ЯG¤?╞ПкL9Г■шч╤ !■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■ЯуG╒&┴  Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0ЯЁЯC >П·НTШs   Ї?єш Р >й0ц°Oб ЯG№З°╤їIЗ0┬}№·?щ■4}Ra╠ЁЯC >П·НTШs№'╨ ╧г■C№h·д├ШO°Oa ЯG¤?╞ПкL9Е Д·∙Ї╙№h·д├Ш?с>З■}ЄуG╒&┬┬}№·?щ■4}Ra╠/№'╨ ╧г■ЯуG╒&┴  Ї?єш Р >й0ц°Oб ЯG¤?╞ПкL9Г■шч╤ OёгъУ` Д·∙Ї╚НTШs№'╨ ╧г■C№h·д├ШO°Oб ЯG¤?╞ПкL9Е Д·∙Ї╚НTШs№'╨ ╧г■C№h·д├ШO°Oб ЯG¤?╞ПкL9Е Д·∙Ї╚НTШs№'╨ ╧г■C№h·д├ШO°Oa ЯG¤?╞ПкL9Е Д·∙Ї╙№h·д├Ш?с>З■}ЄуG╒&┬┬}№·?щ■4}Ra╠/№'╨ ╧г■C№h·д├Ш?с>З■}ЄуG╒&┴  Ї?єш з°╤їIЗ0┬}№·?щ■4}Ra╠ЁЯC >П∙ёгъУ` Д·∙Ї╙№h·д├ШO°Oa ЯG¤?╞ПкL9Й!ё╕ЮEО╪р('їдЁ▓JьjE╙т C■А╖_ў╟ ^▒T╒╖ ёщФ┼¤Пsц▀╖`╬=z╙Ўk╕]ИжA■5KMl■}W■x/¤№_ёзїЪbх°Eї_∙р┐ўё╞Пм╙P Д_U Ю  №h·═0х°Eї\и_√ьQїЪa╩'№#п№Ё_√°┐уG╓iЗ(┐ЁЛъ┐є┴ят НYжб ╛л <■■/°╤їЪa╩ЁЛъ┐є┴ят НYжб ╛л╧юП·h(·═0х°Eї_∙р┐ўё╞Пм╙P Д_U Ю  №h·═0х°Eї_∙р┐ўё╞Пм╙P ДcU Ю  Yжв┬1кчB ▀bПм╙Qс╒чВ ▀┴G╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ(┬/к ╧ ┐Л■4}fШrЗ№"·п№Ё_√°┐уG╓iЗ)-╢Бм┌╬│CSРKй■╡пNJ├Q/=пИдb╧mj╠Икd■5╚гOйdи╛'ОvШG fИ─rTН╜zfОZ]─W:°√Я¤ЁФr╙╦kт5╛[с_hP@9\r0{╒пdгa°J│Э▒є■╨ Еc#M?[║╘мц╜Н6┴&ьл#=¤Е5ьрЫ@wЪ№Г■║I б╡s1ЧшаА (аА (аА1n ух╛Г∙S╨ ЙШ╔й┤[юФ*йY∙{їЇщK@*CпA ╘╦;╚╚─y@РNsУFАmгЗ@ыЭм23EРuIdБ\*╢ь∙цр z]]}Ъ▌вМJЄ,L∙'Ръz~ФмАnЩ|╫% AПqv■ўzQ`4h░vЄ╚b┤║єdf╕e<ЭАz ,▀┌[э╝╪рУ$хє рЇ4h-їX^▄╚Л;╞ЯyЫёЮХ zъ▒4i'Х0WR╦Х  ыю(╨ ▒╢°╒Ё╦╕g ╘QаuЙфЖlу╠ЩQ╢}т==ш╨Y]ЖHтa&ЎAnNуцўч∙╤а6в$Йо@СaI;{.└╟<√Я╥НЦ▀W╖╣ФG╔Т█GLg· ▓h╨ 6ЧIvЕ╤]@■Ё╞~Фh¤h╨ °┤БеЦyх$кАч<УБ·Ъ4═йFЫ╒гЫt@┤А╩А'о:0щFАGeймёй)#yО√ Пс▄@ъ}(╨ *42х╦ъ┬2хPFН√Рp fы∙Qаna┤ўsАsхc╧зуFА&Я+ЩМsэ▄╩фїщЄч╖╜бFАc\ъrE °█1h▌ХPХ^■4h╖║┤H'╖И┐ЮГо8╧╫╨╤аb╘SЄеA#2л0b3ш}НnН(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨Н(╨ЮВ ZQd0г@ zR╨Б:/№ГW■║K гА/P@P@P@b▐╟╦}Єа ╔мп'9uєщ╙∙ЪаЪ-╝r∙▒<▒╦┘╒ЖW╫да*ЕPpMAuj. 0ЦHЭ3ЖММєїА#ЯOI╒C═0`Е й║Юаё№иm,"┤l─╧МcМЮ(╒SM:4ddнdИС┤cе2╙LЄmLr╧#▒╬└╪3ЯЧ п@ ПGВ8№╡Т_,¤фуїтА&УNЕ╥5 "∙hQHnpqЬ·Їf(╓Ц4╬cУЪОю╒.уErъQ╖ЖBt4╙б+ЧЧ)Ь╕l3gУЯй·PЭoй╢├Ш█я▌x №Е:;5WGyeСРхK░уВужА▓└─Жw'л9╔а ▓{POmРЫv 9ф`фcёа чLНРцI ▒>c2у`ё╙PЧF1СcНЛ├ё╫#∙╨ь╨Yм№█С:╧4M┤)WOp}M/┘O┌╝я6R3─dНгЇ═Ўq┴)Р<О█v.Ў╬╒ыБ°·╨Ь╨cgEf А *ЪА8эE┤╞ёЭк┘lK╒2 Жe%s│╕╟f А *ЪА&`PБЮФ┤bА:P!hPFh└Д°PтА╥АцА s@PЮq@}ш═╜P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@╔ўияКЖ■FО0Pу-¤(З┌f■ ш(╨?фWЛ¤╫ ╨ЪА-шЄ O·щ'■Мj┐@P@P@J/°∙Ы■№иjгkт ЫЧ╢Йдєcmм уЯЁа ┤н^╫WКI,┘Щc}Д░╟4~А+▄^Cn┴]╛fсT ф·S▒.B├4МеМF╜WЬЬQ`Lz╧цЛТn─ФК ╜╝К╞╒ю'$FШ╬O'╓А1ЗМЇcq4╕█╝■щ╕┼Ouт}2╥ЁZ╦+∙еиyg∙Pл]b╩ъ╞[╚ф"sцдm╟_пс@уё^ФюК%p$`и┼ ==ш[┐iЎ7▀d║СгРI╪H└ээ@╙╞KлЦN╚ЦrW╓А■║аЪB╬2╕МЄ9чЇа (5[KН,ъP╦║╫k6Єдp Мg▒а ZЧўZ;▌O!\ЦТ%nDj~ш╪а ╛ЯSmkS╡╘оVfГ╩╞┼┌Г*OЄа ▒╣┐╒b╙-юх│─сдМ|╟ц ╙У·Pш7╫-=юЭx╞IlX/ЬH╦й╔R}ё@ ж^LЪ╓гз]╚]РЙр-╘╞▌zvК┌аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХM@ЯИзТ╦PYtЛи═юLъ╬ mА¤7zPYgk ЭдvЁ&╚у]аg4=TЦ┬&Р╦шд■Єgъ:S!╞юурYК▓\Дq╨▀ъ(C┼╝фC>╗E!┘╨2╢а╫ifэar\ mY yчщ@~▓╓t╦h,/-эV╓0┘ur\ТIщ╙╜NЎГx┴5&═`0Г╗цї╬>╝}(Х╛Е}q│ ·┼Wо$Нгb┼HщСщ└а ┌▀─7P╢ЯsТ[2yO:3d╞bA4пжыj╓r┘┌┌╔ocЯ+═РхЄ_бzЎZў@hZ d╝Ш22;Fsы╥АЪ~б  жащМZ∙2А▄Жфё@ гi6■■╩╝ нх║Н╖}цc¤EKсKЦЯDКUYнЗТё tп>ЇЯз┌xЖ nцЎ[K0╖f?3lзх 6ё@zеЭьwСъ:\qKuх∙Т╢жsЯоЭ.Лз\[Ms{z╤Ы╗ж╓<эPМї·╨m-ы─┌ХЎ0Рк┌)Ж╟'ёКш(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА#УяP'▀_S R┐я C@┤.Б "╝_ю┐■Д╘oC РZ╫I?ЇcP·(аА (аА (а Q╟╠▀Ёх@PsвiL┼ЫL│f<Т`BOщ@╟P@╧Ф 9E5S;UWq▄p1Уы@аА (а$▒╚╬иъ╠З ┤ї┴Їа╨@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@Pr}ъD√тА+ъъW¤ шh6А%╨?фWЛ¤╫ ╨ЪА-шЄ O·щ'■Мj┐@P@P@J/°∙Ы■№иj└╘oїM;[ЗэQ&Ы1bЛ,А/я╘КВц[iўR▌Aц│Г&!с##$ЯеK-Ўн.еж[Y▌└|█tЦ|╟╘wp{╪{PP:u═5╒] ╕─P?сдXїН}UBп┌W  eIмxЕb╘ц┌∙Z|еI1є&1Єуё╨╓Зsк╝╕╘фЕ╝ш╓H╓5╞└wqя╨Pса 7WО&ёпЦ[■ZI┬Кv3rшI -nТI╜чРМу=}Е%aЙ{1` М├'ё┼R}Л┬Сb0 д0В s┌4kЛu╡T ╗a БўMV╒uiuR;)ну╖│Н%╦жHrG╛N~Шаi║╢┤/Ї╞┐xM╛г┐dh╝а цА/jо╧тЭРА╠╟╚@FE>Є]V-v8┼╘1X:o∙УУВ\·є╟у@ ╨юї+▌V¤жЪ7░ЖVК0#┴,пp9┐@zц╡wa:[╪X5╘е нЬЕ:єыэ@hЪе╞кfХн `╔wъ¤wqьEkP'Йе╒-mE╓ЭЩ9а лэ=/е╡wЮx═┤вP"}б╚ь▐вА%╝╖kи|┤╣Ъ▄фЁС╗щ╚"А3l№<╢W2╧е}║f▀ -у№Ф┼Ё┼╕╖┐ЕооЭoОe▄╦┴ї/єа v·J█▄[J╖W╚Л╩┌┼pуЬnу╢{bЛ═ qТ┬У)Y0=Н0▓c-эЕ╣`ОхOEcР>ФБ+╨0аOЪМHёЦoLe}╞{╨4^▄╧qли,╙А$m╤№╪щ№b]nпз7П╢┼хHАо╨1АG╧^¤шс╦tM< лмщфШ[+Т8?/L qКЎ$╘4ўЫS░┐ЛэYБ?0`Їв┴tc°┬y.╓;8┤¤M▐)№ыxr╕┴р7ущ@^чCгF"╥нWlИ|е%epp3╗▀╓А.╨cЬўа┼Эмi+л┬!Цът┐Й"*Є9ж(; 4√╔n!╜║"g.ё1]ДЯ`╝~b R5KЛ╖%$8?tdЯ╘╨┌(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХM@└а8а%╡ гЫ▓╒$║МтIRE√╚XхsЯЁнW<╣{HYє=|╬O─Ъ╛е│4pъ7qа ЕIШ║;f▓ЦчйДm╤MТ°?U╘n|Mg╞бu,l[(є3ЄЮ─╥:TаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (9>ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5p╛!ПJ╘u╦Ия 6SC┤$С│6T√╕╟уЪВ,&Ё*┼s*т╢ ╔[ ╖Ї═hAЭб▄ш76ЕbЦ°3o'zХ╣╟╠GJ~бХ.╜x╛# v¤Ь▒eqъ╕╔Ўа ┤╜*╙V╤oмт_Їp▐CF+rF1╬yа ═7K╙ї)ьЇй,╠╡2}а∙нЄ¤p{ЬЇа╫ЫJ╒їЛию─Vs[7Чц═+f\z(щ@Ж Ik{o ЕТ9Є;p@№{╥Ю~>№Ц$П─У∙╝Б|╝ў╟\U¤гПЦ^╔[╠ЫVЛI:ЭйMЗR*|└╬@#╩=OA╞;V2°П^ПЁ╒И4 D╒№=%╜╗}╖21-Є░╬▄ЇыH╘_░┘ы│XiС[э{Hу7N╥6/╩╤П|Ъыu=R╙C▓О[ЭтИ╫bЦэ╟Єа r▄E │\J┴"T.XЎ╬hС╙5э*/j╙╜ьK л╟< sКпл╪щўЪ╫ИрЮuЦ1╕ОDcЮn?:еХЭ╝z▌аu╪У╧p─Ж8ф`Ь ЇкЗ─rу?В■EЭ?Э{Q`r╕ЛС■щньсйе\ц_▄╩Чщщ╨P╦SА&Й$РA┼=UQBкЕP0PRFС"Ev√╠~жА-Хмя╛khdoW@MT┐▓▐ ~ёP}*т╥▄у┼RХEdc▄hЧ^┴tк╔$Y∙БьyкцW9i╨л╕█sаВ╬ИЄAФ. ·c5Ы╒ЮХ%╦ ^YLС─аZ█L╟чgЛ МtтСбOA╥/Ї█╗Щnо ЩnеmЙЖ▐─~ЬP╘░┼2ЕЦ4СA╬Aн2eH┴R8┼A¤Эc╧·┐?Ї╔┬А$6╨y 1ЧРmv*2├╨·╨{╦8Ъ╙dPG╣?╒Ааm·zUE┘Ш╫З4lМ+={Ec░╔#c|З╢3О■ЖнI\рЭ │▓hц|CсЭbяVЦk{t `Ж_Oнg-Y▀ЗГзIEюKсO ъЎ>"╡╣║▓xсB█Ш▓ёЄЯCH╪Ї▒@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@Pr}ъD√тА+jDЧ° еgtа t∙т vO¤ и▐З  ┤ оТш╞а ЇP@P@P@в ПЩ┐р?╩А&а ╟J(аА (аА P+`аa@P@аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|Pn│mupT┴|╢╚ ╚1лn8ўа ├ж_ЮЪ▄°Яу@:,~Н_8▐m█ЯШЎа Z№В╙■║I гА/╨@P@P@RЛ■>f А *ЪА'(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|PM\3ZРМU╖p└tтА9╜2and7ўq╔8UD╞}╧А6Ї∙" u Ї&а Z№В╙■║I гА/╨@P@P@f┤┬хb3Э╡pП3▒ХJОNаа¤╙Z{n╟jпў(Ў,=╗5eСwFбЖqРAеьЇ╕¤╝пk:Ю|┐╓Пd┌]Г√Pй·╙Ў"u╪Я┌г√Ф{·├kЧ(▐9+╗Р>Ф{!√v/Ўи■х╚_Xb jПюQьCы jk╕╩├╒NhЎCЎЄB jПюQьEэ╪┐┌л¤├G▒aїЖ┌г√ЖПb├ы ?╡Gў(Ў#Ўь?╡Gў(Ў!э╪jПюQьC█▒?╡Gў(Ў"Ўь_эQ¤╩=Лм ¤к?╣G▒n├√TrПbXb jПюQьGэ╪jПюQьC█Й¤к?╣G▒aэ╪╤нBfЄrЮgўw ■T╜ЦалIлО■╒▄зьX{v/Ўк p╤ьX{v┌г√ЖПb┼їЖ┌г√Ф{ЎьOэQ¤╩=И*ь?╡Gў(ЎAэ╪┐┌л¤├G▒cЎь?╡Gў ╚=╗эQ¤╩=И{v┌г√Ф{Ўь?╡Gў(Ў!э╪jПюQьC█░■╒▄г╪З╖a¤к?╣G▒n├√TrПb▌ЗЎи■х─=╗эQ¤╩=И{v┌г√Ф{Ўь?╡Gў(Ў!э╪Я┌г√Ф{ЎьF╓#RmR▌lfЧ▓н!▀┌|л4{!{ivj` ╦3G▓╖}C√O■ЩЪ&┌]Д:Ю:╞:+о╪ P∙g·╙Ў"ЎьП√n4E╣<├№;Жя╩Пd┌] ┤╟ў(tZZA¤ж3НЗ4{u┌▄Й5╚FНYEъб┴#Ёеь╡░¤┤╣n?√TrЯ▒bЎь_эQ¤╩=И{vD┌ь НЪ0ч°KА*^═ VУW%:Ю·г∙╤ьЕэ╪j№Я▒o`u┘╫!ИrЮa■ уwпJ=О╢╡Чaял╞Ш▐фрdу'╙ыK╪▒*Єb jПюSЎB·├√Tp╤ьCы ?╡W√ЖПb├ы ?╡Gў(Ў,>░└ъГ■y╨и▌┌уЎэ+░■╘▄г╪░Ўэь2=f)wy{_i┴┌└р╤ьЗэд╖¤к?╣G▒b·├эQ¤╩=Лn┌г┤fПb─ё ?┤∙┴М■t{"╜┤н{╒6МШЁ>┤╜РХivЪ─r(h└u=╒│№й√ Ўэn6MnКмЕЯЕ ╪&Пd╗шЙ?╡Є╧>Ї{╗LOэQ¤╩=Лn/Ўи■сг╪░Ўс¤з╞LgZ=И}`?╡№є4{ ЎэnD┌ь (НЪ5s╤Y└?Х/f┌]ў╓#Н ╕ гйcБ∙╤ьГ█╦аРыQLЫу*у╒X=ХЎZKt;√Tp╙Ў,=╗√Tp╤ьX{p■╒_ю=Л╓jПюQьX¤╗эQ¤├G▒aїЖ┌г√ЖПb├ы ?╡Gў(Ў,=╕jпў ┼Лы ?╡W√ЖПb├ы ?╡Gў ┼З╓jПю=Лм0■╒▄г╪▒мCэQ¤╩=Лn┌г√Ф{▄?╡Gў(Ў,=╕jПю=Л╓jПю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒_ю=Лм0■╒▄г╪▒√p■╒▄г╪░·└jПюQьX╛░├√TrПb╟э├√Tp╤ьX╛░├√Tp╤ьX■░╞╢дмs░╤ьC█▒вачa№шtX*хFIяJ∙7MnлТBа9№шЎ!їЖR6wgое'¤·_ёзьEїЖhX╩4¤%,╔2m╩я#юo■╜LйY\╕╓цv44?∙/¤tУ F5btшаА (аА (аА0ї<б<Д3 pлТ~В╖ег╣═Y]Щ лг8Qg~юm┌╡S1p▓/J■\eО{ [zйРЎЛЕф ~an╥mдчїм■╔м~32єMВ=MЪ6РI+┼╕я<ю?╩е&╥╘╗√╧CNўR╜╡╘т▒╢╢ОUhєf ё▄√Us=С*1jь╖c{5─Rд╤к]!#jЬй z¤M5&Ї3ФR╒lV╙n.Y╕ЖЄ╓ч+Мф░╧ЪQzХ4╣tйъ╓WQФЖ┤fU2▒?/оhФЭ┬МЦдЪUї▌ьУ<╤FР,Ыct'ц ╕кn─(єl%╡Є▄Ц─1э¤ьE3Ї╧Z\└сbла8√ ■6?:9╩Ўz╒Гв░dg`Кд╠нaiП@а435}Qм<исEye▌Н╟Е╞:■uЬе╩kN─:n│5═╪╖╣ЕUШe^<э·T╞гъ9RIХ%╫яЖч[ha\d-├oш>ФЬ┘JЪ4.╡IэЇ╗kГn │`2ЎBG|vлrj$F ╩├4нRъю∙аЭm╢y{ЛB√И>ДvйМЫрСbMY#СРY▀6╥FV▌И?Н[С╧KЕ▐б$q┴ЎhчЬ№С╔ЄС╞I>Ше╠· Au2Qос&╡{╗TВoШ3б╩╔Єv>├ ╛mM\Ъ╧$пЎXб0й cЦ╟qБDк╗шднй,┌Ї°│√5ЮЎ╕▀Ш▄Р╩GoыM╘}R]H─цp╓q xд╚wЬЦ╬?1ITУg ╪╗&г}<єf┴ ░┬ц6gleЗ\*╡)=ЙqК▄╜з▐еї╖Ъайл)<лвк2╣Ьу╩Yк▀b^И┼╘5ЫШ.┌аК0Я╟p┼U╜┴щК╩U7Е4╓е▌"Єk█?:uEm─|З Ки╢╠жФv.╒УаPаPаPаPаPаБЪe╦ Я─i╕х-р єє3}║VW╘█hШ·╠6 █Тb╕ЩM╛ЄРчяgуаїйТiюkKU▒M┤6ЪtЄ█JХ к9╔МР0})дэ╣ЬЪ╛╞J█F╓j.Ў╬юCЗЮP|жч╫ж*U·│W▌#S]I%╘э╥UЮKAJ[М░oR8з;ЇdB▌Й|? q╦xё\I"хGХ(!т╞x  Ю*щы╘Ъ║-Е│Ж9|MйI"x╝╜МG+ЄvдЧ╝9;AXMydЦ[TС%Т╠ЦєR\Ь|╝qЪ*_d*V░xzгЦхб╕yР<йs╛,v ╤ zЕ]╢!О*Ч│▐╪╔2ri5jЫНkH█нМЇа41еёlцDV)▓фt9ыYi╧йо╘Ї#ё P╛б`│E<ИтM┬K8зг▄кVka<7╕^]е▒РXо0▓ЯЩ[щ╘SЕюRJфўЁ╞Ю'╥eT $ЮnцЦ┬qDЧ╝Вt┘wU Ў %u ф2√ёяU-МщnKa)Ю╩▐cЯ▐Dн╧=@жЭ╔Ьl╩═лFо╩,яО ьAе╬[зrioVxц0\╕Р╡",╦С▄Ф∙ЙP╛Г`╝K╥╤}Юъ.:╔%└сc/A▒ЖWP(╥~с─h ┴╘AY▌│Y┐q;5mZ;K2▐h^Y#∙Б^╧?НХЦф┬ёW┬т┼фQLТlЧВ9¤ ═*lклMM uDКFCiz█N2░1ёлs!Bф▓▐Иэq├╟╚▒уъ:╤╠.E{┌ъ+q)O│▌GЕ$Щa(?3I╚9,diЎkо╜╛Х╪(С╞хv`╘е~жНЄв▌жЙ╪ф╢╕Эе_<╚МоAc =i╕щ╕Фю╓В°Tm╤СzтG√pZnMGяlA-НЭ┤2яЇ█╟(╦9Ї┌:О¤*d╝═"▐╔h\╙Z[6╣Оfu■R╧ВN?LUж╥3iJZ█ъk<╦╡╝M▀─Ё0Qї?Е┬tьЕЯSH&h■╦x°■(рfёгШ# Ръ█MгK5╩Kx'cц6$ы¤jdЇ╜╩М}ыX╞Ёфйiu =╠L.a∙ФJЗ▌╟╕51m3ZСMl_╫эт6╫╬7HеАчЬUOteI╢Ъ6зЖ9т1LБ╤▒╣H╬{ J╢о╡3Mйhd°j5H/[╖├КЪ{ЧU╗'╘Ц▐vЙнon>hс,зПQTчи(]Ex▓┌╝т Д┘ЯСв!П╨Q╠╔хW▒j╩Є*}Т∙weн╪їе╠W│DЧzА╡╕ЄН╜╘╝║(K╠Q╬╠|ВkgШC:╧╚ёХcПA▐Я3%┴&W]]и√°'Ыv└№isП┘У▌_е┤Б ╜╘ЩPs%ЗчыG0r kz╖1╚т ИВvТ2 ·╓Е+Й┴-╩щлл ;ёЮц┘ич│,]▀-л*┤ЦцЛуЄгШ.ўвс─ээ,eI·╓ЪУd╩).н2п╪я╞H6ь.b▌;]▀-л*Ш.%╚╧юв/По(ц%Bт┌▐н╩;n#█┌HКУЇгШn+Э^0H√ ╡╗9Зь╦wВ╘жш.%▐·Ш╦уз\tыG1Е┬╬Ё]Ч И╢уЩг)Яжhц)┴&W:║Ж┴│╛№-┌ОpЎeЛ╗┴lИэ─Б·в,G╫sXJ)ьwлu┐▄G╖┤▒╧╥О`ф ■╫@qЎ+■╜н█ЭуЎd╫7╦Q┐Сp■`╬#И▒^ЬJnVВbY▀н╘мВ▐ц"IЦ"гїгЩГЕИ░БИ6wч┼╗Rц│,O|РC┤2yГ8О"J¤@щG0Ф┬Z▀Лй -╡╘x╠▒н>fЕИ▀UDvF│╛%Iн╗~ЖЧ9JЮД│_,6▒╧ф\░У°"Yx╧#╡┬фkин╠╞1ouwK Q∙Ъ9Дсb95TIY>╔zJТ XГЇ4s S&mAR╤'√=╔▄█vЙq╫Т? 9Шrj6█RKЙ╓!mwр~iaeQ°╙R╕J6к"Фз┘/Xт[v ■4╣Ш*w&k╒[%╣Єno∙f";╟>Фs1{2▓ъBс╥1mw,┐4РХ^╛╡3Х╤н8ZW:]■Aл ]$ ╨┌╣чgB¤P@P@P=╫·┘?р5╜▄ц─'} ▄·■Х╤hЬ╫Р╞UСJ░╚=h{ve+дУJ√-т2ж&╧q╙?ХJ^щmЄ╩ф)бF aюоdК' С│|аОЬtтТВE:Пryt╒УSОЇ╧(h╞╞;╤╩пrT▌нa#╙<йчХnц¤ЎI√╣9тОU{З;╡КыбЕ╣i■█tde┌NювТЕЭ╞ъ]X▒{еЛ╔╓G╣ЩPШБ∙=AыM┼▒)█а√ 9lZ]УH╚ьX#}╒·╥Ьb╨J\─z}╗ЛлЛ╔у1╔6╒U'$(<╤н╪I▌YўлvfjшL·ЪZ╝┼▌J╚=с3T К┴С@Xеиi▒j╗║4`Б│чxЎмхbу7+m.cЬM)h╔!x┴·╨а7QС?ЗaХ Mu<╗║│РI№Hе╚Rи·о┤┤╕▓В╘▄Lй Є╪ч╓ЫКj─й┤ю2├FГO╣kИдР│.╥CюxыD#╩Я1г╗▐о╚Л╦bеїМwнЩdКHЙ*ёЬz╥qL╕╩╦R┤uKшю▐ютWLс]▓╝МtйPW╒ПЭ╕┤СЁ¤░f╪Є*│┌g╙Я"h┼M (┌KлМ─╠╩K хА∙T╕j гь(MХ┼зЯ1Оi<╬гх9╧∙└ъ4яaыгм[─7wЗ9`НБЬc4rv{юЛVЦQ┘█y│`фЧ?xУ▄ЯZл[b\дїhu┤┌/,═$з√╥Ъ"мL╡(▌шС]\╔4│╩┬LeN╨T╕)=MFХСn┬╬=>╪A╗($х╬H═RК]HФЫшX╚к&┴С@X2( E`╚а,Г"А░dP К┴С@X2( h &Жс5╕."BёIК\v┴$╘╓v│╣еюм6чGKЛц╗73+2yxS└_JRЗ6гНWa╓·R├o4BцfВ2[Х╧е5║Й╔╜lB· KC-ї▄С!k89Ў·Q╚КЎм▒wж¤жь\Л╗ИИ]б#|/т(pDй╡╨]?LО└╠╔$Т<─g9ЇмГ▐ ╙VAпP▌яFГ|╠@qFВ┤Р╗и╨vУ ▐ЇhЄ4h┼пAw{╤d=Cqїв╚.├4h─оГuб╗▐ХРю├w╜7f%p▌ыFГўГuфи╨5>Їh&д┼▌яJ╚=р▌яO@ўГvz╤а{╠7{╤dРgЮ┤┤д▀Я┬Ъ▓{иdуяQа{└zQап"9╧╚НШиЭ╣Mi7╠оkшЯЄ _·щ'■Ж╒╞ў;║шаА (аА (аА3M╝W∙╚p╥Ь]ДтЮт gZ╧№кЬ┘>╬'╝╨у║Ъ╪гЩб└СR┌F█ССЬ/еЄю/e┼╦;}.·▌g╡HхЙ∙ Єю7N=Й │,╧№╗зхKЭЗ│ИfY ╧№ичaьт┘ЦєюЯХь=ЬC√2╦■}╙Єз╧.сьу╪бu6Йit-еQчСЯ.8Э█EПi.сьу╪uГh┌Л╠╢КоЁу╠S)\чCG┤ЧpЎQь\■═▓ Ю G<╗З│Иf┘╧№ичЧpЎqь┘╢_є┴?*9х▄=ЬC√6╚<Д╔гЮ]├┘а■═▓ Ю ∙Q╧.сьу╪Ыd?х▌*9х▄=Ь{┼gjў╞lХUpU·Ж╧еЄю╬=Й┐│м┐чВ~Ts╦╕{(Ў&ЯfС│ db;}hчЧpЎQьAзCзj6Q▄├nЮ[ч─ПщG<╗З│Пa╫PivЮWЯ'Э Й>Rr╟атЧ;gqж┘qSчЧpЎQь/ЎeЯ№√еЄю╬=К7ЗM╡╕[Ql%║e▐░в▒%sМф(чЧpЎqь6╥M&ф╬Н┼-░x▌HЄ┴$╘╣╪{8Ў+Ы▌*▄=о╦6╞.^7U9уб╝SчЧpЎQьY╝m.█╔НaYf╕├);└┴<Аq┴яG<╗З│П`▓m*Ё╦Ж4Ъї▒6C'рhчЧpЎq+}┐F1Х╖-d7'└?LtўщKЮ]├┘╟▒лЯa4k$pг#А╩q╘|Єю═■╠│ Яt№ичЧpЎqь┘ЦєюЯХЄю╬=К7╥h┌|╤├rЫdСK"дNфБ╫юГKЭЗ│ЙНюБиNРZaфu,а┬ъдз╧.сьу╪ЫMK B╪╩ЦкЫXйЯ(4s╦╕{8Ўk6ЛwrmвМЙВя┘$╞@╧╠r(чЧpЎqь_■╠│ ЯtгЮ]├┘╟▒R¤tЭ9юв╪мp ─╧╬@■q╘Q╧.сьу╪О┌]ърA■ЇВBywg└t█ 2`AG<╗З│ЙТu?, ?&╓Qo!OO╜╖╘╣╪{(Ў4т▓╙цК9R(у*JСР~┤s╚=ЬG f┘uЄЯ<╗З│П`:uРы~Ts╦╕{8Ўь█/∙рЯХЄю═╙lП№░O╩Оy│B fY ╧║~Ts╚=Ь{/ц╤4┘V+е┌ь╗АX]° АГG<╗З│П`░ЧE╘дТ;E▐╤Еf жш~`:╥чЧpЎqь^■╬▓ Ю ∙SчЧpЎqь┘╢_єю┐ХЄю═ЎuП№ЁJ9х▄=Ь{╙lq■б?*9х▄=Ь{ЎmС?ъЄе╧ Ўh_ь╦/∙ўO╩Я<Г┘─?│, ч▌?*\ь=Ь{ЎeЯ№√зхOЮ]├┘─?│, ч▌(чР{8ЗЎeЯ№√еЄю╬"e┘╧║~Ts╦╕{8Л¤Щg >щ∙Q╧.тЎQь┘ЦєюЯХЄ│П`■╠│ Яt№ичР{8Й¤Чe >щ∙Q╧.сьт/ЎeЯ№√зхG<╗З│A¤Щg >щG<Г┘─?│, ч▌(чР{8ЗЎeЯ№√еЄю╬!¤Щg >щG<╗З│ИfY ╧║Q╧.сь╨fY ╧║Q╧ Ўqь╦?∙ўJ9ф╬!¤Щg >щG<╗З│ИfY ╧║Q╧.сьт┘ЦєюФs╚^╬=Г√2╧■}╥Оy┘─?│, ч▌(чР{4┘ЦєюФs╚=Ъь╦?∙ўJ9ф╬!¤Щg >щG<Г┘╟░fY ╧║Q╧.сьу╪?│, ч▌(чЧpЎqь┘ЦєюФs╚=Ь{ЎeЯ№√еЄg┴¤Щg >щG<╗З│П`■╠│ ЯtгЮAьт┘ЦєюФs╚=ЬC√2╧■}╥Оy│ИfY ╧║Q╧ Ўqь╦?∙ўJ9ф═ЎeЯ№√еЄю╬!¤Щg >щG<Г┘─?│, ч▌(чР{8ЗЎeЯ№√еЄю╬=И▀N┤№ичaьт"щ╢ЫЗюЄгЭЗ$юьн!P┬┘N=(чaьрg┴6Э<ОСC┤g╔┌}шчР{8ш╓╨▄hq▄╔ЩHc╗Мq№й9╢5нН ■AлП∙щ'■Ж╒%шаА (аА (аА)E 3└ХM@С]B_kIе▀┴lфAХС">▀Nh_┴эh4Hc╢РЧ2л6Hsў┐Z▌а Нr 9nЇ╞╗╗kvKХhT╦G╚┬Ъ╫аЇаSEЮ╓├─Z┤WаAs<цHЮAН╤√~╣к[Н;UЧHaЎ╕╝б$▒О╣lux═P╘,t╜?Ok▌2·Cz╕╪VфЦРчбя╥АT┤┤╕ёД▀╩ЁEui╛Tє л0эЮ▌?1@ ║ZъQj║M╡╦╦mnQнЬ╩OЧ&S9щ■4^{[}Z];O╖КO=aЙо?|w%\}A"А'ё дxЧNkK├k4█Тi<╧║б@Зйа ]7@▒│IдК·YmцБгР▓дЮпЮ╟Кбс│зщ║Ўн╜┬н░y{еt$рУ@uHmї UэuY 6╤Н╨7`Фрn=y█╟ч@<3м~%╒^ зЮh╤#Сд,cСЮ°╞? ═╢╙с▓Ёzkp═/█г`╚■a└¤ц▄cж1╟J╫ёUХН┘╥ожr|┘уМС&╨PфЯы═iш╢┌6Яw%╢Э0id@х|т№3╘унmP6╡и[iУдл r▀╚╛\k╕+╬O'вОMPК└╔жj╫т;╗√шq"┬┴ХH Gс╟с@Kh■0ЩB╠-╝С>Ё6уz╨ОПiи°l▄'Ц▒[║JH┬йЄ└ф¤x№hk ▀МпчДд░%в─ю╕+╕╢qя┼V╣Т█UW╥ьоб│╙ }УР┴LЬЄл╧▐А:Ыx╥ hуМ■э*ЬчА=h╢ЧЦўияm(СQ╩1^Щ=gъV╢Юh┐Я 41▓#Ц└Ж9(┴Цv▓ш┌uшцц┌<Ж√а▒$@Ў·eНцЯиj▄H╧цЛl┼Dd Ё}hMWR╘.<'ж═ ┬+▄ХYж/░)Ї$zЇа4n4═v┘CYE╞фhу║i7ўЮG?Эwt═xэ▒д█к╚▒╣║Пk689ы@щЄ_Gт8┐╡oс╕ЕэЙ╖ХD'zёюhлМК╟ё<╤EеБ$Кд═2q╥T&А*jw▌xЗFKYVIGw░8]╕ч°аTКўR╫o╓sm"├&#К{╢П╦R8└╕╨█[Iї ▐Ayp╖Y╗xC╧b{╨F;эS[╛KП▓ФЖMй ┼╙G╡{Г▐А7<'s%нЬ╨j░0IИCчn@Oз4я ▌[гjА╧^■Mа╕чж1@╛╔aлjЪА╓n]dВm▒@╙ФШ`3▀нgъ2Ё▐╜mo;═gm$KМх▒є.х╨tа юb▒▒▓К M╘e╕┐wURg$╬w┤Паа х┤K&┐qЄм╢э Л╩p╚▄qЮ┘#ёа юг}Ўц2gs&ЯцnyO-╗╟╕Y#Ф╥А2╝?д[ъIq·ЛмP\╚╢░мГp?▐ї=▒Їа №Iс╘l4┤Щd╢KQЯ┤L╤ЙX2Hю0у@<(╖67У[K5пФ√JC├I│яgї■Ф╓╨?И ╢▓]HB╠%▒╞·Ї▌.╓м┤-╠║Ъ┌0NьЖ*╕А8Ш"╘юаkЎ║╡[АIєд╝et╟m╣╟╗о_┼iag",ўB&\Дv╔=O╬А1ьгЄх╘мзxТз╝Е`╕gPс╞Iы└ZrщР╜жАэw1kє▓с№╙На .;cеu>_&┌■╒YЪ;{щ"ПsdЕуї4╨P@P@P@P@P@P@P@P@P@P@ЯzА~Ёа ▌vц▐8<лЙ╓-фБє`у¤zць`╤tщ╠Ў╫;p┘ФР~╝╨AсЄ┬╨Рr ╛№ ицЗ  ┤ оТш╞а ЇP@P@P@в ПЩ┐р?╩А&аH░MCэыk╗╔>hЄ0JТ█M│┤╣Цт tОi┐╓:О[╜Zа.lнодЕчЕdhI?┬├╕а ша w·UОе│э╢╔6╠э▄:P┌i╢VVц [hуИЬХВht *▐чэ╪@Тї Ъзиh?┌т▌▌,r█╝ЦЙУ9▌Ьч╫┌А4V╧ьV╦Щ АG21∙Пч@t=m>Єютc╡─П)`ЫH,A╟S╟bы├·Mфц{л(дХ░ ф╨И┤╦8lZ╩+t[f╟B_ч@ЗЕt@At?п°╨║╬Ъ║КFПmm0RIєУv>Ш#[G╨#▓ТюILl.ХP─СьUUc>┤{√├√?ьeПь╣╧ХПЧоЭ-╬Хcuiн┼┤rA6#Їа░╥ьtр~╟k;ОN┴@(Н■НзjRмЧ╢С╠ъ╗Anаuа╙ЇЛ 0╣▒╡HLШ▌╖╛::Cгщ╞Ї▐ЫH╛╨z╚G4=▌м╢э╘K,/ўХ║Ї█[ Ё$QcTc4@°WC?є ЗЁ╧°╨Л└V╠┴lV&─;rО8я@НкYY├m6─КГ└·PфтА ╝┤В·╠K,MМлt4╦6╧NНг▓╖HQ╬X ъht=2▐▐h!│Й"ЬbEЖ·╨▒iЦP┘ЛHэгу■Yу"А"▓╤t█ <╦K8вs▌G4б@5 2╧RU[█tЬ!╩З┼#щvR┴ lН 5#Е#ж(р└zP=CL▓╘В-э║L;Cv╧ иPXщ6v~┼k9ы┤s∙╨o┤m?PР=хЬS2Ї,9 < ▒kgЬ"hR$гZ┘┴he0D▒ЩЬ╚√F71ъMA}гi·Г╗│Кf╪Pd╨Ї╔l╓╤ьв0) d @┼сЭ)ТhЇ°ЦD`╩Fx#С@/tm?PpўЦСL├бa@╡Н;═m2╨%║╛╨ жqЖжGе>╟E┤Б┼├Z[н╤√╬ЙМ·qУО1@m Ls;5ФD▄╦СўОAчё╨╞ПзЙаФZE╛№╕╬>ъЄ1·ЪЕ<9г╟p.OДJvq▀9═X].╔oНш╡М\СП3╜║UХЭ╠Ч6Ў╔▓ч{/V╧ кА  ДJ7Fф╪@f,X╣^I=Mi╨yа ╤аi_i?`З╬;ЎєЪ▒{ж┘ъмwЦё╠КrФ╘╙,у▓k8эу[vJ┴пЗtЫ9╥k{cХUА9нZ╝╙э/уЄя-уЩ=fАcе┘i┴ЕЭ┤p9;Z╣@п┤√]B1ф 2Рм?╧е:╬╬▐╞мK@ТGїа Уh\ў"т[PA▌╖╥А$╜╥4√їAugв?╗╣z~TЁюТФXB'Цp:оA╟ц(чB╙ ╝0}К/*/уЕ$фС@нмээ^VВНжrЄ■&=MO@P@P@P@P@P@P@P@P@P@Pr}ъD√тА*ъQ─P4РG#n└.аЎа ¤░у■=m┐я╪а ┤|1O║¤?▐4kC РZ╫I?ЇcP·(аА (аА (а Q╟╠▀Ёх@PFЩлъWZ┼╒Х┼ме│ьоwaБ+╟|рPhЪ╒эч┌d╘`╖╢╢ДФYU╬З^╜иB╫[╙п&ЄmяaТLуj╖4>╖ж╟<░=фK,@ЧBy\rhЎЪнХь =╡╠O Ь▌Бя@зИ4Щ&Єc┐Ед9∙A╬q@j·╜╝едzД╫E╙"U▌РOLzЪ╘y(╦╩╩К:│@!╫ЇйчЄc╛Бд=ju╬╣ж┌LЁ▄^EйН╚╟СЪ╡iwьkiVX╧FSЪЫааg─┌Ю╣ж├q=╡╜╕╡Пn%$Чч∙zPG ЕЬТаЪ}d°ГSТ┬╒c╡PўЧd GюO░аЁ╡ї╞еб├ut╩╙9`┼F GЇа s╥А0╝E}лYFd▒ЖlиYфv∙Фє╨tа M2g╣╙-'РххЕ╕╟%A4fА (#^╘.-╛╦kfUnожм├pEюHю?╞АY║╘Цъ╓╦NDVЬ9{ЗR╦▄Ю№КГH╒n ┤n┤═C╩Т[x─Юt=g╕ьyщэ@┐╖5Cg¤╢&╙UИЄ~rБ▒┐=╛Фбкjєckжь▀ ╩ЄО1Ьу╣фq@ жjЧQ▐═жjKц]╟Lпm!zzч4Dj:№·y╒П┘-mФ╥й▄@'лЖА7┤Ыяэ.┌ЁзЦf@█Iщ@r;хWU╒юь█Z┤x│╙, Є■y{t?Хi═и_▌i╓╫z5╝3ЙFц>▄ _ _╧й°~╓ЄшГ4Ыў08r?еjюЇ#єа ЪЫ▐Л_°Ч$o3єАsя@]ЎвЪ┴┤╝┐┤╜FИ╖юД0уы@╫ї№Ч3X╔k ╜╝п╞щ╣е(H?NF(▀ЎдЪЯЖф┐╙OЧ##ШўоюTЬё▀8?Э]╥oFгж█▌и╟ЪаРNH=┼\аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХM@·хн▄W╢┌ЮЯM$!№╚WмЩG_NM3V╨fЫA╡╙э$dьеВЬPд3╨Тh&╫@Щюэ╛]d5╗ЖycиТ!┼Z╓-е╗ё%н╠║=╒┼╡▓2╢vь@-╨{╨нїФ2шSдzq¤№C0 #ЎрС╞G╜(N░╘вЮТ+╙╚Ч╦)8 aФТ1Їа ~&√]№)ooд▌;EpОd┬m`зЬ|┘¤(▐й╓╣б\█Eo5Ьм╔П┤m├zшh╛б┌ЭДЦшЄ┴#}╔d╪3ЬВ9¤(kI╧МнgТ╬IaК╙╩3Х]е∙;║·dP▐ЖтCViнdЖ9чє#/ММv&А7шЯёo┌nЇ╣Ї√KЙ▐UR=бG═ЬN{vа M:wЮ╤LЦ╙[2|╗f's┴╜hK[kЩїц╒хБрAiЎqР\№█БуБщК╠╣mCQ║f╘ЇлєbЗ)mМЖ╟Fc┐Уэ╥А7'╙-5ЛRъ┌HуNR2┼;s┤╨4  щ║m╚╕┤ЙТP╔СЫПб4Ыek{жhgC√ЧQ╤'L╛lЮI9У╪╨нмrh┌%╝ ╫M █>№С@╝═жЛЕ╒Ф╨IтY┬эm╬╟Мx╧еMwсm*ЎюKлИ╦!▄─J└gєа 3╥m К╩╩KШ# #№ъ1╞7:╧░╡W╓Vц▀GЦ└╪HЄm]ф▓ЬmRs╨ЄhЎп{д╦u┘IvТ╧$╤<└ ┼░∙#'░ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5ЧQы*1*мдп╥ЖШьў$Д└3@g├U╒ШЕ`HыО╘ уиP╖РX[5┼╘Ю\I╒░N?*лдыvz┬╗YЧdF+╕ММНhЪОтxэнфЮf█j]О3АMP╥╡ыbyт▓g ).Wчж;ЎаjЪ╠:cFН┼─Тg oц└ъQ∙╨┌vгoй[∙░8tqЖFюv4nА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (9>ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5+Ї2їHьaЧ═iЪ┌vшш=:т║iє╡nЖ╨┐RюЫ%у╟■Ч ╟шUЗ═їеgQE|,Щ█бx╓doИa║│╘╒т╒.╚╕Iьы.╠aO уЯЄа Я █═В╦5ЇўM( DнЭДБЄ■╓А6h.ю[ЭфJ|И;▓|╟№GхOC)^·У█Gv╠╓?37w'Яоyан:Нйюу╖╟|1дёzВ╨0`МКч|6╘u08юl─PЯG$Ъr╡░o0~їUЙ<8 ╬ЧР<▄П-d╕ЎаыasЎf╕Йg╞|▓уv:Ї·PcU░h▐E╛╢+7С(;r{·P╛йbЮ`{█eЄ▒┐2Б╖=3@д╔$>j8t#!Фф@мoо.mnghTьЦEЕPЄъдБЯCС@Ї╜nЄў[Ц╞ъ─┘ДГ═ ьП╠n(mWS║Жю; 2Юёу2Я1╢к(8╔·Є(·NжўП=н╥пн▒чF┐tn╔\╫Б@i┌Г▄▌▐█Lк▓[I╖хшTМй·тА4(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХMEЫ)\]Mq+█Chюкp╥3mQЇїнch┘╢k-I┤л░╖4╛f;э╟н*ХT▐И'.bїffrЪдrшzФ▓┌FLzРЄЧhц9П ┘=Й"А648щЎG╠9╕Э╝щО1√┬ю■г╖з@╫ўВшHпH╧■4юg(ыtM╕Ю9аh▒МГ╨¤ ╒М].┘XА╧S■4ГР╜К EMNс-lЮi#ТE_сНw1№(УЁ─:cюВM2Є;Щв1╩якХ8g>┤fXвoB╥р├╕Йd╪vъ9·q@g{╗▌r╬[Е/Б G╡\ьU└'╘╨=Jщ/ЇV╥mt{╒╣┬аН╙ ╗H$o╧а<╨°г╩ЧW╙т╝▓╗╣Ж'ЮbЙ░сВСМPМР╪`╦kcrнЎV╖Н7ШаsыГ@Ен╗ыZ┌┘O╛'Y[х{Ю▄цА'ЁЇSOр█╦# СM╢h╟ШеrXз4▒а0]┌3ўбO% ▐OФ■вА0н╡e╜▀╪oЦm╓┘Yа?{Sэя@иЦ├]ЛY╔=╕╖6ЄGТы╔`q▀Ь╞А@Yо5НOT{y`Жя╩ЄЦUИU*xэ╧пнIf<яъп▄К▌!lї▄Nю? ▌аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (9>ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5L)j╨zS ╟sq╙jzЛ┤RyИжU!O░█@Q/ЧоXэeОI·╨иаОЇАГ╨Г@ @╓А P@`PqУ@ @э,`▓3y W╬Хе`XЯШї╟з╥А'уєае.W╡▓В╨╩aR ╥УЬ▒а P@dgаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХM@чЧP╡ЩЯ╦[И р/ г·╓╔FKM═,Ъ╨╖i{┌f ¤@ъ>╡Дбё+╙EГP#Э╘Я~╓▓щRm!Мr┤бU└ў·PmтЩу╥?┤$╥&X╠БєB>Ўq╙╡X╝╫он"╡oьЙKБўU%O\{Ё3@┬А#╕ДOМ│и8хйыЮгС@:"4Олmц═$p╦O6VrНOV>д╨╧Ы;л╕%╙&cjAv 0ў4{G╫ЫQ╝6Є╪MjZ/6#!√ыЬg█иа клq{OхМ╔/d^M╖a!kЭ═5┴Hт■ь у╛I·P ▄?┤э?ч║■FЭГШ╢)fА9▌╠З─Z╜з┌.%Ж'`ЪfУnPУ╘ЮЇ║пЙ%╙oж╢d╙∙Qyх╒АS@ ╙|No/maЫNЪ┘.ХМ23=(▐┤╙═з┌[Jш▐hЮ@аh╘АFG_╝8я@╓▒-╢╖oж╟bЄм╦╕K╝p~╕ы@ ░╫e╝╓n,?│хН`}п)`@╚${у╓А6шЖйл┌iHЖхШ┤Щ┘.YёМр~4Ц:═Цбw%╜дЖSЖgQХч╢}}иBА25▌b}"!*i╥▌D]╤ё│ы@Ї╦к▐┤ ж╦KЬ═╝2В;q@Yf┤ёoРЄ9╢╗╖,И\░дgЇЇа ╩(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (9>ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5бN{+╗╣ШMs▓▀°R. ц╢Мсв╘╤IGbэ╜╝VёДК5@;YJRУ╝Э╔nф╞С'1мш·▐зuГ-Ч╪╨>╚Л:фСЕ-Б╔▐А%╢Жk-н┤╦Э.┬ЄA%╒Н┤╧МnЦ%cПLСя@ В+xЦ(#Hг^ИГ}>А (аА @а@=hhаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аф√╘Йў┼W╘ ╘п√ ╨╨mKа╚п√п б5[╨ фЯї╥O¤╘~А (аА (аА (Ф_ёє7№∙P╘▌ ═BkYЪxnЦ╓с╬I╞Є{}▄╓ЁnJ╥Z╟▐Vh╣ж▄]Nзэ6╞ X▀ЗjЪСМ~rdТ╪╝k"C_╛╘ж┐С4MHЦЗхЦn╕М·юa╧╥А+█ъ┌┤╛╘nд╛)wgr╔╝DЗ*ёМcй<╨°_V▒В▀P╗╒Н╠Nko!кёєC@ ╥ъ║ой{ ╢ж║z[8AЕd.1ў╣┴┴а -TЮ=CO]LIsПe╪Е1╧$mщЬ╓А1эяї╦╚┤╪`╒v▌╬╧ч/┘╨Ф@─oщОoz╥ё▐аўKiдjD]┬А╦█Ж╬И▒JЧ┴ЪНїЇйи═ц╦б3Еу¤Ъ{Б'О╒WO=ШK@k│jVzнм░jШВyХ>╚!B└w9√╟ п@ЇЎ╫ot█╗┤╓ШЮ`K│&рGAь}Пн+_▀▐i┌lV╓ыщГ1nмX╣┬БМ{╨T╙╟g ╗Ш╙'nў!>Ь╨№c9у╓А9▌-╘x╗\!Ж?q╬щЩа Ъь·▓ъ╫Ieкy┼bn╓?!С╞▄Я_ZЛL╜╒г╛╤НюгЎИu┘М~J.▀Ч drz√PХЩЄ╦%дБ|└∙╚їА4╓dcА┘?JTС$╬╞╔h╛|y╞ю~Ф▌├├юbєе,а&э╝9>Г'Ёа ╟NhЖhўcw9╟C╓А$а╨╤│m Ц╬(Ж╡л.ХlП│═ЦW┼vюcяГКfЩиъWУsеЛXА√ iY9уМ@ззУ.пpЪ╨╙╥╦p*╔цБЕ╚э╟l·╨"╓зУ]m1мvР oєA∙└lc┐еj∙╤ю┌ЬуЇжT ╖╠{PмК─Е9╟Zп╘Т^┤"▄Д▄%▌╘·mы°╨ЦpГ,p(й*╛v╢qэ@'М╢╨▀7ж(хА\У┼"╚н└<Їщ@╙Fн╡Ш@а√P'МхЩ"xЇ┬Vdy#&p7*}уў{`╨Cж▀ ¤2 ▌╗TМчaeW╚SТ(ЖХк5Є▌р√;[▄4wяАsПz▒=╘6┬K+Qw&Gю№└Ьzф╨}Tm^└▄╝C  o▌В:рPўХ#8f╞h∙═P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@G'▐аO╛(╛з■е▀■ЖА3h]■Ex┐▌¤ и▐З  ┤ оТш╞а ЇP@P@P@в ПЩ┐р?╩А&а&k█НW┼Мt╙e!╢b▒-└l╢S ╨{л¤▒asс$░╝Т&Т╓@Гj╢╥6╢╥3@L┌vЩ'З╪GЮўU┴СJз┐$uа ┌ї№7z╒═╜╠Цv&<╢╛lУ▌GOJ│с R╦M╤яЮъф,m|1Ми┴ Г┤t·P№=оiгZ╒┐╥Ф¤кpёp~`У╥А сkсЭ^тр┌╞`╜Н╝▓qўQїа mtи4▀ ▄═~65╤I&√:m┌7 (╘╬█If▓█┴┤╒╩В█ШеN{аП┼ЪОМА┼;├¤бС`Ф%ХwлzfА5$╒┤▌WG╛Т┌сеВ8ШJcS╕╝у=ё@MФЦй5Ф6ЄYj╚МC[4s ╚ю:СыЮ┤щ└Pm]ЇKхП%Н╝АыўOOzуї9╝=6М╓║m▓@UН o4FFq╫цА.x╞[hЧJГF╥ Р╬Jчўcяv vА: уJ╕╢Рш■WТ хж╤╗J╥а _y░█[▐┬┴~╦(ТSЮ▒Ц_|рq┼Gд)ГJ║╒╢f╝ rкzХ9(ЯЦ8а"Єxnm┌сg╡єИ,╓░╪єюKС╞;Яz╫╓оt╖╥Ї╕ХcЬ$ юкwИ╢Ьру╓А7Ї█- HїKA A╪L╣╔ГЮч┐Z┼▓╫4?\\┴qVпlи FBЦ▌У╞(яЛu4°╦█GotмтъhLЫМ uї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5N:P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ЯzА>°а ·Я·Х ·═а t∙т u Ї&а z№В╙■║I гА/╨@P@P@RЛ■>f А *ЪА%▐г°Зyщ@═P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@Pr}ъD√тА+ъъW¤ шh6А%╨?фWЛ¤╫ ╨ЪА-шЄ O·щ'■Мj┐@P@P@J/°∙Ы■№иjужRЬ╨╜P╒с╘╠0┤Ц╢JБ═─v■w√█╣р о5-LxRЎ·=R)чВs╢UМ`а╟╩TБГ═H╫Ъ▐Язопy} ЁlV{tЗжюry?╬А,╜╓нлj7Ц·u▄VP┌>┬═ЎsОx'еAuйjЦ║fз╖Q¤о╧╩): ∙Г7pr3┴┐╓┤√h5+ыихКYDmjСуnN2пl╨п_ъ░\┼ ЯЩ Ы▐xаєJЬўщКВ├[╣ГE╘oз╛ПP6")╥8 ╕rGы@"╓╝DЮ]╦Gy,mЖxНОTЄp└фуеt║┘╘e░Cе╠Ц╙ЧЩ░0╕9=(R<ь]╟-Оhh Iпсё.╔яЦ;)T┤0Ш┴▌╡FяЫ╖$ЪпсЩї[ы╗ЛЛЛу=ВЭСцЕ█╘q╥А:Z(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аф√╘Йў┼W╘ ╘п√ ╨╨mKа╚п√п б5[╨ фЯї╥O¤╘~А (аА (аА (Ф_ёє7№∙P╘B-╡з╒Rцч╬РхУ╠∙х┌2;рtаAслц5i╝ЛМУШv!9╔Q█нGЕl╥eyn/.#CХЖYЙE#з▌и·ЗЖэяї╜√]х╝мб╚Ч` }V╓┤ГkсЛл2┘зЦрВ█д∙ЩО2фУ╔тА"╨┤1E5╨║И╞H√+\oМqМА?╚а -G├╓╖ў&фMqm;KyJа4▀°Fь ▓ч▒>. Щe2юA$Яаа\xf┌чK╢░Тъы╦╖%ГyЯ3Iч╫аj>ГP╣КсоосЦ8╝н╨╔┤Х╬yтА,YшЦvvs█аТAp?|Є9fУМdЯзеQ╡█╡ їh;6 wШущ@5m╙V░О╬}щlv(I"*ОАbАА9┴иъ-Ўk}4ХЙ▓Ч+rкH#ц∙O>╘╥щС∙Zu╝b/$,j{╖lуж{╨к(аА (аА (аА (аА (аА (аА 3@h╨P0аА (аА (аА (аА (═P@P@P@P@P@P@P@P@P@P@P@P@Pr}ъD√тА+ъъW¤ шh6А%╨?фWЛ¤╫ ╨ЪА-шЄ O·щ'■Мj┐@P@P@J/°∙Ы■№иjЬtаА (аP@P@P.гп¤ЖЇ┌ 6ЎхЁH0а`@Ю╛ЇsJ╒-ї8]рY╞█$]мнщ@╖:¤█_╦mе╪-чТ╗=┬╞>aС╖=z█╡yd╢Ню#J╩ 9┌}3▐А%'А9┘╝ce ╠▀g║{x╪в▄"eЗP~┤╣itЧV░╬╣Q4k Vъа И3Цuчеb`Э├Оh└Ж#╘P@■,│▓Цqф\Mk═e w>┤╡o:OoыР▓ qЮ└М ZxС └u$Ў═:А2пuы{j█M╕IC\и1╚╩NqПєы@ иkРXъЎ&9%╕ЭK*а╬У∙PЧШАЕ.─є@ XТp╘Ї`O6?∙ш┐Э8├ В=EЗ}т{{[щ-b╢╣║xFf0жDZ┐дъqj║dWё+$rg║М9№и╪Ц2дАs╓А@u ╧▒B$ЄЮL░\'^i7bdьQ■▄╟цX▌FО┴C:рdЇйц%T]НБVh#:ж70щЪC,k╓Eї44Из ъ\@^╧:YI%М+s0╞╚╦э ╚╧?JпвъД5╒▓█KЫ ,Ы╟@zу╨╨Жх╔E ъ├*A╘F8V·@ @яюЕНФ╫LМы *ЭH&А1aёl , sewi фЮd┬zr=hа▐╣╞сЯJUuo║└у╨╨▌HZ_┘┘Д▀-┘`Г8└P ?Х9ї[8╡a$┴.C*░#98рЇ&А,O7У I┤╛╤Ь/&У╨M╪╩_+┴чнН╤Ля 1Б╓бL╧┌▄УP╓╛╟gi{фю╢Щ╨H╠╪1лt8╧j╤;Ъ'sU~эА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аф√╘Йў┼W╘ ╘п√ ╨╨mKа╚п√п б5[╨ фЯї╥O¤╘~А (аА (аА (Ф_ёє7№∙P╘8щ@P@P@P@╧j:┼ЕПЙ!7<╕$ Є▒┴&2:╪╩А#ЁЇ╔}пkЎ═║╥O-ёН┼WЮ:■ФБб'З╜rKв√!¤ч▐╟?о:╨бАуе ўMy╨╘bБС4═G╠╢Ту┘є┬OS╩З┴Ю:ўа нJ{kcB╘.ьг╚tpа░_РmPо 4Сqиi╖W'>~°зО&З*├,иyщСЖ┼Ckзiє▌hhєL╤]└|у╜┐x╦М)ЎО(дЁLИ╢╖ЎhфЛk╖UBI╪╣∙@Ўр╨H└Х8ы┌А<· SВ╬k╧ь╦╒ ╫$Ma<;ЦW╚ Ж┴└4пт9СKОЇ╜╢Щ'cТvЁЯ/n╜(ЧЗУLЯьйKxмША√╛F▀М ▐╟їатА8пнЭ╟Й,-пdhу6юKи9Rs┤Ё=EV╡Пь$╙%╒&Q▌ ФВX─D.>ды═dNєO3I5Т▐z╗J^>8╞╤Пq╫нnMм╞Ю┤ОЇ}╕╩ц╩юбКўbp╘W┬У┴oтуОKuDыЛq)▄x#; р_нOзщ·=╨╓'С▌Е┤Є║ ╠T(;░;ч4╓шS┴qд█╡лЧЙWbУЮ▄cЯе_nФ┴▀▐Z[k:ЛXjЄi╙o"h▐"╚у?0└4}юЮO Y╔< ea!o╡<▒цq╖o8'о=h-a╨Я─ї"}ё@ї?ї+■ Ї4Ы@шЄ+┼■ы шM@Ї?∙з¤tУ F5_аА (аА (аА е№|═ ■T5N:P@P@P@P@а└Q╟q¤hEp(└ЇарP@'$ ╨Бш(O╜ ╟lPПA@Ў·-╩xЕїY╡.ш┌%Л╔ ╢2█Вфu┴я@4bАБ▄tаКZ0:╨`zP╨@q▐А:q@┌ЖНsyмZ▐НDдVю!ЄЗ<їф~T┤(░а-p╣┴Ї`P;@ш1@╟ы@ @ ┴ч(8╟=(EШа╥А зsa ╒╒╡╙юєmЛ╩Я\· ╖└а Г╥А 9└еd$Т╪зищ╨ъKwМq╕УbР╙>╘╞]P@P@P@P@P@P@P@P@P@P@P@P@ЯzА>°а ·Я·Х ·═а t∙т u Ї&а z№В╙■║I гА/╨@P@P@RЛ■>f А *ЪА3_─P╟лН0┘^∙─Рмc9<П┬А,ш·║jЎэ4V╖P :▌ю99а (аА (аА (аА (УyЖ&Є╢∙Ш;wt╧╜`hW:Гы·н╛б*Л╩┬─Xа╩У└=;fА:*ЖЎ▓┘═qМИР╛>Г4═E.бЭ╗ЎТ▐j &Е▌Мk2v/g└N:╨Kg8║▓ВсA ,jрОг4ыП7╔#gЫПЧ~qЯ|PХ>е  DЎ║МС╢ксaf╪ьt=шЎ║┌Т@Nku─Ж]┘А1К╣`э&Эnьrэ▒'╘Кфю╡╗Ш·■[╕с╕╢Ш┼Ы╩UdМєl'%Оx уК┐т[╔ф▓╥Ю┌[ИЕ╠ш@─>╓_jЖ."ЩхC>бЎД▌Шoд∙ё╟╠о;g╫4╤╨@аJп5='■оeНВ│╟mц0ИЕ$aЗ~ЗбЇаЛJ╝■╨╙-ю┬ХєР6=(┘фP-sqл┼о[Cy, :mX╞Aoт═nj#P*┐┘ц╪№■~ьc█mgxBъцяGynд2H'РdТxа╧j═╕╜ЦяY╜[╜Di╦h√`O<┼чzяеYЧUЯRЁtw╤3C,Є"ц"TпяBЬr{fА#╨nc]_╔ЪуXОBзdzГсd t╕аоА s1I{о\▐╝7-lЦsтTv]ю√уЬо};PЦБи=¤╡└Ш(Ъ╓v╢Уo▌,аdПlЪ╘=(ЭЪ эB[Й/.х░╖ВR!heh╖плчВ=■┤ЧИзП├ўЪХ№J╦m.─hA─ЛРЮzїа ║-├j╖\▌ы]╦░+oos╢6Мl<ЬуЪv▒|ЄxЦKлщмнуА:43y[▓G\Юh▀З5ЩчЁ╝╖ўА╖┘├рОY╒GSУ╔а zM╤╘ю ╕╗╓<ЩШл-╜╜╬╘nЯ)RzфСПjьT╒n^╙M╣Ю0 ╟2фqР ЎтА9╓╣╝╙┤√}l▄K2\Ш▐hdР░@°8Нx╟'╫еu┤О┴ШЇQЮ(К╥ї╫eКk▌SьМ▀ъс╢Ь╟ЬР╩IЇ=Mnk'TН╒эд╖[Q╦чpУ▀тА,▌\╧Дў0Ає,└`H'ф умїYE╜НтjW/w<ъпn╙nOЩИ╞╨sМtалRОюц╒O┌E╝=єФз@P@P@P@#P)зm╟п]^MдK╞М?я╘ь ╗sя@`ап [лIн┘КмиPС╪Кцт▓╓>╬Ъ)╖Пьq|Жщ▀я┼╚└P8mзйуК╓╜[█ #╥a▄BиСдДr╧#╡^╢iZ╓&Э@Ша.гаlr(ЦНї╘ёЪЗЎ!+$+ _┤/lцА6u┘o╓▌c░▒√WЩЭч╠ │cп\є@Г%√Yм7Ў?e1"в■Ё6Ё3┼dj║vйо^Ш_O╖│╖ ╡оYГI"╨╚ьh[P:ХТ┴¤Щk─╗Z"√[ББГ@4ЫMFу]}[P╖[OЇsl░▄q╕0l■cЁаЖА rkaкщ╢Rшvk=гЖXюдФБЖNWрУ╥А7ьнЫд╟kdh"┌Ы╗Р8а╥d╛ЧMЙї(R+│ЭшЗБ╔╟s█╧ыZЫYОh4П2(v╖Югx?Еn▌]_╟ж┼4u╦▀Ъa#Ю{тА2|#йg╢╖┌СwФKцф░∙p?}и║╩j╫╫2AЛm╘в^Lъp╛аE\[K¤L╖╖╥бЖс!▌╜╢│х▓0}y=hдPъ·о│es}`╢0Y▒p<╨ьфМvаЪА 4═}ПU╤ппЫn╖p^?Щє╕_%╧Rxфt№иKF╙ЯN╢╕,AЪцV╕РРА╚┘hsjУ[H┌╝ ┴╚EC┴_^жА0uXuл═Y╠┌\Ч16"ИNкТ▌З~▄Pб│ЯZ╨з▒╛▒√▒PиТ└ ОГОEgfj╫╖Ъ|V╓╨┌KцЩу9 ▀jОг▐А-]┴йщ·э┼їНВ_%┌(oШ#DWМdї╧ZУE╤&ГB╝┤║+ЧЕ┘С8ю└ы╥А(gъ╫ ┘╓W|V╨╪K∙┬@┴┬qЄБ╚╚9цА:ё@u+O╖XOm┐aХCz╧ы@ЇЪ~л}iП5вEglQZсдеT#@3═mыъQEЎd 3┤АI╝уjw=E^u▀!ш├А8╪Ї}Wь6·,ЦP,┘k╒`p7o└^lPц╜&а▒дV┌Х┴▄┬@Ы}:¤h#╢╗╘╝7-е╘bЭу1m/┐`К╚Ж█ZТ╞╫JЧHЖ8вС\oR6лgp^а╨нф┌┼ДР┼gзеї░ЕTЯ0#zЎ╞(╛│╜ОяQ╛╜╖О┘ю▌6┬з8 ЮII═n╨@P@P@P@P@P@P@P@P@P@P@P@ЯzА>°а ·Я·Х ·═а t∙т u Ї&а z№В╙■║I гА/╨@P@P@RЛ■>f А *ЪА%▄А`░у▐А(аА О;ИdСуОTgМс╒Xз╨О╘!8аmюр╣▌фM╗╦p╪>З5┘dHР╔#к"М│1└╫4нэ╡╪═╡─3ОЩЙ├╙ъ(z(аАhдZжЯ4┬(oнdФЇEХK├4nА╥А*НJ─▄}ЯэЦ▐~p#єWv{qЬ╨б@а ?█:^p5+2sМyщ■45╒эеШSus ║.:[[█[└Mн╠3ЕыхH\PўЦ╔p-┌тЬН┬2уv=q╓Аsgh┴nоаАЮGЩ \■t╢ў╓ЧDЛkи'╟_.@╪№и┼Pi/н#╕=╘ 1щР?ЗZ│@Eqs▓й╕Ю8C6╒20POз=°аг+аt`╩├ ОДPQ▐[K;┴─RM.Кр▓¤GQ@Mкщ░╚╤╦иZ╟"Ь2<╩>рЪЬ\Ba3yйхI}▀/yа█^┌▐╓╖0╬гВbР6?*ЮА (аА 1@P@(аА (аА P@аP@P@P@P@P@P@P@P@P@P@P@P@ЯzА>°а ·Я·Х ·═а t∙т u Ї&а z№В╙■║I гА/╨@P@P@RЛ■>f А *ЪА9cЩе>╨ИnфHгEP╛_NttPhО╥аПQЁy╘зъ\НЎБ■▒JЦ╞╥y╙╓А:▄Iwб┘\L█фТ X·Ъ╤=(╬№AоXъ╥4Ч─Anv┼Ц№╚┐╟└╟r:╨Ўбо╟дxb╩TР о-╨@JТ3┤r}а ╧Oj▐"╗ўFш╜к┤Тс╛wn?7=┼N·д/u УN╙gєоZDk┐ШХь?Ч√R=B-DЖ +ўХeЗ8╬╓∙щы@o-╙K╫ЇЯ░г╟pьТ├ НЕ╬H¤шдаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P}O¤J ┐¤ f╨║№Кё║ ·P╜■Ai ]$ ╤Н@шаА (аА (аА)E 3└ХM@РhТ├пMйея╦9H╝С╬h∙│█пJО╫├Q[┼qmцю┤РЦОдym╧;│У╫е6/ ╖ЪВЎь\█F┴Т+f╥>я╠xа_шм║ЕобЎgСфр}MLЪ'Сж5╡е╟С4Тy▓═хю▐°О╥p3Б└тА*Xxnю╩эюU▀ц╢щG┘└-╞:чК│wсфkй.м. Ьє╠√|═ Б8·P4  [ZC{╖Э█+4x*∙╧'Ъе?Дц╬дd1Р╨░З¤ї╧у@/¤гйуЁ╦ 6Ят┌_■╥AЛ;ъy<╨VЮ║╡╣iУV√ЄoС~╠>bO=°а zЮЕ5юиЧЎ╫╞╥UЛ╩ U┐#9юh▐ХжЛs$вy▄хх█╖wA╙8hP@ Ъ5Ц6Н╫r8 Му"А9█ Hэю/╠ЎHr`1m╧96s╫Ъщ: e╠▄█Iл║9лPhЭy\▀∙╓Р║▓├фm╞: └цА4ї}=KF:hs xPз░ПoZ▓Ц f%М┐ИЪlТ▄<╛}▄▀~m╗K├#╡W ┼wиЫ╜Jo╡m%вMж?/ЬЁAчёа ╔W|L╣ъ1@i╢QщЎ1[G╚E╖ўИ╧щ@hаА0ю№:╖/ЛА╢ТЯ▐█l√№ №┘╚╬OJ╫ТkV╖*Ф╪=Ж1@tM4iL+'Ш"▌єm╞r─Ї╔їаu╜"MR%Н.■╬чўAє╫▄z■Фz╬█ь╢P[ю▐aНSv1Ь fА34▌K-^{∙oDя,{6∙Ap2ч=▒щ@]°vi%ЫьЪЗ┘аШ│4^P|ЦхОIюIа ╟F┤8╙aS ╩─э;╖╫╫Ю┤Ыв}Ць]▌OЎлДcУf═КzМГ@ЇP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@╔ўияКпй й_ў ба ┌Ч@ С^/ў_ Bj╖б ╚-?ыдЯ·1и¤P@P@P(┐уцo°Єа иb╣ВWxуХу8p*}щ┘Б5 Ьq@·MдwZd3╩ў #ВI√CОч░j╖o╖╛1#9Sт┘╣╬;У@hаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА#УяP'▀_S R┐я C@┤.Б "╝_ю┐■Д╘oC РZ╫I?ЇcP·(аА (аА (а Q╟╠▀Ёх@Qw╨ MYt{ы╧-╟Я}┬Д█OvЁ8їнб╠╖╪L╜аiЛ■╓ ПМЬуoп√f А *ЪА'(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P~нoqpW╩╝[tф'цА3 │n╟#VП■¤/°╨═ "°r5Н╦иW∙Ку?1э@┤?∙з¤tУ F5_аА (аА (аА е№|═ ■T5N:P@P@P@(P@P@ P@P@P@P@P@P@P@P@P@о (аА (аА (аА (аБ (аА (аБ\(P@( Е (аА (аА (аА (аА (аА (аА#Уя~И~q@5}ц█░W'ВF@р╨9ж6мn%√w┘╓8Z░/╟g╡lшЄ,E■ы шM@Ї?∙'¤tУ F5_аА (аА (аА ═iД7Т oЄлМyМкOСЗ█╫√ж╡ЎO;√H╧#∙╥Ў,_Xэ1 <╧чG▒aїА:ЪПсг╪▒¤`?┤Ч■y°╤ьX}c╚?┤З№Є?Шг╪░·╟РiП∙ф1G░b·└ЗSQ╓▒ф┌c┤d■4{/м ¤кЫ▒│ЯJ=Л+ы░QWмd~4{/м 50FDd■4{X√L╧#∙К=ЛмЎШ ЮGє{X√L╧#∙К=Лмy ¤кЫ▒│ЯL╤ьX}c╚_э1 <Пц)√/мЎР ЮGє╜Лм>┴¤ж╜╙┘г╪▒¤`_э1 <ПчG▒aїА■╙є╚■bПb├ы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїА■╙є╚■bПb├ы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїА■╙є╚■bПb├ы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`Cйп№Є?Э┼З╓<Д]Qдy╟\=Лм>┴¤иЩ╞╬}3G▒aїП!┤╟№Є?Шзь╛░┌C■y╠RЎ,XЄэ1 <Пц(Ў,>▒ф┌c■y╠Qь}`?┤╟№Є?Шг╪1}`?┤╟№Є?Шг╪0·└Нк"Є╤Р=шЎ,XЄ╒co║Щ·=Лм>┬ i∙ф1G▒b·╦ь!╒FZ<\К=У╓`]Qec${=Лм ¤ж?чС№┼/b├ы iП∙ф1O╪░·└Я┌c■y╠RЎ,_Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїБй√╔БъM?b╟їП!┤З№Є?Шг╪░·╟Р┐┌c■y╠QьX}`?┤╟№Є?Шг╪░·└Я┌c■y╠Qь}`?┤╟№Є?Шг╪▒}`?┤╫╝GєзьX■░√║в7HєЇ4╜Лм>└uT_╝Ш·Ъ=Лм 5E=#'ёеьX}`_э1 <Пц)√Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└╙лFз ╕·Ъ=Лм 55=#?Э┼Лы/░iП∙ф1G▒c·└┐┌c■y╠QьX}`Oэ1 <Пц(Ў >░┌c■y╠Qь╛░7√Z=█JА▐Д╤ьY_X}ЗMЁ=Лм>┬ V68U▌Ї4{XЄ¤ж?чС№┼┼Лы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїА■╙є╚■bПb├ы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїА■╙є╚■bПb├ы¤ж?чС№┼┼З╓√L╧#∙К=ЛмЎШ ЮGє{Xэ1 <Пц(Ў,>░┌c■y╠QьX}`?┤╟№Є?Шг╪░·└iП∙ф1G▒aїБНиль4¤Лм╘э4╜ЛмїЙnЎИдXФu╩╧ъ(Ў,>░SЄочщ?я╔ тшЎ,>░[▒Щl4д│$╚W+╗n3УїўйХ7rб[Щ╪╨╤8╙Wє╥O¤╒С╨ЛЇP@P@P@ЪМВ!<ЕYВЕ8E$Яа╜=j╩ь╔]V6 }ТЇdу&▌°нЫ1t╤GU║╛Mr╞8a▄Я╝╪╕№г9э°╘Tm= зЄъjY╦u"╖┌н╥t √є·VКў╘╞J)hVШ№Am╚╖Д═їbJПф:ЧмН#д Ч╨╝Ю#╢М\╬С╔ЎE| ГщIпxи╡╩6╨Miu}p%Юs}▒╔!╟_ ╕┌RIЛ\╕√ ▀Mc▓╫gєzуБ▄gщOЫNb]5~R╞╣<░┘╦║═nm╢№∙Уo ^к{\Кk[QЩlchc╢.╪╔ЎsOtMм╠Ж╫nАX┼И√QУoСц|╪╞s╙еfъjСп▓[ЦїiдЛH√S(ОxJ╔АsО@#Є$U╧kУК╞МmцFx▄╒'tKНЩ╠%хщёЩфкАЯe2Р▐Y!є┴їЎоt▀3:W!йп═<EбTup╤┤d╠X`cПхZ╬M#I6Тy4╕╓h─b/▌m9▄оiS╗DЬНZ╘╚(R \х..o▀[╖C^dйЬ+y0у?а·╓.ў:R\ея│ь█═Э30FТ\{ё┼UBiбЮЮV╘юрОYд╢L╟┴├лz`єS ZCкнюпя"╫С$c■йe╢.Є1╗▄bЗ&жКф:╖∙Iцm▀┤n█╙=ё['s╡LA@P@P@P@P@P@ї Z >цU8dЙШp 'в*╚леDc╙шбд╕}╣╞YФЇцжSr-&?S╜YmD(MфI╗wvеMъ╟QhМ▌\ь╫%VЦў╩6√Ў[У┴╬?┼D╖5емM aIе[ЗЩ%Th╥g╦а┴'?ЯщW╥2ЫMдcbсэоoo-nd?3JдC╫│Ьb▒╓┌Ы{╜ Эiо┌┬н9╢lЩM░╠Щх╞9╞kIlМй┌ьOЖ/p~▄єо@ &DСу?xz╙ЖсP┘+SЖ╗  K╧·фj*|%╙°╞щ╢СCвG[гDКЮrTdцТ^шфя#Я║УьС∙С]jфJU<▄∙mЖ#йрЇУ▄▐╫▒╙jvё\╪LУ.х [уС[╜Оxщ2 ╚ ╙¤╧ъj`ьКлёе╠эи<╤ЦН│gГ╞·╒IъKZ\╖T@МHR@╔╟╓Уъb.╡vє═oЪ╧4Lm|и╚╧\V~╙[:ijO&л4/d│Y√Cь`╧╩╖ї90PNхЙ/$ЛZy7#n╬zЎ·К╡/xЗtбmо]▄C$уO\,┴╧Ъуо8цбNх║j%щТ=_J┬}╔╘2ю·ч·UI▌\Ил;щ╖j╙рЬЁd@╟>╜щ╟aIjG.еR┤f╓ёКЬe`bуКNVЕ╒╔d╝T╡I╠3Р╪∙LX}E>m╦й╡Є]Hb\╞vУЩ!eЩб;Фу╦йХcjcё ╠Fъхг╖TtVrA$zVi{х╔▐╒╗В-F=Йtъ#|ВLsшjфоИГхe? В4T^Oя∙╥ЖИ*ы#'─w░ъxЦт%KU ╕Рffltё═g7й╡(┘\щт8┤°цж]ЛП)K╟lV╝╓F.Rг╙дb┌эKnxї8бMГж╫Qn5ВS[]╛;д ├є9┤ж▀Rжзи╚╢0ЫmЁ╔s/ФжU*c╧r? Ч"гЩЎ<ё$ПS╕.$R■cЭм:Р╜.V╢┤_i ║╙эwJ┌┤┬yУo╚A Ю^цЬа╟╛Ен*KЛ]їgyrЕK?▐=╛ШжЫHЩ%&MлТ* K╒$БЦ╖pщMM▒:Vъ:уQH&h┌▐э╚■$ЕШ─Q)XJ▄Inb║╙чvєэ╨)╔u1░ъ3I╜G▐▒Еб_<ёC-╨Ъ+д▄Ые ╤Ьpзж+8;3jС╝likv▐}нц╠▄ ИW~OM├╡\Ц╖"Ы╥╞дС$Ё┤n2м Сьx5v║2╜дc°z╖╜╒"ЙvвJаAГQMY│ZОщW7щm&╞ВцCМц(ЩЗц*ЬмDaq╓ўйpО┬)у█БЙ"*O╨wжЮВФ╩уUНШ▓^М·█┐°RR╘зMX▒wz╢еCAq&сЬ┼6?*мLc}▐ёn#wXg@╜DСХ'шZjW A"╒гfZ^МЬsnр*Jw)╥kй5▌ъ[0 ─ЫЗXвf№ёNR░г┬┌э' D7 ╖┤С2УЇ═%&┬PhДъ╤й ┌^ёщnч·Ruд▀R{л┼╡┘║ф▌ЯїQ╟╫NVbШЦ╖Лu┐l3╟╖■z╞S?L╥Rl%▓+ЭZ0─}ТўО gЁгШпger═╒╥█"1ЖywvО"─q▄ nZ▌Еет\ю+ёХ Ю▒╧╙4У╕хMж@uh├√юzqn╪№ёCzП┘щvK=ъ┴n╨\8qЬGb╜:узZnM Bю┬┌▀%╘МВ И└╠▒н lNЫD┌▒фП▓_g╘[┐°Tє╗Хь▌╖&Ю∙ К'Є.I╬"H·БU╠JГ╪-oЦщ╩е╜╠eFs,LГє4'q╩ЫDoкFТ2[┬TСХ╖bуКNm RыrYп+hж0\0У°V&,╝gС┌ЫЫ▒<Куmпу╕У`╖║ПВs$,гїе▒╩dЪк$ОЖ╥Ёэ8╩└─╚Q╠5NыBF┐U╡Y═╜╔V8╪!m├п$uэOЫA{7q-ї╕Щc[{д╬~i!eQ°ЪоВC$╘уI ЫK╞#║█▒Ю*e6В4█&7h-рCpCЙЛП├н>vОхqи╟;дb┌э e∙ЮUў'КЙ╔╡cXS│╣╤шЯЄ _·щ'■Ж╒╩ў:·шаА (аА (аА1ю ╓K нй╪ЕйW╥║ОRОгз╡ы┴,W ╨n╪рg▒Ю╡Dтх▒д%╦г╪,4∙mYхЮЄKЩ\KpВИ┼злдЮ╚m┬у>├ЪM{├O▌░jg█%КdЭа╕ЛЕСFxЇ┴вpoT┬KFИг╥Ъ И╛╥═<┼ЛLWЮqЮ:v4╜Ы╢мnв╛┬Э щПt╟СЗ╪:Ьc4r;r▄=вцц╢биiWW█╙√EуЕ╘+F#N}щ╕Iл\HнlIkз▌┴m,'PwbFц06╫ы┼ ]A╬-▐┼3с┘ЪЯ┌$┐Щц<▒ЮШ·╘√7rХE╪╗и[I>Ш╢МцWvEw╞2│ПзыU.─EыsAT(FрU- х{ЛУЪc╗░uаIX(ZPж д@Їв├╗F~йз╔|`1\Ш /┐Е▌У┌жPoйQЪ]╬Ттъ+ШnЮ)░вb"\zКЧ2ХEfмjgУОївKs;▀`''&ШмА(аА `PHА (аА `А(аА (ж@▐┬n,зЕp С▓В}╞)KTTtw(┌Et·a╡G{gДИГФ╧ ╚╧PjReIл▌Хг╨яb╕Тt╒дє$╞єфп═ОХ*ЬУ╤Ч*Рj╓&║╥.&╘ЮЎ-AрvPА┴└№}єCж▀QFмR│DЦ:\Ц═rє▌5─Уь╦Фs█ёв0}E*▒шКСxu╓8эч╘$Ц╤pЗnъzч╘╥фm┌уЎк╫H╣ищoyqЁ]5┤Рл*Х@zрwЎ═Tа√УЙnЙ4═5lFiZiе9y┐с┌ЬUЕ*Ь┌X╜TAKYНх╤ю╥5.═TdЯ┬жZвщщ!ЪlПqгмf9mеX№п▐. c8· *Q╗Vьеr(┤Ж}>[K╦Ч╕Wm╩vЕ┌y?П'4╜Ыю5Q-R%Я═┤╥Щ$2▐Hrдв╟'О*Эь-▌├AНт╤нгС :о СВ94а┤ Нs\zX║ъr]¤жBпМDzМSхi▐рцЪ╡Л╡Fb8%H}(~CR]QПkв▌[▐ЫПэG"GVХ|░7у╡fа╙4ХX╡kїM?эщYМ2┬с╤└щU(є+ и╜К░hў▌н╘ЪЛ╚┴HlачВ╙йЎo╣^╥;X-tYmЇ█лCz╠g9 хПФЮ╝{╨й╡╘D·═еh~To%─САj уpэЇж╒г`OЪW/┘└-m!А yhЄQZ-╔й╪ZЕ2Hв┌h▌╠1б▐н╘╖ л:╔(ИЙy╡gь▌яsUR6╡ЙэЇлЛ{aК∙─▓Nei╝░O#СК9%▄Nдo░iZL·km7═,Я,╞'ЬцЬa%╗ M>Бкhq_╞▒╞R▀√хbR[╙Ъ%Nс ╢4-`√=мPю▌▒Bч╧сVХСЬЯ3%аAL ╫╢p▀[┤.Tўюз╘T╔&8╦ФбЛ6°Е╓г-─0░uПhОЩ5Нї4Ў▒[!Тh╖-z╫1ъNМO╦√аvМЁ№hЎo╕¤м{Цp╦ '╕kЗюь╕╧>ЯJ╕щ╣ЬдЮ╚ЯЁ╔ V z╡[/э|Д╕hC▒QЬПOхI╞ъ┼╞I=JwЪ\█└С\$▌!P\ё╧;╘{'▄╡Y_an┤{╦НЯё6}иTу╦ц^ ЮhpЧqкС["╠vwkdЁ╢аэ)lм╞1Р=1Tб+nCЬo▒N▀D╝Вy%ПU}╥░i3 №╪е╚╙╜╩u"╒Т6А#й╨╒гqTЪAиPЕQaj╛ЇX5 PаЛбКaиi║ c `┼иPЕиRа5 ,Еж@+б@м├нQ` `G7·▒■Є 1Y╘°Yе?Й·'№ГW■║K г╣▀╨┐HА (аА (аА ═kxз╕Ч═M╪█▄О╘╙ka8з╕┐┘╓┐є╦ 4∙фO│Й0╙m1■л 4s╚9"/Ўmз№Є ╟П°╤╠╟╚╗Ўmз№Є ╟П°╤╧!rD?│m?чЧ■<╞Оf>E╪?│m?чЧ■<╞ОfЛ░f┌╧/№x Н╠9#╪?│m?чЧ■<╞Оg▄\Сь┘╢Яє╦ ?уG3D┘╢Яє╟ 4s╚9"· ¤Ыi <┐ёуG;HЗЎmз№Є ╟НЄHЎь█O∙х ПёгЮAьт┘╢Яє╦ ?уG<Г┘─?│m?чЧ■<╞Оy│Иf┌╧/№x НЄg■═┤ Ю_°ё 9ф╬!¤Ыi <┐ёу■4s╚=ЬE■═┤ Ю_°ё 9дСь█O∙у П9Ш∙#╪?│m?чЧ■<╞Оy${Ўmз№Є ╟П°╤╧!rG░Я┘╢Яє╦ ?уG<Г┘─?│m?чЧ■<╞Оy│Иf┌╧/№x НЄg■═┤ Ю_°ё 9ф╬!¤Ыi <┐ёу■4s╚=ЬC√6╙■yу╟№hчР{8ЗЎmз№Є ╟П°╤╧ Ўqь█O∙х ПёгЮAьт┘╢Яє╦ ?уG<Г┘─?│m?чЧ■<╞Оy│Иf┌╧/№x НЄg■═┤ Ю_°ё 9ф╬!¤Ыi <┐ёу■4s╚=ЬC√6╙■yу╟№hчР{8ЗЎmз№Є ╟П°╤╧ Ўqь█O∙х ПёгЮAьт┘╢Яє╦ ?уG<Г┘─?│m?чЧ■<╞Оy│Иf┌╧/№x НЄg■═┤ Ю_°ё 9ф╬!¤Ыi <┐ёу■4s╚=ЬC√6╙■yу╟№hчР{8ЗЎmз№Є ╟П°╤╧ Ўq√6╙■x у╞ОyТ=Г√6╙■yу╟№hцa╔?│m?чЧ■уф]Г√6╙■x у╞Оi$C√6╙■x у╞Оy Т"f┌╧/№x НЄg■═┤ Ю_°ё 9ф╬" f┌╧/№x Н╠|Л░f┌╧/№x Н╧╕╣#╪?│m?чЧ■<╞Оg▄9#╪?│m?чЧ■<╞Оf>E╪?│m?чП■HЎь█O∙х ПёгЩЗ${Ўmз№Є ╟Н.g▄9#╪Oь█O∙х П|ь\Сь┘╢Яє╦ 4s╚=ЬC√6╙■yу╟№hчР{8ЗЎmз№ё ╟НЄHЎь█O∙у П9фСь┘╢Яє╦ ?уG<Г┘─?│m?чП■HЎь█O∙у П9ф.HЎь█O∙х ПёгЮAьт┘╢Яє╟ 4s╚9#╪?│m?чП■f А *ЪА'(аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА ОO╜@Я|P~│msp╚╝Ku ╬шўd¤r=ш,i╫┘ё6Г■№їшCB|5лЧPпє█ЯЩ╗Pн■Ai ]$ ╤Н@шаА (аА (аА(╞@╣Ы?ь *Ыpїа ├ uаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїаpїадu▌╫╡":ю╨^╜лY┘yqO.╫f╚Iэь=ш j┬$g╛y╢UY╚=╜сщ№-SРVN▀э5]╨┐фЯї╥_¤╘~А (аА (аА (Ущ6n┼Щf$ ╙y?°кoЎ5Чў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёTcX r_√ ' @Ў5Пў% ┐ЄёT┐╪╓_▄Ч■ ╔ ┼PcYr_√ ' @Ў5Ц1▓\u _' @Ў5Пў% ┐ЄёTcYr^Ш _' @ннв┤АCХМ@,OSУ╔чйа hаА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (аА (а ┘ess/doc/font-cor-s.jpg0000664000175000017500000010135112423756516013176 0ustar eddedd ╪ рJFIF`` ■Software: Microsoft Office █C    #%$""!&+7/&)4)!"0A149;>>>%.DIC; █C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; └Z" ─ ─V  !1AQUУ"STaqд╤╙25БСТ▓╥#34BrtЁRbВб$▒┴┬сDVsuХ6CdГФв│┤ё7 ─ ─2Q!Rб╤1"AЁaБсq▒┴2BСё3 ▌( ┌ ?┘╢╗k▒ Я─бA├Ёеb.╠J▓4╨╝TдЭ2иЯЬOв╒ F╒m╝XЙТц─<[Uмy╖пZRВбЎV╜¤┤<ыОы.)╡е.YH6#┼oжл░ХIГ▒i╟^ovХ╢╓nn╝╖>▓╓╜│ЗЧКтШЫЄ√▀цvШf№цє┐╡╠_ {s?fЬКчB^PA?kuЮ┘=КО∙?╡\[mё Ww ФчЖ4з C▓[─ ┴@д▐щ:e╡╚▒лэ╖┼ЙБ`Y╞▒╩wgт▐ Жв╡gСqlжЎыз│ЗвiНL;L■▓╠╠¤е3Ю┘=КО∙?ЬЎ╔ьTw╔°u│┴┘ь∙М╠ТСЕa╨╖мфY▐я,Ш·ГagBП~Э*лЗ ╞6Л─┘ai╞qЙ8nY2╙&.s╛u%Do╩EУи)╨ъk1O 7╡м■|s>н╒╝Ў╔ьTw╔°tч╢Obг╛O├иsb╬╪▌А─YЗ%°УY┌CrZ╗<╥Y%7▒╛S|└\ПїЫ┼▒ЕЕ┬ЬМG┼чуМ)XЫ8zRЧR,u> ╖МmoШТЭnzшpЎЪвО_╓RЄ═╧lЮ┼G|ЯЗN{dЎ*;ф№:l╛╞v\╪╨▒\8|┘╠▓Ур eX+j╔Рт╔l,АР╨Z▓mI├О╚*@╞ЪСЙAn$Шr=Зце╒8╜ы%─YJB3╓o{ г├g╦wХ╝ю╟╧lЮ┼G|ЯЗN{dЎ*;ф№:cXМщ]¤Я0№╟▌i╪ШlЗ[ДеnЧ+ ёQL╥ъ<Ў╔ьTw╔°tч╢Obг╛O├о]Jzз╝∙3Kиє█'▒Q▀'с╙Ю┘=КО∙?╣u)ш8~Юєф═.г╧lЮ┼G|ЯЗN{dЎ*;ф№:х╘зас·{╧У4║П=▓{Є~9эУ╪ияУЁыЧRЮГЗщя>L╥ъ<Ў╔ьTw╔°tч╢Obг╛O├о]Jzз╝∙3Kиє█'▒Q▀'с╙Ю┘=КО∙?╣u)ш8~Юєф═.г╧lЮ┼G|ЯЗN{dЎ*;ф№:х╘зас·{╧У4╗Ц╡√_Мс╠т8~╩6ьWп╗YЬ┬3YE'E$ ЇT╛\█┐√Ю╫■г▌Pv>K │\∙/╢├HK┘Ьqa)}`\ЯM[C─аb№ ly[╗g▄║Хх┐ ╪щ└¤ХЁёjвМJйК#Ф╬■]"Ў@З╡g>?ДE┘6Ьhнh Дp BКkН|dС~┌V~\█┐√Ю╫■г▌Tk├вт█+│pf╡╜Ою)3:3▐╩ФFаГ─ ¤N╩`╕9Г╩├aЦ\е╢еoVлд░щ╡ФOH╧RЮИяхlУЕmц╙уr&╟├╢eз▄АрnEз0РЕ]CBR╛j╡сV\╣╖ў=п¤F7║╡╧ь╟ї√]№█_НъЛ╩RLxV^R╣╧Ю к▀f═║═жЄ▀с═mkж%TSUвИ°Н■ё║E█ uН#jcl■'Г5Cш.\Hiьй╩в/Х6╫)╥ўщо#О)K╟▒нEJTзI$▄УШ╫NЩ √4хП Н╩х°╧╙У ЩsёчЛ┌ЩИ╡у№╠}╓Г√W└1LrlMК_▄е[╦-)╦t╖n$uбr╪;▓Й┘ї`)▌д{}FmuойИ■┌псGснO┼dг8k3Ё°ЯаimЙH*[кZЦЫ'╟O ГпНn8ЩК)вb&▀>Ksr Р;Q┘g╛oєUС┴┤S └K╕ЗВю╖;П2Z┘rч╡нела5П┤Щ╥Ъ}╘-ЦRЬКiеХйe╫РR.T@kаt(ЁсkCR╪Kь/:└╪В╨ВаГpA╘jЇ╧·Ц$№╙Я╗9!╚Х▓╗p╖г>╢$й╪ЙB#м╦M┘J ╥shсn∙/e6▀B1Й2R┌Ц┤e!A*Y╠▓.н Озм╫W┼ц/┴зMi)SСг╕ъB╕ФТ/ш╥гA─п щrq8╪A Ж┘░Wў~zоM╙`5╫жтЮхЙ╙Я╣Тэ╝√FjKЄ[wCЄ2яЬLЁцQdц9ї░╨^╝F└┤O╛№S9Зdп;ыnjRзUй║И^зS╟м╓Ёv▒┤;%e$┤╘Д┤ЖЛ%╒$°8*▒ёK╟K]^-╜;Opпж?ы∙2CСс[=╖x*▌0"╕┌_IK═)╓Ц█┬─YhQ)P▓Пx╫МCev┐▌я░Xнюяoj3╜╕ф╡°tЁ·ыитr▀Оb1vЧе┐║J▌IRQd-dФВ ╤qo╤jМ╓6Ш╔}╝MCz╠б*; VїEд║,БШПGд№╥zmOq─╜Є┼ зЄdЗ4^╩m╗П╞}lIS▒ДGp╩AS)I║BNo┬▄(нФ█u"Z─ТЩк Ф дYїШ°▐1╣'^Ъщgh#90╟i└Дю╪q.й╡(уе▓В,2кщ╢жрЭGКk)┌)([ЛЦmHтДиЕ%DYI║Уу БpocW▄▒:cєў2CЩ?│[y+┬╝!Ё╠ЮЮbN√'═╧ux╓ш┐ ¤∙7╖Зў&~═рЯ╢'їOч|╧ЁЁоЮq▄42ЧU д)E$)╡"╓╣RH║T@▀QSъ{О'L╫ЄdЗ!of╢ёи╔К┌&!Д┤╢CIШРР┌═╓Ыfрв#ж╒БнО█&"┐иo╢─Ь╗цУ%.e7NaЪ╞╟Qzъ8Ў$цИ{╣c 7KzP%╡л√╔╘Ф╟ж▓aШвf2┬^)║R2Х╘6╝Е─ ЕWJЖзE O╛хЙ╙Я╣Т╥.¤а┴CHИgGC RKSRРДиЕ( /@HїР+ё/╡nтM┼0NVu─хQЩ,Уq` ╥тI jmj▀╡ С5 ╞L╗)Жst│p╢w┘■┤┘6¤▀Ьн4й╟hp┤╢╖ ЕхF[╩ H ВAFЮ8║Т.ЫПuКЮуЙ╙№Щ!╬┘нйnK2░нЯF√9┐K bВХqn*uV╥уKq7и╬ьж█┐И Eц$╣1*JДЕJAp█)═ЪўїWYgЙ"SСЪx)╓яqФАlllx*╟Ck╪шljM#¤G?у№Щ!┼▐╪}нТ√П┐З╕ыоинn.B ФвnI9╡$╫ПР;Q┘g╛oєWVС'F╨╟Ж█╤gЪ[╓S +░Eє┌ч9▒╢ЦрjG,стB╪TАВ▐l╦ZTЦюРJАYI7▄e=F┌ў<]г┐У$9╚иь│▀7∙йЄj;,ў═■jъОэmь@╙Б ╕∙C■┌ЪSh 8╝╓P ╖╟ЖКъ╥╞$╞'2]Ов@VU бI=E*ГbгБжЮчН┤wЄdЗ∙╡Ц{ц 5>@эGeЮ∙┐═]о╡▄'Щ7s2 ╬R!я╠8h!─мз0A9╒оДp╜■╩{Ю6╤▀╔Т█ф╘vYяЫ№╘∙╡Ц{ц 5uЛ╔N№д╦├це B"5ўmцP +ОИ,Ь┬т 6╫6dЗeC╕№YиД=°О╗\┌╞т╫@эGeЮ∙┐═]оФў@эGeЮ∙┐═OР;Q┘g╛oєWkе=╧hяф╔)Єj;,ў═■j|Б┌О╦=єЪ╗])юx█G&HqOР;Q┘g╛oєSф╘vYяЫ№╒┌щOs╞┌;∙2C ╤╤╛@эGeЮ∙┐═OР;Q┘g╛oєWkе}?s╞┌;∙c$8з╚иь│▀7∙йЄj;,ў═■jэtз╣уm№Щ!┼>@эGeЮ∙┐═OР;Q┘g╛oєWkе=╧hяф╔)Єj;,ў═■j|Б┌О╦=єЪ╗])юx█G&HqOР;Q┘g╛oєSф╘vYяЫ№╒┌щOs╞┌;∙2CК|Б┌О╦=єЪЯ vг▓╧|▀цо╫J{Ю6╤▀╔ТSф╘vYяЫ№╘∙╡Ц{ц 5v║S▄ё╢О■LРтЯ vг▓╧|▀цз╚иь│▀7∙л╡╥ЮчН┤wЄdЗ∙╡Ц{ц 5>@эGeЮ∙┐═]оФў@эGeЮ∙┐═OР;Q┘g╛oєWkе=╧hяф╔)Єj;,ў═■j|Б┌О╦=єЪ╗])юx█G&HqOР;Q┘g╛oєSф╘vYяЫ№╒┌щOs╞┌;∙2CК|Б┌О╦=єЪЯ vг▓╧|▀цо╫J{Ю6╤▀╔ТSф╘vYяЫ№╘∙╡Ц{ц 5v║S▄ё╢О■LРтЯ vг▓╧|▀цз╚иь│▀7∙л╡╥ЮчН┤wЄdЗ∙╡Ц{ц 5>@эGeЮ∙┐═]оФў@эGeЮ∙┐═OР;Q┘g╛oєWkе=╧hяф╔)Єj;,ў═■j|Б┌О╦=єЪ╗])юx█G&HqOР;Q┘g╛oєSф╘vYяЫ№╒┌щOs╞┌;∙2CК|Б┌О╦=єЪЯ vг▓╧|▀цо╫J{Ю6╤▀╔ТSф╘vYяЫ№╘∙╡Ц{ц 5v║S▄ё╢О■LРтЯ vг▓╧|▀цз╚иь│▀7∙л╡╥ЮчН┤wЄdЗ6ПnурЁ>BЖЇ(щP ╛^{моъ║ьu?ш+╘&Ўы ╧р;Ж┼▐[>х╢СЪ▄/eы─¤╡╤щ^J▒йкйкhЛ╧їЄ╒Ь▄│╖K├├^┘ш╞a╟BKkёЦ╡,ЭW╟╟#╒ї╫И╨╢╬Д╚Н▓°S/"∙\mЦТд▄X╪Еu].ХЭJ:#┐Т▀лЩ`╤6ў8БЕД1Ыu.╝V┤ХРПаё╧╪*├├ ┤Ы[Тb█л─№ї╛╥╡V55MцИяф│Я`°V╘╩█Шx╓5ЗбФ╢Е!kmi░БDёUлЪc?NO■e╧─kш╩∙╧·rє.~#\ё13█Хн дCщlGЎ╒ ?к┤A ┼ЯЮT╜aжВr№▄Кp▐■Ь щ[М╘ЩпяSЫ*[╢╢¤┌╬▐ K╢m№F╣лЮ;▓ u╫[╠╝вщu ╛╞vю\Рп_QiqдE]с░УЗ└n*C`"фЖЫ@$ТlС└\·OY'Z╪Т▐╣b2qK/)РA$ФfR╕№╨|Rzе&╖Д┴R╥у-HeOВI░ ё∙╩&╔$кЧЖЄU{YотР╬#Д╠В╗2X[Yэ|╣ТEэ╙╞в/Я*МKУ0q╖YS )+B┬╞`Tn.ФЁ╢Ч╫лzфh>H¤є^\┬░цЫSО !JRЬ $$Ы╒a╬N╠╩~[│$╬h╚[Е╤╗dе@╟)╨иЫ^8╛║ц:К╪л`ПФЬ╤Ц█┬┘о█┘┤╣╨їВ>г╒Y╣Т?|╤f&9KM─a9,GqЗR╙ё]▐┤VВд\бH7ВEЦxн╜UY# ─РьW╪yЕ╦^ d╛сhюР<M '5э`Сє╕ЫЁ╥║/#AЄGяЪr4$~∙в9т6iH%BP╠ыН:¤█╨йK■.║V▒нЇ╦оЖ■│.Цт2ь─)╕ mи┴-wiuеР╜uQ д\Xjtъш▄Н╔╛kp░зe╜QyАХ8УШX*Ў Э├кЛiЦС'y┘/╝╘└┘zPїW(¤тЫ№яёёHY$U┼l▄Н╔╛i╚╨|С√цИ╥▒X═1МєM;¤ш▀6VХ]╡в─?┐~=ьюGЪР▐№8▓▌┼ЮXqyEЇ!@e╜└Aн╓K87rдGadf vFRG]ЙЇVvЁм9╓╥уh B└RTЧ БЇYЙИ╗Яa{4м9╕i2ГЮ ·¤]│eК#█ОЬ3зж░C╪Ўт6█mк+aХ2B\ZPъ·E^ъQ▌БqarMОЦщ\Н╔╛k╦xVыiq┤б`)*KДЕ└Гz#LЙЗ╜У)RBЫ{ГiFROZ║ ╔а│Я[7#AЄGяЪr4$~∙а╘ЖWЛGЭЮ┴Цk%╕чSfўЇn ╓кфl╥е╢фGе.>ъЖьшS┴└лиТ╒█┼╗й▒┐A^З6Рз ║Ь#RlТ@п\Н╔╛h9Є░)R'"|й═Й(PШg*BR█╔MВК╝k╛M═╞АZзсPЬБ 0ыйpЕh)BBR $╘I╖`Ч#AЄGяЪr4$~∙а ╥▄кз├1?n│cЦЩМm╞cФ8е(W▀9Т?|╙Са∙#ў═К╬5 У!╔lЙo!╢╥жШ╩╪J Ф.ТI7+P:Н-kjF╚iР╖▌CПIwzсmTаВI╚'[·лps ├┌in-ХeBJОRвl:А╘╫Ш°v.3RXA[O - ╠бtСp~╩-ж╫k╡U╚ГУ№zЬ▐сyЄёь╝╦п╤[▀#AЄGяЪН*6 lвBТ·┬@ZЖb@Са╣ kj3hsчЎ=╖U4!QP$жAK▐ ┴NЕЩw╒#9░/╞∙Ё╠&py Шуhf<щ2i(ёю╡║R│AKД╪xuЇ>FГфП▀4фh>H¤єDk4нЫСа∙#ў═9Т?|╨k4нЫСа∙#ў═9Т?|╨k4лЎсaN╦z"вє*q'0░UьA:ЗUgфh>H¤єEШШ∙k4нЫСа∙#ў═9Т?|╤═+fфh>H¤єNFГфП▀4═+fфh>H¤єNFГфП▀4═+d8V Ф╡аЭс╣╫6┐д}в▒IЕЕCKj} Hu╘┤Т3F└p╣╥чJ,D╧┬ВХ│r4$~∙з#AЄGяЪ#Yеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛i╚╨|С√цГYеl▄Н╔╛j7&DЄgя ╙▄йWRаCП}║Q░$А│оа╞лў░╝┘╬ў■ФkчкП√lПсoЁ╘ЕеKi─ е!A ,аУc√├Qышиё mС№-■Ъ╧ыEф╙p8sМ├Xe┬Аe8T1!$+Жа╪С╨хЙшж1cШф╜█.+3╤Ь╕ЛЪЭЄХkб╦уe¤┴у ▌XЙ5╖ б╗6ЦЖT┌╚MЄз╘.mызВG▐яw(╧╝▐ц╦о|╣3zЄщъоy9Yэї_^k~^√┐c%HК╥RPБYY▀▐:Я_MB┌┤▐е╝╡!)yТТФ°█╘х║Fдf╡└╓╫╡YWсён╠r│╔MVк*Q`ъ═─\ОиN╚[M^TdЭ╥╧ОТ3Фё67▓У├J░ОМX>У&D5╡оd╢┬╥гжЦ%gз╤SДаY @Z╜TИ│Ub^eвЄУ═Cy╚°╙о╡И8╪/▄░р-&чSтл1щP╡юЭ+`Я%Зж%2ч░╩\aц▀▌%╒Тn3В8')·ц'[inh ╨8■шп╥┌РХ!%#А#AR)ШuлЪжЎ▌L╣SДF\Е-ж▄}HР¤▓-,x∙V║Ud\╪e╬OЛm!BТЖ▒L\ar╝=фсэ*2\w>uЎБD▌C176*╡┼м6rpxГ_Йm 7J,-ашлХШ┼ИЙЛ|∙╗Z┬'IV&┬ЖЬ_┬йкy4ЫюЄ ┘╛Дh5╡пЦ█=y б**JxР55ъмEШ─о+Ы─YIИ╦Гiсx\ИэZў▐н)т╢m╟╘лzНD~Dжa╩vGБ┐?GЫ┤еТ┌s)*х└п▐*∙├cSMм▌mеGмЛ╫мй╦Ц├-нkijЩ[з"#Чхюб┴╘фЎeEr@Ttф-о<╒:┤ТI#zъ╫$\▀Bc┘oПЗсьжkлШbбFTЕ/tаРT .rXЛj╕t┌╢б(BBGPаm QRPРг─БйдRN-тcэ-Nf#И╖6J╓╢XФ╙к 6фх )°┐б 9єлЫТ-▒'[8Жц|╡┬ЖJЪq/CО]A@м└╪_\─ыm-ЛhRВФДХНEДмYi D^ЩdЬXЫr│Y─"FСД[─х╩i╣╠лx$+*╝k7М,С|╞Ў9Няz▒DШLс3МPи4╥Ь2VтдОSн╔7╡пЦ ялPДДd =V╥Б┤%%)BBOЖЩI┼╝ZZ╞#>-Це$йD╢╬&eК╢pE╥Соа№ь╖╛Ц┌k┬Zmшm)=`Z╜╒И│Х┼sxЕL┘(ЕП┼zDн─g"║ХЧ╩╓pж╩xЫf▒_дАzкбXВ▓═║ЬU╓T▐)║K╦xЕе>Sefуf═ьоБr4ннHJ┼ЦРб╘EыЁ┤┘╥A7 ОЮ║УL╖N-1x°■|к ╔b3?3КЪb3OР√∙╘ВJєТTnВP╜·jп}┤`°Jб╧vD╒6┬Мз ╗$*эЁHJu ░╜Жз6╗fэEYu n"Йm Vdб ┌╫вжU╒ЛO/Ыvi°Ў.ы^%ЧКМ║l╬RТАEў OМ. ╝k▌&фБ┬▀h1(А┬U6:Jф┼u ║СЩЇ├]EБ7ЇU┴i▓вв┌JПF┤,┤лfm┬┬щ eЮfнO/Еn-И┤0д╗ЇйK╚|!jM▄╫(ёJo╞фcин┴1=+ДЇаЦЕ кv└ХЕй. ЕУ├@zoz┘wh╔У"r v┌Wрi▒┴┤Н-├гкнжўf1)К&Ы5|*`f&╬╩sqч▒н╜╜~щ_шTH ╜Б ў╨ъMхнш╬>Є▒,Up%!╒е╢№'tФа(фPI6]┼ФI╛дОЛ ▌╙~/ш╙т№▌8QM6│u╢Х▓/R)jqbfЎkXМЙ ШС╘Є╝EBС!∙ККз\╘╩╦{┌╞╞▀8шmт╦%╣ВDrC╔JxвTЖT|FЖk(*├Й@3,,E┌РХЛ-!CиЛ╫юTх╦aЦ╓╡┤╡\й8▒1f┐В╗хЎгNTдx#ng6 vЎQ╒@╞ц─█в├aп)m 7J,-ашпUb-xХgкэ`;8о*▄╝bS fH1█▀(Zэ!G(¤ №═@╨[╞╫╓#И>жб╡3,WМt║·;┴SЭ] Pл) ╕╜Жd▐ў╖ЙЖИ▓х╚Sы|╩x;ХiMЫ!!:X_ВR5ъйЛm[:лp╕╜g,╗N-11╩ °╓9MR6|е╩SO0Щ J├д-╡!j ди╪▐┴[}x╒Л#,S░∙ы┼%%ее|)╡, дeI А╨>Ъ╢▌адз"lгr-─╤(JРРС╘к┼,╒Л{G▐ ├Z┬'IV&┬ЖЬ_┬йкy4ЫюЄ ┘╛Дh5╡пЦ╪e╚Klэ─b╧f├ЭRШo┬NV╫║BА"·В╗МжуBу[Xm QRPРг─Бйп═╙~7ш╙у|э8╘╦6kZЬ╫╖х !птlBV=sє▌f3╤]│╔Шж█╜┌╩A\l8┌¤ЧУфы nnэг*2}j╣ё^GМ ╛vЙ&црБ}E^╨дДй ) ╨дДй ) ╣~YМ_Ў▀ьвnKРзbШ|╠зШДЗ┘aч╦К.Эх┴$▐┌7еь/щи°Dщ*─╪@Р╙Бы°B5O/цУ}▐A╗7╨Н╢╡Є█eHYXH╠xЫk@┌вдб!GЙSLжн6Ю_?Я╦PЭ4ЧеФтeK8М╠bдRЖ мuР▒7л zTЦё2▓ЦбюВТтжШ┴N\В └<м./ru╢Ч█Ц│f▌г5я|вўп╒!+ZBЗQйЦZ╓жё╦спIЬ·░n╩Ъ╦KuтЕ(>ZKрg░А2шРм└l@╤B│ьы┼╫е┤-фе-ДБ+┬Hё╕.└Х^ўЎ:,╤m HJРТС└авPФ !!#и U╦╬ь╬$M3LG╦╒)J╙БJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRГ ╘ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(жT: Я╤╩■∙╙\т╧уёЎСx╗╪·C╓K▒╝ДdЯK\╪·Mяs}яhpШxд&L┼I╚└RВXРжоIH╫)╫ынoф╬¤╠K Qs▀Aя·si┐ЦГ°ЭпЯёЯз' 2чт5▐Ў~$hX╢╥▒.ЖУ чФтпЭюХW╞~ЬЯ№╦ЯИ╨}UЎ┘┬▀сйм■┤T( ╢╚■  MgївВM)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J ╒ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: Я╤╩■∙╙Zїl8Я╤╩■∙╙Zї<щ═ж■Zтv╛╞~ЬЯ№╦ЯИ╫╨?╙ЫM№┤─э| М¤9?∙Ч?а·к?э▓?Е┐├RВ╦wXBЦRТrзК┤р=5?э▓?Е┐├RГhzэ8Рд-%*Iщj(BЖ5.^0├kП5vDЕСdх╡%РЮ?4_2┐┼├JcX╘┤╧Уиє[JmРж┬x╝юLу^ '─ЇУz═Дь│1f1%°меm4Wт■ХngPї&╔ ЇzK┘ffbО╚r+!╚hиГоD]┬птR╬S■Mr╡V{є`ъ~Сч·ь╪[Yqд,бH*H9U┼>Гщиєхо2YmдЕ?%═╙Y╛hVU(Уш$·xt╘Ж█C-!ж╥Д$%)pВtC)--╡Д?═ы*"р+)Nгдв>║щ7│┼M│sGfF&╠└ЙшНр┴Х╕╣-ТРТ lТ ╙BгGE╡╦jK┴в╙╠ХЛ┤зQФ:?├їkccnН ▒°╔М?uЕ0єJh╢┬Js I$Ёсn│шгPe╣)Чg>█йКвжwh╩TвТЬ╩ЇхQ╨XjzЕNnУТcЫё№mЖ'╗┴ф╣!┤%iB╛ё*╛а▐┌eК5[ТЩvsэ║Шк*gvМеJ))╠пNUЖзиTцщ9&9ггjpї!JZd5Фп0[ZН┌мч ,Ю$·EоtйS1vбMnг╚uч[SНЖР^RЕя─\щU*┘╔ю┼qз%G╗нMiE-лA!AwЇ(}ХЪzхЭб├P╦иDФ├{9-(┤вT▐ДЇ|┼н№_N╣╜VцыУ j·_с ╓ыi{Ф!(╞}q▄╛UРV╥ЗA╕┐╛ув╝р╥]ЫБ└Ф∙╫у6т╚║КA?ямhЗ23.;мr▐╛╖RrФ&└еВRло╝с0ё ? D']МсО┬aIBЗ═Mон}Зж│╬ю╙хЫO▌У ФЩkЪ░$!IРжЯОэ┬─щbнFПbэ4ЄРИЄm│giHAA╓ц▌6лОХГЕКFЭ!щD[rЭ▐╕BВБ е ЯЁЎ╫▒ИзЗ╗0╖юW╨вRе(йV Н.I·¤TчeШг7╦*ёDИ▒▀n,зLД╥ё╥,Нr╡└╡яQgу▐З▒.4GЯ╛ЖФGш╬ї-й'_Эr@ш╕ъп╠G~cн8WIKAJA {й!$Xк· п10'г`g 2QnN¤ХДXhюї!C°┤6╢Х>жв0в"g~╦(є╤╓√м╗('0~╔░ў╨СoucНК5%р╤iцJ┼┌Sи╩с·╡▒▒╖FЖ▐D92тIПЙ╕╙ИР┘hбДФАТ:У{Ы аиX~╧°$ЎЯR!А┴% mвVЕ:▄╪hMь┘WЫvЫ╧3╞╒ Ь╕aрфvФDД6┌С|ж■ЫжЧш▒╡хRN┴ж=fSL┼ЦЧI+AR╨з.T╜мI']u6шлЖўЫдoJKЩFbСa~Ыz)┐2╝Щc/ч├ ┘н┬mH[Лqym▒u-V&┬■АO╒X┼╥ъ_╦ fёДднв╪ ёЙ lMЕ═П=U√Л┬z|d2╧ГР Z_ARTЫ4 Г{·+╞Ж9ЗoК╦)e│L$Ж╙k°╓$ЫЫ╪·)╬фE/?/8&.ю+ 3╬A}Е;.Хй 6I┘&фЇщ~К╦/jО#╚SLЛ║·P26-rI&· MБмxdЁZПR1"╢FTыJFTц$█╥m╥:к╖┘gq╠l╣¤а.╧╕┘Sй═{6░╕H╙АыйїY╕М)─Ы═б>f4ь\e╕)├ф╝Е2╖ █H9КJ8]CO▀╙jЪь╓╪ИЗ▌B╥VVнуйGВ@ы пF╡L9О?c░ЩL┤╢ФТ[!eDo┼┌Ё&╝╬┬N%З┤╘╡╢ыь╣╜I)ё3╪Л¤█(О╛Ю5yєf╪sЦ ╗╙Ш╙ с╥f8╦щЁTчyТС╝Bx▐╫╡нпГ╥-H°ф)2У└тФQeаЛ+.`=eиz╢:T│╬М'М▀Б░Їцw7iвb.nnMФzm├╙YДNх╦TИ ╢"QHB╝ЖхcП╓?╓ї/SYpн< 9)Оbё┌}H(t┤Еer@H▌6овoъ╛Ц< У1vбMnг╚uч[SНЖР^RЕя─\щUТvY╖$=║j!jB╘╡ЧЫ*ZJЙ*╢╢:ТE┴уnfЇ9+╟#MKНa╞ФВУШч)7Ў¤─ н>дШ┬ЛZ>╚╙ёя├╪Ч#╧З_CJ#ЇgzЦ╘Уп╬╣ t\uUМI*Ф╤Zг=Е[+└}:еV│ДJCС}ТўЕЩMй!![эЁ{f╙╒V╤4gT╫YQ6 K(!#╙н══ ╨UЛ▀Ы5┼mNщ4е+N%)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J ╫ь╘е(жT: Я╤╩■∙╙Zїl8Я╤╩■∙╙Zї<щ═ж■Zтv╛╞~ЬЯ№╦ЯИ╫╨?╙ЫM№┤─э| М¤9?∙Ч?а·к?э▓?Е┐├SY¤hиQ mС№-■Ъ╧ыEЪRФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ RФ ╨ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: Я╤╩■∙╙Zїl8Я╤╩■∙╙Zї<щ═ж■Zтv╛╞~ЬЯ№╦ЯИ╫╨?╙ЫM№┤─э| М¤9?∙Ч?а·к?э▓?Е┐├SY¤hиQ mС№-■ШЕ% ╠ее ТI░╘Ъy.╕Є +╚лЛrЕi╓,б■╡ЖV#ТЙeRЕ└ *6·ЕB┴е4dNЛс▐╗Т╓wBФS║BН║┼╩к)М┬╢ЪbЙ>┌╘├$$H╩nVяК=ZXz}5щМ(═1W┌/¤ЭbИ╝▌~█Йu┤╕Гtм$┌╫╜RХцrbDЦ\Тьt8ы!%─П▌═{_ьсъыrK,╛╦8ыфЖ╤╥л Я░t·║┼Ul╟Нsл╓CШФнё?8хuHE ∙Il@k╟█Й[▌w8k>~Мю;╜╦ы╚═¤Iа║и╞|QЙ 8╝е2_ X▄аТz╕Р>▒Z6╘mи╚┼1п>У8GЖ%░▌╟М═│(gы┼$tUо>№G╢╗mx╖Б╢ю,Чp$й%q╩|o▌-я╙Ц▌4m+NЧИ╦фТ╪ЯfИx~Мю;╜╦ы╚═¤Iнr~7Н"tщC2">тa╔╔m╡6ТrХ6E╒Щ:▄kуi┬Г}еkX╕rF┘a°z1wт╖"Е║├NДХФ-мДtГу/Q─$О║П~N╧G╦6ьЬI°R&б@йЦPуйBЙыPCi═■<╘#3т┐:D&Ю С!O7ct\д¤v?aмОIeЧ┘a╟]|Р┌:UasЎЯWXнcg\ОЭ▓┼╪cTЁШ2)┼Еи Є ┐z┼C^М└tUУ^>▄J▐ы╣├YЁ{Їgq▌ю_^FoъM╒b\Ц[Т╘u╕ы┴E┤Я▐╦k█эсыъ5ет│ЬОЎ:╘|eїE h╔Чс°Y'PС╙ж╢ш╜Нэj║╟В┬p╖x╝ыSсИяfZВЭJAщ╗Jrчии╨_╥ХНэюс═╞MюS╗╧|╣неэ╤zIZе%+JКUoФ╪иГї╫к╒vkЦ╣{ЁУu╩ ▀ю┬єfЁV-Ц¤╦╟╙[UТ┤ei P* ╛д \█ыhпUйcШ{?,р╩УК╠Ж╦РdВ┤╔▌б ПdВtЫtх┐EI╞це/─ F╖ў;┼H .@JWpЧNА▌п╥GM╔J╒╢i╟ж/МЇщJЦ╥Д°B^ %[╧.зК╔╜┴╘ПEWlю$√╕И╖Н=ИтR╙"н`ВХeЯ║RЫл7N_ёPoTо{╡E*21LF+╧д┬сЙl7qу3l╩┴:ёI{╡▄╝QqбIФ┤3$╢╢ў.фйEПFoM╦XС%Ч$╗:╚Iq#ўs^╫√8z║┼`├"в$K71∙hpчKП╗╝$8оЯол0З0ЬQ╟▐,║ь∙ВC┴YVРЧTДz,╥[▒ъ 4їЙ╣,╝√╠6рSмGJn.>╤╙ыъ5есSЬРЎ╘МeЇ┼+t╞Чс°б@б╤ж╢щ╡Епj┐w─█И╗н7╪k▐nЬО5║═ъ╬ї╜jа▒Я>.Rц<e)+ ЭTаР4ы$о▓"K+ИЩi_шT▐Ё(В<[^ eUm_╤ цP?¤╢к▌цТ√2╗фq%*╖QаЁ─╢$йIe╘мд%DАбqЎКЎ╖ЫCН╢еYN\ u╪\╓%┤#5!╪э:бШ'√─$?╨T%)▒2  еnТBОЧ▌льу├╙ши╘DJ╓▒;!жД╕╝е├Х:q!KItЭNхJФ-┬└#д█И5рнrЎ┴Q╘е░шh}(Eнх8ЫЯсKD№C╘(, D: F|▌╤╗д7╜╒ж║ынysМфИП[└є4J N[█м$иBНQ╧┌ V Щ╨Ч!ШTОLo2н!*6ё╧юС├ъ╜K╞Ч"f$е%ЩL0ъ'#Йyiii╫аЕОЫаuЪ ║R░Mx╟Г!Їй -┤еВхЄЛ ыmmъа╩Ф!%E)м▌DЬmkЯиїWк╘бmTйг░й╕JГОе6Ч│Ыit┌■║M┌йQчHa3pФЖ▌Rq/f6╓╔╡¤TCёг╩@nK ╝АnтА=z╫Ч!┼yД0ьf\i╩┌Ы)░░░ш╥РЮ2 ╟}JBЛН%d╖|жт·_[zъпlдт0╢KХЖ8█o▒╫ ╓M╥j7M┐x-}(,─6╪Кы0P▄B░rй╢┼Тв-Ъ▄G┘Q0, М Л>ьf╟ДЦТХн $uСїT]Я└ЧЖ>єя╞И╙КHB g]U┼юoЬ·Mb┴▒\{@ZбBa╢e:├╬Tашm╒6J╘|├є║┼╥рBqх<фFъБ ZЫDZ╓&▌ZzиьOб╢▐И├ИhY┤н░BP╙N╡Й[v├d)ХEИЄ┘u╝л/мбE+([B Б╘хЇК║ЫИM^"м7 mЕHiФ>ЄфТФ,й)┌ТJъ╦щhBB[m!H)H░иTvЁш═╚ЦЁE№3)}TмДх╜║╩BAЇ$U;GЙ╣В7Й;;EX╕ДжsТR▀Д°97k╒jШЎ:`т8╩'! ЙЖ┬jhq╗ХФ+{Ш╓7F╓ыа▓!╨ГvЖь~М▐ўNЪkоФj,═С1 Чф%jQ╜ТРrдuTгыQк #k|?f█ЕxVm╨ПЬЦИIUЬ$[А:Н.="╝I┌Ж█z#!бf╥╢┴CM8 ╔╣kq╕▌#uЧ&я(╦Ц╓╡║н╤Y)AЙИ╤та╖Ж┘A7)m Ю╜+├░ЩzlyК?-(RMоХЩ'мФЯZEHе< c╟)N┼L╒ИхЖ╨XJ`и(Сn╝в¤yGUX? ЩуIt.)RЪёBФ2ц╖^Rа= =u"Фч┬gДь9 Ц\H6╬ЫъУш#Cш&дRФ Є┤!─)╖ЕХ В:НzеФ! б-╢РД$ФдX╘(┤!─)╖ЕХ В:Нzеq ╢"║╠7мкm▒dиЛf╖╤ЎTL c├"─╗Д▒с%деkB@ ▌@$}UgJ╝Щ┐Ё█▄┘ўЫдц═{▐Ўу~ЪЇ№&dKН%╨T╕еJh_┼ P╦Ъ▌yJАЇ(ї╘КPGЯ ЬJ░фВXxeq █:oкOаНаЪСJP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP ╙ь╘е(е(е(жT:╕ФH╥Ы`╚О╙┘se▐ *┌Ої▓аrN8aё{Ф√╜нe■йпов╨bЁH╤p╣bМ%mяKx┬sE^ь╪■М╕ПюТРN╜FГ√-CXгn╩ШоTRTЄ╖╛22Ё6ё@ O^╡"V╣GeoХ┼Ит]t8n╖ЦБ·;ЯBм▓z╨ЮЛ╘W6╗ jD╢VЙ@┴t╖)[Еe`ЕgQшAI╕=@╓|sD$DmkТ╧ДJeцZ╬ФЭъJПюЕ▀-¤&В╓ХO┤xё└b░шЗ"IzCM~Й▓аРзPГr8/A╥EкS8│a╧╧}╖с▒)NMЦ╩RСrлЛt· ъUD}гК№╓!о,╪╧IQKIСH═dХ~аЎС╫Yqй╧Df32Йsд&;%Bс&┼KQ■!jдА:h,к-Ж│МaRp┘ u ╔l╢сiYTRxЛ·FЮг^^┼ШcНЕ-╖ў╥[SНм6KvOU└zEEkw└дM┴Zq/ и2ЙMЦ├кA╒:Ї stjz('@Д`0жМ╣2ом┘ф,)CAеь4╙¤j&А5ВнeЙ╙^B╩╘[}╨дцZєйV╖вO╓jl мbXtiёЙSЪC═Т,JTzНE┴g=-Щ,K╩e┴РияЛ!C°Р┤(ОВHшаё'gгHР╖&[ ║s<├фm╥xТ-╥46#э╓│bK3▄C┴ўт╛БЧ}yS╟)67╫ щияm }╞ОК/"Кs"ФХXёдW╣8т#nпЗb.яZ~К*ХЦ¤ ъWXап└07╠9Еb0╒ П:╥RЁZР хц╘?y$О=)╜MГ│pр╬С3}&C▓Ш HЁЗ3ЗR )*╡└QгXчуОЄ!Х;ёЭ\ж"з┬Щ().:Жєх<@╧IпxTЩ╚╞&сSдвRШО╠Д╝Ц╖z8зSЦ└Юл▀№^К РЁ&a╩C╔Ч1╘5}╙.╜Щ╢┤╢ГОАР.O┬Ў╦C~6/╔S x┬│I▐(I ╙@R}@TМs╥┘Т─╝ж\ ОёH░Q░R?Й BИш$ОК▓анХВ5% Я Ф╦ь╢ЁЦЬ╩ъ╙╘гmu╫ЗYиXМ)P░gрB├Ь╞L╞▄RBsРРOAi╨:ъn;9ь?iЎ2чT╚мЬ┬■+П╢┌┐√Tj╩В с╪4X╦ ▐ДfxиВе:п┼irввmе═├╓1╞q&Ф▌Т─Ф¤тA╠ГыJКншq^Кё││Ю─Ўg ─$e▀JЖ╦╬eФАMЗм╒Х╖щ√V▐)?█П+j▀е┬╖.а ЖTн└?ё~К╡─pїт!н"+▌oе┼'V╟и*╦їб>ЪЯJ╕Уdс╧╟Ж Г╛ъr%юЦябPЇБr= VX▒ЩЕШСЫ 0├im┤'ВRА√eеа=Зн═аЙЙд"ФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФа ╘ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: r T╫╫QjT┐╒5ї╘_ы·■┐ъ■ЛХ■O┼_,у?NO■e╧─kъg■ЛХ■O┼_,у?NO■e╧─h>кП√lПсoЁ╘╓Z*█d Жж│·╤A&Фе╡эк ▓ Я■Z╪k┬┌m█oJэ├0╜лT╒ЦnєqX3ПГ8q6┐ЦЕ▒╠╣\UафKю║█Э KЩЦ~░вбnаMmJОЇmкЁ╘╢зЭ1▄PкSJZ╤ї(8х╧AJGяUТc▓Е!Ц╥б└ДАk╪В─уaщBЦєш[Ж▄Bl П∙ФРs╘j╫VigДсчЙжfўЫ eD╕;Fц╨5Й0Ь3$v_a┤-╟.д╕╢╒sdшFш}жШЎ╠ЄО$ЬN:rAe,8█я8┌ RTдРQн┴Z╕ё┐E╡▒к╞╨М%╚n 9o│#:J\-Е pApqъ55╫Ъa!O:Ж╥Mо╡/ї╓╢┐#gц╖│p╚█═LnR┬╩ўc+сЄ╘Ыиs╞ф·+4М D№cT┬╔├▒,9К[RГа'ys┬┬√х}Впт╦ЭiNeeNckЮбщп-<╙щ*e╘8Рmt(кГMcУМэ Д╬З1╕r╓т№*╠Sря#x╗Л'U$X_Uё╙[еa╪╝\FsШs▒8Г╔y┼╜Ы;J▌б┐ YZ6дjHлo МTSс f #8╕WWпCеGНМс╥фHaЩm)╚юЖV3 TPХЛuш▒├зJЄ Nsjат-к?ВGИє JК╖Д╕д*уKi║O┌zй│Р'a╕sмOTu:╣o╛ E6q┼9m@рVGи ╠■.▄lmм5цЛiv*ф&BЦРПhJТu╕?дIъ╓зеIZBТади\nак└у╜Sр╕┌╖iЦфЖ]╢О%хй├їеjZm╘zjк.╧cQЖHДb`Од x┘▐l2╢sли\ЇVvЮiЇХ2ъH6║┐╒Aоa;:(╠Хж4V█═ЬGТєерRFB╨ РлНnР8V8ЇwФШ3г╢зЬ├еЙдЛХдбmо▌d!┼(ТР:j┴╣QЮ6jCN┌╔X:ър~╩┼Йb├aЧ╓Е8е- ╢┌x╕╡(%)▓F╝╣: 8╢+─т6юрсM-фfR]SЦ!$└ їВoш▒ё 8╬│+mЎc╦Ъ└(К▄{Дмpl(╪Z╫ЫZ┬■К╕4зЛ!╘.P3ъ·ъ4▄QИШc°В?┌ОЬюnHQ иО▓sn&┌P~сzpЬЗ ЙЗ╢╚▒PBBooквр1▐JgNР┌ЩsЦdnФ,PРД6ЛїЖ╥в: ИшлTй+HRTХ В ┴ ─ЙCб mIZ█q╡qmiQJТ}Dxb44▐┘|"Cю>ьwKО(нDIt\УsаUЕ{У│Ш\╜╓¤З╣h4ЛHq6Hр4V╛│нLT°hQJе░Х$╪Вр¤\╚нх╧%ФцNdцp О▒шанХ│╠ Pp ╨С!йH▐-K╞▄CАI ╪▄.k▐r1)xЮ"итDЖZ`7иа%▓тБ╣▄ЧO╪*DьZ4<=Sб o╥╥Б╠т╘Ф!7р.е$\Ё╜ы╞КоlЧс╔Жф9L!)ен+ёTлдСйB┼╕щща┼А╟y)Э:Cje╠FYС║P▒BB┌/╘JJИш*#внк&И#ЖB┌Т╡╢уjт┌╥вХ$·И:Ё"─hj]N╥GzV╦l6з'├pДЛРФ╔mJ?RA?U[TLKF╕Е,.C,Ю7q─╢иГїT║ ЭХОЇMС┴гHmM<╠q )Pm Гъ5mQ0мA╢ i Cs#бЇе\RРазZЧ@е)A ╒ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: r T╫╫Qпы· мйкkы■┐п·┐╫ї¤╘¤+№ЯК╛Y╞~ЬЯ№╦ЯИ╫╘╧¤+№ЯЛ·■╡?,у?NO■e╧─h>кП√lПсoЁ╘╓Z*█d Жж│·╤A&ФеФей[ g█i═▄9Ф░╝Yq╥▒ш╤фzїъ5uX\d┐ЦўкY▄Z∙▓ЫхЇх═ї^Г]ЫКФm|Y# ─╓╠XТг╕т!8аVз)╡ЖаЖ╒и Нc┌ШЭ┼█Фп╙@Ёp┌Ё ▌╗ЩEJ(╕╡╙Фf▒╢R4╛╗m(4мN ╩╪X1fFЫ=─╧a`╛KiР{$Х"═8цр ╣йbэcXь 2ЁрЎ╥b╛Шх &@.▌B┬─Мэ_п-┐v╢к┴ [Sр╟Ъ┴QfCIu▓дФЬкЖЖГ ╓█]ПЗ/hvq р├[SЦ[═eb3─ ╟їжщ╕^╢╡яуk)М> НbDь▐∙╟хб°JП))ЦТ{Y│Э :Сk▀жорр\'╤.3KR└ёфЗуИ╠в╢Ч╪Ю║┤а╓ёhl╧█\)░ўd╞jРейТжB╓жКBПгk╨Їхщ╡H┘9╚лCСдF╔2Nэ╖┌-Р┘yjlt!Iк╓шл╩╞─Жe5╜a─╕М╩NdЫЛВA√"ВЯg[o└▒6Bе╡>V∙╡ ВЧ]SйЇPъ~╗ОГT0%Ц╢>Ш<═ю┤1) 9[> уG)¤фСu 4ЇVюl:зBRBT╗j@╜Б=Bчэ5∙C2г╖";ЙuзЕд▄(Ph│Ё╢Чmd3В╚3\uF ─Uf+,!miб▐еDй:Ё$ЁлMлР╘и░ pЙ▓$"DIMн0Ф╡4А√kX╜╝UeA╕у└V╒J shb3Пр ╔ф┼<жd░ЁnD{:CшSА%B·бO▐╨t╫░ипlЎ(╘d8■┐╤▓╟Г║ъК ┬б═`Ы+мОг[(4|О╨By8}├*ZФ│Е*jшP╧{┘j╫-И╕ Q _mшдр│Wг1зХ¤╨╢Ьe'я║Лї Юол├Н╢єKi╘%╞╓ТХ!Bс@ёtК whр╪Ы{AЗ├e┘Ra:ГdЧФп╘То:8У■Тt@й░a└┘ ЫPёR╠VФЇЗ[h$║╗]k╩:TzаК╦#g░╔XЫxУ╠╕╣-8Чн√А%@XРм╝4сн═°Ъ░q╢▌HKИJ╥Е┼┴╕>░@?U~═┬ ┘|*ФД┐,║РnТА╜:К┴│▀еУНMFмK─JЩWўВmХ╛╥э╓,x│Е-йЁc═`и│!д║┘RJNU ЛГ├C^┘CM░┌J╥RАBmаш╡╗/d▌У1ч├╕P╕еАцЕлS}UЫSщщм╙Ўe╔Ю g0╤╕ОЦОў CЧ" 6ъёSоЙшнВФ╠╝D-Ь1█Kн╣ёе─И║yек╚цVTI╨Tм%NM┌Cд1╪Суг┬-ин yJёN╢│Й╫╫╒W HfS[╓KИ╠дцI╕╕$░В+%.╧~ЦN55▒/*e_▐i╢T~√K╖X▒рjъ░C\g!2╕E│аn╖V╦Ц┌Z▌э╣ ║ын6тT╢TтA╒АE■в N╒¤╟■e █jолY╞q╟#bКАC *█CЙ╣%9UиР}UЖЙ?Ияўсг╦lв▄oюн═wКО7 мm╜∙Ўc╪╧¤З└Є╪ ■4╒╒xm╢┘i 4Д╢┌Ф$X$Б^ыiJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRГ ╫ь╘е(е(е(е(е(жT: r T╫╫¤_Ї1пы· ~▓е■йпп·■┐шbё■┐о┐їщ┐М■ЛХ■O┼¤ZЯЦqЯз' 2чт5ї3 E╩ 'т■┐нO╦8╧╙У Щsёкг■█#°[№55Я╓КЕЎ┘┬▀сйм■┤PIе)@е)@кV┐K╖╖Ъ°6╬т ╗╝q▌х║я║j¤YG^╖Uш,╜>4тTЧу%hJТ~rl╔>ВRГ╫tНmpCU╞1i8~╢ ^,у/ByjДтКС■╬╙Й@╙TчQOlm~Ъ░┼L╣;YЗ┴НМ=<и╕т╚I([YJI─я ╬аБkt╒╠М3Ч HУ3╧ўО4Х+!▄Л╪ВtЇЮ║' ├╤!Щ Г/G@mЧI m#*MоЙ╨u╨Ua2ЧКlуЙ[+Dзу Mйd4·╨Уr╠RБ}5╣░ы}▄sbЁ┼╣И:ЙR ░у╧░S╝ (JЙ╘.o╤╫S╣ ЁOфШ^Яy╣Ёtd╧kf╦k^┌^▓┬├0№7?А┴Нyl√ЖТМ╓с{ xЯ╢Г]╪f[З│╕!wРыП└eИъ╤Х ▌ЕР └IтNЧиж!КгФ$зФ█mнф°Dg#╕├(JФТCDЗ ╨Си■·MБqc ├уKr\x1ЩРэўП6╥R╡▄▄▌@\▄ыX╣ Ё┐ фШ^Яy╛Ёtg╧{ц═k▐·▐Г╙IСeqyQQ!И/8╥Т.R░ВA╓D╟Шk┘V┌├ёam─KiОжИ9└▓R╓бDц╤"└Ы╪ы└▀╒sXМ-М1╪н╩ЙF[РД╕с \~ш9Aуn$ъh р▓$╦╟ё%╩}Еб е8SКB╖ П╓]#\─,H:▐с9v─ЩОGFМ3Й╥zvЪqvї╕уЗ╓Hл$AЖ▄╒═DF)─х[с░бжЕ\H╨}В┐0°,с░╙ТвРе-JY║Ц╡(йJ>ТеmaоАPIнkrr $b╩ot/рr#б╣т╓№==5░RГX▄уЗЧ&5с{xL]ЎL┐▐╢L╖ш∙╫ЇV|мQ╣╦3QЛ%╜╤╖ЖHО┤^уАo[ёЇqЇV┴JiШ╞-'└6┴K┼ЬeшO-PЬQ@R?┘┌q(jЬъ)рMНп╙[ЭEСЖaЄф `╞yрВ▐ё╞Теd ВЫС{NЮУ╫AMКЩrv│Гz,yPq─5РТP╢▓ФТ Й▐ЭA╓щмШLетЫ8т_─Ц╩╤)°┬Sj@Y >┤$▄В3а_MnlZз ├╤!Щ Г/G@mЧI m#*MоЙ╨u╓.B┴№┴9&Гч▐n|3┌┘▓┌╫╢ЧаГА╛ю9▒xb▄─DйXqч╪)▐Ф%Dъ7шыи ╦pЎw.уq° бZ2б[░вA╕ 8l4┼dид)KRЦnенJ*RПдйDЫXkаf ,╧У8)∙)BеЪД_*Gа,ї▌G[X╤vч┼─RЄtu╣С▓СЩHB┐√▒ї╓┼▓┐ЎпЄ═^1}Чs┼╤?|А9ЫA'Ee╦sзfц>ЛX`╪[╕n√z┤+yЦ┘oепяоєTd│с`Ё°▒╞gЪy^о╓ Я║╥Феp}╥ФеФеФеФеФеФеФеФеФеФеФеФеФе ╨ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: r T╨ї _╫¤ ^?╫ї╫■╜7ёе╔JЦ█@x ╝{ о>щgў╜╫礹x█.м$╖bЖд7ИDJ┴/в├╙ZК*Юq N%═жaeJЗ╩░|с4хX>pЪ║uь╬╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T? ╤ь╘и|л╬NUГч нщ╫│Ц╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&RбЄм8M9VЬ&ЪuьkaїBe**┴єД╙Х`∙┬iз^╞╢T&T:rм8MGЁ°╛]m4ы╪╓├ъЗю'Їr┐З■t╫8З┤№Нд^ЎЖP═ФьЯ%│┴Iёu╜НЗа▐╓6▄╢Гy╕m5ЗA3╘х┬Є╝Ж├`G╬"ў╖Gж╡╬Q╞ юЄ ·╞?54ы╪╓├ъД╝щ═ж■Zтv╛╞~ЬЯ№╦ЯИ╫|└╝)1йXДQ ═j+l6зР▓▓ВсW═'бC¤kБу?NO■e╧─k3-╙U5Eтn·OТ─4╝№ЧР╦H▌fZ╘MЖ╛║иЙЛс│▌-CЯCБ9КZp(Б╫змU▐&@u═|Яриb╛П}8|Ю&┌╡~}Хэm єиiмR"▄ZВRФ╝ТTO5п╞▄\ly╚╦ZЦ▄╞Лэ▄▀"СХ АAAtч=Ucq╓*%rЪml) С╨є%GKЛВPRJУ{f╜оvЫ╕─┼▐цbPpьЮ1Ш█╦ф▐м'5╕┌■▒^ЛсоC\╘OОи═л*▐ Й:hO╓>┌Щq╓)q╓*єgТL_ Ющj°Є ╠R╙БD╜=bжRумRумUП╘Ы}Я ╥█к╖╞ЩГ5Ш-▓ьйП$м0╔M╥Б┼j* }5:Юeq╓*У┘╕°ж"╞"Т┬d▓В╥╝!А√n7й▒I"─pAИ╘p√^▄ЯМ╖·Ю█┌$?KМ@ФьШЛ(С 97ншH6*▓БLд▐·t█╬ ┤ьу╧Х0ФаоI╔╗JФАм┐:фЛ╪А НcЛА╦ГXЗ>WфиxьсщBHI*BоM╔7Q#╤^vwfЭ┘┼)Ш╪В yT╢╞╣┬Tам┌f"фzЕ╕╓#=с╣М;M┐oФй;@И3XП.ь╖"HМ╙хMй*Y╛]ва ║Gо╒^┌GЙК;З+ Ш╖ЪТ▄kд╖e-└J-up шщ╡C;р┼мEаьI~█╦ИыЗ1UЭ^`WйВЮCед╚╪є'wsЬЯXBY░Ра|▌!C_Gй3И╘F▐╗+{g ■L1с╦xbИZгФ%?9╠В/pA┐═╓ў░$X┴┼┼█Ф┬7╤%GQiцЦdСв║Ajа╓Юю /Я│░┘zKэс▐│)И+Xl8╔═Ч1мU$оAЙЙ╜╡м$Й╦k╪╫╤U╩╟q'ЎЄv^(┬Э[ёЄe¤j┌A*U╩o`еe╨■слLЫГ┐%J─Ш}йrЬТЄbХgX╫)╬l.AиCbXПМ@Щ XН╩ЪМ7К╨█0╣sKЫЭъ -^X"pєMЎm5SОm<QС$)KФе└RP"m┬┌ёш│{дLYЩ╤дElтоH─Vж╘Ї4ДnВ Аq@e 6ROСй62q И╞cCЛ*3 =╟IuВ▓ Б¤ЇёззLq0╝Z*PГЛ╟P.е╟Ц!Ру─UuСиса╨ao▄c^)=Й;╪E 4┤%йPў┬ъ)%_8kт>╛╜3i│wж (G─ЭЗЗ73лyй6BКР·X I╜А*ZTAр╘щS6oЩЛ7.DЭ╥Zз┴╨Дд╢ж╥тsЫл+Й▄\щК(Я|$%hq╪ьФdtd)╬sХ-DсO╣│/рe─░┌в╢ёNpY╡Тmqуd╨▐▐0&╓╡gЗkXПЕ╩Ь├Й▌й%╢#ЦВ╘rx╩ё╒r,=╣¤WЗiЪm('Ьц!╕jDёХ║0\ё^KA╦ГЫ╞║P(jmо|[v¤╔Чii.%RюЕаPqЦ┘E═Хє╞ЪkяСх)[╖▒2ЇS+┬Kkk╟IяФо·$Сb ░:ЛАЬ╥aNTї╦ЗЙBЪC{ЧZ▐6,TJнШ╟0x oеЦк┼щ╗щSгьДЙОхf{pъ▓XД:$█И░>║Тщ┬^Z7╙▐aен!v╬щРЯш╨Ti╪nMУСД┬╗Е0Р╡ лЇe)╣╨uTЧRЎ#Д╝╤▐└yЎЦАII[DВ╝SkЇш~╬НsgЧt+У3▌&~>*ZRЬz7Кд.щ╩ТЬ╟Kg7╛╛ЛkЮЯF?>3ТЭyа├/!.■МйnВА╥╚OЁпq░ў╤=2х═LЕ2╥┌f═d!*)$м▄Е+─Nа$q╙]КС~WY╖;,ъ9!╪Ш#%ЕфuШон ╡Єи$Р~╤Sо:┼A╞у╣3─"░Эz+нб7ъ) ЯMj~зц.JРp\щ.кD╤ qdф▐)#Rth?▌╫H╕аС,Fr+ёФ┤)╞wа тЫt█2tP^yЪ├╪╞") ТЪSJе.ptJмMпmzGкЖ Хb╤'.cD1l╕╪dМхE%J7Лкac╙о║Nwф╫+s∙~5М┤уИVс╘─uA,╦9wnа╢╖Э еЙ╕┐ЧёЕ╖Й=м6TЗЪB║2й ╠/rай"╞╟и Z┴╘╪f*ееXte!L╟▌┘i╚A@+╛йI┌тжфы|в Фт╥ч"c@? б▓╔9 JКTNoUкт├гQmg╘}/╫1И■ °╔\ХK@qЖС`ев└цёИFж▄@т@м▒х#Ицщn0р╗n 3▓╗pщqXъ VЪixNч#?#kt╙пF lж└X╢ORSи ▄u\T▄>┬`:Ц╨╩╓Ip╖Ф▓Тmk%7╥ЎУ╟д Йк№╔Кm╚└▌y▄4Щ)х╖&C[┼А ВZEьрС╤^б╚tbS`╝╜сk#═*▄^`}!H_∙rё7п8O1ЖС%в├ЛР√╗╡)$д-╒и\ВEьб└╫иq▄М┘╧АЕ;ХЦ╙q·┤f▒>Тем·▓ш ъ┼э┌ЄI╞ЁиoйЙ8МV]E│!nе$\\iъ"╜?Лс▒Ze┘у┤█щ╠╥ЦрcMG_Ў╘╦О▒KО▒WЫ<Р╤-╝J╫ЕNО▓Ф:ї):tzzk&\╠,╔о┤╖%4ЗАi▓АРдГЧRomu JЩ$<╢Ш╧6╙ж┘Vт3дkоАЛщщкИ8$╪├ i№IЗгс╢▌еКл4ж┼╒ЬЇ(Ю&ўЖв╓Ф7qwZФ╝E┴/├├JJR╤vбЧ0(muВ]I╞ЁиoйЙ8МV]E│!nе$\\iъ"Ює╥╖Уd╢є-п;,бмБ&·x╟1[А╛╢╕g\uКСU4╩°╛ж]С>;M╛Ь═)n4╘uёmb{КpхKДыR╞ї 'vр)▐-IJA"ЎP'ж▌мn:┼`Щй▒Ф├К)еIRMКTТХH t╙Z╘▌Ш╦ўDBq╢e╟Kо┼Хk!х!в╥ЫNEZ└и▐ъ╦ъъ7╕ДLш╥"╢qW$b+SjzB7A@8а2ЕБЫ)'ИH╘Ы╠bI}+ЧИ░уi╣╚╠m┘Q╡╡%j╙зKБпa─┬ёhйB/@║ЧXЖCПAU╘VFа[ЖГ@Е▒1-─╟шїК0№tJЮц-5 Лу╟C]@ ╔%JR╕k┼@TД╧g Б╝gО▄Т╨ qk,ШЛ█з¤їЮlA3┴╥з,█O%╒в▀м╦rС~Л/*┐╦n╘ЫО▒Z┤▀У7ЛE╨╤ЛсоC\╘OОи═л*▐ Й:hO╓>┌D┼Ё┘юЦб╧П!└Ь┼-8@ы╙╓*e╟Xе╟Xл═95x╕О╤-╞Г╞9Pj╧0ШК Hy┬ХзчщР$Ы█ълйаeї┤╠Gхnm┐S ═┼ьA Уmrжц╓╙Q|L└Ъ▐6Її╬aM<Д╢Y╚!)+)ё│ё║══╡╖^Ю├▀]v ╘┼LТ │Т@ ╠ВH╩ма BЗК4у|DLCs4╠У1ЦвИJiЗeвrКY\|кф*OO╫А╡╔ZЎ▐/0ыУ?╪T╞Rъ$) а(┘&рРAш ┌рО Б_Л╟ЁsБ├Аe1фY mХ:ЦТZЫ№7RA╣─ъ-qe Шq┘2_KЄЮJR╖МЙ╩ЫхHM═А╠гй&фЇX 7IКlD┼Ё┘юЦб╧П!└Ь┼-8@ы╙╓+Г<ъkИ╖аФе/$Х└ j┬умRумV╣│╔N7ЕC}LI─b▓ъ-Щ u)"туOQщ№_ К╙.╚Яж▀NfФ╖ j:°П╢ж\uК\uКs9!г├\Ж╣иЯQЫVU╝t╨Ям}┤ЙЛс│▌-CЯCБ9КZp(Б╫змT╦О▒KО▒Ng%{[AГ<ъkИ╖аФе/$Х└ k╘Ьo Ж·ШУИ┼e╘[2ъRE┼╞Юв*u╟Xе╟Xз3щ┘ №_ К╙.╚Яж▀NfФ╖ j:°П╢И┼Ё╫!оj'╟Tf╒ХoDЭ4'ыmL╕ы╕ыцrCЙЛс│▌-CЯCБ9КZp(Б╫змV6╢Гy╘4╓)n-A)J^I*'А╒Е╟Xе╟Xз3У ╙╪$уxT7╘─ЬF+.в┘Р╖RТ..4ї^Я┼Ё╪н2ьЙё┌mЇцiKp▒жгпИ√je╟Xе╟Xп│═Ё9!г├\Ж╣иЯQЫVU╝t╨Ям}┤ЙЛс│▌-CЯCБ9КZp(Б╫змT╦О▒KО▒Ng%{[AГ<ъkИ╖аФе/$Х└ k╘Ьo Ж·ШУИ┼e╘[2ъRE┼╞Юв*u╟Xе╟Xз3щ┘ №_ К╙.╚Яж▀NfФ╖ j:°П╢И┼Ё╫!оj'╟Tf╒ХoDЭ4'ыmL╕ы╕ыцrCЙЛс│▌-CЯCБ9КZp(Б╫змV6╢Гy╘4╓)n-A)J^I*'А╒Е╟Xе╟Xз3Т Ьo Ж·ШУИ┼e╘[2ъRE┼╞Юв+╙°╛ж]С>;M╛Ь═)n4╘uёmL╕ы╕ыцrCF/Ж╣ sQ>:г6млx82$щб?X√i├g║ZЗ><Зs┤рQпOXйЧbЧbЬ╬JЎ╢Гy╘4╓)n-A)J^I*'А╫й8▐ ї1'К╦и╢d-╘дЛЛН=DTыО▒KО▒Ng╙▓°╛ж]С>;M╛Ь═)n4╘uёmЛсоC\╘OОи═л*▐ Й:hO╓>┌Щq╓)q╓)╠фнk├g╬К╘9ёф8*)i└вEkзмW ╞~ЬЯ№╦ЯИ╫╨/с1?ёOр]|¤М¤9?∙Ч?пЯ─▀?7╘с-з╦w╘Ю\╫╝&3OeKywИ ╖Л╤z╠╓ЕЧ8lC ╚O║┐#■█#°[№55Я╓Кє▐^лC"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KB"с=Ч╕O║ЬЛДЎ\>с>ъЭJ^KC ╘ыЛДЎ\>с>ъr.┘p√Д√кu*▐R╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююз"с=Ч╕O║зRЧТ╨Г╚╕Oe├ююи╝СЕЎlNс>ъ╕иT╝ЦЕ|▄3 b&ї8d2RТlYMПМGои[ЭЗ╣Й;`L%M /zиj *¤| }╛Гk═б┬0№R*─}─G RP╘Ч╣%#\Д_ыЇї╓в▐ │╦─ЭЖp,UmbJ▒7wK┐@9я} ┼┤╖д]y- Шbw┌р╠ 1х(l▐e;ШОвzOMЗUp gщ╔ ╠╣°Нw╜ЯЙ-┤мBem2Ш╨HKПн╙r╖пу(У  рШ╧╙У ЩsёКэ╬k╗0╘╖T─зХЛк:ї░╡┼zOЎ═А%@З╬Я№:щJ|Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(Ў`^_┘╫N{0//ьые(? ╒╣ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║s┘Бyg])@ч│Є■╬║┼╧&╧∙s ╙оФап╞┤№eжЖ7>$Яb█╦█чfJ╕[в▄zt╡?╩▌Я ╜╕яvПЗJPM┬6єf0ХM_+╬Шфф┤З%ЫР*)╢Tз√чНыФтo7#Ц√J╠█Пнi6╡┴Q"Фа ┘ess/doc/slverb.sty0000664000175000017500000000460212423756516012544 0ustar eddedd\message{slverbatim,} % **************************************** % * slverbATIM * % **************************************** % % The slverbatim environment uses the fixed-width \sltt font, turns blanks into % spaces, starts a new line for each carrige return (or sequence of % consecutive carriage returns), and interprets EVERY character literally. % I.e., all special characters \, {, $, etc. are \catcode'd to 'other'. % % The command \slverb produces in-line slverbatim text, where the argument % is delimited by any pair of characters. E.g., \slverb #...# takes % '...' as its argument, and sets it slverbatim in \sltt font. % % The *-variants of these commands is the same, except that spaces % print as the TeXbook's space character instead of as blank spaces. {\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar {\@gobble}{\ignorespaces}}} {\catcode`\ =\active\gdef\@vobeyspaces{\catcode`\ \active \let \@xobeysp}} % Definition of \@xobeysp chaned on 19 Nov 86 from % \def\@xobeysp{\leavevmode{} } % to prevent line breaks at spaces. Change suggested by % Nelson Beebe % \def\@xobeysp{\leavevmode\penalty10000\ } \begingroup \catcode `|=0 \catcode `[= 1 \catcode`]=2 \catcode `\{=12 \catcode `\}=12 \catcode`\\=12 |gdef|@xslverbatim#1\end{slverbatim}[#1|end[slverbatim]] |gdef|@sxslverbatim#1\end{slverbatim*}[#1|end[slverbatim*]] |endgroup \def\@sslverbatim{\obeyspaces\@slverbatim} \def\@gobble#1{} \def\@slverbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi \leftskip\@totalleftmargin\rightskip\z@ \parindent\z@\parfillskip\@flushglue\parskip\z@ \@tempswafalse \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par} \obeylines \sltt \catcode``=13 \@noligs \let\do\@makeother \dospecials} \def\slverbatim{\@slverbatim \frenchspacing\@vobeyspaces \@xslverbatim} \let\endslverbatim=\endtrivlist \@namedef{slverbatim*}{\@slverbatim\@sxslverbatim} \expandafter\let\csname endslverbatim*\endcsname =\endtrivlist \def\@makeother#1{\catcode`#112\relax} \def\slverb{\begingroup \catcode``=13 \@noligs \sltt \let\do\@makeother \dospecials \@ifstar{\@sslverb}{\@slverb}} \def\@sslverb#1{\def\@tempa ##1#1{##1\endgroup}\@tempa} \def\@slverb{\obeyspaces \frenchspacing \@sslverb} %% \@noligs prevents ?` and !` from being treated as ligatures %% added 19 April 86 \begingroup \catcode``=13 \gdef\@noligs{\let`=\@lquote} \endgroup \def\@lquote{{\kern\z@}`} ess/doc/include-matrix.org0000664000175000017500000000620412423756516014144 0ustar eddeddIf you look in [[file:Makefile][Makefile]], you see that we currently (2012-11) have 6 (six!) master files which '@include' other .texi modules, of course the main one being our manual, [[file:ess.texi][ESS Manual]] (ess.texi). The "shocking" observation was that e.g., currfeat.texi has *not* been included by the manual ess.txi. Another surprise, only when compiling this table: We have much too many "bugs**.texi" (and then bugrept.texi for user bug reporting). |-------------------+------+---------+-----------+---------------+-------+--------| | File / Master: | ess. | readme. | announce. | README.M..S.. | news. | onews. | |-------------------+------+---------+-----------+---------------+-------+--------| | ess-defs.texi | 9 | 7 | 7 | | 2 | 2 | | ../VERSION | 60 | 14 | 14 | | | | | license.texi | 392 | 80 | 66 | | | | | stabilty.texi | 396 | 86 | 50 | | | | | requires.texi | 400 | 92 | 46 | | | | | getting.texi | 310 | 98 | 38 | | | | | installation.texi | 371 | 105 | - | | | | | currfeat.texi | 202 | 122 | 42 | | | | |-------------------+------+---------+-----------+---------------+-------+--------| | newfeat.texi | 297 | 128 | 70 | | 3 | | | onewfeat.texi | 298 | - | - | | | 3 | |-------------------+------+---------+-----------+---------------+-------+--------| | bugrept.texi | 35.. | 134 | 58 | | | | | mailing.texi | 35.. | 140 | 54 | | | | | authors.texi | *1) | 146 | 62 | | | | | credits.texi | 304 | - | - | | | | | help-s.texi | 413 | - | - | | | | | help-sas.texi | 35.. | - | - | 25 | | | | help-bugs.texi | 35.. | - | - | | | | | help-jags.texi | 35.. | - | - | | | | | help-sp.texi | - | - | - | 19 | | | | bugs.texi | 35.. | - | - | | | | |-------------------+------+---------+-----------+---------------+-------+--------| | ms-inst.texi | - | - | - | 12 | | | | bugs-ms.texi | - | - | - | 32 | | | | bugs-s.texi | - | - | - | 39 | | | | bugs-sas.texi | - | - | - | 46 | | | |-------------------+------+---------+-----------+---------------+-------+--------| *1): authors.texi is included *via* credits.texi (Numbers in table are *line numbers* of "@include .." in respective .texi file.) ess/doc/ess.texi0000664000175000017500000041775012632537307012204 0ustar eddedd\input texinfo @c -*-texinfo-*- @comment %**start of header @setfilename ess.info @settitle ESS -- Emacs Speaks Statistics @comment %**end of header @synindex pg fn @include ess-defs.texi @titlepage @title ESS -- Emacs Speaks Statistics ESS version @ESSVER @c --- KEEP this synchronized with ./authors.texi : @c ~~~~~~~~~~~~~~ @author The ESS Developers (A.J. Rossini, R.M. Heiberger, K. Hornik, @author M. Maechler, R.A. Sparapani, S.J. Eglen, @author S.P. Luque, H. Redestig and V. Spinu) @c @author (Formerly by: Doug Bates, Ed Kademan, Frank Ritter @c @author and David Smith) @c @ifhtml @c


    @c @end ifhtml @c @author Current Documentation by The ESS Developers @author Copyright @copyright{} 2002--2014 The ESS Developers @author Copyright @copyright{} 1996--2001 A.J. Rossini @author Original Documentation by David M. Smith @author Copyright @copyright{} 1992--1995 David M. Smith @c (@email{D.M.Smith@@lancaster.ac.uk}) @c @author Department of Mathematics and Statistics @c @author Lancaster University, UK @c @page @c @vskip 0pt plus 1filll @c @sp 2 @author Permission is granted to make and distribute verbatim copies of this @author manual provided the copyright notice and this permission notice are @author preserved on all copies. @author Permission is granted to copy and distribute modified versions of this @author manual under the conditions for verbatim copying, provided that the @author entire resulting derived work is distributed under the terms of a @author permission notice identical to this one. @end titlepage @contents @ifnottex @majorheading ESS --- Emacs Speaks Statistics @dircategory Emacs @direntry * ESS: (ess). Emacs Speaks Statistics (S/S+/R, SAS, BUGS/JAGS and Stata). @end direntry @node Top @top ESS: Emacs Speaks Statistics ESS version @include ../VERSION @display by A.J. Rossini, R.M. Heiberger, K. Hornik, M. Maechler, R.A. Sparapani, S.J. Eglen, S.P. Luque, V. Spinu and H. Redestig. @end display @c (Formerly: Doug @c Bates, Ed Kademan, Frank Ritter and David Smith). @quotation Emacs Speaks Statistics (ESS) provides an intelligent, consistent interface between the user and the software. ESS interfaces with SAS, S-PLUS, R, BUGS/JAGS and other statistical analysis packages on Unix, Linux and Microsoft Windows. ESS is itself a package within the emacs text editor and uses emacs features to streamline the creation and use of statistical software. ESS knows the syntax and grammar of statistical analysis packages and provides consistent display and editing features based on that knowledge. ESS assists in interactive and batch execution of statements written in these statistical analysis languages. @end quotation @end ifnottex @menu * Introduction:: Overview of features provided by this package * Installation:: Installing ESS on your system * Interactive ESS:: Interacting with statistical programs * Entering commands:: Interacting with the ESS process * Evaluating code:: Sending code to the ESS process * Transcript Mode:: Manipulating saved transcript files * Editing objects:: How to create/edit objects and functions * Help:: Reading help files * Completion:: Various completion mechanisms * Developing with ESS:: Tools for package development and debugging * Extras:: Other ESS features for the S family * ESS for S:: Overview of ESS features for the S family * ESS for SAS:: * ESS for BUGS:: * ESS for JAGS:: * Mailing lists/bug reports:: How to get assistance with ESS * Customization:: Customizing ESS * Indices:: @c @detailmenu @c @end menu @node Introduction @chapter Introduction to ESS @cindex introduction The S family (@Sl{}, Splus and R) and SAS statistical analysis packages provide sophisticated statistical and graphical routines for manipulating data. @b{E}macs @b{S}peaks @b{S}tatistics (ESS) is based on the merger of two pre-cursors, S-mode and SAS-mode, which provided support for the S family and SAS respectively. Later on, Stata-mode was also incorporated. ESS provides a common, generic, and useful interface, through emacs, to many statistical packages. It currently supports the S family, SAS, BUGS/JAGS, and Stata with the level of support roughly in that order. A bit of notation before we begin. @emph{emacs} refers to both @emph{GNU Emacs} by the Free Software Foundation, as well as @emph{XEmacs} by the XEmacs Project. The emacs major mode @code{ESS[language]}, where @code{language} can take values such as @code{S}, @code{SAS}, or @code{XLS}. The inferior process interface (the connection between emacs and the running process) referred to as inferior ESS (@code{iESS}), is denoted in the modeline by @code{ESS[dialect]}, where @code{dialect} can take values such as @code{S3}, @code{S4}, @code{S+3}, @code{S+4}, @code{S+5}, @code{S+6}, @code{S+7}, @code{R}, @code{XLS}, @code{VST}, @code{SAS}. Currently, the documentation contains many references to @cite{`S'} where actually any supported (statistics) language is meant, i.e., `S' could also mean `R' or `SAS'. @cindex interactive use of S @cindex using S interactively For exclusively interactive users of S, ESS provides a number of features to make life easier. There is an easy to use command history mechanism, including a quick prefix-search history. To reduce typing, command-line completion is provided for all @Sl{} objects and ``hot keys'' are provided for common @Sl{} function calls. Help files are easily accessible, and a paging mechanism is provided to view them. Finally, an incidental (but very useful) side-effect of ESS is that a transcript of your session is kept for later saving or editing. @cindex transcripts of S sessions No special knowledge of Emacs is necessary when using @Sl{} interactively under ESS. @cindex programming in S For those that use @Sl{} in the typical edit--test--revise cycle when programming @Sl{} functions, ESS provides for editing of @Sl{} functions in Emacs edit buffers. Unlike the typical use of @Sl{} where the editor is restarted every time an object is edited, ESS uses the current Emacs session for editing. In practical terms, this means that you can edit more than one function at once, and that the ESS process is still available for use while editing. Error checking is performed on functions loaded back into S, and a mechanism to jump directly to the error is provided. ESS also provides for maintaining text versions of your @Sl{} functions in specified source directories. @menu * Features:: Why should I use ESS? * New features:: * Credits:: Authors of and contributors to ESS * Latest version:: Getting the latest version of ESS * Manual:: How to read this manual @end menu @node Features @section Why should I use ESS? Statistical packages are powerful software systems for manipulating and analyzing data, but their user interfaces often leave something something to be desired: they offer weak editor functionality and they differ among themselves so markedly that you have to re-learn how to do those things for each package. ESS is a package which is designed to make editing and interacting with statistical packages more uniform, user-friendly and give you the power of emacs as well. @menu * Current Features:: @end menu @node Current Features @subsection Features Overview @include currfeat.texi ESS provides several features which make it easier to interact with the ESS process (a connection between your buffer and the statistical package which is waiting for you to input commands). These include: @itemize @bullet @item @b{Command-line editing} for fixing mistakes in commands before they are entered. The @samp{-e} flag for S-plus provides something similar to this, but here you have the full range of Emacs commands rather than a limited subset. However, other packages do not necessarily have features like this built-in. @xref{Command-line editing}. @item @b{Searchable command history} for recalling previously-submitted commands. This provides all the features of the @samp{Splus -e} history mechanism, plus added features such as history searching. @xref{Command History}. @item @b{Command-line completion} of both object and file names for quick entry. This is similar to @code{tcsh}'s facility for filenames; here it also applies to object names and list components. @xref{Completion}. @item @b{Hot-keys} for quick entry of commonly-used commands in `S' such as @code{objects()} and @code{search()}. @xref{Hot keys}. @item @b{Transcript recording} for a complete record of all the actions in an S session. @xref{Transcript}. @item @b{Interface to the help system}, with a specialized mode for viewing S help files. @xref{Help}. @end itemize If you commonly create or modify @Sl{} functions, you will have found the standard facilities for this (the @samp{fix()} function, for example) severely limiting. Using S's standard features, one can only edit one function at a time, and you can't continue to use @Sl{} while editing. ESS corrects these problems by introducing the following features: @itemize @bullet @item @b{Object editing}. ESS allows you to edit more than one function simultaneously in dedicated Emacs buffers. The ESS process may continue to be used while functions are being edited. @xref{Edit buffer}. @item @b{A specialized editing mode} for @Sl{} code, which provides syntactic indentation and highlighting. @xref{Indenting}. @item @b{Facilities for loading and error-checking source files}, including a keystroke to jump straight to the position of an error in a source file. @xref{Error Checking}. @item @b{Source code revision maintenance}, which allows you to keep historic versions of @Sl{} source files. @xref{Source Files}. @item @b{Facilities for evaluating @Sl{} code} such as portions of source files, or line-by-line evaluation of files (useful for debugging). @xref{Evaluating code}. @end itemize Finally, ESS provides features for re-submitting commands from saved transcript files, including: @itemize @bullet @item @b{Evaluation of previously entered commands}, stripping away unnecessary prompts. @xref{Transcript resubmit}. @end itemize @node New features @section New features in ESS @include newfeat.texi @comment @include onewfeat.texi @node Credits @section Authors of and contributors to ESS @include credits.texi @node Latest version @section Getting the latest version of ESS @include getting.texi @node Manual @section How to read this manual If you need to install ESS, read @ref{Installation} for details on what needs to be done before proceeding to the next chapter. In this manual we use the standard notation for describing the keystrokes used to invoke certain commands. @kbd{C-} means hold the CONTROL key while typing the character . @kbd{M-} means hold the META or EDIT or ALT key down while typing . If there is no META, EDIT or ALT key, instead press and release the ESC key and then type . All ESS commands can be invoked by typing @kbd{M-x command}. Most of the useful commands are bound to keystrokes for ease of use. Also, the most popular commands are also available through the emacs menubar, and finally, if available, a small subset are provided on the toolbar. Where possible, keybindings are similar to other modes in emacs to strive for a consistent user interface within emacs, regardless of the details of which programming language is being edited, or process being run. Some commands, such as @kbd{M-x R} can accept an optional `prefix' argument. To specify the prefix argument, you would type @kbd{C-u} before giving the command. e.g. If you type @kbd{C-u M-x R}, you will be asked for command line options that you wish to invoke the R process with. Emacs is often referred to as a `self-documenting' text editor. This applies to ESS in two ways. First, limited documentation about each ESS command can be obtained by typing @kbd{C-h f}. For example, if you type @kbd{C-h f ess-eval-region}, documentation for that command will appear in a separate *Help* buffer. Second, a complete list of keybindings that are available in each ESS mode and brief description of that mode is available by typing @kbd{C-h m} within an ESS buffer. Emacs is a versatile editor written in both C and lisp; ESS is written in the Emacs lisp dialect (termed `elisp') and thus benefits from the flexible nature of lisp. In particular, many aspects of ESS behaviour can be changed by suitable customization of lisp variables. This manual mentions some of the most frequent variables. A full list of them however is available by using the Custom facility within emacs. (Type @kbd{M-x customize-group RET ess RET} to get started.) @ref{Customization} provides details of common user variables you can change to customize ESS to your taste, but it is recommended that you defer this section until you are more familiar with ESS. @node Installation @chapter Installing ESS on your system @cindex installation The following section details those steps necessary to get ESS running on your system. @menu * Step by step instructions:: * License:: * Stability:: * Requirements:: @end menu @c FIXME: the following contains @node s *and* is also included by readme.texi @c ----- which does *not* include 'requires.texi' @c ==> *must* give node pointer problems! @c @include inst_tar.texi @node Step by step instructions @section Step by step instructions @include installation.texi @node License @section License @include license.texi @node Stability @section Stability @include stabilty.texi @node Requirements @section Requirements @include requires.texi @node Interactive ESS @chapter Interacting with statistical programs As well as using ESS to edit your source files for statistical programs, you can use ESS to run these statistical programs. In this chapter, we mostly will refer by example to running S from within emacs. The emacs convention is to name such processes running under its control as `inferior processes'. This term can be slightly misleading, in which case these processes can be thought of `interactive processes'. Either way, we use the term `iESS' to refer to the Emacs mode used to interact with statistical programs. @menu * Starting up:: * Multiple ESS processes:: * ESS processes on Remote Computers:: * S+elsewhere and ESS-elsewhere:: * Customizing startup:: @end menu @node Starting up @section Starting an ESS process @cindex starting ESS @cindex running S To start an @Sl{} session on Unix or on Windows when you use the Cygwin bash shell, simply type @kbd{M-x S RET}. To start an @Sl{} session on Windows when you use the MSDOS prompt shell, simply type @kbd{M-x S+6-msdos RET}. @pindex S @cindex ESS process directory @cindex starting directory @cindex working directory @cindex directories S will then (by default) ask the question @example S starting data directory? @end example @noindent Enter the name of the directory you wish to start @Sl{} from (that is, the directory you would have @code{cd}'d to before starting @Sl{} from the shell). This directory should have a @file{.Data} subdirectory. You will then be popped into a buffer @cindex ESS process buffer @cindex process buffer with name @samp{*S*} which will be used for interacting with the ESS process, and you can start entering commands. @node Multiple ESS processes @section Running more than one ESS process @cindex multiple ESS processes ESS allows you to run more than one ESS process simultaneously in the same session. Each process has a name and a number; the initial process @cindex process names (process 1) is simply named (using S-PLUS as an example) @samp{S+3:1}. @comment You may start a new process by passing a numeric argument to @comment @kbd{M-x S}. For example, typing @kbd{ESC 2 M-x S} starts up @comment an ESS process with name @samp{S2}, in a buffer whose name @comment is initially @samp{*S2*}. The name of the process is shown in the mode line in square brackets (for example, @samp{[S+3:2]}); this is useful if the process buffer is renamed. Without a prefix argument, @kbd{M-x S} starts a new ESS process, using the first available process number. With a prefix argument (for R), @kbd{C-u M-x R} allows for the specification of command line options. @findex ess-request-a-process You can switch to any active ESS process with the command @samp{M-x ess-request-a-process}. Just enter the name of the process you require; completion is provided over the names of all running S processes. This is a good command to consider binding to a global key. @c SJE - commented outl the default behaviour now is to label *S* rather @c than *S:1*. @c @vindex ess-plain-first-buffername @c For the predecessor to ESS (S-mode 4.8), the initial process was not @c visibly numbered, i.e. S instead of S1 was used in the mode-line. To @c obtain this behavior, set the variable @code{ess-plain-first-buffername} @c to @code{t}. See @file{ess-site} for how to set this for all users. @node ESS processes on Remote Computers @section ESS processes on Remote Computers @findex ess-remote @cindex remote Computers @cindex ESS-elsewhere @cindex S+elsewhere ESS works with processes on remote computers as easily as with processes on the local machine. The recommended way to access a statistical program on remote computer is to start it with tramp. Require tramp in your .emacs file: @code{(require 'tramp)} Now start an ssh session with @samp{C-x f /ssh:user@@host: RET}. Tramp should open a dired buffer in your remote home directory. Now call your favorite ESS process (@code{R}, @code{Julia}, @code{stata} etc) as you would usually do on local machine: @code{M-x R}. Alternatively you can start your process normally (@code{M-x R}). After you are asked for starting directory, simply type @samp{/ssh:user@@host: RET}. R process will be started on the remote machine. To simplify the process even further create a "config" file in your @code{.ssh/} folder and add an account. For example if you use amazon EC2, it might look like following: @verbatim Host amazon Hostname ec2-54-215-203-181.us-west-1.compute.amazonaws.com User ubuntu IdentityFile ~/.ssh/my_amazon_key.pem ForwardX11 yes @end verbatim With this configuration @code{/ssh:amazon:} is enough to start a connection. The ForwardX11 is needed if you want to see R graphic device showing on the current machine Other ways to setup a remote ESS connection are through @code{ess-remote}. @enumerate @item Start a new shell, telnet or ssh buffer and connect to the remote computer (e.g. use, @samp{M-x shell}, @samp{M-x telnet} or @samp{M-x ssh}; ssh.el is available at @uref{http://www.splode.com/~friedman/software/emacs-lisp/src/ssh.el}). @item Start the ESS process on the remote machine, for example with one of the commands @samp{Splus}, or @samp{R}, or @samp{sas -stdio}. @item Start @samp{M-x ess-remote}. You will be prompted for a program name with completion. Choose one. Your process is now known to ESS. All the usual ESS commands (@samp{C-c C-n} and its relatives) now work with the S language processes. For SAS you need to use a different command @samp{C-c i} (that is a regular @samp{i}, not a @samp{C-i}) to send lines from your @file{myfile.sas} to the remote SAS process. @samp{C-c i} sends lines over invisibly. @c and lets SAS display them formatted correctly as in a SAS log file. With ess-remote you get teletype behavior---the data input, the log, and the listing all appear in the same buffer. To make this work, you need to end every PROC and DATA step with a "RUN;" statement. The "RUN;" statement is what tells SAS that it should process the preceding input statements. @item Graphics (interactive) on the remote machine. If you run X11 (@xref{X11}, X Windows) on both the local and remote machines then you should be able to display the graphs locally by setting the @samp{DISPLAY} environment variable appropriately. Windows users can download @samp{xfree86} from cygwin. @item Graphics (static) on the remote machine. If you don't run the X window system on the local machine, then you can write graphics to a file on the remote machine, and display the file in a graphics viewer on the local machine. Most statistical software can write one or more of postscript, GIF, or JPEG files. Depending on the versions of emacs and the operating system that you are running, emacs itself may display @samp{.gif} and @samp{.jpg} files. Otherwise, a graphics file viewer will be needed. Ghostscript/ghostview may be downloaded to display @samp{.ps} and @samp{.eps} files. Viewers for GIF and JPEG are usually included with operating systems. @xref{ESS(SAS)--Function keys for batch processing}, for more information on using the F12 key for displaying graphics files with SAS. @end enumerate Should you or a colleague inadvertently start a statistical process in an ordinary @samp{*shell*} buffer, the @samp{ess-remote} command can be used to convert it to an ESS buffer and allow you to use the ESS commands with it. We have two older commands, now deprecated, for accessing ESS processes on remote computers. @xref{S+elsewhere and ESS-elsewhere}. @node S+elsewhere and ESS-elsewhere @section S+elsewhere and ESS-elsewhere These commands are now deprecated. We recommend @samp{ess-remote}. We have two versions of the elsewhere function. @samp{S+elsewhere} is specific for the S-Plus program. The more general function @samp{ESS-elsewhere} is not as stable. @enumerate @item Enter @samp{M-x S+elsewhere}. You will be prompted for a starting directory. I usually give it my project directory on the local machine, say @samp{~myname/myproject/} Or enter @samp{M-x ESS-elsewhere}. You will be prompted for an ESS program and for a starting directory. I usually give it my project directory on the local machine, say @samp{~myname/myproject/} @item The @samp{*S+3*} buffer will appear with a prompt from the local operating system (the unix prompt on a unix workstation or with cygwin bash on a PC, or the msdos prompt on a PC without bash). emacs may freeze because the cursor is at the wrong place. Unfreeze it with @samp{C-g} then move the cursor to the end with @samp{M->}. With @samp{S+elsewhere} the buffer name is based on the name of the ESS program. @item Enter @samp{telnet myname@@other.machine} (or @samp{ssh myname@@other.machine}). You will be prompted for your password on the remote machine. Use @samp{M-x send-invisible} before typing the password itself. @item Before starting the ESS process, type @samp{stty -echo nl} at the unix prompt. The @samp{-echo} turns off the echo, the @samp{nl} turns off the newline that you see as @samp{^M}. @item You are now talking to the unix prompt on the other machine in the @samp{*S+3*} buffer. cd into the directory for the current project and start the ESS process by entering @samp{Splus} or @samp{R} or @samp{sas -stdio} as appropriate. If you can login remotely to your Windows 2000, then you should be able to run @samp{Sqpe} on the Windows machine. I haven't tested this and no-one has reported their tests to me. You will not be able to run the GUI through this text-only connection. @item Once you get the S or R or SAS prompt, then you are completely connected. All the @samp{C-c C-n} and related commands work correctly in sending commands from @samp{myfile.s} or @samp{myfile.r} on the PC to the @samp{*S+3*} buffer running the S or R or SAS program on the remote machine. @item Graphics on the remote machine works fine. If you run the X window system on the remote unix machine you should be able to display them in @samp{xfree86} on your PC. If you don't run X Windows, or X11, then you can write graphics to the postscript device and copy it to your PC with dired and display it with ghostscript. @end enumerate @node Customizing startup @section Changing the startup actions If you do not wish ESS to prompt for a starting directory when starting a new process, set the variable @code{ess-ask-for-ess-directory} to @vindex ess-ask-for-ess-directory @code{nil}. In this case, the starting directory will be set using one of the following methods: @enumerate @item If the variable @code{ess-directory-function} stores the name of a function, the value returned by this function is used. The default for this variable is nil. @item Otherwise, if the variable @code{ess-directory} stores the name of a directory (ending in a slash), this value is used. The default for this variable is nil. @item Otherwise, the working directory of the current buffer is used. @end enumerate If @code{ess-ask-for-ess-directory} has a non-@code{nil} value (as it does by default) then the value determined by the above rules provides the default when prompting for the starting directory. Incidentally, @code{ess-directory} is an ideal variable to set in @code{ess-pre-run-hook}. If you like to keep a record of your @Sl{} sessions, set the variable @code{ess-ask-about-transfile} to @code{t}, and you will be asked for a filename for the transcript before the ESS process starts. @defvr {User Option} ess-ask-about-transfile If non-@code{nil}, as for a file name in which to save the session transcript. @end defvr @cindex transcript file Enter the name of a file in which to save the transcript at the prompt. If the file doesn't exist it will be created (and you should give it a file name ending in @samp{.St}); if the file already exists the transcript will be appended to the file. (Note: if you don't set this variable but you still want to save the transcript, you can still do it later --- @pxref{Saving transcripts}.) Once these questions are answered (if they are asked at all) the S process itself is started by calling the program name specified in the variable @code{inferior-ess-program}. @vindex inferior-ess-program If you need to pass any arguments to this program, they may be specified in the variable @code{inferior-@var{S_program_name}-args} (e.g. if @code{inferior-ess-program} is @code{"S+"} then the variable to set is @code{inferior-S+-args}. @cindex arguments to S program It is not normally necessary to pass arguments to the @Sl{} program; in particular do not pass the @samp{-e} option to @code{Splus}, since ESS provides its own command history mechanism. By default, the new process will be displayed in the same window in the current frame. If you wish your S process to appear in a separate variable, customize the variable @code{inferior-ess-own-frame}. Alternatively, change @code{inferior-ess-same-window} if you wish the process to appear within another window of the current frame. @node Entering commands @chapter Interacting with the ESS process @cindex entering commands @cindex commands @cindex sending input The primary function of the ESS package is to provide an easy-to-use front end to the @Sl{} interpreter. This is achieved by running the S process from within an Emacs buffer, called hereafter @emph{inferior} buffer, which has an active @code{inferior-ess-mode}. The features of Inferior @Sl{} mode are similar to those provided by the standard Emacs shell mode (@pxref{Shell Mode,,, emacs, The Gnu Emacs Reference Manual}). Command-line completion of @Sl{} objects and a number of `hot keys' for commonly-used @Sl{} commands are also provided for ease of typing. @menu * Command-line editing:: Entering commands and fixing mistakes * Transcript:: Manipulating the transcript * Command History:: Command History * History expansion:: References to historical commands * Hot keys:: Hot keys for common commands * Statistical Process running in ESS?:: * Emacsclient:: Using emacsclient * Other:: Other commands provided by inferior-ESS @end menu @node Command-line editing @section Entering commands and fixing mistakes @cindex command-line editing Sending a command to the ESS process is as simple as typing it in and pressing the @key{RETURN} key: @deffn Command inferior-ess-send-input @kindex RET @kbd{RET} Send the command on the current line to the ESS process. @end deffn If you make a typing error before pressing @kbd{RET} all the usual Emacs editing commands are available to correct it (@pxref{Basic, Basic, Basic editing commands, emacs, The GNU Emacs Reference Manual}). Once the command has been corrected you can press @key{RETURN} (even if the cursor is not at the end of the line) to send the corrected command to the ESS process. Emacs provides some other commands which are useful for fixing mistakes: @table @kbd @item C-c C-w @findex backward-kill-word @code{backward-kill-word} Deletes the previous word (such as an object name) on the command line. @item C-c C-u @findex comint-kill-input @code{comint-kill-input} Deletes everything from the prompt to point. Use this to abandon a command you have not yet sent to the ESS process. @item C-c C-a @findex comint-bol @code{comint-bol} Move to the beginning of the line, and then skip forwards past the prompt, if any. @end table @xref{Shell Mode,,, emacs, The Gnu Emacs Reference Manual}, for other commands relevant to entering input. @node Transcript @section Manipulating the transcript Most of the time, the cursor spends most of its time at the bottom of the ESS process buffer, entering commands. However all the input and output from the current (and previous) ESS sessions is stored in the process buffer (we call this the transcript) and often we want to @cindex transcript move back up through the buffer, to look at the output from previous commands for example. Within the process buffer, a paragraph @cindex paragraphs in the process buffer is defined as the prompt, the command after the prompt, and the output from the command. Thus @kbd{M-@{} and @kbd{M-@}} move you backwards and forwards, respectively, through commands in the transcript. A particularly useful command is @kbd{M-h} (@code{mark-paragraph}) which will allow you to mark a command and its entire output (for deletion, perhaps). For more information about paragraph commands, @pxref{Paragraphs, Paragraphs, Paragraphs, emacs, The GNU Emacs Reference Manual}. If an ESS process finishes and you restart it in the same process buffer, the output from the new ESS process appears after the output from the first ESS process separated by a form-feed (@samp{^L}) character. Thus pages in the ESS @cindex pages in the process buffer process buffer correspond to ESS sessions. Thus, for example, you may use @kbd{C-x [} and @kbd{C-x ]} to move backward and forwards through ESS sessions in a single ESS process buffer. For more information about page commands, @pxref{Pages, Pages, Pages, emacs, The GNU Emacs Reference Manual}. @menu * Last command:: Manipulating the output from the last command * Process buffer motion:: Viewing older commands * Transcript resubmit:: Re-submitting commands from the transcript * Saving transcripts:: Keeping a record of your S session @end menu @node Last command @subsection Manipulating the output from the last command Viewing the output of the command you have just entered is a common occurrence and ESS provides a number of facilities for doing this. @c Within the ESS process buffer, the variable @code{scroll-step} @c @vindex scroll-step @c is set to 4 (you can redefine this using @code{inferior-ess-mode-hook} @c @vindex inferior-ess-hook @c if you wish - @pxref{Hooks},) so that the cursor is usually near the @c bottom of the window. Whenever a command produces a longish output, it is possible that the window will scroll, leaving the next prompt near the middle of the window. The first part of the command output may have scrolled off the top of the window, even though the entire output would fit in the window if the prompt were near the bottom of the window. If this happens, you can use the following comint commands: @code{comint-show-maximum-output} to move to the end of the buffer, and place cursor on bottom line of window to make more of the last output visible. To make this happen automatically for all inputs, set the variable @code{comint-scroll-to-bottom-on-input} to @code{t} or @code{'this}. If the first part of the output is still not visible, use @cindex reading long command outputs @kbd{C-c C-r} (@code{comint-show-output}), @findex comint-show-output which moves cursor to the previous command line and places it at the top of the window. Finally, if you want to discard the last command output altogether, use @cindex deleting output @kbd{C-c C-o} (@code{comint-kill-output}), @findex comint-kill-output which deletes everything from the last command to the current prompt. Use this command judiciously to keep your transcript to a more manageable size. @node Process buffer motion @subsection Viewing older commands If you want to view the output from more historic commands than the previous command, commands are also provided to move backwards and forwards through previously entered commands in the process buffer: @table @kbd @item C-c C-p @findex comint-previous-input @code{comint-previous-input} Moves point to the preceding command in the process buffer. @item C-c C-n @findex comint-next-input @code{comint-next-input} Moves point to the next command in the process buffer. @end table @noindent Note that these two commands are analogous to @kbd{C-p} and @kbd{C-n} but apply to command lines rather than text lines. And just like @kbd{C-p} and @kbd{C-n}, passing a prefix argument to these commands means to move to the @var{ARG}'th next (or previous) command. (These commands are also discussed in @ref{Shell History Copying,,Shell History Copying,emacs, The GNU Emacs Reference Manual}.) There are also two similar commands (not bound to any keys by default) which move to preceding or succeeding commands, but which first prompt for a regular expression (@pxref{Regexps,,Syntax of Regular Expression,emacs, The GNU Emacs Reference Manual}), and then moves to the next (previous) command matching the pattern. @table @code @item comint-backward-matching-input regexp arg @findex comint-backward-matching-input @itemx comint-forward-matching-input regexp arg @findex comint-forward-matching-input Search backward (forward) through the transcript buffer for the @var{arg}'th previous (next) command matching @var{regexp}. @var{arg} is the prefix argument; @var{regexp} is prompted for in the minibuffer. @end table @node Transcript resubmit @subsection Re-submitting commands from the transcript When moving through the transcript, you may wish to re-execute some of the commands you find there. ESS provides three commands to do this; these commands may be used whenever the cursor is within a command line in the transcript (if the cursor is within some command @emph{output}, an error is signalled). Note all three commands involve the @key{RETURN} key. @table @kbd @item RET @code{inferior-ess-send-input} @xref{Command-line editing}. @item C-c RET @findex comint-copy-old-input @code{comint-copy-old-input} Copy the command under the cursor to the current command line, but don't execute it. Leaves the cursor on the command line so that the copied command may be edited. @end table When the cursor is not after the current prompt, the @key{RETURN} key has a slightly different behavior than usual. Pressing @kbd{RET} on any line containing a command that you entered (i.e. a line beginning with a prompt) sends that command to the ESS process once again. If you wish to edit the command before executing it, use @kbd{C-c RET} instead; it copies the command to the current prompt but does not execute it, allowing you to edit it before submitting it. These commands work even if the current line is a continuation line (i.e. the prompt is @samp{+} instead of @samp{>}) --- in this case all the lines that form the multi-line command are concatenated together and the resulting command is sent to the ESS process (currently this is the only way to resubmit a multi-line command to the ESS process in one go). If the current line does @cindex multi-line commands, resubmitting not begin with a prompt, an error is signalled. This feature, coupled with the command-based motion commands described above, could be used as a primitive history mechanism. ESS provides a more sophisticated mechanism, however, which is described in @ref{Command History}. @node Saving transcripts @subsection Keeping a record of your S session To keep a record of your @Sl{} session in a disk file, use the Emacs command @kbd{C-x C-w} (@code{write-file}) to attach a file to the ESS process buffer. The name of the process buffer will (probably) change to the name of the file, but this is not a problem. You can still use @Sl{} as usual; just remember to save the file before you quit Emacs with @kbd{C-x C-s}. You can make ESS prompt you for a filename in which to save the transcript every time you start @Sl{} by setting the variable @vindex ess-ask-about-transfile @code{ess-ask-about-transfile} to @code{t}; @xref{Customizing startup}. @cindex transcript file names We recommend you save your transcripts with filenames that end in @samp{.St}. There is a special mode (ESS transcript mode --- @pxref{Transcript Mode}) for editing transcript files which is automatically selected for files with this suffix. @cindex editing transcripts S transcripts can get very large, so some judicious editing is appropriate if you are saving it in a file. Use @kbd{C-c C-o} whenever a command produces excessively long output (printing large arrays, for example). Delete erroneous commands (and the resulting error messages or other output) by moving to the command (or its output) and typing @kbd{M-h C-w}. Also, remember that @kbd{C-c C-x} (and other hot keys) may be used for commands whose output you do not wish to appear in the transcript. These suggestions are appropriate even if you are not saving your transcript to disk, since the larger the transcript, the more memory your Emacs process will use on the host machine. Finally, if you intend to produce @Sl{} source code (suitable for using with @code{source()} or inclusion in an @Sl{} function) from a transcript, then the command @code{ess-transcript-clean-region} may be of use. @pxref{Clean, Transcript Mode} @node Command History @section Command History @cindex command history @cindex editing commands @cindex re-executing commands ESS provides easy-to-use facilities for re-executing or editing previous commands. An input history of the last few commands is maintained (by default the last 500 commands are stored, although this can be changed by setting the variable @code{comint-input-ring-size} in @vindex comint-input-ring-size @code{inferior-ess-mode-hook}.) The simplest history commands simply select the next and previous commands in the input history: @table @kbd @item M-p @findex comint-previous-input @code{comint-previous-input} Select the previous command in the input history. @item M-n @findex comint-next-input @code{comint-next-input} Select the next command in the input history. @end table @noindent For example, pressing @kbd{M-p} once will re-enter the last command into the process buffer after the prompt but does not send it to the ESS process, thus allowing editing or correction of the command before the ESS process sees it. Once corrections have been made, press @kbd{RET} to send the edited command to the ESS process. If you want to select a particular command from the history by matching it against a regular expression (@pxref{Regexps,,Syntax of Regular Expression,emacs, The GNU Emacs Reference Manual}), to search for a particular variable name for example, these commands are also available: @table @kbd @item M-r @findex comint-history-isearch-backward-regexp @code{comint-history-isearch-backward-regexp} Prompt for a regular expression, and search backwards through the input history for a command matching the expression. @c @item M-s @c @findex comint-next-matching-input @c @code{comint-next-matching-input} Prompt for a regular expression, and @c search backwards through the input history for a command matching the @c expression. @end table @noindent A common type of search is to find the last command that began with a particular sequence of characters; the following two commands provide an easy way to do this: @table @kbd @item C-c M-r @findex comint-previous-matching-input-from-input @code{comint-previous-matching-input-from-input} Select the previous command in the history which matches the string typed so far. @item C-c M-s @findex comint-next-matching-input-from-input @code{comint-next-matching-input-from-input} Select the next command in the history which matches the string typed so far. @end table @noindent Instead of prompting for a regular expression to match against, as they instead select commands starting with those characters already entered. For instance, if you wanted to re-execute the last @code{attach()} command, you may only need to type @kbd{att} and then @kbd{C-c M-r} and @kbd{RET}. @xref{Shell Ring,,Shell History Ring,emacs, The GNU Emacs Reference Manual}, for a more detailed discussion of the history mechanism, and do experiment with the @code{In/Out} menu to explore the possibilities. Many ESS users like to have even easier access to these, and recommend to add something like @example (eval-after-load "comint" '(progn (define-key comint-mode-map [up] 'comint-previous-matching-input-from-input) (define-key comint-mode-map [down] 'comint-next-matching-input-from-input) ;; also recommended for ESS use -- (setq comint-scroll-to-bottom-on-output 'others) (setq comint-scroll-show-maximum-output t) ;; somewhat extreme, almost disabling writing in *R*, *shell* buffers above prompt: (setq comint-scroll-to-bottom-on-input 'this) )) @end example to your @file{.emacs} file, where the last two settings are typically desirable for the situation where you work with a script (e.g., @file{code.R}) and send code chunks to the process buffer (e.g. @code{*R*}). Note however that these settings influence all @code{comint}-using emacs modes, not just the ESS ones, and for that reason, these customization cannot be part of @code{ESS} itself. @menu * Saving History:: @end menu @node Saving History @subsection Saving the command history The @code{ess-history-file} variable, which is @code{t} by default, together with @code{ess-history-directory}, governs if and where the command history is saved and restored between sessions. By default, @code{ess-history-directory} is @code{nil}, and the command history will be stored (as text file) in the @code{ess-directory}, e.g., as @file{.Rhistory}. Experienced ESS users often work exclusively with script files rather than in a (e.g., @code{*R}) console session, and may not want to save any history files, and hence have: @smallexample (setq ess-history-file nil) @end smallexample @noindent or will only want one global command history file and have: @smallexample (setq ess-history-directory "~/.R/") @end smallexample @noindent in your @file{.emacs} file. @node History expansion @section References to historical commands Instead of searching through the command history using the command described in the previous section, you can alternatively refer to a historical command directly using a notation very similar to that used in @code{csh}. History references are introduced by a @samp{!} or @samp{^} character and have meanings as follows: @table @samp @item !! The immediately previous command @item !-@var{N} The @var{N}th previous command @item !text The last command beginning with the string @samp{text} @item !?text The last command containing the string @samp{text} @end table In addition, you may follow the reference with a @dfn{word designator} to select particular @dfn{words} of the input. A word is defined as a sequence of characters separated by whitespace. (You can modify this definition by setting the value of @code{comint-delimiter-argument-list} to a list of characters that are allowed to separate words and @vindex comint-delimiter-argument-list themselves form words.) Words are numbered beginning with zero. The word designator usually begins with a @samp{:} (colon) character; however it may be omitted if the word reference begins with a @samp{^}, @samp{$}, @samp{*} or @samp{-}. If the word is to be selected from the previous command, the second @samp{!} character can be omitted from the event specification. For instance, @samp{!!:1} and @samp{!:1} both refer to the first word of the previous command, while @samp{!!$} and @samp{!$} both refer to the last word in the previous command. The format of word designators is as follows: @table @samp @item 0 The zeroth word (i.e. the first one on the command line) @item @var{n} The @var{n}th word, where @var{n} is a number @item ^ The first word (i.e. the second one on the command line) @item $ The last word @item @var{x}-@var{y} A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}} @item * All the words except the zeroth word, or nothing if the command had just one word (the zeroth) @item @var{x}* Abbreviates @var{x}-$ @item @var{x}- Like @samp{@var{x}*}, but omitting the last word @end table In addition, you may surround the entire reference except for the first @samp{!} by braces to allow it to be followed by other (non-whitespace) characters (which will be appended to the expanded reference). Finally, ESS also provides quick substitution; a reference like @samp{^old^new^} means ``the last command, but with the first occurrence of the string @samp{old} replaced with the string @samp{new}'' (the last @samp{^} is optional). Similarly, @samp{^old^} means ``the last command, with the first occurrence of the string @samp{old} deleted'' (again, the last @samp{^} is optional). To convert a history reference as described above to an input suitable for S, you need to @dfn{expand} the history reference, using the @key{TAB} key. For this to work, the cursor must be preceded by a space (otherwise it would try to complete an object name) and not be within a string (otherwise it would try to complete a filename). So to expand the history reference, type @kbd{SPC TAB}. This will convert the history reference into an @Sl{} command from the history, which you can then edit or press @key{RET} to execute. For example, to execute the last command that referenced the variable @code{data}, type @kbd{!?data SPC TAB RET}. @node Hot keys @section Hot keys for common commands ESS provides a number of commands for executing the commonly used functions. These commands below are basically information-gaining commands (such as @code{objects()} or @code{search()}) which tend to clutter up your transcript and for this reason some of the hot keys display their output in a temporary buffer instead of the process buffer by default. This behavior is controlled by the following option: @defvr {User Option} ess-execute-in-process-buffer If non-@code{nil}, means that these commands will produce their output in the process buffer instead. @end defvr In any case, passing a prefix argument to the commands (with @kbd{C-u}) will reverse the meaning of @code{ess-execute-in-process-buffer} for that command, i.e. the output will be displayed in the process buffer if it usually goes to a temporary buffer, and vice-versa. These are the hot keys that behave in this way: @deffn Command ess-execute-objects @var{posn} @kindex C-c C-x @pindex objects() @cindex objects @kbd{C-c C-x} Sends the @code{objects()} command to the ESS process. A prefix argument specifies the position on the search list (use a negative argument to toggle @code{ess-execute-in-process-buffer} as well). A quick way to see what objects are in your working directory. A prefix argument of 2 or more means get objects for that position. A negative prefix argument @var{posn} gets the objects for that position, as well as toggling @code{ess-execute-in-process-buffer}. @end deffn @deffn Command ess-execute-search @var{invert} @kindex C-c C-s @pindex search() @cindex search list @kbd{C-c C-s} Sends the @code{inferior-ess-search-list-command} command to the @code{ess-language} process; @code{search()} in S. Prefix @var{invert} toggles @code{ess-execute-in-process-buffer}. @end deffn @code{ess-execute} may seem pointless when you could just type the command in anyway, but it proves useful for `spot' calculations which would otherwise clutter your transcript, or for evaluating an expression while partway through entering a command. You can also use this command to generate new hot keys using the Emacs keyboard macro facilities; @pxref{Keyboard Macros, Keyboard Macros, Keyboard Macros, emacs, The GNU Emacs Reference Manual}. @cindex hot keys @cindex keyboard short cuts The following hot keys do not use @code{ess-execute-in-process-buffer} to decide where to display the output --- they either always display in the process buffer or in a separate buffer, as indicated: @c @deffn Command ess-execute-attach @var{dir} @var{posn} @c @pindex attach() @c Prompts for a directory @var{dir} to attach to the ESS process with the @c @code{attach()} command. If a numeric prefix argument @var{posn} is @c given, it is used as the position on the search list to attach the @c directory; otherwise the @Sl{} default of 2 is used. The @c @code{attach()} command actually executed appears in the process buffer. @c @end deffn @deffn Command ess-load-file @var{filename} @kindex C-c C-l @kbd{C-c C-l} Prompts for a file (@var{filename}) to load into the ESS process using @code{source()}. If there is an error during loading, you can jump to the error in the file with the following function. @end deffn @deffn Command ess-parse-errors @var{arg} @var{reset} @kindex C-x ` @kindex C-c ` @kbd{C-c `} or @kbd{C-x `} Visits next @code{next-error} message and corresponding source code. If all the error messages parsed so far have been processed already, the message buffer is checked for new ones. A prefix @var{arg} specifies how many error messages to move; negative means move back to previous error messages. Just @kbd{C-u} as a prefix means reparse the error message buffer and start at the first error. The @var{reset} argument specifies restarting from the beginning. @xref{Error Checking}, for more details. @end deffn @deffn Command ess-display-help-on-object @var{object} @var{command} @kindex C-c C-v @kbd{C-c C-v} Pops up a help buffer for an @Sl{} @var{object} or function. If @var{command} is supplied, it is used instead of @code{inferior-ess-help-command}. See @ref{Help} for more details. @end deffn @deffn Command ess-quit @kindex C-c C-q @pindex q() @findex ess-cleanup @cindex quitting from ESS @cindex killing the ESS process @cindex cleaning up @cindex temporary buffers, killing @cindex killing temporary buffers @kbd{C-c C-q} Issue an exiting command to the inferior process, additionally also running @code{ess-cleanup} for disposing of any temporary buffers (such as help buffers and edit buffers) that may have been created. Use this command when you have finished your @Sl{} session instead of simply quitting at the inferior process prompt, otherwise you will need to issue the command @code{ess-cleanup} explicitly to make sure that all the files that need to be saved have been saved, and that all the temporary buffers have been killed. @end deffn @node Statistical Process running in ESS? @section Is the Statistical Process running under ESS? @cindex STERM @pindex STERM For the S languages (S, S-Plus, R) ESS sets an option in the current process that programs in the language can check to determine the environment in which they are currently running. ESS sets @code{options(STERM="iESS")} for S language processes running in an inferior @code{@iESS{[S]}} or @code{@iESS{[R]}} buffer. ESS sets @code{options(STERM="ddeESS")} for independent S-Plus for Windows processes running in the GUI and communicating with ESS via the DDE (Microsoft Dynamic Data Exchange) protocol through a @code{ddeESS[S]} buffer. Other values of @code{options()$STERM} that we recommend are: @itemize @bullet @item @code{length}: Fixed length xterm or telnet window. @item @code{scrollable}: Unlimited length xterm or telnet window. @item @code{server}: S-Plus Stat Server. @item @code{BATCH}: BATCH. @item @code{Rgui}: R GUI. @item @code{Commands}: S-Plus GUI without DDE interface to ESS. @end itemize Additional values may be recommended in the future as new interaction protocols are created. Unlike the values @code{iESS} and @code{ddeESS}, ESS can't set these other values since the S language program is not under the control of ESS. @node Emacsclient @section Using emacsclient @cindex emacsclient When starting R or S under Unix, ESS sets @code{options(editor="emacsclient")}. (Under Microsoft Windows, it will use gnuclient.exe rather than emacsclient, but the same principle applies.) Within your R session, for example, if you have a function called @code{iterator}, typing @code{fix(iterator)}, will show that function in a temporary Emacs buffer. You can then correct the function. When you kill the buffer, the definition of the function is updated. Using @code{edit()} rather than @code{fix()} means that the function is not updated. Finally, the S function @code{page(x)} will also show a text representation of the object @code{x} in a temporary Emacs buffer. @node Other @section Other commands provided by inferior-ESS The following commands are also available in the process buffer: @deffn Command comint-interrupt-subjob @kindex C-c C-c @cindex aborting S commands @cindex interrupting S commands @kbd{C-c C-c} Sends a Control-C signal to the ESS process. This has the effect of aborting the current command. @end deffn @deffn Command ess-switch-to-inferior-or-script-buffer @var{toggle-eob} @kindex C-c C-z @kbd{C-c C-z} When in process buffer, return to the most recent script buffer. When in a script buffer pop to the associated process buffer. This is a single key command, that is @kbd{C-c C-z C-z} from a script buffer returns to the original buffer. If @var{toggle-eob} is given, the value of @code{ess-switch-to-end-of-proc-buffer} is toggled. @end deffn @defvr {User Option} ess-switch-to-end-of-proc-buffer If non-@code{nil}, @code{ess-switch-to-inferior-or-script-buffer} goes to end of process buffer. @end defvr Other commands available in Inferior @Sl{} mode are discussed in @ref{Shell Mode,,, emacs, The Gnu Emacs Reference Manual}. @node Evaluating code @chapter Sending code to the ESS process Other commands are also available for evaluating portions of code in the S process. These commands cause the selected code to be evaluated directly by the ESS process as if you had typed them in at the command line; the @code{source()} function is not used. You may choose whether both the commands and their output appear in the process buffer (as if you had typed in the commands yourself) or if the output alone is echoed. The behavior is controlled by the variable: @defvr {User Option} ess-eval-visibly Non-@code{nil} means @code{ess-eval-*} commands display commands and output in the process buffer. Default is @code{t}. @end defvr Passing a prefix (@kbd{C-u}) @var{vis} to any of the following commands, however, reverses the meaning of @code{ess-eval-visibly} for that command only --- for example @kbd{C-u C-c C-j} @comment these remarks only make sense IF the default is nil (which it is NOT) @comment echoes the current line of S (or other) code in the ESS process @comment buffer, followed by its output. This method of evaluation is an suppresses the current line of S (or other) code in the ESS process buffer. This method of evaluation is an alternative to S's @code{source()} function @pindex source() @cindex echoing commands when evaluating @cindex evaluating code with echoed commands when you want the input as well as the output to be displayed. (You can sort of do this with @code{source()} when the option @code{echo=T} is set, except that prompts do not get displayed. ESS puts prompts in the right places.) Primary commands for evaluating code are: @cindex evaluating S expressions @deffn Command ess-eval-region-or-line-and-step @var{vis} Send the highlighted region or current line and step to next line of code. @end deffn @deffn Command ess-eval-region-or-function-or-paragraph @var{vis} @kindex C-M-x @kbd{C-M-x} Sends the current selected region or function or paragraph. @end deffn @deffn Command ess-eval-region-or-function-or-paragraph-and-step @var{vis} @kindex C-C C-c @kbd{C-c C-c} Like @code{ess-eval-region-or-function-or-paragraph} but steps to next line of code. @end deffn Other, not so often used, evaluation commands are: @deffn Command ess-eval-line @var{vis} @kindex C-C C-j @kbd{C-c C-j} Sends the current line to the ESS process. @end deffn @deffn Command ess-eval-line-and-go @var{vis} @kindex C-C M-j @kbd{C-c M-j} Like @code{ess-eval-line} but additionally switches point to the ESS process. @end deffn @deffn Command ess-eval-function @var{vis} @var{no-error} @kindex C-C C-f @kbd{C-c C-f} Sends the @Sl{} function containing point to the ESS process. @end deffn @deffn Command ess-eval-function-and-go @var{vis} @kindex C-C M-f @kbd{C-c M-f} Like @code{ess-eval-function} but additionally switches point to the ESS process. @end deffn @deffn Command ess-eval-region @var{start} @var{end} @var{toggle} @var{message} @kindex C-C C-r @kbd{C-c C-r} Sends the current region to the ESS process. @end deffn @deffn Command ess-eval-region-and-go @var{start} @var{end} @var{vis} @kindex C-C M-r @kbd{C-c M-r} Like @code{ess-eval-region} but additionally switches point to the ESS process. @end deffn @deffn Command ess-eval-buffer @var{vis} @kindex C-C C-b @kbd{C-c C-b} Sends the current buffer to the ESS process. @end deffn @deffn Command ess-eval-buffer-and-go @var{vis} @kindex C-C M-b @kbd{C-c M-b} Like @code{ess-eval-buffer} but additionally switches point to the ESS process. @end deffn All the above @code{ess-eval-*} commands are useful for evaluating small amounts of code and observing the results in the process buffer for debugging purposes, or for generating transcripts from source files. When editing S functions, it is generally preferable to use @kbd{C-c C-l} to update the function's value. In particular, @code{ess-eval-buffer} is now largely obsolete. A useful way to work is to divide the frame into two windows; one containing the source code and the other containing the process buffer. If you wish to make the process buffer scroll automatically when the output reaches the bottom of the window, you will need to set the variable @code{comint-scroll-to-bottom-on-output} to @code{'others} or @code{t}. @node Transcript Mode @chapter Manipulating saved transcript files Inferior @Sl{} mode records the transcript (the list of all commands executed, and their output) in the process buffer, which can be saved as a @dfn{transcript file}, which should normally have the suffix @file{.St}. The most obvious use for a transcript file is as a static record of the actions you have performed in a particular @Sl{} session. Sometimes, however, you may wish to re-execute commands recorded in the transcript file by submitting them to a running ESS process. This is what Transcript Mode is for. If you load file a with the suffix @file{.St} into Emacs, it is placed in S Transcript Mode. Transcript Mode is similar to Inferior @Sl{} mode (@pxref{Entering commands}): @cindex transcript mode motion @cindex motion in transcript mode paragraphs are defined as a command and its output, and you can move though commands either with the paragraph commands or with @kbd{C-c C-p} and @kbd{C-c C-n}. @menu * Resubmit:: Resubmitting commands from the transcript file * Clean:: Cleaning transcript files @end menu @node Resubmit @section Resubmitting commands from the transcript file Three commands are provided to re-submit command lines from the transcript file to a running ESS process. They are: @deffn Command ess-transcript-send-command @kindex M-RET @kbd{M-RET} Sends the current command line to the ESS process, and execute it. @end deffn @deffn Command ess-transcript-copy-command @kindex C-c RET @kbd{C-c RET} Copy the current command to the ESS process, and switch to it (ready to edit the copied command). @end deffn @deffn Command ess-transcript-send-command-and-move @kindex RET @kbd{RET} Sends the current command to the ESS process, and move to the next command line. This command is useful for submitting a series of commands. @end deffn @noindent Note that the first two commands are similar to those on the same keys in inferior @Sl{} Mode. In all three cases, the commands should be executed when the cursor is on a command line in the transcript; the prompt is automatically removed before the command is submitted. @node Clean @section Cleaning transcript files Yet another use for transcript files is to extract the command lines for inclusion in an @Sl{} source file or function. Transcript mode provides one command which does just this: @deffn Command ess-transcript-clean-region @var{beg} @var{end} @var{even-if-read-only} @kindex C-c C-w @kbd{C-c C-w} Strip the transcript in the region (given by @var{beg} and @var{end}), leaving only commands. Deletes any lines not beginning with a prompt, and then removes the prompt from those lines that remain. Prefix argument @var{even-if-read-only} means to clean even if the buffer is read-only. Don't forget to remove any erroneous commands first! @end deffn @noindent The remaining command lines may then be copied to a source file or edit buffer for inclusion in a function definition, or may be evaluated directly (@pxref{Evaluating code}) using the code evaluation commands from @Sl{} mode, also available in @Sl{} Transcript Mode. @node Editing objects @chapter Editing objects and functions @cindex editing functions ESS provides facilities for editing @Sl{} objects within your Emacs session. Most editing is performed on @Sl{} functions, although in theory you may edit datasets as well. Edit buffers are always associated with files, although you may choose to make these files temporary if you wish. Alternatively, you may make use of a simple yet powerful mechanism for maintaining backups of text representations of @Sl{} functions. Error-checking is performed when @Sl{} code is loaded into the ESS process. @menu * Edit buffer:: Edit objects in a specialized buffer * Loading:: Loading source files into the ESS process * Error Checking:: Detecting errors in source files * Indenting:: Indenting and formatting S code * Other edit buffer commands:: Commands for motion, completion and more * Source Files:: Maintaining @Sl{} source files * Source Directories:: Names and locations of dump files @end menu @node Edit buffer @section Creating or modifying S objects @cindex edit buffer To edit an @Sl{} object, type @deffn Command ess-dump-object-into-edit-buffer @var{object} @kindex C-c C-e C-d @kbd{C-c C-e C-d} Edit an @Sl{} @var{object} in its own edit buffer. @end deffn from within the ESS process buffer (@code{*S*}). You will then be prompted for an object to edit: you may either type in the name of an existing object (for which completion is available using the @kbd{TAB} key), @cindex completion, when prompted for object names or you may enter the name of a new object. @cindex creating new objects @cindex new objects, creating A buffer will be created containing the text representation of the requested object or, if you entered the name of a non-existent object at the prompt and the variable @code{ess-function-template} @vindex ess-function-template is non-@code{nil}, you will be presented with a template defined by that variable, which defaults to a skeleton function construct. You may then edit the function as required. The edit buffer generated by @code{ess-dump-object-into-edit-buffer} is placed in the @code{ESS} major mode which provides a number of commands to facilitate editing @Sl{} source code. Commands are provided to intelligently indent @Sl{} code, evaluate portions of @Sl{} code and to move around @Sl{} code constructs. @cindex dump files @cindex reverting function definitions Note: when you dump a file with @kbd{C-c C-e C-d}, ESS first checks to see whether there already exists an edit buffer containing that object and, if so, pops you directly to that buffer. If not, ESS next checks whether there is a file in the appropriate place with the appropriate name (@pxref{Source Files}) and if so, reads in that file. You can use this facility to return to an object you were editing in a previous session (and which possibly was never loaded to the @Sl{} session). Finally, if both these tests fail, the ESS process is consulted and a @code{dump()} command issued. @pindex dump() If you want to force ESS to ask the ESS process for the object's definition (say, to reformat an unmodified buffer or to revert back to S's idea of the object's definition) pass a prefix argument to @code{ess-dump-object-into-edit-buffer} by typing @kbd{C-u C-c C-e C-d}. @node Loading @section Loading source files into the ESS process The best way to get information --- particularly function definitions --- into @Sl{} is to load them in as source file, using S's @code{source} function. You have already seen how to create source files using @kbd{C-c C-e C-d}; ESS provides a complementary command for loading source files (even files not created with ESS!) into the ESS process, namely @code{ess-load-file} (@kbd{C-c C-l}). @findex ess-load-file @pindex source() @pxref{Hot keys}. @noindent After typing @kbd{C-c C-l} you will prompt for the name of the file to load into S; usually this is the current buffer's file which is the default value (selected by simply pressing @kbd{RET} at the prompt). You will be asked to save the buffer first if it has been modified (this happens automatically if the buffer was generated with @kbd{C-c C-e C-d}). The file will then be loaded, and if it loads successfully you will be returned to the ESS process. @node Error Checking @section Detecting errors in source files @cindex errors @cindex parsing errors If any errors occur when loading a file with @code{C-c C-l}, ESS will inform you of this fact. In this case, you can jump directly to the line in the source file which caused the error by typing @kbd{C-c `} (@code{ess-parse-errors}). @kindex C-c ` @findex ess-parse-errors You will be returned to the offending file (loading it into a buffer if necessary) with point at the line @Sl{} reported as containing the error. You may then correct the error, and reload the file. Note that none of the commands in an @Sl{} source file will take effect if any part of the file contains errors. Sometimes the error is not caused by a syntax error (loading a non-existent file for example). In this case typing @kbd{C-c `} will simply display a buffer containing S's error message. You can force this behavior (and avoid jumping to the file when there @emph{is} a syntax error) by passing a prefix argument to @code{ess-parse-errors} with @kbd{C-u C-c `}. @node Indenting @section Indenting and formatting S code ESS provides a sophisticated mechanism for indenting @Sl{} source code (thanks to Ken'ichi Shibayama). Compound statements (delimited by @samp{@{} and @samp{@}}) are indented relative to their enclosing block. In addition, the braces have been electrified to automatically indent to the correct position when inserted, and optionally insert a newline at the appropriate place as well. Lines which continue an incomplete expression are indented relative to the first line of the expression. Function definitions, @code{if} statements, calls to @code{expression()} and loop constructs are all recognized and indented appropriately. User variables are provided to control the amount of indentation in each case, and there are also a number of predefined indentation styles to choose from. @cindex comments in S Comments are also handled specially by ESS, using an idea borrowed from the Emacs-Lisp indentation style. By default, comments beginning with @samp{###} are aligned to the beginning of the line. Comments beginning with @samp{##} are aligned to the current level of indentation for the block containing the comment. Finally, comments beginning with @samp{#} are aligned to a column on the right (the 40th column by default, but this value is controlled by the variable @code{comment-column},) @vindex comment-column or just after the expression on the line containing the comment if it extends beyond the indentation column. You turn off the default behavior by adding the line @code{(setq ess-indent-with-fancy-comments nil)} to your @file{.emacs} file. @vindex ess-indent-with-fancy-comments ESS also supports Roxygen entries which is R documentation maintained in the source code as comments @xref{Roxygen}. The indentation commands provided by ESS are: @cindex indenting @cindex formatting source code @deffn Command ess-indent-or-complete @kindex TAB @kbd{TAB} Indents the current line as @Sl{} code. Try to indent first, and if code is already properly indented, complete instead. In ess-mode, only tries completion if @code{ess-tab-complete-in-script} is non-nil. See also @code{ess-first-tab-never-complete}. @end deffn @defvr {User Option} ess-tab-complete-in-script If non-@code{nil}, @kbd{TAB} in script buffers tries to complete if there is nothing to indent. @end defvr @defvr {User Option} ess-first-tab-never-complete If non-@code{nil}, @kbd{TAB} never tries to complete in ess-mode. The default @code{'symbol} does not try to complete if the next char is a valid symbol constituent. There are more options, see the help (@kbd{C-h v}). @end defvr @deffn Command ess-indent-exp @kindex C-M-q @kindex M-C-q @kindex ESC C-q @kbd{TAB} Indents each line in the @Sl{} (compound) expression which follows point. Very useful for beautifying your @Sl{} code. @end deffn @deffn Command ess-electric-brace @kindex @{ @kindex @} @kbd{@{} @kbd{@}} The braces automatically indent to the correct position when typed. @end deffn The following Emacs command are also helpful: @table @kbd @item RET @itemx LFD @kindex C-j @code{newline-and-indent} Insert a newline, and indent the next line. (Note that most keyboards nowadays do not have a @key{LINEFEED} key, but @key{RET} and @kbd{C-j} are equivalent.) @item M-; @kindex M-; @code{indent-for-comment} Indents an existing comment line appropriately, or inserts an appropriate comment marker. @end table @menu * Styles:: Changing indentation styles @end menu @node Styles @subsection Changing indentation styles The combined value of nine variables that control indentation are collectively termed a @i{style}. ESS provides several styles covering the common styles of indentation: @code{DEFAULT}, @code{OWN}, @code{GNU}, @code{BSD}, @code{K&R}, @code{C++}, @code{RRR}, @code{CLB}. The variable @code{ess-style-alist} lists the value of each indentation variable per style. @deffn Command ess-set-style @kindex C-c . @kbd{C-c .} Sets the formatting style in this buffer to be one of the predefined styles, including @code{GNU}, @code{BSD}, @code{K&R}, @code{CLB}, and @code{C++}. The @code{DEFAULT} style uses the default values for the indenting variables; The @code{OWN} style allows you to use your own private values of the indentation variable, see below. @example (setq ess-default-style 'C++) @end example @end deffn @defvr {User Option} ess-default-style The default value of @code{ess-style}. See the variable @code{ess-style-alist} for how these groups (DEFAULT, OWN, GNU, BSD, @dots{}) map onto different settings for variables. @end defvr @defvr {User Option} ess-style-alist Predefined formatting styles for ESS code. Values for all groups, except OWN, are fixed. To change the value of variables in the OWN group, customize the variable @code{ess-own-style-list}. The default style in use is controlled by @code{ess-default-style}. @end defvr The styles @code{DEFAULT} and @code{OWN} are initially identical. If you wish to edit some of the default values, set @code{ess-default-style} to @code{'OWN} and change @code{ess-own-style-list}. @xref{Customization}, for convenient ways to set both these variables. If you prefer not to use the custom facility, you can change individual indentation variables within a hook, for example: @example (defun myindent-ess-hook () (setq ess-indent-level 4)) (add-hook 'ess-mode-hook 'myindent-ess-hook) @end example In the rare case that you'd like to add an entire new indentation style of your own, copy the definition of @code{ess-own-style-list} to a new variable and ensure that the last line of the @code{:set} declaration calls @code{ess-add-style} with a unique name for your style (e.g. @code{'MINE}). Finally, add @code{(setq ess-default-style 'MINE)} to use your new style. @node Other edit buffer commands @section Commands for motion, completion and more A number of commands are provided to move across function definitions in the edit buffer: @deffn Command ess-goto-beginning-of-function-or-para @kindex ESC C-a @kindex C-M-a @kbd{ESC C-a} aka @kbd{C-M-a} If inside a function go to the beginning of it, otherwise go to the beginning of paragraph. @end deffn @deffn Command ess-goto-end-of-function-or-para @kindex ESC C-e @kindex C-M-e @kbd{ESC C-e} aka @kbd{C-M-e} Move point to the end of the function containing point. @end deffn @deffn Command ess-mark-function @kindex ESC C-h @kindex C-M-h @kbd{ESC C-h} aka @kbd{C-M-h} Place point at the beginning of the @Sl{} function containing point, and mark at the end. @end deffn @noindent Don't forget the usual Emacs commands for moving over balanced expressions and parentheses: @xref{Lists, Lists and Sexps, Lists and Sexps, Emacs, The GNU Emacs Reference Manual}. @cindex completion in edit buffer Completion is provided in the edit buffer in a similar fashion to the process buffer: @key{TAB} first indents, and if there is nothing to indent, completes the object or file name; @kbd{M-?} lists file completions. See @xref{Completion}, for more. Finally, @kbd{C-c C-z} (@code{ess-switch-to-inferior-or-script-buffer}) returns you to the @code{iESS} process buffer, if done from a script buffer, placing point at the end of the buffer. If this is done from the @code{iESS} process buffer, point is taken to the script buffer. In addition some commands available in the process buffer are also available in the script buffer. You can still read help files with @kbd{C-c C-v}, edit another function with @kbd{C-c C-e C-d} and of course @kbd{C-c C-l} can be used to load a source file into S. @node Source Files @section Maintaining S source files Every edit buffer in ESS is associated with a @dfn{dump file} on disk. Dump files are created whenever you type @kbd{C-c C-e C-d} (@code{ess-dump-object-into-edit-buffer}), and may either be deleted after use, or kept as a backup file or as a means of keeping several versions of an @Sl{} function. @cindex dump files @defvr {User Option} ess-delete-dump-files If non-@code{nil}, dump files created with C-c C-e C-d are deleted immediately after they are created by the ess-process. @end defvr Since immediately after @Sl{} dumps an object's definition to a disk file the source code on disk corresponds exactly to S's idea of the object's definition, the disk file isn't needed; deleting it now has the advantage that if you @emph{don't} modify the file (say, because you just wanted to look at the definition of one of the standard S functions) the source dump file won't be left around when you kill the buffer. Note that this variable only applies to files generated with S's @code{dump} function; it doesn't apply to source files which already exist. The default value is @code{t}. @defvr {User Option} ess-keep-dump-files Variable controlling whether to delete dump files after a successful load. If @samp{nil}: always delete. If @samp{ask}, confirm to delete. If @samp{check}, confirm to delete, except for files created with @code{ess-dump-object-into-edit-buffer}. Anything else, never delete. This variable only affects the behaviour of @code{ess-load-file}. Dump files are never deleted if an error occurs during the load. @end defvr After an object has been successfully (i.e. without error) loaded back into @Sl{} with @kbd{C-c C-l}, the disk file again corresponds exactly (well, almost --- see below) to S's record of the object's definition, and so some people prefer to delete the disk file rather than unnecessarily use up space. This option allows you to do just that. @cindex comments @cindex project work in S @cindex historic backups If the value of @code{ess-keep-dump-files} is @code{t}, dump files are never deleted after they are loaded. Thus you can maintain a complete text record of the functions you have edited within ESS. Backup files are kept as usual, and so by using the Emacs numbered backup facility --- @pxref{Backup Names, Single or Numbered Backups, Single or Numbered Backups, emacs, The Gnu Emacs Reference Manual}, you can keep a historic record of function definitions. Another possibility is to maintain the files with a version-control system such as RCS @xref{Version Control, Version Control, Version Control, emacs, The Gnu Emacs Reference Manual}. As long as a dump file exists in the appropriate place for a particular object, editing that object with @kbd{C-c C-e C-d} finds that file for editing (unless a prefix argument is given) --- the ESS process is not consulted. Thus you can keep comments @emph{outside} the function definition as a means of documentation that does not clutter the @Sl{} object itself. Another useful feature is that you may format the code in any fashion you please without @Sl{} re-indenting the code every time you edit it. These features are particularly useful for project-based work. If the value of @code{ess-keep-dump-files} is nil, the dump file is always silently deleted after a successful load with @kbd{C-c C-l}. While this is useful for files that were created with @kbd{C-c C-e C-d} it also applies to any other file you load (say, a source file of function definitions), and so can be dangerous to use unless you are careful. Note that since @code{ess-keep-dump-files} is buffer-local, you can make sure particular files are not deleted by setting it to @code{t} in the Local Variables section of the file @xref{File Variables, Local Variables in Files, Local Variables in Files, emacs, The Gnu Emacs Reference Manual}. A safer option is to set @code{ess-keep-dump-files} to @code{ask}; this means that ESS will always ask for confirmation before deleting the file. Since this can get annoying if you always want to delete dump files created with @code{C-c C-e C-d}, but not any other files, setting @code{ess-keep-dump-files} to @code{check} (the default value) will silently delete dump files created with @kbd{C-c C-e C-d} in the current Emacs session, but query for any other file. Note that in any case you will only be asked for confirmation once per file, and your answer is remembered for the rest of the Emacs session. Note that in all cases, if an error (such as a syntax error) is detected while loading the file with @kbd{C-c C-l}, the dump file is @emph{never} deleted. This is so that you can edit the file in a new Emacs session if you happen to quit Emacs before correcting the error. @cindex autosaving Dump buffers are always autosaved, regardless of the value of @code{ess-keep-dump-files}. @node Source Directories @section Names and locations of dump files @cindex dump file names Every dump file should be given a unique file name, usually the dumped object name with some additions. @defvr {User Option} ess-dump-filename-template Template for filenames of dumped objects. @code{%s} is replaced by the object name. @end defvr @noindent By default, dump file names are the user name, followed by @samp{.} and the object and ending with @samp{.S}. Thus if user @code{joe} dumps the object @code{myfun} the dump file will have name @file{joe.myfun.S}. The username part is included to avoid clashes when dumping into a publicly-writable directory, such as @file{/tmp}; you may wish to remove this part if you are dumping into a directory owned by you. @cindex dump file directories You may also specify the directory in which dump files are written: @defvr {User Option} ess-source-directory Directory name (ending in a slash) where @Sl{} dump files are to be written. @end defvr By default, dump files are always written to @file{/tmp}, which is fine when @code{ess-keep-dump-files} is @code{nil}. If you are keeping dump files, then you will probably want to keep them somewhere in your home directory, say @file{~/S-source}. This could be achieved by including the following line in your @file{.emacs} file: @cindex @file{.emacs} file @example (setq ess-source-directory (expand-file-name "~/S-source/")) @end example If you would prefer to keep your dump files in separate directories depending on the value of some variable, ESS provides a facility for this also. By setting @code{ess-source-directory} to a lambda expression which evaluates to a directory name, you have a great deal of flexibility in selecting the directory for a particular source file to appear in. The lambda expression is evaluated with the process buffer as the current buffer and so you can use the variables local to that buffer to make your choice. For example, the following expression causes source files to be saved in the subdirectory @file{Src} of the directory the ESS process was run in. @example (setq ess-source-directory (lambda () (concat ess-directory "Src/"))) @end example @noindent @vindex ess-directory (@code{ess-directory} is a buffer-local variable in process buffers which records the directory the ESS process was run from.) This is useful if you keep your dump files and you often edit objects with the same name in different ESS processes. Alternatively, if you often change your @Sl{} working directory during an @Sl{} session, you may like to keep dump files in some subdirectory of the directory pointed to by the first element of the current search list. This way you can edit objects of the same name in different directories during the one S session: @cindex search list @cindex working directory @example (setq ess-source-directory (lambda () (file-name-as-directory (expand-file-name (concat (car ess-search-list) "/.Src"))))) @end example @vindex ess-search-list If the directory generated by the lambda function does not exist but can be created, you will be asked whether you wish to create the directory. If you choose not to, or the directory cannot be created, you will not be able to edit functions. @node Help @chapter Reading help files @cindex help files ESS provides an easy-to-use facility for reading @Sl{} help files from within Emacs. From within the ESS process buffer or any ESS edit buffer, typing @kbd{C-c C-v} (@code{ess-display-help-on-object}) @findex ess-display-help-on-object will prompt you for the name of an object for which you would like documentation. Completion is provided over all objects which have help files. If the requested object has documentation, you will be popped into a buffer (named @code{*help(@var{obj-name})*}) containing the help file. This buffer is placed in a special `S Help' mode which disables the usual editing commands but which provides a number of keys for paging through the help file. Help commands: @table @kbd @item ? @findex ess-describe-help-mode @code{ess-describe-help-mode} Pops up a help buffer with a list of the commands available in @Sl{} help mode. @item h @findex ess-display-help-on-object @code{ess-display-help-on-object} Pop up a help buffer for a different object. @end table Paging commands: @cindex paging commands in help buffers @table @kbd @item b @itemx DEL @code{scroll-down} Move one page backwards through the help file. @item SPC @code{scroll-up} Move one page forwards through the help file. @item > @itemx < @code{end-of-buffer} Move to the beginning and end of the help file, respectively. @end table Section-based motion commands: @table @kbd @item n @itemx p @findex ess-skip-to-next-section @findex ess-skip-to-previous-section @code{ess-skip-to-previous-section} and @code{ess-skip-to-next-section} Move to the next and previous section header in the help file, respectively. A section header consists of a number of capitalized words, followed by a colon. @end table In addition, the @kbd{s} key followed by one of the following letters will jump to a particular section in the help file. Note that R uses capitalized instead of all-capital section headers, e.g., @samp{Description:} instead of @samp{DESCRIPTION:} and also only some versions of S(-plus) have sections @samp{BACKGROUND}, @samp{BUGS}, @samp{OPTIONAL ARGUMENTS}, @samp{REQUIRED ARGUMENTS}, and @samp{SIDE EFFECTS}. @c The bindings are all in ../lisp/ess-s-l.el @c ess-help-*-sec-keys-alist @c @c S-plus only: @c @item b BACKGROUND: @c @item B BUGS: @c @item O OPTIONAL ARGUMENTS: @c @item R REQUIRED ARGUMENTS: @c S and S-plus only: @c @item S SIDE EFFECTS: Do use @kbd{s ?} to get the current list of active key bindings. @findex ess-skip-to-help-section @table @samp @item a ARGUMENTS: @item b BACKGROUND: @item B BUGS: @item d DESCRIPTION: @item D DETAILS: @item e EXAMPLES: @item n NOTE: @item O OPTIONAL ARGUMENTS: @item R REQUIRED ARGUMENTS: @item r REFERENCES: @item s SEE ALSO: @item S SIDE EFFECTS: @item u USAGE: @item v VALUE: @item < Jumps to beginning of file @item > Jumps to end of file @item ? Pops up a help buffer with a list of the defined section motion keys. @end table Evaluation: @table @kbd @item l @findex ess-eval-line-and-step @code{ess-eval-line-and-step} Evaluates the current line in the ESS process, and moves to the next line. Useful for running examples in help files. @item r @findex ess-eval-region @code{ess-eval-region} Send the contents of the current region to the ESS process. Useful for running examples in help files. @end table Quit commands: @table @kbd @item q @findex ess-switch-to-end-of-ESS @code{ess-help-quit} Return to previously selected buffer, and bury the help buffer. @item k @code{kill-buffer} Return to previously selected buffer, and kills the help buffer. @item x @code{ess-kill-buffer-and-go} Return to the ESS process, killing this help buffer. @end table Miscellaneous: @table @kbd @item i @code{ess-display-index} Prompt for a package and display it's help index. @item v @code{ess-display-vignettes} Display all available vignettes. @item w @code{ess-display-help-in-browser} Display current help page with the web browser. @item / @code{isearch-forward} Same as @kbd{C-s}. @end table In addition, all of the ESS commands available in the edit buffers are also available in @Sl{} help mode (@pxref{Edit buffer}). Of course, the usual (non-editing) Emacs commands are available, and for convenience the digits and @key{-} act as prefix arguments. If a help buffer already exists for an object for which help is requested, that buffer is popped to immediately; the ESS process is not consulted at all. If the contents of the help file have changed, you either need to kill the help buffer first, or pass a prefix argument (with @kbd{C-u}) to @code{ess-display-help-on-object}. Help buffers are marked as temporary buffers in ESS, and are deleted when @code{ess-quit} or @code{ess-cleanup} are called. Help buffers normally appear in another window within the current frame. If you wish help buffers to appear in their own frame (either one per help buffer, or one for all help buffers), you can customize the variable @code{ess-help-own-frame}. @findex ess-quit @findex ess-cleanup @cindex temporary buffers @node Completion @chapter Completion @menu * Object names:: * Function arguments:: * Minibuffer completion:: * Auto-complete:: * Icicles:: @end menu @node Object names @section Completion of object names @cindex completion of object names @cindex command-line completion @vindex ess-first-tab-never-complete The @key{TAB} key is for completion. The value of the variable @code{ess-first-tab-never-complete} controls when completion is allowed controls when completion is allowed to occur. In @code{ess-mode} @key{TAB} first tries to indent, and if there is nothing to indent, complete the object name instead. @table @kbd @item TAB @findex comint-dynamic-complete @code{comint-dynamic-complete} Complete the @Sl{} object name or filename before point. @end table When the cursor is just after a partially-completed object name, pressing @key{TAB} provides completion in a similar fashion to @code{tcsh} @cindex tcsh except that completion is performed over all known @Sl{} object names instead of file names. ESS maintains a list of all objects known to S at any given time, which basically consists of all objects (functions and datasets) in every attached directory listed by the @code{search()} command @pindex search() along with the component objects of attached data frames @cindex data frames (if your version of @Sl{} supports them). For example, consider the three functions (available in Splus version 3.0) called @code{binomplot()}, @code{binom.test()} and @code{binomial()}. Typing @kbd{bin TAB} after the @Sl{} prompt will insert the characters @samp{om}, completing the longest prefix (@samp{binom}) which distinguishes these three commands. Pressing @kbd{TAB} once more provides a list of the three commands which have this prefix, allowing you to add more characters (say, @samp{.}) which specify the function you desire. After entering more characters pressing @kbd{TAB} yet again will complete the object name up to uniqueness, etc. If you just wish to see what completions exist without adding any extra characters, type @kbd{M-?}. @deffn Command ess-list-object-completions @kindex M-? @kbd{M-?} List all possible completions of the object name at point. @end deffn ESS also provides completion over the components of named lists and environments (after @samp{$}), S4 classes slots (after @@), package and namespace objects (after :: and :::). @c This feature is particularly @c useful for checking what components of a list object exist while partway @c through entering a command: simply type the object name and @samp{$} and @c press @kbd{TAB} to see the names of existing list components for that @c object. @cindex lists, completion on @cindex completion on lists @cindex completion on file names Completion is also provided over file names, which is particularly useful when using @Sl{} functions such as @code{get()} or @code{scan()} which require fully expanded file names. @c VS[11-03-2012|ESS 12.03]: this is not true in ess-mode @c Whenever the cursor is within @c an @Sl{} string, pressing @kbd{TAB} completes the file name before @c point. Since ESS 5.11, it no longer also expands any @samp{~} or @c environment variable references. In the Inferior ESS buffer, if the cursor is not in a string and does not follow a (partial) object name, the @key{TAB} key has a third use: it expands history references. @xref{History expansion}. @c @node Completion details, Transcript, Completion, Entering commands @c ------ VS: this will change in the next release, thus commented out @c @section Completion details @c ESS automatically keeps track of any objects added or deleted to the @c system (such as new objects created, or directories added to the search @c list) to make completion as accurate as possible. Whenever ESS notices @c that search list has changed @c @vindex ess-change-sp-regexp @c @footnote{The variable @code{ess-change-sp-regexp} is a regular @c expression matching commands which change the search list. You will @c need to modify this variable if you have defined custom commands (other @c than @code{attach}, @code{detach}, @code{collection} or @code{library}) @c which modify the search list.} when you attach a directory or data @c frame, the objects associated with it immediately become available for a @c completion; when it is detached completion is no longer available on @c those objects. @c To maintain a list of accessible objects for completion, ESS needs to @c determine which objects are contained in each directory or data frame on @c the search list. This is done at the start of each @Sl{} session, by @c running the @code{objects()} command on every element of the search @c list. @c On some systems, however, this can be rather slow; it's doubly @c frustrating when you consider that most of the directories on the search @c list are the standard @Sl{} libraries, which never change anyway! When @c ESS was installed, a database of the standard object names should have @c been created which should speed up this process at the start of an S @c session; if it has not been created you will get a warning like @c `S-namedb.el does not exist'. @xref{Installation}, for information on @c how to create this database. Efficiency in completion is gained by maintaining a cache of objects currently known to S; when a new object becomes available or is deleted, only one component of the cache corresponding to the associated directory needs to be refreshed. If ESS ever becomes confused about what objects are available for completion (such as when if refuses to complete an object you @strong{know} is there), the command @kbd{M-x ess-resynch} @findex ess-resynch forces the @emph{entire} cache to be refreshed, which should fix the problem. @node Function arguments @section Completion of function arguments When inside a function call (i.e. following `@code{(}'), @kbd{TAB} completion also provides function arguments. If function is a generic, completion will provide all the arguments of @code{S3} methods known to @code{R}. A related functionality is @xref{ESS ElDoc}, which displays function arguments in the echo area whenever the point is inside a function call. @node Minibuffer completion @section Minibuffer completion @cindex IDO completions @findex ess-use-ido, ess-completing-read From version 12.03, ESS uses @code{IDO} mechanism (part of default emacs) for minibuffer completion if @code{ido.el} package is available and the value of @code{ess-use-ido} it @code{t} (the default). The completion command @code{ess-completing-read} falls back on classic @code{completion-read} interface if this feature is not available for whatever reason. @node Auto-complete @section Integration with auto-complete package @cindex auto-complete @vindex ac-source-R @vindex ac-source-R-args @vindex ac-source-R-objects ESS provides three sources for @code{Auto Completion} mode: @comment (@uref{http://cx4a.org/software/auto-complete/}) @code{ac-source-R-args}, @code{ac-source-R-objects} and @code{ac-source-R}. The last one combines the previous two and makes them play nicely together. See auto-complete package documentation (@uref{http://cx4a.org/software/auto-complete/}) for how to modify and install your own completion sources. For the default auto-complete ESS configuration, install the latest version of @code{auto-complete} package. ESS automatically detect the package and activates auto-complete in ESS buffers. To deactivate AC, place the following into your init file: @example (setq ess-use-auto-complete nil) @end example Or, to activate auto-completion only in the @code{ess-mode} buffers: @example (setq ess-use-auto-complete 'script-only) @end example ESS provides AC help both for arguments and objects (default keys @kbd{C-?} or @kbd{}). You can bind @kbd{M-h} to display quick help pop-ups: @example (define-key ac-completing-map (kbd "M-h") 'ac-quick-help) @end example @code{AC} binds @kbd{M-n}, and @kbd{M-p} for the navigation in the completion menu, which might be inconvenient if you want it to use in the inferior R. Bind it to something else: @example (define-key ac-completing-map "\M-n" nil) ;; was ac-next (define-key ac-completing-map "\M-p" nil) ;; was ac-previous (define-key ac-completing-map "\M-," 'ac-next) (define-key ac-completing-map "\M-k" 'ac-previous) @end example @node Icicles @section Icicles @cindex icicles Another option for comprehensively handling completion in Emacs is via Icicles (@uref{http://www.emacswiki.org/emacs/Icicles}). It allows users to have completions shown temporarily in the standard @samp{*Completions*} buffer, and interactively select completion candidates using several methods. As of version 2013.04.04, Icicles provides support for completion in ESS. Please consult Icicles documentation, which is easily accessible via @kbd{customize-group Icicles}, for more details on installation and customization options. Once installed, Icicles can be activated by evaluating (maybe place in @file{~/.emacs}): @example (require 'icicles) (icy-mode 1) @end example Icicles can be toggled at any moment by typing @kbd{M-x icy}. When Icicles is on, @kbd{TAB} offers completion, provided the conditions determined by @code{ess-first-tab-never-complete} allow it. Typing @kbd{M-TAB} will attempt completion regardless. Typing @kbd{M-?} in @code{ESS} or @code{iESS} modes brings up the relevant completion candidates from which to choose. Minibuffer input filters the available candidates. Use @kbd{TAB} for prefix completion or @kbd{S-TAB} for substring or regexp completion. Use @kbd{S-SPC} to match an additional pattern (repeatable). You can cycle among the matching candidates, choosing with @kbd{RET} or @kbd{mouse-2}. @node Developing with ESS @chapter Developing with ESS ESS provides several tools to help you with the development of your R packages: @menu * ESS tracebug:: Visual debugging, breakpoints, tracing, watch etc. * Editing documentation:: Tools to edit R documentation * ESS developer:: Develop your packages on the fly @end menu @node ESS tracebug @section ESS tracebug @cindex ESS tracebug @findex ess-tracebug ESS @code{tracebug} offers visual debugging, interactive error navigation, interactive backtrace, breakpoint manipulation, control over R error actions, watch window and interactive flagging/unflagging of functions for debugging. From ESS13.05 @code{ess-tracebug} is on by default. You can toggle it on and off with @kbd{M-x} @code{ess-tracebug}. To disable startup activation of @code{ess-tracebug} set @code{ess-use-tracebug} to nil. Tracebug functionality can be found on @code{ess-dev-map}, bound to @kbd{C-c C-t}. Additionally, when subprocess is in a debugging state @code{ess-debug-minor-mode} is active and the following additional shortcuts are available: @verbatim * Interactive Debugging (`ess-debug-minor-mode-map'): M-C . Continue . `ess-debug-command-continue' M-C-C . Continue multi . `ess-debug-command-continue-multi' M-N . Next step . `ess-debug-command-next' M-C-N . Next step multi . `ess-debug-command-next-multi' M-U . Up frame . `ess-debug-command-up' M-Q . Quit debugging . `ess-debug-command-quit' @end verbatim These are all the tracebug commands defined in @code{ess-dev-map} (@kbd{C-c C-t ?} to show this table): @verbatim * Breakpoints (`ess-dev-map'): b . Set BP (repeat to cycle BP type) . `ess-bp-set' B . Set conditional BP . `ess-bp-set-conditional' k . Kill BP . `ess-bp-kil' K . Kill all BPs . `ess-bp-kill-all' o . Toggle BP state . `ess-bp-toggle-state' l . Set logger BP . `ess-bp-set-logger' n . Goto next BP . `ess-bp-next' p . Goto previous BP . `ess-bp-previous' (C- prefixed equivalents are also defined) * Debugging (`ess-dev-map'): ` . Show traceback . `ess-show-traceback' (also on C-c `) ~ . Show callstack . `ess-show-call-stack' (also on C-c ~) e . Toggle error action (repeat to cycle). `ess-debug-toggle-error-action' d . Flag for debugging . `ess-debug-flag-for-debugging' u . Unflag for debugging . `ess-debug-unflag-for-debugging' w . Watch window . `ess-watch' (C- prefixed equivalents are also defined) * Navigation to errors (general emacs functionality): C-x `, M-g n . `next-error' M-g p . `previous-error' * Misc: ? . Show this help . `ess-tracebug-show-help' @end verbatim To configure how electric watch window splits the display see @code{ess-watch-width-threshold} and @code{ess-watch-height-threshold} variables. A more detailed ess-tracebug documentation with screenshots is available at @uref{http://code.google.com/p/ess-tracebug/}. A short tutorial is at @uref{http://code.google.com/p/ess-tracebug/wiki/GettingStarted}. @emph{Note:} Currently, ess-tracebug does not detect some of R's debug related messages in non-English locales. To set your R messages to English add the following line to your .Rprofile init file: @verbatim Sys.setlocale("LC_MESSAGES", "C") @end verbatim @node Editing documentation @section Editing documentation ESS provides two ways of writing documentation for R objects. Either using the standard R documentation system or using in-source documentation written as structured comment fields for use with the Roxygen package. @menu * R documentation files:: Edit objects in a specialized buffer * Roxygen:: Loading source files into the ESS process @end menu @node R documentation files @subsection Editing R documentation (Rd) files @R{} objects are documented in files written in the @dfn{R documentation} (``Rd''), a simple markup language closely resembling (La)@TeX{}, which can be processed into a variety of formats, including La@TeX{}, @acronym{HTML}, and plain text. Rd format is described in section ``Rd format'' of the ``Writing R Extensions'' manual in the R distribution. ESS has several features that facilitate editing Rd files. Visiting an Rd file as characterized by its extension @file{Rd} will activate Rd Mode, which provides several facilities for making editing R documentation files more convenient, by helping with indentation, insertions, even doing some of the typing for you (with Abbrev Mode), and by showing Rd keywords, strings, etc.@: in different faces (with Font Lock Mode). Note that R also accepts Rd files with extension @file{rd}; to activate @ESS{[Rd]} support for this extension, you may need to add @example (add-to-list 'auto-mode-alist '("\\.rd\\'" . Rd-mode)) @end example @noindent to one of your Emacs startup files. In Rd mode, the following special Emacs commands can be used in addition to the standard Emacs commands. @table @kbd @item C-h m Describe the features of Rd mode. @item LFD @itemx RET Reindent the current line, insert a newline and indent the new line (@code{reindent-then-newline-and-indent}). An abbrev before point is expanded if @code{abbrev-mode} is non-@code{nil}. @item TAB Indent current line based on its contents and on previous lines. (@code{indent-according-to-mode}). @item C-c C-e Insert a ``skeleton'' with Rd markup for at least all mandatory entries in Rd files (@code{Rd-mode-insert-skeleton}). Note that many users might prefer to use the R function @code{prompt} on an existing R object to generate a non-empty Rd ``shell'' documenting the object (which already has all information filled in which can be obtained from the object). @item C-c C-f Insert ``font'' specifiers for some of the Rd markup commands markup available for emphasizing or quoting text, including markup for URLs and email addresses (@code{Rd-font}). @kbd{C-c C-f} is only a prefix; see e.g.@: @kbd{C-c C-f TAB} for the available bindings. Note that currently, not all of the Rd text markup as described in section ``Marking text'' of ``Writing R Extensions'' can be accessed via @kbd{C-c C-f}. @item C-c C-j Insert a suitably indented @samp{\item@{} on the next line (@code{Rd-mode-insert-item}). @item C-c C-p Preview a plain text version (``help file'', @pxref{Help}) generated from the Rd file (@code{Rd-preview-help}). @end table In addition, when editing Rd files one can interact with a running R process in a similar way as when editing R language files. E.g., @kbd{C-c C-v} provides access to on-line help, and @kbd{C-c C-n} sends the current line to the R process for evaluation. This interaction is particularly useful when editing the examples in the Rd file. See @kbd{C-h m} for all available commands. Rd mode also provides access to abbreviations for most of the Rd markup commands. Type @kbd{M-x list-abbrevs} with Abbrev mode turned on to list all available abbrevs. Note that all Rd abbrevs start with a grave accent. Rd mode can be customized via the following variables. @defvr {User Option} Rd-mode-hook Hook to be run when Rd mode is entered. @end defvr @defvr {User Option} Rd-indent-level The indentation of Rd code with respect to containing blocks. Default is 2. @end defvr @defvr {User Option} Rd-to-help-command The shell command used for converting Rd source to help text. Default is @samp{R CMD Rd2txt}. @end defvr To automatically turn on the abbrev and font-lock features of Rd mode, add the following lines to one of your Emacs startup files: @example (add-hook 'Rd-mode-hook (lambda () (abbrev-mode 1) (font-lock-mode 1))) @end example @node Roxygen @subsection Editing Roxygen documentation @cindex Roxygen @cindex roxy @cindex ess-roxy The Roxygen R package makes it possible to keep the intended contents for Rd files as structured comments in the R source files. Roxygen can then parse R files and generate appropriate Rd files from these comments, fill the usage fields as well as updating @file{NAMESPACE} files. See the Roxygen documentation found via @uref{http://roxygen.org} for more information on its usage. An example of an Roxygen entry for a simple R function can look like this: @example @verbatim ##' Description of the function ##' ##' Further details about this function ##' @title A title ##' @param me all parameters must be listed and documented ##' @return Description of the return value ##' @author The author myfun <- function(me) cat("Hello", me, "\n") @end verbatim @end example The entry is immediately preceding the object to document and all lines start with the Roxygen prefix string, in this case @code{##'}. ESS provides support to edit these documentation entries by providing line filling, navigation, template generation etc. Syntax highlighting is provided for Emacs but not for XEmacs. Roxygen is customized by the variables in the customization group ``Ess Roxy''. Customizables include the Roxygen prefix, use of folding to toggle visibility of Roxygen entries and the Roxygen template. All ESS Roxygen support is defined in @file{ess-roxy.el} which is loaded by default in ESS. The following special Emacs commands are provided. @deffn Command ess-roxy-update-entry @kindex C-c C-o C-o @kbd{C-c C-o C-o} Generate a Roxygen template or update the parameter list in Roxygen entry at point (or above the function at the point). Documented parameters that are not in the function are placed last in the list, parameters that are not documented and not in the definition are dropped. Parameter descriptions are filled if @code{ess-roxy-fill-param-p} is non-nil. @end deffn @deffn Command ess-roxy-toggle-roxy-region @var{beg} @var{end} @kindex C-c C-o C-c @kbd{C-c C-o C-c} Toggle the presence of the leading Roxygen string on all lines in the marked region (between @var{beg} and @var{end}. Convenient for transferring text to Roxygen entries and to evaluate example fields. @end deffn @deffn Command ess-roxy-preview-Rd @var{name-file} @kindex C-c C-o C-r @kbd{C-c C-o C-r} Use the attached R process to parse the entry at point to obtain the Rd code. Convenient for previewing and checking syntax. When used with the prefix argument @var{name-file}, i.e. @kbd{C-u C-c C-e C-r}, place the content in a buffer associated with a Rd file with the same name as the documentation. Requires the Roxygen package to be installed. @end deffn @deffn Command ess-roxy-preview-HTML @var{visit-instead-of-open} @kindex C-c C-o C-t @kbd{C-c C-o C-t} Use the attached R process to parse the entry at to generate HTML for the entry and open it in a browser. When used with the prefix argument @var{visit-instead-of-open}, i.e. @kbd{C-u C-c C-e C-t}, visit the generated HTML file instead. Requires the Roxygen and tools packages to be installed. @end deffn @deffn Command ess-roxy-previous-entry @kindex C-c C-o p @kbd{C-c C-o p} Go to start of the Roxygen entry above point. @end deffn @deffn Command ess-roxy-next-entry @kindex C-c C-o n @kbd{C-c C-o n} Go to end of the Roxygen entry above point. @end deffn @deffn Command ess-roxy-hide-all @kindex C-c C-o C-h @kbd{C-c C-o C-h} Use the hideshow mode to fold away the visibility of all Roxygen entries. Hide-show support must be enabled for this binding to get defined. @end deffn ESS also advises the following standard editing functions in order to make Roxygen editing more intuitive: @c not very precise, TAB calls it indirectly @table @kbd @item TAB @findex ess-R-complete-object-name @code{ess-R-complete-object-name} Complete Roxygen tag at point. E.g. doing @kbd{TAB} when the point is at the end of @code{@@par} completes to @code{@@param}. @item M-h @findex mark-paragraph @code{mark-paragraph} If the transient mark mode is active, place mark and point at start end end of the field at point and activate the mark. @item TAB @findex ess-indent-command @code{ess-indent-command} If hide-show support is enabled, fold away the visibility of the Roxygen entry at point. @item M-q @findex fill-paragraph @code{fill-paragraph} Fill the Roxygen field at point. @item C-a @findex move-beginning-of-line @code{move-beginning-of-line} Move to the point directly to the right of the Roxygen start string. @item RET @findex newline-and-indent @code{newline-and-indent} Insert a new line and the Roxygen prefix string. @end table @node ESS developer @section ESS developer @cindex ess developer Usual ESS evaluation commands, @xref{Evaluating code}, send portions of the current buffer for the evaluation in the current environment (usually @code{R_GlobalEnv}). Often, when developing packages with namespaces, it is necessary to evaluate code directly in the package's environment or its namespace. The @code{ess-developer} utility provides such a functionality with minimal disruption of the usual ESS work-flow. To understand how ess-developer works you must be familiar with namespace system in R. In a nutshell, all objects defined in a package 'foo' are stored in an environment called 'namespace:foo'. Parent environment of 'namespace:foo' is an environment 'imports:foo' which contains copies of all objects from other packages which 'foo' imports. Parent environment of 'imports:foo' is the 'namespace:base'. Parent environment of 'namespace:base' is .GlobalEnv. Thus functions and methods stored in 'namespace:foo' see all the objects in .GlobalEnv unless shadowed by objects in 'imports:foo', 'namespace:base', or 'namespace:foo' itself. There is another environment associated with 'foo' - 'package:foo'. This environment stores *copies* of exported objects from 'namespace:foo' and is placed on the search() path, i.e. if 'foo' is loaded and if you start with .GlobalEnv and iteratively call parent.env() you will get eventually to 'package:foo'. Thus all methods and functions defined in .GlobalEnv can "see" objects in 'package:foo' environment. See also @uref{http://cran.r-project.org/doc/manuals/R-ints.html#Namespaces}. In order to use ess-developer you must add names of the packages that you are developing to @code{ess-developer-packages}. You can also do that interactively with @kbd{C-c C-t C-a}. To remove packages from @code{ess-developer-packages} use @kbd{C-c C-t C-r}. When developer mode is on, the process mode line indicator displays a small or capital letter "d". If variable @code{ess-developer-activate-in-package} is @code{t} (the default) @code{R-mode} will check after visiting the file whether or not the file is part of the package. If visited file is part of a package listed in @code{ess-developer-packages}, developer mode is activated automatically. Developer mode is usually activated on per-file basis and a small "d" appears in the modeline. You can also activate ess-developer for all buffers connected to current process. This is done by toggling @code{ess-developer} in subprocess buffer. In this case a big "D" will appear in the modeline. @deffn Command ess-developer @var{val} @kindex C-c C-t C-t @kbd{C-c C-t C-t} Toggle developer mode on and off. If called from script buffer, toggle developer on file-by-file basis. When called from process buffer, toggle developer on per-process basis. @end deffn @deffn Command ess-developer-add-package @var{from-attached} @var{remove} @kindex C-c C-t C-a @kbd{C-c C-t C-a} Add a package to your development list (@code{ess-developer-packages}). @end deffn @deffn Command ess-developer-remove-package @kindex C-c C-t C-r @kbd{C-c C-t C-r} Remove a package from your development list. @end deffn When you add a package to @code{ess-developer-packages}, ESS will ask for loading command. By default there are two options @code{library} and @code{load_all} from @code{devtools} package. You can configure this behavior in @code{ess-developer-load-on-add-commands}. To explicitly load the package containing current file use @kbd{C-c C-t l}. @deffn Command ess-developer-load-package @kindex C-c C-t l @kbd{C-c C-t l} Load package with @code{load_all} utility from @code{devtools} package. @end deffn When developer mode is on, ESS evaluation commands behave differently: @itemize @bullet @item @kbd{C-c C-l} (@code{ess-load-file}) asks for the package to source into and inserts all redefined objects into the package:foo or namespace:foo accordingly. @itemize @minus @item PLAIN OBJECTS and FUNCTIONS: @* If the object is found in an environment (package:foo or namespace:foo), and differs from the old one it is assigned into the corresponding environment. If the object is not found it is assigned into .GlobalEnv. The environment of functions is set to namespace:foo. @item CLASSES: @* Same as plain objects, with the difference that even if the class definition is assigned into .GlobalEnv, it is still associated with the package foo. Thus if you issue getClassDeff("foo") you will get a class definition with the slot @@package pointing to package "foo". @emph{Note:} Occasionally, after adding new classes you might get warnings from "setClass". This is especially true if new class inherits or is inherited by a class whose definition is not exported. You might get something like: @code{ Warning: Class "boo" is defined (with package slot тАШfooтАЩ) but no metadata object found to revise subclass information---not exported? } You can safely ignore this warnings. @item S4 METHODS: @* Similarly to function definitions modified methods are assigned in the local method table in the namespace:foo. New methods are assigned into .GlobalEnv, but with the environment pointing to namespace:foo. There is a subtle catch with method caching in R though. See the code in etc/ESSR/developer.R for more details. @c Note that if method or generic is exported the *same* table (which is an @c environment) is present in package:foo. @item S3 METHODS: @* S3 methods are not automatically registered. You can register them manually after you have inserted method_name.my_class into your package environment using ess-developer, like follows: registerS3method("method_name", "my_class", my_package:::method_name.my_class) If you don't register your S3 method, R will call the registered (aka cached) S3 method instead of the new method that ess-developer inserted in the package environment. @end itemize @item @kbd{C-c C-r}(@code{ess-eval-region}) and functions that depend on it (@code{ess-eval-paragraph}, @code{ess-eval-buffer} etc.), behave as @code{ess-load-file}, but restrict the evaluation to the corresponding region. @item @kbd{C-c C-f} (@code{ess-eval-function}) and friends check if the current function's name can be found in a namespace:foo or package:foo for a 'foo' from `ess-developer-packages'. If found, and new function definition differs from the old one, the function is assigned into that namespace. If not found, it is assigned into .GlobalEnv. @end itemize @node Extras @chapter Other ESS features and tools ESS has a few extra features, which didn't fit anywhere else. @c todo: sort alphabetically @menu * ESS ElDoc:: Display function arguments in minibuffer * Handy commands:: Usefully commands at your fingertips * Highlighting:: Syntactic highlighting of buffers * Parens:: Parenthesis matching * Graphics:: Using graphics with ESS * Imenu:: Support for Imenu in ESS * Toolbar:: Support for toolbar in ESS * TAGS:: Using TAGS for S files * Rdired:: Directory editor for R objects * Rutils:: R object/package management and help utilities * Org:: Interaction with Org mode * Sweave and AUCTeX:: Support for Sweave in ESS and AUCTeX @end menu @node ESS ElDoc @section ElDoc @cindex ElDoc In @code{ElDoc} mode, the echo area displays function's arguments at point. From @ESS{} version 12.03, ElDoc is active by default in @code{ess-mode} and @code{inferior-ess-mode} buffers. To activate it only in @code{ess-mode} buffers, place the following into your init file: @example (setq ess-use-eldoc 'script-only) @end example @defvr {User Option} ess-use-eldoc If @samp{t}, activate eldoc in ess-mode and inferior-ess-mode buffers. If @samp{'script-only} activate in ess-mode buffers only. Set @code{ess-use-eldoc} to @code{nil} to stop using @code{ElDoc} altogether. @end defvr @defvr {User Option} ess-eldoc-show-on-symbol This variable controls whether the help is shown only inside function calls. If set to @samp{t}, @code{ElDoc} shows help string whenever the point is on a symbol, otherwise (the default), shows only when the point is in a function call, i.e. after @samp{'('}. @end defvr @defvr {User Option} ess-eldoc-abbreviation-style The variable determines how the doc string should be abbreviated to fit into minibuffer. Posible values are @samp{nil}, @samp{mild}, @samp{normal}, @samp{strong} and @samp{aggressive}. Please see the documentation of the variable for more details. The default filter is @samp{normal}. @end defvr Ess-eldoc also honors the value of @code{eldoc-echo-area-use-multiline-p}, which if set to @samp{nil}, will cause the truncation of doc string indifferent of the value of @code{ess-eldoc-abbreviation-style}. This way you can combine different filter levels with the truncation. @node Handy commands @section Handy commands @cindex Handy commands @findex ess-handy-commands @vindex ess-handy-commands @findex ess-smart-comma @kindex , @deffn Command ess-handy-commands Request and execute a command from @code{ess-handy-commands} list. @end deffn @defvr {User Option} ess-handy-commands An alist of custom ESS commands available for call by @code{ess-handy-commands} and @code{ess-smart-comma} function. Currently contains: @table @asis @item change-directory @code{ess-change-directory} @item help-index @code{ess-display-index} @item help-object @code{ess-display-help-on-object} @item vignettes @code{ess-display-vignettes} @item objects[ls] @code{ess-execute-objects} @item search @code{ess-execute-search} @item set-width @code{ess-execute-screen-options} @item install.packages @code{ess-install.packages} @item library @code{ess-library} @item setRepos @code{ess-setRepositories} @item sos @code{ess-sos} @end table @end defvr @c If ``@kbd{,}`` (@code{ess-smart-comma}) is invoked at the beginning of @c line of an ESS inferior buffer (i.e. at process marker), ESS requests and @c executes a command from @code{`ess-handy-commands'} list. If @c @code{ess-R-smart-operators} is t @code{`ess-smart-comma} also inserts @c `` `` after comma. Handy commands: @code{ess-library}, @code{ess-install.packages}, etc - ask for item with completion and execute the correspond command. @code{ess-sos} is a interface to @code{findFn} function in package @code{sos}. If package @code{sos} is not found, ask user for interactive install. @node Highlighting @section Syntactic highlighting of buffers ESS provides Font-Lock (@pxref{Faces,,Using Multiple Typefaces, emacs, The Gnu Emacs Reference Manual}) patterns for Inferior @Sl{} Mode, S Mode, and @Sl{} Transcript Mode buffers. @cindex font-lock mode @cindex highlighting Syntax highlighting within ESS buffers is controlled by: @defvr {User Option} ess-font-lock-mode Non-@samp{nil} means we use font lock support for ESS buffers. Default is @samp{t}, to use font lock support. If you change the value of this variable, restart Emacs for it to take effect. @end defvr @c To activate highlighting, you need to turn on Font Lock mode in the @c appropriate buffers. This can be done on a per-buffer basis with @c @kbd{M-x font-lock-mode}, or may be done by adding @c @code{turn-on-font-lock} to @code{inferior-ess-mode-hook}, @c @code{ess-mode-hook} and @code{ess-transcript-mode-hook}. Your systems @c administrator may have done this for you in @file{ess-site.el} @c (@pxref{Customization}). The font-lock patterns are defined by the following variables, which you may modify if desired: @defvr {User Option} inferior-R-font-lock-keywords Font-lock patterns for inferior *R* processes. (There is a corresponding @code{inferior-S-font-lock-keywords} for *S* processes.) The default value highlights prompts, inputs, assignments, output messages, vector and matrix labels, and literals such as @samp{NA} and @code{TRUE}. @end defvr @defvr {User Option} ess-R-font-lock-keywords Font-lock patterns for ESS R programming mode. (There is a corresponding @code{ess-S-font-lock-keywords} for S buffers.) The default value highlights function names, literals, assignments, source functions and reserved words. @end defvr @c 2007-11-08 - this var no longer exists. @c @defvar ess-trans-font-lock-keywords @c Font-lock patterns for ESS Transcript Mode. The default value @c highlights the same patterns as in Inferior ESS Mode. @c @end defvar @node Parens @section Parenthesis matching Emacs and XEmacs have facilities for highlighting the parenthesis matching the parenthesis at point. This feature is very useful when trying to examine which parentheses match each other. This highlighting also indicates when parentheses are not matching. Depending on what version of emacs you use, one of the following should work in your initialisation file: @example (paren-set-mode 'paren) ;for XEmacs (show-paren-mode t) ;for Emacs @end example @node Graphics @section Using graphics with ESS @cindex graphics One of the main features of the @code{S} package is its ability to generate high-resolution graphics plots, and ESS provides a number of features for dealing with such plots. @menu * printer:: The printer() graphics driver * X11:: The X11() (and other X Windows based) driver * winjava:: Java Graphics Device @end menu @node printer @subsection Using ESS with the @code{printer()} driver This is the simplest (and least desirable) method of using graphics within ESS. S's @code{printer()} device driver produces crude character based plots which can be contained within the ESS process buffer itself. To start using character graphics, issue the @Sl{} command @example printer(width=79) @end example @pindex printer() (the @code{width=79} argument prevents Emacs line-wrapping at column 80 on an 80-column terminal. Use a different value for a terminal with a different number of columns.) Plotting commands do not generate graphics immediately, but are stored until the @code{show()} command is issued, which displays the current figure. @node X11 @subsection Using ESS with windowing devices @cindex X Windows Of course, the ideal way to use graphics with ESS is to use a windowing system. Under X Windows, or X11, this requires that the DISPLAY environment variable be appropriately set. @node winjava @subsection Java Graphics Device @cindex winjava S+6.1 and newer on Windows contains a java library that supports graphics. Send the commands: @example library(winjava) java.graph() @end example @noindent to start the graphics driver. This allows you to use ESS for both interaction and graphics within S-PLUS. (Thanks to Tim Hesterberg for this information.) @node Imenu @section Imenu Imenu is an Emacs tool for providing mode-specific buffer indexes. In some of the ESS editing modes (currently SAS and S), support for Imenu is provided. For example, in S mode buffers, the menubar should display an item called "Imenu-S". Within this menubar you will then be offered bookmarks to particular parts of your source file (such as the starting point of each function definition). Imenu works by searching your buffer for lines that match what ESS thinks is the beginning of a suitable entry, e.g. the beginning of a function definition. To examine the regular expression that ESS uses, check the value of @code{imenu-generic-expression}. This value is set by various ESS variables such as @code{ess-imenu-S-generic-expression}. @node Toolbar @section Toolbar The R and S editing modes have support for a toolbar. This toolbar provides icons to act as shortcuts for starting new S/R processes, or for evaluating regions of your source buffers. The toolbar should be present if your emacs can display images. @xref{Customization}, for ways to change the toolbar. @node TAGS @section TAGS The Emacs tags facility can be used to navigate around your files containing definitions of S functions. This facility is independent of ESS usage, but is written here since ESS users may wish to take advantage of TAGS facility. Read more about emacs tags in an emacs manual. Etags, the program that generates the TAGS file, does not yet know the syntax to recognise function definitions in S files. Hence, you will need to provide a regexp that matches your function definitions. Here is an example call (broken over two lines; type as one line) that should be appropriate. @example etags --language=none --regex='/\([^ \t]+\)[ \t]*<-[ \t]*function/\1/' *.R @end example This will find entries in your source file of the form: @example some.name <- function @end example with the function name starting in column 0. Windows users may need to change the single quotes to double quotes. R version 2.9.0 introduced a front-end script for finding R tags, which calls the @samp{rtags()} function. By default, this script will recursively search the directories for relevant tags in R/C/Rd files. To use this script from the command line, try the following to get started: @example R CMD rtags --help @end example For further details, see @uref{http://developer.r-project.org/rtags.html} @node Rdired @section Rdired Ess-rdired provides a dired-like buffer for viewing, editing and plotting objects in your current R session. If you are used to using the dired (directory editor) facility in Emacs, this mode gives you similar functionality for R objects. Start an R session with @kbd{M-x R} and then store a few variables, such as: @example s <- sin(seq(from=0, to=8*pi, length=100)) x <- c(1, 4, 9) y <- rnorm(20) z <- TRUE @end example Then use @kbd{M-x ess-rdired} to create a buffer listing the objects in your current environment and display it in a new window: @example mode length s numeric 100 x numeric 3 y numeric 20 z logical 1 @end example Type @kbd{C-h m} or @kbd{?} to get a list of the keybindings for this mode. For example, with your point on the line of a variable, `p' will plot the object, `v' will view it, and `d' will mark the object for deletion (`x' will actually perform the deletion). @node Rutils @section Rutils Ess-rutils builds up on ess-rdired, providing key bindings for performing basic R functions in the inferior-ESS process buffer, such as loading and managing packages, object manipulation (listing, viewing, and deleting), and alternatives to @code{help.start()} and @code{RSiteSearch()} that use the @command{browse-url} Emacs function. The library can be loaded using @kbd{M-x load-file}, but the easiest is to include: @lisp (require 'ess-rutils) @end lisp in your .emacs. Once R is started with @kbd{M-x R}, and if the value of the customizable variable @code{ess-rutils-keys} is true, several key bindings become available in iESS process buffers: @deffn Command ess-rutils-local-pkgs @kindex C-c C-. l @kbd{C-c C-. l} List all packages in all available libraries. @end deffn @deffn Command ess-rutils-repos-pkgs @kindex C-c C-. r @kbd{C-c C-. r} List available packages from repositories listed by @command{getOptions(``repos'')} in the current R session. @end deffn @deffn Command ess-rutils-update-pkgs @var{lib} @var{repos} @kindex C-c C-. u @kbd{C-c C-. u} Update packages in a particular library @var{lib} and repository @var{repos}. @end deffn @deffn Command ess-rutils-apropos @kindex C-c C-. a @kbd{C-c C-. a} Search for a string using apropos. @end deffn @deffn Command ess-rutils-rm-all @kindex C-c C-. m @kbd{C-c C-. m} Remove all R objects. @end deffn @deffn Command ess-rutils-objs @kindex C-c C-. o @kbd{C-c C-. o} Manipulate R objects; wrapper for @command{ess-rdired}. @end deffn @deffn Command ess-rutils-load-wkspc @kindex C-c C-. w @kbd{C-c C-. w} Load a workspace file into R. @end deffn @deffn Command ess-rutils-save-wkspc @kindex C-c C-. s @kbd{C-c C-. s} Save a workspace file. @end deffn @deffn Command ess-change-directory @kindex C-c C-. d @kbd{C-c C-. d} Change the working directory for the current R session. @end deffn @deffn Command ess-rutils-html-docs @kindex C-c C-. H @kbd{C-c C-. H} Use @command{browse-url} to navigate R html documentation. @end deffn See the submenu @samp{Rutils} under the iESS menu for alternative access to these functions. The function @command{ess-rutils-rsitesearch} is provided without a particular key binding. This function is useful in any Emacs buffer, so can be bound to a user-defined key: @lisp (eval-after-load "ess-rutils" '(global-set-key [(control c) (f6)] 'ess-rutils-rsitesearch)) @end lisp @findex ess-rutils-rsitesearch Functions for listing objects and packages (@command{ess-rutils-local-pkgs}, @command{ess-rutils-repos-pkgs}, and @command{ess-rutils-objs}) show results in a separate buffer and window, in @code{ess-rutils-mode}, providing useful key bindings in this mode (type @kbd{?} in this buffer for a description). @node Org @section Interaction with Org mode Org-mode (@uref{http://orgmode.org}) now supports reproducible research and literate programming in many languages (including R) -- see chapter 14 of the Org manual (@uref{http://orgmode.org/org.html#Working-With-Source-Code}). For ESS users, this offers a document-based work environment within which to embed ESS usage. R code lives in code blocks of an Org document, from which it can be edited in ess-mode, evaluated, extracted ("tangled") to pure code files. The code can also be exported ("woven") with the surrounding text to several formats including HTML and LaTeX. Results of evaluation including figures can be captured in the Org document, and data can be passed from the Org document (e.g. from a table) to the ESS R process. (This section contributed by Dan Davison and Eric Schulte.) @node Sweave and AUCTeX @section Support for Sweave in ESS and AUCTeX ESS provides support for writing and processing Sweave (@uref{http://www.statistik.lmu.de/~leisch/Sweave}), building up on Emacs' ess-noweb-mode for literate programming. When working on an Sweave document, the following key bindings are available: @deffn Command ess-swv-weave @var{choose} @kindex M-n s @kbd{M-n s} Run Sweave on the current .Rnw file. If @var{choose} is non-@samp{nil}, offer a menu of available weavers. @end deffn @deffn Command ess-swv-latex @kindex M-n l @kbd{M-n l} Run LaTeX after Sweave'ing. @end deffn @deffn Command ess-swv-PS @kbd{M-n p} Generate and display a postscript file after LaTeX'ing. @end deffn @deffn Command ess-swv-PDF @var{pdflatex-cmd} @kindex M-n P @kbd{M-n P} Generate and display a PDF file after LaTeX'ing. Optional argument @var{pdflatex-cmd} is the command to use, which by default, is the command used to generate the PDF file is the first element of @code{ess-swv-pdflatex-commands}. @end deffn @defvr {User Option} ess-swv-pdflatex-commands Commands used by @code{ess-swv-PDF} to run a version of pdflatex; the first entry is the default command. @end defvr Sweave'ing with @code{ess-swv-weave} starts an inferior-ESS process, if one is not available. Other commands are available from the @samp{Sweaving, Tangling, ...} submenu of the Noweb menu. AUCTeX (@uref{http://www.gnu.org/software/auctex}) users may prefer to set the variable @code{ess-swv-plug-into-AUCTeX-p} (available from the ``ESS Sweave'' customization group) to t. Alternatively, the same can be achieved by activating the entry ``AUCTeX Interface'' from the @samp{Sweaving, Tangling, ...} submenu, which toggles this variable on or off. When the interface is activated, new entries for Sweave'ing and LaTeX'ing thereafter are available from AUCTeX's ``Command'' menu. Sweave'ing can, thus, be done by @kbd{C-c C-c Sweave RET} without an inferior-ESS process. Similarly, LaTeX'ing can be done by @kbd{C-c C-c LaTeXSweave RET}. In both cases, the process can be monitored with @kbd{C-c C-l} (@code{TeX-recenter-output-buffer}). Open the viewer with @kbd{C-c C-v} (@code{TeX-view}), as usual in AUCTeX. @node ESS for S @chapter Overview of ESS features for the S family @menu * ESS(S)--Editing files:: * iESS(S)--Inferior ESS processes:: * ESS-help--assistance with viewing help:: * Philosophies for using ESS(S):: * Scenarios for use (possibilities--based on actual usage):: * Customization Examples and Solutions to Problems:: @end menu @include help-s.texi @node ESS for SAS @chapter ESS for SAS @menu * ESS(SAS)--Design philosophy:: * ESS(SAS)--Editing files:: * ESS(SAS)--TAB key:: * ESS(SAS)--Batch SAS processes:: * ESS(SAS)--Function keys for batch processing:: * iESS(SAS)--Interactive SAS processes:: * iESS(SAS)--Common problems:: * ESS(SAS)--Graphics:: * ESS(SAS)--Windows:: @end menu @include help-sas.texi @node ESS for BUGS @chapter ESS for BUGS @menu * ESS(BUGS)--Model files:: * ESS(BUGS)--Command files:: * ESS(BUGS)--Log files:: @end menu @include help-bugs.texi @node ESS for JAGS @chapter ESS for JAGS @menu * ESS(JAGS)--Model files:: * ESS(JAGS)--Command files:: * ESS(JAGS)--Log files:: @end menu @include help-jags.texi @node Mailing lists/bug reports @chapter Bugs and Bug Reporting, Mailing Lists @menu * Bugs:: * Reporting Bugs:: * Mailing Lists:: * Help with emacs:: @end menu @node Bugs @section Bugs @cindex bugs @include bugs.texi @node Reporting Bugs @section Reporting Bugs @cindex bug reports @findex ess-submit-bug-report @include bugrept.texi @node Mailing Lists @section Mailing Lists @include mailing.texi @node Help with emacs @section Help with emacs Emacs is a complex editor with many abilities that we do not have space to describe here. If you have problems with other features of emacs (e.g. printing), there are several sources to consult, including the emacs FAQs (try @kbd{M-x xemacs-www-faq} or @kbd{M-x view-emacs-FAQ}) and EmacsWiki (@uref{http://www.emacswiki.org}). Please consult them before asking on the mailing list about issues that are not specific to ESS. @c _not_yet_ @node Help OS, Installation, Help for Statistical Packages, Top @c _not_yet_ @comment node-name, next, previous, up @c _not_yet_ @chapter Help, arranged by Operating System @c _not_yet_ @c _not_yet_ @menu @c _not_yet_ * Unix installation:: @c _not_yet_ * Microsoft Windows installation:: @c _not_yet_ * System dependent:: Other variables you may need to change @c _not_yet_ @end menu @node Customization @appendix Customizing ESS @cindex customization ESS can be easily customized to your taste simply by including the appropriate lines in your @file{.emacs} file. There are numerous variables which affect the behavior of ESS in certain situations which can be modified to your liking. Keybindings may be set or changed to your preferences, and for per-buffer customizations hooks are also available. Most of these variables can be viewed and set using the Custom facility within Emacs. Type @kbd{M-x customize-group RET ess RET} to see all the ESS variables that can be customized. Variables are grouped by subject to make it easy to find related variables. @c Stephen deleted incomplete variable list Wed 25 Aug 2004. @node Indices @unnumbered Indices @menu * Key index:: * Function and program index:: * Variable index:: * Concept index:: @end menu @node Key index @unnumberedsec Key index @printindex ky @node Function and program index @unnumberedsec Function and program index @printindex fn @node Variable index @unnumberedsec Variable index @printindex vr @node Concept index @unnumberedsec Concept Index @printindex cp @bye @c Remember to delete these lines before creating the info file. @c Why? I makeinfo all of the time without following this advice. @iftex @lucidbook @bindingoffset = 0.5in @parindent = 0pt @end iftex @comment Local Variables: @comment TeX-master: "ess.texi" @comment End: ess/doc/inst_tar.texi0000664000175000017500000003661212423756516013232 0ustar eddedd @node Unix installation, Microsoft Windows installation, , Installation @comment node-name, next, previous, up @section Unix installation @enumerate @item @code{cd} to a directory where you keep emacs lisp files, or create a new directory (for example, @file{$HOME/ess}) to hold the distribution. This directory will be referred to below as "the ESS distribution directory". @emph{Note for XEmacs packages:} ESS is no longer available as an XEmacs package. But, you can still install ESS into the XEmacs package system by choosing @file{ESSDIR}=@file{PREFIX/lib/xemacs/site-packages}. ESS requires that the XEmacs sumo tarball (all XEmacs packages combined) also be installed. For information on installing XEmacs packages, follow this link: @uref{http://www.xemacs.org/Documentation/packageGuide.html, Quickstart Package Guide}. @comment It will contain, @comment at the end, the tar file @file{ess-VERSION.tar.gz}, and a directory for @comment the ESS source, which will be termed "the ESS-VERSION source directory". @comment Note that the .elc files may be installed elsewhere (as specified in the @comment Makefile) if desired. @item Retrieve the latest version from @uref{http://ess.r-project.org/downloads/ess, ESS downloads area} to @file{ESSDIR}. @item Extract the files from the disribution. @display If you are using GNU tar, @code{tar zxf ess-VERSION.tgz}. Otherwise, @code{gunzip < ess-VERSION.tgz | tar xf -}, @end display The @code{tar} command will create the subdirectory @file{ess-VERSION} and install the files there. @comment If you are using GNU Emacs 19.29, decompress/unarchive @comment @file{ESSDIR/ess-VERSION/lisp/19.29.tar.gz}, @comment read @file{ESSDIR/ess-VERSION/lisp/19.29/README}, follow the instructions @comment and you might be able to get ESS to work. @comment @emph{Please note that GNU Emacs 19.29 is no longer supported}. @comment For a list of supported versions of emacs, see @xref{Requirements}. @item Edit the file @file{ESSDIR/ess-VERSION/lisp/ess-site.el} as explained in the comments section of that file. @comment Installations that are using ESS only for S-Plus @comment 6.x will probably not need to make any changes. Installations that also @comment have one or more of (S4, S+3/4/5/6/7/8, R, SAS, BUGS, XLispStat, Stata) @comment may need to uncomment corresponding lines in @file{ESSDIR/ess-VERSION/lisp/ess-site.el}. @item If you are using GNU Emacs add the line @example (load "ESSDIR/ess-VERSION/lisp/ess-site") @end example to @file{$HOME/.emacs}. For XEmacs, if you followed the XEmacs package system installation advice, add the line @example (require 'ess-site) @end example to @file{$HOME/.xemacs/init.el}. Otherwise, for XEmacs, add the line @example (load "ESSDIR/ess-VERSION/lisp/ess-site") @end example to @file{$HOME/.xemacs/init.el}. @comment GNU Emacs uses @file{default.el} or @comment @file{site-init.el} and XEmacs uses @file{site-start.el} for the system @comment installation file). @comment Alternatively, if @file{ess-site.el} is in your current @code{load-path}, then: @comment @example @comment (require 'ess-site) @comment @end example @comment to configure emacs for ESS. @item That's it! ESS is now ready to use. (The remaining step below is only for a custom installation.) To edit statistical programs, just open files with the requisite extensions (@file{.R} for R, @file{.sas} for SAS, @file{.bug} for BUGS, etc.). To start a statistical process within emacs, such as R, type @code{M-x R}. @c @item @c (OPTIONAL) If you are running S-PLUS or R, you might consider @c installing the database files. From within emacs, @code{C-x d} to the @c directory containing ESS. Now: @c @example @c M-x S+6 @c @end example @c to get S running. Once you see the SPLUS prompt, do: @c @example @c M-x ess-create-object-name-db @c @end example @c (this will create the file @file{ess-sp6-namedb.el}; if it isn't in the @c ESS directory, move it there). @c Then, completions will be autoloaded and will not be regenerated for @c every session. @c For R, do the same, using @c @example @c M-x R @c @end example @c and then @code{M-x ess-create-object-name-db} creating @c @file{ess-r-namedb.el}; if it isn't in the ESS directory, move it there). @item @b{(OPTIONAL) READ THIS ITEM THOROUGHLY BEFORE STARTING}: If you want to place the compiled files in other locations edit the @code{LISPDIR}, @code{INFODIR} and @code{ETCDIR} entries in Section 1 of @file{Makeconf} in the @file{ESSDIR/ess-VERSION} directory (if you are using XEmacs, then uncomment the XEmacs subsection in Section 1). You can compile those files by: @example make all @end example When that completes successfully, install the compiled files: @example make install @end example @c This will install the compiled info files and lisp files. If you are an @c XEmacs user, then you should be done. If not, then you may have to @c edit/create the file @file{dir} that is found in the directory specified @c by @code{INFODIR}: see the sample @file{dir} in ESSDIR/ess-VERSION/doc/info. @c If @file{dir} does not exist in @code{INFODIR}, then the sample @c @file{dir} will be installed. @comment An alternative, if you are running XEmacs and have access to the @comment XEmacs system directories, would be to place the directory in the @comment site-lisp directory, and simply type @code{make all} (and copy the @comment documentation as appropriate). @comment @comment For GNU Emacs, you would still have to move the files into the top level @comment site-lisp directory. @end enumerate @c >>>> FIXME (see comment in ess.texi): error in ``makeinfo readme.texi'' @c @node Microsoft Windows installation, , Unix installation, Installation @node Microsoft Windows installation, Requirements, Unix installation, Installation @comment node-name, next, previous, up @section Microsoft Windows installation For @b{Microsoft Windows installation}, please follow the next steps. @enumerate @item @code{cd} to a directory where you keep emacs lisp files, or create a new directory (for example, @file{c:\ess\}) to hold the distribution. This directory will be referred to below as "the ESS distribution directory". @emph{Note for XEmacs packages:} ESS is no longer available as an XEmacs package. But, you can still install ESS into the XEmacs package system by choosing @file{ESSDIR}=@file{PREFIX\XEmacs\site-packages}. ESS requires that the XEmacs sumo tarball (all XEmacs packages combined) also be installed. For information on installing XEmacs packages, follow this link: @uref{http://www.xemacs.org/Documentation/packageGuide.html, Quickstart Package Guide}. @item Retrieve the latest zip file (@file{ess-VERSION.zip}) from @uref{http://ess.r-project.org/downloads/ess, ESS downloads area} and store it in the ESS distribution directory. Be aware that http browsers on Windows frequently change the "." and "-" characters in filenames to other punctuation. Please change the names back to their original form. @item Extract all the files from @file{ess-VERSION.zip} into the ESS distribution directory as @file{c:\ess\ess-VERSION\}. (It is possible to unpack the zip archive in Windows Explorer by double clicking on the folder; you should then see a new folder called @file{ess-VERSION}. Drag that folder into your ESS distribution directory.) @comment @item @comment Add the line @comment @example @comment (load "C:/emacs/ess-VERSION/lisp/ess-site") @comment @end example @comment to your emacs initialization file. (GNU Emacs uses the filename @comment @file{~/.emacs} and XEmacs uses the filename @comment @file{~/.xemacs/init.el} for the initialization file. The tilde is @comment recognised by emacs as your HOME directory, i.e. the value of your HOME @comment environment variable.) Replace @comment @code{VERSION} above with the version number of ESS. Remember to use @comment forwardslashes @code{/}, rather than backslashes @code{\}, in your filename @comment inside emacs code files. @item If you are using GNU Emacs add the line @example (load "ESSDIR/ess-VERSION/lisp/ess-site") @end example to @file{%HOME%\.emacs}. For XEmacs, if you followed the XEmacs package system installation advice, add the line @example (require 'ess-site) @end example to @file{%HOME%\.xemacs\init.el}. Otherwise, for XEmacs, add the line @example (load "ESSDIR/ess-VERSION/lisp/ess-site") @end example to @file{%HOME%\.xemacs\init.el}. @emph{Note:} Both GNU Emacs and XEmacs require that the HOME environment variable be set on your system, otherwise, your initialization file will not be utilized, and therefore, ESS will not work. After saving your initialization file, ESS is now installed. Start a new emacs and you should be ready to use ESS. For example, to edit statistical programs, load the files with the requisite extensions (".sas" for SAS, ".S" or "s" or "q" or "Q" for S-PLUS, ".r" or ".R" for R, and ".lsp" for XLispStat). One further step is needed if you wish to run statistical processes, see below. @item To run statistical processes under ESS, Windows users will need to make sure that the directories for the software they will be using is in the PATH environment variable. On Windows 9x, add lines similar to the following to your @file{c:\autoexec.bat} file: @example path=%PATH%;c:\progra~1\insightful\splus70\cmd @end example On Windows NT/2000/XP, add the directories to the PATH using the @code{My Computer/Control Panel/System/Advanced/Environment Variables} menu. Note that the directory containing the program is added to the PATH, not the program itself. One such line is needed for each software program. Be sure to use the abbreviation @code{progra~1} and not the long version with embedded blanks. Use backslashes "@code{\}". An alternative, for R users, is that rather than adjusting the PATH variable, you can add the following to your emacs initialization file (and restart emacs): @example (setq inferior-R-program-name "c:/progra~1/R/R-2.2.1/bin/Rterm.exe") @end example This assumes that you have installed R-2.2.1 in the default location. Change the path otherwise to point to other locations. Windows users who place S-PLUS anywhere other than the default location will also need to add the following three lines (properly adjusted for their location) to their @file{%HOME%\.emacs} or @file{%HOME%\.xemacs\init.el} file: @example (setq-default inferior-S+6-program-name "c:/progra~1/Insightful/SPLUS70/cmd/Splus") (setq-default inferior-Sqpe+6-SHOME-name "c:/progra~1/Insightful/SPLUS70") (setq-default inferior-Sqpe+6-program-name "c:/progra~1/Insightful/SPLUS70/cmd/Sqpe.exe") @end example The above example uses the default location of S-PLUS in @code{c:\progra~1\Insightful}. Please note that ESS considers S-PLUS 6, 7, and 8 to be variants of S+6. These users may also need to modify the emacs variable @code{ess-SHOME-versions} to match their installation in order to get the full set of S-PLUS versions on their machine into the @code{ESS} menu. To start the S-PLUS [678].x GUI from ESS under emacs: @enumerate @item If you use Cygwin bash as your primary shell, then @example M-x S (or @code{M-x S+6}). @end example @item If you use the MSDOS prompt window as your primary shell, then @example M-x S+6-msdos @end example @end enumerate You will then be asked for a pathname ("S starting data directory?"), from which to start the process. The prompt will propose your current directory as the default. ESS will start the S-PLUS GUI. There will be slight delay during which emacs is temporarily frozen. ESS will arrange for communication with the S-PLUS GUI using the DDE protocol. Send lines or regions from the emacs buffer containing your S program (for example, @file{myfile.s}) to the S-PLUS Commands Window with the @code{C-c C-n} or @code{C-c C-r} keys. (If you are still using S-PLUS 4.x or 2000,\ then use @code{M-x S+4} or @code{M-x S+4-msdos}.) To start an S-PLUS [678].x session inside an emacs buffer---and without the S-PLUS GUI: @example M-x Sqpe (or @code{M-x Sqpe+6}). @end example This works with both the bash and msdos shells. You will then be asked for a pathname ("S starting data directory?"), from which to start the process. The prompt will propose your current directory as the default. You get Unix-like behavior, in particular the entire transcript is available for emacs-style search commands. Send lines or regions from the emacs buffer containing your S program (for example, @file{myfile.s}) to the *S+6* buffer with the @code{C-c C-n} or @code{C-c C-r} keys. Interactive graphics are available with Sqpe by using the java library supplied with S-PLUS 6.1 and newer releases. Enter the commands: @example library(winjava) java.graph() @end example Graphs can be saved from the @code{java.graph} device in several formats, but not PostScript. If you need a PostScript file you will need to open a separate @code{postscript} device. (If you are still using S-PLUS 4.x or 2000, then use @code{M-x Sqpe+4}.) To connect to an already running S-PLUS GUI (started, for example, from the S-PLUS icon): @example M-x S+6-existing @end example or @example M-x S+6-msdos-existing @end example You will then be asked for a pathname ("S starting data directory?"), from which to start the process. The prompt will propose your current directory as the default. ESS will arrange for communication with the already running S-PLUS GUI using the DDE protocol. Send lines or regions from the emacs buffer containing your S program (for example, @file{myfile.s}) to the S-PLUS Commands Window with the @code{C-c C-n} or @code{C-c C-r} keys. (If you are still using S-PLUS 4.x or 2000, then use @code{M-x S+4-existing} or @code{M-x S+4-msdos-existing}.) If you wish to run R, you can start it with: @example M-x R @end example XLispStat can not currently be run with @example M-x XLS @end example Hopefully, this will change. However, you can still edit with emacs, and cut and paste the results into the XLispStat *Listener* Window under Microsoft Windows. @comment SAS for Windows uses the batch access with function keys that is @comment described in @comment @file{doc/README.SAS}. @comment @xref{ESS(SAS)--MS Windows}. @comment The user can also edit SAS files @comment in an @code{ESS[SAS]} buffer and than manually copy and paste them into @comment an Editor window in the SAS Display Manager. @comment @comment For Windows, inferior SAS in an @code{iESS{[SAS]}} buffer does not work @comment on the local machine. It does work over a network connection to @comment SAS running on a remote Unix computer. @comment @comment Reason: we use ddeclient to interface with programs and SAS doesn't @comment provide the corresponding ddeserver capability. @c @item @c (OPTIONAL) If you are running Sqpe or R, you might consider @c installing the database files. From within emacs, @code{C-x d} to @c the directory containing ESS. Now: @c @example @c M-x Sqpe+6 @c @end example @c to get S running. Once you see the SPLUS prompt, do: @c @example @c M-x ess-create-object-name-db @c @end example @c (this will create the file @file{ess-s+6-namedb.el}; if it isn't in the @c ESS directory, move it there). @c Then, completions will be autoloaded and will not be regenerated @c for every session. @c For R, do the same, using @c @example @c M-x R @c @end example @c and then @code{M-x ess-create-object-name-db} creating @c @file{ess-r-namedb.el}; if it isn't in the ESS directory, move it @c there). @item That's it! @end enumerate @comment Requirements duplicated? @comment @node Requirements, , Microsoft Windows installation, Installation @comment node-name, next, previous, up @comment @section Requirements @comment @include requires.texi ess/doc/refcard/0000775000175000017500000000000012601651046012100 5ustar eddeddess/doc/refcard/refcard.tex0000664000175000017500000002426112601651046014235 0ustar eddedd\documentclass[a4paper]{article} \usepackage{multicol} \usepackage{parskip} \usepackage{verbatim} \usepackage{fullpage}% +- ok for paper 'A4' as well %\usepackage{svn}% and {fullpage} are both in debian/ubuntu pkg 'texlive-latex-extra' \addtolength{\textheight}{20mm} \addtolength{\topmargin}{-16mm} \newenvironment{tabI}{\begin{tabular}{p{18mm}l}}{\end{tabular}} \newenvironment{tabTit}[1]{\underline{\textbf{#1}}\\ \begin{tabI}}{\end{tabI}} % \newcommand{\Sect}[1]{\par\noindent\medskip\fbox{\large\textbf{#1}} \vskip -.2ex plus 1ex minus 1ex} \newcommand*{\Ecmd}[1]{$\left\langle \textrm{#1} \right\rangle$} \newcommand*{\sEcmd}[1]{{\small\Ecmd{#1}}} \newcommand*{\RET}[0]{\Ecmd{\textsc{ret}}} \newcommand*{\TAB}[0]{\Ecmd{\textsc{tab}}} \raggedcolumns%\raggedbottom \setlength{\columnseprule}{.4pt}% default 0 \setlength{\columnsep}{22pt}% default is less (18 pt?) \pagestyle{empty} \begin{document} %\SVN $Date$ %\begin{multicols}{1} \begin{center} {\LARGE ESS \ \ \ \ {\large [\textbf{E}macs \textbf{S}peaks \textbf{Statistics}]} \\[.5ex] Reference Card for S and R} \smallskip {\small updated for ESS 12.09-1}% {\footnotesize --- needs \em{more} updating!}} \\[1ex] {\tiny September 2012} % \footnotesize --- as of \today \end{center} % takes a lot of space % \begin{enumerate} % \item \textsc{Nota Bene:} S is the \emph{language}, % R is one \emph{dialect}! % \item This is a list of the more widely used \textbf{key - shortcuts}. % Many more are available, and most are accessible from the Emacs % \textbf{Menus} such as \texttt{iESS}, \texttt{ESS}, etc. % %NN \vspace*{-3ex} % \end{enumerate} %\end{multicols} %NN \rule{\textwidth}{.2pt}%---------------------------------------------------- \begin{multicols}{2} \Sect{Interacting with the process} %% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For use in a process buffers ({\small inferior-ess-mode}): \begin{tabI} \texttt{\RET } & Send a command\\ \texttt{C-c \RET} & Copy old input\\ \texttt{\TAB}& Complete object or file name.\\ & Also bound to \texttt{M-\TAB}, \texttt{M-C-i}.\\ \texttt{C-c C-c }& Break \\ \texttt{C-g} & interrupt Emacs' waiting for S\\ %% SfS-only (others need C-u C-a for comint-bol ! \texttt{C-a} / \texttt{C-e} & Beginning / End of command \\ \texttt{C-c C-u }& Delete this command \\ \texttt{C-c C-w }& Delete last word \\ % \texttt{M-C-r }& String search \texttt{C-c C-r }& Top of last output \\ \texttt{C-c C-o }& Delete last output \end{tabI} \begin{tabTit}{Command history (part of Menu `\texttt{In/Out}')} \texttt{M-p }& Previous command \\ \texttt{M-n }& Next \hspace{1.4em} command \\ \texttt{C-c C-l}& List command history (\& choose!)\\ %% MM has these on the arrow keys: \texttt{C-c M-r}& Previous similar command \\ \texttt{C-c M-s}& Next \hspace{1.4em} similar command \\ %% MM-only: %%- \texttt{$\uparrow$ / \Ecmd{up}} %%- & Previous similar command \\ %%- \texttt{\hbox{$\downarrow$ / \sEcmd{down}}} %%- & Next \hspace{1.4em} similar command \\ \end{tabTit} %% == ESS-transcript mode ?? --- %\begin{tabTit}{Viewing the transcript} % \texttt{M-P }& Move to last command \\ % \texttt{M-N }& Move to next command \\ % \texttt{C-c C-b }& String search and move \\ % \texttt{C-c C-v }& Prompt at bottom of screen \\ %\end{tabTit} \begin{tabTit}{Others} \texttt{C-c C-v }& Help for object \\ \texttt{C-c M-l }& \textbf{L}oad source file \\%{\small ($+$ error check!)} \texttt{C-c C-x }& List objects \\ \texttt{C-c C-s }& Display \texttt{\textbf{s}earch} list \\ % \texttt{C-c C-a }& \textbf{A}ttach a directory \\ % \texttt{C-c C-d }& Edit an object {\small (\textbf{d}ump to file)}\\ % \texttt{C-c ` }& Jump to error after \texttt{C-c C-l}\\ % &\hspace{-1.5cm}In tracebug works for all errors (aka \texttt{C-x `})\\ % \texttt{C-c C-t }& Toggle Tek mode \\ \texttt{C-c C-q }& Quit from S \\ \texttt{C-c C-z }& Switch to most recent script buffer % \texttt{C-c C-z }& Kill the S process \end{tabTit}\\[0.5cm] \Sect{Inside ESS Transcripts (I + O)} %% ~~~~~~~~~~~~~~~~ Inside (\texttt{*.Rout} files): \begin{tabI} \texttt{\RET} & Send and Move \\ \texttt{C-c C-n}& Next \hspace{1.4em} prompt \\ \texttt{C-c C-p}& Previous prompt \\ \texttt{C-c C-w}& Clean Region ($\mapsto$ input only) \end{tabI}\\[0.5cm] \Sect{Sweave} \begin{tabI} \texttt{M-n s} & Sweave the file\\ \texttt{M-n l} & Run latex\\ \texttt{M-n p} & Postscript file\\ \texttt{M-n P} & PDF file\\ \end{tabI} \columnbreak %%%%%%%%%%================================================================ \Sect{Editing source files} %% ~~~~~~~~~~~~~~~~ For use in \texttt{ess-mode} edit buffers, (\texttt{*.R} files): \begin{tabI} \texttt{\TAB} & Indent this line \\ \texttt{M-\TAB} & Complete filename/object\\ \texttt{M-C-/} & Indent region\\ \texttt{M-C-q} & Indent this expression (use at `\texttt{\{}')\\ % \texttt{C-c\TAB}& Complete S object name \\ % \texttt{M-\TAB} & Complete file- / path- name \\ \texttt{M-C-a} & Beginning of function \\ \texttt{M-C-e} & End of function \\ \texttt{M-C-h} & Mark this function\\ \texttt{\scriptsize C-u C-u} \texttt{C-y}& Yank striped commands\\ \end{tabI} \begin{tabTit}{Evaluation commands (Prefix \texttt{C-u}: \emph{in/visibly})} \texttt{M-C-x} & Evaluate region or function or para \\ \texttt{C-c C-c} & Evaluate region or para.\ or function \&\emph{ step}\\ \texttt{C-\RET} & Evaluate region or line \&\emph{ step} \\ \texttt{C-c C-l} & Load this buffer's source file\\ \texttt{C-c C-j} & Evaluate this line \\ \texttt{C-c M-j} & Evaluate this line and go \\ \texttt{C-c C-f} & Evaluate this function \\ \texttt{C-c M-f} & Evaluate this function and go \\ \texttt{C-c C-p} & Evaluate this paragraph and step \\ \texttt{C-c C-r} & Evaluate this region \\ \texttt{C-c M-r} & Evaluate this region and go \\ \texttt{C-c C-b} & Evaluate this buffer \\ \texttt{C-c M-b} & Evaluate this buffer and go \\ \end{tabTit} \begin{tabTit}{Others} %%-SfS-deleted: \texttt{M-\TAB} & Complete S object name \\ \texttt{C-c C-v }& Help for object \\ % \texttt{C-c h }& Handy commands \\ % \texttt{C-c C-d }& ``\texttt{dump}'' -- Edit another object \\ %%\texttt{C-c C-y} & Return to S process \\ \texttt{C-c C-z} & Switch to process buffer \end{tabTit}\\[0.5cm] %% Is it worth putting here for one line? Autoyas is a much more general snippet %% generator. % \begin{tabTit}{At SfS, or activated by \texttt{M-x ess-add-MM-keys}}%-SfS-added % \texttt{C-c f} & insert function() definition outline%-SfS-added % \end{tabTit}\\[-1mm]%\\[0.5cm] %-SfS-added \Sect{General Commands} \textbf{ess-doc-map} (\textbf{C-c C-d}): \begin{tabI} \texttt{C-a, a} & \textbf{A}propos \\ \texttt{C-d, d} & \textbf{D}oc on object\\ \texttt{C-e, e} & D\textbf{e}scribe object at point (\texttt{C-e} or \texttt{e} to cycle) \\ \texttt{C-i, i} & \textbf{I}ndex\\ \texttt{C-v, v} & \textbf{V}ignettes \\ \texttt{C-o, o} & Dem\textbf{o}s\\ \texttt{C-w, w} & \textbf{W}eb search (dialect dependent) \\ \end{tabI} \textbf{\underline{ess-extra-map}} (\textbf{C-c C-e}): \begin{tabI} \texttt{C-d, d} & Dump object into edit buffer \\ \texttt{C-e, e} & Evaluate expression (\texttt{C-u} in temp buf) \\ \texttt{C-i, i} & Install package (in R) or library \\ \texttt{C-l, l} & Load package (in R) or library \\ \texttt{C-s, s} & Set indentation style \\ \texttt{C-t, t} & Build tags for directory \\ \end{tabI} %% ~~~~~~~~~~~~~~~~~~ \end{multicols} \pagebreak \begin{multicols}{2} \Sect{Reading help files} %% ~~~~~~~~~~~~~~~~~~ For use in `\texttt{*help[R]($\ldots$)*}' help buffers: \begin{tabI} \texttt{SPC} & Next page \\ \texttt{b, DEL} & Previous page (`\textbf{b}ack')\\ \texttt{n} & \textbf{N}ext section \\ \texttt{p} & \textbf{P}revious section \\ \texttt{s} & \textbf{S}kip (`jump') to a named section \\ \texttt{s e} & e.g., \textbf{s}kip to ``\texttt{\textbf{E}xamples:}'' \\ \texttt{l} & \underline{Evaluate one `Example' \textbf{l}ine} \\ \texttt{r} & Evaluate current \textbf{r}egion \\ \texttt{q} & \textbf{Q}uit window \\ \texttt{k} & \textbf{K}ill this buffer\\ \texttt{x} & Kill this buffer and return (`e\textbf{x}it)\\ \texttt{h} &\textbf{H}elp on another object \rule{0pt}{3ex}\\ \texttt{?} & Help for this mode \\ \texttt{a} & Display \textbf{a}propos\\ \texttt{i} & Display \textbf{i}ndex\\ \texttt{v} & Display \textbf{v}ignettes\\ \texttt{w} & Display this help in \textbf{w}eb bro\textbf{w}ser\\ \end{tabI}\\[0.5cm] \Sect{ESS tracebug} %% ~~~~~~~~~~~~~~~~ Commands in \textbf{\underline{ess-dev-map}} (\textbf{C-c C-t}): \begin{tabular}{p{20mm}l} \texttt{?} & Show key help \\ \texttt{C-b, b}& Set BP (repeat to cycle)\\ \texttt{C-k, k}& Kill BP\\ \texttt{C-n, n}& Goto next BP\\ \texttt{C-p, p}& Goto previous BP\\ \texttt{`} &Show R Traceback (also on \texttt{C-c `}\\ \texttt{\~} &Show R call stack (also on \texttt{C-c ~}\\ \texttt{C-e, e}& Toggle error action (cycle)\\ \texttt{C-d, d}& Flag for debugging\\ \texttt{C-u, u}& Un-flag debugged objects\\ \texttt{C-w, w} & Watch window\\ \texttt{0..9, q}& Recover commands\\ \end{tabular} Commands in \textbf{\underline{ess-debug-mode-map}}\\ (active during debugging): \begin{tabular}{p{20mm}l} \texttt{M-C}& Continue \\ \texttt{M-N}& Next line\\ \texttt{M-Q}& Quit\\ \texttt{M-U}& Up frame\\ \texttt{C-M-S-c }& Continue Multiple\\ \texttt{C-M-S-n }& Next Multiple\\ \end{tabular} \underline{\textbf{Others}} \begin{tabular}{p{20mm}l} \texttt{\small{C-x `, M-g n}} & `next-error' (emacs)\\ \texttt{M-g p} & `previous-error'(emacs)\\ \end{tabular} \columnbreak %% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \Sect{ESS developer} %% ~~~~~~~~~~~~~~~~ Evaluate your code into the package (in \textbf{\underline{ess-dev-map}}: \textbf{C-c C-t}): \begin{tabI} \texttt{C-t, t} & Toggle developer on/off\\ \texttt{C-a, a} & Add package to the dev list\\ \texttt{C-r, r} & Remove package from dev list\\ \end{tabI} \end{multicols} \end{document} ess/doc/README.SAS0000664000175000017500000004636012423756516012022 0ustar eddedd-*- indented-text -*- ($Revision: 5.4 $) ESS: Using SAS ============== The SAS module in ESS (ESS[SAS]) is currently undergoing development. It is functional and pretty stable. Please send any suggestions and bug reports to ess-bugs@stat.math.ethz.ch. ESS (originally S-mode) was initially designed for use with S and S-PLUS(tm). ESS has been extended to support other languages, including SAS(tm). The editing of SAS files is based on the stable, old SAS mode by Cook (ftp://ftp.biostat.wisc.edu/pub/cook/sas-mode/sas.tar.gz). Those editing features and new advanced features are part of ESS[SAS]. The user interface with ESS[SAS] is similar in behavior to the interface for S (unlike Cook's SAS mode) and to the windowing interface that SAS itself uses. We denote by _Emacs_ one of the GNU family of editors, either Emacs (as developed and maintained by the Free Software Foundation) or XEmacs (which is a derivative work). The following is covered in this document: - general Emacs features. - Editing files. - running an interactive SAS process as an inferior process to Emacs - running a batch SAS process in a shell buffer - Scenarios for use (possibilities, based on actual usage) - using transcripts. - Design Philosophy Emacs: General features ======================= We assume that you are familiar with Emacs terminology and syntax: file, buffer, region, description of keys etc. If not, please read the New Users guide (found in the info pages, "C-h i" (by pressing control h, i) or Tutorial, "C-h t"). ESS[SAS]: Editing Files ======================= ESS[SAS] is the mode for editing SAS language files. This mode handles: - proper indenting, generated by both [Tab] and [Return]. - color and font choices based on syntax. - ability to send the contents of an entire buffer, a highlighted region, or a single line to an inferior SAS process, if one is currently running. - ability to switch between processes which would be the target of the buffer (for the above). - ability to save and submit the file you are working on as a batch SAS process with a single keypress and to continue editing while it is running - capability of killing the batch SAS process through the shell buffer or allow the SAS process to keep on running after you exit Emacs - single keypress navigation of .sas, .log and .lst files (.log and .lst files are automatically refreshed with each keypress) ESS[SAS], the mode for editing SAS language files, is automatically turned on when editing a file with a ".sas" suffix (or other, if specified in ess-site). The batch processing keypress commands are enabled by default to use the same function keys that the SAS Display Manager uses. The interactive capabilities of ESS require you to start an inferior SAS process with M-x SAS (described below). At this writing (ESS release 5.2), the indenting and syntactic highlighting are usually correct. ESS[SAS]: Function keys for batch processing ============================================ The description of the setup for function keys for batch processing of SAS files is unavoidably more complex than we wish it were. The actual use of the function keys is simple. There are five distinct options: 1. (default) Function keys in ESS[SAS] modes do whatever they normally do in other emacs modes. Many users will have defined some of the keys [f2]-f[8] in their .emacs or _emacs file, or will have installation-wide definitions in their site-start.el file. By default, ESS does not override those definitions. This default is intended to make ESS[SAS] mode behave similarly to other emacs modes. 2,3,4,5. Users who are primarily familiar with SAS, and who are learning emacs as a way to approach SAS, will likely want to duplicate the function key capabilities that SAS Institute provides with its Display Manager. There are still options. SAS provides different function key definitions with its PC and Unix products; ESS can use either. The ESS[SAS] function key definitions can be active in all buffers (global) or limited (local) only to buffers that have SAS-related file extensions: .sas, .log, .lst, and "Type-1" which defaults to .txt. The distinction between local and global appears subtle. If you want the ESS[SAS] definitions to work when you are in *shell* or when editing files other than the file extensions that SAS recognizes, you will most likely want to use the global definitions. If you want your function keys to understand SAS batch commands when you are editing SAS files, and to behave normally when editing other files, then you will choose the local definitions. The option can be chosen by the person installing ESS for a site or by an individual. The site manager can uncomment only one of the following lines. ESS[SAS] Function keys are available in ESS[SAS] and related modes if you uncomment either of the following lines in your ess-site.el: ;;2; (setq ess-sas-local-unix-keys t) ;;3; (setq ess-sas-local-pc-keys t) ESS[SAS] Function keys are available in all Emacs modes if you uncomment either of the following lines in your ess-site.el: ;;4; (setq ess-sas-global-unix-keys t) ;;5; (setq ess-sas-global-pc-keys t) The names -unix- and -pc- have nothing to do with the operating system that you are running. Rather they mimic the definitions that the SAS Display Manager uses by default on those platforms. The option can be selected by an individual by adding a line to the .emacs (or _emacs) file, immediately following the (load "ess-site") line. If your site manager has chosen an option 2,3,4,5 you don't want, you must turn it off before selecting a different option. To turn off an option, add the appropriate line (uncommented) to your .emacs (_emacs) file. ;;2; (setq ess-sas-local-unix-keys nil) ;;3; (setq ess-sas-local-pc-keys nil) ;;4; (setq ess-sas-global-unix-keys nil) ;;5; (setq ess-sas-global-pc-keys nil) Finally we get to what the function keys do. Unix PC F2 F2 Refresh:revert the buffer with the file if the file on disk is newer than the file currently in the buffer. F3 F8 Submit: save the current .sas buffer (which may be the .sas file associated with the .lst or .log file you are actually looking at) to a file and submit the file to a background SAS job. F4 F5 Program:switch buffer to .sas file. F5 F6 Log: switch buffer to .log file, "refresh" and goto next error message, if any. F6 F7 Listing:switch buffer to .lst file and "refresh". F7 F4 Type-1: switch buffer to Type-1 (defaults to .txt) file and "refresh". F8 F3 Shell: switch buffer to shell. Keys [f3]-[f8] mimic SAS Display Manager keys. One other key has been provided for convenience. F2 performs the "refresh" operation on the current buffer. "refresh" compares the buffer date stamp with the file date stamp and replaces the buffer with the file if the file is newer. This is the same operation that is automatically performed when Log, Listing, or Type-1 are pressed. Type-1 takes you to a file with a user-specified extension; .txt by default. You can over-ride the default, by specifying a different extension in your .emacs file: (setq ess-sas-suffix-1 '.txt') ESS[SAS]: TAB key ================= Again, two options. The TAB key is bound by default to sas-indent-line. This function is used to syntactically indent SAS code so PROC and RUN are in the left margin, other statements are indented 4 spaces from the margin, continuation lines are indented 4 spaces in from the beginning column of that statement. This is the type of functionality that Emacs provides in most programming language modes. This functionality is equivalent to uncommenting the following line in ess-site.el: ;;; (setq ess-sas-edit-keys-toggle 0) ESS provides an alternate behavior for the TAB key that makes it behave as it does on non-emacs terminals, i.e. move the cursor to the next tab stop. The alternate behavior also provides a backwards TAB key: C-TAB. This functionality is obtained by uncommenting the following line in ess-site.el: ;;; (setq ess-sas-edit-keys-toggle 1) Under the alternate behavior, the TAB key is bound to tab-to-tab-stop and the tab stops are set by default at multiples of 4. iESS: Inferior ESS processes ============================ iESS (inferior ESS) is the mode for interfacing with active statistical processes (programs). To start up iESS[SAS] mode, use: M-x SAS We plan to add - The ability to request help from a process for variables and functions, and to have the results sent into a separate buffer. - completion of object names and file names. ESS[SAS]: Batch processes ========================= The default command used by the Submmit funciton key (F3 or F8) to submit a batch SAS job is simply "sas". If necessary, you can over-ride this in your .emacs file something like one of the following: ;;; (setq ess-sas-submit-command "nohup nice sas") ;; Unix ;;; (setq ess-sas-submit-command "c:/progra~1/sas/sas.exe") ;; Windows ;;; (setq ess-sas-submit-command "invoke SAS using program file") ;; Mac Note that when you are specifying a path under Windows, you should avoid spaces (that is use "progra~1", not "Program Files") and you should use forward slashes "/". There may be occasions when you want to run a particular buffer under a different version of SAS or specify different options on the command line. In that case, you can over-ride ess-sas-submit-command in your local buffer with file variables or other means. There is a built-in delay before a batch SAS job is submitted when using a Unix shell under either Unix or Windows. This is necessary in many cases since the shell might not be ready to receive a command. This delay is currently set high enough so as not to be a problem on any system. But, there may be cases when it needs to be set higher, or could be set much lower to speed things up. You can over-ride the default in your .emacs file by (the default of 5 seconds is shown): (setq ess-sleep-for 5) Scenarios for use ================= We present one scenario for using ESS to interact with SAS. Contributions of examples of how you work with ESS are appreciated (especially since it helps us determine priorities on future enhancements)! (comments as to what should be happening are prefixed by "##"). Batch SAS (-unix-keys illustrated, pc-keys in the comments) ## Find the file you want to work with C-x C-f myfile.sas ## myfile.sas will be in ESS[SAS] mode ## Edit as appropriate, then save and submit the batch SAS job. ## -pc- F8 F3 ## The job runs in the shell buffer while you continue to edit ## myfile.sas. If you are running a Unix shell under Unix or ## Windows, the message buffer will notify you with a shell ## notification when the job is complete. If so, then you ## will also have the option of terminating the batch job ## before it is finished. ## -pc- F3 F8 ## In any case, you may want to visit the .log while the process ## is still running (unix only) or when it is done and check for ## error messages ## (you will be taken to the next error message, if any). ## The .log will be refreshed and you will be placed in it's buffer. ## -pc- F6 F5 ## Now, refresh the .lst and go to it's buffer. ## -pc- F7 F6 ## If you wish to make changes, go to the .sas file with ## -pc- F5 F4 ## and make your editing changes. The go back to the submit instruction. Interactive SAS ## Find the file you want to work with C-x C-f myfile.sas ## myfile.sas will be in ESS[SAS] mode ## Edit as appropriate, and then start up SAS with the cursor in ## the myfile.sas buffer M-x SAS ## Four buffers will appear on screen: ## myfile.sas in ESS[SAS] mode # your source file ## *SAS:1* in iESS [SAS:1] mode # ESS communication buffer ## *SAS:1.log* in Shell [] ESStr mode # SAS log information ## *SAS:1.lst* in Shell [] ESSlst mode # SAS listing information ## If you would prefer each of the four buffers to appear in its ## own individual frame, you can arrange for that. Place the ## cursor in the buffer displaying myfile.sas. Enter the ## sequence: C-c C-w ## The cursor will normally be in buffer myfile.sas. ## If not, put it there: C-x b myfile.sas ## Send regions, lines, or the entire file contents to SAS ## (regions are most useful). A highlighted region will normally ## begin with the keywords 'DATA' or 'PROC' and end with the ## keyword 'RUN;' C-c C-r ## Information appears in the log buffer, analysis results in the ## listing buffer. In case of errors, make the corrections in the ## myfile.sas buffer and resubmit with another C-c C-r ## PROC GPLOT graphs will normally be produced in a postscript ## file and be viewed later. Include the lines /* required gsoptions for batch files */ /* comment out these lines for interactive use on X-terminals*/ filename grafout 'temp.ps'; goptions device=ps gsfname=grafout gsfmode=append gaccess=sasgastd; ## in myfile.sas. ## PROC PLOT graphs can be viewed in the listing buffer. You may ## wish to control the vertical spacing to allow the entire plot ## to be visible on screen, for example, by proc plot; plot a*b / vpos=25; ## At the end of the session you may save the log and listing ## buffers with the usual C-x C-s commands. You will be prompted ## for a file name. Typically, the names myfile.log and mfile.lst ## will be used. You will almost certainly want to edit the saved ## files before including them in a report. The files are ## read-only by default. You can make them writable by the Emacs ## command C-x C-q. ## At the end of the session, the input file myfile.sas will ## typically have been revised. You can save it. It can be used ## later as the beginning of another iESS[SAS] session. It can ## also be used as a batch input file to SAS. ## The *SAS:1* buffer is strictly for ESS use. The user should ## never need to read it or write to it. Refer to the .lst and ## .log buffers for monitoring output! Here is a typical myfile.sas: title 'Analysis of Case 0502'; data case0502; infile '/home/public/stat/Data/case0502.asc' firstobs=2; input percent code; run; proc glm; class code; model percent=code /ss1; run; Recommended autoexec.sas ======================== The default settings of the inferior-SAS-args in ess-sas-d.el are "-stdio -linesize 80 -noovp -nosyntaxcheck" with the interpretations: -stdio required to make the redirection of stdio work -linesize 80 keeps output lines from folding on standard terminals -noovp prevents error messages from printing 3 times -nosyntaxcheck permits recovery after syntax errors In addition there are several parameters that can't be set in the command line. For these, we recommend the following line appear in your autoexec.sas in your home directory: options noovp pagesize=60 linesize=80 formdlim=' '; Interpretations noovp prevents error messages from printing 3 time pagesize=60 standard printed page length instead of window length linesize=80 keeps output lines from folding on standard terminals formdlim=' ' blank replaces "C-l" formfeeds to prevent mostly empty pages The noovp and linesize=80 appear in both the inferior-SAS-args and in the autoexec.sas. The redundancy means that these options are in effect for SAS batch usage and SAS window manager usage as well as for ESS[SAS] usage. Using Transcripts ================= Not yet available. The intent is that a marked section of a log file from a previous SAS run can be resubmitted to SAS. The user would highlight a region from 'PROC' to 'RUN;' and then send it to the inferior SAS process with the [RET] key. ESS would automatically clean the region (remove line numbers) and send the entire region over as a single request to SAS. Design Philosophy ================= ESS[SAS] mode was designed to aid the user in writing and maintaining input command files, such as myfile.sas, for SAS. These are files containing SAS statements. In a batch environment such files would be submitted to SAS by the operating system command: sas myfile.sas In a SAS window environment, these files would be brought into the "SAS: PROGRAM EDITOR" window and then submitted with the 'Local' 'Submit' menu commands. The *SAS:1.log* buffer in ESStr mode corresponds to the file myfile.log in SAS batch usage and to the "SAS: LOG" window in the SAS window environment. All commands submitted to SAS, informative messages, warnings, and errors appear here. The *SAS:1.lst* buffer in ESSlst mode corresponds to the file myfile.lst in SAS batch usage and to the "SAS: OUTPUT" window in the SAS window environment. All data related printed output from the PROCs appear in this window. The iESS [SAS:1] buffer exists solely as a communications buffer. Files are edited in the myfile.sas buffer. The C-c C-r key in ESS[SAS] mode is the functional equivalent of bringing a file into the "SAS: PROGRAM EDITOR" window followed by the 'Local' 'Submit' menu commands. The user should never use this buffer directly. The ESS[SAS] mode was written with two primary goals. 1. Using Emacs, a window environment becomes available for dial-up users who do not have access to the SAS window environment. 2. The authors prefer the Emacs environment for editing and managing input and output files, even on computer systems which run the SAS window environment. A secondary goal was also realized. 3. With an X-windows terminal connected by ppp at 14400 baud to a Unix system running SAS, iESS[SAS] interaction with SAS was hundreds of times faster than the SAS window system. The savings come because the ESS windows are subunits of a text-based xterm window, rather than the remotely managed graphical windows provided by SAS. (The timings are SAS timings from the log files. The SAS windows times include window management and communications times as well as calculation times. The iESS times include only the calculations by the SAS computing engine.) Some Frequently Seen Problems ============================= 1. If M-x SAS gives weird errors upon startup, check the following: - ess-sas-sh-command (in the ESS source directory) needs to be executable (solution: "chmod ugo+rx ess-sas-sh-command"). - sas isn't in your executable path (verify using "which sas" from a shell command-line) - you need a copy of SAS (we can't solve this) 2. M-x SAS starts up SAS in the window system (motif, for example), instead of starting it up in the emacs buffers. Probably the unix command "sas" on your system calls a local script which in turn calls the sas executable. The fix is to call the sas executable directly. Change the line in ess-sas-sh command from: sas $stdout 2>$stderr $@ to a call to the complete path name of the sas executable on your system, for example: /usr/local/sas612/sas $stdout 2>$stderr $@ To find the complete path name on your system, you can execute the line (from the unix prompt): find / -name 'sas' -exec ls -ld {} \; and expect a response similar to the following -rwxr-xr-x 1 sas sas 2441216 Sep 9 1997 /usr/local/sas612/sas ess/doc/font-cor-s.gif0000664000175000017500000003124312423756516013165 0ustar eddeddGIF87avў?? / ///?? 0000?0???@?`@@/@@0@@?PP?`P o/oo?@@@@O@OPOPPPP_P____`_``OooOpp@ppOOooP``_oo_```oo`oooppppАoАp0ААPППPРР`ЯЯ`ЯЯoААpААРРpппo0OЯ┐АААПППРРРЯЯЯаааппп░░░┐┐┐╧╧П▀▀П╨╨Р▀▀Р▀▀ЯррРяяЯ└└а╨╨░яяаяяпЁЁп  прр┐ЁЁ░ЁЁ┐  ┐╧╧╧▀▀▀ЁЁ└  └  ╧  ╨  ▀ррр  р  яЁЁЁ   !∙,v@ йH░а┴Г*\╚░б├З#JЬH▒в┼Л3j▄╚▒г╟П CКI▓д╔У(Sк\╔▓%BT╝ Т#Ц,W▓4Aт$ )R░T"eЙР5У*]╩┤й╙зPгJЭJ╡к╒лX│j▌╩╡л╫п`├КK╢м┘│h╙к]╦╢н█╖pу6їBeж▌╗xg▓@7п_╗{kЎ¤ы7p╜0e╥d·г▒ПжzёurО╔Ц-'╒,ШrgмЪC{╞|┘sщ╣жOoN¤y)gзШGУV··їj╣╕sы▐═╗╖я▀└Г N╝°╓┴Дёю Аps─Вы▐@Эz^├Иc╬ДJ▌╕ўяр├Л O╛╝∙єш╙л_П6╗bчxЯ√}.?╣¤√Aъч╒П┐ t √▀}·ёG`|Ша]╓MgрL&°`Б"( ц╖рЖvшсЗ Ж(тИ$ЦhтЙ(житК,╢штЛюеМ4╓hуН8циcюшуП@)фРDiфСH▐%гb▒5щфУPF)хФTViхХXfйхЦ\vщхЧ`Ж)цШdЦiцЩhжйцЪl╢щцЫp╞)чЬtВ9cМ╧-9f╒їY]l~·╔%_`R╟'б^ :ЩвЙ:i(ЯНъhЧМB║шдOV┌dеЪ2·шжT*·йЦЬ:*jжС^║щйQjzидж┬р *аЮbJлдоN╔Wнл╩:+б╝··ке╢╢·iй│&Ы(▓┬к║hоuF+э┤╘Vkэ╡╪▐_аДэх▐Ю╬цК(┤Uю┌'й. ьиВByо║л╛ЫeащЪ*п╜ї╥zп╛гт█п╣∙·ч▒я╩Ыю╛╧L0╜■&ЬЁг╖Ый─ёоK.жк░┼Б║Ыq╗лЫ/╚√v j╞№Ў█(╩╪╢ьЄ╦0╟,│╦T░`є═8чмs╬y&ю╠@-Ї╨DmЇ╤H'нЇ╥L7M╫{zДЮA8mї╒Xgнї╓\wэї╫`╦йэЖR SЎ┘hзнЎ┌l╖эЎ█lП╜`┘>W ў▌xчнў▐|ўэў▌r'HўМи:kы┼зНxтМ7ю°уРє╕АГ3)л╕─ТZо╗Зъ*цЩы&тЯg╬jшиз*zс[v*%шЖз╛∙ьє▓n{▓зз {ьк╦∙я└┐ўфV■│ЁX/О№Є╠7я№єKяЯёvCo¤ї╪gп¤Ў┬K▀ї▄З/■°фЧo~╥▐у■∙ь╖я■√Ё╟╧e·ўн/ ¤°чп ■═╙oЯ¤╛ЩH7(5)oАл+`╦3*+Б║ВШ╩К╒:~Йtд`╨xA═QКvm#  ╢ц┐фРwь`иZEG┴╥╜╬ВlVю╪м_┴ЁГЕЄ` {╟,▓ЁЕ╜KбпфB▐pЗL°▓"2Qv; ┤╞uDVPЕG$╫A8BзХ░[ =#\п╟▓1Ъ╤L&C[╧°╕к╣Q&p|гуH╟oUПНx╠гў╚╟i═ёПu дзV╖5i▒\╗ зz;╫╤РСЖГд# ─вaЁЙКМ╒#}II╬0ИVФd Нx┼*ЎёФи W)╚8RМД┘ыд╝YО▓o╢ЬS-MIJ$Ц▓Тй ж0╗─╩b ЄХЦГ╙Ц╔╠f6sШ╨Мж4з 7cZ╙ХfЛУ3Ч╔Аn>єvCдSu8н\rЛ└М%8AЙC^RєЭЁ █5чЙ╠у╣iЫ▌dА3╫9IvnRЖОLз?¤┘╔!RаM$A╣Ш&Q┤v+МзD'z╢y╢RОї╝xу=╖╔QКzЇг йЬ,j═МнSУYJК&s*Ёе5фJ{∙KLКЇж8ЭI/кШlmЬгW░Lw╬~ЄnЛEEЭC┴Щ"qис╝e∙щRЪZ5зX═*ЭvZLУнкeлХ─ъ2ЕFїкr"л╡╩╓╢╓Йл їк[Е╔QО 5Нs═л^├╫U╩uf ]$mjT"Ьf%т]%╕XrїX1ез╦I┬ж╨Щ∙▄цbC╢╫╬zЦJ}=жOjмБ1Ў┤уjPU░ jЁ^;Ъа6ЖZНс5eУZг/╩[v63│Ъ▌мk?K▄тN&┤№лqб)▄с.ў╣yEnХ ▌ъZў║├▄HУЙ▌юzў╗f ▄] rBЁЪў╝ш5▀╔╗▌ЩhБ яН/|ч+▀·╥ў╛ё5А}ўЛ▀■Єў┐■ 0А,р°└N0Вмр3°┴О0Д',с S°┬╬0Ж7мсs°├1ИG,тУ°─&N1■КWмтШLv╠пfLc╙╖╞86Аї[`┐╫╟¤2РQ<ф√∙╟ЁхёБХLЕ!3╣╚GNЄ~Щ?СЯ|З(─иx u^>GЧPх уy╩+И[Юw|чIЯz <■Єаw|цd·╓│▐ї┬|ЯT┐z─√■ў└╛ЁЗO№Qн°╚O╛ЄЧ╧№ц; ∙╨П■СF.&║Ї\dSЎж█И╛i√m╩>°у4■z?▀шo╙╝ХSob┴n√ ╠▌`YчD╡ЮSКС▌ma{╙г╛╢имeY╦Є╩▓V1┼AячI∙ўOЕ╒CKЇ/У~▀╡~Jн╥~ИJ╖uБ9╕Б В"╕&Иv4В(ШВ*ш%%HH'╕В0Г2╪$-Hn3xГ8xБ5°Б╒А^PLSU@-хWSдNгГ4EШГL╕%;°В=H?шГBdАg┼NC╪юw;Є╖CNdYїGU °XXЕїЕ√╫Еh%JK╪Дnx%O╚mo8ЗtИ^qH}uШЗzИ]wXH{°ЗА°\}KБXИЖ8W Г╚]З╕ИМ(RЙhO╝eч╟╧r254YСUГB╡ТXAфЙОеЕ-╘ЙЧ(*еY№ЇЙиXЙ╖)ЪHYйШDh╪9о╕▀GЙ·╟.з8heDYxKBШД2д:C8\VxnПh7wх/NЕ%╔╚}C[и╥}╜ДW$0┘ШT├/WШV▒┼2│ZУ2╧°Й#УRЛs}S1меZ1єОЬED╓╥ZS2█h[ЬeНL╡КRE~╙Н╣UП╜╒ЖИ5d├ГН╪Р∙N╥ЕQxИFc<цДРgВСj4UюН,їРС╪фЗ ╒С▓(Ж ╕Ж-dПVEY'╣A┘Т~▄иКмHУщЛ3y9&9&╤Т(ТГ4С>9ФDЙG@┘S$∙&u╡ME┘ФNЩ7G ЕJЙY▐ЇM Ж)YЛ@хKБEА│ЙїC Р┌ЧУ╜5V1∙Фj'Q)ЗjRW└5d)NpвС║4ЕУX-Т╪Сk┘Чi╥ЦBщЧВ9Ш╪Ш I X╝Д2э╕ZЫ(2К┘ШХОжXОё(.ЁшО5Y╝иОiyД)$V=IШв c:gAZ_ЗffUVl═╢г╢lnFl/j_8ZarЖd=ZеJjеXzе¤┼в u╙kQ вQ:еM еИЦ_tfжAЖдK `5JдdЪеp*еvVж║цжCzзgкжhzдIjдtJеZзc:и╩цg┴Ўek╞д╥ЎжБкгМзРкеС:й ╞е3BйШ*йЪЪйЬ║йЮ┌йа·йвкд:кХzkз)бк║к╒Bбr'Хмл▓ъGZЪ░:л╕ЪлъзР╣gBaфo└м┬:м─Zм╞zм╚Ъм╩║м╠┌м╬·м╨н╥:н╘Zн╓zн╪Ън┌║н▄┌н▐·нрот:о:гx╥wошЪоъ║оь┌ою·о4B5L13 1ЁoЧп·║п№┌п■·пkFX.3Нсx╟tK!5p {░(`ЁXАGрW╫r`зr`g│s ;sdwr$╦▒&{vku"чr,░.√▓0│2ыпqў?sз{BхБv7=u╖tЄ╩░Bл,`-Рр╦uXW░dўqRч┤нБr▓БvKs,лuT╟r!√u#;│b;╢d[╢fл5ыл╠▒xE'Hzx░?лp]@/з_'v( ╢1Ч╖ar(√╡-RЫ▓f╕g╗╕М█╕О√╕batиWБk;zJ'╣аЧtД$╖ u├а:╨?░ ╣ж{║иЫ║к╗║pс╟╩п+▒ы│ц п╢{╗╕Ы╗║╗╗╝█╗Cr|Х7{Ц[{Ы╟-ЧW"уE{ B/є!y "╝!B╝═█л╘[╝│'╝╨╦#╒k!╛█╜▐√╜р╦|└;╫√y╝'{Т'╜Уz░Gz▒╖!Ьw╛еЧ╛R╛Р'┐оз╣нw╝е╟┐═╤ ъл!▒w╝э█{<В╜·л{Т│√Л╛╬╛┴<┴B2╛╒ {\l└°ayЄ╗┴Ё╦╜єk╛й└Вt°█┴в┴╬ ┬Є╛╩K┐¤√┴в7╜$╠┴ т╛:Мy8L┴>№├@─!b┴B\─п╢└FЬ─J╝─Ш║·─Pl'┴Р║c}Q|┼Q№а╕c┼╨Р╣XТ_щЭi4тДj│ХXLQ╥╖ьл8йУ┌ў/═HIDe;@К╕+▄ЩЙ5 Ц<ЩТЬ°ХxьХЩTEЯЇЭбФE╡╪HЯЩЧЗ╠╚|▄╟i 9ZЕЗГЧ╕ш+зsМЎ"╔ ЕКh9ЧZ C│╘ЪшI╚┴EИеЪ┼ТМчhЦoМЕ╝╔ЖдМЛМ┤О▀8╔\S╔║l╞╜мЗ┌uл┐<╠╜╠╦─|╠Уl╠╚╝╠Pм╠╠№╠│ъ╠╨<═к*═╘|═ j═╪╝═к═▄№═╫щ═р<╬╜й╠▒l╔Фr0VЪъL-╓йЮчЩЫ╧I╞ф<Б╝Ъx┘PHЮ▄зЯ▀иЙк,Е╨о∙@t}б<Ыt*■|U▓°О^X╦║и╟┐фZQЇ╚╖i╩аlУпМїl╧╞ўБч\┼]ЬК┼ХЭЩ╔c°~ЪмЫW╕╚ЪtЙщ╥╨(╙н╙в╝╥┐иАэ]Х╥!=╙3еШЧ╣╧A]F║ХБ@M╤%│Шэ,╘ц╔П·╪Пє(X+Е╘"ЩЫs╘N═X╬XЩЫIЩТйНSНR╣╙{%╬ e╒f╜╓`Г╓l¤╓щ╓p=╫Л(╫t}╫Аh╫x╜╫uи╫|¤╫Mш╫А=╪3(╪Д}╪* h╪И╜╪!и╪М¤╪(╪eЬЧ,)╧i┼ЫШ}╥ЪНЬШlТ\ ╧QVDЩЮмЧф╧Ы╦КuRЫmЗўL9 Й╞─иЮ ╜╨X╔ЕнЬ╟л╙ЮИ4╟╦YЫgE╙рISбY┘8НТs┘╚№Г╛═ЬФ¤▄▓m╚¤T▄Ю│▄╣Н█╞Э▄чe╬╧=╥╚-,h╙▓щ╩ЬфЙKe▌Э╜Nж\╚Й|╨ДЬЖшЩ─█й Ъўи▐7$▄°ўB╤╞єR╩╒M╨$▌┌ц╡М╒YЭё-╞w╣@щ╜╬х╘рДuр>с^с■╘^ 9ГL▌MV╛▌╧J┼Р=т*(а$~т0hтЖ╘Tпь8╢Ї╬a┼╧Мrєт▐▌еНтЕYл%х─єlОъ╕0 ├ШЁ2фX-НёRф╕5О№с╘и┌z9╘Н∙уN5╒Є]╨ЄH┌^)░UПЪ9Щс ┌1Нуёгт-╡Уеї╘hx╦═н╤gi█-┘▀дeу·Ьцгх╖ь▐ЩЙI/щфa.ця Cцe~╙═╚j╛╩ ▐ЬГ╦f╚чўmу▒Iшгhшз,р╒ИчЦ╪ч=о▌~Юу@ЩкЩ▐ш0щ▄й▌80.КСМщЯю▀ЫЮ=А╛ъоnoн╬&№iХп^ы╘ыkЧU)Ч╕Yъb\Ж╔Щ┘в■█(=█▓╝ЫЪnышЕыo∙Ю√▄щD╓JД+a\/э┘I┌Уш\]йрЯ│YD-1Л,┌5оьр┼ьiВO╗╛L╒Ю▄ШУ╤╜чl>яыIь─}я╨ юхЩFуО▐╔nючоу╢╩уg┬Q╙ яP╒╕хШМKM[цН}╡┼Ёс■эЬйЯTэНЁ]Ч╧h▀ОЁ▌Жюh2ы╠Xe Є(П6"ЯЄ, \+▀Є0 Y¤/ъ ^Ч╧шБюс оъ╞╬╤■^є1]3я╬▌ЭЕwЫ29▌{ ╚├=ш▀}Нх■█┬Э▌@Ї╒5Ї.▌Я№╨╨оЇ3┘ЭВ<ъ Uя7╧Сэ▌єUoї./Ё]EЁ╫ты`nъN├█ НЪ?╧єj┐ЎЭюЎy▀ў9Еї▄LЄ╦Др~/ЇlW|╬В?Д_°W°~Х°Do┌c с|foY┐╡ю╠╘°ОпўР?]Т/-▌~шFч)╨ Юїж┐P)Н┌ьэ▀Ъть¤йяЯ·щщ4╧Їч╜АйLJ╜ Uяэ·й?ЛЗД·5D√═ф∙╖_\А╧·ZCуЁ│с1)ЭЬ▀∙Є┘№╦ ї№╪╝°╠п¤Ю┼¤р?■з$■ф■yd■ш┐■cф╪ь ■·у■Ё? ёC<┘[Б┬L ·FЄ┐ сEр@В DШPсBЖ >ДQтDК-^─ШQуFО=~ Т Т%MЮDy@Р ,Pё┬R ХЩ5i▐┤ЩчNЭ=y■ЇшPбEЙ5ЪщRеMЩ>uъTйUй^╡ЪыVн]╣~їьX▒e╔Ю5ЫэZ╡m┘╛u╩СеKШ2сR1╒@╥╜w▌■E┌Чo^└Е¤6K°ж╞Н+╢щXЛрЭТ)ч╝№╙▓P╚\3NLЇє█╟МE╫]╢Їc╨И]╖Ж¤Zv`l┌7х╢|3Hс╘8ўЎЮ№pgсСy~6Н│b╞╩ун<Ф°qчU)7ЯЭ╜6▀аВSз ▐xўитЧNG 9цЮ╔├ы$xсЗ'╛xуПG>yхЧg╛yчЯ▌ *жз╛zызwI·ы╖з▐%└╡ч~{я[?X7└AБ ``JаAЙ$Ш(BК,╢А"O(pБ ╜p╕ВР 4Ис И└┴)ф{╔A'┴6pАЕг Ї4╕Av╨ГaE8┬═I/h┘ г┬ ў┴m|о#&Р╥Ёр@v`"X №╗а)8╤FМр3ШD ▒ЙO┤р+hAК\тСHB.v╤Л_c┼8╞.Ъ╨Е0у╔╘И2▄|пЕA`#Kт°┬Є▒дp╪AwаГ <└@ rHEЁАO╘bтдhE&6╥Р[tb# y┼IRТОДд%╔╕INv╥УЯe(Ci╞ЯбPО)[Iг▄(нv┴1Оm$▀▀╟Zц▒ДА'8└&ТСЧ\Ь╔╚abСИ┐f29┼C·rКУe4е9MjV╙Ъ╫╠)}fJ8в^+╘жк_й╩X:кp,ж└╕ebЄЩLf<ЩD"єЧЁ┤з<П°H-╓УТ╪h@:PВ┤Гсф7SYнЕОOЫнlе┤ш(K┴Э@Z<`'$єYL]&СЮ┬4bП╣╧(юSЙuf>;·LyКTгЕiLe:SЪ╓┤qд\уB┐Щ╞ЬFЦ8╒й+%║Bо@ИV`Sж6╒йOЕjTеЪ═7nНUэЩC▒ЪPв ╓ёuЕS6└АйЦ╒мgEkZ╒═Ю╢╒нoeрр┌S└uнw┼k^ї║W╛>╒u}l`;X┬╓░ЗElb╗X╞ZmmНЕld%;Y╩V╓▓Ч┼lf5Ы┤╟╛+иAeх)л┌╨RН┤?;н╨R[┌hн╓│&sЪkyF┌╘╩╡п-эgЗ┌╒┌v│┐npЕ;\тvЦб░эц)╫(N6о$Х> mEы╩8Bw╖ыВю╔Z█┌q·м╢юz.uUЛ╩ь·╘╣╠ ow{ЎJФ-4╝ш%┌iхЫ4▐r╖╣╩U/qї╗_■Ў╫┐w3ю║Ры^╤╛╖└█5ЪtУлSM╖fЁБМ[ √╓─│F0u█Ыс [x╗6Ё{#<▐┘╥╓├ЦpЕY√_╖╪┼/Ж1╙М\╫x┴╟0Й<] _w┼ n0ПoЛcы8┼?Юn}Еь]хжX─HЫoni 4%+x─1╞rЦ╡╝e╧ШХj№ЄНУлa[w╚;Жп}М▌ъЪW═╗].s┼їЗ╠)#8╥S╛Ёecф щ ∙╕┼nЁ▒k╝ьZ▀∙┼╖Оp▓s╜э g;┌уwК╕√э]·▌чоў}я▌юwПw╪є.СУ╦Эя]╝┌╧╛Ў├╦¤цК╟√т┐x╞S▌ЄЧH▒█·омC¤шЮяx╡╙Nў╚╧√рhыD&Яz├╗|уС;╪┐{├ ЭЄ░╜щў¤y▄WЮ▀мп№эв{╫^°L9хГ>|└╗uш╞пyЄ}ОyъS?рgt]┘Й№╤7▐э╛'=ъ!OrЗ]┘фпўя!B■▐├ЫяП?№щ├▀°хы■}g■▐╦п°·{Я√▀ ┐Ф╝╓█┐у╦┐ъC└╗╛RJеW+=╖c┐┴Ы?┌Г╜√ck?У│=Щ#< ь=ш├= d9╟Ы╝ЁГ╛<;╠@─C╣∙{║эc║ў│┐Ь9╘є└╪╗9┴л9¤{? @ФAК[┴ ф>у+┴4B[@л╩╛ф┐#t┬z1┴'Ф┬) Щ╣▓┬Щt*╘BАЙ┬-Ї┬/dШ\лИ╬├24├3DC0L┬м┬B^K├7Д├8ФCn[CоZ┬9─├<╘├=Ы:╠Щ6D6>─A$─Bt?─:@7Cd─Ft─GDфє║ч{╚т╦9Ы+╛д└┌S╣Ж;9lу╣пK┐┘├9Т─╔ву╜щ ╔Ж{╛╨√Iз╙IаД╔єCAаФ╣б▄╔НdJm щ╚@d<~┤╖l╜и│╚Д╝ ы┐йlI<┴ >ї╦╩Ў#└Ї?ОS=·█@BЁєJ▓LAСl╩╣ьЦзdчIддJT╛о,9щC┐МА╣Д|K▓╘J┐4Lбм┴Ъlл╢ьIЦL╠╝▄╩Я|=╖,=╝Ь└╔д╦═╠╗м─П|╗~L╦▒dK╙\╦лЬ;┤╠▓DLМB╣$@╫L╘╝@█Д═ ╘>ў K╬ЇMз,Eг!C∙█MЖ3╗D╨u╨MV├Е╨ еP^ ╬вё╞ ╒╨ н> х╨╤~є╨%╤ї╡5╤U╤┤A╤u╤ЭЩЕ╤еQРС╤┼╤ЕШ╒╤їQс╤╥!еЧ %╥#E╥o 1╥$e╥&]Ц%u╥(Х╥M╝Pв╣EЕ[╩юS═їГ╠┌№Ы┤8[Mx│╔ШьRБT:fс╣шл╡1=@Й)═oД╥·╠═:┼Mу│─S╤є:(ь╙╫Ф└.н╬╜д╬їУ╜УМ╠lбS№у═0e╘v[TРИSm╠╧╠=A%T▄╘IфK╔ж█R╩4╔я╩──INH-U=щs╜и4╙3]:ЩIж[┼┼8zMсф╫сэ┌╩¤a ЦC О_┌j%ZД╘┐╕4Oц╓╓U;(`xA┘dbЁtbФbVе╡]!╬C"▐`ёЕJ ор$F═м┘+ж└Сe╗-цR╝Дa▌╡E┌▒UcЮэ└о%╬o▌\ф╡`у8уЁ5b Fт6\Д┼у;о╩:=Z╬┌╙uуn-с╫eфнuф╛Ыф╘b<ф!уP^ ▀Ў`_е╕,▌╔О╦╔┬╜Uї<ЭuрS╞@╬┌╩ФLКэ9U╒Ц√b ▐фБї]O6ц7dї-ф}Q╓И№fй ч╨gВ ▐l╛╟mЎ▐nFчv>RuЮ_RvчyvRxe■эХ)╨ч}цg~жч~O{ц`|цХ~6ш}шДЎMБО^v▐ИГ╓g`Д6═sVSbо ╛р╧mAуfЕОOЖ▐▀Г№ИЦhжNiюф╞ц]YT.f╜Eсо`СшdeЗ╓ИГЦшЙжhА|╣_6╩im╒[■;4=х╢>╒WmA^MV╪,Ucэт^щсуЭiЬ■MТVц╧ЇГ■щ~.╘▓╜ф\k>╦▓V╬IFc─=dШNcbniн╬iЖЎцщМыФVis5j[Ю[м8ЖхО╞T?жi^lNжы═фъ╗╞И╝ъа^█О╬c╞╛lZ}d┬j:ОZ╗═jНж═╞╢ц╟ж╦╚Цч]ёi╜╓ч;▌b4┌├╦┐╛┌умdФ┼mJN╘╗}kл.lмЮk╘^hЭ.т╒╓Фоь)da▌╫Сщс▐hсiтЖlуc╔╛ИЮ╫╞ьщ■Rшр╙nъ╛iыЮK╒&h╓цю╜FяўGї6щпno╦Жя√╞F∙_№ця╒я2юя/╨ ^f7p%pп╚є.o]╙~pЮZЄж`о%эя>px Lpg╞ЁяpЧЖk3яМОaLЦыъ╬Ёw▄ЁoйцЩ U┌ЖH╛ЮaЪ¤┴Зэ╚mы█|Z\о╪9l ▀ёOmь&dфvЦ╟N╖6ёt═ё╠╬э╡ЦюЛхь╤.q═6фцЄs\ёя],╝К╓╪&╖э1яc ЯЄпeW╓єqоїт(╧rt▄ЄМ№`gХmvЄ╙TkHЦj╓фсц]Znss-'rn6Є#7e'┬ЙЛVЭUWV╓╛&║VеtаєыС$╗r6ьEVЪ4яЇpМs.З▌чЎ=f5iї°.Їu>ЇЦ)gсЭїVGяQ╖ї\'H\╫ї^зG^'ю·▐g+ЇuB╖ ыX╫ja╫gb/vqvm∙є█qЗaiпjД╪g╫6hfovW?ЎїЖЎuл▌+ЩШЮf╢фgmчgnяЎm|vD?сlъ_}ъKe8fЇ┼f]ЇвNSе╙╒a}b~чх╫Lwu_Ў╣jwoїБЮяHNk╧╓эЯє╓Єb╔є fыаEkйэч░юgv_°№n°{~°mщlE■l|ЭX|us╞Х°┴>cЛ╞╪К┬ПGxСyi|wUПxХЯ° ў┌б╟╖Ш╫єэ▄┘=цtГ└∙хNx▀∙iьyЯП┴Ш/є╓▄F▄qЩ╬'┐·╬·w▌tс;xзzрЛzЮ/yЗ▀яp?їs,╢▒W╪x;xИ╓∙┤W╞йзz}╗ЁmCu╨═v│vЕ╟{╡ ЎУ╖neЯВ╗/№aQ╘{СV|╞o№`|№╔╖|Uм№╦╫№P╠№═ў|Lь№╧}G ¤╤7¤ACК╚╨╙g}Gд▌╓З¤7|¤╪з¤2Ь¤┌╟}-№╢ЬJDэ╬¤▀╖PЬ14_ Dvр7■/╝¤уW■╦K■хw~D[pS█чз~-T^╕rЪ╨ВЪ╪~эч■яў■Ё▀~Ёёя■ЄG єWЄ_єg ўw °O°Я∙o ·╟ √╫·▀√-T┤XРа@Дl╚Ёс┬И ':ФXС"DМ3^ь╚ёу╞РGzYТ$HФ&SЮl╔Єх╩Ш*g║ФYУ&LЬ6s▐ь╔єч╬а:З·ZФ(PдFУ%шх)╘иRзR Д*^м6ei`)Xеb╗Ж%;Ц)┌▓i╧кm╦Ўн┘╕kх║е w.▐║yяъэ╦ўп▌└{√%мЕ*т─Qнb╒j╡░@>%Я Ф ∙2рФ6SЦi93f├вs№ Ъ(ч╧ES├ez░kНЭOхМР2щ╫║iчц╜{Їя▐└Q*.^їj╓нAFуО9╗гщс╥Е3МоYKs▀┌з7i}avь7ГО}6yМсn>Ш╛в∙еы╗П¤о~{ф╩ьi[o?}▄8аАRчЦq B┼XrПЭжHй¤wgбI^lмAдadфUHсmэQ!бGєMd┘Д/е6вБИ╘|ё=g|7AQК╤Ш╘Н!R╪#A$:╘^l ]иRО╪╜шЮWуQчУх┘ц^{?юш"Ц.╣eЦ-ЮеаВ :╢▄БIКзdHФЩЪ╫ОВG╙wшUW^НЩРjWвфжЦ]r)tщ9хG╢y╖Тб{╢vиBцн╟gA3ndтЭoN╖f~√I╫ц}Tъш'и}Къ%й^fВb*gaи.]HвОk╛eРЦf·)EГj╩TСж·┌*ЮЕ▐6Tе├╓╣еyейТA╚ьл╜┌*R▒tЩ∙#Л[>:RЮiЦ ,╕г■*юkи з*W/V;о│▄╥Хй2╚ў$Нq*\]vw╩tДr╔J▒╦ ЙЇн2уZ"~╠2═ъ╜7┤Ю9{╠я╓:{НР╚КС∙хЫ■∙>√э╗ >№ё╦??¤ї█?■∙ы┐?чcZї?(@нП< и└2░Б| #(?  ░В─J%и┴ r░Г№ C(┬"РВ -H@фМЙД.|! c(├╥░Ж6tЯ UhA  ▓P97№!Г(─!▒ИF─_u8@╩╬*G|"г(┼)R▒К6D!│и┼-rQ}=tв├(╞1Т▒Мf<гЇ╨з╞5Т╧ЛM у(╟9╥▒ОvbХ@&6Оw№# )╚A~y╘у °╪┬B2▓СО|$$#9ХCЛ:Tд%й╔Mr▓УЮ<"%ЙI0~▓Фж<%*S╣└PъqФ~T%,c)╦Y╥Тz]╝%.▌╪GDЄ▓Ч╛№%0Г)╠a│Ш╞<&2Уй╠e2│Щ╬|&4г)═iR│Ъ╓╝&6│й═mr9╣№&8├)╬qТ│Ьц<':╙й╬u▓│Эю|'<у)╧y╥│ЮЎ╝'>єй╧}Є│Я■№'@Z╬А;ess/doc/README.Windows0000664000175000017500000002301112423756516013012 0ustar eddedd---------------------------------------------------- Short guide to install ESS under Windows (28-4-2001) by Emmanuel Paradis ---------------------------------------------------- The following notes are for a Windows system (mainly NT, but this applies to 95/98 too) which has none of Emacs, gnuserv, or ESS installed. Sections 1 and 2 are about getting and installing Emacs, sections 3-6 are about getting and installing ESS, section 7 is about getting and installing gnuserv, and section 8 gives a few hints on how to start with ESS. It is assumed that all packages are or will be installed in D:\ (if you choose another location, change accordingly). It is preferable to install these packages (including R) in locations independent of each others, so that they can be updated easily. 1. Download a precompiled copy of Emacs v. 20.7 for Windows on Intel machines: ftp://ftp.gnu.org/gnu/windows/emacs/20.7/emacs-20.7-fullbin-i386.tar.gz This is a 13 Mb file that includes precompiled binaries of Emacs, and lisp sources (useful for understanding how packages work, and how they can best be setup or customized). 2. Unpack the downloaded file in a directory, e.g., "D:\", then execute the file "D:\emacs-20.7\bin\addpm.exe". Emacs is then installed on your Windows machine, and a shortcut should have been added to your Start menu. Installing Emacs may not be so straightforward depending on the setup of your system. For instance, it may be better to turn virus checkers off (Norton Anti-Virus 2001 breaks this, for example; McAfee virus scanner seems to interact badly with Emacs too). There is a very detailed FAQ for Emacs on Windows at: http://www.gnu.org/software/emacs/windows/ntemacs.html Section 3 of this FAQ details the installation process of Emacs under Windows. There are also lots of useful informations on how to customize Emacs. It is also recommended to change the default starting directory for Emacs to your own personal directory to help protect you from accidentally changing files in the Emacs directory. Do so by right-clicking on the Emacs short-cut, go to the "Shortcut" tab, and then change the value in "Start in:". 3. Download ESS v. 5.1.18 at: http://ess.stat.wisc.edu/pub/ESS/ESS-5.1.18.tar.gz It is a 558 Kb file. 4. Unpack the downloaded file in its own directory, e.g. "D:\" (of course, keeping the tree structure of the zip archive). Avoid unpacking this archive in the Emacs (sub)-directory(ies) so that you can upgrade Emacs and ESS independently in the future. Also, a useful thing is to rename the current R directory so that it does not have the version number in it, for instance "r". This will avoid the need to change the settings explained below when you install future versions of R (you can of course keep previous versions of R in directories named "r.old", or "rw1021", "rw1020", ... if you have more than two versions). In the followings, it will be assumed this has been done. 5. Edit the file "D:\ess-5.1.18\lisp\ess-site.el". In this file, the semicolons indicate comments. Find the line #250 (easy with Emacs...) which is like this: ;;(setq-default inferior-R-program-name "Rterm") ; msdos systems This line tells ESS where to find the R executable. Thus, uncomment the line, and write with "Rterm" the path to Rterm.exe, for instance, if you installed R v. 1.2.2 for Windows in D:\, and renamed the directory "rw1022" to "r" as above, the line becomes: (setq-default inferior-R-program-name "D:/r/bin/Rterm") ; msdos systems You must use forwardslashes /.Of course, you may delete "; msdos systems". If you installed R in C:\Program Files (and did not rename its directory), then the line must be: (setq-default inferior-R-program-name "C:/Progra~1/rw1022/bin/Rterm") taking care to use the DOS name of the directory. ==> If Rterm.exe is already in the PATH of your system, you do not need to modify this line in ess-site.el, just uncomment it. Under Windows 9x, it seems that Rterm.exe needs to be in the PATH, thus add "D:\r\bin;" to your PATH. Another possibility is to specify the exec-path in your .emacs file by adding this line: (custom-set-variables '(exec-path (quote ("D:/r/bin" "c:/other/paths")))) ==> You may use "Rgui" instead of "Rterm", but R's outputs will be displayed in the Rgui console rather than within Emacs (as is the case with Rterm). 6. Edit or create a file called ".emacs" (or "_emacs"). You can read some infos on "What is a .emacs file?" at: http://www.gnu.org/software/emacs/windows/faq3.html#what-startup When Emacs is started, it looks for the .emacs file in your HOME directory. HOME is an environment variable which can be set in several ways. Under Windows NT, open the Control Panel, go to the System panel, and click the "Environment" tab, then add (or modify) the appropriate environment variable. (This procedure gives the possibility to set HOME on a per-user basis.) Under Windows 95, you can set the HOME environment variable in your autoexec.bat file (you will need to reboot then). If no HOME has been set, Emacs will look for .emacs in C:\. Once HOME has been set, add in .emacs the following line: (load-file "d:/ess-5.1.18/lisp/ess-site.el") ==> A few precisions on how to create the file .emacs under Windows. Explorer does not accept to (re-)name a file without prefix (but _emacs is possible); you can do it with Notepad, but this editor normally adds the .txt suffix when you name a file. To avoid this, type the name in the 'Save as...' sub-menu within quotes "", e.g. ".emacs" instead of .emacs (the latter will result in .emacs.txt). Yet another possibility is to create the file with any name (say, titi.txt), then go to a DOS command prompt, and type: rename titi.txt .emacs 7. ESS is now configured to run with R and Emacs, but it is very useful to install gnuserv, a small program that allows file associations with Emacs (thus loading files into an already running Emacs, or if none, one is launched). More information are at: http://www.gnu.org/software/emacs/windows/faq3.html#assoc where there is also a link to download gnuserv at: http://www.gnu.org/software/emacs/windows/ntemacs/contrib/gnuserv-2.1p1.zip Unpack the dowloaded file, e.g. in D:\, and add in .emacs the following three lines: (load-file "d:/gnuserv/gnuserv.el") (require 'gnuserv) (gnuserv-start) You also need to have the gnuserv executables and runemacs.exe in your path (under Windows NT, this is done by editing the PATH environment variable in the System panel of the Control Panel; under Windows 9x by modifying the PATH in the autoexec.bat file), in our example, one needs to add "D:\emacs-20.7\bin;D:\gnuserv;" to the PATH. Now, open Explorer, select "options" in the menu "view", select the "file types" tab, click on "New type...", fill the fields (specifying, of course, the .R extension), and under "actions", click "New...", a new window is then open. Under "action" type "open", and in the second field type D:\gnuserv\gnuclientw.exe "%1" where the "%1" allows filenames with blanks in them to be treated as one argument when sent to Emacs. Close all windows by clicking "Ok". ==> While you create the R file type, you can specify other "actions", such as "edit" and associate Notepad (or any other editor) with it. This will allow you to edit your R files either with Emacs/ESS (press Enter when the file is selected, or double-click on it), or Notepad (right-click on the file and select "edit"). You can also allow quick view of the R files by ticking the appropriate box under the list of "actions". ==> If you do not want to install gnuserv, you can edit several R files in the same running Emacs by opening them from Emacs (Ctrl-x Ctrl-f, which is noted C-x C-f in Emacs's terminology). In this case, you may (or not) create an R file type as described above, and associate the "open" action with "runemacs.exe". 8. When you open a *.R file, this opens Emacs and ESS. To run R under Emacs, type Alt-x R (M-x R), and then Enter. Within Emacs, you switch between the different files, buffers, processes, ... with the "Buffers" menu or by typing Ctrl and the right button of the mouse. When you edit an R file you can evaluate the R expressions with the "ESS" menu by selecting "eval buffer" (or by typing C-c C-b). Browse this "ESS" menu to see the possibilities: you can evaluate just a line, or a region you have selected with the mouse, etc. Emacs can be customized in several ways that help to edit R files. You can have a look at the Emacs-FAQ within Emacs by the menu Help|Manuals|Emacs FAQ (or C-h F). Here are a few customizations I found useful. These lines must be added in the .emacs file. (setq gnuserv-frame (selected-frame)) ;; open the file in the ;; current Emacs frame (show-paren-mode 1) ;; parentheses highlighting (global-font-lock-mode 1) ;; syntax highlighting (setq font-lock-maximum-decoration t) ;; have it maximum!! (setq frame-title-format "%b") ;; put the name of the current ;; buffer as the frame name The first line forces Emacs to open a new file in the current frame (rather than opening a new frame outside the current one). The parentheses highlighting is extremely useful when writting a program (even a simple one): when the cursor is on a parenthesis, this highlights in grey both this one and its match. If the match is not found, then the highlight is blue. When first used, this customization may seem a bit irritating, but its usefulness may become quickly apparent. Finally, you can have a look at a list of the many functionalities of ESS in the menu ESS|Describe (or C-h m). EP ess/doc/ediff-sas.gif0000664000175000017500000003445512423756516013047 0ustar eddeddGIF87aJБў0///?0 / ///00 ?? 000???@@/PP?@@@@O@OOOPPPP_P___`_P_`_``@ooOP_```oo`oooppoopppпПP░Р/  ААp░░p░┐OpРOРР/╧Яя_ЯЯ└ЁАААПППРРРЯЯЯ░░А░░Яппп░░░┐┐┐РЁРР РррЯ╨╨а╨╨░яяаррпЁЁаЁЁпЁЁ░  ░ЁЁ┐  ┐А╧рА└ЁА╧ЁА╧ ЯЁ аЁ ╨╨╨▀▀▀ЁЁ└  └ЁЁ╧  ╧  ▀яяя  рЁЁЁ   !∙,JБ@ б|" ┴БL╚б├ЕJl▒т─И/Z╠╚г╟Н5Кь▓ф╚Р$OЪL╔е╦Х/U╩l │ц╠Ш4o┌╠╔з╧Э?u э ┤ш╨аDПM╩й╙е│ь╪┴bЗ\ёAРAКTйвт@Uh╙кUЫ%╦┌╖pу╩Э√vEZ╗hёЮ═{╖/▀┐{ыьWpa┬АN|╕1у╟Л#+ЮьXre╩Р1[╬|╣3ч╧ЫCkэYti╥аQЫN}║5ы╫лcлЮэZvm┌░gy2╡╖я▐$dБ▓Аёу╟зG╗√╖є┴бHекўВя╞v█ж╒╬В╗w╖▌┴З g.Ю-°я█╧лWЛ█vю█Ё▀╦wO┐╜¤°їё▀Я┐??¤■'аЎg`А"h`s┼!Аo┴ ╫аГ╞)s╝=!╥iшсЗ Ж(тИ$ЦhтЙ(житК,╢штЛ0╞(уМ4╓hуН8циуО<Ўшуsj°аo┘█Р "yфТFКифРH6┘dqTN%еУKVY!ФV2┘eХXfIeФc~ЩдsdВйфЗOЪidЪ?╞)чЬt╓iчЭxцйчЮ%i┼ЯА┌╓аДjшбИ&кшвМ6ъшгРF*щдФVjщеШfкщжЬvъщзаЖ*ъидЦjъйХккmI╟ht╙н *(к┬Zk╖╢Хыо╢RЪыа┐▐lб┐2:моЙЛ+▒ЖЛъ│╨F+э┤╘Vkэ╡╪fлэв▓┌ъt" ыT▌■╣э╣шжлю║ь╢ыю╗Ё╞+oих▓┌╓RхЛя╛··Yn[1─p└Jp┴ ▄м│є6ьЁ├G,ё─Wмm╜ГЄл▒╛R∙█н┼ З,Є╚$ЧlЄ╔#c|/╟яы▒м(╟,є╠4╫lє═7л╠Є╬.╟·/╬@-Ї╨DmЇж:╖╠є╦лэЇжсўЇ╘TWmїиIє╠2╙к\и┬^ v╪YМ¤и┘fЧ-v╪iК╢┴_┌╢┌r?ъ,├╦Ўкwдw3 ьв╞┘5▐Wn°сИgС╡╥ s(РG.∙фФWn∙хШgо∙цЬwю∙чаЗ.·шдЧ.yизо·ъм╖ю·ы░пy│╫9э╖█╬ю╗ы╬√я╛Я√Ё╜╝ё┬п№ё╦'╧№є╬GП№Ї═S╜ї╥Wп¤ї█g╧¤ў▐ЗП¤°▌У╛∙тя╛╕╓=У[ощЯЧ╣№<╨_ фЎ█?ф·▀П№ є (9¤хПr¤│Ьс║pД ¤G┐&PА┤ъ"░:к╬Г|7┬ОPuщ;_∙Vи┬жЁЕшЛ! a8C║╨Ж4╝a wи├цЁЗ8╝Э╩v┬!ЯuЛБHLвЧ╚─&:ёЙ ШЛЭзHE╪СЗWЇa▒╕E-rёЛ^ c╟╪E2В╤Мbт╧ВЇбqэ@gиВБ 5╟╢╘QОxмгaР<JПw╠гх╟?ЄqП{др(мZIнСw \рtх╚I**\─z$оЩмFI╥ТЫфф▓4 ╔CIнТ┬Ъ$&ЩJ1ЛФФ┤ф*эF╕─┘ЄЦятt┌XDў},bЗtZ-с5LSЧ╚Lж2╡>╞u╠И0[ж4зI═jZ3^═dЯу╝U╢Де-a▌Ш┬└┘╚kЪєЬшLз5│╔╕mЪKЭЁМз<ч)O]Ж╚Нpдз>ў╔╧~V═Ю rcЦ@╨ВЇаM иB╩╨Ж:ЇбНиD'J╤КZЇв═иF7╩╤ОzЇг йHGJ╥ТЪЇд(MйJ'дБ6ФB'BeZPЪ╘жK└щMjЕъTе=5hPs·Sв╓ФжГ;*EtPШї8+═иLзЪ╙з"зжM}иMй║Sбf╡к¤йS├ QЬїмWэ*Rc:╙оЄЇн_eиYЩъ╙╢.5бf┼кWїъ╓p┘п═+_у ╓Лuп/╒иNЛVЛй.hБd#;Y╔B╓▓Ф╜le7л┘╬fЎ│Ш -gA;Z╤z╓┤д=miWл┌╓жЎ╡иН-ka;[┘║╓╢┤╜mmwл█▐цЎ╖╕ .ooБ;\с·╓╕─=nqЧл▄ц&ў╣╚Н.sб;]щ:╫║╘╜nu╖л]ч║╙^╧:хо@╣╔rЖ9мD/%c╣HS~╥╝░L╓{c)Ь`СЧ╜ф┼█}¤╔▀■·ЧS╡RЕ6Ї▌j]vTВ=╣╖ :°┴Ё╧ оG°┬╬░Же┼╬еA│i▌$з▄v0rК╕╝N▒КW╠▀╖╠┬,О▒Мg,coэ├]г▒Оw╠у ┌╕q8ЮUПЗLф"Яє╟¤ 27▀╖╡╒НlРbЄУЯ<╬FI┘╔PV╘▄L╔х╜) YТ*&пМLц2O ╔э{у╧╠╠ц6╗┘hh~ж/e╪∙╬(и3Юў╠ч>√∙/@Aа═g@z╧Ж&4Ю▌чC√╣╨Вtб%=щ@Ъ╤С╛┤б1mчM▀y╙Ь~tжA-ъEЗ┌╥Ф6╡еЭъH+┌╤ЩЮtмe]ъZ█·╓╕╬╡оw═ы^√·╫└╢░ЗMьb√╪╚N╢▓uч├|W╧{ЖЎ▓зMэ\├║┌╪╬╢╢╖═эn{√█р╖╕╟Mюrг └┬чЪ┘LM╡{TяЦ╫Вє╓,┐Бj▐їVpШ;╣я7√Ыdш╓Р║∙мB╥qОГ╠#√8╚D2▄Р _Ф┴!■ЁA)\┴ъeх┬ъЫ▐Е╣Цшe╞╧_D╒w┐ю х╞?От┐m<┐т╒x)UN▀ЦЯR( ╖╬н╒lя№ч@z├zофw╥ ╦GOz┌r.Їж;¤щЙ"·ЬA їк[¤ъдтL zйfВc¤ы`√д╨ЭOз hO╗┌╫╬Ў╢╗¤эpП╗▄чNў║█¤юx╧╗▐ў╬ў╛√¤яА╝рO°┬■ЁИO╝т╧°╞;я-uи`ХЪR▒"╓иnь`-╒з▐tлA*хgz╪╧П~ии¤чK/T╒у╒їШщZ [╪┼О^о╡Gмэ5/y└╥>▒жo╜я3∙╠пХкмя(ч9?№║■╒ў╗З+YI┐y═г^ў═'мb{Я}Л▓~ЄЖ%кш┴╩╪ёC4ЄЭO┐·ХЯ╓їWФоюП┐№чO ·█ ■°╧┐■9ъs▒√  ╪d7`└┴u∙АШАPpkЎАБ 8БXБxБШБ╕Б╪Б°Б В"8В$XВ&xВ(ШВ*╕В,╪В$╢q "Г 2Г rГ6ШГ5╕Г4╪Г8╚Г?шГ:(Д@8ДAxДFШДE╕Д╕ГГ!4Е$А'`,@ `┘!шn╤ЕусЕo╤Е▄Ж`╚ДHИЖJHДlШЖm╕ЖnЗp8ЗjXЗohЗrИЗ3╚ ╝$! X%╦╤r$kтFЛАt▒ИМ╪ИОHЗwЙy(ЙР8ЙЦXЙШиЗЪHЙЫxЙЭШЙЬ°ЖlД&┐!%x&hТEЄЗдШ%╚!`Z2`лHИ#Т&d▓%P"Л╣X"koRvЄ%з╚&нH$'╥&╞%п╚'╩╕М╠╪М╬°М╨Н╥╪г8Н╓xН╪ШН┌╕Н▄╪Н▐°Нр8¤╫0°f3хиАшшtўMс%IЩI''sЮ4r5ПЇFr╟rн_Ўиr_ЦIщ8РW╖О╬ ╤ОTGР ╣РF&u]чОs369eц┼РyС╫фРИС┘СжСыцС"9Т-╢f╬dSЧc$╣Т,9O ∙1$v03N2bnN[Ў517#F79)6$жУ2щM'&Nc5Ё%r√sыEsЧ$JўHrK9^H┘ТVЙ8/M?-[94ч°ОUyХbi5Y╣*P╘Dt9iйЦж│Ц:nyЦФ9q)ЧзУ'TEz╣Ч(TF~yFЩFА9ШВYШhtШБЙШДйШЖi=eй*v9?% ?УY?TЩTЩШ)ЩЫiЩУ∙ЩЫгЩЭ╔ЩХЪгyAЯyЪжyЩг╣DйiЩТ┤щЩЩIЩмY@в ЫЮ∙Ъд)ЫQфЫ#Ь┬┘A├∙A└┘AxщЫ╞YЬI└?Ї╙ШЛЩШ╥Э╘ Э╓╔Ш╪9Э╫йЭ┘╣=∙йТc9ЮфЩ8▀iv))dжЄnэ╓ЮФ(ьiqя)ЯСЯЇiGє┘oЎЦo.╫Я8╫e■й_УР&ч7╩Р╟Я ЦП┌Я_vОLWЮlvЮ8ОzбJ4П)dIСЩб вє▓б▄$в&zв' CвFЗв,┌вPсRбE^.Zг6*/CD$0:║г=╩г:╩u.%y╔ўQ╤ў{ Uдыg~▒╖Nъ|╝зUZ~#┼XH*}W┌|еwдH{%┼е║7yцwV╖|a·|ед&eеБХ}рзж╕GyGк}▐'еzзЕ~ўЗзI·д~·зАиВк|lЕR|J|щ╟жГ║и(eб7·иРz1k┤KщfА!I*║Яcf·╣а JаА│ЯЎ╓а■╔й√йи·4j!ОЪко·кYgТьУdщYв┌dP╓Х░║ликв4╩л└мЩтл┬Zм╞J)─zм╩║мКТмявлТвл╨]*oЭ╩м╓*йwТ┤·Р &0EIФ@┘6ръ(89УуКУ▐*н;iФсdоhГоїшПЄЪаЇU,S rLХyн№Z*╛*mw░ц6░[░├vmЫ░ ╗░ █░√░ √п}&░█i{▒ЯЦ▒Лж▒вЖ░ЛhЛ▒░6▓К▓Р╢▒;m$Ы▓пf▓%+▓{mыh2ы▒{│8Ы│:╗│<nлъАн┌пBык?ЮъY*ЎЙЯў┘GЁ╣pJ√┤L[ЯN ╡ю9а╩йj╡╞тйi7вZаzУй &, ╩oжкйfЫПCKcEkй^╖╢pЫк╔Zbt;Уv[ФM╖z{С╬║╖~[г}√╖В{вm┤Г{╕фY╕g╖иЗ еeеP%Wb╣МZ╣MZLе:╦=*┤Ь╦?к╞▓\╦╛L╦\з┴┬<╠∙─\╠╞|╠╚Ь╠1┴bBМ┼(МfВК╤ь╠4'е8═.┬КBЄ╠╫ М═ ═╪╬╩<╬ф\╬ц|╬тHй▌ь%&╘№&╡ш╠╖╪%єь═ёl╧eЛк°═!bМ∙Ь╧┌<М╧╤АM═·╝%jВ╬ ╜╨ ▌╨▐╚╠┘X╨═'=╤}╤Э╤8╤▌╤¤╤ ╥" #№╦└&═РК[л+z*∙ъФyлJPЦ0MХ№ШJьп-r°╕r∙%_'¤╙Ч2АЕШ└тY*bаcы+W+каzI_ыаiл╢R╜п@]╒ПТ╥▄Z╘╨ЄХ╓)\на_m╒bM(<Б%=╓h¤uёБЫ╓lэ╬zл╣JСm=╫C6╖▐оэjb5бt▌╫)л┌ъl3ъ╫Дmuk]╪И╜sЗЭ╪МэfЛ▌╪РMfП┘Ф▌cУMТV┘7z┘█2нQFо#3o Ц┘Ъ ╕А=лВн╥Ўreт╩УIw6оНлMVeМre▒-н=╠╘е┌╘б║╡еj,ГS┌жЭни-gY=+щ·оxЛ╖!VУЛRоFй╫щ┌о╡╜о═M▌╫=b╓¤ФєjпЁIўuп07_·Ъ╖їъJ┬▌вЬ-ТдЭ▐(ълС▀Є=▀Ї]▀T:TФЧ|╣▀иSЭ▌╣Э■═Эрр■▀>р╟ ▀СйЩфЬищр╢ЩЦu∙?аЙ?н)Ы┤ЩЮЪс∙усЮЫ║й9%╛?сФт▐?)Ы/оAxЩЬ'tЬн3Ь┴йЬ╞Iу─йЬT<Ыyр ЮрNфB^фCЮфH╛фB╬р AA+>Ч @фтTОхиYЪўЭANДхY■рц$ц^ОAuIB%Ф:yй▀jю:5ч¤Н;AnфvофGЮчw╬ф{очxNFX]/Ў=шє=тД~шr╔▀К>уz╔ч■шОщ~.щ}^щР╛ЭБ~йю╜щ)Цщoл.ёv)б*г■.в ╢┐═)_}`зОъ ╔щ╖фщМ┤S├╡T█┤∙Y╡Pы(Ikы╛^ъ╜н█g╦█Nэ█g{к ╞╡eыHгК╢╟.f╩╬аi╓░^3▓о└ыq ╟G 7qLыэ█^qЙьЖюс▐э┌nr ╕ю▀]п╚▐ЎE▐7я|Н,%ЧrєZ╙OН▐рms#ўHЪrTЩ`ї^э"S╓x╓┐Ё·┤▐  Ёїt┌'iatKУvЛ0╬m▐┐ёк*ё┌4╪Y&█Є╧ё&O3Є*/M)┐Є.ПKМD}┤/_є╙ tэZmє:ПLB Ю3_в;Ї0?йў$дПwЇHЯЇJ┐ЇL▀ЇN ЇPїR?їT_їVпv┤k╬√╛q ╣У╗їЦ√д▓╗д▀'Q░√RЬ√╣Р█║`ПЎе;Ў$х║m_VgЎFZўоkXiП║p╧PYя|У█зъ;╛°KеЎ█║╖╟дСЫzЙ ╗DZж═ ∙kO~ї[{╙Ы{|жf}ўkжЮ▀╛t*X╨;ўщ{зшЫ|d WЄ╦їеO°}5╝эЫ·▌┐нo°╫█·л╖QS┼ўЩЫў їўб╧║m:°╝[°юK·ячех╦°Ю╧№пg╜╠╝^ъдг┐╜Щ∙Йе}П╛З?√К№╪ K|╚Пе┼┐╝┬╛о╧|хл╣╕╛Хп╗▒K■R┐─▀¤▄g·я┐}Ї■ЎЯзСe╟О&K DШPсBЖ >ДQтDК-^─ШQуFО=~RфHТ%MЮDЩRхJЦб▄aEцLЪYl▐─ЩSчNЮ=}■TшPвEНEЪTщRжMЭ>ЕUъTкUн^┼ЪUыVд4╜Z▒∙( /~н╔u*╡mЯ▓uWю\║uэ▐┼ЫWя▐кhgЖЕ9PЁрd═╞Ї Ц+▄ЫМ█|чcвФ!чtМYsх═Y,7юL┘Єg╛еMЯFЭZїj╓нГ&V|└l┌Ж █-m╧Шgяф¤╗1oб╡GЯ№;rmЭ┬Ы+╬▄╖єш╜'ўдюZ√vю▌╜пWwЦ├Д у>Ы8№zЎэ▌┐З_■№жу▐▀Б_ О├Ўщ 0@$░@Е▓/?ў├п?ї▓И!Ы"Ф┬ -╝)B /Lю@?1DG$1A T╨A┐2фЙCqт2╥Hд▒Fo─1╟╢LDёD╤╥1H!З$▓H#│тё─s{ЁH'ЯД2J)sL▓G№jJ-╖ф▓K/┐лRI■Ш\ёK3╧D3M5н ╙JБ░ЇjM9чд│╬:█ЇСL эф│O? O+сL PCE4Q·▌П╨┐4д0' 7ДqRI#Н▒'LcфT┬ 3ї ╙K-е░TЭLН╬╕сd\ю│рГ 9ьМ 9Z]ЭQQ]wїТ╤+ї╠BIa▄ЙSН2vXe? *YaЙ=ЎTeГr╗╬.3к┌ы@є);^┐wJ_ЧLпLPщ:╖╞\├e╖]wy7E`╜л{яEб^|ўх╖_ 8`Б&╕`ГF8aЕf╕aЗЖ8bЙ'ж╕bЛ/╞8cН7ц╕cГу}s^ЪЇ▌ЧdП ~┴рФUvxхБ]F∙daШfЩo╞9gЭwц╣gЯ┌gР╟,-Уя=:тХЧ╛ЧfЧЭnz_Ыmjм╛Zj|ЯцЧъо╖╞fл▒&█^ж╡■:ъа╫f╗m╖▀Ж;n╣ ╗Я░ ╝я╬ ╗,СgJ:▀К_ №ъФ oqй W▄Ё╞ З╝ёЧ▄ё~!7э┼1▀є╟9┐8Є╠3=ё├┼■№Ї╤#Эє╥+Я;v┘gз╜v█eп;0єnє╗шпn>xсЗ'╛xуПG~Ў▄w?пw─╩|7zщзз▐╦c╛0ч¤█ яs·▐жЁ╜'?|ёa╚В|Ь╠┐|єГR}Ї╧?▀¤фh]╒3ъdн╬9с°■ю+UY (╩┘▀н@@ъП-▒Є▀ ШкTёяБ▐ТО3XЬuU╧ГёY^ЎВЮчэй{р[_ o2┐Э░P|+Tс Лт┬Ї┼░Ж0<К╢Аs-ыEЗ╪bsоr╚CЮИ&И=4тu~╚-&ЎPИLLт+╙┴VС=u# FРE-rqЛY▄^У║CCQQ5f─ н╕╞o ═Q2acх8G3╣ёopдcї╕╟@5╔MГ║гbЮ%нh ╥Р|Dd"╣;·.N▓TЖ їйIE*Л─d&5йЦFЦ0XЫe(EЩЪNroФзDe*9y=▌1ПДжTe,e9KжДЁV╝{г i╣K^ЎЄ'! с+┼шKbsЧXьb┐ШLд%╧Дf4е9MjV╙Ъ╫─f6╡╣Mnv╙Ы9М3ДРУЪц<:Ча╬С░3Ы│╔<┐┘Mv║3"ЎTИ< В╧РрУЬ№╠g9%вN~╓SаыDз>Ob╨tбUш>ТPwFtЭщмшE║Ўsв ▒чF'B╨Д:T#¤'H%КСpBДач hCe║RУВ┤г╥Tи<їiQЛю│в╞)gmВКQЯїЮB *R}JУд4еKU*CR╥Т╓╘Ь"НiRЩjм^tж5ЕjUпЪТМz╡!═ъY╡┌SЪ~uдЭйT═j╓[еUеyй[ эКФВХлwEиRНjСЦ╬sп,щjI╪jXЫ2╓▒ПЕ,H{RОj╘Ъ7НlfErШt╓Эm┴g= Z╤ЖЦ┤зmjMл┌╥╢╡лЕнkY√Z┘╞Ц╢╖Эmnmл█┌Ў╖╗оoy√[сЧ╕╟nrНл▄т6╣╦ЕоsЩ√\щFЧ║╫Эnvнл▌ъv╗█пw╣√]ёЖЧ╝чoz╖ЫKc╢╫╜кfЎД ╜ў╓╫╛ЛDц2ї╦┼0╥ў╛ ░уы╩■Ъ0└Fpї╝;К╨┴ЖpД%єЙ'╝╔2/ў╕m▐qЮў▄ч?z╨;>oZ∙;фЎ6O╔Л═яС{╪╠>Є3Гр╔рn8╬╧ЭpШs¤&I▐╔╣Е>v▓Ч▌ьgG╗Ы?.▀г╙█фk'0╘YPААА@┌ї╛w╛ў▌япu░?xуЩЁ╞С;р┐x╞7▐ёПW7НЙ·│╖√[?¤╦=Ф3└█г=щ@$┐Д└Ф└ д<є+=ў├>╘л┐╘╗=°c@ЇS?l╛Ї┐,A°Aч@dA▐!эл=$9∙г└┤┴─┴ь0 Ь┴╪K└ь┴╜╤KA d┐╫╗?√Л┐Д=Ўs:╠┐№?<└'Ь┐( BdBДBЇ╦BЇ┬/├0 Ф@є╙╝(├ 3├3T├5d├6Ї12t├8Ф├9д├:┤├; ,░=ф├=╘%─@4Ф>$D┼╪╜╔ЫC▄ч)─>─GДD>iD?МFЇ├B╘$5К─NlЧI╘CЫxВVb0LЬDЁрDIEOdE]┼╪hе╓╗─<╠─Zl X┘'r"╔╚! j"$к5┬┼ ┌Я_╞\|ОVTF^yEQ ▄[6Шh╞┼НkсE)bХ┬F:в(*k▄ n╘┼╤X╞r|ЧiД├ШEiмEGTЛcDв╨╕F]ьЦ"BFxд╟K╩E ▒╞{╘GlHsH:Щ╞Qь5Sl╟?╝┼юQX┼zД o$вБФ╚9AGf┌/eBHM|╟ :#ОD mT РЬ╚С▄Хi№#б┼S$╔ХdI1I1╤ПФL╚Цд╔ЪtПЧ<╔СIН┤╔ЮЇIэ└IШп╠ПЭ┤┼Я4╩г<На╠IЄ`GХдФi1$RIFдд╩к еДIвt╟C*д)$л╦░ь мї╙?╘@╘A%╘?э8╘DE╘EU╘Fe╘Gu╘HЕ╘IХ╘Jе╘K╡╘L┼╘M╒╘Nх╘Oї╘P╒Q╒R%╒S5╒TE╒UU╒Ve╒US?╘╙Yе╒Z╡╒[┼╒\╒U[-╘^ї╒_%TW╓W╓b%╓c5╓dE╓eU╓fe╓gu╓h}╓X╒├]▌╒(8┼╓lНSl═Soэ╓mхVkеUpmSs¤╓YMВИАBmW`ЕW_Х╓yЕ╓zе╫{╡╫|┼╫}╒╫~хWiеV+ W]╫7-XГ╒╙Гe)SЕuSЖX4uXИ}╪8х╙wН╫Л┼╪$°Wх╪Нї╪О┘П┘Р%Y|  ╪Й-SoUY3╫Гm┘Вm┘4НX55WШM┘3}┘ЫeYЬе┘Э╒┘З╡┘ФН┘ЯE╫б%SХ═VЕe╪Ъu╙К╡XЛэSиНZ?e╫йн╪?н┌л╒ZзхSE┼╓С█Т█░%█▒5█▓E█K=YФхnu█Я=Z╕m[бWеЭSЧН[ЯЭ[╜▌█╛Х[║▌V╛╒╓║E╫5%\┴}[╜┼█╝M\┴═█╟]╙нХ▄uTйеZv┼\иХ┌з═▄>M█╧=█╨▌╤▌╥%]SE╟а бWd█╜m▄╛]▄╢ Z╚е▌Ж5Z╪х┘г┼█еХYЦЭ]┐╜UШ^╕═Yвї┘╫н]┐ЭY2х┌╔е▄╩ ┼ZлХ▄м}▐ъ╒Zп5▌ь=]эх▐эї▐ю┘╘=H╛l▌Є5▀Ю=▀ЇU▀╚═╪Ў╡▄BM╘°▐∙_·╡▀·┼▀э_╖#▀її_kн█ `їm▀М┼\x╜▀╬▀Vрf`О▌_РгM0ерЛ`╢Ыр ╓р ║р╕╦═р,ж.Эв м╬&R"aj1с ЎУ.┼ 6 2Z ж ^ ёЇ╤_МКF#╬a╬`с?qaєX▌)U в!RтЮ`Zbг@b┬!╩_ьF ЇЦ¤№сy4 ╓с"╩ (Т╟■DF H~ ╥2Юв ОТ!n╛К$vbТт)~b* 9ФЮт┬у!Х\сPЄP0╓╨.╞╤═А╥+G2"!}ОB▐б ╔fу'qcгГу8▐c>~Я;NЯ(╢cO╢с:╓уOЮуoМd▌Q5■╟/^3Ж╚Y∙тJcE>с╦X"bЬ╟]Цd3жЦJЖТКфвa&ц"v╩1┬J╢ en f╞ gц ╪яИЯaэHс4Є╚h>ЙеiццoЮ%oчqF%q&чs%sFчu^$q╬RНJї vжчCqgЕg нч}╢g#оR╨№`A:√ь╩хчГЦu~HДfhКЇgбш+-╠ЖжшъQшК╞hv╣шМцшТ4тє cЮшО&iПV╔ti╩,щХючУ&E"╬╚═dщЩтП~╞╫ ЛFЙViЪцiВ┤щ|уАющбоУKV9ЭЦiвVъ31ъзъеЖj3Щ╞├лН├p%``м╓jо▐ъм■ъоkп&ы▒6k▒Fы░Vы▓Nk╢^ы│~ы╢Жk╖жы╣╢k╣╞ы╕╓ы║╬k╛▐ы╗■ы╛l┐&ь┴6l┴Fь└Vь┬Nl╞^ь├~ь╞Жl╟жь╔╢l╔╞ь╚╓ь╩╬l╬▐ь╦■ь╬m╧&э╤Юlлэ╘э╒╞j`m╙Vэ╥Оm╪~э┘╢э┌╞m┘╬m┌╓э▐цэ▀╛m▀nр▐эс6ютFnсNnр╢j┬ж хЎk╫юъчf┌ n╢ш╛юъ╬ю│ЮНэ>nэ o╕о %иН╦юю╝╢ю╓■юёЮ є╞ыЎVlщ▐jHl·Жя·FыЇцю┌╨ъїюoЁ~k╫цъ[┘я┘Р■6яў╢o╡╞я▒~ю/p_ыOы┐oпlўnс6▓ЦЁмцo№ё╘>oщVp  юўmЯnq'm╘ьюvё·╛ё▐.ёъЖЁpпЁ╖q∙nэхЦlу°ъ[Бp╫Є■ЦяЄжn┴ж ?o▒Юr o╫я░жН╢╢Ё╧я0q ЯЁor╛Vpчё┬Жq╧ё5Wє яp░Fq°╬юя4os:яё$чЄ▓~є=Яю 6kAўє пp&_ё% OqE╧ё(wp╗~swn+ s╪╓є╕NєAэIпЁЗэцl3чэ[┴n@┐tBчt ЯkRЧє7!/o╙~я%OЄMr3/ё\╟ьєоыZOЁ3╟Єр╢я;Opяs1?ЎQWїЇNё¤.r╩▐q·╞Ё╜■ЄшNЎl_ї5/v;яOwpH/єG╖юWOt"WsrGwU╫ьj'ёm_vvє]Gu╖╞p╟ё╫Ўp7ўy┐Є`Пї- їM?Ї1°╫ў ё@wuЯuАз  їT7rБчєm7ЇhЯsЖ Ўш▐uj╟єEпu`pВwn`чїsя°,ўvПoGlgЯwhяєj GєЙGt6зxdз∙Ю╖°ёОўВ·w·Lпў8чqМ▀y8?ЄOїg/zЮ╫kЫg·┌Оqy/ЇеяuЬgЎNПt/uУ┐kQЧыr╧ў Ё{Є. qS7xЕ╧°aЯ·*чrўo_wЄСзяV{║goG7x│_∙сцpЗч√bзz╕┐u7'x27l%╖r╢ў°I_ў|wwЄж{╗п|эЖqZ▒Ї&№~чs│_{ ¤пoў├W№2Зї╒|з?uр6╦w┐╟ЇЗ╟ў┐_Ї╪>°╝╫Ї─▀kЙЧ{╬{аO·К|ф■х7■фw~цW■ця·Х№┤▀¤╟о~щП№╦╫■шў■ч3╖m▓ ~ш ёя■ЄGЄW є_єw Їg ° ЎЗ ∙ПэLОъ№╖d#V─D(Я %╦ОXм,l╚╨JЦИ'Rмhё"╞М7rьшё#╚Р"GТ,iЄ$╩Ф*W▓lщЄ%╠Ш2g╥мisд├Ь│Lшєз╧*|иє&╥дJ?XъЇ)╘иRзRнjї*VУ:F|B(PCn}ШХщYлM╙▓mыЎ-▄╕rчЮ-╗0b╧Я└ ═kwч═╡Y,▒░с├{$╠X0b╚С гНH┘Єт┬Р)Jо╚°Ёg║вGУ.m·4jШ╗~uL°зX┐Fg#Нмx1ю█Ш-║vЭЫsя═┐w7цЬ┘ёq▀─Ч3Oэ№9Їш╥з╟]═є+╪аcЛЦM┌Y╖m╦ЪЗk =╙|x▐Я┐'╓▌■={ў╞й╙пo >■№н{═v╗uNЕц╓А#(RzЮщ╖ Г :°`]│q┼ #РpбЕ^X!АЪUЫrpїЖ╥И'Х!К)к╕"Л3Y╖B1┬8гМ╫Схс]-ъ╕#П=·°ci/╓H#С6rч!РI*╣$УM:йО;9eМ▓uў$ЦYj╣%Ч IeСV"┘%ЩeЪy&Ъi}9$ЫbQ qV├DtJ$'ЬЮШ&Я}·∙'РkВY%Q┌9gЭЙ▐ (гН:·иОВ▓нIгЫ┤хi╤бx^║й|Рz·)иб╩%щаХNш╥Ювк║*лн╞DъдFш*н╡┌zkU░RiъЗ╕··+░┴одkЫЕF),▓╔*╗,E─ЖiьХ╠J;-╡л:[#п9V╗-╖▌Єy-е╨Ощ-╣хЪ╦$╕Д▐э╣э║√.Дщ┬Ш-`Ё┌{/╛╤╔+ы▒∙·√/└гЎ;ш│ыО0┬ + ╒╛Ї.№0─┐:pм∙ж─k╝ёG  ЛЛ1[q║ТжЮ╚1╩)gс▒┴ ╖52╔┴ЬZкєй|s╛,_lйж0ЛМ(зYМ\2FЩ╬|4Эr╬|С╤Кr║Ї╙Н]Ў[zSЛWsз╦ЭЗС╒8{-н╬╓∙ь4┘B/╥╪})╘j╗}з╚%╖╖ж┴Y╜^pЄ%XЬz!╛ў5рхЖ▌o╧omv┘m;M4тК┌й°тЩ╓9ЇтУєна{ё¤Э┘EыqЮ9цБЛОьрWBо╘щ)b╪шн [:Т?CEwП'╗~;р░ыd7a(°■;Ё┴ ?<ё┼<Є╔+┐<є═; <Ї╤K?=ї╒[=Ў┘k┐=ў▌{ =°сЛ?■ё║╧└Ё шУ┐>√э╗ >№ё╦??¤ї█?■∙ko╛Cъя?■^Ёх pА╦рЇx└P└Sрё Ш@R░В╝ 3и┴ Єя!№▌я╫└фНРД╘+бёPИ<▓ПЕ┬sсc(├╥░Ж6╝сЄ:╕РвАЗ╒C °╗6PВE Сx─!2QИ╛Г Г╟┬Rq|UтЯИE'вАК вХ╪─&Зf<#╙иF ъ╨ <Їс ╡╪┼1╩qО\d`_╪╝(┌qМ|м# зИG..Пeьт щh╟?2RОБD"!╫(╔IR▓ТЦЯu▓С╪|ь|щуЮCy╟0>/ёКuTф │╪GFFQЕо$#! =/┬ЄФE4хEI╩]ЎХЧ№%0Г)LKf;■ сd╦<)<8╙z▓lfўЮ ═iR│Ъ╓\_1¤ЫХЕw╠╝&╬qТ│Ьц<'│й═Д sgз┬<у ,uо│Э│Т'>є╔*zj╙Ю¤║ЩэB╨ХtMали╘Їй╨РЁєШ▄╠:▐┤Ы├JsYQU-TщmVАK[n╡Q╖ХUЭ▀HГ%w╕╬еIqЯ+▌щвЛbSЧ;{E▌эr╖E╤э.x├ыХаяК╖╝це╧weG╢бI8ч}/|СТ^жн╖lё╜/~e2_L┴н╛Ь═/АМыV ╗ў$иАмрО°║╣]0Д#lЄJ╕┬VГ №р s╕├╛Т&5R╪нz╕─&╛╚` │с│╕┼+╗к1OкUK╣╕╞&жgo╢╣bє╕┬ ▌ЛК;∙╬┬)╓▒Р╡[ф% °╚> 1НЩ,х№┌Ў╢╜╔Лd└%0A╦\ЎrЧ╖ц/Л╠f.3Ъ╔мц1│∙╠kvsЫ╙ч7╦╬vо3Ющмч9є∙╬{ЎsЯєш? ╨Ж.4в ншA3·╨ЛvtгщGK╥Цо4ж)нщIs·╥ЫЎtз3ъOЛ╘ж.uе▒LъUП║╒АкY}jY╟┌╒╡Ю╡нiны\є╫╛╛5░w¤ka╗╫┼╢▒Йньd3█╙XЎspОНjX{┘1\vL│╦ АeЫ0В& Э ГьqKЫ╪оQВk:╜э@c√┌▐&╖╗╤mчw#Ъ┌[└бэ-я{Ыy▌Z╬┐╜эn}g√┌┌° ┴ёэя{Г▀h&x╡▐oqз┘┌'3─ы]pN├·═ Чuo╘|ё./\▄wu║эняСЯ:у_ж╖┴ў¤iU│{╠,З∙╞л}цХGЬ эє╧#╛nlГ╣у9╟3╢ГюmвЛ┘5p7Ы{єЁ▐╝у╓·╥╬nк7=▌ч:╖З╬яД╗┘тЖ▐Ў┼oNёЧS<шЕ>╣ ─╛hг╟]фto║╢├▌цТУ\▐hЗў▐╫Lw╛ыя/╝Ь/ЄG=яН▀Ї▌╤ k╖K■уYП№╒w╬ч╚г\╤,;╚є╛█┌хд╟<ч¤ьo{хп№╣ x╥3╛ЁЯ│├3q╗ =ЎжЖ╣└╡ їв├▌чЯ zяўоЄ▄П|°yNўЭ╫¤r█╝ю ?|їAO√ч╫▐▀Цяўш¤yХO┌ь╖}Ўo°ы_ ш2╟║є┘оїфk╛ьL╟>ъq^{Lы>¤7┐╜э¤▀ь╒_┬9├Е\·┼┘┌╔^яeяi╩Ь▌╚Я╞╨]р■ ЬЄБ]p╨\Ї% рA[6Яу]Э╔▌R┤ ╡╤█▄╙YЮ╤┼╔I▀ ]╔_Я9F╧Yр─щап¤▌▀A` б╟^┌Б_ЎЩ▐╝эYъ}Ыд)!Ўб_ЮЬf Vбс сi_v!дq^~ЯzбЩ▐~┌2бкЫ Raи&▐·┘ъщY┤┘Э "▌▓ єY]p╚_╒╔aЮрф╣а┼яа╘b╗э!№▀ &"┌]ыAbЁI╖ua■эЮ╔╣с╧┼_цM▌Fё╜ ╥═▀┴с▐¤aр╘1▌(ъїb·%>\.Fр╩т№ё .╛bF("┘г╥Q.aп5"ьХв▌▄╥Я4·^╫йвфХЪЎa╪ub║▀а▒в76Ву!Оу9Ъ#7кукa▒ г┤)ул╤":^г▓#>жг>цYцу:юc=д? $@дA$B■гBфBdC&$CфОMEЪW& FfдF╬╪РUдGЖЧУ▒G*┘GЦфv¤aНд╢Ш$KNWHюжФudK╬dUUЩХ9╞D╥дNцS1mТJ╓╦N%>ёУcY2╔дP&eы╝dLТдR>eрd╥ЖL%U^╚vмVfеVn%WvеW~%XЖеXО%YЦеYЮ%ZжеZо%[╢е[╛%\╞е\╬%]╓е]О%Tе^ю%_Ўе_■%`ж`&aжa&b&жb.&c6жc>&dFжdN&eVжe^&ffжfnцe;ess/doc/bugrept.texi0000664000175000017500000000122312423756516013045 0ustar eddeddPlease send bug reports, suggestions etc. to @email{ESS-bugs@@stat.math.ethz.ch} The easiest way to do this is within Emacs by typing @kbd{M-x ess-submit-bug-report} This also gives the maintainers valuable information about your installation which may help us to identify or even fix the bug. If Emacs reports an error, backtraces can help us debug the problem. Type "M-x set-variable RET debug-on-error RET t RET". Then run the command that causes the error and you should see a *Backtrace* buffer containing debug information; send us that buffer. Note that comments, suggestions, words of praise and large cash donations are also more than welcome. ess/doc/ess-demo.pdf0000664000175000017500000054104512423756516012724 0ustar eddedd%PDF-1.3 %╟ьПв 5 0 obj <> stream xЬ3╨3T0A(ЭЬ╦U╚UdШYшX(шЪШЫъEL ,а*ЇГ╠\Є╣БПh Мendstream endobj 6 0 obj 55 endobj 9 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <> >> stream xЬьЭ|┼╖╟gwя╜)$$@!jА╥$tд(╥С"╪hК╜ЛК TР&"Rд (дwС.═P!!РFz/╖ью√эN▓^CСЄФє{╝╕wwЎ╠╠┘}яє=│gfД╪ШdkЮMUEБI▓,Ы$A`AР╔КLУШ& 3у@8TDYeLШа2З I$ЙD"СHд{RВР+2;S]U┼ЭйА,ЖUЕ╣кL╝iу9║q fЛy┌)┼]U\U)K╒H\╘▒\╘А<оЪШтv╡Q%1M5е(6?Gn╤%c▌цяДKСёТ$║╣╣ЪLТьp0&├К 8T ▐е╗юлZg╨1экк ·Ш кВдшQБZPЎVЙ ▐Щ6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 WEцА╩@m╒ $╓0Xtшур╖`╠[P5(НцЫ▐кЛкЪ╤жНм Л╔UН╪Qьj)fI╠╠i╠с+╚▐Yyi▀╬°XИ╕Ррхэj▓╪22УY│>\/ЛКл Ч*░Ш▀ ШV┼Ь№*UЁ╜йаn&KU╗У▌Вю:ўЬ ▐С6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 gU ▀╦┌╝ ыгс8/▐|╕│"PZЎ╘╨Z╠╒Й_TUУвU─ Р[╘q[cu╜└╒rcвU╙╣4S╩дe$М?JИK,S╬=+':"Ємь░К7S▌TtГёш ЬBБ!Иї▐JВ" AЖ╒Ь√_" ╔рbЁv╪$Гwа┴█aУ ▐oЗM2x?╝6╔р ┐AA▒0·╡йA█ВкLW-7▀TA░ъCы@q│О√╣z8!j)CЖq╒TРiПsЎ"М0OUUЦ!Iв И┘┘╔єч/"╬'Ф)чЦСsY=┌╩To░╛j╩q9кЦ╟пG-Вд╚ZHБ^ Z╡в(а╖кк┌E&╦КмИо%Oц∙╬.q╤Т╝ Ц╕ш}hЁ?╝є Ц╕ш}hЁ?╝ Ц╕ш}hЁ?╝ Ц╕ш}hЁ?╝ Ц╕шhPmk╕я`zVП─L&╤EЦЩ],В╝єяPA╤Ъ┤#▄,Йv╗CЛHЇАя░пу╛ YО,ЛЛYvh┤D┼&hЯxta╥Жуy~■╜ZsE6 ┼┴╠f┘╜TnєVUємё ч/.Е'ЦЎ6gц$ЖЗ%ю╪7їынкреиYн}.Ви(Z╨F7Б╣8TU`к ШDW╗,ыmХ╤8н=w ю¤:s╝6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 g╒№8@[сFK╡╟б"KТ`U╠E╞к*ыцt`gВ╚Зj5KnрЄвj═VSJi#·jоЛЛл gf╣вфЙ┌ :V╜e<Э5Z■йGЦЫЇ6$╗Ъ╗ьиS╦cЇ╕■ое╥╠Ы'\┐тщm╔╠N ╦▄╛)хЫo6лкф/Ч)г°UЁЎпT┴lЦv1)!7,,╞n-оВ├a╬╔3ЛbYYqWEU╨xQH╙ц.РH$ЙD"СHўв┤Ф}-Щ┼UP═"S╦ХU[╡оцpд ЦвУydYїм~ЁxLLlL╠хVн┌┌эvУI║║░"и∙сД`W{lL┌йуQ"єё,эh┘▓Йh▓J&Ы╩мz8юч╫и7Я█-KJjЄ■╜g%╡Bн@╫▒У·╕╕&/°yЮэщe╔╚I╜p>k█╞д╔SV·°╣╖hW╞▀/Ўс65┌>╘▓┤Wk.;v°┬║5╗cв╝|MVлKtФzхК╦ХszЖ─D!и╥~╦│▐H$ЙD"СHд;Dк(kyєК╙p?лM█Є╢╜б VI)zк.@\E-ў▌f щз∙╗ўь^│ц7Ы═┴{о*,)к╢&m╣9╣╦Чэ}уїЙRї╢эkпXё╣ iГ■ ╘В┘║∙FEХ$-;╚f╡н·}╟єC' JP`uя╔╙Ю6ЩТ╬Ы/\╛юY┌+3;3№B┬он)у&,ь╓│сУЮ2ЙqrNВ╒ЪтY╩еTйrк▌═├├G2+VёиI,УЪRъ╚╤Л7!>~цмYv╗}ётЕёёЙщii.\р№ъ?Е-8уъ&╓╝6■╩┐Э▓Н┌╡ Z╛ю▌дфx┼R═┤╣╗ю▓*Л║eЗ├БУ┘ уЙЙЙs.\┤Ёа*7йS█┬д■оц─∙єЧ.ЭёЇЁ╦╩╩ П▐╛!y╩Ф5Хк)н:°;фь+▒ТУB█╖kьb╛[ы╘о\╒з|∙LЛT▐bЎй\├'-3nїк#лI9┤_╩SJ j9QИTУ└rф╚ььlQ/&ГIЩ╜u╦&_ОЮЬШЪ░t∙oл~ 3▒vm█╘_▒q`Rт┼фXkVN№еKвф]╡Ъ┐Y█W╚╚╚ИЙЙqssлQг╞Х+W6n▄Ўє№Г"k^#░т╫У/eО■∙ч|▄ў═╩╬юo¤={·Ф╜▓)╙l╔┤╔IЮYїъy?P╧GХsU$╤j╧)уюЮШ`ї*S╢G▀╢╛ТЛе№┘Уо╧<ёНГ╒RoУ)VuШ╠╠O2┌╨╗╖╩╦V5ш▀╗й ─ЯgUu╚ сИкиyj■zвТ└L*в!OR=▄}·ЧY░ЇХ~╜~╪▓9Хi╣J6╤д═LwU5Гь╡Щ┬Ъ}IdБЩU═аДpGU╜╗"YмК▌УЙvA▓л╢Є·╥в|ъ┬ж(Щ■гZ]дR6кёгIyz▌'СH$ЙD"¤K╫└¤Ш╪°тnД╘╘╘┼Лs▄ПИИ╪╡k╫З~X╣reEQ°Ё?$;$Qt°Цў№jь╖▒ 1┐нZ╣fEДI}иMЫ║+6JLИHИ╩ЙЛ┐ЁїФIййО>^зv-Dk╓м┘░aC▀╛} ┐iєО∙Wу╛Ц╠уY.3'їBDфЎ▀є&}P▀iKД╠╥еlZ&акZ▐╟ФУgХLжЬ▄ь╘Ди╨3QЮе╦7x░Ц"хTл┌╘┬В?∙Ё++/ижЄ~йХ|к)О2&Л5>)9юJЮмф··Z*Х▒Ye[Ю╦∙И(&Ш№*К■~е╒ЩШЮ*+┌74Т╚<ЦR╬/╡впПEЇh╙▐sЄ7/<╓u╬╓mлTєЎЄvu8ТIHМOKМ│√UtпPAVо.о╗#Г)▐в(ЗЗGdf∙┬▒5ШЗз$█╝%K^BBlbм╗╩\uИЧ╡╒RЕ╠Ъ╡*╗ХbТа\╝ЫХБP┴U╒rа║├-╖g&:ЙD"СH$що╒5p?6.сZwЁ|g▄ю╧Ю=√╙O?їЁЁ╨▓╙yI┼ФЦЦ╕t╔▄П>╜bїъU+.Hj█6нын▐<$)щbbTо]NЛ╕xс█oчЦЎvnшР¤√ўп]╗╢KЧ.`}OO╧ДДД╒k6,^№Wa▄П П╟хМ▄─░╚╨эЫ2┐ЩЁЧC4лZ▐╜dулT╦zд│╒кюvN╣ДЕЭOO╗ШТШЫсP══╜▄Еє9) ■╣┘ьВг╝пх╦ё]лU.·dT│╓u.┼─NЩ┤╥aw}ыЭ▐ ъWHHH-эс=n▄og╧EО¤ъЩ▓e_▀К╟■JЬ5m█┘│I*┴ёКьR+╚ЇЎGmЫ6оshwTе*еztп╒╖чўК$╛=вз▌Ю{с№Хf═ыF\М f┬╩NЭ~4к{dXnrrRpлА┐ Jёp ¤ў=3зЭиQл№√ЯЇp╪╒░3щ═ZDDFNЯ▓ыш╤8}щ"┘d╬ы╒л┼√ЇКОН м╝gg─ў3╢Д_He╠E╤p_еLЙD"СH$Ra]{t_Eю<9G╓мчмП┐iii└}X║tщ┼Лwь╪ё╙O?MЬ8╤┼┼┼░н*ц╘╘°Яч═| ╜╧уbЧпZ╡j∙Й=ЇPЫzл6NL╕9█бд├jtt·ьЯf=r╕RеJ╜zїю[,OOO_╗n╙ВЗ у~tXТgiПЇ▄ф░╦![7жMЩx@С$EuHК╖дf°U║╥яЙ└к╒▄ШъУuЁ`Hf▓┼┼╡tш∙ WKщ2хТSYщеем└LMГ+m▌¤ъБ?OЬ>С▄жCPГ&Хз}}ьў╒'G|╪+0P\┐■╧ьLKш┘┤г╟"f╬z!╫}&ЇBnЦ√Ў-g|╦╫h█бО"ф8x╝j5П╔▀<│bё┘ЧЗ~╫╜[Гы^ы█√Лб/Ўя▐╗■╓MЗЕж╡l]ы┴рК_╡777∙╦q}ц} ў■;\Ї╬ШO6vъ╪вUэБ¤Ў}▓╔уO7x√╡я¤┤я│qЗПш6yь┴╧F/╙&л▓л┘·Ї└G?°░єс┐О^МL╚╔)НFЖЕf╚*p_qЪ╤K"СH$ЙD"ш┌╣√Ьь%I▓Zн№@╦IС$p┐╔dJMM]┤h╟}Ю╗▄Я0aВллы?╞UKrrp─{гуu▄_q┴м╢kгс■а──Л Чsd5]ФДЇte╩╘Йь▐U│f═┴Г╖o▀uБ°cbb6o┘YD2Ot°%O╧▓щ╣йaСa[6fNЩxP11U╡Щ╘rКТZзv╬╗#:Z\2ЎR{vЯ▐╛эDrBeA╡╪YЮ*┌&3-єзcюВв┤nSu¤╓ЧЎl √фбU╠]l{w%ь▄qвyЛr|ЇdНje┐№b╔жН'О2нZ√╧Ъ=,фt─7УЧЮ8Ъ╪йS▀╞M¤MюYўЯмT~ЄФзЭЎ┌░┘▌╗╓√uэ░■¤G>ўт└n╜ъmZ{щ╪┴Л{ЦMЙ=░;■┴р┌Я}╒їЧЯ.э;░}ЎВac>▐Ўh╧Ъ═[╘╘╬УCZ<╓п╤█/-^4яп╤_ї{kD╗iУО|4r9S\┤¤└Д,Л%m╚рG▀ё╪Б#a&-<┌*╚■vmu UЯ$аш╕O─O"СH$ЙD*╨╡q(╧с╛`Г[ЕC??ц╔<7П√ ╦╠╠L[╝xэ▒УGZ4  ╔╦╦8p`Ы6m@№999+Vо+"Щ'·тYOO▀ЇЬМєQ[7ф~=∙░* ┌j6КЗЫ)╗~г▄QЯї2Ыr\]*/[▓чЧ┼;нЎ┌┌┬5В╢0(:┬жтЯ(КIнZм▌ЇЄи┐_ЇуС╓m┌5itр└EЗЬ╙сСў°ржu+Wк3~ь·┐■║╘@Sў╥I¤·u>bЫ╜Ж1W<БR.jЯ▐┴Uк║{z9· hyшpЄ─q+╧Еf0VZ╤ЖЎ╡9┴:ыSJЙD"СH$╔Р]_╨╕Я═TS╗╓Х╓or%6<.>!.ю╩ю▌╗]f}YLooяЎэ█{yyс8##c╤вEкк.Y▓╕┐c╟О№▒ю ╠ТФ є╝яG╝ )p ╖Uk╓,7йm█╢й╖rєР──ИДиМф╘Шх╦█▒¤р3Г<╓│╟Щ3gц╬ЭЫЮЮ>l╪░-Zдеен }єВ∙ЗD╓вfа фIП╗[А√ Б√бЮЮ╥││╬_М▄║1¤ыI√U╔E_е▐═│LLчю┬ C█╗е╜╝k═°~у┬Яў К┐вMxEф"к┌`╕─┬M,пz ╖Y?НKМ№ы╚йю]+хт■╒╪╡6Ыэ¤П·zxgД]Иh№▌7ЫЎю ¤с╟W┬#Cъ╫ 9I?~¤▐?╬ИbYжкв H√F|╥╧нФ▓|┼┌·╘xfP√╟ЫX╔┐╤ЁПЮ8uЄя┐;?┌╤$Ф■fтж∙~∙╒г?═┘wЇ╚╔3_;vAЧn-[╢мєT▀┘▐e▄Ж┐▀ч╠ЩШ├Cэ▄╛\Yў1_,ЛILm┘в¤Я{ :>Ї╡╫╛ЎF╙ Ы jєPP\мcЇиЕ'О^To╜GV}сNжнхЛ°U2xч╝6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2° oPg`▀а╔$░6-╜╢l5ЄЄС╕дМР╙g▀}ч=ЗC1ъёлX~№ДёБ5srs▓2│.Zис■т%/]▄╛}√ф╔У╗wяn2ЩЬтФнyj°╣ш/╞}uх┬п╦wm\┼Д&mZ╓Y╗щХШд3IIЧо─dо]▒▌▌▌хё'║XL&Чу╟Пя┌╣лn╜║]:wILL▄░e├вyЗMЎЎ5kT u_╖╦ цў#"==╦еggЗE^╪▓)q╩ф?╤д*S╠ХR{ўu╝w┴#%]YЄыБ═#3s№dETєчч1╨▀"║:XЄCк?■d{IDц▓~▌бЫO"┬i▌жa зЪЫL┬▒cс? ┤VP╝╗vн▀г{ &ИЛ~┘єч■уВ╞·ок╩\ДtU═h╒║▐SХ,6╒иь╟6ДЬК8д{УжfAU─їль▄~тСЗЫЇъ|` ▀С▒╧<▌g¤Жm╡Гк╘йSs╬МНg╧Э4╕OУжБЪUi├║#[╖эiўHл~}^║d▀Б¤З╠.ЄЛпЇлY╦╫bv¤~цжРСКт!2/¤):X■f[тЭЎТСA· ╚dЁN▓IяГ╖├&╝ ▐ЫdЁ1(ь┘Ъ╫бн▀жН/ЖGON░┼_IZ▓dЙ(Jv╗M изgщ'Я|вti/UU╥╥╥/^М,Z№є┼Ииу╟O,_■Ы,+╬█ыкb6фUыўы▀-!-ц╖х{V,╗ ▓·┌╘¤mэЫIiчтоЬУmе┘├ld{╢─<°▌виo>╦ДЇЇ┤хыW/Z░▀"┤л]│тЧУ║║ФКX°є\!:<┌╙гlzN&pыц°)Уv+Ти(ви╕UЇ╔ш█▀зW╖FЮюе┬/Fо▀Ё╫бГЩ1╔ХКЙ)╝q╞°╖╢╡@Y3TЦг5]ХA√╪!0}у[!OQнв йJ)ХI&┴&1ЗМ▐ЛZxд ·.└*b WI[3W▓╡▌╔Їпd┼d6y*JУкbUУкZ°╞╜иK`-пИ!─P╤кЩT╦1A█╜K╒и]ЕRZ║3+,EUQ╩▌$╣8Фl╔ь░█╙rВЗ(XdЪр╩ >Vшщ√┤'ЙD"СH$╔РТПИ┌&║╢V-}Wпy¤ф╔йqщ.fWрпк2O▄WTНцЎмy╓х+Ц╗╕╕╠■q╬╤├eddKўжE│U╗:,L░edзo╪|d═к0)иu╦Ъ╦WПй╫╪f ▄n╖U-fЛh│;bумЗ'К╠┐^]▀gЯяzЁ╚jЗЬбhP╣kK{ 9Вd¤gЛ.YЦ$ зуSмьH░ИНлWєЩ°═╙&KЄ┬ЯЦQСч╜╜+ждеЗ_М▄▒9}┬─]Тш!кюyj╢┼-╩═3оr%п╒}Щ))фя╚╕KЮ6[`■.TкШ?о(кh╙╛kh╙vM┌^╖Ъ#┌%эМTРч$ы╝.kу∙Zъ┐v╗Ъ0hъкФе╟LL7%iжЁO╠cBЮfA√)х[╓RnDm╥Ё?-╤bЖВ█∙q┴'нjТ■ё┼h╣V┬EoЫMЫj-pЫ¤kА┬с>ЙD"СH$╔РEZЫ┤ SSvAeЙ*шЇд Щ4√┌╪3(╘д2O╞*B9Хe05Щ▒&шk╔и<┼жуё╒ТV═дV ку¤┼°>.оi ч═.^<]╢Lе╠мЇ3бg ╪С5a№vI(еи&scR.ST┘.Y*╗$Щ|{MEёRЩшФ╖Йz│▓ї3жВmфВя╝ШT░O-?п}╨╧Л╞Б╩TЕеk№пЄЄ№/■Yїa{╔iйС╒№╬iXj┴UVP╪иT╡'Д▀<I0 *∙ D∙н%СH$ЙD"СЄ%2}└┌кшl)iЩ7йМхZЕ╥z.╔MI╡╘С┘%U╓V╜W]T-╧▄┬;Sїu#Зд┼Аe-QF╒F╜ ╦$┘ЩВєnБ5┘Дй}%єХЕє.FДy{∙цфеЭ=zьH╬пЛB╤бе╡╚╛ т╔╞T7A╚С╠╤К═U░╫Ph╤МР▀k╞╬Aэ▓`ф3┴А`╒╞ц╡3╞y-T╨▒ЪГ╕ фЯх ┌X╗кГ~~"S~¤╖nD  М№дъФd╧┐░8Є┐'ЁшЗ @aеФn┴Ъ_@√ abbо*ц ∙Л·gРИzЙD"СH$IУиHZV║Фз А[T╠ТjЩ5╕╙ ╕kDЗ─▓Б√┌TUf╤цЬКк╢t 3iй1"Ш6ODдаW]e} ╗p еСIТPкrU╟s/55Щ▓╬[$\║эссЭgK ?╠e╗о=╒╒MR@╚,W╤BOA┤11FФKЙre╗%^ї,╒X╕┴Б$╔о·ЄDV>Фоз┘pрf:m█єI]?пhйЎ*OьМ┐Z?═_(Д╛G|c4ЄцF=A╚муРїЦЁ@BUї╡AїхВЬЭ╫ўВ╛╥Отж▌.фiv┤j╕пj│ `├E│Й3ZnСM/ ъ▒ЙD"СH$ЙдI╥pSVD ў┼,╩n&ma┘жZo>/DQ▄Б°ТР)й▄A╦▓"╪┴,0Wж-МщDD л ЬэW▒лyвфa╧s5Ы2]▌3нY╩В╫ ССЧ<=sЧЄ|}m^ВCvШLТ"╦┌╝╢Пf╫'ц:DСoBжM;Р▓■│╨(╛=ф Ч▌Фшp╚&I├}=$Rї∙╥┐┐шFTm 4AДввї_─Ы|l┌№ ╘+КВ>G[█E┘lVueTЬWУ╛щЪ└gxа=│7nRи╡КТ╢▄СP░к+o▀┬Xъ╡РDm:╣6┐Ьwгф5 ∙▒Чv/М╦┌дo}╓╣Ўpє JzE╜ Z]·wСк ,i▀tЛ· нw┌lx╒i╛ Bb№_ н*с¤╘лцWЭ¤O"СH$ЙTRqв╔╟]m·и>┘VU ушНIЯПкн=cdк╚"ш├ы)2∙m╣FY┴дV&[єl?╧[▄ПЇЇЇ╠╔╔╣pс┬┐╩ъ@VИM █╙/q\+)е▄и├¤?╞9З9╫h°OЦЩ>7┘░├'D})╛IF3nн╨ж3.╖ач╟Ж°ФэB-∙п╜.RкUкОп╦К╝С▌Р7 'Ьлc║7ЬO2з7═hТZВh╟xх q╝3ю;яbэ ·╖у)УH$ЙD"▌i╩╦╦√∙чЯпЙ√╚╠f3_┼│H·┤█эnnn°√_∙Й/T─YЬЯсГ═№'_H┬КмVBЩL&Ы═fм|Д.р'╖yuaФск Eыq┬ъ╚uеНшы√е┴K╝;╬╜fКFцццj╦Оъ╦6▌*х@мV+■ЄУ╞c5╓l║·FgD■O2ьЭWЖ▓X,ш ╔/┴|iжўЭ;ЗГ~╔Ь°НW╖Щ┐Bf¤s ║│&}М┐$▒ЙD"СH$╥=аыр>╙∙ ,ХРРЁ√я┐г4а ▄ ─OKKєёёЙЙЙщ╘йGI>И╬┘ы║8uт─ЙГ╧нZ╡j▄╕1┐─с;<<№Єх╦╒лWGEMЪ41S╝qО╢Ы6mBзx╔6m┌4j╘╚P7ЖЩ9щЄEOwю▄Y╡j╒аа ЇОб╤0^Ж▀┼kчГ╩%╠ AБ]╗vЭ;wО╫▐╣sчААchЯЫт¤B╒█╖oп]╗v`` ┌╙вE www├ИКр@XцЇгxos√лWпОЛЛу╜єЄЄъ╒лЧЗЗ g ╟╖ЁG √ййй√ўя╟#.UкФєf┼C9nOOO▀╝y3nчхс▐.]║а┘QQQ8П/O╖n▌ЁтсjVV╓Ж RRRъ╓н█▒c╟k┼ЦЕД╫ї╥еKП<Є:╔╔╔xгPЛё*r╧р*№ун[╖ц▌7вй°*E"СH$Йtщ:╕oдXЬ9sf╬Ь9 4ВУ@╧└жММ └▄▒c╟>¤ЇS^ШГc │в.\ИzAБ╗|Ё┴xАДsЇ▄╕qу_¤5h╨ 4 МDaО┼Е2a q`▌║uktt4"cш║▒.-Л╜ TрЇ╝m█╢zїъ∙√√я▌╗╖к.VР|bЁ"7b╨?g·╕2яoё▌ДЕ▒c╟ВклUлSрь=z└█МЄ<ШZ┐~=№ЙрНG|Еb...F~ Gm▐*V@ЁF>L1>╟]№C╟Ц-[BBBО=┌бC???P2┬ ▐5├QF" ?ЙЮ"т·ълпЁИ}}} Ў_+╠ръИ? №єZ╡jХ-[┼*UкД╤A`╜>с %%%ё╟ZеJЬ,╔ў uGО5jкГMЇnю▄╣h-"уAє6пY│ць┘│я┐ >w&ў┐T┬╨ВD"СH$щn╘їqЯiХ╢o▀■·ыпsфдЛcъйSз@Q`kГ8Л╔q╓т┼ЛЫ5k╞Ї\N]Ь╚E]А╣Г~ё┼0И*·їы╫о];>Ё_дA|?·шг╛}√╢j╒КЬ>}║ПП╧O<┴QПєєц╜∙цЫ├Ж k╤вP\as░";Па│ВЬ{ЮcМp_IQ┌є╨Cuэ┌╟У&M2dH╣rхx║╖╞├Ыс├З0аe╦Ц╓╬Э;#■1╞▌╤<*#╟y╬▀╢НT)▓№СqО╟єЭ:uъД ─(П9√n▒Zн▄9<√╖DDD|ў▌w#GОмPб rВf;╧▓╕Vе √1c╞╝·ълAAAм √√я┐ч═Ы7e╩╪AБ▌╗wГь│││QЄуП?о\╣rXX╪еKЧ┌╖o╧Dё╛E│ ~■ЖаIч╬Э√сЗ╞ПП0╞∙Aгj─xQ?∙фуiт*^┌N СH$ЙD║Ku▄7╞zCCCAfп╝Є +Ш? ,╦╠╠LLL}┬├├CBBpЬЗ`аl┘▓o┐¤v═Ъ5 DEE∙ы:yЄ$MкQгFгFНО;VйRе3g╬дззуЦЄх╦г !╤╤╤┴┴┴UкT╣.)в└gЯ}Июгх▀|є═р┴Г=<√,р{▀╛}nnnm┌┤ёЄЄB╨Яр~■уП?рЁ╠╒УqЭ┼╔x╨▀~√э╪▒cKЧ.═╜ЭЫЫ ;xФ▄'0ЫЦЦ╢k╫.╨0кC|ХРР0yЄdt╨жз]┴h[1Щ¤x ░Иын╖╘ём}4ю┼г─y╨< в/Ё°~т─Й~°a┼Кyъ" WW╫ы~9юуYМ=Ъ┐?xmр:TpWJJ╩бCЗH╘кUлAГ7n─гЗo8└#D\xQKR ЙD"СH$╥▌лычю3X╧Э;РYВНж╕e╦Ц┼┼┼╒йS@№▄s╧э┘│'&&Фт</F└}╨*h xЁ:Г├╨А╘▐▐▐]║t┴I└1@p╨аAН7FгЛ4nф╞№q└O Ъ6mш╣ ■и ЛЎгX╒кU┴▓у╞НC╟╕tщ╥╢m█"@E└k▄╚qЁў▀G@├а[ЁАc||<,р4╗°nв.╘В╞г^ШE╪А╢┴╒_|ё┼√я┐#p^~∙хyєцб╡/╝Ё┬Ъ5k@ч/╜ЇX( "╟y╕Ї┴№Є╦/╤░a├Жgс(\к[╖.\╫]kt▀┘9ЁфМ3└ю0ВG O"H├├х.mwы╓ Ф╠├-аpPP:8}·Їў▐{яЬ.4мzїъЭ:u*Sж╠╡▓к°─\╝И╗╬!ДЁєєуЯqЁТ└е8Гъєр*J"0╕у bДsx°╠▌ыц╪l▐╝y┼К╜{ўц_0bccOЯ> oє╠%╕ab!╝Рч╧Я?uъ┌'7i╥}╟│FяpЙчD_ЙD"СH$╥]кс>qЯ~ў▌wqpц╠Шэ╨б├С#G*Wо╠ч#ШВq╘ыяя╧Г%Ї}─╔╖▀~╒б;#FМАх  &i▐╝∙Д @ЁиЁ6р855h√·ып╧Я?Б*EЇЕрСG┘┐? ╗╣╣]╫сХ.]║i╙жИa▄▌▌b┴с°ЛУИ▓р╝Ъ╫┼}╝!?№ЁC╦Ц-y~nG/╛¤Ў[p W_}╒лW/╕х╧? DГ'▄╟+▒{ўюС#G"Т∙ып┐ЁъП3q ЁУH$ЙD║Wїphї╞o+c╕dnNЩ2е^╜z|ц(XР'о_ў╥еKaэ┌╡лё,jрИ═\╖o▀╬╫Дю ¤ў▀'8┴Я╒═q╪ jd:z╬Ъ5╦└¤╠╠Lk╛ў▐{ачя┐ ■Е^h╘и-9qтD```я▐╜╤D#щщщшEч╬Э╤M~╦╨бC7n№ып┐вz 6-~LЭ x оэ┘│'мп`а Я}Ў┘|PеJDЯ|Є ,гFЇёбЗ?~|╟ОсЬП>·иj╒к|йS@3║ЦE√k╓м DЕГ°∙т6%Яv╞}ooo└8`!M╡j╒xV_Зч╥р╣ 2Ь:u*b 7+╚█╣sчЮ={FНЕ.K8k╙жMаvр;Oц╨├'}Д1№1П4p╛Y│fh▐mД╗vэBЧQa^}▒╝m╫їЙD"СH$╥▌и А√[╢lyє═7Н%ъ ▄"м7n▄╚╔ЙП░Нyе╫╪@╓жMc╡D1└z╪░a8│yєf─╬╕▀бC `ёK@r▄я▀┐┐Б√`zў│▓▓^~∙e4╩╝°тЛ?¤Ї╙│╧>█дIУO?¤ЇсЗ>~№xэ┌╡{ЇшБ*Ц,YВ╪╓Аїh'╬ўЯ{ю9p6мэ╪▒Йи╟┼wMхЯ`?yю>╞О╦GўQ)ZИGН}√ЎюГG╤┘Єх╦Г√ °√√гоєч╧Ч+Wn╥дIh0В`.B╕о╞-ИЧо√░ НюуLjj*ОёX?рщГщс}═F,Бў"6°ё╟yв u]G"СH$ЙtЧкD qдА√[╖nх╕ПУ└х5k╓DEEў╗uы№ЛуR║.╨ЎuY ╕vп_┐>_E▒j╒к@чm█╢]╛|Щ/└вНППя╪▒#ЪЗаLЩ2П<Є(│°iй░ МлTйhШ/├;└Y╨Ў▄╣s╤┴>}·р<0ИaP/BОп┐■║}√ЎTрp'bPx┘▓e/]║Д╕h└Ёс├З LмPб└ў╨бC 4h█╢mё▌Д╟пХ+W~Ё┴yc АГ∙єчуЎRеJб GПwв┘¤·їk┘▓%'─h?\ДЯ|╫нГ"@;ёрЎ~°6pнBЩТ QГ░g═ЪЕЁ╬D∙───EЛ5l╪░tщ╥xж√ўяGxФh*╧╞Ag╤╝"/╝Ё<╞╓ю▌╗З╩#║"З{Дииsч╬шКс┴Б√oмZ╡ 6Q;╝}Ўь┘AГс*B─x╨B╨∙└Б∙[Q|wэ9r°╬╫)╨╧Ю={┬Д cЦ-[Ж╟К╪ ╟є┬U═Ы7_╗v-т%GHАЧсеЧ^Вы(wЯD"СH$╥╜кыу>З╚ЁЁp╨RП=М1╫={ЎА┼БЫр│a├ЖЭ·h╧Ю=qK│f═PЦ┐√ю;О■@ф}√ЎБАГГГпKК0ї╙O?┴?№#|┼╖/╚╚╚Ш3g║Ў╩+пl┌┤ XМ6юЫ4iЄ╦/┐╕Q░uъ╘йYYYш(-м├QQ╨╟Е "╓zын╖j╘иQТШ>√x·щз=<<р─0┘┘┘▀~√-кю├,ГЄ{рю█o┐Нvв=р{╪GМБЧ╧ЧЗR┼lP┼Gў╖·∙ЄЭш<ЖОДЖЖтЭC╜Ёъ╦/┐МЦЁ=╣Ё|@╢k╫a┌VТэНqЭ9sF╨ZX╞1b'°яL┴╜╔╔╔xd0И╫С[┼Кg╬Ьщяя гзя╛√.zэ╝Ж,ЙD"СH$╥=жыр>8 <$щт°┼w╣26Вх┘╒╞yVЁAАoqUТъ]\\°Zя|їwcO(╬И|aMЮъ├═L Й╢╞╓░\╕Э█ч╜└]єц═ ╜є╬;╝/D>Ф╖┘╪GЦўrss├Oч┌y├°dжпy]╚цC▌╬█{▒В╔мш8w▀Ч ?Б╣8FлpАЄx"h?_C╙pО9бт*╧M7╢т*╛%ЖO°ъУ╝R`7мхцц;ьЄU№∙&8ЙТ╕╩]┴ўNц[.ЁоYС▒Г_║╟И °j░flёpyе▄&яTIVцсuё}°O■░╕ЗaБ╗¤┼y4Б▄ц═Ы╟ОЛЖёЛQчiЫ-ЙD"СHўкоЯ╗╧▒М╧░4╕Нє4°О╞╢SЬЮKТ┴AЩу +Шчp╧╨фЫ^Б╞Ш╙>\№jС|f─Fc╙Yё█╖o╧╚╚x№ё╟Y┴Q└>╛ж зF~ +╪ZЛ/W╧ЙР╓0b~\Є Y╣Y^ ╟e~└└у╛·д▒З.Nхм╧ыт~ц╝ЕччєSЭў∙тqЭsЇ┬Пy ╞{╩Лё█ _]-▐$╬ы№9rwё╧╘x╚┴n,,lїъ╒╟ў ■√я╠╠L┬¤№iЭ╞|Y~Є&√eмєГ`о╚ ЖЭWР4&Ш:п)I"СH$ЙD║7tc╕Ян╦╦╦+99∙ъ┬\∙b'ч╧ЯЯ={6`~▌║uм`с■?тф-мЛo ║▀ЁX;Я*┴╗╝Цэv╗▒g╙Я  юТH$ЙD"СЬu├г√╕ $ j┐║░єш~BB┬╩Х+Q~═Ъ5|ь°╬┬}▐oБfВк кє┼№╦·/с_?os╓?pргЦ-[; ▄XяАЄ╗vэКННэ╘йSх╩ХЛ,ГЗ╖{ўn<╛i╟О¤¤¤╒ВmМI$ЙD"СHўМn ў┴ы|ъэ╔У'Л,o╠т╜rх╩ъ╒лнVы-Kцa·&п╞╬S╞ВA╬3 М<°kОСы¤Uэ┐*S4─З&╪Ш 1╒М#YчQpиYP,ТI░г?У$UpгЁБi┐ Ў/вє╤ў╜{ў╞┼┼ёна~°с№Ь5k╓K/╜dДJF╦Нe°Э#g!Ь·є╧?╙╥╥°╓WгGП █▓e И▀╣√6](=n▄8№хГ·гFНz∙хЧ}||°7Ю_DшO"СH$Йtш╞pмЯССa▒X@э╬;9У*?▄_╣r%╩пY│ц╓р╛▌nўЁЁрCрЕ6~2r╨Щ>╣╪hzV p▀ЁГ╛║'УUEЇV2╤б╚6Q╕ТСЪЩХруS╞ь&2U:Ї ┴Д aБ┬ЬY%█╙╜xЇ╤Gўя▀я╝Б└┤i╙^}ї╒"q▀╪Ь╦H√1rюб°°°Gy$44╘╪  ¤ў.]║8┴▀╦Ч/г^А~єц═сF╛Q╘С#GЖ>tшP╛oю5¤F"СH$ЙD║лtУ╕№°qN∙╕И┐pсBЭ:uАЛ|═№ИоZ╡ъVт>▀Ч╘@RcCS╛ajб▌┐о┼м dтиNзЁO┴ Q╔┼T╗-&-94<т╘ЙcOvы╓╕Z-a8┤{U3SExM╦rЎ _▒°A~Ю^┬ │┘l▄ПЙЙЙ│f═z∙хЧп╞}#Ь2╕▀╪kЦ+55╓ёLПv`-==}█╢mИЬqum▄╕ё¤ў▀пUл╓М3Щ>!8pр└иQг^zщ%??┐BёЙD"СH$щю╒Mт■╔У'З8^ю█╖я╫_}■∙чГГГ]\\°Є0╖ў╤b77╖дд$▄╚ЛБb}||*UкtЎьY^+╩└╧\/[#G▀ш╕>f/╪┘,&Xsг│3├тв9цсRк╝gйоmZW/уув▀шt▄∙+ВnЕй∙Жxrd*ўy╢МсY№|ю╣чЦ.]:}·Ї"qDО┐ч╬ЭKNNFHLўїї5ЖсЩS╢Nвp╫о]ё06l╪АгR╘xх╩ХЗzо▐║ukPP╧█Б╟FМ1o▐<╝┐¤Ў[Я>}x╒┤ЕЙD"СH$╥=аЫ─¤РРЗоэ█╖╧Ъ5 $ =z4ИФ╡╟╞╞о^╜·Vт>╧/_┤h╤;я╝cd┤╖k╫ю╙O?▌в)|m qу╞╜ї╓[╫вV┤ьСS║ ЎY╨8>╙fЛOK>uр╪1Л[╣R^═ы6lT\\J+д щ█%НЄY1Б╦-Pt3ВъРd┘dТоЛ√ЕДЎ4╕?c╞МW^yхj▄чJ:uъtЁрAЖ╫ PhА▀ВЯ:8p`╦Ц-Э;wv╛Д╪лuы╓xxZuы╓u^w ╤G▌╜{7p ё╟┐ЩuБH$ЙD"СHwФnў┴ю{ЎьЩ9s&ИЭU>╝b┼К8NHH╕┼╕ги°╪▒c╦Ч/?■№╓н[лTйЄЎ█owы╓m╠Ш1┐■·k╟ОГВВ·ЇщГ╕_Ї╓в3A╡|}БYv)95".&▄▀╡kс>ЙD"СH$╥=жЫOцILL\▒b_╞(кl╥д ╩єХyn}2▀=*""b┌┤ik╫оюўя▀az╓мY╡j╒тС╟╡Fўu╚┤▒z╞NЕEЮОН║РЫЪ\гJ╒j╘отэU│|9│ЦЦпН▌╦ZaХмК░~▀Я{╧ЗцЩ$ЩIfYР┤╧(З`└╤╜UыЗ4ra%Щм√я╞Фўёwєц═111(№Ё├^kWм└}╘ИТ8I╕O"СH$ЙtПщцWц▒█эFж╛Бй`NЮl┬ГБ[М√.║°╓иииIУ&m▄╕1888$$dЎь┘э┌╡у qЛ░Т▀a-З'"..6#эЇхЛбс*T иP▒N@ха╩~юр`┘оН K╠┴T └/Jттв╥╙мв( вEa& ЎБ√К ╦╒*TиR╓╟д╤sЙч1<ЛFўЧ╟[pzч╬Э8Ё√я┐у└9fю╖n▌З Ў■√я√√√-G╔▌╗w Є╦/ ╕zхЙD"СH$╥]к└}▄^UЪ═ц'NYЮу"АЬякЛ*╓п_kpЯG8 ?~№╤гGGО┘╛}√)Sж>|x╬Ь9Н5bzZЛ┼b)║C╗щj+эшC¤}ЫнИ┤М Ч/╟─E_МпP▐зnНЪ╡*Tїниe)▓Ec.╛┴оУ▀■SМ3┴уxш╨б@эЩ3gЄХyx$c?/╝xёт╚╚HЇя▀ БpvСєєу╔<▄║u+B nНЫ┬c°Ў█oзMЫЖУН6l╚┐,Z┤ш╦/┐l╤в┼зЯ~─ЇчM╕O"СH$Йtшp_Цe╗▌{нЄ▄xnnюЮ={ЄЄЄ°о║╖ўa·Їщ-[╢?~|╒кU╕e┬Д ┴┴┴3f╠Ш>}zп^╜Ъ5k╥m┌┤щ5┌ ▐ч¤╬╧bДA█N76-∙LxXBJ╩┘єчj╓оU╣R├к╒╩zxYЇ╜wE&:oлї/л║п ╩F╥№Т%K._╛МГ5k╓;vмwя▐ш╝e╦Цm┌┤q╞}8¤╤GЕ+ёБ┴SO=х<3р└▀~√-11╧fю▄╣Ч.]2d╪ш╥еK¤·ї9┘зееўсў╟▄╧╧Пg@АДЄЁ$Pф╫ЙD"СH$╥]к└}З├6uъ╘ .\7o╖─╟╟WйRe▌║uF∙-Шк;o▐╝╫_▌ШП█╛}√╤гGё∙ЪХ8Й`─И╫▓у╝═Ц6*п7Хщ t╩8!Jv@Fъё╨єccг.>╙│g╜ъ╡Lк*йB■▓;№■$6@ ЪщCNСs_tю▄y╫о]╞gY[╟╙Д.М9rь╪▒Fy▐йО;ю█╖eЦ.]:`└чеёa^╓ЗДДЁ.C<н ¤4И/М ╧ Ў?~№ў▀ЯЪЪ╩Ы┌┐ rх╩╜ё╞uъ╘).КD"СH$Йt╖щ╞rўП92{Ўlчtц4ь╝ЕОггг-╦·їыy╬═т>╙SЕО;╢pсBЮёВЯ╒лWя╤г┌Цх╨▄п_┐NЭ:]3#и╨о║Г№L╒7рDUd6U╡Л┬╣иШ B[7m\▐│мY╧╫TсZг√%O╬A;┴▄g╧Ю5№eЇр▐лW/╛·И╩Ф)|g▒чЮ{.88╪∙*Lс)NЯ>=**╩∙Yв│┘ ╓o╤вw=┐ЪСС1c╞ X├I╪yчЭwj╘и┴ГДщЙD"СH$щN╒Нхюкч6Ы═╣Мє1_'&99y╤вEА√╡k╫3zo ў╛юююооо`\╘Zхs[ н╝╔gп^k▌¤Tиу▄█х╩МY╡▐и░"кКIЩвН|єtбгc╡@Eе_ЭN├;ш╝╓П┤ЬGўЛ╠#т╞  8dЖ╟°]|х╘'СH$ЙD║╟t├+є┘===Бь╬eЬПy.Ihhшw▀}ЗZVмXqkТyp╔в╦рWГt9юI,<[¤ q■У╗o№ГdЭрM*╦▀pWз{E_XS╥░_╒o╘ЦяTЇТEпъ=ёH╚¤BыыєKм(Ъ7Ю╙╒щїЬ╫yЪРq#ПyЬЭ╔ЭЖРЙQt!dт┼Ь┐РH$ЙD"Сю▌юєyб ~АeHHИQ╞┘OG∙ДДД▀~√-//oэ┌╡╖,w▀┼┼┼╒╒╡P║╝╤8╙мgKВ√╠ ўЩёТjTe-КївиHфы∙p76║я<ж^И░На╨и?я▀▌ръ╧╬оw╛╦y¤члх╛*св$ЙD"СHд╗K7Ц╠╓ЯЭq▀9Х▀АЁ╕╕╕uы╓б0_ЩЗ▌к╤}777ЪQJ"СH$ЙD"пЫ▀U╫(Sфш■Х+WVнZu+w╒%▄'СH$ЙD"СJ(┬}ЙD"СH$щЮс>щ╚ШН└■=ыа╨ЇчW╧Tfkы:]]└┘ИєRE Г>ТH$ЙD"▌Н"▄'▌ёgoLЎ╜zY╧BSН∙є-4S┘╕╩ЬжєнШ ┘сЬ'е7БD"СH$йHюУnБЬЯ╜3пZ&шъ[ЬЯ▓▒^Р├срл8 WэRllY└/q·/РH$ЙD"С ▌п╕╧Ы*:%фЯVЭ хяи%Ё#би[I#·щщщxиЙЙЙ/╝ЁB╡j╒ Сzllь▄╣s▌▌▌ЗZо\╣"╖ИММЬ3gО¤CЖ AIg#№╥┤i╙╝╜╜Я■yc╤╒ ioI$ЙD"Сю▌}╕╣║║ЪLж"GО н┴M#J░k°ошЗК╩+cfХI▓╩dж*▓`ЦdСхУ ╣┬░К dA│й/╠╧╖у┬с■/A└[╦∙╪HF7╟Gм∙╖1Тэ|пё╙y;н"3[М¤╣Ш╙H╣сч▌╛ЬsхНZЬ/1з═wп▐ўЧд▌╟╟╟wю▄9**jы╓н>° /╝tщ╥░░0╛ ├┬Е ¤№№vэ┌U╣reгa|;0╧Ъ5+$$d■№∙|п4А■ып┐■╬;яxxxЁцё&сj╓мЩ┐┐?jб═АI$ЙD"СК╤▌З√h1p▀l6├║s7√w √7·Vб■ ?г╚▓иmдК№6QЛ╗Я_пjuoQЩ$8tЛ:ю+·НNмПГа'║яа IєБm├A╝┘v╗Эgк┬nц┤Е░aУЗER;s┌o╦Аfг%╬Вє№WcЛbDV6ЫН'┘;ч▀Є-У~·щзo┐¤╢g╧Ю№1░Ю7╡Wп^Ы7o6┌\нZ5ўЭk─╧ р╡x·щз∙╔ффф;v╝°тЛп╛·кЧЧ┬ЭЖ6М5jх╩Х°;d╚жяа|]╖УH$ЙD"▌З║√pv▌▄▄\\\ ╨З╗\{uv°?║║┐|]Yaв`╒\AИ╧╦ Н╝~9*Ў┬Е!=л_е║ии:юkЯ$WЇ╤}g╝X┴f╗┼A┐▒■МsмВ.йёУCЎ╒МKмр#А┴╕╝зЕ┬V0в╦xT╞НЬ╫Н1u5KыйQ╪9 0fД№у 5р╥еK]╗vMJJ┌╛}{у╞Н╣MTЗ╟#x~ ¤ў *8Пює/И(╓о]√┘gЯ= №єo┐¤6 zs■№∙:└╬;я╝├Й▀x╕'OЮDнZ╡B]xhАЯD"СH$йH▌}╕гбббGПх< <нWп▐C=ФШШ╕a├№D$6h╨А¤;сфЯnы<.и p?O╨W▓├$EgзЯНЛЙMN>}·м9┐А2e┌5nX╤г┤и▌б:$U┴┐BAR┐ЪoH-Hь7П√|NъжMЫввв╠f3Z√╚#П╘иQуЁс├зNЭт`▌иQг|Ч6o▐ЬРРА3=zЇ4GFFrчvь╪1((╚p=чrt█╢mqqq№<К=·шгБББ╝R<Жuы╓еззуз╗╗{ч╬Э╦Ч/ПfDDD╕║║тф├?\│fM9,xxxрч╬Э;ёh`┐Wп^МОО╞Н8Г╞Tп^▌ш╪╕ ╖ддда p╛1ЬoL╜={Ў,Ъ jЗYctЯЗVл╡SзNxл°УхAк√Є╦/Ч-[Vо\9┤│NЭ:▄&.?~╝e╦Цн[╖▐╕q#ЪTМ╖I$ЙD"Сюg▌}╕MЯ>}Їш╤╞р4Xy╦Ц-╗wяю┘│з═fуч'OЮ<|°Ёk%є╚Z╛>┬Н╥Q\Зк╩Тp%;#:)■№х╦'╧Ю-S║L`┼* л╓йV&\* ╘.иyвазяи=qG╤ ┴МК,ЙТ \ў!Ї╖{ўю√ЎэуnЪ;wnэ┌╡GН╡g╧╛: 0}ъ╘й>>>▌║u;qтК}№ё╟Аu└9Г■шгПАЄ╝Пш8Аи=~№x╕╘иш╡╫^k▐╝9В╨yRRОх░рщщЙ@"66F╬Я?╧╫├yє═7▀zы-▄▓}√vD/╝Ё┬№∙єё ╝ў▐{KЦ,A`└3°GМё╞o░В▄$DKЧ.EэаЁ/╛°a╗*╓Bуё░P╡1║oдууAиРЦЦЖ7Г╟ы├┬┬р №DQлV-├"еЧ^zщЄх╦у╞НCьБw▒xЗУH$ЙD"▌Я║√pvA~SжL9|°pН5Ъ4i╥░a├С#GВY┐·ълРРР3g╬╘п_─ ·g╫Hц╤qЯЙ°Х9TfXlZz|VFHd╪▀зB№||¤╩Ц мTеEPРЫ┬dёАтВ;ёrR╥Х▄,╗ (┘U4сФвНю+аV//?╧╥&╬ТКз}╛╢ 8ї▄╣s{ўюНППd?~мП╛Ар╤Рёь┘│Я|ЄIC0╞]н[╖Ўєє гSш> ■╙O?├╤╔╔╔Э:uВ[ё╫╦╦╦иы└Бx▀}ў▌лп╛ЪЮЮОИ▀┐?<№╬;я№Є╦/СССэ█╖╟-8Йha╞Мx3g╬─Crss├%T#╕ДJ;vьшыы  #r└sэ╙зП1▄ОHаKЧ.xи;vьи[╖.O*ФR qw┴]╕╘мY3╘H№$ЙD"СHEъо─}T ╘тгMSзNm▄╕1O Т~Ў┘g√Ўэ3fLп^╜МDє"М0YГwжeу╟еf\╔L√√Єх┐╬Ю*ухUй|Еъх¤Z╘rЪ!а░&LкhУЕ▀ №уP╪∙nGЕgЖxщып┐F#;wю ЇЗ╖qчwю▄╣tщ╥~¤·ё╝<п╦Ч/wы╓ ┼Ц-[nёt№BГю╖ўqF╨8Ч`│xЯУH$ЙD"▌Я║√pB┼@╒EЛ= №єП=Ў╪╩Х+╤ 4И№╔'Я╠Ш1ч┴Ъ|№╣√КЮ╗/В·Э:s4ь|В5;13│QнzMk╫ёuwпX┌S▀ю╒бИк┬vЕЩ\■m╫d2с9В╦ё2m▀╛╜^╜z№ё▀╛╤}mАgЪ5kЖ=<<Кў9ЙD"СH$╥¤й╗ўaM┴U╨ч{я╜W╢l┘№ x°ЁсО;VиPaЎь┘]║t1Ь)┌О╠╗е═о╡ КГЙ╟BCB╬ЭЛ│ I╔╔uk╢m╘╨╦d (]┌т╨ЧщФ┤Y║Км`(h x?ЭLК╫]Сч▀Ют╕bFGц╬Э;xЁ`c5!┴iН|x▌┘┐ №╤║uk├Й`w6у╟П рГтттzЇш╜a├рпєBЬ°;tш╨e╦Цё└Ау>Ш▌иQ#╛в-╕╗`зEЛш-[╢TлV ▒А1ш┐yєц(Г█ №є╧_¤Х'єЁКP╝О╓ю╪▒#((╚X&╚x °{·ЇiШю#, p^<с╠в#x]°4_■}oв ° f∙D├2ВГГГa пD O"СH$Йt▀щn┼}ОЙ┐¤Ў(╣g╧Ю╙зOЯ0a┬ц═Ы'NЬ╪╖o_╛H╝┴пEїЫwK[I╟'0Af*■Е_I┐|)>59тrдПo∙·╡ыTоPбF97UKє╫RЄ╡\}П*Б %Г√л┼Ч х▌фk╥/Z┤ш╔'Я,▓йЁ аЎ╪▒cАZр>▀{Лщ╔<▀ ¤╪▒c?·ш#<┬йSз"ьyцЩgp▐▀▀▀x$`Ї/┐№╥╦╦ы│╧>k█╢-╟}07 ъm╥дЙс%г9ю├╔ИCА√ (∙Єe╛╝&╩А┐q╝b┼ ╕┌╕ ╧!Gzz:вИzїъzИ№У┼йSз:uъфээН█╤Hб`ч^q┌ш╤гы╫пП0├l6у|jjъ?№А╖фЙ'Ю>|╕пппєkАРБ║АHАpЯD"СH$йH▌}╕╧ЧЯчxЗ[ц╠Щ│`┴Вx`╧Ю=А╤}√ЎбY╞∙╡Цcч[тrZ╧G╫╫хФэК`у33"SТ.&'№yЇиw┼ 5╦ЦkWзN%Я &j3qї█ с╝AБ°ЯЬ?р ╡j╒кf═Ъ╣╣╣ш Gaxj№°ёр`╕╗}√ЎSжLй[╖.╬╧Я?БMXXX├Ж g═Ъ╒▓eKp6 ДЖЖ═сFу▒¤ё╟QQQ(єълпжееН7wФa░sч╬(Йчфтт2b─Ю*у_|ё┼дIУрфзЯ~z╠Ш18Ыg╬Ь═гUкT┴bT│AAA|]Qс┘;hМp% ╒UкT╔╪╩ЧOxЎ┘gутт╛∙цД┤2ЙD"СH$RС║√pЯуйЫЫOБ]P)x▒zїъ_¤5H╘l6}╗f╠`t ╟J■U┌~║┌6[ wИB|VVD№Х3aз ╘пwЭ*Б&UёЛьцH_п╦j╡vщ╥,╬Їдy#Ч?GП¤┘gЯёbр▌о]╗=zФ;d├Ж @[ФфKdrШ^║tщO<Яn▌║5)) сP╪иk╪░am█╢m▐╝yЭ:u┴т└nc/Vэ ъш╨б?mпqйFНаm<Ь9{Ў,▐АН7╢h╤NF](АлMЫ6№ГЯРРЁЁ├г\Eш┼█l╖█Qё╠▒c╟°с;їтСЇQ▓^╜z╞ЖbZQLЮ<Щя(ьччўю╗явX╖n▌°d\гх╟ПFэh═╙%СH$ЙD║ЦюJ▄wwwчLПb111c╞МЩ;wnы╓н╖l┘ВHАgЄпp_¤ўY-йЗoЛлп┐╔XlbRd\T═┌5╩Ц*maВишQ┴═Нюг┘ш<яp─72n╓мY╙жM9CГz╫н[ЗN┘l╢▐╜{WйRЕщЬ}ъ╘)>M╢{ўюБББ|┐*№]╗v-╠rk(АhБ VРЫЫЛ╪∙┤г ,?∙фУ`k~5╞╞╞┬y┐~¤рj4599┘╒╒uбШ╤ЄTиP┴9щ┐c╟О)))╗wяо_┐╛▒ 0■._╛▄╪№ЛЯg·°} ■¤Нo<цA╒ы╫пG8ДcЯ^╜zсq;Пыєўьф╔У═u!2A ЛЩ╪M"СH$Йt?ыю├}▐=9∙Бz┐°т └■>ї╘SBБо╙яkЇW┤╜r╡@█:KqIpИL╓╥№e УXAк·═'єЁ░дРы9:є═hYБxH└сЮ/╦у<йЧ_5Vь1Тщє{дЫтгHп°U~╗єd_у#ЙСd╧Ч╬:tш╧? ф,К Ж тяя ▄s╧гп╞Р║Ив∙▓в╫Vт╤╦ки╩В,лВЩЩ╡@ГZСO╤╜zeЮ $чA¤"Г╗ 86└Ч хУ_Эo)╥ОaбРхлу<В^ш  ╔AЯo·kа9┐╩ тdJJJ╟Оcbb6o▐▄╝ys├Hб╪└░_(63Кё║▐Ё9╗╞╕╛аящЛ╖еEЛ*T╪▒cЗpНнH$ЙD"СHьn─}\Ъ1c╞иQго╞╙Ц-[ю▄╣╙┼┼х·№з■3U╖аЛ Ьу>*чыUmC.m╗-Ф╨п▀4ю;'═_ ▀╬чНл╬gЬЭcШ*4▄■O╖ n4╗╚b┘поСР7? ■v^Nзй№x└И╛*Vмh|┴(▓ПF Нє<ЖЬ rю+ИLьv√╠Щ3ё┌а╝Е╞зЙD"СH$R!▌Х╕┐ ■-[╢ЪЙЛуААА╫^{ ╕г▐ ▌а ╜@Ь┌Н¤[[СД ╓ннИD"СH$щ▐╨▌З√Р╔druu-ФжbdХ№¤ях№ °┬;WПш▀ёO ╞Tcу%б'N"СH$ЙTдю>▄╟%T ▄┐║'Fz╧vщцTфш>╗=3hНM╩Ш╙"?$ЙD"СHд"uWт>XЯoлTh >└;HXA8сЬ┌╬є╚Л╠A┐█Uф╝ууIСхЭ^=╟аPсkн#t]Z&и°К■_ф<й·^z%H$ЙD"▌е║+q╗╣╣¤/q╩y йр┤&o└╜v|х╛╧╠╣ЕHэ╝чЭГщ╖J╬ П▐coЙD"СHд╗QД√%▀╓hO7Х┐ўШХ'╠Я/Ь╘o╛│╞"д╞wТЫ4xG╔∙[╨=╓5ЙD"СHwгўп/рp░c╟О┐■·╦X¤│m█╢э┌╡╗-s╕3з ъ_Є/T%8ХdЕО 1$q║X%%%-[╢ O╚f│╣║║вГГЎїї╜%Б №ЦЮЮ╛tщRл╒ │>>>7oє╬Q|№ ▒wV▀{ц╞Л ЦiРP┬0QETBEP╗00▒┴СРQ∙Г (HИ"!KЗ░фR╦▓ё▐╗1є ц╬{Ч╟▓ ?чs}▄w▀▄щ;єЭ3g╬dП=:--эЦ[n┴;sм│гааааааЁ_╟ёGўйоыа√$a8С8┘╗|Є}▀╘▐╧лцР╢■╔╟▄▐u╫]CЖ ёэ°я╗я╛7▀|╙/-I2.ў-теЮяlэAсЭ└5┬г┬┴?wp╔)n┌Д╣H┼х╚УщjTзтАфFдR$GЗyчЖЙ├4т╠}^└кUл.╛°т═Ы7╦▓Ф,YrNу╞НУ╦XфЬпфJ √oip╟ў▄/╧╩╩║фТK╨єжOЯ~Є╔'УД?┘а╛з хn┬Цй√E.r:Б╞┐╣d╔Т╓н[ззз╧Щ3зLЩ2╛!╡еXAAAAAAсШр°г√И\_:╫/r8Ф Щ╠%═Т╩x :ЩSN5┘╢-M╪■∙чuы╓с┴qу╞Н?■■√яЧt_К2МOя№єн№=─G└\ўkWєC`ЪлСх6б╦╓п╠Zў√9НOлR║\d╛X╒>Х╧Q∙C\8Tтh]q4╩Ю={^~∙хX,&щ>2oYЦ<щ╓иdб└щ╤!Къ$я[ї4;;√Й'Ю@№П?■x√Ўэ┴Й%нЧRБ ,л╦яRriEJzЗ╚·?Я═√М`╘ф74jlф╚Сшў▐{я< O VЖ= ╟ ╟▌╟Oр·H█gЎТQIs▀fZrю"┬nВкJ├tЯ└ГФ▓Бф▓▓Ь/╝Ё┬Л/╛шkў}╡t2▒KVъ┘ц{HлцЩро╬√¤ўu[│6o█╝s╟ЎыZ╡>╜╞Йй╛}OB▒┐П╓'ёL∙╦!Йз╠*ДЬ;v┤h╤Я>▌O╓p'?тєu_Hоs_юVп^}щеЧ"Ё┤i╙ъ╫пOЎ_УёЧDК,▌юк╚▀Н"ы3RЁ √╖аЯy╜b┼ ░Y│f}ЇQQGAAAAAAAс(у°г√╚1▓Є├?|■∙ч>н?∙фУA░Ип й)))н[╖ОD" Ф╥ШМє╘SOэ╪▒уЄх╦ Д°е█▄9чЬs■╕Ё■jI╚╚╕>2▌Ч┬├р┴ГС╛▐zынk╓м∙ё╟СЯ╢m█тs╥дIжЗ╗я╛╗VнZЬи▌_╡j uЕ╓9ё─g,Cгр╛Фйj╫о▌╜{ўэ█╖гA╤;eg*Y▓$ъэДN8T▐ ~l▄╕9AХ}Є№є╧G6╞Му@)ю╣ч╣Xф╙¤є╬;U!╫Е╚ ▄ОdЕу╟▌'▐й║#GО∙C┴`м ф ьJ▓є╫_=''чХW^ё╡│э█╖ °уП┐·ълло║╩з√`ч]║t9╥Z├уHю╣чЮєНydiС╓W\!eМ╦/┐|єц═Л-B`da~·щ'd╡ущзЯоRе╩X9▐з╬kw)ЙRЄєКХ╗гK╫o┌║eєYНU╩╚иW╣rї╥еMЧSН┘╠еЖiyд▀3╙'║┤ ╟wЧЫTИ ЪNхf¤╨Д?^╠н[╖Вю√┌¤ф╫]w▌Ч_~YжLЩ-Z@ТAгfddа╘╙зOGx╣╩q╙M7=√ь│Рm№№ЇълпNШ0бЫ┤8в┬│h╗∙єчKН■┘gЯНф╨Ъ7oЮЫЫ+;V∙ЄхqS· №▌ю▌w▀EOя▄╣3ю@1bЄ|█m╖╔}шe╞Ц.]z╔%Ч@№ ▐ЫвуЭw▐)%@─p┴LЭ:U╥zтmt2d╚°ёуЯyцЩ╦.╗L┌>)┐ВВВВВВ┬1┴ёGў)°Sffцф╔УЧ/_■щзЯВMВS6k╓ьН7▐4h'╪hV,#Я={ЎYgЭuхХWтf╦Ц-│▓▓FП ц юxї╒WГvЯv┌iGZk╥}▀Ц¤УO>┴}╨J╚╚╔gЬ1sц╠№╒qю╣ч╢j╒j╩Ф)╚с:'Z▄bЗцF#MЬР╡''кQжЛ5ощФQ╫ Zю╒]|n├·┬кG╨}FЙqШ┼,Bўeн╩╔(ЄE]┤b┼К{я╜ў┴DЁi0у.]║а╚e╩Ф┴Г ,н┐рВ ф.[И k╓мi╤вZp╞М`╔▓г *█╢AйQЩ╜zї║ю║ыў╤╔·ўяП^Ў └ ╬├!═x}k─И Р.Д=╔╦!"кN8ю╤г:└aЮ┴, Л╠а├аGсв>╤Й!.Вш√ЫFдM.PL┤x╖n▌Lэ╙UPPPPPP8Ж8■ш>(cZZЪdiH`┘▓e`╒KЦ,╫Ь)hС├ЁП)[╓ў║Г╟-ХEЛ!┌n╕Av3Ъt╓2BgЖРs√э╖┐Є╩+╟jУ▒ВВВВВВВ9~щ╛┤УF░мм,ю/┐№dtх╩Х И═Ъ5є#│f═zщеЧ"СВЭs╬9_¤ї5╫\╙аAГС#G6l╪░ИgЮd╧ёE|∙√ZmЩ.т|ё┼╗uы╓┐▀╔П▄Р yc┬Д №q╗vэЁ╙cП=╬ ╥ Є╦/╧s иQг└_╧>√l─|0■ Ж╔Ес╜ц·├т▀╢в╩6м╦-(8┐qг*е╦V/[╛RЙi #}tjФ┼ЭїУдн╣ёOН$√ |ЇЄ╦/я╪▒гфФH4wЎь┘П=ЎЄ╓╜{ўxаf═ЪO?¤4▓iф┘gЯE╨¤AГ╜Ё┬ ╖▀~{щ╥еУS▀пa─1║\ус╘▌4┤B╤d■╥│╖n┘Щ╜sўО╞ 4мUзjй2хSRmуrРОє╤Z`ЁRc в MvЛ▓╚0╩Ц-√╦/┐аш=(]Ы6m▓e╦Ц°|ю╣ч@sГ┴ Д╨}Aз└з}█P╨╟K/╜TЪХ#X▀╛}я╗я>_K=|°pЁHДD╥_Кп╞NNшхЧ_E°o╝qЇш╤~IB█m╖AваI'Є╩Ядv┤°бЗ║ь▓╦╛¤Ў['Dbp╛7▐x_yфЁE╚Дь!ў░ТГ(ЫЩ╨ю]°╔GrМЪCЙ├ЕбОE╔O+Wо▐№√Ю▄▄=[▓;^quуЪ╒kяэб ╦╡qу╞3╧~ З├SжLiFю┴2Г┴`гFН:tшbНпТУuщ╥Ф]Ц<ьып┐~ь▒╟Ц.] Ўy░°?∙фУAГсм¤ё╟ўSФё╡╫^Х/╢▓P╘о]╗╢i╙Д■З~ЫK√GrР4╞О+m·Сл єxD╢~¤·╙√J|mK|юэ╧ХGnE Y▓n═ъ┼╦ZЭ█┤z┼▓ЛюXjЇwэ┌I Я┼фКs┤:Txя▐╜ч╠Щ╛{тЙ'т╩√Ї╙OCT;З╘TйR%` ╛xф∙чЯЗ№рMббЫ5kЖR╧Ш1C7&y╝ЬЦ/_Anю▄╣иpш *[╜8Є┐f═Ъ'Юx¤U.\s═5шеo╜їЦжqу╞ш╛ +V┤h╤e▌Wк}ЕcЛуПю#╟а√рЇR7/Uу╥а\ЪRHЭk▓С ~Z┤h()xx[╗vэЁk▒ ,┘l▌W║√эфр цd-▓┤ў]╡Ё$Фnт)ї @я+ыТТ°╣YЙ3r=З№`╞qЙ╪ЫK9╤▓J╜ў0р[╝м■еВ_ъ╚}s|Т╪╔*├рBnКЁїыrХ└п╖Э;w╛¤Ў█гGПю╪▒cП=╩Х+ч╟,w @Z°Є╦/!rtы╓---э╪ъ┼¤хob& ╥уЯМ_╖o▀■ю╗яО5ъЩgЮ╣э╢█HbйA1~ЕcВуТю#aщ\┼зbRs,5йЄ(╨п1c╞М7Nц~├Ж `№х╦Ч?чЬsN9хФчЮ{ю`С√Nцg2!_}рГ╔I}▀5$┴ }GНrбЄАm█╚│╠jё%Н;╘ўi╛╝ф┬k╛4┬╝зицz>wОlєщAрпc№A┐h╛Й╝/∙т IШ╦у&J*ЛяєcщOIюыЭ:uj├Ж -╦ъ╒лД1╘╔Ю={f╬ЬY▓d╔є╬;пVнZ ═╥'╧▒Вяu╟'·╔╝▀З▀7/^▄▓eK╚0│g╧FЎ═З▌WPPPPPP8&8■ш>ё<єГA╔2%СJжу2mзя▌╗╖дб╔.YЪ5k6}·ЇГ╤/▀пK▓·╓╫╓ 1ЦТI│псъwF"ФщДЫОKE0FЙ╔йk}Їы┌√4\НВ╪т╠\─!мz(gЮz_x╒Їl·┼┐Ь;р·У▄w=ЇЛ~Уo·M+ъНh╢X|р&уФ╗▄╨tцвмQ#аyЩЕ.(╠Я9kЖы╕-╧┐░Dj·▐Xдхе-№▓╨Acr"4╩D╒п_┌┤iХ*UЄ7iЁ─сGЩ@√йУт:g╝р▐т║5zо[╖nНO▀Р▓▌WPPPPPP8&8■ш╛4З├№рЮ%¤Z╕pсВ №0╛ХN┼Кп╝Є╩гнmEх8д└qga█%u@╥╒aФ%д^5 ЖпQ╫sШ/ЬqzЗc9▐q╕ j-▒W╠иЙТ*V!X! JX╨╥РЗ▒╡@=Л&╞ЁD!e▀LЪ▓w╦оВРБbЦМЄъB!Ї╣╦/┐Яd =╕ fєШГ-)(((((((№╥¤dхt%4IR╖mmkВГ╖З┘KIоЧУ╥ЬШмh@ жС(%aBR81╝L'6!Б?▌g<вЛ▓Е▒▒]уQB╩pv─я╠│I┬з╝p ╧з bL9вз─ИeК│B6чЖhй┼Ч'█╥rех┬_JR<  №╥}Т░99Ё╫ф-│ЗиШ┐иЫ;▒┼м¤√Ьэыtn╗zHу{D8nжя}тZs╙зYFхк─t_#оз√ FТыC╕ eJMBMK-sв9льУШTмcEC┴ЩЛА║бщсО╢ЭЯN п╧Оv─d)и(Ftc┐н╥h8ЇУ.]║Ф+W╬4═#їзy╘рo█¤╫цPAAAAAAс?Е A║Ям. ┘ф░кчoД╨ю╗╠д.╤r▓f╔Пv╛╦Г║Nгж-ГИ\q╧ДН║╒вю╜u╬lhД W╕ф╞№фhє$NL╪ЯZ№#Д┼ ЦpM╖HAА ▐░ъ╗╜;bб@D╪ЄaрГ╞e─Ї| L╙]ТQX8╛█├╓веМ╪Ц)─Tу√Y┼ ' ·▀|єM├Ж  р4bЕd№╥¤)ДO╞u№лoгфЭ K~ 1╨}╨wGs4╧┼╛ЁкI(о9c▌йтЁЮ╒Nml┴УAР9╒ш╤*▒\С╫╔ЦQЗ6б┌}га√Dsш^Г╝╜iх+/jЪ╡A!tЧ\|[╙,НХ┌У;¤ю╟мyЛ ▒mГыORI}║ э╖▀Ю|Є╔┼Lжааааааааp ▌?j ъm╩Їmycуo▀╙(ш>h▒н╗Ъgаo Э7┼╕}nАЦw╚S╒42&wЩp╡пQW'┌╤Pя√^Ёt:yИ:ў╬│4╚-LwщNЭ╛│e┘ЬX!гz*sl]ЛтBl┼д&г╕╢Й[*7g╞▌П┘?/╢0$ъ╬▌WPPPPPPP°╦Pt (┴█ЦъjДjО╢▌ пo\4ЗFД\НQ╟р─tI└fЫWн█╛v}НЪ╡R╘+╔ї'j╘?9`j─aКт┌1П▌Gыв┘l[X╔Г┌┤i#╜╚║Ьq─)о╬i6╒·o═№)Z@sЭн╙ч8й┴║чЭeзЕ#Р\DуQ╧?йУЮЧ3г√#╓O┐QсЭT 3=F\Nўї'Eў■■ш╛┐Х╙╧_▓P─Ф▀▀н+П┐-VfЁПRЄ╜я'√▌O>F╩┐Y─З╠БЫ╕╖ЙУj\gtЗоў┘░ф{a\K│ ╙ин╙'хrЄ┐D╓°/+▄╥■М╗n ╠чNиR└tД<└Еb_8╡╦ЇА│оТ3/sтС+├°╡82╥╩Х+[╢l╣qуFY┤2e╩LЭ:їМ3╬ЁKwаў¤xZTQG^сS▀═щ[Ы2┐ck═Ўy╖ЎH-]·к╖Я╧йZ6bmM╕<р╥иnзцэЩ}чгa╠├5жбРО╪╥LКDош╛ВВВВВВВ┬Ст°ж√■сY╔l█▄gЎ╛%:B:О#O>Є$?(3Э,6°╧╩√2Аяў▌ПЗ&СE№Є╕%щ g_еИ=к╘╛j°v-Ї╬я+~аЕха√Цоэ ы)О№i┴▓ўGэ╔▐UуоN╒.┐D╫°█ХOйгщ1ЭЗ\ЧЙ|j$СЯdN`u∙Ч-!ПЄ%Iв╚╖ўЦ-[zўю╜uыVЮ1cЖiЪр┘Н7Ўm{№tIB└HИу╪б\Пj┌ЫЫV~iчvDV╜╨'oс╥У╕╣Ї5нвБ K7╥,'╒!╣жЫЪЧ√├Пх ▓<▀█йлС"g(║паааааааЁзp|╙¤dBO<▓bК ╔щхпТВ╦├b}jЮ╠ЖУ╣п|─╫ю√j{ ┬ПSJ~BExp▓lРИZЕ╦ Чrw; ╛Эа√й.Нj╘2їR∙С%}·m7бQчО'wэ┤5L3H▀JНыщFTw├ОH9b ┴&Щm╦<°M%}Aт┬╢m)█$╦0З▐nыAV┌ц═Ы[╢l╣}√vIў¤vХ▓Нм $cщУ3О┤-▌хо╙Ї7▓ЦNх∙eY(ЇуВ {░'й^к┼;п▒JUєf╚qAў tEў■)▀t▒|Ў┘g>╫ФЪї6m┌Ьzъй27?№Ё├Ф)SВ┴рiзЭVгF ЦL▒IУ&-Z┤!ЦВ─ў▀ПЁ╕Гё╡AГ7▄pГпд №є╧Ч.]ъ[° ф|╥дI2nvш╨бVнZ2ЁД -Z┤пЬpЗЯ╤Ї┤+[_║ ╬·ХТю\nЫЖю▓Z9╤Я·Ў_5yBе;;Яrg╖┬╦h╝w╔УцО╜q╫ж░═сШG╗бэї+Wо\╝x▒┐^╤║uыЯ■9''╟oк█n╗нJХ*#FМ@▌╩Мс│UлVчЬsО/╞№q{√kh┐ц═Ыя▄╣╙з√иdЩ╩╕qуЦ-[VбB─М6F7JKKCu}=uъ╢мНvШъ$p}З[╟i∙3Ц^└Э%Щ?>╨3X"эЖ>пцVп║=┼ДФjЛ*║паааааааЁOс°г√И7 !эY│f=№Ё├2R╟ ·О_┴╤_zщело║ й╛ї╓[╧<є nVмX▒rх╩єч╧ЧБы╓н;tш╨│╬:KжВOРуП?■x╙жM+Vм ыфчь│╧ю▌╗ў)зЬВпа╤c╟ОЕД 5ы={ЎD┤ў▀┐LBDЕЛ/╛Д°Н7▐x ¤ў7o▐,$ bTоUi`┐~з_qНп▌7qCБФИ╜q╪╕мП?-yf╜j]n 48▌▓XГї ╫║ Є╦ч/¤%фpЛ╟q╟~2R▓!┼D█┐ ╚l)))У'On┌┤щ╒W_¤╒W_╔Е╘L▀╛}я╛√nIФsЛ3╩╕uыVФh╟ОТюKu╛\+│G╙жзз╫лW/33╡Нvi╘и╤кХ+ ss-Эh╘h╪фВПv▌~Z]╙6ї╜╗є&M[8hD╣3N;╜ч¤9JqНж2▌тОв√  О?║/й^8▐░a├вEЛРЖeY╥0Ш4i╥Ёс├Aя╝єNФ q> №єc╞М┴SMЪ4yшбЗ@╓Сo▄╔╩╩>уМ3dДР └╤/┐№ЄNЭ:ё─╔╗єц═ы╙з╧╘йS/╝ЁB√хЧ_Ю}Ў┘i╙ж╡k╫ю┌kпн_┐~0\╛|∙╫_=pр└:АyзеесY╨▀uы╓эg%╧╔Ф/з 5╕ [}п┐ў!Яюыs┬┴Т╓┬ч▐╠■b┬)tиzg╟▌<├фzШ╛^осОЯчm▐╗їїЮO-]│ЎЩчЮы┌х╘)$НЩ3gvь╪ё║ыоГxГ|т╬ю▌╗{їъIжY│fhня┐ UМ№ °уП╖▄r r^гF ▀Ўцp:╟Бt?∙W$z√э╖п\╣▓Z╡jO>∙$в}сЕР╖М%Ю{Є╔Мкх_z■╒uы7Э7шuыт│ +4▄╨ВEУяюI2J┤╘╟кY╥KЪИ0[╤}Е╟▌ЧЦшщщщТL╧Я?┐_┐~╥Ш╝▒БФуNП=ф■╜ў▐{°сЗ/║ш"РQ0~I_¤u0у╤гGГ╕у╬G}Їълп╓лWяйзЮ:¤Ї╙e╠Иm√Ўэў▀?h4H3▄Я;wюs╧=З√`╧W^y%Є3g╬\#Ё░a├C▓╧Ь#F@6HTY╡l╒┬e┐╛√╬[╫v└▀кk║$f╥╥Qg┴╙odOЬTўСО'tэ@▄ЄAW3∙oVl|вfD5ч╟)Sx№ё2х╩ўy¤ ∙ЗЄ°уПЯt╥I▓=P┐(Q├Ж QР:uъ╚"аьп╜Ўd5k╓$ЙeР?MўУ7р╡║i╙&T,ДЯьььЦ-[ю▄╣є┘gЮ╣нcGТh▌Є╩╣┐,╝`ЁС ╧Hу%═ ,]№энiеJ6·fмbЕ74NгSt_AAAAAAAс┬qIўCб╚¤╝yєЁ<Я>}:▓"Э─K3·■¤√▀u╫]╥╚■Н7▐xтЙ':uъД└#7ШЎэ█ў╔'Я╦o▀╛╜4╦┴ЭзЯ~─▌▀Х╦<╝Ї╥K/╛°т°ёуп╕т йЄфСG▐|є═чЯсСтР!C║wя▒aф╚С╛ПЪAГ-Z┤hЎь┘лWпО╫ !:1Ш┴▐}зя╡w▀яkўCМR^╓! Ю|}ыWУк=|Kї;:вхBlющ[▒Q=#бNКы~5}┌cП?Q▒|Еїы╫7k╓ь▒╟нўщ{NN╚7~·цЫoдС2∙╬;яАО>╝CЗ■eя┴!Q,▌Ч[БхЦд╔ч╗я╛+[╢ьЖ @ў╤-f╬ЬyR▌║{▌┬Л╬╗xсТх~ЁFд┘i,=ЯЖV/Я╙∙AЪСq╔ЗoЦ/ЯоЗ #∙Ъ╥ю+(((((((№S8■ш>~▌_░`┴3╧<3c╞ p╨█o┐ЙГA░∙Y│f!%Iўe°~¤·=Ї╨Cw▄q╟| ]╓рє╡╫^ы╒лш■M7▌Д┴р▀~√mp¤зЮz╩з√╥ы╬s╧=ў╩+пМ;╢m█╢r+H<юа╓ Eддд@@y^xсЕ-ZH осЇў·ып? №єj╩КYsf╬∙ь╦╧╛√vЫ;яэ┐aU┬'s┬f(зp∙Ляо ц╦rП▐rj√Ы^ЪБ █√ц Ныjжe░@,6`Ёр╛o╜▌║╒e? №3* B╚╣чЮ+щ>╥EnGНїълпЮs╬9°йf═ЪРOжNЭzын╖B0и_┐~rХ·НHТ+O╣Bт{Х?Бш7o▐<;;{┌┤iзЮzкяАH├O╗wя╞O тТюг* }5м_w,я╩VW¤4o┴ЕC·ZЯЭbЗ h─YЩ∙kЧЮБ╘╥->x-┐r9=grqе▌WPPPPPPP°зp№╤}мtш╨бў▌w_гFНzўю ^+╙▐▓eKЧ.]└>(╡√И╠╛g╧ЮТю√Ос┴╫┴ьGП}є═7#▄7Тi╙ж═╫_}э╡╫>¤Ї╙╚б\%Ш=k╓л╜_Ыё├╖¤▐ъs}ПЗТqrK#щ6Я√LЯЭ_Mо └нН:▐╝ХзвР%ї╪х╘3ynЇєa├Ю}∙ХЧ^·─у=WнZЕ▄B╥А|r┴° Й№ГpgffВp/\╕╠Е^ЩдVнZ ∙ИРи·═Ы7Г7гА ╫=Hby─wTКЎУ┌})Y%764k╓,77wЄф╔Х+W╬╩╩║Ї╥K╤иВС╫нЫы┤╝╕ї╝∙Л$▌XA╙t┤∙ ┐╜╖/Щ╤┤▀ЛсZ5mНqЧА╫+║паааааааЁсxе√├Ж ╗ў▐{O:щдыо╗╬gирпгFНТN'┴цЫ4i2g╬Ь_|ё╘SO┼FБ╫мYsў▌w╧Ъ5ыълпю╒л~B^_xсph<Вgе╤?>С╖▒c╟NЩ2D╓▓,Xfр╗я╛{■∙чСgd8;;B┬UW]хЧt ╕m█╢uы╓Х{ИСC╨¤9│┐ч┐цк╓O╜7x\4W╥¤0чcajl■fЎ·┴г╠p░■▌═жч╣Ъ^В┼^/╫ЁзQгWn]3~╪Иї[╖╢┐щцзЮxr┘▓e╚-DqdЕFСH╒Єълп"╖3g╬▄╕qу╕qуЁлoЫф│d┤╩eЧ]╢xёb4*д#D"}Ш╩╒4эА╨fxЯРмєm╖▌V▓dI╚ (&─4╙чЯ■╚#Пр┴=z▄s╧=╗wяЖ░Б┌шzG╫Ю=(Ыv╔Eнц/°M╥}├ РьmЫ▐▒y╓Uo╣к╩═╫Ъй%\pzMw8Wt_AAAAAAAс┬ёGўСуp8 к Т=}·t╨M └м╩Х+╫мY\_√ЇщєЁ├ГГЧ╦Ь▌t╙M}Ї▓*▄║uk╔ З ╥╣sg\є═7╕ ╦/┐р╙╫m╫йSчЖn╙н]╗vrЁR▒Flw▌uW┐~¤ТЛ=zЇшW^yeїъ╒▓╥]цЕ\╘C│~Ю╘Ї▒▀ 4зdX╥}Г╣жn0╞╙c▒╠ч▐■¤│)╒яыTч■о∙\+Mь^с┌ў]~∙ВхєїB█╤Сa>■Лё ёЯ|ЄЙКэШ1c┌╡k'ўГЧГs╧Ы7╫Р7РIHDЄ░-Тфs╟О ╨иIt▀?; yЖЬpЎ┘g# I:┤KZ√рвЪ8qbєц═A·╟ПП╥╒лWСрW$-Z3=}╓┤щU╘╛т╥+}c═╓∙теs╗=iЦ╢ЎZдvMнЄ╥го╥ю+(((((((№c8■ш╛$ж╚═O?¤тЫ\p¤Ж NЫ6 щБь6m┌ь╨ў= +╧╠BBя╜ўnВwь╪ў¤H└їС]y╠9э┤╙@jхй║~╔zС╩Ф)SР▀6m┌$Я╬Лауsч╬Х·ry└eнZХH╔°t┬Шp└╝юЮ╟╗Еён║р╗ЦckZj@[№─ы;╞L>╡╟нХ╗w╠1═ТФї.YЎ╨Wm]Уf╣├йvkз╬ЩЩЩ .Ф[ ,╦ТцFrЙ|¤·ї)))w▐ygН5H┬"╪│gO ■¤sssV∙Рpj╒к5b─]ие*Uк▄}ў▌╚╧аAГ▓││╙╙╥я║э╢Ї*хЖ ·p╒ць╜н╬∙╜nхАее═╧Ь╓нз]9н╔╚7i╣Ji1И.╫и╥ю+(((((((№s8■ш╛Ї╠УlЙю▀ўЇўТ·╣ў╣,Iт╛■■╘"С°ї=э$'ф╟УU▓йМ▄№*їт$a /~p 7НЁm▄ьЧ╪кFTП╪о╨vNЪ╢╢ И╘╩ХNьqk╕╤I)ФxЮy ╦ !╠X╨}ю2)B°Uфя╡┼g,Ы8qbп^╜└Й_{э5РrДЇ-R Та°▓Ш▓2╢bk^BК■i─╔ё°R╞mЭqжE(}{єк╔nnJ>█0Ё├Mу┐.▌╛┼ ╖╖+СR!фшQ╙Bо┤√  О?║Пx├с0ш╛42I╛я}Ю8'╦w┼#9╖╧J%╤╟OТЧ'WЗ/*╚РE∙▓╘н7Яzgчp@л╥)u #к1LTИ╞╝▓РДЩ о┴╝'MЪЙDpБ{ўю╜qу╞G}┤°вЛ.к\╣▓oьФЬC╫▓╧яe1e┤Eк%~T~0_╝Й╫б─ulГPnD)y}├▓ЩA█^╣eюmwЩ%╥.·аў▐*eDR9б┴XА)║паааааааЁт°г√╚q╨C>*Ig▓>Ю'╣ЩЧў¤Mл~VдuКIrщр▓И%O▓$@Y*╝УsтЛ╔jт?Пm╙а√? ║OR│G6I╠2ВЎЪ╔S з╬=б┼┼хпj2Ї╫+6мoЦц' ╓8у~╣d╞vю▄┘мY│Х+W╩м&K8'Nl┘▓eС}║2З╔╥Иo╕OыоiуdЩ'Y─К7?у┬ы╫вЪ■F╓▓жE~▀╣╛▀@^6╡·=эh╔ еЄBЦF B1Гiч{sчt}┤`Юа√ш>JJXrЄКю+(((((((№9t?!сp8|0J·я#▄%╢ В╧М ┌o├▓Eм0вщРии8Pf┬)╫╫9╙№АQ┼в╧Vй▀ `Rj;─╒Йжs]Ь╓Х(┤Ф+"С╚Ш1cvя▐э▀ФJz!m█╢ХЎ<┼ZЁ @2!HП [║Н╥6мЬщFў═▓╤И°UG╓*(╧╙МАм╕e√Ї{*X°[╨▓ №0]#nQ║П╧▓e╦NЯ>╜~¤·rы░"¤ ЗДв√G а√qB.ИмЮmЄП╓ffця╢4=кq+PL)(╙j┼Ї{ыЭR=hъ║ДЫиUРePсDЁ"жJёДЪ{йtЧ╘?yO┬? ю¤iтфГь t№ЪеєЄrwЖ о█┼╙╓╙lн№▐╝С=Ьє[f└х.[(▀g╠у/Ха{╠Ш1CjўПп╓WPPPPPPP8VPt (ь5FxИБ║╙BГмМхэbО╨╫SтW.├хН┬й)B╤НкеоS╨}▒РМX╛ўL▀рЗ▄>чяGb_ГK▌|вeEЄv╗<К╠ш┼t2ГiAF┬О╜e┼RТ│'ш╩M&╠Ц\?"тuS╙4QЦ│╧>;==▌▀wq4Кгаааааааp5Л█й+~r%▌ч ║/═{Фn_AAAAAAAся└Яг√Л/~ї╒W╖m█f█vЄI╡■∙нрў╥1 юь▄╣│AГа√■╤л I║паааааааааp╘ё'ш>∙хЧ_╞М╩ЭЫЫ К╛g╧|ю▐╜Я╕Г√фi│)))аїчЭw^╗vэдяDEўО■Ьvя▐╜;vьK╤/]║Їо]╗ЁЩУУ#пAёeД╥[zff&Ш¤╡╫^лш╛ВВВВВВВВВ┬Q┼Яг√ЦeБюзеесq├0ЁЯ╕б╖m[^#$╛n▐╝yЇш╤╦Ц-?~╝ы║°I╤}ЕгД?╜UФ,=''7}?<╔№ш>И■√я┐НF'LШрPt_AAAAAAAAAсhр╧╤¤X,▓nЪ&X╗|69IЇ3╗t─ЙЁ їSuО>■"▌╧╠╠ФК|▓?уWЧl|█╢mКю+(((((((((№-┌}~°dэ■gЯ}жш╛ВВВВВВВВВ┬1└Я;U7Ню▌╗м{ёт┼YYY ░,╦u]PtД┴EЛ-о╝ЄJ\фффАю#╝в√ GСюK╓>c╞ 0~╟q"<хФS}Ї╤кUлтz█╢m_|ёЕв√ ╟Сю/Y▓─▓,|Э:uъ╨бCqQо\9p¤3╧<Бu]╧╩╩Ъ0aВв√ ╟Сюgff:Оf╛g╧Юп┐■·лп╛║щжЫЪ7oо{@ф╗vэ7nЬв√ ╟▌Ш╟Г;KЧ.=э┤╙p\▀u]щЩGє((((((((((№НtQГ┴X,F<╧<Кю+(((((((((c№Нt_╞&Эєр·pщ■║▀╫gФH/,(X╗nmйТел╫иБ0Д╣ЪоЫ)< CсЄЬ─Ў╜+Ю╕И▀уEяФ{Чм~(I·)СPёС<9{╔╫\ф_с/Б╞█╬пI■ЭAU°r)Є■qЗ∙З╛╚#?┬1═ЛЗ·#д▀╔i╥┐ЬtМ+6╞вYК╟qдKz·°Й╚Ь'g/yР?Т┴Ў╚@Ю▒тъК╙─|└уП╦|Г═┘~ПРв▀xвGyс°╛йФлq√;╞IN┌UфmЮh}ЩЪЬCBRдDihR(5е*(─┴/(╚ t?ooЮp─∙█b? gЙ├╢ичw▀e╔t№ Н╫4▌YТщ■p║j¤╞R%╥Ь╝=┐пYУV║|╒Zu╣╙ЭВ@@sяjЄ[ С"%%╒КфРPН0Н╕°дтн╓9╤ШўЬ~╪╡Бtмтж=эрСЁ°Ё╬e0o|╘cG0wr/├ёЙA█7Ih.!Ўaч\бp@'ЁжD╟√.;Г╧x|╓СmЕ▐вY╟0╖ ╟xї╕@╝■"&╞жу?З)ЦK╙д╧в`^°Mф║OВT 5√╙ЬГдИсу(╩c0╤╟9eо7ZzАў)╘&├Э├-&╤jJ:&▀╘Ъx╗D0N╝ШМКз4юU8ўI?MTг+Й2зЖ╚!cёЬЛ4>╥К╝;b -@fqYw)╢оLп°╚s╠+zО7IЩG2i╣YL Ф]a▓0п┐poЇ╙|a─№Шд°иG7AўI№5@П ╣#■■"╕!■╝-s.rчzoAb─Оў┘пй╗┐еЛ╚еvР╩QЭ╙b▐jЛNеаЁ▀Г┤ЕсЬцрєПkЪ зh║╠]╫НE#Ы7m╬╩┌РЭ╜╜╪Ш┴╔хu$R°э╖▀Fг1Aўй!▐KJєўюY╢|∙ю╜╣├ЖПдл▀T║DКЭ┐gї║u)е*Tк]!4з▓AёtЯ│p84 z└@М;zТ┬И¤ЩQЎЮРл rhёxz\uрI$┌╛ Q№ЫЬg■OM $йYBGW╤°<р]$D6Wщ~■├Р╝└я╠@ОT╖_l:X$ыmЙ■)9K|XH%|.єz■─}Ю sT╥=├┐╗ ┼┴W0ЛoMР8ЎrЗR╗╕▄,^╫С╡╚L*ЮsйТї4.r∙АЄ}Т╨?=HA╙%═GL ,ЬJЪi╙C)╙■RцК╔бм┤╡╬у]ЕQююЫ░Т╫ ┬,╛ОяT╓<&▓Г,░ х:?pюN╬9Йw~╣,K╜■Я\║* ╣╛ўщh─яЗ╔л- Ш╨еаЁяўД{^Й°ь№`╨ = ъ╥JЗёлW╜ўю{Y│╗9гБ╘Їб4г┘█▓лUп6ёЛёA^▐h~▐тE Є <э■яы6Ц,С-╠]▒юw╜Ї %к╫qt▒ @щ>║_$z╙д║цйmУnъТ▒iёйQ(ў╣щ■tэЯъCРT─є8w╘╝Б▌M▄?ви}-Ш┐Шy э■7рщ-╜юШШф}ЦШ'└[СсТё╗j+╚Єv=╣Р' n▒ц|ЯФ╛ эГ╥¤# ьieeўМ ▀о!>JpI{ў╔Fв┼-9ЛзхЙ Й╥╤DС}Е╩нa°F ВШаfGRLMhЬдВГ&╖ё\IйЬ╞9Ьx-▌oЬЇ3└■@т9║РjsЗ╞U▀'A.мaм#ЬОR:Ёn\ЧСа╚╠SkSъ┼─K*?№ЩФ'д\Ю(B1q MS▒Сhq∙Д'Єя ▄▒ш╖RNeЙQ╜И|╚7EAс┐*%xJв╓!my─А0=╒FF~Y░d╪░aОуzq+rIт?у,`NnprП╗o╖О8xы ў■╛<3Ц╖gф░i╓┌Н%R "╣Щы7╪еNp╦V═▒Р3Whъiё╗u}¤─╛;Р\═╒X╠`О╞ёдщтОXZuК╫PПГд╚ТЇ√U K >▐Ёъ╚6g.╩x╪─╤к┤й`їsЯИ∙ ┼W8Lш ╥Я+■Чэ├5oт┼З+j┘у ш╧:wёЗп. ы,+^▒u╫╓┼"РАГ1D│ ╖x^┬■@╔XGд▌зЮ∙ Cч┼шЩёP╧PЭЦ%:н╚А'Ы ¤╓<Р╟°tЯiМyФг ·╜нQ[╟╡а┌qГGя?▓#▓╕г╗4о}╟?и< ╣5]7ф3NмШ&C▐─╗щh║WЭ║gSЕ█Iм5ар° ╓ф\У╞M4OR@┴-VЄ·{@у+√gЯК|?ш\╪К╪Z0цН &sB╠┬MЫЖ:8RЁт6аЫш<. УVo╔╩єkakШX╝пbёA№ ¤Bs▀r ╗^▀├ўT'vрф╔R№#╦6)▐М▐`Ну╜B$─uф9/4┌[Ў[яSИ▒ЄM`▐мэ╞нЁDдk╕дшЫ┬]╞MN▀▓WAсТу√.tпа╛ДKс=╡╜Ш{∙а'*x&ДnАVЩС▄В═k*Ж4ЪЯ√╤╨!t├┌M%Rєг9┐m╚КЦоЬЧ^euЎ^вщqC├├Г╝ЬАn╥ПИй└Е`╨ШЙ+F]╣GУЛощОы╚▌─Ed╬╕nhNёFЩЮ]пL(ё >1╫RL╖FPПKЪ╠╞рВЩщЁ% ┐#ЛY╙р"jЮ╨╣░bЗrЕ├З!&:M╠МЩш╝РPЕїАэА▄ko∙|┴5╕Н^ъ╨bДWЕ t╫$▀pmbsa√@ ╨Йik°КWмy┐QR ╕xC¤√╘│t4M╙▒▌+Жщ╛└╢m├4х╡p;&нФ9.В1─"ЖW*O*ёЇЩ╠ЭWЇF░═▒L╧Р=ЖоjД,цY8рмЫ█ИТКьapєlСф░╞Qb┬╚y╒йGд0rcL╡╜╜MxДz▄)очЕАq┘╚║fW╣╗┐(╙ё*ВР∙&DЮk5╟qЇ¤мЙт3 ╩о!*Hdь^PLL D ги0З9Л╣a:nЬюы┬КЫ╣║╖p+МP╣oХ╟ ║yИQШ╟Ы)╔╛▄kК╞╡▄X▒єd'Гъ╢├E├!╦▄┬P╔И╔tpф@7ЭJtQQСи&fИ]rHQП Э0╕╢0Mn[uП)_╪щСI!Рa╓ КO[,┐kЖCLUм╗"N┘├ЭЬЧ хбk╩ЧАx█M╙░m╟0─;гЙE6═]В┬мWМ╪}Ч╣жn:шзTЧтЮl#Eур¤[m█┬Лfуu1Cф╤гтo П╦*  <ЁЮ:6▀╜iыo?^qVг@$ уaГщяk│32B∙СЬ▀▓╓ ║ЯVemvзAOЗp°ъm╝№A7Vф▒А╪╒eDЩ╞)X0╕оГ╦04╦r┬с@,цxсуСc&╞pГ╣6f┼0`∙>┴у B╩г┼┬v^└)┤h╚6Scт1a[┌¤#SLцРhБъF цЩ├█T'7'й}E ├lн;BїЎ├h┤0═ct╡ 1mдФ.╥L╘│.XЗ╦╘r╩xнM├р▒Hь╨c▌╠│ ДL!2A[ iИЗ#xФkЖв╗ SHщУ ў╜I #P№fHfcxZ\x║М'R`░,;%%ЙD5Csф>'╫7ЕG +Яf├ :fк#Ў(сf║╧╝┴M╨>┐4ВїCrAЙ╠@╠Ў·ABїb{Г╜ AАRlбШ7=Єчx{^ H/жЩЪSРж╗и1б°б&2╠Ж╪Pв>Ыc▐6оф%`╟ДуныroаГ4jц╠J1Н┼8╒гT│t╙ Дз`uи(╬L╙y╘FМ╕йЫЮрij▌ Ыщ4ъSъ└L╤ ■`ю╔\ь~`┼эuC єиЫк╗'Ї3Па>┬╠Й■╛И#Е┴U!ц!СjbZ╟u╜_─Ц уЮы╨E;а5▌▄ыZРP╖u&dС┬0~1 ЎЖ5╫ро#╕8zЕюp╚ЮP ╞kAью¤л┼╤ЕОТЙxSи╫O<ЙE▌шО╚┤╕нE╤╟╕╬,ЗXш▐f╨"Жг╣─╕эЁКwЦX,Ъo'dИB╣╠─╝╠Вй╠№~фЫBЛ_йSPP°█┴0|:6┘ХХ¤█Ь+╬nИцП:Фо]╖=##е ▓sI╓я▒RХ Rлм▌VHуt pБ╫╪╒Щn. nць╧>m▐Ў·╙.jQ`1lШ▄▌╬BбPaaa H▐s└е'М8Жс╠(7бh+М╝н є┐■lсФ/ъ6i▐ъ·Q=$t,kф|аaч┘\/Wл▐НwЎ i%m┬Ауmz:\хВgє┴SitсЬi3>√ 1о╫htj█.▌-#EЖБHГЄ"C╘3|ЄA╜u&дъаb ▒г+g╙║/▐yЫю┘&╫░E╦mоЛ┬ЕР┐uSу┬▄.Хl^¤█'CЖ╒=╗щem█╗B└╢H┌▀═рд&t:╢нs'Щь{+┌ Щ&+Nх╕$=`№6k╩м1C└е█▌є`Й┌Н"FjшH╢A!xА3█КЦXС Юuи╖1╫u╠н░a/Ў╔Р!YK╫^┌оCужMЄ5БНК╒v]:ьсС╜!'╠аw▓W/Д┬QЛ╡яrwЕSЫ]м93╛пЦ┘См║ su!6Rщ0─u0HЛ╠f(╞5╧ТЗh▄ ┌∙▐И¤ЮV╕╦У]ВБrХ:t┐┐D┼j∙6$ЇА╖g╧ ▓шжeЛ>2Pwг║CCdTп{╙▌ъ%*X$Аy▌{S~Р  ;@╜ ▐ы]╢¤6чЄ│▒№зл╫m/ХОь╩╠·=R║Jnz╒╡█":S?└eГўЎтz;Кqц║░┘eвЮZ░g+╖єНp╕m╟[g╠·qы╞▀пю▄щД:з╪zJРr╙Нфl▌8ю├!Сь z0,Сve√v▀|їu╬ю№v]*Wй°/^[╩L╝?╗W/xў╛█▄╝вН ╒я}їн▓╒O▓НT▒TъZшЪЭ╢нYЄ╒Ёў°▐D3*V=▒Yл+┐№|| @┌▐╤]+}Вm5fеыdюў▀}┌є1тьж$vB¤╙юy{ШSв Ч╬┼X{╕t_8ї┤IH│~№bЁ╕╖^ПЫ%kЬ~·}oї╧╙S=Л%;{╙║ICЖЁ=9╠p]з└/╡Е╤I¤ ╬╗ЇЖ[bnZ Р:r[╝▓─┘╝z┼а{╗СЬMрЮч▐▄ї╞╗*дG╣z4╧Ю$фF╫e╬}┐ч¤M/nu╦¤Oя0RЩЩЙ9┬ДI Т║7└%╞I3(#√Д(ъЩv╗Є└фоZъ┘░╦─╗┌М0ОБlY:sЩ5#є ╞jVD,¤ВL Ю}щч┤║║╨%йtсъЖBвbЪЙ╤ BI╚И~ўэф┘├>╠[╡!ю{ўгКз^шшZ я+'qЛєДпте.Д=═│t╒╝ ={zЭщё░√ж?nг ╘ЗKXАъ)b4═╡ЎL№шНїKЧnА[JЇ╓╫]>{ю╠Иl█∙БФR)G ╪▒Є74ПжW№█╜ё╔W╬╕ЄъFeМH1Чж"w{╢|■срЬ╡л7о╠Мфnб+╒пkФкpC╫{+╘k\HMЁ~*tфLьТ#┼М6оnЙPNNЮ╜4╖2ШP╕yє╡╖5 гм╞┬шлЧ5jhюЮ═<иЙeXЫхJ^qы]eк5И ├0-─гйм`═ТEя?Ї)╪#zиХ[кFНю}ЗЧк~ЛaBIG¤Щ╠Єш╥_°TO╦бn2_║Ў╔╛3ДЧк╩taг$$R▒─kККд$оФ=Cф╟┴fz*<╔+╝╬аёbЕ:1╒║▄k1▒╜GЇ'▒Ж┬╜Ч(!NH╔ВyЫ(H|■ї╫╜∙ЪЛО&║├ь"╙{T R╠YРф&6+И} Ъg]%жBnI~o╜ХЁ О╫╔╓IВ xл`в└И╫Ц╗тYт╧їl┤Dх Й5║╧OБ╖EGєф3╤?уЄ^В~р*jz[┴╣Ш╡█ртus╜Zї6∙hёu!╩tЭиYу▐╗){Кt╔е╔ ╫│<ФЫЎy\x╢Й▐Ц&JЇ°&Х°╬ю(╫м─ 'wбИrш╝┤xпф,с)Аz╦Ж4ю▄5╤аTюв M▀=.ў╜9АИq╠╦ЦЗ ЩР═ў,Fт╗ОШь╘Ў4╚ я"-╝f№ы╛E╬гнtY~═є│ХиР╕ t aХъ╫Х▀Ш┬gЙ▄╖УHT░EС[W╚┘■█JуЩ7╒lъ} ║╧t╥ЁкTЖ!qя┬м]╢ЧЮ4▐вчы&╪▐о═[Ч|w┘╣їи╜ч├G╥Хы╖ХIOqЄwgnXЯWжъюU╫dG,,╢╜`Ч)Зf!¤Л┼└°°й √Nо█▒m█3?юїЁ)'6:гє┤Ў╔с|│╫╛ў■мwЯ8╣L7гTЭє[┤╝ц╩ўyР89в╥Ннz╝t╤ї]Y└ИY-Ц.zи╬=;HнЬжЫо#цv╝LгH{~_╜}эЪМъ'ХпY╧%╡<*fИ~иk╠wр╕жй╗Оt├О▓`9иJЧШ╘4\├qї▌Kg╧ЁЁ╬m┌їЕ╞ч]░ └AЬ8ў%ьmObЮ `LН╛▀╘Вц╜D`▓ОюmеЖ░U~ы╝√оц·¤Й╟;1╛;▌ИQ╪├s╫vцB╤╘╘█+2'lтcтэEч╞─B4█6┼■;Aцйa╩}`▓ бTС Т,╠Й)fжаГf!.J╤}4ркP7,Гж┌┬пЭgВй┼ўэyХ&6g╦iЮDEЇр·р ─q▌Аz.╫ ъNAnЎ╠й_|7Ё%L*▌√М4╩╒┤Е9▒#%G]шЬ\1 ╗S4зОi^tГ ЙaTПщ┴BnЖ0W╞ !░1-ВЩBьY7]ИxZL╖ДY─ЇRHDBТу&GПъhR┬┬ ЪтфЕдp▄=Ж╖╩rЇp|╡ЙоЗортї1LХг °*НК})┬0─TЫМ rЙ]ЪX┐╝?Ё█ёc┤╣вU██C%лE╥┬С▀W╛w'+k┌э╞ЇT┬bЪT├╩е║█эЕw*\r╗eЁ|▓a┼╪■¤2Юэю╤M омN├FY6F#Е▌▀yп┌щЧюхi)n4▓q┘'▀^√╦П4o╖`э┴@╡:╡╖l╠ri╩}п оx╥╣▒А╬═\═I▒ї╨▐Х?ь╓▐LOo~√Эiе+╫?╜ЙЦVо╨ббp╪ЙфИ╜cmц╕пm√u╢юF]Мq)е*Uй║i¤·Ф╥хy{H╕fгFCFВВ▄ЬЬ5Щ╦ЬUєзy╜R├3oэўйU▓\┬$▐01RЎ)аl─ф╘ZЁщ█У·Ўк╤иi╙Ўўhе╥ыЮuо├╥CоэС л{р~=;╦5,ё╚6Дa╡A╩Ьscч╦┌▐ыЁТОЙW#жy;╗ Ўцn■u╞КпF¤:gNУЎw^╫╜g~░Ф-╘+┬Ёу ╜[░=ЗТ4тФ'╘о░m╟мtЯПKUп╘ч▐Ў╣╦7Х ';1+╡ы╒п▐m ╧9м0lC ю╬Я·nпЯз}├tуЄ[:Х?с═ЫW&Н╜mщ┬·\vє╙}ь=иsGHВ╘ы2?┘╚╟w"E▐Ь ╢gКрСH*x]▐╥╠■ўu╢ 6LиЦ 1&T╛Tў7d╘m3R#╧@з-▄i[╓т┼┐е╞Ўцl▐ ж9-bш▐╟yвУh▄;uSОщ∙[К&╚еТ└ rя^╫гЄBxРV╟ж[МБЇФ%Зx_┼na+&Ц┌Ш▄Uз▐╦3o╫СHQ╥\]L╙▐ё 4ю-Й'.з_Юь!╬жqе|зХ▄єQiч;╖m[2зї╣'ъЎ╬с├F╤Uы╖Цt?'s├Ж╝2Ur2ко▌V`A╝ \;Pс$║А╖┴K,YК]jвo sШ╟Цg~?ь┴╗ю╕чС·╫▄░EO)сДГD█Тї█w#__<}|х:НZtшоХйRйJе є~Ъ∙╔рнлЧЬ{┼ї═nьЮQгZ.d▓<Юъ9▓еg╙P╚'ШY ь ═└аАЙQX Є│M7▌Ке┌zоЦЮGЪБСZЁC[ЬО9Ей`}В┼вБ═BСQ│t4кЛ╖Qhдb#EшўЙ^╓┌1·Еnsg═╣шб╫.╛·&Hкў4╤░x═┴Е.▌╔є|KJ╓. o,3П;45#°пш^ (<иyО╨} &(4Zк└╘■gВ%гЩ0\$сЖLSкЦд<`Ж╟└1√вЬшмРРЁ┌До┬%1╧Q╠],╚1═Мщ!=ДI╓8V▒▒PМ█<А1┌Iе┬╥7Ж╬C╡Їиxлщ┐C╚bуМуAaП ┬ю:fXW,Ч ВсР╕'ь;C!=═▀┤v┘╨╫ХмX√ю>#j{ч╤─(pИ╠VБ4Е╔┤бИ╡Ю ■▄Ш[ВЄРЫOY╘A)iB$pвРеЁ╞Жbї8аец╟Р@0"╥qGsbiBОqД∙▓Ш?└ЎI$М╪nЪЮbИ▌#n╠^SМт╘9Bsы┘U)d─BУ;ЕЦM)Сч═LхЕясh┬p─KьъъА░┐ЖШсfXЕГ║▐▒n∙┬О/╜t·ЕWX╙ш┬6▌^▓п(И 0 ЦХ┐3є│q│G|ШQг▄Щ7Ї Z└d╤Х ц,ЪЄE░\┼ж7▄~i╗.Ц,В`╕├$e╪▐Iя╛Ё═Ш╤M┌▀~ ▌7\Ч№-ыц┐╙н█╒w┴ A┴uНщ╢Н ┌4йHЧQЪс /Dб<МЄR╠Щ4▓▀GZ╗ЎЮ█·къgЭУKh0`╬∙xфО▀~5╩T╛│▀ЁТ╡O\·є┤pю.НЦpЫ6жя╬╒koz╞з√─'AБb:uМШNb╛~8■)zж°c─╫КRO┬╘ ї╨й╘=GА╚]╠AuTмWщqЦGдП*═У*"LЛ╩SG}·Бf ║╥цB ur1T#╚HHR╠¤▐╣Е"][wДP]tTъmo╖?K°WХО▓┴└є<▀мZв&EвH1шxЬ5Г╓й╖сR9 xZh▒EЧr с│ЯьоX'╨$┐ЛR1oРИ╔c√UИ╟▀C▒tQОц ╠;лЗz╒%Єjp жоз7dQ├НЪbйN*°еЬП< ╧▐{@Wq%ы┬Э╗OРОИ(r╬9чЬs╬╤фdу╞6crN ╞&чЬГ╚AdДТPЦNш▄пjyоя└]╦■=яє▐L_п╣Zp╨щ▐╜w╒WU_}eИЬ!РЯ-▓zyБКё№яft°7зsТjў╟!$РГ/╒HОKд╪ВкpЁ8вgр▌~м¤√Щф$╢░Ыy╒АаM╧о"┼M╔iT>+w╒'cюЯ>╒~ъч═║ї┐#[,K pЁс15 Z3~бАї╫╬&х1Мby╒░№х0Rщ▒№╗Й$ЖV0╣┼ЪдАБ■█├m■ЇЕ@S╫М)YК/;cяЎmYй) ╟▒║)║ZvъQ$*▓ш╘(8╞п║=Щй{╖nTs╙%╞р-╓╙dyНs╢ь;┬VдЬ╞ЙТе╚▐╫ё╢lєи>ZвIHї4с═:wСЄW┴═FгыдЪА╟н'slщCоПйг┬ДЩё·Q╠ё¤;YS3,3вPс╩╩п·`д#в╘ДE[╪╨вpОь╟i╛фчOОю°U╖PmDe╪░вQЭ· ╨░L{ТОo█h╣3]Uj╘╗xЎ┤йy╦TйYдd╘╛Э[%Бзe3▓x╣·]√~bUtwЄє[╓>ЯОn],S╛jг6эs▐+└╙ИМAШ_├··KXф╫ЮБ╪A╬ eф7ёПўю▐чS1№C|ЖliлbЭ&ХЪ╢їI.фПЩ l}Т│╦`Tз/є╟╔╙▐┐┘√л┐Uo╪v▒ъф═m%=Ш?q,■ф9kєХл ╝HлВтЩ ■─Чўc·~ЇMЕж▌hЖKvwёФЮ╝С▌b╨Ф*mЖИ┴ЕY┘wя─╛гычgfж∙aeёjН4Г╦xtm∙╠СМw└ЁсбЭFIм]╩╠ytъ╚╢ЧчЪЄшE╦ЄUо═л┼!▄╫9[ъЭ╙'Г\у hП(Н%JьD─dХ─Yп▐Z=вMxбвЭF}PвQ7Yrz╙╙o┌tjєR╞>y▐*GёК2═r,Ы*╦r┤iж▐:╛dB┐И╥╒╟-▀е:C$C┼#f╖ ▄л ╕ф┌Ў%З|UоI╖с_п╔а╨ЎK&~▌'АГP╠З ^ЙЪх╣%Ы╢lv▌{у▄ж╒ч*┌╝эшя~╨й@ТНг4╠с1БzюБх▀Ю yC╜>Г▐ўкy^─]]=~№А1S╦ўьэсь knе_З╤╠╦уБВ╧╙¤w┤bцОаsдШfXШs1╨[√ My5Т║уP1╔жNж╔9╖яч╜ ┐й╨мх╕Oчд ┴КDЗе╠WЙ&5*DB@■ ·╪ЩM+ю?м┘╛cЯuь╚сKvо┌И3╩pРь#&a`╤Р ВЩX$▓&аU uL1+Т@)XNзг?°oяЯBc2К ЎJЎ]╪┤ютЮ ╣щёНZПj▄│oPХ i(nд╛>wn╧╖▀°(s°вхБе*;EЖїxX▐┼Щ╩КЩ╜у/Eў√dСюЛЪщСьCKLY9еkZFюД∙ыєХой░6СgX5аєпП╛√°∙фХ┐JKhH╤K╤hVe∙╖7Еа ,+@Y[ТE█═ц}В╫X2жZх8╖щ с3┤╗╫═x_a╣Й}╝ю√∙Щ99S- +SSс]Жi╪юMb9хщУ5Szє6z╚▓}╬В┼TП┴╕d,СDPЮОrXЄ╦;VNЮ/Єm╕п2A °╬k╞єkСУ▄;,>═╩&┬ √l╝╦C &Нс╖щдE№й╞в╪╖]є'ЄIоё.Vу¤└╙░▀х╤E(0D:<8D v.bЎВ▀╬ю├Ў@Б`@ pWвО{F#F┐eхєDWMВy№МЯ┤C└вR┬саЙ╞ШЕ∙~вEФG┐AьпР╡ж▀=гAJeвNI~╠C√O1yL╝?кёыk╕ПSщmes?КdёY+OкL'NЇ╦Є╓ЎяБ#й1YбЩ~(М╠aC"ЯА▀Вp▀_ё oЦaу∙Щ<░&╛h ╘ ═┴У@м∙I┐Е^дЄ└Р<&√9 ЬAОс'░╒2ИQeЛ!─1Щ╫мoбV╛9ь4▐TySЎчПИ ╓УмЧеUX Л(╓Щ¤цЇжхёўo─▌╝В<{Кqц╦_0кD▄╡єE*OX╝Е +J▓ЩЩt■ро╖n>╗M _`┴{`hэж-├ n┌╜█ЛдєзН12Уy^,VжтУШ[`└B v╚ 2цzE╡ЕD6ш;кa╧БF╞л3√╖ч$─▐┐pBЧe┬lvFЦ(U╜nX╣Є ║ЎЁА╫a!>aEв┌b╛гДEЄмалjnb▄┘эыХ╘ДG.`Гъc1ыаX╝PпўАоУfe┬~╓9╟ЪМ ┌eYю╙?н┐╡mG┘║╡ \а kI╣ ╕B╞J╝┐dъPп█3k╬Є└B%▄ЫЩЎ║y╖■╧тbs23*Uп^┤МеkiёПЧ╛?╩╠}Sе]я╬C'qо4╟╙Ъя┬╔├Ъьо▐░ чКфy)7Ў·В╔ClzvєЎэ*Пx▀О╡└ь╘█╫.ж{ХrН█КaQAкAsYўeК╧Н╜┤n№ ┴8n┘╧\╛Т░ў ╜°°хo^─-╥┴╓░╟└ц}Fyxrмs▀▄>wPUеЖн═рHНA╔!░! #jЖЪz√°Ъ)Г├КV╗lЗх ╕╧ЪЬЖ^уПыАбЯ╫hє┌ОеЗ|]║Q╫┴▀оs c°$їш╞┌Уж▀░h╥ДТ5J╛ў┘jПНўшwоЬ]╜Є╬їEЪ┤Ї├"О └■"qд@├{p╒w╤Ы╫╓ы▌ m╕╬Ам╠Ї°╜s╛uзе7;╢d▌Ф,ЪЬъяк"<═ж|Мe(\х╫\зi▌Є╟╫ЬЖДLГ╟:гJ`вAчНbDРД┼▓n° ╟s╦iФMг.ь▄pxё╫Ы╢є┼┬4╬AXeЮ│1Цв├+`8Z╫Ce ║E╟╫оКи\л├иСП.юК▐{hЇВЭ┼к64M_ОЦбUE@Ц0fш╜d╚╤■┴X║3╬c▌а%L·ъ~╪ЁзаaQyJ4╦╟r9вщЁy7LЬЁ,цBнонЫўЬT┤D<╜M{*fз>:}B╤▄e╖`┬K#ГФ{!╪,e¤ф.ёЧ/Ї√|aщЎ=(╩e╙)А√`АЕ\∙╥┼К╞╒к█▐щ╠П·rмfYЩgОn╗ЎуrMfо█IЗDR4,┐&ш▓Е┘иЛ╚Ўв▓*Н@`пЪBHD╓▌П┬с8N9С ├LаHiж р}iБ@ю9╕ElцFftC5Rk▒№дexo Ц╢`HЖЧСЫЕdc╗JЖ╤y:+■Л┼╕CG}▄в░WUЙVY]6xЫB┘H╢`: ZнГыж А`@h╠Wц~ц°lН&Е"╥|╧& ╤╪сё5Н┤Д°гМн.^2сб ╒ ызыжeў╟ ─ ▒(# ┐Р'ДЭ`h хЇot,ТНgpьЙ┼ъА8╠▒█ ,ЗEJ├?Н▌Яw╖Ы>Гa|Ё░))╙aЙоЪш╔bb┌ШW ╕wVеЙq25T[Ж ═Л╗р █¤L#$ Б╤fxЩВ№vЭФ-Q═%-d-Я├╥|╔oю▀h]╖,зenZ╖С~ЎьUpаSqч▄yЩp?7(2>!=у∙л+ЗvИжчw!═л█оRН:с╪С█$гn╧b╬мЫ6нIЫ╓g╠rєA-УW┼:uя╒+╖-№╢JЫnC>■![p┴cKT╬┌&─Я>▐ўГП+uынRтїш╙kЧ<┐r^Pс╩5j4jвк╘¤+Чш░ВнЗН /Q^дд╧n\I|xЛе=ПoЬr¤v╣NГ╧° Е]╒Iщw.ЮL{s√ьСфG╩╘n╘kш8┼аЎoЬєш╓э▓їZйTпNЫ╬|HД)┘,Mр]*ЮЯц}zч╪■╓cж6э?Nцx'Р{oaССєy╬я█уIzEл^MрIФEТп╨b¤Ц┬╩ЦУ▒DЪ}■└ю▄╫Й6╙$╒▀/л°LVхU╢(Vйо╩АєиЖ6├│к/'юц№уx├█мuk[@0ЬgС│╝яЩу's│<╙ц/ПмP█+ж┐|▓lD;Юg┌wъd│;}л╨╢,п~хЁvJ╦Щ╣S╖╧╨>У>╠с4dR aтїоw]┤Ъ▒|Єшфыw'╠Щ┘мХ╠Ил@mI╞╦Ш╙{▐$╓i┌Ъs╕оЭ:ьєdМX╢зDЕкЎўг╒х)╙УЭ~~█жK█7ЩФ^╗a}Ght═сj╤йGh╛HУ╢∙Ш]╒╣М°У┐м╛╕чЮcл7ъ`:Ь>╧9┼vэ█ЕЎ┴&@ISбxД√ -ф<О^√▐@1╚5f∙пBDY*п╟аt @бТЫyt═▄ы√╢Е╓j╨XсГ▄Ц╓╢uK╔& A9┤ ╝ФDс< Ыjмд[G╓MY║·иЕ[═а0┴Tp>иOї'р>Лн─ЖюЧi╥}└▀V∙DС1}фг2╣r┤{ўЦOyO╢*╓hж┘D▌Т│Ю<ИЛ╛TаhЩЖг&Цы▄; ИЫ╠Г√&└¤9╤?нy'▄GЬОLd_╠╧?ю\<п╒Їi zОдм`НєТvCp│ФM7╥Ю┼^<╝П╤e IrXхє7╘ЬT╣f▌и║ </иЮД√wоЯ:f3 ┐!MYШщєq\∙MЛVн▐Э╥9Aоэ^┐oсзUЫ╡■∙Тt!Де|Xб┼bлК2Ь└·╙шУG\─░lЛQS ╫иvpщЧ7╢?o[┴* р╔ry/`w^QюE_И╗uCўЙLlЛЇАGcMIj╪бKP▒т2+8dї╓бГ/тЄжМYc&ПL а└╬╫ы▐O-юР╜FН{~ўz _o╥Ыв$ьe╘LLЇpЪAy9▌╦░NFу▄В▌Т7Mщwщl┐/№ю╗E^еCatVG98╓ОрCў╙╛s{7▌║▐ЫФR│√аЎ#зQ╬ Ё╡jfъ┘Г╗╡Мd▐╠│6~iЛtB╘ь3$░`NSЇЬ╠S{vы┘вaЁDнКt$CXI)╝╪кw)в0п:8UOzyu┘Їq╝"7ь█╗fЗv7╬^<┐i╡в°&┐>м|=C┤гNН╪ЦыMьу У{I6z╪╥=ОВ┼ь:┬}@T╪─L┴.С Уv╨╩л{ЧЦL^  █p▀жййO]Жїs%`1`1Г m╓▒/:y═Їд┐9▒oЫщ╬ Tl█╒Y╝'А(ЕJ4щ╘E`L3юФ7чvmвTў?|#╝¤хj╫l▐┬р}Щю──3ўhZ6Ь┘єж_4Jg─л╫l╨╠+ё2gд┼╟Э?░GT}─╨├wj яe┼R5ыVо_Я4╫Щ ╧Я<╪╖Г│■ёь√h▒r├це+U58■ёуШ█1ч╧┌pь╤Я Я7P0Wк█дu▒ Х29ЖгЇЗW/╞^╜,*ЄФ0Ъ└VdЎж ╘o▌&╝d)Еe Ц}x·hЄ═K■¤єўy&╕,Вгy√обСQ&/ъкzх╠С─╟╖y]fhЙ$щQ в ╞цj▐╢│X╕DЦ╝ц╜p`O╞ЛчвжУ!┴xMNUXэ i▐й╖Ь_elФб▀┘╡,ю╪ r╕╪xZаi█.╢а|4рo╒sЎрЎм╫╧0L59?a?╞И╬░╚f║x┬ЄA(kfж^8╕WIO [є`У╤X ЕС°РВ-{ вl┴╚┼MП┐|`│Ьы┴XE3№c&,<ЄЦ#_D╦^ГL╔╦щNI<{`зх╔┴Ж?Хзu└ў█(▐╤╝O?="Я├2╜п╬ь▌My▌$╢ё╖#зД╢┤ь╙╧ ┴╛╙╟╧N▄/P*нCДHЪs¤5ЖтГwьa ═ц(%ю~Ї╤М&│┐ЙЫaT└BМA┘]Бї╗ЎвВ#$╦HxpўъЙc`▓р,У∙w┤┐╔[e),вA╟.\P~8ЙЧ╬▀╛═h^Бё╫[Xрг"┼9X╛l╤═ЫTжМм▄@?Ўр╛╧Ує21'$╥у*РФТu те-3╟RF╞[nY(7шГAc▐╙░√Й╖ЄZдQ╨?сюЩхc'┬сi5ы#Щu :ПЩЪqjЄ╡+v▄o▌eш╟є▓Е xAХ╡Ў¤I╧OЯю3ыУr=√ч░|!S>╣l┴┴ї+#*╒ь0|j╔:M4К▒S╩▒╡ Оo▄4·╦╣хЪ6єINПв8╧Ъ@q╟W}z▌· З Ь∙╡{L¤яТV)=@аX_╓¤╦gўn▐(J▌√ АГzdє·,E8∙Г№хkъмVB)Б1uГ╖}7уюБ═]╞┐_Ё╘\ЬсГЬ%╞фyИeя№Iя%?╝Min╘ ┤H;1Н:─Ф% ■|v┼&-iI╨3У╬ЬФЄрI┬ScI■Ве░Ў*vЪ0│yў Аt?▐°{!Ё √п=;э╪жЕЧў№dчмж-Z ╬`╒тxF╤х╠ЙS╣9╛j-;u6▐^┤lъЛ°E;Kй~є╞ЖMтB#ъ╢яжH7яa2Ты╢я═ЖБў╝|Ё├╨Об.▒jєю║M╠╘▓u;╩рОЬ╝РCsuZ╡ хTп]╔∙z─└Ї°з$fa░1Ш╥0ПNKb┴в3/-х═Q╬э▀zщ°о╢C╞╘h╥╩bОж╙_'·їз{╗╣КЦ{o╔V╘-╔J╣┤c├еE;W╜S'KУm┼ЭХsщш 10╕╓р▒M√ЇWтя/Ъ>^є*Э╞Oo┌е╦б▌;╬|¤йгxх╓гж4o▄(∙·┘┐MЯ^║┌ИП┐>┤█Эл╫uэ╙▓K/Л╖CМK·єЫЗ6.Oy·║Y╧ ║u╧тС--влзLц9$░" DЖ╣■╪/M рЫ╖hЮ+╪K╖i_вp▒Зwbcn?,Sбf┼ ^╨0ЄU▐■% ╣■°%ищ╦╞O╕uт╝∙a═Z+tА ЦХU╦f╜║│b·Рь°╟`|(pjЦЗч┘бЛўпROg┴рыШq15lШ╬|syчO╟woQsУq°`▐^╗C╖v¤F ╩АQ▓,.P╧╓Sуl▀╜o?ЭЭН┘Юеl|нV-{%ДХq[N]╥м ю[Д8jЩdВ|5╛#[W]┌╖Н╥U$Э2Т╪▒G╧┌▌F╨!Еsh╔─Iц*VViAгщфЫ╟╫NшW░t╒QЛ~1ВB9K&r%▄Wц!ЮБ╤h¤·ЎеЗ|Y╢IП┴[щE╕/█Ё╓╕╣в▌НY1ї=w╬S ┼°9R√4 Eэ0xT╔=╥9ЧH▓я~2мЦ╦ЇZї▌╣═ыъї°ОV]KPpxШє╙ъ}KgwЬ6е^яў#─ф╜Ш╜┤X╬┤ЦqєЇСЯ? Р2}ФщEЕ°чF `[┘q°я┤iю+Зў■:√K ╦з1 д╓О@Жk3irл╛ ╓Б:Ь{cўК=є?й╤вэа/V┐СB%3╫a)8К └5╟z5#Hv.Ы{qу╥╓={┤ЫЄй█&юЪє┴═эg-▐X╡╢"╚XbVUзiмЮ7ч▐╛╜─rd■о┐▀wФш?ўЗRїeЫФKўо№tъгs'╤╬ы ▒╥,ЖУ"O│Е&-█╚╘(e╦M▀>vтУШы=Ц╬.╤иЫ%╙А3Р█jкМкp:+к ФшА/bфlЦЧ,}╙д>qЧ╧ї¤r■[p▄+3Ж╬▄PЭЦri╧Ў╙ыV{ТУЛ6j1h┌G\DqН╩p┐~╛ь¤╔▐gўи▀зс╚ЇM° cЦяИк\ЗH¤╢╟Рa╧)Ъ/·╘▒cЯMа╠╖▓E┤лу─O:Їъу╓!n√х╚тЕ°█(p4>|│┴cы=¤гцЭ{д[ФГз╢нY╜q "УЁ0P/NDЦ'О°т╦╩НЪ╚А╧Yv█в/юьXЛ▀b∙┼<┌ KёсS┐_RвJ]Э╡$]№╒G▒'ўPЦП8w,rP(q╚Q∙f═]^бТ&rТц^0sr№х H√ЄcКЇ▓v.┤р┤9Л"╦TЄЬб╔kgt~yўF▐w¤Эш┬Hb╤Jg/+\Z№м║┐Я<"√ёm╩РЙВАОGюЯ╡Е.їё┬rX)8ўj╩╦EяONЄя?п╫З?0ТлPйЦoГєcB3х╬т│УRЄю═·;ЭЮ-RЎы═{╝┤╚░ьЫзgOAy╥)▌ЭўН╕С8К╖SВєУu┐Ё┼╩╗h3■╞ХЕ3&▄'o▄ЄПУ&пUАh№│uД"Е┘f^?7ц$JєP║Па}Ф?┴W╧█щ░ВSоН*├Щ┌═У¤rехbУа┐M└?ЗКчВ##з-┌HфшУ;▌╖р{rX╚YF┴У╘█╪Ё2х&╬Y(ДЕMpl▌К#ыWSЖ7яM∙┐С)S ╩W`╚РБнЫ╒амЬ ыю┐ p▀є"17ма╟Х?сUJцєч╤G3o%>!Мк╤дR═ЪТРЁQЛщc·╦█╟WNЬ╤╕CзцЯ|оRБvН╒Uц└l▄_╛oс7ZwЎ╤╝\!Ц▌╩\7cr▄щs}>№вTя┴Щ,й·╬,¤■─цMz ъ8сл>ФцyзЦ{n▌7'6n·ххЫ╢╩х ─▀╪D▒ №╒╔uK+w┘·╫>V"D0ЛЇ<`_?л╔vJ╗wщ№╛W9xZ`щ╠\oЗC╦╖iЧ╔┌LЛЧр 4т0ЕЗЁЙ▌∙э┤{√╫t=╡╓РЩ▓(ЙШ╫fL-═sv O╩3Zї╨ЬЭA√Ti╬╟╪j╖юRиxмЦ╔Yя╠Jy┴Р$ГцИгЩШикVпQёКUu^╥═╝y@ёВЧуKx:{Tw:ў5ДТ╚wГ0BR╩KЎV╓ в?eСЪН<╣9GV╬╛zЇеx(ЦцБ╡[wr`┴5╖╢ЗT8gе=?░тЫШг{█n°╨Р║-┌9Є Б∙+5jnП,д╥vNSD5у─оM╛мTЬёHд╔р 8\.Ю m╪╛╜= ╚ЭЮ│l·Ш@┴Ь╛lk╢░╪Ф5ЗсK│tbG[■тcЧ■╠Еr'=_1iиЄт!─О*х└бЯЖПE:ФхФ и╨`ЄВ╒╘ы╕я?Ш╠Z╠gk╖!aзО<∙┼{е┌Ў<{ХжйY╖╬-?,вLЕ╛Уж-Я968бЙ▀н`"╦{P0╟т├о┐╣sъ└Ц/цХиRo┌вEйлrXр$*ЬяPцб8F╟bдщy{hэ┬зYКvзdУ╞е╦Wїbй╩╡JWнб│ЬВ∙/Оzл╦х?╫Я║_ЄКI#^▐К;ўЗЁVme┌щ─N Eгух▌╙╗Sы4o╧┌ГоЭ>,{2╟═▀QдRЩГГlЄ `J═`^7╘Ї╘УЗўЩ9iВюхT▀Х3'▌ЩU:ўl1b▓#вnЫц▒ы^wFъ╤гG O2лЫж█s√фq]є╒n▀б┼░ tx ьk'▄¤▀├¤▒╦сWТё█qtGж%╤Jvт╙3w ┐d&%<>МcНъ}&┤ш5Д╔БИИэМ┤n┘4ЖN║yb═Д■ўo╒ГBY╩ЗdY3Зt▒HВOз┤█Ч\Ёe∙&]З|╣RЦxВБ╒ї\┴в┘╝{{┘ФQBРVвuW┴Mе▀{№р╓хЁ %Ы\нEЕ &·╞иЖОaпAЫюC+gЯ┌▓б^Я┴я╚юЫЬ┴VPl^╜√ЗO:LЩ╨pрtЯ╞RnьGDa0ИZФ┤П.█═#ЯGЄ - ьда░ОК╡Цк▐Hг8I╧}¤°╞╡│G"Й$Z╞ КЗў═░6Пк\KзDvR╛╜{ё▐∙Wk╤бяWыR─|v+;Dq_;}юYB|НFНє-■8ц╓ЙЧз^;Yж\╣╚Жmw<э╒│K'О)^<▓pT╡fэ"╩T═a ┌рЮ3/╪ц╬J╖~#^cоФp#рЗz]G╕Єe E╦I?yhПЪУ╩#┐з?^/║r╒ф█Їj /ъГ°.¤┼хЯVЮ┌╖Щ╪fmz !║}°g-'╗f╖-OТ┬Єc*Ь╕T╞╥RbcЬ╘█!qCЦэЧ ЧLП┬щ(джв aр╛Ьxя╥╥Йг├є~ю├йyў°ъйГвцAв IШ!=ZїЪмM+Tзs7:8▄╕;ю∙хГ╗X·9Ф└|E┤яn┌э:Mз=Н╗ql/gх─/)ф,)4я,╒░}OJtЄ4уKO9│w эIхHюЯ ]╞ф╛a:Ў╒я╪╒ЛЬ0╩ЫТra╧╧Фю¤Зow^кzнц-4ЮЗг$┐>`'еж+╟рhАм┬╪КVк]нA Ф╘╡ЇWqчПьLь RGbTРР<┤│lїUj╓C. e$<{rы°Ўн▒q2├Wn╪4кRч 2ёwn?8w2Pёb-О{Б▓W├№и▐дmT╣╩Ф)└v}xэ▄├чxвJЙ52вHGqH▒AЛ╢∙ЛХR ▐ЕгЙw/√ўO▐╘rщ4╙┤CW┴R:я` э·щ¤)ПоЙЖ[хЬ╪√_ АЬM{H╙╢▌ >Д╚J╨<чn╧Lx╩гV* сМЪ╤YБq╢h▀Y ╒Y▐╥НЫ╢д%%Рk¤nm-дН█їрГ#1Ur.┌ъ{ &Q{О╞Ц kk╧WмY√ож=╙╠I╝xd╖'#Щб$K╪╖:├ Aaн║Ўdm░Jv┬Е#█}9Д█и╠oЪMЁ╠╢╨ЁF╜Жkв ю╟ЫЄ2z V┌ЭБ▀ФNzq4ОS\-{ bВ"ЬЫТт╧╪iйTvGиiъGЫ"#╢ь┘╫ ╬[┴ўъ∙йГ╗эФП╙<■|<╕0ДСж╬цk╨▒/DA╕йзwо▀├ш ▄;щА&НбHубэ.WУЎ}9gд@i/▌╣zю╕`╔К┬~▐?M~н34▓a█Ф+?lщg╖/▄╜rЮ╫rE▓▒uЪ╙РтЕ▄Im+[0▓uгjЬЮ√є┌ Ї╙gпBЭ▓'√.сюч|∙:╦Й─EJ{л%╚oY╚nЖИP╤TЮ|▓ёЄц╔╒У╞4ь╥зё'▀ы&д)8m vЩчvн?╕Ї√Є-█НШїM&ы2э6%}╦GcOЯъ7э╙▓=Ff┘ьN├w|ї▄шU│v╨eц▄$6Э╦sfщGЗ╖lю¤їв M;xзepТiТоm¤╥OsПоЩW╛єР■3fл╝ЛИ░А7Б╒єк█tЯMў▄╜rс╨п[ ┘╟a3╫iЁ╨" хЄАЙYЫf9,╩зщК─█,m╟чSn▄▐n┬┤C'╥МM╘Q┌▌?ч Ь+I[к%р╗&кg╚FexeХ!взDg╥RW1∙╧`НАВєД"dц┬b█6ц┐+е№'/p▓▐дg▀ я'(╣ї╘gГ#R-╔'╪▌чА`RS`╖й&▌╢╟Аа"ерaЇФ╗Ўl7б╨ЄxnЮЪLN!M█(0╩╒m н╩кцSЦN┬[м┘Сh┘MAВГjєfч>0o\╧└B%╞CЩЮЬ░юГ Z┬├·їЫhAe░ъf)В@№тЁЧ╤Td┘&m║:RЯ=e #J╙Wmt*y`√╓│s╞n╓cрьu╦%]=ЄуМ╤вJЇ5q¤ЗSm!╙нS"Jy%ЗaВy╘┬фФ'gп·j^T╡Ж┐ЯяСDХA┬°AЮцYZWСJЙ№a┐XE│╓|Lkф╛М=░s╗┼┌`├?┐q*#.6DСЪ╡;Yмf├ Kр8k№S0┐sS№х*╨  Чр{│|╩╨W7nП■amXЛо┼╕/╬7АЧЄ"f┼ФA>Y■р√5╬┬e▄э═Jj┌б█У╪╪М╠мJ╡З-k(2уIП>}Ш°z═;0R жd╜Yз▌pa╫&wn╞╨ЕлК╘lеSїц∙╜ ╟Fи▌в╜ц а Щ╬I9╣i═Х╜{TК3oa■ ,-Аbrt┌оYВўQЇК е`╫{KюЧєwеZ8Ей▌╣ЩЩ╫Пn╔Ч┐z├╓Аh9Ц╒╙_X3чЎЙ╜BHйqs║КЧаhA└эX5&SпЯ\=╛oС╥UG/┌кДД░┤ Hp╧╗Z╞ З u6░уф╞Ў┼{|Vйiз!_нЄКv$ЎЪв╞2 kBАс{rw┴ФСeлэїэrN╡'^╗}h├Єз╖OVh╒r╪ЧK2Ш0╬r3рЖX B%{Єi9W~wl+╢ъЎ° юsHCBщЦeT,Ё┼■p лv╙з╓я3┘0C╞k1D %~TЙ(у╚╙╬°[$QН5√█)СJлБ-её?Т┴#~йy#Ъf Fд) РиЩ7vн╪╣ш╙╩M█°j═1╪f·В╡┤еЯ}№№┬хЎ╠l▄й¤цEЛюm┘@Q╣ШРу ЖQx-]┤7Уo╨кНkUc ╖зй,8l╥вН|┼ZфqЙu▌Р5Лh@ oтp:╥CЛ╜нvЇцмLq /╚H9SkвDц;M╛F╞ЬРTаT╩ФС╗nJtЮ=ЕtVЁъ═!АAЩ8Ё)JSф5}ТnUКUJ╨xА4а╬Ъ■о▄ъ?┬эЪ№&S┬Q*, .&Ўг√х"Yд╤sТb░Ш∙2ue|А╚&ДIв)#"b$GрптИ░цяui■~aє+G+╪QКщ└b]u╨жn"5О!═'╦+D^╖X┴b┴Э (юоа_ж▒є{√ Щ(е─тH└f ]А_ wOЖ■ўёЁМ┴|Д0е Жbr┘ТИи╗A╕√вl!WД┬▒╨КbЩА(0йьСD9C"рВB9╪─З/:╥'°√cТJ)l зiКЭБ/їB|тг№┬Y&щ=р5┬яH╞╙╝JОR╚╚ЛМД#Г#H'▒A√Е╨Й°НйsHКЗ@╢╞■╓(L·,╪У3x ЗД▓∙tкGХ·Иж├йh╡x└:CсРP$p╩{¤D$ЯJЪe9 MЗиs<╬TДЗ24T>Ж(ЛcмATJES╤i▐GЛ рZ┌┤г╩ь╕╬▀ шВс9╒0Vф1CП═├p3Ъ┐}Щ╘DЪ4╩qxn`╜ЖH·aL╘['╙(¤╜RЪ─Ю─Дф{╫█╘о(hю-ы~дЯ─cлоЦ'─Y8├UшY▓W─9 АЕ■((Ее}syх─▐ї;їj:kЙ╔ZБZ@n╪┴В|ш╫-ЩZ║d╖┴гj┤ьЪ"│obc~Э;3¤ё╜Б│╛-▀~Ш[░S┘З╓╬Н^╜╕^Ч■=?ЬУh9ИЕЫў??╕y├ЁoЧЦo╥!Ыv└v┴<┬ gшєX>╖J╫■C?Шэ1-Б╘`/╙"з·┬Y∙╔╡є╗6mЁfхЎ=vї■Н+ A0єу░RХPИS3%0Xлpj8Э╛√ЛO.8▄l┌╠┌├FИЪНWLФе·╛L┌Ёе╜>▓f╔г чzЇш▌░sw%8┐ЫTн╙кO░╘ы╤╙╙2ъ4l.╨╝Є═s╟ш{╡ЖuСS╥RО¤▓EK~sёМ&pчн кPGцьTn·╜Г┐q┘╦╒яаp)Щ╧O ║ЩКO╕їЪъrО]║(_┴z╘[mйDАЄЛУ╔ёp°ШЬьь%УЖ0rZПiЯФn╨ "N┴Pн╠╘├[6\┌║╞5}┘+_сЇьм#[╓╟█╒o°И2╙(│кГ!ч)#'х <VиvЭ·B▄▌oжО41k╙пВлЁщ▌╗O~ ^┘ц▌■m xяФШ╙+з -Uz№м/n┌r¤▐├vCGWk╫Щr8 ╧Аwы°Ц╡7o?n╪oxЛю¤tV4¤нЕ9Y1╬j╛ьткFЦоК┌ФЯН╩�fN┬│W╧ЖЖЖЦн▐Иu\?Ў╦лШKёwо%=▐ичРn>═Р┬с К╓_'є╨ 3▄ ёsZЎ▓╔¤_▀И;яза=)▐ T│╦%sЖЁц▐тё¤╝>m№Ь╡ыЩЦ*Y╣Ь╧╗р¤ёёўb·<пTє■р|▄П..Э5J3Ф&}G5ь:ИuєЪў▐й}√W╧╦╩Nё¤ки·]e┘РяЭ\0c,├ИGNп╪ж╖╚╥jЄ═#{нX++╠фЦЖUоaPNЦ╔q│Ёь╩ГшеSJAоё С╠C√╟╨в╤j%=}▓|p│└BQэF╠м╓▓;DЮr┌єkЗ7 eя,5q┴бHaГэ:┌t/П-WЩWNп▀зHй*гЦlХCB9╘ Е0@░▐╒CЄю 1$Vаоo_╢wсЗЫ╢Ї╒ЯўC!Эs ║Тw╬ФСля¤╖е▓╩ъЇн}Ыў╠ЭQаhd█Q│J╢ш)2КG│d╓ Д╫┤0-k ╩y'┘P┐w?А√!╗█8&3WT#1│т▐╕s┴▄fSж6ю?┘Єа ·]я╛╠╝J6I%ckаЖн ╧╚┌ї}?n_°yеЦmЖ|▒,УТLЯK{│туЮ╗┘∙гъtэp °┘ЧвuQ╦bР╡дц$▌╣ ъUTг╢m╟~р*QБG5¤┐|ao/ЛKФ▄╙;6Ю▀╢Q~УXн}Я6╜ЖХоф├╠╞╜У╗ў,№Z7╪╔▀пО([м▒КєП╡P#{■╠ёOо_щ∙ёЧО╩┤▌ф Ё▒aуiп/щ·щG╫н+VмШ+<У╜\e*╕Y└ї*╦В P$uНшчўг■└ms~yS,IcРC:ССt~ч╞3ЗvUйVаХ╩Ё6I4╜Щдй╤╝yщb╜N=Z Юи╪CЁ┼3и╢ъЙ╜ї├╘╤bаk╠№╒╬beY├5<2╝:╬─\c·ь<єр╬эХ3╞ч}┴j3┤X.Г╜+АуЖr░╔н╖сЇ ╜╫┐╡┼■╧ї/~i8MХ2SЮe▄╗╪оF9Nuo╪░ЎЯў┴Ї╝·єТ{╫.wЮ5╗HЕJ╪╞л╨<єi╠ЙнлюЯ╪Ь/┤j═zЁЗЙПу_>╜Wеmє·F:J╘фuцїщg╫╬ЛП╜^║j¤ук╖я'&3.f█▀ж%<╛_╢v│югз,S∙Їё# ўп1ў)*%Ўю│;W┬JФ.]н╢a┘ ╩╤f└`GБ№&OЭ▀┐+√с▌GWв3_пXе¤рaЁ,'╫╬~№°IСJї┬╦╓m╥sPpсТ jXВЩ{уЁ╓ ?о)Z╕dГ╤уlлёЖ$┤ё╟Ё Й ╡┐--'юц┬Yу9зjНъ6GАFС▓║Б\ц[7я╚^sЁ7 ЛWйЯї·∙тСэ^иT╖Ю(p8▒Ерф╗rхЖ┬:з═[R║Д│Yёэa╖ёUъ╖U ╔э■зх▄╛cЖЕ√цы┼ы[яВ√┐M▀а┴в|n╧├3╗нЩ╦║╦Uо┬аLК.чznЯ?╧x3дР5║Ўk5p┤`wzS╧Ьdx3╦╫оН│эИЪ╟2йI╔q╖cЬ┼+НШёс╒ныо█oИB│Су█ўrjяюsжнXзя{э╗uy√╠№icьТгy╖>k╒Ю э7ЖтлQпfюСkM'╜I~r ~╔F═▀√фk7*▒J&Ср╠yxy∙╘бК█▌tЁ{ЖMё░.ыeжЖ}T л=╣tt¤╠Q╬@йFЭ·/╤А5YЎёг╟/Я╛j┌oXў│,╤дЖ} ╖v┤)?9╗ў╚Є╣AK╖;+▓lY└Р*hf=9╣a▐эГ┐м╘╕=N╙:g·DC╝uёTfzъшoi╓[¤№╓К╔├М╘d>0дb▌FВ╙ ╤▄═є'M_nэо¤ъШ"ЕЧMU╛st▐┤aк█-ЕмT╜б=╨ЦуN╜їКiH ╗i╪g╕R@д(Ю╬Ў▓┌р╒√╤K&┤╣&-·Щ+P┌?ГУБнгй├╛zto¤Иц║a8"КVо╙ШсyOfj╠хS6З│A▀щ╡:uбCC,JUЪ╜Yc&▀<╣n|┐╚╥╒F,∙E e)Щ╞!Ьх?■Ц-E<└¤г ?.█дэапV∙Д@ ╢-╤GЖА▀Lxu|эКЫ╟ўЖ еъ┤╬_л) цЧ/яЭ y∙ГуЗЭО╚*u┌+┘кg┐\╬жТЙRў┘;W p}╦╞║=·їGр>5:юs&gъ▐▄Мч╗┐·$╚fk:bTp╣zжц`Xэп╖!¤▄з╚tЁW/┐:s #юъЛ█Ч├Л*VлЕЧuЄЦG2▌о\OK╚щ·╤╒;wg ЫCчeь^n№╡S╬yzыЄлД─▓ █┤;=(к╝IЛo+Я№┘ЛFОц╠р▐Ksшю;чOь▀┤.э┘╜RХ+G)fРJф╜+╤ж╧]з╫шЪ]ЖК√фон╛─'v=ч▐┼3ioRJWпЪ?кВЫ и▌upDЙ ═лЮмKЫ╛╣░o╗юєTпY=$4\eDЯ┼╤ЬД╔ZЫл▌А┤#Lсl╔╤bу[ЭЭ ухз№38q┬:└¤╘─д├kч┼Ю·U∙ъїЫ╪ Фj╓gч╥5∙┬╓Хzт¤╦╧y|Z├▐CЫwэ}`ч/┤юE▒ЄЇдЗчO╥ВX╛I+╩╩Ъ┤MРкЎсMJ8є╦f^ХEЁGiй╫/Э╡9д*u2О ЕС╪а|-╗ї  SQ эЯy¤╦\ ╓√?╫┐°ї┐юYJ+ўю∙yїЯ1│f╟Ю╣Tа┼╦╦▒ФдfrЩ зwm9║yV$XО╥╪.#G╒ю╪E +тх ї─Є9╤[V`бD,╫ж█РщБЕ║}rы3░CЕ╢ ·°Ы║НЫп\2 юс]д ╠$═╥ T╗┴Ш└q VEVм─│╩кп╛x~Ў,э#S0[єс├eЦО■ё;J│D бcg╧/R╜v╧qЖмdо¤r╓├╙'zOШ^з╧Р ╬IЫЬ└№╖Є┼Л╓╙jZR▄-яЫДm+╦╔)╪ЗD╘Тh╤╓sЇ╕е*Ж+oДf┐z║xX{╥Иb╣[@4МфРzОЭR╝|xё╥║hx.ы∙¤╣C╗a5Pw #Qт)U О4jвT╕H`йТЖ=фэ▄ТХ7■-п юJUQmФ/∙щэ╗╫╬▌┤Цt╒p∙ ы╨н╫ЦХє5ЭrFUўэо╨╓╘╥Я╟╜╝╜mёЪхh^0сп-:▓dЩ╤c╟║э┴║(.Э5IOKвx{T¤цS┐°·°┴=√чN▒╬Вї[╬№Є+И·┐?Щ2╠ИхG|╖0#%┴ЧЇьЧsФ╠llXбД┬5ъt:\rЕЕК╥y;ТХI7|╓Гшu│╞·▓│Z╫vрx`28▐┴gBd$X╛ЬД█ч7|<ЮR│РЕЕ,x йj╟▐ [v░Gф+TH│Ld¤№╕√ ╓╬В2Ы/}эМQOn\■∙╫[t╩eBL╙┴╝╝ш\IЛзL]гmgгtйд┬ +6т╦╣еwV(&9■┴ъж:х▄о╜╗я█│=3+ хЫmОяMк╥мг█)[ТЭ╓│юЯ]ЄсД@зг}╫ю{~▐цNГъW▀▒Sл╡шьС┬T╔╞иъf√Xгё·¤шEУ┌]ойЛ7rС┼u╢B╞V(kУ√hї{= ╠▀оs╟╡лVQ `_&0┴бзи╙:╟т°АU├бlВс/Lk ╖N.Я<░@ЩЪ#¤jЖr┤П╠EIА?╛Z: ╗N╝╛}∙▒Хk╥f°Ч╦U▐Б|SnxS╦x№`╔┤ITV2ЕCy5z ъ=qж ё@vBЇ▐эG╖■J╔f┴jН&}√╜*8 ,Йь┤rvмЮeыж:=·ў7╦╦ыюy{д╨j┬¤╦ &Мь1vRг╛C2-╤д%ЎпCщ ў¤D)░;~▐│n лepж╟biХqаС╖|МKN╩█O√иnЗЮ╩чa▀бf_█ў╙╬Е▀╙Фj╤┼┌╟╬]Uн╢ █х/╖J▒8E's4═Вqd(Zvg╛~ёєВO_▄Л┴[k)Hв═╒o№╘ТM:∙lб6▌├ф╛YЄсФдЗwH┐&6Ec]Ж▒QФ╜яь┼ъ4БўхNO√i\п╘╫ё`ЪЙr7Ki °L$ f@■ВЯ.[O╣┬▐о╤ь=ЦЇ4№┴█ЎK╒Щ■.h№З░7м╪╗ў|,у}mич,Rq┬w╦В"Лцde,Э>2ў┘ юДf#в╩ ?aю╟3PаВ└ИЇX*'}j^▓ _╢╢P╤"╔qПOCсИЖЕнп─)├╖ЄbD╤ ▀.)VVGёЬmЧ·чоkЛ¤Яы_№·▀ ўiU7▓▌^6▒▀рq├кvШ-`Y'р╔,@Ыб°2R│▐╝Q} C32kЖО )ф3Ухy░(╔ПsSтН╓QК(V8J3 9;-¤┼Ckz *╝Xygp╛Фqzv2k(4Ор-ук▓ЦВШ▀ФЬ%лPо╨@ZIЎTM~@2╬╣4P,╩CYю╘╝aЙШc Х*m8БЗX"Luп№ь├{gOw~ ├┌Э·*МУeЬ│Ї/═х!}м(жуЇ]}╦ТБёКЙd6ЁQ%J▒6╗╞АУ`═ЫЁ4ЖAё,KЫЁ'╧ИBёвe>>АУ5)Э╬M═ИЛ,]EIW╥НMz╧ЛФ*з┌2├┌їw б¤пыў╙ q├1рjХ┤Чпb├0M╓Ш/4_■Фgwр¤щRHdщ ggР ihю╘7Йe ├ ╟{5#0($dAQt╚┘╣п╖EKBP■"еJж$╜РУт╜╩Q,RLєц╝x№@`^ pХк%1эI}єЇ. СЇW╪ГВГ├┬y╔ g╙Х4OЖhШМЬЫЇ°.k╚┴∙ 8є╙hФV╞∙зHPрYОS2У3у жb`г,БV╝Ц-0_TH┴('ГdЮЎ;╟\■щў∙яь<`╒╖ъ¤q WП╛ўёЗе[ЎLч"y╞жъ┘ Oю▓jЛвm╒ЧыS<>░Чи▌O +j8╗хY\%J:в╚ыЮг■ш¤▄g▒э═╥▌╛gёYт"Zх Цйм!/╪x√Р╤└ЩjH┬Ц\ z{WвUХХXЁ╙dP N▐AщU╪@BXT)З╙сsg%╞╟2╪цБВ│H┐ЗнГЬcMзC -QYХB`єє╓ Kу н-Ўоё №NHK{Сs╛Cэ мТ√╧╠ю`Дs▄g╓|ў°╞щFc>(▀вЗ╚|&╟У!g° 2b√┼eЧ з▒r ═B√└ж┌┴╬░В c▐▓|1╢Z,я┴▒wмHi6SжMSЗ}0МPА╤4Оsd1в╠ёк&ZЖИВ├жжГЕd░NО;уp▄┤Ж┌aмеЪg╖йЪч╨ъХ1╗w╫n█▓F╧>оВе)НчD^5Ў_╗ЄH4LC▌ДPV╦24└кrМйл╛A╥ЧЖzlМ─sЦснiАfE°;a№є╝qшЦД}T2mи╪7cСБ▀8щCЁб ╦ЄВа╔╠█╢╠z╖┘є╥╪gзT9iR,*p[ФЭЄ╨ДвбO∙З>ТёpЩЛОsф`ёсХ┴o1tС6xVEY\S2,╔g·8╔тI╛LГ┐ЖЛ5$ь╞y╔╟╪t┼┤у╕┘аPmZcpфг@ЇTМ╝╤у,йCа& lJ╤ЇB м└юасИ°DдК╤ -Б√yОТ= >╛d1ЦаgЫМ▌`ь*╢[│DЬ┴$Cy■zлю┐╡є°╬╙Lъ╜╗~Шеk╣-'~Q┤n┴ч╙┴zpи~nш2 PуJр ч"Єдq╠└┘NЖГ6_▐╝}`╒J=ўeЄуш|L]▓Ч9╩усaЛr№Ж√и3 ▌ФnяY┐ў√ЩВ#$мTЭB+ў1╔═╗зJ▓Ж*"я╚РYc`√ВY├ЎHam╪tпсцзкЫ`7Uє&%юЩ7;-Ў^NfrЭzОy▀├┴эcл.сЛCЬwя╝/yЧ╪}╞╫Aб%сшdЫЩ6╞∙╧Е√╠р╝╝ЬN*ХTЮR]ЮЦgр╕(ЯDsк!hHE\i╫,░Б2лO3░6x╦щB╢$,P№╒Д]╛8# 5╖¤├u╚р! ╛_тxZ╫`ў┬▌j`*iО6eСV]╖s<ьLЬ╔─Ш▓ЗMo:Пж┘ Т┐рhy╥WЛК▀Dт e5ьлH╝╟]Н═К┤О3ЙИу■ ╡DlЗї??Н▀┼ж╞╚c┴D¤{Г╝х┤ё║'ГS┬0АвUВm╙┼├▌ч└■┤░КВDQ<5:g╬ЕЭЛ:╓А░ `b/%>Зм# {ЭQ"╩b4>@бE╗б  Б√ ╣■s¤ r¤oД√Ш}┴╛`GЇO╦ОмЩ╙h·7╡╗ 4▄ZєPВЎ▓IX HЎ└Цj▌d┴╖r(нlj4╩▒I28gVc~Ы>L3мf  xХsЪ8pP├Щ5(о╧sDT┴бршз)U╖▄(i8│╞ ├╧Xз▓а┴╙Йр*Л)4ес╕= ?C*╛·ь╒▒У▌жOй╥зЧn┘%Щб9Sб Ў'Q■П\8vч:Ke13П║╕:П c(6еы~e ┌пW└ФH ЪЙ¤,  Д?с└фk■┘A ├ъЮfЪ&Щ╨█аЄ┴,╦шк ■ъ&╬?8╬oфш ·Y.tLг╘·9ЬF▄бк║(b3╖_rер?К 7╤ла■-№K|Е├ %VчuVSТQvgЖcE ')*╕Д╫5 РnЬ ╔P~сЛМK╖H╧" Нb9X├зщ║╩т`HЮТECБP╔▄Ка ИxрЫD~fT№╟шБ \t"Bj▓ є■oэ<Р├a╥C_;kф╙g┌|╢иJл■ А И╒КЖНMAи kOI╚йр`Г}А c┴ы├РХ│a6T╟┴Ш ▓Ёёрьy╦_┤БuTX╔а9xпжР\╖8~v╕"▒╩yYЭЎBф╠d╗Y╪ТЬЫз╓╠%╗s)╓)D ═ўaQх▄▒/kш▒гh8rВJьр│bш╧■Фtd[kм[КS=П╬Ю хєп(#Н2SВ+4√├nЗ-Дг=╣(B├I╞╦жiкЦр║Є╦Єг?╠Bim!вP╡3ч,╠сT╙└(┼ЙSgiХ╟БИЬ$]┼m/└MБqРсюq\ ├║.Z╞Ы╪G╦'П╡PZWй9``яў>r3Бd┤К╩"]НС9ЎїЭ╞н╤йu√Щ▀Y>ЗC░d>"ё?Юl■Яч-ю╛└тНёи#Т▓МE&┘┌цah6*НТэ▓D /Ў╬╬╞ъ у╧sяьИР┤Р$┤Р╜Р,-ЦХЎнhУе╒╥ВJ~ЇK■JHQС%Z╚Ю%Д▓%YЫ▒/ГЩ╣ў> ўє|ч╧▄╣3sяЕ╬чUу▐чЮчЬя∙Юя9чє=kljМu8╓8#═HЇ╙▓█mGмэ▀┘gьuг▒G=╟?√U6Ь╓6рЬM)лmI=_F ╞/р9fа1├╛Ф╫ыЙєсрu8Wд8╫Ш:зХ`У┐°о╬Ел╧╤ п╟kЯ(bўСж│╥▐6gи▄> ┌уь'rюkў;оG─^Э¤┼╬┘∙Ў╨НsжH ▐>Б&Жzo┴═Ё─R ╥Пж│╧8М▒║░щ╛чИяНННєM0╥|╕ЧFС √№(+╞<@U XЙ>31=&╒яlф& .┤с4aNуo9рч┤z╘х╡▌╧У{┬g─·}Юt3╬S,И═И▒opNз▓зъ-{А╟╛├у╨·Xч╨}и╕Уf─┼∙}ЎZЬ/▌Ьax3|ЦЩюг9єВNж{¤Ўaб■┌№t■┌╖бA_╙c2ьЛнбпDl▀╒}t╟К%Юm)%+_dVк@Ё"щfЖu4чЕ0[Угm╞ ЯsгhЬ/>╞o▀0╥нXFрHМ│cЦv▐9╬╔Юwй}R╫╤└OвчhzjRl╝'═JЄ$°|╬Х╪6/О▒ХeЯ<х5b╠ 3ы╖?&Гn╚ыў°} №фП╔.зм┌Ч╚┐╥┐╥ытT┴┼эKxЬ^╬╛╦▌в┤7┬╞є0├╧r▐дo;jз░iy╜╬┼ф╤╣в┌>Т╩go▀MППє╟eШЗ-√6фD║е╦Юў╟$f°э█╞у▄{╗▒oп7Т<ЎЩзДIўA =ё╢9;├sЗa8%=я"ё{b╙╝I╬b{Є╟^╦e─█Vi│I√шRY║'6р╘k╗?9я┬╛o<8qiцP·aэ═<бЭGБs└┤Зл╜Еbb╢-Ъqx Ўд╦$ЭW╣╘С]Р╔├▐╪ЇШxЯ▀>]у╖ZV|с {╨в╧ЁQиGэ┼ЎМ ^Oё─Ш2шO7т¤&4 И}t▒7Ц_)Pl<═Ўw=▒╛_L▄~YМ'╔gJ╖От┌zжzУ +ЎМ}Ы╖,Ю~─└;NЁx*╓иk*юЛ+ ╣ЙўШ$┐q╚ЎC═8Я▌h┘Ф▀>А╟fQqUш╛mг╨}▀Q _╔м№5╞╖;.Ў`Fёrч_╤┌4╝цСC6!─°▓ЧENаЙЄ╟ёoZqpїШmj№YE╬,^▒j╡╘ШDЯsiU|└М╖пмї5э 1╝▐МtуР?vFОOЄ¤╓{щ╢] ╝°й√6.ЭЯРЮJkp╞∙ЬUйЎaгРe_'сє:╖▓CёbЎя:┤ш╟Шє╬Nм╥(!ЭкЦЮЮpР╪┬НюGgB╬¤щ╥Ж╪g╙┘з<87┼°(Ю° √Ў √$J√Zy3╛Р╧┬ ?ЬшMЄЩ GЗт╜Зт╝Е╙^ц}вЖe%╞┼d>Фр5╥ьсгиЎ8Э╨╓)к╚OhЛm6#o(N4 BЗ  NPЧmзmbLю*3L:sС║╟Yl№▀~═9юV╬phж3Jle6┬ЖiиYзiVB▓HmЗ╢5:Ч╔√Ь▀╠Бj╙ зt╦wJоKqAфЙю╩з▄тх│,юt╞╞E Тщ╠бн`к┤ЯЩ╜@цЎ)╣╔┘Q░!░*y+єk╕N%\ [WшЄм╠ ·,бэ+йI╠мёШЩ XЩNеУ7;░cfИ!ЫДГ_я┼брN^┼*─0Ф *ЭLыС,QЬС╓бЩыlG╬M" jFщBъб╢4 ─Д eЗ)╙╣,Х╧╬░╕╟Y ЕМ├:6+Svю37Вцс╔42U└Vf┴9эБ$"f` еt╞jMY▀,F`kl─!МqЖT3у7dh╫у╢ #hБ╩rх^ОАsыЦєУ╜╧└q еa ╪7№ШО7n8зj;ЫеРf''2Ь╞╓9▐n╙─tНА:[Z╓чIЖэrх╗г Щp│м`#│Є╔q╥╚у▒Эс╠∙ЩU╞╓П│╟&р╖OБ╢╟ЖЭjuмщ╚ЖиM╚ЛкMVp  ▒"s Xf╒Ь├tЦТ█¤Цk'илyё?лpJ═:╓~√╫У┘┤fY xIй╪б╗ iyФ═╪s╠jfЇXь╬▌╔┴v█- З^?╠аCfуik|НcНЫqмё4ГЭhf╦Цi`╢YfN5X╬Є%iЩm╕=uьЎ╫ж╗w░ Чuйо┘╚\Br╩fБ┤УQшЁ╖╪╤FюЇяaД№√O8НкАNЮ^╧╚YЗ╟╒nЗo▒-╦чМ1█ЛЗ═Рa/Хqjk $+brв}a +3ОЮЁnЇ▀ПL>Э▌╩гС0╟H {_ьq"╟╚ЭKv├Д╧бАО_Тha SПQIШгДiEе├1б┴ ╡├КУGЗ9!▌FЕаHЛ}2I^ Тy┴Gm5╠▒А╝sd@фИ┌╚гСЁi▒├JxB[Ыh#?Й·ыh (ZZrBQPM\Xф╘щ;Ч╙┌╖t√|y╥}√n?П╫█░├ Х╖╫еЖг√Ц3╝@╦╣b╦у╡Чp√2|1ёЕь3╒Rw╟JiVпЖ7у╚G#FШЫ■°нh▒3I_╡vг╧╪g·ЭIFп}│[FЎ╪╜oLllМ│▄┬╠{Т┤@Ц"9; РУУХД9Y[БРХи$╠йА■~┌нйD%aNСИiEл├1б┴ ╡├КУGЗ9б@zФУ┐цДУGЄСфДFU5<бMY┤И╩╚гТЁi▒sК№Д╢6зY¤Пш0*Tс ┬9╒▌NЇш╤гБ╝╬\Ж╗╟╟┼ЫЩЪМ┤┤┤Г:╦Y┬ъ╨ю╗bо]╗f┘▓e▌║u?l/}НM43Gb|йiGR oфGцж═ыКЬQЇ`ъс▀ у╠b%╦Хлрє[▒1▒_║╫F,Я╧ЧШШgЪqф▓ЖЖЖЖЖЖЖЖЖ╞щgпЯ=°Ёс<Cўь{{╣'п=pр@RRТ╟╞ЧpVЩ2┤┐k╫оw▀}ўў▀ z╥D{Н╜п▀8ЪzhхЄeS 9╩▄ЁчЖ3╬8уHjъ╞▀/Q┤x╣ .p╧qNe;┴h°утуcccэхDyПю─бфQю} °¤ЎtЙ╜Y╚4] ▓5bЯPk¤б|Ит^Щ_ sИ─0О▌B"+Щэ└ЦЬZaf&УзфY"81x╝▐А▀gн)[▓ьж8V@Щvc_Х`┌Ц&K╕вTФc╓Цх$*Яэ╕О}p ┼ ^├k╚2O╦9м"`z╝Ўc'Ш=upЮ╚BP{uм│4ХS╬Ў╔K~┐/&66Si╬ъRgJ╦ым)╡%q2!kцОн╫ц>ЯО~flRClc г%{╗п─Є╪█+d╟Й3?gЖ9╦┤р╖фfЪР╞-w╞Ь╔╣pТЖ√6┤╔Ў ьо%}ОV Ao?ЛС[▓E$S├╬Ў╙su╝р%<Оh▓ДSнВVч,╠╢О7ЫVцi0RkЭcye У=уЬi▒б╦9гФ╝р!█.2 Щ╟U -g▀л┌ЬQIц╨С@6#ш"ТфДОYЖEФFm/y│Uф╥щч,ItСЯ8;МбC├*аъ шжЬЁqч<Йa╖жБ├ЗRн╝╬\ж%K*Фд6╟ж=zp Б"EЛж$зД5 П}иЧЭюЖ ЖОGёхW_┘╔▓У<|ш╨╩_VьOM>ЄcsуЫ╬(Zф0t├ЖтgЮyсeЕ1^{IO8a Й ▒Ў.▐,;Идє╖ЩV8фяДХ┘╠З▒╣Аs·fL╠╔╜4┘Б=уcfvjЮ`ПюьlО┬RE┬юьКАчX:Оm8╟px°O╢зfI=тDm т\оИЗi:,E8╖│┴╤╠МP▄█ёdюJбp╝Ў╩3;╤А}ФРIцaвNF№~+У{╪&nЯь) ▓=щё%Ў1Ю╟6Шр┐╪qxВ═MA╨╘рFG3╫ЪЫ╣'┘ nmчЫув№─Rї└╔▒┌шъ07зvXС,╞│k┤@ ╕-=уEА|2jtFFzЖ╧weЭ+4ияш═╠t!lзв └╓н}+РС ▀u╘h'╜dщ╥єчєї╥K/╗сЖыО?їH─├ДPИ╧чўf-юрцЮИФ`eОЮЖvИ╛щXh№3Рсп┐R0Є├ЗScь█iнBЕТ┌╡k[вDЙPкБ@ц\MцN4<#N┼СJсQ╦IЭ ЕaкЄї∙▒▒vАУД7KмїЦ|ч╙Eўer╘vЛ■яZCCC#wDGўГ+Є╙╥╥рБПwх╩U9╙}Ыq¤ї╫_у╟Пў∙2╛№Є чf ?IJ=Є╦КUЗжО1╥▄№√Ц┬EЛжN▌р╨¤2х.pN╢│тьi▌0'е╨╒$&&м[╖n╓мY^я▒╬╞у¤j╒о╕·ъл▌ТЯ╚Н5с!єфє╟gн]╗N=┐тК+К=c■№∙7▌tSйRеЄ%I┤hвК─P█YЬQo{№юп┐v4k╓,9yч┤iSk╘и┴HjЦ╚ЕL▀xcЛ3fTйr∙ў▀wцЩ┼═,N╨▒Ё░├¤√ўП;Ў╝є╬o▐╝i\\l>№"бЇ┴ййй╚╝xётw▐ь╕ЮЮ /,ўшгПЮ}vйVнZ╟┼┼ Щ8pр└М╙╫п_?h╨;╗vэКЙЙнTйR▀╛}n╕с>;Ї▌╓╔╛}√&MЪ┤yєЦБ:tQы╘йї┌kп5irнifОъ9▐mЄ┤i╙■°c╙█o┐ЭЪzШ╟ 6l█╢M╒к╒о╝ЄJ╕С й4Фя ┘ЇЇtr▒zїп?■°гzёНхx╛zїъVп^ЭЇя▀яеЧ^╬╚Ё▌}ў]#G~.╛ЮЛ'╤я╛√n▌║╡:f6xA╡j╒╛ък+э9CON4▌╡Ж─▓ЩЭ>}:нЙ<Ф"цo╜zїлVнRАbG3dаБv░i╙ж))╔▓oйtщ╥№eЧ]·╖ ^┬у@Цйaq┬qw┐°тЛ╩Х+╫н{ХsьZ>}-idИ099хЫoжQaeЖНЪТФФЇ├3i1ъ╓нkп█╠Jжє!yBZTA▐.№i═Ъ▀╥╙3h(ьй┐L;╖Ьs*Мц═ЫХ)SжА&Яв┌АX 1чyБЇAВhН╝@z╔В[Biф'П$╣Д 'єЬ,:М╒8ЗEnuЦVЛf62║Ядш■С#ЗП9J;╝b┼/┘;╦╜MЗ&Aўw|■╣Mўщ ьы&эыg<╨¤Х┐м<╝ ╨G 7┬№cуg-z°░3║цЩ\pБ}╝Ёц╨L:d╤3f ╘ ╖Г╬F╞ЄE╕Л/╛xЁр┴uъ╘сбЇQ═їd}к│)▀▌▌ьф╙O?}ын╖6l╪А Ё<\С╦/┐╝HС"Л-Ъ={vН5ь╙LИЬjv╪¤╨╩\╧z,МЇ╕ЄWБд▓/1и0┴cV│L1KЎА╖╧gOP▓W┐8├∙J├в 4√ ╢╫еKr╩ЛД∙Є╦/+TиЁ─ORй7же`чЖ■╨CёQ┼Ё°╧╛4ИjBr╦Ч/╟9∙ълпn╗э╢П?■XФйМJ╒)├86c ^┤ФЧ х║н.Р─w▄Б6$ quВQ p═5╫D26МХв[ иUлVєц═#u╟U╦4М Pх█╢m█╕qcg2!FL╫tн,WЩS╟ЭбнюvP-;w╖Ў!╞>Я┤0Т─Ю={(eждд╝ў▐{■сЗ.╜ЇR^╒bIH═>╣ Kф"Тj┘ьecAЭлМ`нw╫ЇР┐кв)итVепRWId.а ╛Єpєц═їъ╒╗ї╓[i▀B╘вZЫHъйdК▓ ■у╞НS╩пRе ╞L#┘йS'lUеZУЦ=;RшF╓fP▌}Ў┴sЩХ▐$*wЙЛ0bиyJо^щ┌╡+╨╛▄ы┼░%QьSj▀мY│0r%ПС╡▌SэА▓4F$q+V╜%ЦаJP5╘Т/eT┘UaО444NcDLўM╪Чj7О╡╖ъ╥мн\╣R║cZбфффЕ 6j╘╓д┌о]╗╞ПO°пь╡√╥╕йЗн°хzЁС ўц№;|°0─ыLЗюо0м(┤╚╝№Ў█oўы╫я·ыпї╒Wеу\╜z5,нTйRP╜Ыo╛9ыzП9вROHHИъ]ш╤s╧=7b─4√╪cПЙ$(E@┐ИЎ√я┐п]╗╢ъь¤╬В~zЄх .їQ╘ ┬-╜?3╧5Сq/АЎTNyN`Щ<Ё└Ц-[▐yчЭ&MЪМ$FН┼C2x╫]wё:Щ┼h╓м┘9чЬє┴рpJй╝╗┼_"uщнПёЙЫю#╞╡╫^█зOкn dЪбb_¤╡в√Дф!.╟Эw▐ЙxRdК▄И)к5 R▓фH╪EжШ┤$Xy╓,┬мY│цщзЯ╞┘#▌[n╣EО=з О╬З+о╕"╧Ь╖U°Ч.]J┘ёў═7▀ДEЙэ 8SyсЕЮ}Ў┘чP<E)G!╙нР3#sЎ└_╕pa╠Cёi■RЙПд╝0NїоP:*Ца| йV█╢m├ё rgt 2 /ї╫эu╥M╩еr)ЎЙ╬ Ў#UUф$9#╚Y #Б╔ТЛя┴_┬ єЛq q*╧\ЪiL$│HBк~IS├Л"Ы╪Й╖¤├┼_¤uqХДT#Hmє4r─╞B■єЯ №Ў█o]tEЙЗL№P a├ЖСAlцгП>ТVN╞&D╤ВIYИЦ°@ы-+qдeпIT-*U╠°╨бCЙЬЎ&кИ╝╦ цю▌╗╙D<°рГў▌w▀╚С#1ь6m┌<■°уTI2▌╟/R┌є;P├1Ц3╥!R╣═CJVцюDУ"ЮPyщбф│╗4╒g╔пШz╚pПЖЖ╞┐╟IўЧ-[&Э┬Ж Lы ╧Бт учз┐■·k┬Д Bў╒═ь/▌ ┐|╨}K&э1c╞tщ╥хЖnШ9■|вХ^I "ЇOЫ7oц!l■З╢yB▒ з!╬ыо╗О└ №i√ЎэBwК+a╜фТKBvB╙╡Р/"$╦фО'gЯ}vп^╜Ж ▓n▌:╪ <°╥K/%цло║ Е@4_~∙eLЗ╝)RДТ:ў▄sе╖#G╝`┴║I^Ф╖дў"┌╥еK├\╤dЮЭ▒tф░.ФГ=№°уПх╦Ч7ЛВ└╚╔`Е f╬ЬY▓d╔їы╫єU(~┼К%ЇЙР#\и*rbм─брРAh┴Р╞╙░aC╕O/^▄▓eK" №є╧е╨EE~°!╩╟ы;vмtчB2Оn║█└?бЪ¤Ё├╪-■╣├Н┴Т▌'Q╕vK╗ў▐{с╟bo/╛°"Ч]E╦W84╣╞А▐иM╖▐zлР╬>ВVBт╟┬╔б>BА$6L йи∙HЛиyцT *SYиьШ4ЕЕ% mв╤ h%╦┐╕ИTa2о <ї╘S╝.ЎCлД▒с┐ ├Ябr!═ЩЁж╒мYS2Л[°╠3╧ ╣bНvХ*Ў""╤ ) ┴в"_зOЯО▀%YP■╣╨tъ A#h8l╡DЙX|Wy&(Н0T╖╬Э;┐·ъл{ўю┼`0Wъ`йRеИКкD∙B╗16┬PЪ4т╒лWзdй_X&╤ReИ╓Ю,u┤ЗЙ╛Ў┌k╥xв┌~%утKSyQj!№d"ЖfКDхP6C*Ъ ╝шUлV!O┘▓e╜оЭH5j╘Рё~╤yЮB╡║уО;h(╚дЩ&┬p╝Дб8xr√э╖c▐jVd∙Єх╧=ўЬМbЁ?Б╫ёHёЫo╛┴уХR@єШ5В&N^GKhUНйгъE,~bE 4╫"OЫT┼*г√п╝Є ═VMЫЙ;MыЗ√MSFуCЬjоХWР gF∙е8ч╕R/─╬1rФ╧ЛHв<╧q!┌╢mK╔Є -$OPХЯ╝`█єgЯ}FgЭuV▀╛}+Wом┌jMў544Муж√┤╪┤K4■4╬лWп&╙бCЗ╗я╛ЫFШпtФ_~∙eA╥}~Т@сd═║┤Ю°┤Й┤Ж0b5Я╣:·ўяO▀╔╚═иQг"╤Н╓н[╙ў<ю·ы╬=х╞Нщ╤&═Ї╙O?╜rх╩+Vь▐╜█p·~д-Sж Jh▀╛==·╛}√Ъ7oЫA╦Ч]v▌-}┐DXйR%╕2}▌s╜zїр2^K╨╡_s═5РЫя╛√Nш>=}Щк[╖.2 ;i╥дO>∙ДюЗТV ╔ж├Ж┌"$,Р┬Уч0]z╟кUлЖ(Ушй░KГй#'4ZF╬Р┘xN║─I╓p]шbС┐pс┬ЇЕtН┬H0■щзЯМрhиу─ВиаСМЛ │╟┬И╞& rLgХ╬¤ў▀Пи0{▓ГH9#Хi╙ж╤Aк╤╓9sц4j╘║O0r─ЛнZ╡т_╧9ч5@И3А╜б(d#]▓ _─юсLjд╗З)b█(t▀─№ЩЦ;ПЄКZАФ#N#┬@Ы(w╩Е BбcДТ/шдГ,^╝8J▐Ca┴\Ы4i"МЯLQ'!ш8Pу═▄Е^їд4╒ЪБ▄%~!#6Xt_ ВCИх@ўk╒кIfE6rЗЕP╣X¤Jйя╕X0'ТаВ?╒КvА╧Vp╣╞Геuщ╥]AФ┼╚%ГФ,Ап ESsMдВm@=ё╖й2pMXХ╪ ФЁ]ВСиUTXBb ю┼<'ёЯ)мФФb3Ьёoj ╒╧A╪9┼A61Zj(u|щ╥етq!$vu▐yчQжШ4═Сc& ёc╧x╢R┐d■IhЧy.Г═№d}b ▐э╫пн.ЎIC єЖ,т~Р║T=Zц√ю╗JУ+5И`ф┬pн#RmmЮШ|VsA╣RK.pМa╠нZHqя▄╣БёmЁyИЗРJD3ES)zгёD9TF\x?в~№ё╟|Рvє└╖ArlX┌%мЧЖkD0· f╧Ю=╘1■^|ё┼$ЗИHj+Ч,H#∙Ъ LN┤'│|фЫдhZ┼е!кa├Ж╤ИTjБ%EOыAх┼Яз Р мЛиP┐b6x╘)╗Y│f$З)вj║пббa7▌зб Аr╨+▓9де╜ё╞iФhС╛°тЛж√0*╥9r$Э7Э.дAЪEzwЪ┬╟{ о#ёф▐dg-/ 7пtъ╘ ╢∙Лn@ 'OЮ У╛э╢█B╞┬╒Wчk╫о▌╘йSщЗшdЧ|Н1т│╧>{Ў┘gщe 6wю▄Gydэ┌╡┤■/╛°"Э┤мlБ╨Э╨╟tы╓ jB╟5с+]8aаtиoБ`░└ю▌╗МЮu■№∙ n╞о]╗о╕т :x То▒Z╡j$╖h╤"┤JзИMЁ║м╨B!╪ў▀OЯф╬▓An`*ЁГЧ^z ╛b8уж─CЩRFCg╠п╝U╗vэЯ■╩Ef )лЬ╔ХL2HзОY<Ї╨Ctф╝Лї╚╤ЄBаЦE╡╓└Н0 2E/8`└╪·─G║Ў┌kщ╢!gР▐еЧЕZёк5╓XЎ-╖▄B ╨kХ(DDИ ╞П▀╗wo╝PЬЕ#Zw л╕╕(Cj┴мY│`x╪ЖA╔R╨Р(аPh=╠Х<╓йSЗЄТт| √}√Ў%┐B1╩╦д d┘ TПО;1qтD|╦╟nEB▄Q*ЦГk*ыCp1(\╣X▒bСч┼вF∙Їщ╙ё Е0СКВю#│щ,гЗюPdd Wkжёc)>h^┤,╢бZa╪,╩ЕРT1*┴.\╚OкЁ`4C0ъT█юНбzтQPю╕мю╣, !iяЁ !sЄPWx'nJM▐йвЕ&КЗ└+─Ж╞`Н№К JY╨Юї7ХR╩╘тЧБ^Дзd!ЧdДH°Й║├ЩЬд┌ТЙЦ+WОZ/╬│м┬$f╠e" Ю MЩвц6l╪РДdтBМя╛√nмВ6ЗVz▐╝y╨J┌-╬│сbУ4уxїС/Wгe├\▒ ╠ХwХ═ШY79а:Z0<╩A кб°H╪$gПв!RсеТ0╪═ їВОА$Iю╚/z& X:фЧъ ЄSю8∙0uq─f┬╢6j=┴иe╘n1╘ЛЖЖ;wюМЛECКJk╘и![Хn╜▌=ў▄C╧Ве 9е(1?щh$1`>УA5║П├LўЙy╨╪R·(Я~ЧчфИ6 ╔▒CtE]├ЄiчСНrW▐жж√FAм▌чНOHУRкTй▓e╦╥"№b7▌зiB/`№еo■▀ ■G╟м2F╡N.Вd┤┼░УHVДt■Н┤┐a╖▓ е{ж╣ЗX└?Д+╦PЭ?-Y▓ф¤ў▀зOв█А▄└r`fРд│╧>[·TOп ╜а3Г▀OЫ6нg╧Юp;Yu#╓├B(/╩^Вo ·l╙ж чЗ~xчЭwЄdЇш╤╪ ╢$k╖дfmp@╠hw"B/Ъ№R╞М#╝\ rCJMFu`n$tЯ╞УЖ.cЗ╘_Имхмh'Q╪╓н[▒aъ ┘'~F╣У)Y╩╒зOЯбCЗ"34▒LЩ2ДЗS╩(Б╪и#fpW+TZЖ JУU(ВЬш╛hТhv.╡@┌№оп┐■Ъ*Cxbг S7aР╨5Им,@т]√юТ/┐даЖ"0$├├ЯзДdCўйз<|уН7ияTd╛в"╬СЁ e.ЕzJУ┬Л╪'Я)wМУЖ╟█АL├ЖсйТS╚=ХФ·╦Ф═ HBCMuЖ╢"m└╡X-FR+╛r/Pи9╣C ┤ИзЮлYYi:Ь+┘╗э▌╗ЧR&╦кaG ┤?~ъйза╤тБSСo║щ&Y╧╣G3Ї╘A║уО;▓Пю╦╡pH▐дIУш]шлd┤Ux-▌<мЕFЯn ^B√■╙O?}√э╖ 64Г%Й ▓BЦбh;vD╤pntH0hзГбт9¤7]Вьёї8G╤7o▐╡┐Ё┬ (#~$$cNBцд╙ХEЁx┘щ>▒╤Q┴рЛnaўю▌P $Б9з@┌ АЮХ ╥ AтelШ &A`ШфF2ЕлC?НУ+"д"·j├nTCу▓╢√хЧ_&P7║∙вEЛвmEФСS!#(НюVХ╕Ыю;З]оFT ╝√T╛GX║ПРш╥░j╒*╚%xсЕТ#qG═р╓╧№ЩЦВХї СЬ2║ё╞й▓Ii▒ЗG}:В])▓▌[┼B° cxын╖╘Ц oЁ°&йH>j╘и[o╜╒ИршЙR8n▄8■╢l┘ЫЗ░NЬ8Е@ў╤[Ts5С╨}╠ Ыд)РYйkj_м╘2j5Е4@╚AзXбьг^а:вВ2Є╩║uы░МGцs▄mЬ\Ф%ЛИ╘├░t▀pИE╔╩1ьPt+╤JХБRХ0ьнZ╡j8ШЯФгк╣Ш%dn╬Ь9еKЧЦMЛ/&╘┬O▓ЭН┘!пP^°Ё]╡ъF9К"?п оС!Pпк PLЇI-╞┤ф@*Щ╙CH°%оEH кv?# ё╟СЩVЕ▌WХK}аt0\r-╓▌зR?ё─H"сб√╬ЫМ,оcmd╗∙╗я╛ )7ГG▄╚В1 I5yфСGTЗХ\жeФ{#!√ўя▀лW/й_ТоZ З¤л#к╘!Kк ╙┬а^<(~B╝х╦Ч╙r╥>Л#>!]$Я╢W еQ.3f╠Р%mw▀}7■->$Н JK+У▒Ъюkhh╕q№[uхЙ{С╝j╙И╓}2O╙}^ю╥е Н╗s░┐o ■¤ 8p н-▄┼° ┴dУл EBД╔╔╔DH_+╟V(`e=╧a╟ОРC#шї═мчu"v@o]кT)5wсJУч╨щфш╠ш#Q !E├#╕)▄ЕЗrBЛхЬн%"  N)─╚v▐h.Р\Ш╬~АЗ~°╙O?ечCQ▓L_ЖZE*ДДР;│╛}√╩╜H2LNб└╖P | й(,4L_├Р6 ym▀╛╜Z╗/вBЫp╒(х*Uк@jeUо{x;╗a[┴cїоє╠жх:rQ-╓Е╪ш▒╒╣RfЁ╪>81F'ЖЪ┴╡ц╕+ЁяП?■F"kTPмЧUv}╡ЎАx°щЬs╬╔eрSAьR(kў)Ю└;ё╛h Ж vя╜ў║aN%л╓NаT╜pсB Fm/цW┘% Эj█╢-╓H╜гXё*Tиа,AХ;!А,гfёх╖ю▌╗7┤Т╝SХаГ▓n║ПyРnП=dв└▌╞Iqcx/jхЙьб╜Гoс@*╖J\VlЫъFХ?ым│ФЄБ*Im▌╕q#ЖД╒беЪ5kЎ/ ╪д╓урЁ#6вЦ-[%РюТ%KИЯЦД.║ш"╥е]┐~=ТєО\╖n▌ЁФhЛd}О*i ё╝ШФФД?LДe╩ФA5b нD]XФМ+Y&ПxG;vDэкVкГeTQцYUб√$НsB+GХС╙lх' ?Кtс▓4#x_╨}и}0- LZ0L Уж╒EE▓P╣U"█{я╜Зmа█╬Э;╦OЮр1гЄБЦ ╦С╧╣╣;┐bt=Ш"y┴╢M╫∙ШгrН;Ц║ █╕eфB+Qa║┤*CЖ ┴┘ж и4╤r&ТOЮ<Е@ўi╟d▓ЧтF- й▀s╧=tФ╜sчNфзuю9йb╣О√╘╨╨°Ч#tЯ6G╬~\╣rев╟ю╢QZ3Ю╙■╨е╩╕Ю"┤╟Eў g%7$ьУO>б3А╛╨1╚+Л-в=е╜гєж_ DvЬ┤Тt*╚ ╡%Є╚_tГюAЛLУM7ЖHв_Ъl:зеKЧЄБЮ Н@┐шZш┤j╘ибц┴a3<бїз ╕ь▓╦PЦМю╙%└ц+Wо,┴╞Н╫┐╘їцЫoЦ/_ЮlBЭщ р ф└єЦ-[╥╖╔╕╡:X·п┐■"щ0d'Аt{т ▓Ё╝e╦HyJJ ▌'Б╒ъще>№Ё├W_}E┴Рd6N╫█o┐MЯJ_ЕBўyл~¤·чЇ Є%fwA ИОЇL╥-нY│юЕЄQQс┬ЕЕ^р?╚┴|ў▀?~KЮ·mя█╖П.РЮЗч▄s╧Езку/╘H'ь|¤ї╫╔8╜i╣rхxИ{їъ┼зo╛∙fBв╪ў▀мd╔Тsц╠СїTЛ/Ж·╙7г<┘З вМЁ ф■дFЇ├N7ёРВаайQ0u╩╦г╣╜й"CidSv╦j%F)ж╗ю║Л,л│b╘ш>_!╙>ЦIждЫ╬┬0Ь╧╡k╫тЁрЫEHўЙЎГ/!'єИ■б╘╧<є E ┴╚дPюьP╣ЧTД-ZPиб╘,)D|* $л╗°тЛ Гw╤п_?°(╧йютж%Ъ={6ТИ╜Ь│╝h(р┘─Ci.X░АZ)√H"╫CЗЕn>¤Ї╙HлдВ╨#? щ╥е ▐й:OЎ╧? ─рWмrжx│| *МКW(┌SIЩ╤9EАоyф<Б▀~√ ∙Б#дЬЛ╥zрFМч(S╤B!№е╛Уn┼К▒ZQ─@E8Б┤E№ю▐╜;6щ╓3~)Д└rХuUр║PIe└[ш>╤╥:I═Хт r┌╪█o┐Э╞rbj.╬- я┌╡л╪|ЮB▌В[╝xqdгйФГMe¤=╬ JЦpiю(Z╤ЖР`ФЙф╪*ТK╓(GzZкАLRй1r)ёUлVбmjўуП?о@рг+╝╣и1BЧ[yz▓ iмМрВй°?№ЁГЬ¤тЛ/╥иRаС$k┤Д┤╥┤ф┤єxьp}rК&е^є.▌ЦF╦ГEQ)z:0ф$┬CўЙчбЗвй─╒┘│g┐╩Nб╖┘hhhЬЎ╚▌з}г;█ш@Б;69ёМжo┬Д jИЁxGўi┬Ё3ш╬щSщущМ!═┤zpG:zDD╕)м"к╞О╛ЗжЦдщ╠Є╜UЧ▄NЭ:їХW^∙∙чЯi|ei/Ч-[FГДx╔Ё^╙жM╤$/│╔АfЭ.№йзЮв["│A9РДМ@╬d╠R╝щ║шcМрЩШ╚ +нUл¤4▌9Эd]zG)iТ▐┤iЬЖ2аc+]║┤╨)z)4)гAPv:К╟tОжЖ$Q:╖▐z+2╦с?&ИБщ°!╡G√Ўэe│z№°ёЁд──D║$!Є#F╚ЦP┘1LMIСьЗ▄╤й╙╙╦V╬uы╓AўKХ*EЯ-╦Hy╛·ълДД▓\╡j╒▄Хoп=В|@&°Jз.b[┴SI ╩╟WЖRвL$J╧ Ij╨аЄ╦▓iЩ;BZ▄╕ ~JГУQ╩|%░P:X2Э:6Н*n╗э6тwП,Т/Y0у╢mи ╬╤b'°№'кU.`┼Кx┐╩зLIЭЄro>БF@5 RЁHLлSзN$!У?╪╒фЕ^└PQ┴0]ЮQ*ыa,g█1╥┬║p;=С─ЙH2ЇI}$]4LЬИJqУt╟Оq▐ пP╠\▓,ЎIЛCБтбdьV╝>╔вCh▒░:l╡QгFT l╟L]╚Р*Ў╧г}└У7Г▄б|^З┐╬Э;Wv╣Ьw▐y╩у┌░a┬cN:tpп/з]├MBШ▒c╟┬║М%{ьgэkбЙЦ▄С║дKх┬У 8╟уМa4jЄ БЙiф№YLK&Еp/ЙGО╧з>┬Gqк┐ ■{▄┤БуD 4ГшРЎї&%%Iгюу=" Х So▌║5▒QpюRгBбХ╪Iр/С ЄHССYRд2RR┤!MйQGdc║L╓a!иСMцЕЄ4ZФГbIО"@r%~▐е h▒FjДxщHHc~╬9ч╚B2╙9Мъ╣tщRУХ<╦Ч/';╚F[Бy`$R─|P;Uдg"9╠ЮЖФЖW╣Ї)TgЬЇЁЁ├G╕¤@А]MЯ>(A О&Ч/[╢м{■НюiЇш╤uы╓ХZ&╢КmуЭт╚a╞иypлш╬h]х°|TDЭ┼ б]в├8Q2R╛иK6[S·╒Цп$AпLr╧>√,M┴ёLSkhhЬN╚▌╪w╞пь╫пЯЬ[ЭSx∙@лEkF╙JпQ0г√╥├$ш╒DЪ3!g4О0ьG}tёт┼Дщ╙зП┼9ш°i%СЮnТ╒╗ ч╘\С▐╜{├E┴УL°@[╧r.R%ГжcГХR▄Їёc╟О¤ып┐xЭn в ╫W╬fG:uб8Т(ФёИ9┬Г\dССь╪▒├═їХC╤Qг√ТКМёУe╥нRе Bо%їкLQь5КЕ@%E CЦхL+╕вWhЗ0П╦/┐═и╡+┬VйHDBОJЗОЎ8)@<▓fN цQ░`Ўь┘P∙U$!Ш=e$%aЦ°Н*з▓лDн` СлаМЬ▐╕┴+1їTek─-ГдТтЩєвCх═ЕФи╤}ZмZ─{цХ╢m█кIМ@p[Лщм>"№Ўэ█╒Є}▐Vg╬xВ;)ЙY&FИлРЕ°jqО╝K╣уB╕з21EМДZ└g▄ь_.ПS█y╬Ўw╠)11╒Х)S&▄C<╚F║▓▐йxётx░=╡=Z╢ът╠°сЗ╨\┌Fd└╤%╖▀╣0ЗAО╗е┌ЄЬЬb└D^кT)rAф╨qjYЙ%°ХDЬ4Шю▌╞┬2хV к0ЮМУ4> QA▓э┌1K\tвХ√д┼nх ╒╢р╔уоо-(юю Bъй(─r╢SSГ0▄w╖$) /┬їeДBтY▒bЕ▄3екАИJб╫мY╙П№D°/╛°B╢PKaAўхje0f JЦ╧й╓]Qа╩эQ╛up▐╝yjЙA╟6$-КХт^╗vн o9ЫCИПСТвЭдтр╩КЖ∙К╥│RХЙ┐З╗B╙НAb'╛Ьjp444■х╚▀ш>э=`RRR└u[д═▄╜{7 ▓yP-m╨}:!╕jБf└u4бщ┌LUc'-мDТя9Pе═╡кL╣spЭеш╣4В├ъ2║/Л5ы╫п/╠I-кvoЬеЫф/}▐K/╜DЯ▌п_?9K^НjKК! СЯ╘`┐ъъr╔Эщ:^F4!OРЄ╘зOЩбЖКйьВ{Uf╒`Ю▓ ┬wе rai╩РdNЬCх╘▄еч ▐hгД √в\ьVС√л√jЕР▌qJxъ╞;я╝Рq╙|█Ы[Б!гЫn▓яJ4Г+B╝ w╓╘вчhчb╪*rU╨╣РХ╗▌║Л ЧЕ@*ZYW#mЕ;Ык╛+ktч╘ 2уО╩p╣d9U╖С╗┼Уxмро_q╘∙лZ0M┴-┴+├ГфЙю▌5f╓#/Нм7╙оJъ╢pеIеX5▀к,AMўЕdGНВлwН`нw╫хи,Dи8PСлЖ(дЭ уn7Фyg╧а!PТл┼3╤Ю¤хV╡╗хWУ{!:├-ПхЪ8uЧСКV¤фОSх╫Эо╩О;┼и╝444NWфГюЫ╬╘:dЭ'Р■ьБUOg8k_ЗJ`┘k?▌з]Жы╦аФЫЫ║B╢\ghD╗.B}╬w+й─бъл╗Ei╒[J┼VpЭ╔[o╜5l╪░]╗v╔╣?№░┌╪*ZBПo╝ё─Г>ю▄╣│EЛеKЧ&0╝▀╚zъKXЩ▌|1Ok░\kR╖o▀>h╨ dРH0&рsўю▌|Ё┴Т%Kс(Q╪╠*Yў}╗%╠УO(ъfd╜Є3Ч\Ы┴Ы▄O┬╛╠ЙС═ЁBЄлтT┌[▒b┼¤ў▀▀╡k╫О;╩с▀╣g-'╕═^Юdwt▌╬Ю[`#Ы■ ▌yХД╣╢J╤нЦЬJ╩ЭпР,ч.Швн*wr!┘tЫ┤;┬░MКСCБf2╗Д╩ Rпx\И Н{ь▒╟иЄgЭuV╙жM╦Х+ўфУOк ц/ ▒pўCw╓T№9Yжz╫¤UЕ q┼UШT[Фgї ╤O╪╧J #ЬMfwn ЧЗрО╨═ЫCв5▓∙ъХhН<'сCМMаЬ=#ы0ANно╗hBК>{ra_7rоY *фГю╬╔JOСf+x─j■дК n ╟═PC№Iў╔!ў1yВgЬ╗Iк\еrAШ<Ї/+░\╟Г┘N√ ╕о r╧ЎDUXnO╪ ▐l`╣N_ qП┼nYп░НЎL[ПыРx╙u╠Л╥Ш@| ўaJТЬ╚тЙ╗е╠UПykhhhhhфЙSПюОПП7В}z╡j╒"ё╡╘>Є` ┐■·лщЬ▐·ї╫_WмXq╓мYEЛ¤{ш╛┌1uъ╘╢m█вУ~°AN─ч∙Ўэ█1н═Ы7c═T^|ё┼Ё╤Ъ5k▐w▀}Ж├Y 5'?~Ї}╙жM▀}ўЭдRгFН>°аJХ*J0ЄN═ЕSEg╧Ю э■фУOЄ7║╧_▐]░`>yQл╝pе▐ ¤лп╛Z╪?┴Гв цЫoPа єгРЧ_~∙ЖnPЙК t¤ї╫у9LЮё┬БрFЖ╬╛a├ЖЁK~Z╝x1Я╙╥╥dхLя▐╜Я■y5rьЮў╖\wаXохїюЕ(2╝Ъ}НБСu╤ЕRP╚К∙i╬Ь9╨Э&MЪ╘кU╦M\Tr_ШХї╞5╩л■оЩ ўКў┘y64·клоВk*m$&&Bўyшq▌Е!▄b├╥о╗ю║-[╢Ё╣xётх+о╕"ТHР_єPj09(й╩#4bКєЁў╠╧╚а√║uыЮ~·iиgЯ>}┌╖o/Т$''ўя▀ф╚СIII>° цКHKЦ,7n\┘▓eЯ{ю╣ №ч?Rт╦Ц-#ёёёг┬'L├~щеЧ┌╡kзКlс┬Е┘%Jtщ╥E.(Ш1cЮ ЛХЭk╫о┼z'NЬX╛|∙╬Э; ч+BФ Й┬╒* Hr7d╚РG}7ь╢█nУы╪ЁжHЭиpШ┼Д°L╞▌Лdа√гGП6Є╡[Аn┐¤Ў▒c╟т>5h╨@Ц▌У(┤Юь├°╧=ў\Y╒жMьР┤кVн*пCш1 ЇF6E6ёэЙ 7█└ЙR6ж╫єhhhhhhфВSПює╙╩Х+_¤uфU▒bE 9┘╢m█иQг&LШ░|∙rX< bдШ╖Ы╦ `I┬═°Н qW█┴═┴j▒ЗвуF╓╡щ! ЭХFD!╦BV0лЩ еDўёЪjє▒zвJ┼Иx┴Тш¤уП?жфРч╚С#Ё╫={Ў| ¤ў∙г√Ж│ZГwэ┌5`└А╧? ╝qу╞_¤5╥FEў%√░╧1c╞l▌║Uo┌┤ ┘*Uк<ым│■2'║%▓М■нЬв▀~√ З Q╗uыЎфУOB·yИ┐Ў┌kу╟ПЗаOЭ:Х_╖o▀■╞oLЩ2еk╫о8Tв}я╜ўzЇшQ╣rхW^y╓K0▄-(5Y{цЩgЖo@q`лo╛∙f═Ъ5eHЫ°й0;v,Sж╠Л/╛x╟w╚р:С8Ё╟ДьЎъ╒+Є┤│g╧&╤╜{ўЄЦ,рAс°0DОWГЗC╥X ╛▐й╪╪вEЛ(M~┼л1ЄEў∙√хЧ_т;QЙ_lьзЯ~"]9Ао^╜B┐чoЫ6mф9|Oр■√я/Qв|и~¤·jЭЇК+pTЬuы╓m╘иС╝╤цЫo╛Y╢lЩ,YоRе |В°'MЪ$Y║ыо╗╬9ч!▄┬╣с[єц═ !Р▌:uъИ▓╚эЪ5kФWYф'ў(,щкї╨P" ,╟Т└Нj╫о-▄> &Ы /иZ"√Рї╓н[├Р▄+Єs/BБxд╤o▐╝9T тХя╤}├Y╞є╬;я@jЛ-К/ё╨C%''GNў│╧║ЁFИ╩Ч/л+Uк╘▀FўQЛ▄kо╣fц╠Щjo(╞з╟JqНJЧ.н№C|Г{ю╣з^╜z<ч╔т┼Л╗\╣rиTn>& yщ█╖/■~)с)т∙єчуN`БXЮГDЕ╞^}їUЁ<Ё▀ ■I`Ў6!yWОТ=*={Ў|ў▌w_p`d;Ж5'ру]P:╝ы ^В&╔н_┐~─Иў▐{пr&EсCЗ┼o┴х└Н|╤¤РЭ┴RЁ"рёBў1`2╒┤iS┤НЧ~╙M7I*А\МZЎ┴ ЫкJ№┼ЄqЦ>∙фУ:HxMў544444r┴йGўЙ711╩;vьXШ¤ 7▄╦,\╕░с╨¤БBЫ ╨еKсОPFhй,_╛\ ГК+┬G  G╜{ўЖcе9рa╦Ц-▀|єMИZ||¤ЇS#[Х─к1{▒vўswKб&─@mЕг╬Ц|o▄$ъ n9пуJСS┘iгVпс&╜Ї╥KBў╒Z;Юуl?∙фУEК!Аl╨t_CCCCC#Ьzt▀rо┘{ўюЕж╝№Є╦╖▀~;МJFaб┐Э;wЖж└$xB┬0u┬└Ю{ЎьйDДx╜ ■√PЯ╗я╛NЯЬЬ I:tш ■ў?dHJJBDh a*гFНВФ@¤Йy°Ёс>° ЙЄ5!!╜@Шрj╧? v+в=╚ыo┐¤vi╥дь╦┤╘R.9jjО1Тw▐yQ ╢d╔ТFН]|ё┼ЁxмHЦЎЁ├у╝ oЮ3g╣лQгЇKSeyЕ─cZCЖ qпQ┴c─╙а:aэ$КeтхЄ ▒┐■·kмKнSщ╩T@зNЭxWш>^(С╗O▓з°&OЮ[m▌б√8i═Ы7╟"w╨}х╣щ╛"юRС░Б_¤╡KЧ.╕С№┼8QЛ\0є∙чЯ?Ї╨CfЁЦ╖╬▒оо]╗цэ╖▀╞ёДqМ╒%╟CўЯzъ)|<┘ФтV#aИ▀/дЇСЬj╚bC*╘°ёу/╣ф#Hўi&F&($9Mў544444 з▌Ч╤}╚┤`ўю▌Dх╜√ю╗я╜ў^ШP┼Кa`POY╙,М9тууC2)аVph=ЕU╗vэЁа#▓рX▌И$YВ╡р?|Ў┘g┬< ▀░╥ЇЇЇf═Ъ╜°тЛ▓шBv┘J°'Я|ЄЭw▐сзР┼^пЧ)SF┼vt┐zїъVўR%7▌7\C√+Vмш▐╜√С#G*WоМ93o╣мS ╓мYгЦёич| pщ╥е∙АЭрbNDОcм▓Цo║┐a├╥UЮнzNZЧ^z)Iаї\.╠iч╬Эфєаpk╒кeщ>ЖДу-H ╥t_CCCCCг@pъ╤}тMJJТє+eЯыЭw▐ a}сЕZ┤h[0`АРfB8 ╒║ukxТсbB"+,║yТЗ╨}ш┼<Ё▐{я ЙСqt╡╡Qа╨єЩ╝┴ц∙Мvx ╧┴}╪С<·шгCЗ┼Cxю╣чДJ╥╨╕ц═Ы╧Ъ5k┌┤i▓L\▐Т}·ЇБю╦кeГ╞Нг/h─╚ ▐?·°уПC▌Р∙ЩgЮ1"8Ь─}в(Яўя▀п╓ю╫н[╫r▌▐кД$0,ъЖвф╩зР█aa╖ ,0ВГ╩VЁ╬╫"EК№Ё├UкTQNИшSю]Т╪,╫╝ю┬%Шl╒Ею ¤ў┼ЛjыЦ DyауФ t*й4аш■╢m█║vэJ╛┌╢mЛ[x■∙чcДъ·*─[║t).O >зlo└mуEмt─ИДДю▀p├ °Яэ█╖ў▌w╒Є}Yv ¤ўc0b ╝ ╫шбЗ(}╝И &\t╤EFЁ╘&3xOнЫхЗшG┘,дX▒b$г╠Ж=c╞ (uзNЭ▄~Вм▌ЗюлУy╘╕╗*))ОРT6м╛*╙R┬аРЮ={╬Ь9╖Р0╕╩|ж&Rs╤М╝И▒╜ц`°ЁсиNeYтl╒кbгO╩Ko╒╒╨╨╨╨╨╚з▌Ч╤¤──Dб╗wя■°уП√Ўэ{▐yч┴ ╞МSйR%9╣Ьф>гIУ&╔КnZ╡ВкЄ░i╙жЖCбрpЁr°п╕Pч`┬Sa╪pA8YЗ gЙ┬жMЫxoГЪ<ї╘SF╓s6{ь1╪▄▌M╩%цEЛ┴Q═█o┐ бWlеРЭ:uъ ╞9чЬГ▓р@ .Д▀╚НкТt╪░a8ТhЮCрjЩЗФУ╨¤5k╓└_I╦╠v═_wь╪Б╪фСъ▀┐?Кu'DАЯ■ёмрIЪ╪R3┌h┘▓%ф╥-i=ё─Д/[╢,lX6│f?нIЦ-[ЖB╩Х+▌ЧЙ%∙Й╗SЙ╚GО∙Я №зУ╥╧║uыV№@LЇн╖▐кX▒ви┬rm}Fud f,ЁъQь■┘gЯ-_╛<е|ё┼єdя▐╜├╠j╘иё═7▀`є$с~ї╒Wы╫пП/ √Дpє .%юБl+Wє0╩_2"8zЯZЖфя┐ >╘Щ┤$Ж▒c╟R^фЛT(╣eBвхv█╜{wь\о┘"!╣╩:Bf?{Ўl;вOн─kэ╤г╟Ю={Ё3лWпNZ╦Ч/з",Y▓·.'ъ╩\ФZ╡jб╖RеJ┴э┼╘▄q╟8?Д╟KqO#hhhhhhhd╟йMўE2╪ЎM7▌YБ=╠Ь9У_e`^╚+t╬ ЫQ7°┴├√УУУс40<ьтО00l╚ЬМG╓н[╖Wп^jTТ'pг>°аrх╩чЮ{оЬ█├_^\╜z5tM8=>DMh┘║uыp9ИЁ┬ /тИу╤╝ys!j╫]w▌мY│j╓м)#┴▓&ZМ={Ў─АCC╚> №sФїБЎ┴∙x>=pр└m█╢A З.ЗКц╔┬о]╗Ю{ю╣Н7в%\И#GОР:╝Ь╘!ЪrРи\╛}√v<Н 6PЎx(╨╜jHж>ДnТ\ъЖ╠ 6DB╪н█eТ+и╚ИЬ░ щйf є╨Cm▐╝ЗБ└в`иBеЬ╨╤}▄Ы ■ў┐ФoЧ.]zўюнСS╛6wю\╛^u╒Uq%9ь╩╒T<┴▓╟П╧╗Фxм▐¤ї╫_;wюМo&aф╥84 ч]aЁи√З├q┼ы├Д(zЇYдHВaf(С─░osа╞╔S-─ЩТТ╥п_?─ге\╓п_П╢GП-лh з6с0уЎА2Erк├хЧ_╬WЄH¤КJЯэ┌╡г┌Уe'^ёop@-а╛Р5IоПcМZhd`э┌╡T╥УSg╫╛№Є╦°-ў▌wпPпїн║╣у╘ж√┬JзOЯ▐║uk>_}ї╒╙жMГН /Ба╢0√)SжРШККЧк]╗6Bє№є╧┐ё╞BЮ╠р5[k┌┤щ─Й╒"MБjИ"/cНpтЗ~°╥K/Х╡m█╢ЭЛ╖`D<у!bУЕ╖▐zKЎЁДIжTйRj╥Оs▐"'О (▓kп╜6*Хт▒Р┴9sц(╜NSВ╗Л чЯ╛ЬЧрWS ,Щъ╘й▐^о╡ЪpГбVт|~Ў┘gнZ╡Т]7╤n╤╨╨╨╨╨°Wс╘ж√ТБффф┘│gєЩ╫a$юpД`╔к╕╡;?W^ye╣rхМр└3йKHux9aJЧ.нv╟кu&P[бz┬їЕПBцДМЄф╟Д╠AёЕийZф!e╪[]Д`;vь6├+╕ Ч\rЙ$J$sч╬%6x$?5n▄°ь│╧&╬%KЦм_┐^┬╘п__2х^Дв. ёЎя▀пЦ╟и5<їъ╒SL%√ЖWQN(ЬдЛ/┬╢Uю(QИ6!й`+шнh╤вnй╚>Jжьр╙bOюНЮh■█o┐E6╡@TZдHb├Hмy┬:ТРоЬї╘иQ#╪н╪?С/$з,┴{ЧнрVь°°°%J╚ьКЧЖR├дMg▀*ДUvК[┴ЄЩ`єц═гdyHЙ_v┘eзД┘╛};ЖБНй╔%ё╡ф3БqНФ╗ХчjЦ@Ё чн[╖Bмх+Й╩МНЫ▄уп^╜Z╢X(╖Щпф█Л\ЯbЛ-┬├$*#╕ТНи ё2cа╢dNщ/]║S$┴эAu*уVp[[┤hБЗя╛UW/ц╤╨╨╨╨╨╚з6▌╖\ЛзЕЪД╝e╣6\║╔вzQ}9`─2$OЁ ╒ьЩ4]╗r▌4T╚УДt╟6░╝пJiG}P■ГFmXt{Оy+UД▄Лдв ┘p)БХlnй┬╞пЖ╜▌{j▌Б%!yЎУd Зє┘╪ЫЪl╔^F ф┘╝yєo╝Б▒vы╓э╤G┼╥T╥!в║ЯДш╙Ц╡√'їо╥Пт¤ЖCВCte╕ ╞¤P┼Хчг" yyЎЪb .D┬S4▓ю7▓vЎВV&$╒─-Й°co┐¤ЎаAГ┌╡k╫гG╝\Y∙╣T BЬ┌t▀╚JSМpчУ(FХ}dZхMщ";o╦ЕLи1╤Рxr╥ж;~w`с4КщЖpJ3╥=0oD├№rRЕ█o ╔~HШьяЖV╛DHAи!$8─╦о(├U'Ъ╪╔СASжLi╒кUГ f╠Шс><>ЧьЗeъ!?хd~ъkXO5Dе u┤С═mpзШ=П9Uл<с.ё░yы]gяоЮ№m▄╕ёЬ9s╛■·ыц═ЫЛIД дббббббВSЫюЗеY!CЙ*К═Aю2РйЖ╥╒W#/╥o║╬ ╛═a╪Є▄UoWх$Cю,▄ w0╖TюДЄЇXrJ╚=Выцy!м=wъь.Оc╩щХВЕ╕╪сД ╩Ц-{є═7 П [^j┌'$ЫкЇC6│FL┌]т9▒єиTб"t[мо─│╫#ВЮ;▄йdЯЧ╚^ЪaM╚╚Zнx>n▄╕ффф╓н[Ч+W.┬ЕL rЬ&t▀═fBс8qNЬ;, ╚>╬Э╗▓▓gЖУ╙Oю°нрв+╕╝┴ЭA+╕o!ЄC╟▌к╚Й\fП*dJ!┬Дr Ьз&├&зTЎХД{ЩУlсP#╟a-─-^Ў╪r8ьzN1Э═╔g╚.UЎЪнфs$ТXо;М│╫eў:(3xэ└ё╚жбббббёo└iBў54444444444▓C╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙з▌$яsкP╤QБЛкв )╚▄╒IT|а ЙDЮДD(aBbRR№Є╓qdKCCCCCCCCуxqJ╥¤╪╪╪ДД├┼MOZйtT░SКB╟%┌={ЎЁдpс┬ФР╫ыНV<Й╟чєё.ёь█╖П┐%JФр9OФф|fЯСС▒ ~>N┴-Z╘у@┬`6544444444в┼йGўСXє.╥|JМю )?rТ¤Э;wB╗I"==╜Wп^KЧ.>|x├Ж гНЗ┐Ф\rr▓Мыэ3╧ЙX 1I1Fь╤Г■╕x#&╔k╞Ъ~KШеe√ПссПх|2Н┐▀ ░\ :й█┬╪вз∙2|~|llм╫kЖЖ╬ВиД▐▒c╟<░n▌:├Q¤жMЫ ¤SзN╜ю║ыв"▄2`Г┐¤Ў█ЙfП ▒yєц"EК╠Ш1гzїъЖ╦┼"$an╛∙ц}╘ш>%8`└Ало║J╞°г╔ЗЖЖЖЖЖЖЖЖFуг√Цс╧Ё.ЪqюЎя3fНY_╜цyUo)(iдё^oМсП1╛├(ЁЪщЮtпa─qyк@-LЧtХЇТa!┴p_╞──фйS╦ЁЩ╕V└┤<Жщ ┐eд√¤╧пnZ°╦╥ЦНЫ\PмxЇ╪ЭЕсЎ╢г1хЗv╖o▀~э┌╡░sфD┐>ЯВ▌╧%╦Жk5ФРu╔у╢m█о┐■zH?^ ёP╥┼К√■√ялVн▓FЯы╫п_╢l┘AГХ,YТ'ю╥еKBB┬Р!Cj╒кi444444444NN1║0G═#%╠ТЫfьЪЇю▓┬F∙вg*}Ез╤=че6<Е№3═2тc ч6Щ╬0<Цс╔Гю#(,9==]1`ТЖ╓єDeмpс┬▓ё4я*(!`бW├ █7}ЖЩ°Lcї·НЛ~Y~0-ХЇюj╤к|ё│<▌╖ ╦AхСє}H∙║uы╨▓сФM╫о]Ч/_▌o╥дIXi╔2е.┘ILLФ№ЄYV█зееЙч└├э█╖█╛}√▓╙}p╫]w-\╕РRм^╜║ьа╝[╖n╜b┼Кj╒к╜ ■√2!аббббббббёOсг√дРю5-#ЎP╠БН■┐~Є╧№b}|╠┼K%лЬv}чЛ|┼НЇBv╚8╦К d╪М┘Ыз  4~№xСШ'-[╢мUл╓K/╜$YBТ╛}√6j╘H>чбQ[D╦И1Иы░АА/Y√█кїыN=phхК\^╜|свIЖ-ХcXж│)╗╞ O├√о)И#GО\w▌u ,Ш6mZ╙жM├▐│g$~у╞НДЗФWо\ЩМлуt╘)?|ЖФФФьtwИ°УУУg╬ЬY▓dIЩ!┴ёX┤hQч╬Э╖m█╞+W^yeфY╨╨╨╨╨╨╨╨╨(pЬrtnя5=ЕУ╝FFЪя``ўЪ└оЯ┐╣гDВu╞∙╛KЪ╛ф╓│№ Ж/&р3¤▒Жgф▒№A{Ўь9d╚Р┤┤4$Ж▀{я╜Р√╗я╛[нGЯ0aBлVн"▌G+├c╧2╠[╣z▌┐<Ь║▀▐кU/╗вrе3Т ХО/\═М@Мq╚k°И?\< ╬B╕╛М═гыып┐~■№∙SзNЕОЗ▌ }ч'╩ >>~╞Мuы╓Ел┐jв6▀░a├▌╗wgз√№z═5╫`°еKЧV┼П/Aфk╫о¤ю╗яИ9тLhhhhhhhhh+▐{╚Єэёя╗ eйoч4s┘─┼+dx/I╛┤uщЛХ3ЄX╦c╚"u9Вж ■Р╫Ю={Vо\╣GПЙЙЙc╞М)SжМЬ7Я╦ш╛dЮ_ч.\╕&u▀╞┐Тжj╘╛▓Bщ╥ч)rNB\Jё;;p=╬ЩAsЯї├ф5№щ5ТВ┘│Wс╟xm4м\╣їХuфф√и╬╖ЙДюf╤вEiiiR═Ъ5Q╗╚rL~юt4n▄x╧Ю=2║пЇ├Mў54444444NЬbt▀^═cY1ЙFl|B└И│╚g▒1~#pфрЪ°┘г <╕║╪╬═{о║ём╥W√ЛUH(rQс╝╓Є╪г√"1ЙBR Ї═7▀Ф(Qвpс┬}·Ї╣·ълх─Х▒Ь"С╢ю╪╛+#}┴ъUk╢¤UтЬє %╞╒йT▒fЩ2ё■г▒Б├k·<Ж°Ў╬>кb¤√s╢d7!!╣йРvi╥Л4щ╜wщ RС"д ╥HУ&yAz√√бў╥█ бЛР╕ й^4lvўЬў╖ч1╟ХЦАН┼чw╜{7gч╠<є╠мў√╠>gF╥#NСдшД°╘╟Пн~╙й ф▓┌ў┘▓Е√№ыEоxО▓В√Bxн╫╧ы]ж╕_▒bE╠┬}э"у>Л┼b▒X,╓ы#├}┤`WЇn&У╗┘ащТMПНЙW─ЙofЛU. ':wщЁBН=КШ<Є-:б╫ sfЙ0┤|n│┘Ё ╨9r$║ ┤▌╢m[┐~¤·ўяOЩё┌Ь╧Lн!zжOQ■╞¤╕D┘vЇ?Чc─Ж·e3Х~+oСЁ№6IgТAH&YBOl6╗╬дУu┐ю╙П║eE▌%Sz5┐ц╧X▌з4┤3tEў┐ю├04ДБь╨б├ш╤гi#N┴╕╧b▒X,Лї:╔┼p_▌y▀тf2ЫL┘D║.∙К¤┬╖ф;┘оЭM0Ы■;аи.аДAмОЗa7u┼{№Ьx^юt0┌qЯЦъAс▀}ў╜JХ*ZЎ┐│х Єп╛·ъ╬Э;&Уi╨аA╣sчж╟|Э#Y╒╜{ў╨¤╕╕8Bo┐¤╢v@>2Н╦Ч/GD╝g╧ЮРР┌▀3""b═Ъ5Я|Є ┬А╨╨╨ЧъЛ┼b▒X,ыПХЛс>P┌кKў┤·■xEweяг╘;Ў╦/ч╩яW▒V>)╠Юлв╗bК┘. Ыа/hC╦ Ж┬─Ь={Ў┬Е EЛ>|xЮЫ╧ыВ╒j=rфHjjкЦЦCП CеJХ з]Dщ ╞уш╤гBрxх╩Х}||┤s╡иFшЁс├(F]Fт╡Z╡jT^d<▒А Джa■4ЩLХ*U┬Аf)ёЙ┼b▒X,Лї'╦┼pЯшdЫ╤d4╕ЫэОХtЭЪ∙оЧ╣╩╝V~┘f_'9О╖U╖╣ [ШХ__Х кЧшКм╛ъTY,Л┼b▒Xм?AоЖ√КвЧm:│З╬▌ЭЄlМ°Gz∙╖0-й (▓·ья]; ]RDЄл|/e╪╟╕╧b▒X,Л┼·єхb╕я╪ИSш╨░З╔а╗ЮЭSЖ>e╦ ХаїdOfЗъ■Йв5}┼ё┐j╥ОК√v╟╧pддwЬ!аЦуДЛ┼b▒X,╓Я#─}Eg6=LzбXU^╓9╥u$==#+$:║╓ё╨.%╧ ю─°WWюЛ_p_▌wSVЧїuк]:*Ї╖■№└b▒X,Л┼zГхb╕Oбawww╟ц7#╦│X,Л┼b▒Xп╜ўY,Л┼b▒Xм7VМ√,Л┼b▒X,╓+╫├}╚`0ў5╦\Е√╔NчmьY╧Уц+L#Э*бNVэpzп9Sє']S╚yn╨)tёЙЖш=UH5ЁЙ,Л┼b▒▐ ╣юу#У*5hW▒єїС═f╙N:г+ы╕о,T╟jз+кPМю@Пщиs 'шDa╝вnD<╔├─b▒X,ы═РKт╛╤h4Ы═┌ЯOЬ√┌Jsaх▀k╠k.ZЙПННЭ2e |5l╪0:╒│ aрMTT╘дIУЄч╧?|°pч∙@ьN▄ы╓нqу╞QxP╕pсбCЗъU9╖ХТТ2a┬ooo╘Cы·и─ 7tЫ┼b▒X,ыПЦыс╛╒jЕ)&УЙ╓kA~о▓jNv=aє▀m╦ы.Z╤┐xёb╙жMБЄ;vь╚Ы7/оc▓~∙хЧ111¤╕╕╕▌╗wЧ-[Ўр┴ГZr▌ 'cFMЯ>5l█╢НцF@@@Я>}М╔г╞аDGG7j╘с─о]╗ў]"zd▒X,Л┼╩К\ ў╟╢√?{╩AIWФKЗгє╝Х#o═lКЗb╒█Ї:гNд %MR▓ ┘ашДм╖KB╓ЙL╪Z╦wN ╫rB─o╙╗│ЄЬА]Ж1:╟Щ╛О▌Ў╒efI{,BD 7юЗ█▀Ч-R╘/{v╟С[ъо№zmу}зQpь╙ 2└й┼<┌08GA┤р-Ь "pBрс№СЎ нСS╢Мцк $н▒Ў)e┬╨{Z;w╛HНj:∙D┤AG╔╪╪╪qу╞э▀┐╚Р!э┌╡єЇЇ─з╔╔╔uъ╘╣pсeц`ТХ+Wnя▐╜^^^┐8▀nз╢ ╘лWУ╖гз╕x√ЎэUлV 4и ■ГAJ╠╜o╛∙f┴В№рГ╨A╠l╞}Л┼b▒XoЖ\ўeл▐ъЭю│/uя╫С▐Ж╧ГOS┘ws*┘mnЮ:YgSЬТ^еl;`[╥gВ√ H┤о┴k6U╘C║∙··ЪLж'¤|╢p╛▌QDЦдvE№d╖[ьЎыwb■sч√GПТ╙╥┌╒й■/Х╒├╖t┐╜=├х/ё{|¤ЁсCJАБ`-8>55╒b▒P k6ЫQ !!Б║рууГaHOOз4w0%╩k╣ь°ХP<х├а▐kшЯШШИ&ЁS┴██с 7>Eг╕N-т Fо&LЗЕЪ%hў┬`К"┤]╗vнzїъ░4ПYA╜Г'OЮДх°3**ъ│╧>+Sж╠Б0dЪ7Ё╠°Ї╙Owя▐ Иo▄╕1pъ╘й╓н[├р6m┌LЬ85ЛМ бE╒кU+TиАxА&.g[▒X,Л┼z3фb╕т│ш ┘$сau│▌WюЭ▓·┐;К╒dV ▄ж=r╔сB■ _╕┘ЕAJ:╜Р╝_▄7 у╩Х+Йhё┌╣sчС#G┬▄┴Гkл╫а╞·їыg)еN░┴zI╓ЙdЛх'┘~·╩х╦7о "{ю<╣▀)R"▄▌╙├ё├Гca_F!ь╧Ё8|(eusШ╕╕╕NЭ:БП R╫п_8tш╨'NPИЖЦ-[mA║у╞НЫ;wю╒лWщ▒╘▒c╟╢j╒КV╡i?╘y ■¤рUи3├дIУК/:G[рц3g╬└?╡5k╓─╟╟г№▌╗w1vШ._|ёE═Ъ5╤ю┘│gCBBЖиB▄п_┐Y│f┼──аf°FI- B▒CЗa,Єх╦╖zїj▄NqMAЪ^╟О├]e╦Ц▌┐┐Ж√T6╫о]]АyyЄфб+p╦Ўэ██╖o_иP!╝A/┤ц0MЫ5kЦ3g╬Е т·Л7Жb▒X,Л┼r!╣юГМm║47)╗з┘SN·Я┼O╤JЄM√╢пo°Z№╙═ ╦W?√█md┼ш)╔▒znЩ,╙ўч╠ЩЫ<==aIЧ.]FН╡uы╓╛}√┬юдд$??┐+V╘н[ЧP°┼ ╪ёг╒■│PN\╕xу╬mё8эч┼К╝є╓[Т╤Ш▌Ь-в┤п<▓е?ТmЎ_Wё]╨ў╥╝ YMё╫╢k╫╕ЯШШєр╓Н7ю▄╣эссБ.аk їFН5n▄°№∙є(уяяo2Щ@╒T╞Ё)q3╞вk╫оАц┤┤4m8шI wwў┼ЛWиP╢6o▐№ф╔Уh4Wо\SзNЭ>}:ЁЪЦъqМR╟E8│0НА Х$''├е>─p╙aaa6l@ бїq┬╠╬х╦ЧЧ,YТRА┤Я(0;rфхэ╖▀>xЁаєъ>>ЕC $$$Ь;w3J╔╠├- АsрэШЗp#▐бCЗ3fЁFЬ,Л┼b▒▐╣ю├`╜Тжsє1Ш▌e4#ь╗,~ОQ]ТvмИ4┌▌D╢GZ╝їяЪ▐Ў Э╗0fЦФ4;vькUлЪ6m┌┐ ррр9rджж▐╜{w╟О'NЬ;wnУ&M`ЫЦц■┤h¤o╥мщ╔:щ╚ЕЛ▀╟▄OЧ╗┼R╢X╤yЄ°╕¤М&E6T ├SКUз█td╧▌─dЫм╧ЁЪ▐jM╫ы имjБВ5К╔JА!╘╡Ё╪╪X`}ч╬Эгвв▀╕{"""*VмИ╫CЗН3, ▐┼kLL {Ўь┘∙ЄхгЯ5║uыЖЛKЦ,йSзn<}·t█╢m}||└╛pИP' Ft└А╟ПЗпАщ╤hddd╟О1|аyzКz╓мYаyа3вЕuы╓┴кя╛√B °З~ШТТТ7o^АhqЖоFнG.\иQгЪ▐╖oЁ┤> ж:Щг╒}L>╘.2йSзNб┌№∙єу иs║о xў▌w)qт>Л┼b▒Xм7F.Ж√Т"╙MR6Ыф![ёЧ0ыe┼$¤,)91р╤qw╟уSЫ·Д{( ■oЙБъ╖L\@Йя#FМqЛ┼b▒XмВ\ ўЕвУмЮFЛ╤#═.Iё╥[ :╗Р╦)7▐0ч▓ю~БЇЯVmV├├=Pg╩i╚ўнV+┌КИИШ4iR▀╛}GО ╕·ўя▀╠:f╠Шс├З з ▌Я╔ВФ^ВПТУSy ┘37ю WчсХ═lмPдP┘\ ЎTlFaP$!ы%Р_шlТИ}Ф·╪j╙g<м+╕ля}═fus╔ммюУmp+X622r▐╝yрu:Й ЯТa"Z▌?qт"эdЖ╙зO├╚╖▐z н#°╤ъМ√,Л┼b▒▐P╣юK▓b4╣▌▌┴а╔к?у.H█■▀яЗц ╞'о\┤eЎь╣Е>╚n╙╔Ої╔№Мz~ы(..nЇш╤а╪!CЖtя▐}╒кU№qЭ:u.\фu▐жє,H∙<°яГ╘Уe∙швn■p╙╧╦ФM╪▐)ZшэB┼eб3╜;ВЫcЧNYчYЬ▓Нb~╟╧ОЯ╚╩є┴Ду)))@gЁЇ╢m█кTй"Ь╬ ╙6эг1x└ш%Jh9H 6▄╗wя·їы[┤hq ■¤К+вQ─<∙Єх╙~╓@▒┤┤40ё┘│g7o▐М7╕Иц╓ЮЮЮш╨╨Pgч О"ЮFqєцMР7·╞Н(ю▀ўуууa3цZ/[╢м6шпМ√d'жкEгm┌┤Y╛|9m9ЪЮЮlауштКdшF╞}Л┼b▒Xoд\ў╟КЫфf4║ЛЯE╥∙ЯПм╕о< z°р▒й°ыwор■o┼ы▀zAKО\СЕ▌ыa(х╠LЬ81""вKЧ.а№бCЗЖЗЗ╧Ъ5лPбB┤wdц╛╠0QVьКу┴Cbъгф╟?Э╣v¤фХ x°√xe╧VйpQO╔Вр/Yy■√Т╚2s╥Y│ййй`▄ии(-рuzдU█BЮЖчю▌╗(УЬЬ|Ёр┴┬Е ╙╓їас&MЪм)ЩwБцсБb┼К═Ш1#Wо\╕"╘_0·ЎэЛБ7nmДПЪ###*`╖n▌К╪Аb'4кmшi▒XZ╖n ╩?}·4o└ёШL0╕ЯШШH\О?+Wом═░єч╧уz@@└Ю={i√ эЙ[б╬HtMЧ.]СтzТШв#Lзc╟Оїщ╙5аШP'·╒лW1╕ш┼╝yє*Tиа═1▓сJ¤·їэl╪░A╕┬йm,Л┼b▒XYСЛс╛,╔Пuщ╛" Ў░х╠ж╓8¤¤ws к▐.Яфoё╧чоШЕ═hУЇ▓6+:╟╙╝ЩqЫv>Ttt4И╟О>>>@CР▀║uы2]╤J@}╗░+Т╨K:ЭEQт~NKxЬvЎ╞╡╚K ∙W6╧P┐┌х╩Е∙∙ў%ФE═Y▐pєyJHH8p |X╗vmXRлV-`7j╞ЯЧ/_._╛№┬Е `Рй0f√Ўэ0мzїъєч╧ўўўзи bкр:┬ФБ=^^^ddpp0┬3___Сq░юёу╟{їъХ3gN:№ б┼їы╫QБ ·Y╒┬xXЕe`!ЬР∙vл,Л┼b▒X."├}╗NN╒[ВФаы ўhыь ╬Упj╟@{└O■┼▄ЇvГдЧУ▌&╥`з^ш╘4ГР2YШ'╗нV+ oЄф╔Я■9о╘иQр[┤hQ▓$ы╕пn─iщГ∙%бУ%ёУм╪їRК┼ТШФtє╓ныССZ╡ ╥ Д#Ф╜є{Т}·┘)Rdъ╘йhQС▒ДП└Ў ■)Sж╠┌╡k_v─Y,Л┼b▒^g╣ю╦BI7╪╜O[ЬИ┐Цьшы]└(╗[м·Я▄ДПу∙WёX8N╕nў Y\▌зt╝Б1У&MВYэ█╖╟лЦ╞єR╕пnйi9ъ∙ыдt\Х─ППе&%Еч4НТ├8EzймЭч■R╙1└┴ЇМ,ь┬м╔Щ(v°Ёa┌гx └їёё┴{Р¤├ЗЕ║╘]╛|y 8▐`t1Bg╧Ю┼hБ┌Q3ЁаьыылЕ╟ОKJJ"p┼b▒╨ё[*h▀RФ9}·4UО TеJ┤~ЄфI╘l6Ы·╕ ╥dВйT ╕|∙2т4╖wя▐░░0mzбМvi╚pЕЄЄQ╡j╒┤№2299`vб0тРrх╩бЇ{Оє&KlЁ╠[▒b9Рў▌g▒X,Лїf╚┼pМf┤[Н&╜╬├$л3*4;6║Qо╨sоКўё┘У╢╤ж:О█╖o3f xъ╘й%KЦд'YAУЩ·ёW/dц*йЫV╥^У┌║cуXтHубЖ╛b┼ н┤O ^7n3Э%╤C╜зNЭ2ЩLe╦Цъп=/ї{Л┼b▒X,╓ы,├}YHП%S6г▐╦$ ┘в^0(:Г═▒╠/;ЁЩ0Z▌ГS@FCж╕ЯЪЪ ГhKJ╝жззГ№└|ююю┤5╗x┘mЯ─}сЬ╓є╦╧╩│2{Xв( ╙АE█° ╟}m├Я'ZЩнWY,Л┼b▒^_╣ю;@^6╕╣▄= К#щ3 ўyВ┼b▒X,Л┼zуфr╕/Yчf2║╗╘нnД║╜Н║╦╕╧b▒X,Л┼b¤V.И√Ку╨Vww7х╫U}ч─░X,Л┼b▒XO╦їp▀fsь░n2╣╔Єпe╘ToW: Х╝#T╧BЇ'щOJR▒┤Mш ╪╓╡|нN%C┤∙щ+oАу|ЪШV ╗щ╗оhXzЮД\─П░X,Л┼z5╣юу▓╤h2▌╗n*j2┐, :┌рF;цЙN╝▓X,f│ЩеЄЇЇд7┘┴оtрэG$Ь@ iЭ&їяm6Б╛ЧЧЧЎ юя┤5аZ╠г╤7К?a│╬┐^Z╫мV+zЗW|Gр1Г┴ХbZЛ┼b▒XпГ\ў┴?┘<╝▄▄МОmx╘+z╜░╦vZ√д╡[╝щ╫п▀Щ3g┤е¤!CЖ4o▐ЬVм МM'Яg Э┼Kп"cЩ№iЭ*D╗uы "Gsт┘│gRып6pЪ┴x╜~¤zя▐╜ГВВf╬ЬI╒║║и_}8эуП?.^╝°№∙є┴·.4╔Y,Л┼b╜&r=▄▐╗═ЫM╤ы$╜A▌z_.Ф┴!лBЫ6mzр└Z─EAл`╗┐°HW-√6рLй%█№■╩i√|`k═Ъ5OЬ8Бc▒XЄц═╗o▀╛╨╨P┤Є╩;▄╙lг\Ч╙зO7h╨3g█╢m┴┴┴o└ъ>X│f═W_}r%Ў%и╒u> J├D"`№∙▄$°_nqр╛м╛еC╛$ль8LпC─Ро{OЮyРЪє0.=▌╥вFЭЄ ╫ ┼.╔ b'└╛bК┴Q^з╚О═O┼ЁмЇrд{∙Єe╣ЧЧ╫┴ГCCCE╘╥з╬╜&OJNzв░╚°щр▄╣suы╓┼┤AсчччьUgn╓ИZ╤ЬЬ)7г-ъ╠╓ЖX{ь°eGЬЪ╓Т╕Ь├к▀∙GП#GО╘лWпpс┬ЗЎЇЇ№[Юфf▒X,Лх║r1▄wь╜i3xШМщIЎЧ·яE▌б ╗рЩн@A ь∙ХТэГхЙЯ▄,▓░ЩД▐$Ы@зRf$|є═7░П╨═▌▌╜j╒кЕ Ъ={╢╢.┬kгFН║uы>|°ц═ЫOЯ>НV·Ўэ╣ ~ \╛|∙gо1╦Ї03ВZ╪╖gЬ°л╜HTь√.ЭNHIzЁCМ█c{х╥я°ф Є3╣#Ю░ы$АЁi┐S╔Б√°GV╨7─ИщS/┘╙зqЯBМ><МЩ╨зOЯqу╞!т╩Х+WЧ.]╛№ЄK·(?rфH▄е-┤╙╨Ь={╢zїъ∙єч▀╜{7%ю'$$аЖ╗wяUWлVm╨аAШp ╨єц═Л┌|||2,К, Ь┬BэWтЄ&Ю=CЧ.]в▀c┬#\Y║t)чМк0¤рн\\зNЭєч╧├ ╝╫&''г|Е bccя▌╗'╘Яъ╒лЗР#$$фщЪэ*юы4▄W█С"█ПF■чЗу┐ПП▒Y╥Фнlt/юцn2aьlB╓Ki:Б F Л╫╒─їЭ^(&Z╒З╗t/GЬOу>uгф=qтfB╣rх8Аы▐▐▐`▄у╟ПcЎ└'ШmMЫ6Э>}zО9 :З_┐~(П)Ф╟з─т°│a├ЖУhFт··їы═ 4╨ЄаJФ(БP сAVRq└·hSyт─ЙИ=ъ╫пПё┬u ═мY│К-К`,ыN@╨єш╖╝/^№уП?▀SБ.tь╪q╔Т%Z∙°°x|Oжи·Ё├E╞6Jo└# ,Л┼b▒■╣ю ;n7¤М▓"tV┘hSlЇ▒з╥}o╪ЎЧВ├ГCКъJ╘ё (лж4╟Є│╬=SЬ9s$ X▀▓eK╒кU┴О9sцЬ6m┌В ЪлкRе ь=zЇ╤гG[┤h╤╕qcРhс┬Еo▐╝y·Їщc╟О-[╢ ╫DР╬╛╨▓Я╖√L▄ъ││7n9r$р▐№Ї╙O (0■№sч╬бЙ6m┌СБ└°У'Oц═Ыў5л С╘╡y╕+MRТ-ЦK╫п▌I·1:&╞Ъ■sхw╩·eє(ЪГ)YFE'dщa┌╧▀]ЙLI├@~ГьH╙W╙d░╛(SмXN7IzY▐|^2x╬2dЬМ zОЙЙЩ:u*оc ·їыjгфю▌╗сvZSЗ?1ДК+Ж█}}})<├Ї┌┤iВ1DG▓RеJ!ЛЛЛ█╗w/╞ ╨-ф▀┐Uн]╗6--  ╞+X░ ^с∙Ъ5k┬км;°╛c╟Оk╫оa╕1[FНU╛|∙#F`юбкў▀?■№Х+Wv╛1В:Д╕Ed№$┬╕╧b▒X,++r1▄G VIШ▄Ї┘Lz|╩:сH╓╖)r║юоO№wщ▒╟¤чp|Pбc┴┤╝ї▓╜U)Ы╚,ЩG;ёъЎэ█Ащ={Ў┤o▀>wю▄└¤9r╠Ь93<<Ь▓╜###▀╖n▌3f hЫЦе7o▐░П╢Е╤▀─{FW╤oooЇёeqЯVў┴╟Wо\цVмX%█┤i│i╙жe╦Цuш╨"╪ю?ou▀*Y#И]v$Є╦vYе?~`∙∙└щ╤) v╜p7ъ╜S╣аH6!ЩL╩ЄWtт▒"#L1:vт~кqк┐шEТ┐йcц╗=бчхю ўk╫оЭФФtётE°тЬРРр>^гггБщЁчБ^М√┌■дЁ▐═Ы7Ы4iВ┐№ЄK pM`╝╤АfeMШЗ1┼▄║uы└ЕХ+W■тЛ/`╥В ЁчЁс├;vь├▄▌▌╔0А>о№ё╟@=░c¤·ї'OЮььSн$ъД·Їщє╔'Я8я8ЙW┤иЭ╖╒╖o▀н[╖О3жSзNФ·L&╙Э;wZ╡juу╞Н╒лW7l╪╨`0 A└'Nь╒лЧ┘l9r$p █o┐нPбaвє╧┌АHNуы╪▄HQRзе<~╝ ─ё ж■цХt╞*Х*цї╔цgЄ╚&`Б·╚Б$ьТЪ▄УQЫЇd╜/vэ/ЙR)))Шd0╕П(DЛ╪╕OбСпп/^Їm█╢E╔├З#pюг┐ЁЁ7▀|SдHL#─`└¤UлV|QЮ№Жb-[╢D ╕ИзmЪ"x└ш ш▐╜;└╡m▄╕1,,ья=м аЯЬЬМ/@я▐╜a╔▄╣s *4b─И═Ы7ўPхщщЙ∙ц\┴ &!жBPЭ*~TЧ┼b▒X,Vхj╕/┘dcвЧ=ьц>╦╤5wu?f│XТЄєоё^~иШ№%┼MСL▓в▓╛дш╒](3q Э2e ░tШРР└UеKЧ╞ы╜{ўАЮsц╠й^╜:mъ7a┬ДMЫ6с=z>Ы1cЖєv√┌Nэ Є%KЦр#P╕\seo|╧Э;GЇ╪MKKCC WЄ#Ёоg╧Юx▌╖oЬУ'OЮ+V╝є╬;а█;v"╞h╫овСi╙жХ+Wё@6Л+═v┼nТMТт ў┐ЯmЄ╤sg┐ПЙuў0{)Ц┌+ ═cT╘cКи■{e:ж╛|°сЗзOЯV╘є ю▐╜Л+╣rх"dЗ{щЩЗП>·╝ ╫бГ╦Ц-C`P╗vmL╕Є╓лW3дX▒bШ4┼Лз╡yTИщЕСкQг╞т┼ЛQЫє#╤(░a├Жn▌║∙√√?xЁ5м]╗э╛ь6∙мNЭ:╒╡kW|ы0С`I∙Єх1╩ИFр;Ж∙▀дIL0н■|m#NbЙ%·ЇщгY Шж[йУу╟ПЯ>}:╜}√Ў_|ё(У╢Аtv+J4hх╩Х°s╚Р!Гvюm╓м┘╔У'╡]фiwЄЖ┌┤i╙╚╚H║ИгRеJ@├э█╖уойSзvю▄\8sц╠9r└╦∙єчё3┴┌H╔Кг!Ы╨╔О4)ёзЯ[m╟N|w n¤5Кх╔пЧ%rЭєъ■+И&AЫ6m*[╢,·rэ┌5°│єс█o┐E%0U0C@ЁEКб╜ч!ДL╒кUC▀:фэээ▄}┤~ц╠Щ дддTмXqщ╥е HOOwьBЇўщ╪▒cн[╖Ж▒-Z│hЇш╤tzzД!■Є╦/╡ЄGОй_┐~с┬Её_Bх╖│X,Л┼b╜XоЖ√ ╘═дШьПхф╕Я│yЪ}B ▓^СН6IT▓9╬╓ее}EзжєdюВШШШДД┤М╢X,└wXrўю]@9┴wXXШ╢╧#^o▌║5qтD─¤·їю╙Z╛sЕ6▄╗w/11Wsц╠йїИЄ╦╤_8┬y╔_иЫў╙┌?╩ЕQ├C╧nВh▌▌▌aр%├├├A╖и?66╫A╠&У)k[4*▓=]з╫╔КР╟YYЁш;9ї╟ е фч¤/O7У╬ош╘Ў┐2ю╓GGG'%%iДкС:eх╬ЭЦ▀╛}Ы╝Б╔А+`▀ии(бюQS░`AFD╞ЯфФ─шаЖЛ/шЁl▌║544╘∙ў ┤ЮЪЪ:g╬ЬИИФ┘╕q#ЫЁў&єаЫWо\AЧЕ:Ё-┬X├Eф╪ПщЗ∙жХ▀╣s'┬Г2e╩ ╠г/!│>Л┼b▒Xмм╦хp_'Y=═nК╤Cvь╚у8Ї╒dХ vG┬Й]▓^PК╩·┐╪■{№у-╒Г5╤%р&^Ч.]:uъ╘j╒кН9╪нЭu·{[·Лд8VЎЕЇK ■/О╥iй;:з\хЧU■╫Q4с0ig╥JХ*-Y▓ДЮл╞ДгМ:t@╕ш/Z┤ш+В√╖╙Й╬╗pсBзNЭ`ЎвEЛJХ*їўж!▒X,Л┼rE╣юл&Ы▌ nюnB▒ Э▐ю╪к╟▒8нVЭуUТ└пъ║╛║цАк/tf╥дI{Ўь!_DGG╟╞╞ЖДДф╩Хы▌w▀э▀┐┐╢▌╛k╚▒aПЎ■╫W8¤ё╪_ Zсж▀I└─Н5 █╛}╗ЯЯ_BBF$&&Яb^▌╝y╙d2)RдX▒b│g╧╓л·╗═╧D─·░ Ёс├Н7~чЭw╥xzz╛■Б Л┼b▒Xм╫M.З√╒tУ╤▌▌ЬM]╟w`к,┘ea╫бQEч8?V]СVЗ¤]yч╬ВЫ┌╖o┐vэZ╩!╩д─ЫЮ={"│r`╙kдLЖ√u]╧wе<╤`&EFFН╞%Jрїю▌╗uы╓╜}√6аь╝пZ╡ъ╬Э;═fєы?R┌w)55ї╥еK°Ваk.6╟X,Л┼b╜r5▄W$Yq3╣▄▌їКЪ╚ЯБо┤L╞u}▀■√vХ╤DЙ:ч╧ЯOHHpю!Э╠\иPбЧ▌|¤o╓oўхЫl>#ЗGєюk&эмbZзЗ%(п===¤ь┘│ЛЕ╫ Г╒j $h~¤Wў╡s╓┤/}г^╦Y,Л┼b╜nr=▄╫█ЇF│╤шaФ+∙ Tї9Sх)оЧ^[R}е╝▐p╧b▒X,Л┼z5╣ю ╜, &У╤├$л┘<ОчJ)= ЫЁ░X,Л┼b▒X (╣ю;>▒╗╣Щ▄▄▌Х_═ХuО├v)нЩyЯ┼b▒X,Л┼·UоЗ√V┘тсюa2eS rdk aЧY/ўEF┌7 эp/^╝╙╤ЯlМvиЦfх┘┐Ъ=╬УМr┘]bcMЛ┼b▒Xм┐KоЗ√B/ЫНюF╜IАZ!щ√VЭдo`▄'ё[н╓°°xЛ┼тэээчч'╘Q№[,┴T╕ >ьбgg CXX=A√▓дNСЭМЖ∙Ч#Gб╬6WzNЪ┼b▒X,ы/Фыс╛═ЦюiЎv3╕ Y8p▀р╪ЗGЦм└H╞}mRЙ7╜zї┌│g╧ф╔У█┤iє╖цH╜RчA╦Ц-/_╛ т╟√ЁЁЁUлVЕДД╨|z)Rз-P╙╥╥Ъ7oО┘▓b┼ г╤HС├Я╒Л┼b▒X,WЦ╦с╛cI▀мўРь║┤GщFГ▐Ь▌MС╔джё│2Ж┴f│┼╟╟wщ╥хт┼Л_}їр°obЪPУ&M` мКЛЛ╦Я? ╛}√rц╠ Sы/U!Е1└¤║uытЎMЫ6ЄЎФ,Л┼b▒X╧УЛс>Z░ ╜П▐#цpт╛UgЛ(Y▒MР╒Wш¤бWн│+ъI[┬▒ГПЇУz╒#S╨ЄЁ╙^а,sчЄЎЎ╓ntкзrn tNnБ┴ЇЖnдv│▓*OхQЄю▌╗Ш╫п_я┌╡+М9pр@HHu┘┘еZЄ╒п▌оyLО;v┤m█╢EЛЛ/6ЩLЬ╛╧b▒X,ЛїL╣юс╙Дф'y╞ьI╪ёUдЧ╚г╦.rЦuп╙1P╬&tЮОtЮt┘b0╩t▓од╙ ]&л┌ДШxMKKГб╬}афrwwwr>E╪_а<■$*Е<==╔fgФG?╙╙╙╡ qЧ╤hдЄ(FUYнV┤░гBФ'/гPм┘l&?┬▌(гЕ┤ЮНАmZhс▄╝йSзи─▀кU+ жaYHж┬lxЮАЮ"\AC0C;╛╩╦╦ п╔╔╔░ЗЄяa0КщU╜╪╖OшЄх╦╡j╒BЕ ╒ц yГ C+0Й╬╧ЄўўG╗(А╔62┼"##KЦ,YбBЕ¤√ўу╬▌g▒X,Л┼zж\ ўЕ" К┴h╘╦iЖ ┼╚1ч╥ЎнОЄ┤s°yzч╫╫ь■ЦтЯnё№╤& nКЧ┴цXЁЧ▓Р-[▓Л/ЖA┐iMQ║vэ┌гGтщ╧>√lўю▌╕╪н[7ёЄх╦i┴╗AГ#FМАГDF&:jГ[g╠Ш▒}√vн6`wп^╜P ╠КQ ╝ах▐DDD▄╝ytонj>╝EЛxУФФ4d╚.ю╥~ИАzЎь┘йSз'░ЫBЛ┼ВцО?╛l┘2╝бФw╘єсЗ▐╗wПт x{╩Ф)єч╧┐xё"Еи|╠Ш1;wюзШ┬=├ны+e┌фRLB╓[%I╓Iїa▐ Жв9Ш▓Д╣╬оYz{{o╪░б\╣r╕·D1Ф╟+0ФЄavч╬ЭЗ цссA№ R?vь╪Э;wRRR┤ Q,Wо\¤√ўo┘▓%°╛a├ЖЗF+аj╝ВкБ░KЧ.Е│А┐FгсG√Ўэё~ш╨блWпЖ┐( Есzр8Xt▐▒c╟'ЄЄqKя▐╜╫н[7rфHЁ=hШ▓eтттj╫о кF╘Аон_┐~№°ё0ЯўQ╧╝yє╨_КR`°#чяя▀мY│KЧ.!КАхЮЮЮk╫оEРє▓)4╧\▌GЕШВя╛√.}:╠└▄5h╨ XО°Э┼l╨ЮЭ╒ └ыЛў yў╡gЭQ?>BзХ(QAEХ*UВВВА■шK||<╚├▒o▀>ДФ╝t°Ёa8нLЩ2шу>Л┼b▒X,╓3хК╕пШ ЮЮnz№с└}%]Т▄Еl°9*¤╨╥╦?^єIyh/U7,gГO!скR& '┤┘╦Єх╦┴▓0ц·їыFгСTеX╖m█жс~ўю▌aЇ_|1`└Jvў7n╝k╫.Д э█╖w╞_P√Т%KPЬZ║tiтужMЫю╪▒aFы╓нqeш╨б@ФЩ8q"9ЮA№pх╩Х3g╬└q╬;┴╝му>н╛╙Oш,№ь│╧▄▌▌╤e4┌йS'z6╖▀╕qгa├Жx│wя▐╝yє┬╨?@s└Н0Аp▐9Зb ╘№В╜53┼¤ФФФ .а╝╓лW/00pўю▌(ЙH CРФФДўY,Л┼b▒▓.├}╟n;▓═`Єt3ЫД░KvЫЇ╪Ф|Y>▓ъБ∙Юч╒ЫwrW╔QдСgО"Fs░д╙?ЦtFI2gъа∙М3└╕АoА/1>║xёbDDИ$JVїь┘╚▄ъ\┤h╤Р!C:▄'.?wю\ ■¤1│f═║vэ┌Їщ╙╦Х+7j╘и|∙Єjсгqу╞нX▒"99Л/.2щч╧Я┐sч╬WX▌╟{╘Жb╙жMшМўїїЭ3gN╤вEЙрQЎм_┐MWкT ЭET·ПКК;v,№у|F/!>е■╙S/Xр1юГ▌Б√ССС╕~щ╥%Ё}pp0ЬЯ#GОшшh┬}Р=у>Л┼b▒X,V╓хb╕/ aСt┘Д╗∙▒╬/']■▀┘╤Ў╘└┤ЯЇц№╔╡█╛e ▒e√╖A╓;╬█uX+╦z]&ЫEвнБ╬Ь9є▌w▀yC ЛOЭ:▐╜uы╓В ▐{я=│┘Пы╓н╓>▄██╖г3(z╟Г╚M&╙╒лW√їыЛbрQнб]╗vMЫ6нUлV#GОЄТГ╨z▀╛}Wо\ j╟Н█╖o3f╠'Я|BЬЪЪZ┐~}Д╕еe╦ЦЇ@*=X╝tщR8╝>zЇhч▒бф■.]║Аїg╧Ю▌жMOOOZ╘╟+║З&NЮ< Г;vьИnв/FгпBВВВиХ{ўюб╫111ИCo=zёLЛ-0Xг╙( ╖ац└└@DM4ВЪ1xMHHАЧp╦їы╫-аЖх╦Чч╠ЩУЎ┼]ЇьD█╢m1лрД:.\и]╗6МA$а┐ ~Э:uемZ╡кJХ* ЪR}Ї┬А5k╓р╩ЛGЩ┼b▒X,ыЯ)├}EJ╖ъя■K║╡MьXm╢¤+{Р%gQk═Nyн┬ш)Д┴ёпвГ-Y═у╔tя╕`╥дI cj╘2╤═кАб@seнZ╡└╓аOШ Чa$о 0NUo┘▓еrх╩B▌CpЯФФФЦЦж5Дnв nF;╖О ┴{ЎьIOO ь│╧$└│rў{Їш╙Т6e╬°√√?|°Я"║7m┌T█ЛУЖdМ╕т№∙є0q%╗═p8м┼Хрр`Д.&L╪┐?э┴ПVц╧Я▀╝ys2ь┌╡kxЯШШ *ДШдHС"┌$P2Иs#КЭя▌╗%Э{ЗЄ98@╖╨VEhъЛппяжMЫBBB┌╡k╖o▀>\х├НСССИФ`g╔Т%1uPоcЖДЗЗп_┐a TлVн@БИj9d6╚,Л┼b▒X P╣юK┬цждЪф╨Зя▌°}сby*╖╬о°(Тў#г═╦Q┬( Э]=W╫рXр╧ю├P╕рлп╛·цЫoDF╞ T╜zu└1└яg╠ШБў`qtГl√фУOzЎьi│┘╨╜ИИ╝y/^╝╕TйR(АюX,Цщ╙зo▐╝Ykиm█╢}·ЇAи@gci^ГЖ║sчN╝ыS РЦ~єр┴▄uх╩┌ЦXП╢i▄║u ╞а└Ф)S6lиUHOїШнГшБ√╘ bА╓н[cHhy#║pс┬i╙жEEEYнVъ╫ф╔УiЗM┤▀╣sчc╟О┴Юн[╖Ц/_}|b╝ёКИиk╫о111бббЛ-╩Ч/ЯVЖVў?№Ё├SзNQЭЇ*2ЮН╞И/[╢,wю▄;v╝zї*>*Vм╪Єх╦1>·ш#МПPcД?cccс║еKЧ,Xy√э╖a╥бCЗ╨_>UЧ┼b▒X,ыЩr5▄Wt·╟f│Ъny$ы=Д!╗dwУмТЁРЕ"╦ТГїe!щб╧"ю}жжж┬┌╬ТР╤hЇЇЇqВJЪ ш %▒°°°РGp%))Й(<00РPЫш?11╤∙T]А>zJ═iЛё┌XtЮ. ╨I║pо╚H─G╗ФвCП╥тНЯЯЭфЕ╛╛╛h╦∙д-J▌щ╓н█ъ╒л╟ПП7^^^4< xъ2н╗√√√гуd$%▀гf:ЯвЙ╜{ў"░Aў┴▄∙єч'л4┐Сп`,дм}МрeЁК╣В!з&┤ |иу╕NГ╡>дcГ╤╩Тв+0uвfE;(ПOўь┘Г╨еQгF+Wод├П3gЛ┼b▒Xмв\ ў╤ВMR╠F773■Р╘ ╚Ттыx▀qI╡ўўёЧx╣s_]_ДЄp № ОММ\░`░╪ya■┼ў"Ў░X,3Д+ ╕{ўюдIУ╩Ч/Я;wю'NЁ¤ыEётУ║uытu├Ж ┤*у>Л┼b▒X,╓3хb╕/KЄc├╧h8Ы▐K/ЇzE/)┐╛вЧ╜√eA [ Б╕O∙¤pр╟╝{ўю)Sж╨╙/8╦∙ЎО;Ю,6йzвМ╞>-ш ┌ж,Z┤h╦Ц-f│]Bы═Ы7я╘йu°╧DАИ H:e╩Ф3g╬|·щзх╩Х√S[╠К╚█d╬5j╘иP ┴Kc╟О═Ы7/№F°■t%DЁ╘:╟Е╤S\!■╓6╥bўмl4ФQЭxНММ№№є╧+Tи0`└╪ЁўЮ&ЎЗЛbEчБ╨ОhpЮ'-[░`┴╢m█0'█╡kЗп└3qЯZЬ5k╓с├ЗщF╘▀кUлў▀ЯwMe▒X,ыпФыс>>^╕╗╗o▀╛}╥дI╬.\xю▄╣°Ї_▌А╥■ю ┬╡k╫в■ффф╘╘╘^╜zh^lЁяС^╗uыvш╨б3f4m┌T╝л√Д▌`ЇЛ/FDDDEEi?╣P╬╒К+╩Ф)єВ┼x*М 1h╨ ▄NWК)2sцLП;wюЇя▀?11СК∙°°╠Щ3'wю▄┌П┐┐┤VН·П?О╚н^╜z_}ї╒ЫwLя╩Х+┴шZ╝д]з jф╚С 6╠┤ZнG ├Ж Ы?>■┼Б╟Мє╝СЕ╕yєf№ЙhхЗКyЄц¤r┬b▒X,╓ы,╫├}╘ ╙o┘▓х│╧>├Н╤╤╤а аа ///4д█)CC№vmX│їЩ╠с|QKZpNPБ│@╖x3e╩Фi╙жїь┘sЎь┘┤8J Я┌j▒ЎзsmФ╡вYEf╨ лє┌кЦ╗в-КS=p>┬H╕9N√Н╡╬╡=╤Езы╧КшmPщ їО╝AйMxэ┌╡Ц-[┬3▀~√mHHИ^ ┐╖╖7en<╧сJa~ Т┘╢m■╠У'OбBЕЦ/_n2Щn▌║╒зOЯ╪╪╪Ы7oтгw▐y╫╡ё╒FS)r╕ЦGдЭ└хЬ днs;╞+╩ ~Cг4╤Я░VVнQКv┤O╘м нЪky/Oф;9╖B!еsBС│ч╡дй'ъY╦;┬t>|╕ппo╬Ь9╤M╕_╕·ю▌╗°6.]║┤c╟ОO╠═N·╔┼y&X,ДgЛ-7n▄И#4ЗkЎhЭE[фЦQгF═Ы7Е╟Пяl░Ц}GхЭ+╤ьq■"░X,Л┼zY╣ю4Ы═f╪Н66m┌╘╜{ўК+8Ё¤ў▀2d╚Ш1c4■{°ЁaBBкw"▄3!6·зDm(>>>))IkИ@&j=Ч2▓Ц:hи_┐~_~∙%╒ItВ╪}Тp бЖUфn|&Ж7╡LХ{ўюс Lйя■кш@g╡Tx·"ЬVў╡Еvp√Ўm4нН.aZЇЇЇ╠:ёвбЮШШкНZ╧Х+Чу─╡!\Ў¤аъ├?─l ЕЕЕ їёМ#оd┌"YШЮЮЮШШВ°1ъц═Ы{ЇшQнZ╡UлVuэ┌u╫о]╦Ц-├G┌ўcБя5Б^├*ztVkиwя▐KЦ,┴╫m└А#I}╨В,╫zф9а$╛)И╧ё┼╤оk╜>xЁ %%E√4GО>>>"уi>;Щ┼b▒XмWУыс╛╢║П2╕k┼К}√ЎнTй╥╪▒c6l╪▓e╦9sцаBbгщ╙з╧Ь9%Ы4iRдH-∙p3j╘(╘#2╓┼сР╨╥еKЭ√я|Ї╤GЯ~·)=,2хi▄' D∙╬Э;>|шCl7qт─NЭ:═TEPf┌░aCёт┼QlЗvQ╧С#GїF╬B╜zїуt@{ш╘х╦Ч ^ёкj▐╝∙ыЭ°▒ hй ■Wп^╒огJ·o╫о]╓i РЛ┴C▀я▄╣C]C└Ц(Q,K;#!АcQ,99╞А╤iеs},Z┤hVVd╔-h▒V╜zїЄф╔│vэZ9Е ьў▐{Ї╣f═Ъ2e╩Г┬дО;Вйrf╬мY│╨(<У┌╖oы╓-Ш]зNЭ╣sчj1XШ▓Аь╖▐zk╞Мd║┘╢m[╝RДГ)┤pс┬'Ю !ўЮ|x╖n▌`эЦ-[┌┤iГБ√Ў█o1╡Ё'└E░y▐╝y°f┬∙╕гщЛ/╛h╓м■дx_:ШК╔Ж╪▀z╕n▌║h╙Г╛YY┴}·▌Dёe┘╗wп╚X┌я╨бв╠ш,│>Л┼b▒Xп,╫├}|▄─T·╔'ЯА5A- h╒к▐/Z┤oИf╧Ю ЖHHHА╖┤Gё╤чЯО$АF[_¤5 kьEш└Ї═Ы7WмX╤9/шi▄'▄A¤6m┌Д╗╝╜╜╤п╤гG#┤@BХ├╝░░0x√э╖Q╕KЧ.╟П╫|G■Е╡@рbФA═рЮ3g╬ї╟ pч╩Х+Бk╬+╨╕=55@щ╝юЛў 0x╖g╧ЮYOЗ└аА>Б╢h├мхвр @╛ц їw P# Оугрр`·С┴╫╫И└ +-gёў19@Ў╣sчж%єc╟О!^Aо^╜:<<╜FwДА A█TZБ[р█╥еKaс∙──D╪ПWлV-╝╟-(v─]0╕|∙Єы╓нC|╨G¤ш/z _╡n▌ =1ўЁz┌╗wяы╫пk┐Ь╡#╛┬,Bga*B▓-Z▄╛}pМЖдМНЖ`3вт`ъя╣sчорvчVP8E"FЁ7n▀╖o_ўю▌5╤АRt cА┌ZЖXжN^░`B>|MHl▄╕йVнBа=z8ps╕QгF┤fв&8╜@¤p&м┬ы7▀|gТ1°║ў}TQZрЗ1Ш)ъCє┌?ўщ╟ШБ╬J┘n┬щ▀ 0│=+O│X,Л┼zж\ў▌Tс И ╪TбBЕїы╫{zzю┘│l=■|Ё1╤FRR(▄ HЦБ∙Ш@?АФнR~XЕ═Z^ м Н;v╟Оuъ╘╤rжЯ╖║O▐_:D5h╨ D└VЖЪ┴Л`8paDDDп^╜ИеPэ╤гGQU╒кUa│┘ зАз╞PV4к╜ >pя╗vэzф╚Ё(HrzЬU!и_┐■▌╗wa0b \ D┐Ёч■¤√сБ╢m█f%╡Ж·rъ╘)<Э:u*т┬8!Г>tш h▄╕1pч╬4 |─И└r *┴{┤юЬ√ё}ц═Ы ё=Bщ+З ФB@°═7▀ wGЯЙ√ЇCВX°_@Ц╦)└аaRRRд!ШЗгЮ╚^c▒X,ЛХE╣ю├bЁ+╕5Ўэ█7>>ИР7o^┌рх╬Э;9sц№тЛ/┌╖oO┘└ў┴Г°сЗKЦ,╤╢Я°x.2╢0G╔ии(═qИ @6░ИГТИ┤е¤у>¤VРЪЪ ╓'иеtЛєч╧├▒aaaу╟Псe:╚6Х| .мx l┌┤)lЖы4h@cёGс╛PAЎ─Й└\ ;▒KЧ.@g°$((И№Пiў╤Gэ╪▒гPбB└Mб.x├╢╙зO#кA▒╜{ўЖЖЖRmД√┼К├фУ{DЧ╢Mзfэєpen▀╛ K╬Ь9ВF¤№№╚с0sрЙ╒}№щяя°ЁсААкс ▄?~№xХ*U╩Ц-╗m█6-$ъx┼╖СV╕Puш╨ШЛ т'Ыi%с(Г`ьО x&юSO╤;z┬╕sч╬'ш"тUлИ╢n▌кс~ ■¤!■∙чрx╩┌вРв$bЇ1╙╒}zдe╦ЦЁ$к┬╘╥╢7е▌?╤S╝)Qв┼EМ√,Л┼b╜В\ўё рЁ@!'`Жа*ДжИ"h!<+iZЇ░5·Лxжk╫оИш╢l┘B;,ЙМP=В├┴▀ШУp#]Зg<уЫМ8с=ШОЪ?>zJ?Э╤пUЩ0эGОЙ╚ ╛└▄╨ЎЦ═у[0l╪0╝б^╨ БУ1┬a░0uщQ`┌∙┼0+VмАO ,и<чшЛ┼b▒X/Цыс>└─9~№x└▒ЯЯ_╛|∙╩Ч/°F∙ы╫пRп]╗Пzh■ &А╔Ё@6]╝x╝u ■¤╨╨╨yєцБ╧■?{яXE╡э ╧IБ▄ ╣$ЇЄзЧАHPдKХ▐С▐{G║tдД*~Їж<╜К" R╒?╜№Р╬#╘▄ўо1дЬ▀'gyЎГТМbт·^яa2│gэ╡╫^{╧w═ьwс~iЖ}Д▄╛}╓╒А┴є╚eч╬ЭB▓╣ДдGИ╪ю.3фЎы╫пўю▌√ь┘│ cСЪ╪э╬/$Єє╧?G>Рвa5#k┤Э4iRxxx▀╛}!юеЬ;w█(PА╩Р─$Гysщ▐╜{Д┴┴┴\5╣\╗v тkя▄╣│g. ф└}Q#■№┬nЕ"sк╗Еу╩в°Gъ╦У _╛|Єв ;e╩т┤C^╖;v ╦PR,│wя^{е┴╝СO-Шo╫тбdMA▄e╣K╝ГyДsя╪▒Г[ю▀┐х╩t├UЁIx┐DGd╟ы2e╩$3%фc■#█Ьсx4ДЄх╦├╦Й|ю▐╜╦I┐МЮтШ┌бQPeDh° ▒ ╟ЄёНц -╔\ЄєєЫ={6┼Чя$┤G∙4ДVxHВГaУГ╛·ъл║8ПBбP(/ЖдGў ╒9r$ьDVЎи]╗6yp■Ыo╛й\╣▓0c.╚kE!.Н7^▒bwэ█╖OфA┌Єх╦б╦ш0zЇhHШ╜ ИВтCYР&я5█╢m╗rхJcQ└дЗ9 8P6С:uъ┤l┘2и$aЄхuпхц·фs=pрАЩ%)г2 Еи1"=L ■zЇшQ3┼,Ю#g╞П?tшPдСЕ┐ ■{│FРTWлTйТ'O3▌╙f NIЙиBК)гисВЕ В4╦6ap;b-HЮY`GL═╒¤√ўCЧ┼ЮCЖА¤ї╫╨k<мX▒b[╖nХн╗0┼├ЗYGЩУД▌╗wзжp)№gўю▌Ё~ ~ф{ОЩМQжLЩ={ЎШ▒1─B$#[I)ф(┌gЯ}Ж(q_6из┘fЛ║├▓@> ШФ!PgLЗrч╬НЮ°│LС[pT╪┐х▒sъ╘)Щ°kЦу─OpKв;JДX,Ё ╗0d╚ЩС,▀yИZ╖nMЕ╩rе╬a%хТ%K║vэ*№[D╤p╨╩x5Оif╢аPT┴Ъ5k╕Л_"м╜tщR.╡i╙Ж╗prX╡jU"j"1YnиyєцDцfЬиr,RкT)╦╒вЙСшpfNJ+РСh8фЕtщ`ЕBбP(^ IПю[о┼.п\╣"пS╗oРЕAО?юх^ь<■№Bц8У#GО p■с├З▀}ўЭх"ЧPУLЩ2б(╣#╙Ю)м ╬}т─ О!vБББч╧Я ХuM Е#Є'ФЪ,ь#┬/\╕0l╪0JЕт└╝Ы4ф╬ГoLИd???,@bЇеKЧ,WтЇФa*╥ЁP╥╛7p╬Ь9ё"│ЙмxЩКJ@╚/▒Д╠<6є:т5мфr√Ўm|╥N╛ql▄├╠═Р1`шl┘fк╤NICu╨И╡d╗1╞h▄"+eБ╚@2QЮJ|ЁрБ]╕б√д'kYи╘°3эЛж-▒еX ∙V╢IЦ┴? r'ЕBбP(VRд√B╦ьPxЙ¤O3й╤P{J3 ╒,╘єлyЩiЭЎ3┐┼о$п╫F╣┬DeМ5%мTйR╧Ю=єх╦gЯЧiL█%▌~╡P&Н∙╙Мч6E°╒ё═Ў╗~╒д┐КўюW2)┬BX╧Dvньv{▒┴<╧Ц¤W╡Кs^Tr╕gl█-╟8ц╒╡Щcm>M─╔▌|Q∙╒В╪е┘?╣ШП Ўк┤Ы╚.№Y3╞)rЬк╖╩s#?ы`r !ДСlr4ЩJS2Чт4{2╙4Мnq▄їYє>kУ▐╠┘}╓р ЕBбP(Д$Iў╔Xж■u RZм┘╕qуГ +вЬЬўuбo▀╛гGП~┘j* ЕBбP(■^P║Я8РQ Zш╨!Q╠╝u╕VIя┘│ч╦VSбP( ЕBёўВ╥¤─БЕЄр┴┌nЖ@╚╚^╢Ъ ЕBбP(К┐Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓E╥г√hЬ*U*ЄFz╞хээ═НдсW╥Р@бP( ЕBё╖EТд√~~~сссўю▌Г▄єзЬ'?B╦Їщ╙ ╫6P( ЕBбP(■VHТtUVнZ5vьX2 H┐▄┬еЖ NШ0Бx@╬╦k■▀g"ЕBбP( Е"й"щ╤}Дr q={Ў|ЄфIъ╘йГВВд$OЯ>НКК?~|Л-╥дI▌╫╖√ ЕBбP(К┐3Т▌Gc(>J/\╕pф╚С+VЬ={╢д?{Ўl╫о]}||жOЯ▐мY3СЙ№ЖЕЕЩ°∙∙∙··RюПL д`╦IФ.]:RЄ'У/╟▄╦ЯсссQЁ'E0бЕ╙╘x°Ё!ЄНцйRе"Щф┼Н<РФ■■■O]рw! ї$кЩсШ╪Ж4)Rд└▓2?дMЫ▒Тй├ЕGПЩLIАЄ$ц<ТН&$└№"КH@2 т¤тtБвП(╔/u╟/ЕТ/*ЄuЕЄb.SРч W( ЕBбP$:Т▌ц '^╢lYч╬Э6l╕n▌:aУH;vь╠Щ3ч═Ыя9PRx∙Ўэ█зLЩbД┤h╤вSзNФ═╥а├кUл+╣╦/q┬Т%K▐|єMф6l█╢m$&_╕2)ЕЛ┐ў▐{CЖ Б4ЗЫr~ъ╘йТ^@ВVР{ Gv=zЇ8qтЙ╤∙╚С#√Ўэ#/(rЗРу╖▄Ї{QК~¤·Э>}Ъ4bьЛzЎьIAd 2бр ╕pсВ▒╒И#кVнК4Щ▄,ч?~L.Ч.]BЩ -ZT""╥─ы1ФЛ─ш┘╖o▀╚▄Й9r}бOЧ.]иP H0ьЄх╦Л)"сН╥}ЕBбP(К?IПю#V ХДЪ╖o▀к+┼е┘╒лWa ўю▌Ы5kЦР`Nо\╣r╞МdЎш╤#г"┴ї╟НWлV-99{Ўl┬ГТ▌чТм╗┐|∙Є:Р ю+Ї╣T╗vэ └їe╤Ю╡k╫О1тЎэ█AAA╣sч6*r═▓f═ 9&р╠ш╤г'MЪФ1cFТaN<ШB^║tйpс┬щ╥еУ3▌║u[╝x1D:Ю-[6▒ФЧУлVнZ╜zuёт┼Й78&M╧Ю=3e╩d4┐sч\ўю▌Я|Є фШ3UкT9xЁрД Z╖nЭ%KГ┬h2`└АП>·H▐т╫иQулп╛ВыKБTо\VН└╝yєвsXXXЯ>}>¤ЇS$╦g@\з№°1ti 6Ф╕sQKz─Тя█¤8о│o▀╛vэ┌╜ї╓[sц╠ D7Йю▌╗;vь├?l╥дIЪ4i<иP( ЕBбHt$y║_╡j╒РРrВЧ├│=z▌п_┐╛$Ж7├у╙жM │Ч10Ў"y{{>╝QгFXN╝h╤"Иx┤ fжlГ ·їыЗbBў╗vэ║tщRи3t▄╛НT╗yєц_|ёE┘▓eы╒л╖sчN╩╓┤iSBУcDD:#э╨бCDЦЛю∙хЧы╓нГИЫ" ▌я▀┐ ╘йSEУЛ/О9Є┬Е ╨qQO┌┤i╙▒cGJўЁс├ *\╣rZЯ"E SL Б8р$ёAЕ╘ tЯ3f323├8A/рQА┌┼╘╦Ц-{¤ї╫1>ьЯ╥Дl╪░!■№·F_бP( Етх"╔╙}ш&]°+D│f═ЪЁ┌ю▌╗├яI╣f═ЪQгF-Z]░`A│'ЪЭ9s=р╟ЄZ¤·їыwю▄╔Ф)Sю▄╣╣║k╫оЙ'а╒Ўэ█схТu╖n▌Ц,Y┬яр┴Г│e╦&'CCCЙVмX▒qу╞b┼КuРжwя▐$╦Ш1г╤№╓н[єц═├─┴┴┴ЦЛю!а?ВKcш╛╠-F7T┼XEКIУ& E ╪ Ь╕у┴  t┐o▀╛√ўяч╥{я╜З=Ннi._╛,▀░ЙdБ╣╬Ю=KнРMф╝,ру▒чXbL*▓VнZ8╟▐╜{OЯ>=h╨ ╠2g╬╠HL"["( ЕBбP(^Т▌ЗкBO!тsч╬ЕС┐є╬;у╟ПOЫ6-┤Z▄░a├k╫оїы╫пQгFЁ╬└└└РРЭ:uЖjTD9ИЄ┴Г/^,├ў╟Н7a┬ДЦ-[vю▄Y^{г┤М▌▀╜{w╒кUE+ЙЕ RЄЎэ█lРЖ0c╧Ю=▄>f╠И╛ "j▌║ї·їыGОI╛FsВБщ╙з╧Ю=╗GПdqс┬Е╢m█Ю:uКRp Р ╕Л╚с¤ў▀Зю-P=─0'OЮД╩Ч,Y9OЯ>їїїе╘─$№┬░╤ Ўэ█$уЧ, .l2Eф`К&Ь■■¤√╡k╫■■√я¤№№dь><Щкф╥еK╪ДJФ╔ссс█╢m{ї╒We%╙Д T( ЕBбP$.Т▌Чй║лVнъ█╖oDDДхZfзl┘▓Ы7oцЦх╦Ч8Р H╦ЗCЭ }Z╡j┼]╪ю{р└Б;wюPHУ#┼DZ ■¤Ы6mКцїъ╒#Н,█П!d<1 ┌r¤-ZщЗ@Wо\∙╪▒cвЫхвDР╙│gOB▒)║]╝xСАA╠b╣g▀■╙JJ$,k└!sя▐╜o╜їЦl2Р╨╖√2ш█o┐н[╖.'Л+╢f═мбKё( ЕBбP№РЇш>зJХjы╓ну╞НуX╢╩Вю╧Ы7OV┘?~№О;8юъBdd$∙m▀╛=$$─.gь╪▒╨\ )RР$o╣╟т╦┌С░№╔У'╦вї▓╝Lўю▌/^<|°pи6б)IV│fMb ТЙ(Їб└pю9sцPlУcу╞Н╤;╩+Ў╬Э;C╕IL)╚еFНZ,[╢╠r═▓%fАFsТ╗О=Ъ:uj╩┬y╤д_┐~\хдl│┼%lHжDч╧Я7UВp┬ДУ#╩■\>$N tЯт╝Ў┌k▓▌XВЖ┌Ы¤╢о^╜┌о]╗#GО>tХ(QBф$ttРBбP( Е"╤СЇш╛lX 7 Уїd╚┌Ъ&M╤АЄ└z9Fcи░(M▓╟П█┘'|]▐@ ╨  ╫'wоB▀Йd┌о╝╠ю╥е ,ЯИвGПД┬зQ═┼LЄЪ\$ ╙,Бац▓yЦдD H╚U╣К4tр.ЄОYd√^∙.!sЛec]КCy)Э┘r╦hОX√~)7вдФФ4H{ЄфЙS6╛╡Jўe╘▀╡kOц╠Щ╫н[Ч+W. М ЕBбP(КЧЕдGў╤f,├Z╠к2ввPyй,№U▐@╦╢PЦН}Ъ?EВсшfК▄h/┐мm?`└АН7Є█йSз└└@Y▒GВ#┘ДvїьfТє&е╤аЄТo MA$#{Aф╪ш'S9i╣c╗Жv╔ж┌ЮяFUR▐║uЛzх°Ўэ█╜zї"~Ш>}zйRе ¤D) ШХ■ ЕBбP(/IПюsЙМх]°ЯЎЄXFє6l╤вEaaa▓?n╫о]с¤▓ЦехWN ж▓\╤│g╧;vPjМ╩APPPЦ,Y╓мYSа@Й.Їэ╛BбP( ┼╦Е╥¤°!├x88pрзЯ~*п╖a ▌║uуМ∙ШЁ7YtRv4г╘▌╗wЗю╦З╦=╚*00p▌║uyєцХъS║пP( ЕBёrбt?~F&ян∙Е┌Ii║GUЕ}(╤═Ы7й53ш▀ Є╔Ъ5лппп +·;╪DбP( Етп е√AHн╝┬Чr╩▒Щ!Ё7с╡fтБ0{Щ0`f╚ ~╠ БЧн▓Bё 8-зГьtyж├эИЙv¤с√Ю═┐опUgМ├uц%ылx.ЬR]▒╒ъ┤bb╗(╫)/╦█с№∙В№▀r──&u№-:jЕBбИе√ ЕтязЛzё\Ю_/gМЧ3╥Кс╨█▓|,/GьyHбэхМ▓мФJў тpЪЭЦ#┌їЧЛ╓[>╨}З╙ЦNщ╛Bб°Cщ╛Bб°Бn╩їv▀M ]Ї>┌їы╦ ]i,+╩{=х╧яОU№№╘q▐/╬8O╟╧Я┤6 ┼▀Jў ┼▀▒t▀·∙= ╧ Y▒40╞√\Ёч╙%ИqD╟■└юЭо°╠r╫й╖Лт{┘j╪й╡йP(■╛P║пxA╚┤]│йхЎ┘w,╞ьЧ°НИИ╕~¤║}Ыooo*=EК&ёs`▓ў0rD∙є╧_"╔╛IВ¤LЬ}!L▓▀я╖f╥И=wsU▓0S╠ ▓╦F┘нdf}╚%{q╠<ЩDЩ!уМ▒в╜bвмhgьАЗОу"Лq%┌эe9╝-o/■НrX)_CдН\║t╔L Єїї═Щ3зЧ ╢*6╚ДieЎ═Iд╓М╦I╫ЯP3SА3п ┼▀Jў/ьO-ЖЕЕ СчqкTйЄч╧Я&MY╜╘<їЕP╦;wюь▌╗ў¤√ўНЬААА={ЎФ(Q┬Є`ябп=rф┘q╫╠Ч/▀╣sчpМрр`N■qе■-нL░┴я╙зOOЯ> iC╧╠Щ3г╛ Г)TиРХHф[ныъ╒л├НЄц═kЎM│\-Ў╩Х+╪Щ?│d╔Т;wю▀]╩─З┘ЬAВC╩В┬СССЬDa╬▄╕qГЪ J┤u]cgtF +ц┐/▐╗ЇяШЭ0}'\╨Ы ,GLдуИIa∙дМЄ)Рб`яWмФ>>▌╟y▐xу М#~Uа@Z Х°rYй<*.^╝HonBV* RОo╙ъ-[ЬЩP7ЛOЮШчЇщ╙╡j╒ └!▓d╔bфpЙg╣Tw╝ФпВ^╝x▒Y│fwю▄Б q;юuєцM~qИС]°Яє)ГV▒wя▐╛}√>zЇИАЗт@·1j7n▄xэ┌╡(яэ┬я╧Qy╨аA╫о]├р╒лW╟░ЬдuP ╜zївuб╪ш╤г╗vэ·√s№# Фю╩Х+╨╗={Ўd╦Ц ^Л=я▀┐я▐=.-\╕░uы╓VвэZMм°╙їЁk3╢╬:Ё┐КЎН╬Ї╧МiSD┼8г╝c,ogx╘O ¤°▀СбС3║L+У¤u?╟?■№╤│Aяш,WЧ┴Uфp D [╖nq/7b╜ь┘│Ыv/ч3#│ЙЕ╨e |РУt SзNЕЇ/^╝╕]╗vЄЙФШ╥╔ЯC┌(/╡F2Ф╠Ы7/Я┼ Иё ┐№у∙+G<■ё_єZО═ J▒з>>+╥╟Кў  h├╠п╬ЮШ╓mbеLe^ёц┴═─Сд8x▐E╖ЖzТЛq&MЪ4╞ ═№  ╕є╥н┼┘░П&SеJLJ ДЗШюN>pсе╕ХТ#G .c╨ЩЬФ∙0жS╞Un▄╕!o╟I ОM3h>▐╛T2¤ю╗яъ╘йS╝xё╒лWЛЁ 2с5j╘апG>С2╝ ¤ё(ЪнТ[╚ZвЇ89Тx╘иQ'Nь▀┐ Ф)S─D╪Ё╚С#t) 7+\╕0═КЄ╥Б─ZЙ№КqжООp8ЮZ╬ 8│)ф?'╛Ъ-8д┼,┐И4OR w┤├█╟J▒x√╝▌▀ljY│q╗╖:┐тH'Кб*Q─╗я╛╗}√vе√ Е"┘Cщ╛тБ¤б╚%JФАєэ▐╜ЫЗ║>Q╒Еa├Ж╔tCX┌╝yєК)b╣'% к╦I┴IЄфIt#ЬАдVкT ╛В╢ы╓нЫ6mZ▌║u'OЮ,НДУШю┬Е Гжpж}√Ў╚З╗sKУ&Mf═Ъї|;Ш9╩╦Ц-ы╘йУ░mr\║t)╤┬ThfЬЬ4iё Дшя█╖o№°ёr/W9.[╢,mPAх,XА■b°TТь░╒ gх.LНёI╨бC.┼6cИ¤╨{z8¤╤L╛Д)ю▌╗w°Ёс}√Ў%fР1QX~┼КhH╛hBvНє<~№╕Tф$qЩ0P_dъЇrD▐Н╕╓v∙р╨▀_┌vRБ└╫оЖ=ЇЙО╠тШ"e╩Пw,=z∙╗Б═z╛Щ╛$╡/▌Зщт3tИЦлQ`╠┘│gуQ0o▒м ▒3їN8Кїиt√|Vм ЛЕ┘╦MЙЙnФ0oу╞НbНsч╬5l╪РКЖo┘▓M╕rПЙvэ┌Е√╔╟1Ъ БЛC·EНx√R3цкb┼К4лO>∙DnбP(А'тв'МV°░4vb■П>·И░▀╢\Б. г ¤|ТН┌M>Xст╥4mF╘ў▀Oл─nDЁ╜ў▐╦Ш1cP`Р#╥КJуЁОК╢Ў▌╪3t═АyК╧m╢╪ё╘ё├O?дє═фЫ~├ЧkvЭ°╧║o╫iXкI*ЗЯ╖°[Ч.]0]=X╝nгP(IJў/Оk╫оёрOЧ.▌gЯ}╖├c┌╒■№є╧▀xу q xЎС#GаТ░єb║j╒к╝yєzЮг╨¤-Z8pА\f╬Ь)Д▒Є%Б'7gю▄╣ 8xЁрып┐╬пхЄргGП╢m█Ўт┼ЛEЛE7H╔∙єчёNиE$АЄРE╢l┘`║wя▐н\╣2JтЩ╓oS"y│K┘╧Ь9╙кU+<:╡pсBШ+|E^ыжJХКЄ╩'Вo┐¤╢i╙ж┬д%\A┌*╤zЇш1qт─xM!1Mи[╖n!vB[╪lШ╨UСO+7n<ЙФ╦Ч/ЗOзtA$╚8(.┴5ы╒л'е[╜z5VЕ`бКЩў¤№Bё▒9гFНЪ?>┌R4x╢iэ№╢k╫Ош┬М╬z>─tь╪·ИbCЗEy)*ГСшzф╜x│f═и`╧╚ЧщJш┐╨688жп/┼.ияtжpF▌¤ёz╗ГяF▐╫░{PЪм╦ўm╛}хЗQнЗ╔Z4,2№_С У9╒?╙DеЎJс/▌'J$Ъ┼С░@vа│ШЭ38<┴ЧрФЩШС╕ўvnжвТМ╗0/Юi┘F┬№▌Q█╖oЗ=BHgИ√╡i╙╥╧-Ь$_NтW╒кUCI╝СъжеHMaO"mу╝'п╖Е%╙]U╥м6m┌$╜4ЕZ│fM┐~¤╩Х+G│B°┘│gihЬ'"·%1A╕T%ХE├∙ SэВ>Tw╗О9ТV`&ь╝wяTп^╜hзДФ-Ъ╖HЫ.m ШиШ▐)v¤░╜▀ъЮE Х№а·Шыб?,■╧y╜kЎк\ыIф├ЗQRdHяУОшM╝Отп]╗╢OЯ>╘oё Е"ICщ╛т!cyKХ*┼SЬ╟╝ GСEю TыО;╩Ф)#│xёГя╛√.Blбф╫╟╪╣'3t Дs\┐~╜e╦Ц°Р В ┴o,X S8OЕ╓├ц!гBў-╫А]h7ц╦Чo▀╛}P╒SзN5n▄°с├З▄╕rх╩CЗёрЗц╓мYsъ╘йРrт И;бЙЯ│"* уG╜п┐■║wя▐Wп^┼,Т╛NЭ:c╟О┼╔E7x╞о]╗рj5rБ╣b4l2c╞ Ъ9rюпёхwщ╥еЭ;wоQгFы╓нб\]|Ё└дIУ╛№ЄKx╪Д Ж BsЭтЇ╥/BPoЁр┴З&GДHXBуДи╤й2tУ╔╨Л/Ж╤Ж▒ ┌b1n\▒b╖@Шф?╥╢n▌JvЫ7o.QвД *Ю├ф╤▀╕qг┐┐?ЎC╜ ■√ФH^Ў[оЧшН5║yє&СЄх}?С Э:№ё╟иБ'─c7╦∙╘эы┤B }л▌КA■√|!▀W,G╩╦?ЖжКJ9╡▌┤r9╩е┤R─X1▐╨ёh/ЗwКxщ>ьєлп╛┬╘ь┤i╙К/N[└ЖРo╕)▒hHHHїъ╒╤Нcм╩яГ(╡|▄а╜б;сУп╛·к╠Б╔╧y╗O┘хлBО9`ЎfЭ▄2А4·RЩшВ{ф╧ЯЇш╤$У╔╡шFжH^┐~}С"E√Z>~y╜Л=r№WX°ЭЙН╞╜Чп5юxЪ╥∙ПTи╧╧┘ёKАБGб<9╞S╟ ЕBС─бt_ёВ└■p/ИWPPРМШ╖\О╤Б└╚wю▄ ▌7KC┬Юс.3f№ь│╧ьЛч$иy╞[.ў"└Р0ЬБ9сLп┐■:D0o▐╝B4CCC+WоМGAGДМВc╟Обi╕JД╦СЖ█бя╝є╬║uы┌╢m√Ў█osс>~№8W (sB╬sє╕Ш╟╧l ╬G.0~ь o╟Сs9rдLBхjєц═H.rWXXDЄ эЖ╣z2Р┌r╡^ш~╫о]4h∙F`▀╛} Б░єь┘│сs .D,Ц7n6бнЗ9ЬбщQГдЗ·╚K_Ф∙Ї╙Oч╠Щ#у╦IЩу$-╣vэ┌Rбq_П=FМБ@▒0!╢-WоЬ'├┴═Pr2BУAГQYЄ'9┬П╗wяN\A╫ГV─3░^╩ qФYhЛС╣ ЦЙ┬╨═°g X╬gt*зu ╟█╨¤sO╬цOёш■═иG^сОР╬s╩e+Я*╩█╦с▐Ц╔КжоМРБёгaо\╣Ё%:1·Ghўў▀OрE2AЕФ}YГHq qЗчU-Z╘юcДг▄ бЗ%?╗27>O╗ук╕Я╠c┴°x╥▓e╦ЖUс╨┤8???BkЙ1h t┴\┬╬х╦Ч_╡jХ|вЙ╟t.Ч╗rх -И┌б #НАРQ╪║uыт0"GКp·Їi┬ RЎь┘У°p3tцСАrl0╨ 5h╤╨¤1c╞Xюn!╬CE╠E▀rы╓нEЛн[╖>cжь _б╠Нk╫я╫│╧о╢Ї√┤?t?╖у╒'▐бa?▐_wLГB═,/╟SпиQ╛^▓O▓<Уh88░╥}ЕBСьбt_ёВР╖ьЮ▄2ШG╞п├└d0╧_|!Гyджа√UлVЕs╚ZЩ╞]TЙЄv_ШЇу╟Пх▐єч╧├>я▀┐_╢lY(/·X." ы║o╣╜є─ЙЁЫ№∙є∙хЧi╙ж╜vэ,ЯKzNr/╝╝NЭ:Ы7o&ё╤гGлUлFl└UЩ°[.g╚7┤Oц░ттт├╚ с╕SзNУ&MТ@еf═Ъ%KЦДееIУЖВИлOЩ2eш╨б#щ╛`┘▓eDН7^│fНL_ЖЧ├ябM¤√ўG╘╘йS @╓pP!ЛсИхх9 ъ├?Д╥&ч╬Э╗a├ЖЗ╩,R)W╕ Ы6mВjЛ мдD&9▄√+╔ ZИц[o╜х ▌Ч╖√▄Л╬dAO!УЮ,XЯгЩCЧы╒лЗbя╛√ю╔У'■цЫo╩LbaкЮX;7i╥$~╗╣є№W° ш■эИ█cъwMЯ&█╩╜Я▄∙сцР╓гKg+эх╗ї.?^∙ж╝uж-╝ў▐{ш╣e╦Ц"EК\║tйe╦ЦР]тъZ<фь┘│╪█BФеФОЯб{е]<█╗Qш╛y╗▌ЧЕч-╖┐ ▌╧Ъ5+7Zюй┤/^─еёmN'╨ ░'═h4I╞п╠╙%р№фУOd\╝┼┤\tХhk┤i° ▐Л&ж╙ЦЙ┤ўт┼ЛИ╥$э{,H;▌чк─КРя╤гG[╧мэ#yс$·шгёу╟ўь┘s╞МЮМм,_╛Ь@Цi├█╢m[╣r%'3f╠И(H3Dр└Бєч╧'Ци^╜:1╖ бq╥ ГГГйЪY│fб$╡}√ЎЦ;╛В╠┴зйPт╤ сЄ┼А╨BH$ч%^"Ф*Sж╠sЪ░╜2кo▀╛З▌ЪSш>╩аRєц═й╛Н7R 3╗Ф"╠р ╪╓║o╣зъ■╫╙ыm■╧а{ ║м▌дВБ┼╗уИzЪ9mюTЦ_jД─D╙ЗEy{y{░ъ╛t|xя╪▒c╬Ь9▒сД иh"┤їєєЛvбEЛTНРI╧╫nhБЎB╚еgщ>■№ь╪}╦Mў9│ЧМ╩:|°06ЇўўЧёuЁЄFН┴Т╔С╢ ─хH|ўю]ЬБ&,·у│[мє╦`┼╠Щ3═╘ bH№M&╫Jbшт);▒БихО4Ью]xЭ┐\ф сD┤ЭQгFAўЯэ█х├╣▌╔')№│Iг& Щ┴/гoКФ  И╪{s╧╨╒ой║═[С╤?№ыJ╢фNяХ.┌':╥ызTQйн/Cў╔о[╖.t_╛'( E2Ж╥}┼Лу▄╣so╜ї{HМ╝ Д▌B▌ :sч╬нUлDG\'г╩y╕ТШзl·Їщ╣ЭzЇїїM╨╪}*]жЮ={т.S!LЕ .)R?│╙}x╧▐╜{х═"фйwя▐ч╧Я/X░ сь!D&┤Б═Ы7Ч,Y╩[нZ╡ъжMЫp0ш~х╩Х  [(,oФ╦хвввф б,G╓%Д;v,╩┤j╒ цj╣XЄб╢╨&H╬╧╔%KЦpL2°"7zЄvЯ4dД╠AГaHХЁз█╖o├8 ?иlF] СO№iДb 8",кqу╞Д0{И5┘│gЧ& чо{ўюQ╠Х"E Z+a№М_╚Х(_ 8CJl[▒bEOкU╞dг*ОБСєф╔ёк]╗6ч/^L╪Г;бs│f═╨ф╠Щ3╘2YC4й,Y/h┌┤iШNtk╪░a№єГЭ0yШf°ХЁ ▌Ц{Їя░Еm&xеШ╙схчУ┬╦;╡#╞с;ф'╩щЁЙЇЄЄdУ-ё.~Й~!╕ЇnD)ДC╘╬╓н[Л-j^l┐ё╞xя╟ ├Ц1·7n▄6lё$┼б]╝∙цЫ▓{ГH■ю╗я08■МJУс┌Ф╪Vш>#нO"╪pп^╜╛ ■{И>╥ х^b╖:uъ >\ТЙХp~ъОВ┐y╕ЗNN-╘мY¤╫о]+Ф]&RЫBвbКyщ╥%Ф/[╢,Nh╣!и-+еz=│G2╖PГ─u=zЇ└!e<ЮD╕б╘╔У'ёIl{ы╓-ЫШ=yЕЕЕ!^О4┬Y╒■■¤√░НЛ/Bюх^g├/╤ЎUЕ╔6оo┐¤6TїЛ/╛АФуД-Z┤АS=zюО┬-И+╨Ў╖▐ю╦°JД[├╝eБЧ р┴ Rп^=H?%╛Е)ИЕ8Р/( GЧ1╨JсЙccj╪$a, Xа@HШLа$nAи$F╚Т%╦И#dJБF3█РI ║sч S└╢m█Тr╥дIЁK +сН,╡Д▌╨У!┐|∙ЄУ'OF$ЫП[и\д┴ЄсЪГC╓KЧ.э╔ cёш>╖У>wю▄dJОХ&LШ╙Х╪ЖП:"Ш┴╝b╔╗. ?l╘иСGt▀∙ЇF°ї█f°┐г}г2 3├+╛п№є╟Ўп╫/WЖ╝йЭ ░"^▐зЧ3╩эcy{╛═Э╪W_}╒╡k╫TйRсУ▓·кL┼!Д┴Ы доЕ&eГМPвD BЧBЕ 5m┌T╢N├╪Б° ╧С[2f╠H╪ЖХ() oзЎe∙Qы╔F&НЧFDO]о\9ЬЯz╖ў╤╪У\им-[╢xЄ)Uс╟'NЬ@╛,Вї'ЮФ ЬФN ▄╣s}·Ї┴=?hщдФFG ¤[я╤▒-┌╜c╟Z%%ёЩbR""\S╧Ъ5ЛЄ╩╥ЩTН3╥rжp■╦∙яу7N╬■╧├.жNЯ*¤?╙g {еrЙкНJ7√З3НЧхх┤Ь&#)щ▐╜{qWфм^╜Ъ╚┴├*V(К$ е√КЎя╨б├щ╙зy╥Ы3╘риQгx|Bб)ft2Б)-ЫЧpХ─єч╧ўdнt∙P'╞ЗZ╖n 7ЕтРEЎь┘сЕP%│ФЗх·°┴}Їшв Ьщ¤ў▀7n|┬4d╚ИД╪rНFX╛|9¤ЇS┘ ╔T)93qтDy┼╗pс┬RеJy2v_(яА╛■·k8тў▀р└╣ }╟М2C│lE╤}╚╕<Ё°ёуk\ }№ J:ншШ╚█?▌Щ▒q╓=╜a¤ДRX▐пDеэ╤░g■,R╞дЄq╞kзWL┤#┌█ЄI╨о║╫п_зPp·4b"[1И┤ВSзN╔"<2n^жRРЮФ°nC╒╢5o▐ЬТ╩№o√D ╦╡U╢┼█х═7┴*═╫▓#^еъбЄ°╥и8∙ьi╞еэs╩ILS%SZлЗГyЁX№/Тq;№▄╩Б%┌Щ№т;[Ll`сx·╒ЕCkwн√╤ў╟Я|~К▒b^∙1eїR5ХkцыLххМ▌<┴щpZ?>К¤wу╞Нt Х*U┌╡kЧ'Л╞* EТЖ╥}┼ ┬РWS 2ыФє┬f,w= p╕V√Ц@╚БРА=kНУ╔░s rДКX┘╓ь╞*ч═]ЦЫ1╦╜вЫI`8Цмчcv╤▓ЮЩAh .DG╘zg▐#╞╔T┌Жс╙b@╬└дGО Э ЙAI7╠r%Тг(i8t\D┘ХЙ3E╥ns,E╕сИЖ╜I╛▓Ч░9o " ╪Ф|~m ёХмНЗp╗iг╢yЛ,7r,│Иp6lш┘·ё╬з^С?YСV4╨╟тп fяэcеLi∙Z▒*─▓├G┤WB▐ю ПS┼ж7┤lНER▀s║ц╬╩z┘ W╝╤NЧНL╣Wф8▄Уwю&/уx&Н╜Fb▄<ЫzМ╧n1R8Х▌█э$C┌─R.бцr╒ь╨№,дBWп^M<Ё╞o7РЫRXюxOЄ2·─V7v─81Oни╦∙╘КМ&░^V UЩ2┌╫GЦ▐tp6:VМ3VNhh(Q╙Ь9s:vьH^║лоBбHЎP║п°╜РК0cс╛BS,7?6tP╬█∙eBє▓~∙ь╖Y3z╪щ^Ц^8УЭё ▒┌dxЙтtп▒# │/є[░'0┼▓С-г╝╜,@ЎZ╣rх▓e╦кWп>sцL│@чo┴ь╔зЭ-[#z6k╗Ic_S%N╤Lщ$YЬТ┌г╗щ<йY├GM.ЎZ░▄cr7EР╧Я? °ёc╠╡i╙жёу╟ўы╫O╓╗|>Ь1VМЧ3╩хэЁК]l╙щвА^╤QОHo╦╟█ ┐ўК╜/╫м┐ў╡GПq b┘*E<─╓/╪AY┐МНMтЬ4А=░╖И8СЮ]█чЇ╖ЎФЎ?эm9N5┘│3w┘{ГgaBИ╔У'├°{їъ5c╞ УXL─/ ╠Зw√Н5ОCЇЫ│k¤╘╪б;^╬╪ EСг+^Г■[─TЦ3:╢д2-╕~¤·6lpx░чАBбP$u(▌W(^&ИО╓п_▀╡k╫╚╚H!▀m┌┤Y╝xё╦╓ы/ ∙ц╨гGш¤v╦Ц-█ю▌╗ .ь┴╜о╫ї╬_№чЇq┬°╜,╫G з;Л=╥ц╧А|б?'шЭ;wn│f═▐<√юч·ч$BsXу╚c╚Nр]█'8╣╗ХBl\║m█6т├*UкМ7╬·хТа ЕBС,бt_бxЩаю▄╣є├?4г5ъ╓н√[CЬ╪ ╞F╖"яТ╙жM╗d╔цБ╨K┼ўОёу&Во^фч╛D{ФЧ3И+""В╕ЧГ.─ч╧OЗeЮ>юRХ▒▀i▄П │Жgx№°··╩@Jў E▓З╥}Ете┴мDЙ ╦`hY_RVчT№дs Чё¤B1Z╝л╞╬╓┤"cчn╞x[об:╨■HЗху┤╝ЭnВшpНHй╠Я3т╚>Ї 9█\№/Ьц_зхИv¤уК▌\єн~сяЁТZо/;26╧мjЖР) E2Ж╥}Етe┬МЮ╖OP■с9ь¤Ойгc∙╝╙[nИЖ ёЗ╙бt %┬Ll░;┐G▌╗є▀т╗╚╜╙╡цжC╞e╔·Ы╫Ш~╫ ы*ТЧчєL Е"ICщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W№Б░ят)KЄ?zЇЯ3[╠&tР║╠gХE╕CCC9уууГРААїЬн| ьЛ╙[юe┬╤э■¤√~~~i╥д▒п╘a▀3Лdс.pМп╞h╓8чўс├ЗR:вПьа$╔╕КТ┤│8║╔И줤¤ ╟6k┤GDDH╓№I#вщЩ¤┼<й з"Н[h╣┤dЪd┌┤iуьтdvXУ6П▌░Ж╜▒~╣─■У'OH/+! ї╠.i╥бР@vдКгvУў╦n╧.iOЕFFF···вАьп,Wkгх80ДЕЕ=}·Фє╪ ╫5М ЩХj0е&ke.{Q[6євШ}с|дq┘wе0Ы ЗЇf/SkV╜▒r(ВИE%К`╣'ЯШЦпYтьЁг fў╜TйRQнvЫ╚Ьl:┌Wум╩/ pLq9▒'IМ╦Y╢Ж,2ёFК {Т8((H6w╙gКBбHЦP║п°!Ob|E╢█╝rх╩аAГЁд┼Лg╔Тх┼т<╕vэZзNЭДy╧Ь93sц╠Ц{▄ч OE%ё~aзNЭъ▀┐╡j╒BBBь▄WИСРN9rd╚Р!Н53fМ]ж┘ХbЮ9P∙ ф╔УGzXЬЦV F╢\ J" їrх╩e╖С▀Я\└zxп╔в`┴Вєч╧G╦Г└Ы╗d3,°Ї╫_НЗ#Д°чЭw▐?~<5e╕rЬэoЯcy ═p╧Ю=У'OЦ`П▀жMЫО9╥r╡S|C║¤3g╬╨ЪЖ┌░aC╦Бї2|°p╚кMXGBmQПK─Б8@CрX╩N^uъ╘бшвЬ Е"YBщ╛тД Ю╕д▓x_╝x1_╛|░:ИЛРЫ=_ё*иOч╬Эa╠ЄvЯ6■P╛|yО9<ё єк√╝}√6т╨Д 4╪╕qгЭюУ ╩√$╞@2╠у·їы№9o▐<{1E&╩р┘}√ЎE=ШЧЁmшTнZ╡р▓ц └╤гG+Wо╠-Р<#ДK]║tБВxЄБ"б@▒ 6@бр║Р╠u┘▓eШNИжЗ№МR@╦░ТхтЧD5ўю▌├М│f═▓oPJbА╧>√L▐│bj й;vl┼╕JП}\╛|╣d┴ЩААLЙЗтЫ7╙*T8~№╕0c╙▌p@ш╒╗woO(жчMшЭиk xўю]бП(Ь7o▐┘│gЧ*U гЩM^Я/JтЗ .PвGП?H ├╔аа ┌┬Їщ╙_{э5д ┘*OМA░qу╞ Sj~╙зO┐uы╓№∙є╙Ф0DЎ╦/┐Ф╧ R5TкTЙ╢Р3gN }%╥╪╡kж#╛zїjjРАЬЭ;wжKЧ╬ЄАюУ6╠э=zЇае`rDaZ_э┌╡╔Q╘Ёд"$RтW"m°4]Ў╜n▌║їЬ9s(╤бCЗа°Kг├еKЧ8OKСпf[оFНep9Ъ│П \"=е√шгПИ╧╤S╩HC└БyьсРR;сссHгFН"КРfлP(╔ Jў Д╗ 0ВKeсj0И╚▐╜{∙Х` At╩9ш╪▒#Пчi╙жY.┬t·ЇiАВ NШ0бtщ╥ё>░Еiб&┴/╬ ╛|∙r▌║u!▓q╕/чaУenфЧ?;uъ┤pсBУ@╞q \дIУ&─я╝є№Ю6CICBB^}їU8ьJЬЎЁс├UкT)Pа└К+d─ВhЕ <╟∙_7o▐D Иj.┼Я?■┌╡kсФP+xd╝BМ▌ИI╢m█&яJб┬Ф ╢lмСK├З?pрАp2А :Ф{эеЫАRг[ц╠Щ $Б.X░цJИВMиe║Иъ╒л9rD╬█╗(ЭьTР(пfЭюE!щ╢ИKёЬmЇш╤Y│fх$j┤o▀жH▄Є▐{я┘Зт|°╔°¤u!╗УЄ╗я╛ГбТKбBЕ╕Д▌Ё!╕┘▓eУ▒(╘Q4;l╪0);})╟ч╬Э+Y▓ф║uы2d╚ ▀h2uъ╘бэи#═rПВ#BЎ╨n╚Б=у╧дZ╡jГЦ╓═┬-ВF84Є%ZєdlШШх╠Щ3°$╛┴╜-[╢DO╣Дaе-`Ь!CЖа< є╠8■№▄╣sqSM║єШбСbьЖIюKЦ,сГЮЇ DтlдЬ2eJ╣rхИ$┼9Й╡>¤ЇS+ДмН7Ў└G Е"Й!I╥}???ИРG 9e╠Ш.┼Г┴lЫ┬Я<д=См°s└гоq∙№є╧a-V┬G_└╢+Vмxёт┼o┐¤║,'!┘<щ!RpЧ╧>√ Zц╣@у╡SHL╜zїxЁ?G+№╥uАt╞"Ё@╜,Y▓|ё┼Р!"p6a L╥ї╒WфUдHдA_`Q╕1ЮП╙К┤DQ@░ё┴&-Z┤цD╙%╙O>∙д ■ўя▀_╛|∙√я┐Я╨║║Жdh}╧Ю=Ею кТ┴Й7H K6i─n\нY│&─Ъ@ -/щ1$r№°ёЛ/n█╢-╔`r5j╘°·ыпwэ┌ЕmCCCE╠Ш={v√°ї▀щFp3▄[э█╖/OЮ<2д>""J╜j╒*z└Э;wVиP!▐qPЄ║▌ИEQrўю▌ttЄБВМш"▀}ў]bN<░DЙxЭс╥еKс╕┼Ку$Є╤┴>─И4tйшЎ°ёcЬК╗дьДм╘)FF>:cNR╤─uP|B╨;v─й>│Ё╝'ь_%LMЭ:5=-ёб╪Ь┴ЛNЬ8Б|ZЯ╚ёp>6\┐~='\Я{б°ФOвТ▌Uq╦█o┐Н#╤═\йjД  ╧Ь9│TйR~Я={ЦВя┘│/%J▒╫Ф∙T┼1╩0@"I┌H╝Ъ+ EТCТд√\Z▒b╧y▌╚o∙ЄхGМQлV-∙р╬Щi╙жїэ█Wb■еЁ╤}y gВ.@`9Ю L,║/nyь╪1Ш+■a┬ЩБ┌кUл?№0wю▄ ¤тс ьt▀(LF 4╪╛}√ъ╒л[╢lЩPЩ┐Яю[ю/┤\8╠М░M╞Ц▄╝y║ПbKBўIY╢lY▀╕qур┘Р39I(5h╨ *=├д_е√Ц█[шd`╜P^╘иZ╡к'1ЖРuм$▀FЁз{■1ь_В.B─┬Е ╦ШЯ╫^{═▀▀ЯЁжyєцx5ФЭ?_}їUл вўДб┬ХQl·Їщ┬\п]╗╞Idв_жЯтБР`·ы╞Н7l╪╨щЪяыччG,a6Чїd╘o╤}.m▌║╔t┬─l в√GПе!а ╖i╙╔Є┴!Wо\твжBЯCў%YSЎ╦Ч/*TИ╨╕шjИ%hYMЫ6╡l_Я╚¤╤гGч╬Э#%ny№°qЪЦ─у╒\бP(ТТ▌ч╔╟SБ0ДЮ'┘еKЧ╕лEЛ<-xЁЯ└w╫мY¤6l№Пєt +Wоф╞e╦Ц┘▀юC41Ъ╠{FБ7n╚И,в}║O&{В▀z╗/▐BgЕ&╘Єц═Ыk╫оэббd▄┐╝▒ К▀╡kW╕■Ыo╛)sp!╕4У%Jр▐Э;w&цблEHЖ и╗ *Pvь#3\бь\#SЬРЕё"ys/tЯ~";d╚L─╜Dsц╠!|r║g╗╛╪█}▒]Й╧Э;G8 ╖У ОЬД╘т║0~╚╝9╤Э6▌╖▄MМ▓@zh8═Ы7Ohж┐Яю ¤ц █[╛|9ї+@ЙФ8└ f0q~П=.\╕0n▄8xкх▓фМ3>■°у╗wя~Є╔' 4°Cє─╕ЧМ$▀w▐yчш╤г;wю$8ёDЪщНЙш!╟2uо%-X░ад╟=а√▓йМЖПИИРюq■№∙°?*a|ZюJGl╔8Й ┐Х+WN:@LZ▓d╔█╖o√∙∙.\▒Ї┐wв&|╕xёт─ЦЮL╘~▌╟я╜ў╢вїyNўЙ╥OЮAЇр┴Гъ╒л├├О;╦JM.░ЬкUлтHЦ@B`╓О4gЮu-бqp/иЇW╓Ь1║Щё┴"gы╓нp,H9,╙░╖ўТ▐ўъCDбП?ц$─Ф_h}│f═Vо\)╖╚╪ы)R╚Мs╦E}&NЬ8a┬Д:@щЭюOЩ2e╚Р!░Д[ю0∙Eл═Ы7Ы7ш╞DЎ╡etЬжdL ▌1bЇ ГШeRМe #ДoMЯ>ЭРRelу▐yА╗акгGПж·фЇо╢j╒*ш>M[Т╤K╚тПШNH^xx82ч╬ЭKн5l╪0▒ьFu ъЄх╦2Vнdб╤Н║Гї╤э▐╜ЫГ8ФT|&╬ЁibvJКЗ\┐~}╨аAФЕЖ0m┌4╕╛YnИРжHС"■■■╡k╫&Юб╗#ьщ▐╜;9╥=R_$ЖЮ@r┤h╤bъ╘й1оїу▒U№▌w▀╤4╢m█&Уzс╗еJХв╧%¤дIУ$"%ЁУ╜$3─¤∙@∙╙зOS/шsш╨!Щ█-%┌╛}{▌║u Б0Фйq)О1И╫3ЛёУ9ФСє╪ЩJфA@фЙТ─oЭ:uЪ3gО╜ё:\K▄эрr4@╙т$┴┌╡k╣{RL}4╧y'*KЙ/]║t№°ёBЄшЇГГГ YyО┼Я3IQ■Ф╖√╘Є■¤√Ею{2h╪╕KН5а╨nD!Y╓yФ▒√AAA{ўю╡┐▌jH │лЪIБ√Ўэ#Рh╨а┴·їыэ>cчпzDH]┤hСY%▌L╗Фe╢е╝║ЖIП3*ПЗs╦тГ1ю╒╨эLhЄф╔├ЗЗ╒┴{=FЕ 8&5─Є^ю¤Ж(/Ц\╛|╣ЭхШВ8▌Ёrяue7Л@H<ЇK╘ЦrЙ╤$╜H#╪ k ▌7Ч_3¤юЦ{▒╒╝yє№№№.\X│fMсўf(╦=■Д?{їъEJш>їТ(#1╠╫hw╡j╒8└>o╜ї¤ЭT4Х =ЕjCў _Я▌Ф-п5╗\Iи░k╫о┴Г├AKФ(1k╓,ЬVv╬2[Рo╤вEЛ+╢e╦ЦМ3J1 Хб╘x;m'_╛|шА єч┴Гщ?Е╝Т┼ёу╟ GЁч9rpЮ∙═7▀╠Я? Ж dсWТq╔шl!шфю╔rвb2~ ┌kпIыцOЇ─С0╤_|!юpo]g|gfW ┌▒dЮ■°c┘пХЁyИЧ╠GGЕУAp!Фb■№∙ЙNў!═c╟О}ЇшЄaK┬,я▀┐▀вEЛ╦Ч/├╘eIУ■ёу╟wю▄с :H?√║┌╝Ш7QКмТn╝ШBм═1t; 6М╓j▐╚Ъ▒1╢ M EO8оGПDЄ╘Э╙5╜Бxe|}}═Лp·rЗ╧н[╖оY│fЙb+3hЗъГIц═ЫЧpв`┴В▓Ж{ ¤ўЙ<щ┐╩Ч/o╠┬╒Ы7oтНЇМ─ЬЎ N╫╛H&0`АьЗЕA *фt/O$Х┬яХ+WpE:▒еKЧ┬√e+и╧? ╝}√ЎКh!88Ш▐│b┼КtмДY▓d╩╦Я╨w"7Й{щKNOMЫ.]:В"y▀O╖╔]н[╖ж\4Ь 2xтoИвЛжрзNЭj▐╝∙Т%Kф.дaЗ╤гG7l╪p┴В┬з ╧д╚ФЕ?e,MЬDИB[зk│╢"EКPЎ{ўюQї─РЬз°╥╛╠уАЇю.Л╔Ox ╛═UУq $└Ча√Я~·)Нл ■Ц╦▒я▐╜ЛmeЖПР~╝И^ `(▌W(╔IПю╦`$BG:─├>OЮzЇ(,Р4х╩Х#2t║Ц%▒s╚П┘p:E▄ўхFhР╝Й╟ЕЁO╚1ЙсDХ0вJ]НзЩ)#o╣(,)бкР~ ЗАpп=|°0$зХс@dБV╦Ц-уOZE9rdв╙}ЪНm╥дIo╝ёlI',j┼ЯиGЫ▓JY╝x1эHцЄ╩ШК8tk╚FдФ╒╩GНEiwЖ1У юО═Й (c╫о]√їыGu@╢d├бА┤eи├дэ╪▒Г°Х`ihKg ;sц rd;*!y3g╬\╗v-Ўч╫├ErтЕ─`▓b=*:├√q╕2кЖЗЗ4шр┴ГфXлV-ТЩРХ М`┬3д▐roс [m╥д ■Э┼J─е2╣V╥`y√.╗├"КШЦФtПx╗,;C┘ h Ёл.]║└┌▀yч\ЛВ╦║√4Д█╖oЧ.]-лСї╬Э;[╡jUгF B>RЮ?╛wя▐Pс*UкP)hы╔bP╚Сi'Э;wц 4АaC─GМч┐╙╡m═▌<Иrq z№ ЫРЛМ√B╡П╢2LО╢CЯПйЛАА4╩NNpH^╒кU├ 'p@ЬЖ#с∙┤nдB|°сЗDї44у╒T(╟╬┤}"є▀яB ЕBёWC╥г√Є╠╪╝y3Э>wё╪г7ч╣ -h┌┤)╧┼└└@╬М=ZViHtцдЁцm7╤я╛√?А№ё'L╥у┘░aГ,qш╣@h┴C█╢mх╡╜╝╞[`W°Уl-d├н▀zы-оVиPa╫о]тv╫Bnsя▐=n ▀В@pcЩ2e L&хХ+W %$г$├c!·HлX▒"|ЧЩС"АЇ$·Є фEcБ█Aж╔Z г╥┤i╙кWп.╙:MbТ┴/IпZ┐~╜(i╖┴╠╔rE8p,t╞&$аU┌W.ЗT┴5╔СvКЕIГHя─Pц tЁЛ/╛н ·(CJ"CX)$ўbш▓T╖ЩN ─СЄбz╘]в╟ЎdtЄф╔!CЖ\║t╔К^о═t!ж░j╗;╤ГUкTщц═Ы8!,╢PбB╞Ю╥9╓йSZ╔╜3f4CwШ║МЛўJЁIx)~┼R┤hQ┬Ыb┼К╤┐I+ $аY'ИA ─К Бъ#Щ~№°qа░pтBч[╢l┘yєцх╚СГryb7з{Т !╥а▐eЭМ▐б}╤·ьщq~тZMЮ7ЛTHёOЯ>MGН┌2_?▒\  .;W╚Ь=╔Ф╓╟cВ║ж╝}√Ў┼┴,╫єЙцF№Oєс└,JbЮ[Ь$а┼┬ЦЛю╦aЄзЧ#A ▐.■жP(╔ IПю#Чз▌жMЫd/IЄр9┴├ЖоЯЗЯ╝Eу$Wy&щ█¤Чс:P▐я┐ ▐ Ф╖\.┬Sy╒кUfAеЙю█╖П·╞I Бqf═Ъ5╬Z{GПх╬ф~цуВ] 1╝є┌╡kЦmм9YФ*Uj═Ъ5┬Д8sїъ╒Ц-[Bў═$W9Q^░`Бaэg╧Юm╓мЩмЬH Им|РьДУФ@h ^Ц██I W╬ЪшыюKб╚n╔Т%2ССLбYpJ╕iъ╘йуШЕf▄╕qдй[╖.▄╤zfу╒С#GbOє╩▀Ёoи\═╠░Дп╙Є┼bЄЭD║Ж╔У'╖h╤B▐╨У 5а√Ц√e?5Лщ dT║У:т╞БB·EИх╫Gvд%zcЧ╨J*ФP[MЭ:588ТMGd┘цuр$Ў╖√▓iЪхz9└Ш┤зmц╖╔И╨wх╩ХEКС?щ1я▐╜ЛУ╨П┴АIЩ)S&┘@JV╥Ф╜и8АщфБ?[╢lsц╠)\╕░}MRСvф╚LF╨╤шh2№3╞k 3┬MЎ<ЦюЧУUкT┴0Е─0ж╚N╫Ь`╝Ъ@%Ic¤╥Л$k~1,жы▀┐┐4ГPSЦfТК&BЖюKи/нC№ЩJ!Р0cyвl┘▓6O#ТI ДВ▌╗wЗыуKвТ╠╟Э1cЎ▒З[гGПжюxдщBЬ Е"Y"щ╤}╦5ЫЫс^Цы∙AJ╬▐╝y╙ ╢ц┘#р/ЄxцА':`9)\Yж\C╨e╓╡ЗИqoмЖF(&grч╬-2эoйЭої^p0╦╡╥оej/А|▀║uЛd╞╣% ┴|╬ЁxX┬Э;wHf╛╚╦HZЕ m7яMС&dЪdPl`Я`ЖYK╛ЖЦр┤bЬD $eт┌ВHБы w┤Плц*S┌mSЖЖ╟Й}|°ЁбМЬ6#щх╗ еЦН{-╫╟r┤l3kЕиA^═kTю║}√6=АЩ=ЙмaтoLGJЪ|1 ╒*c`,ЯPHCq(пмт┬╔9r╚√u╗│Yо╪?╟`ЩheоЪI╞жШIц^■Dмl┬ ЖТ!dЇiRY^о¤зф└┤r$^5┴П tФ!√qт^y Нї$/╤0╞╢щ╕З.':#К|%Ц┼Е╠─YУ2┌В4╗м_NЫзТzд9PRКГL ╠Щ3Л┘е{чa#3IьЎф6эKЮ7(FMЩH└ht╕'√rЙ т▒d║&Ш+W.,зB Е"┘ щ╤}║iиy +ТylЄ·╨сЖykh=єVRёg┬╛т╕yтZ┐м▀Q[єК╤i[S╧Ь▒~╔∙ЬюIРЦ╦#c~mQaf┴Ps╒╛╢жх~Ak|╔3HJ√└w/█БNўцйf\Щy╫k)k╖L Nў┬AЎ║╚ЯvцgJmюu<│╚Хh_╞╟╒ШhКi7Ф=~p┌жэ ╞nrЛ№i╢й2e1,є▓Ы1ЧYd╞hkj3О▌┐ЬИlle╫═^уqМ,е3TМ{йY╗Сх}╢P|{Рfм$aГ]╕▌>"┴·e;К7R▓ ┤ыcBb{▒╖Ц{║vЬ 2QР `╢хк╕*СpЬ┼ОМoШ[╠w9c22╖─i┬E╪Х▒╦╘чЕBбHЦHztЯKd, Ц'·╙]бP( ЕBбHNP║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘"I╥¤TйRЩэfьЫS:▌╗¤ъъ╫Йzя▐╜└└└мY│>'Ё0╦i▀┐Я[0JО9■И¤┐"##п^╜·ЇщS╦╜аuю▄╣й│D╧(A0kcг╪х╦Чe vОeГ4─ЗьЛs╟+╨,▀qётEйqdR▐|∙Єy(─ОиииKЧ.╔ЮY╞СP╔▀▀?Wо\╧ъoV=e;єц═k_╖Ы▀ЁЁЁ+WоXо=ВВВ(жY_ЬЎv¤·uСlVdAJ▄щПb┼),ню╬Э;b╞Їщ╙g╬Ь∙ЕЫЙёэЗ╩■MV┌пжр°?)9HЫ6mЎь┘эrh√TиYs▌▄Ш1c╞LЩ2Y┐\С¤╞НЇ>"У╓d╢ы╥р_бP(К_E╥г√Цk╦w╚ #╬FЇ┬`аq╢┬ID╚Ў4ф;uъ╘щ╙зwэ┌ї├?4[╗?Ы^ЎЛсъМ3╕Е3у╟Пo▀╛}тn I┴?~▄аAГsч╬q,Ыьм^╜║b┼КЙ╛╧hВА▓П╒бCЗ┌╢m&q'!Ъ!!!o┐¤╢ьd)5o}╔╢м°╠┘│g{Їш┴1╞ч▐№∙є╧Ь9│DЙf7+AМ╘▓eK┘а╫юKеKЧ▐┤iУ┘CЧРаY│fe│┴E└╬я╛√.Nl▀W ╧№Є╦/xўю]╬7j╘иWп^4x╝Р√У'O6l╪r╧-▓├Ч╕1Цщ╘йюЇGьїC╛┤є[╖nэ▀┐ФpЕВП=:MЪ4RЁ╣К°<7тxєц═√°уП9╞,X Lд$fБыЇ╤G+Vм└hн[╖Ю8qв╣Киў▀▀╛}ў╬╗╫f╔X╙Н1┬r╙}ъЭУ}√Ў┼Ж"ш┘│з─╧╧я4 ЕBб°█"щ╤}4&cи╪Р!CД$ ЧаIУ&У&MЄєє3o·ЭXЛL(l~▒УМ~ХвЩЇєч╧ЗZ=|°b╘еKЧ─╒JX|·╠Щ3иA ╛{ўn╚h"цЄRИ>нZ╡·цЫo▓e╦&>─yLС3g╬i╙жUиP (QA╝йkКF-Я>}:UкTby╬└&Л/>wю▄b┼К Чїx]═Ъ5п\╣В2ЎНrKХ*7хМlSJВJХ*ady√. ~XеJ2ХW■Є═ср┴ГЁQ─RXсмxєц═ ЎРCIА(ю%G├Й\|r╬Ь9KЧ.%jнWпnЬаLe8MАшz╤вEЁoЪ^у╞Н╫п_/ d ПЇ3#GО▄╕qг4■о]╗biJhBJш■╛}√╨д~¤·╞Ш\ЄўўзOРбV7o▐Dyт:∙Мc╣ЪЎ░a├■{╫&E▒u╗:╬╠fXТСи `─ &PQ╠9TDPPQ1*╔ЇP@QQT└╤fT▓фЬvaу─╒ йо▌f6Лря·ъ|╕╬╬VW▌║Х╬╜}л f-жt'$>░J°wац╤}фЛu=ЛMЬ8ё▐{яэ╓нЦ▒xёb0 0lЁЖkп╜╓Пьчс╘`├~Ю╚ї┴#~   1╕ЯR*Нm└Ч╡j╒ЄwГ6A_\q Ъ°▐─ў╡├Щ╚КЯ▀аDPлбCЗNШ0бo▀╛ЬБ╟Ё$юpEЙ№дЕB(╫П▓╪▒cчЇ~╚zу╤∙\T╬РаkЁ╫∙єч∙хЧ╔┴<~|9o?├фw и wЩs╒э╜√ь \рю▌╗/_╛№╡╫^;ї╘Sб44ЄЗ5r╟w$Й╧? ╝]╗v╥╛_AT<╬╒5i╥ДыUЮ>}:Шш5X#╛▀w ╫п_▀╡kWш№Ыo╛Б╬╣█6Г/О"╨╡`;с{$C╕ъаФшЫ°∙█o┐!7я╝єN█╢mС ·┬ /Аёг╤╟ОЛзP0WЇ░о|иЄБ╤Є╨CёЧAыХж╤Г>xцЩgв√Afn3Гю>-╛~сЕVЛюCH( ЎМXШЧш├иуUW]у═O├╟4cц┼_ДСЖ_16o┐¤vЯюKЮ▐а4(v┌┤iш*А\>Hy?─ФqуН7" *╥гGю▌`E@4:└9чЬ#╝√Qєш>wйвl╨╟[n╣х№є╧ў▌wy─21b╪?,Ё~╬├"f═Ъ▓┼∙ЗфE-#к─┘-ТБdрё7▀|єХW^су!▄7 Є╦/Яr╩)<`ЬцН7▐рAHГ|Ж V.шЬ√ЄQ╔чЮ{nЎь┘╚╜■·ыёсСG▀║∙цЫё8 ТеKЧтK&╘ВУKюЕL└╠sГбf╝`┴╛зУЗСр┴█n╗ ╔PЕdвlЪцщзЯ■├?|Ў┘g`Q╔Rqфхх┴╥╕√ю╗Wп^═█ЙчЖ`N0к L┌°u ¤ў┴╞P}юс▀╡¤щзЯЪ5k6c╞М6m┌ps╡'LPI<[в ■иNЗPP▓У~п@ўГ`h¤G}=Д╖°ё╟?zЇhNЛ%Ou╚№м│╬┬п0*@X╣~`╜А╚r{Пw╢?■° ДЭ1?№pnК [░╥╦.╗ ╜K*√║Й╖h.иpЯ>}FО SБЗиэ{ЎO>∙$:*К@ят6ПзG╙└@┬P║ю║ыкы▌G▌С-4v╫]wA швW\qЕя▌чUCY03└їС cГ?√їыЗЮця║╞╠Г/Wо\∙╔'ЯЁшЭ^╜z┴0А]m`wъ╘ │М╪╙N;═▀Н*└цЗAўQ·БUЪААААА└┐5ЫюГ\xсЕ Ь~-[╢ мtыжЫnтЇq╩Ф)аn▒X е·▐ёTр+▄#Иdацаїр╩xЬS╛═┌ъ▄╣3╧ Ь ЎАaРyВ│Є`ыdiQ Ш·w▀}╟П+сzБ·аЕ]╗vБ╨├╥@AW^y%Ш h ║├}╞рЕу╞НCб╚сЙ'Ю@╜P╩аAГ>№ЁCdЛ─Rй╙╣A]рR`№╔еWEў9╡┌╝y3g╞РДsqn?а:╚ЖЧф@yIy▌WнZ*Ж╓i▐╝╣/ ·їы╤ю`Яh4(O┐яМ9├■KЖ╪р¤иQлVн&OЮ|┬ 'TЛ+п]╗Ўь│╧▐╢m П;vЁVFЮP╪'g№°U8уМ3`┤l┘rы╓н°zЖъ.╣фXkiii╝^Л/ю╤гМРO<UCяь▒╟аЎ╦/┐╝"▌Ч╝▐К|├ 7 2)еГ│х┤▌ў_b@┌П>·zГ╒в√ш0шл╚ ▌Д{ц╠ЩацW]uh7O└7йc\├(Ею╣чt<ЇmЇjШ╗Ью√SцБn!UAA$ф;б╤єaKр/╠н▀ Э╙}~┴Ф є:ДA%чиИЪMўA_В┴ ?КщQ ╪├?▄│gOф └╠xlqзNЭР╪╧dЎь┘ (Ь+єШ Р!Ё6POЁPН·їыГ>■Є╦/╧? <¤q╟╟╡FQQ╛w╣уО;`KФ█$░d╔|┐qу╞с├ЗЯzъй▄їОё8.~Вю#(&(рП?■8c╞ ╠УБ)О1тЕ^8p ИчЪP"DZ╕p!o*Gуdю▄╣ ИР<╣Ї=xўёs├Ж чЭw╘Вз5jД|┌┤i]бюKЧ.}шбЗ@jў1М~_└cWЦ/_║Еtш╨БaДКа╕P(ВqвеjЮ ГlбШ[╨·rk╪░сдIУ`Ш∙╞├╛н╦ Єаю ўи5▓EА▀wы╓mъ╘й\64┘В>├г╔╤pр╨░└°aRJ^а┬F╧ся10l╨a╨╔+їюCxШsX■■єX2 х0КFНХь▌wKПEш 9tь╪С┐yАо╨├y(TЗ&ЖUVОюKЮ2a`L╜є╬;D\o ╘<║╧╥ ax°цЫoо]╗6╪m"С@v▀~√-╕ь╪▒cЫ6m╩ЭхП<Є╚╚С#9yх╬l? Ўs╙M7с├╗я╛Л─+Wоф мД┘╢k╫╝Я CТ щ┤Юo╕фЄ#╛°т PиK/╜ФяDфхB0╨Nў0Шя╛√юн╖▐ытЩаtd ╧╜√Ь¤ў┐ ═══┼ўр═╝t?ц)З╩5ю┐С8ым│╛ ■√П>·╓ ╠╫g^^°┘Їщ╙╤$|├x█G#UЎwЭ(║╧х╣Ё┬ ч═Ы╦ <╘┬я▄╣╢ьЇ!-└╫ЁЮ3фo╩$р▄P╫чЯ▐╕qcЇ?Ш╟M:┴Эзчq,╛cШЁ7o°nя∙єчгiN:щ$ф╔пHN╞є─│0с└їСЦХпanЮA╔шР╚░m█╢h;0╫Л/╛jG╖Lю█° C& : Й┐оЁкЛtM0qтD■ ╫(ЄЗ~X.ШЗЯv╩й│O╩∙Яx7эFєбУГИг^HЙ╬ЖLN8сМ╩Ц-[ЄШиЯ~· Эv╤ї╫_╧╗"Fx∙ЩgЮЙqЗСЮ\bЄ х▀?·шг0▌б:ШдЁ╘т┼ЛQ:*?иЗ+tc Гm!ш╛ААААА@E╘<║я{ўёpЯ>}@%yь■▓e╦Ёып┐■·╩+п\{э╡<░a/▐╛}{<&Ч,+П║щ┌╡+gп{@2|┐m█6Ё0~╢р│╧> ╠Жфё$ф Ц :2`└А1c╞°a Ьvы╓ 4q╩Ф)W\qчЬ╟LЪ4 ┼=ў▄s■AЬ`К ╗o╛∙цхЧ_ю3P0√╗ю║ЛFГы▀v█mлVн√LMME╬rЦ,Y▓i╙жQгFБQ∙F▀ФМl┴┤>■°c|ЁYч▓HЎ ┌ ╡гжP;и~┬░┴ЧаГЗr╚>2я}яP"eddЁЮБЯ6lАС=Г+u╘Qх╚tUр[u╦ЕДкб▒`фа#A]иВ ╜╟ўє╧~э╕}%Хr_й╘№Є╦/a7s╠1h~ЙЧ-╣PЇеY│f]yхХ░6A|УsNvЯsпa├Жш*w▀}w╣О═щ~зNЭю╝є╬ГJў╤K!T4zЇhX ■ftШжЯ~·)Ж╥ 7▄Pю▀JtУn▒АYИю{ПЁ╨2о:┐╧аCвыЄ[├└Єa╤СRpА'╞(ш╫п~ї╧яў;░▀ЩС╞ Гo╝УTЧ.].\-aШг#ё^НФ░Ф`├╝¤Ў█Ш °gБj▌чб, ao╝ёшiП=f╬Ь╔ ╫?э┤╙ЄTзN$█Лm╫оиГядЧJ "ИясЗ╬пэД[╢lйWп^╦Ц-С╕ЄSO=UPPАdЯ|Є╔ЩgЮ╔Ях `HАФг $гe/Е╜фТKP[░pСььl~═ц═ЫA▀_~∙хqу╞БюsUВОГЮNЯ>¤тЛ/цDgу╞Нў▀? <Щб) e}Ї╤р4°╔ Z▒b╕#ДНуДЙ▀┘КG~■∙g№Т_hH^и8╚}╟О╤~°АВР?МTх^zще0ШЗл < E╝Ў┌khйЇ╕t0iш╞ ╕2И5?VhпB`┤╘UЁИy=°Эw▐Б╢AЇ┴╘┴н¤╥Qй_~∙╜▌└-╜иБ┐uБЛ/╞ЧGy$·7п8Б┼Z бщГ┴ Д\░`ziы╓н¤ЛК╤│'LШУя▄s╧E2┐°/srrrPы?№ л╒OЎСє│g╧Ж9З╓DG¤ы п ╨jгЦ0Fч▄ы╫п┐цЪkа╛Й┼O =`,ЁЛБk╒кєА╟∙ч5Бмєё╠#e╫о]╦Ч/╟PВmМ■яош▐№Е  6lT$?~|ўю▌╣B╨@╨0tыЯЖД/1^аРi╙жБюўю▌К║я╛√╨? бmn╟J▐╢╘ 9LЮ<╣sч╬тdБКиyt_Є╬D▀▒cX╘3╧uъ╘Ю={┬║рzl╓мш&■¤·ыпє╙o║uы║ж┬/╜ыо╗Р'?#м2@■УO>Щ[У&Mz√э╖Q─W\1zЇh╘ЇМ3╬@╜@╚└║@[9хz№ё╟?√ь3д┐∙цЫё8И4╝!ё%кП_Я~·i╛хщЫ6m М?┴Ь∙F-`{ C░И║й╨$(ц╫╥aN<6ГpCИ═п)АГ G<щдУ└ча:i▀▐'@лP)jeЄо└°An( LФ█o╝Ї∙єчє╖7gЭu╓Ь9s№Ш╛A┌@nшОшH№V,<ЕБ┼ХВ╢В╝вЧг8░a|@Л°ЩC иz,и< хэВQkД{▓┐∙ц$АnayвУ@├╚Б┐gЁk·█o┐]p┴°╓cп^╜■║┬л─Ш5k:9TНс└}ъше0l`За ╔√Ы∙╓МБpї╒WOЩ2%y;╫┴+В|`А┴┐ ■√░c╤Яa╨6n▄ШзфЫ╦yeA▀╤ш х(гk╨а╖╨h░ 0Ц¤╫,ш0р·|?ZтaБQx Й'Ю╚лА╤Нo╨Щ!нtо'°аF╥}0T0Х■¤√є╙E░╞ГГФу░ъ┴ГєєGМ0c╞Мёу╟чццВФ$╫ь┼ 6 ldтЙ'Ю└╬9з╧╚╚h▐╝9xs╟ОёзЫn║ЙЯ3╚o$х╬`~8&>pg??{Я┴WнZUPP└Kфw?БЕBб╣sч╢o▀ПА╛LЯ> └o@Жр7арHЖ|^|ё┼Л.║UрЇП├чжr╬╔╔┴п╚бsч╬]║tAqЬ?A6ЮТgЛ&Lр╤`] O<%ЧЬ'@5! ■BрЮ╠├Ес7mqч║rъйз┬▄B]Ў¤e║М(ДgтЧВЪ┬$уДЮУЕ ■√яA"ёMзNЭ@╨}R╦▌╥ш{h2h{х╩Х▄НяС3М▒╦/┐|ь╪▒░пЁlr2┐\дD┐╜■·ы∙J╝╟■ё╟0,єЄЄxVuы╓m╥д ¤Р!C*eвЛ/F╫Е-|PQ╕╦Ьsх 6Ё░оььlPsЯ░ЕТщ>CУ░аP)~╢&Ф├c╪№4╨зБIГn├{╛Зс]∙▒R~z╪└0!°yпxэ▐зO~Фєє╧?п_┐]┌▀Ф└LВ▌uын╖·√.04 ╗sЧъE2дсё{Вю TDMе√Я|Є╔иQг°пр'Ьp-I$а_}Ї*fЦЙ┐ЄтA·¤Г8╣1"╚oV"▐ХC0!Т╗!├Й'Ю°фУOЄ│YxЄёCЩУлНЯрхW]u'+▒X e=√ь│а&▄ :ТЩЩЙRа╟Ч^zйEЛТчsб∙ё╟9╫D╩[n╣┌Щ2e ~}шбЗzЇшюxў▌wГGr9╣f┴Р@┘бYФЕ·vш╨$ЪЇїю╖.  лЖog╡Є┼╞#hH0╢УN:Й[;хИ▌_╖aРсК+└╔°Yи▄┐* ;Кo╥н╚ўР!МЬ{ю╣g┘▓e╔▀CЯ Ъ0ЦТ-╫;мУoМF}чFАM░m█6h$Ш?Е╟s rуw9б│бu@4СЬЙ¤╠A╙┴Ю∙└р,v∙Єх╝Ъ▄╝ю║ыzїъЕя╤═*н╬Я■ лЪG[T║╧э.|Ш9sцSO=┼#pzўю}уН7вЪ╡\щo╝ё┐зu─@єwю·Ёп░АбВС┼?# ·!j-Х};─_LЫ6Нk ╧▐{я╜={Ўфц╘ЕoаБo┐¤Ц┐ У<Л▓їэ█г╧П╚│░░н┐pсB■ о_┐~_|q └Г{Ю4■gQєш>Єхw▄т{{,∙▄s╠й6*ЖdСч║╞╙√ЩЁийt-DД"╕├2╣|w,WФ█ь+%С╘АйЇД{HВBAк╕#т'─#=ЄЇ╧Зс╘╨╧2s3┐<Ш╗чСF* МсnN4~rЧ?┴Oд┴Я№ ┬№нв<░ц<^Єфхм<>╩Y■ ▄ЧJП╨сдЯ▀Цъ Ж/╤▄n╥Б6√R.ў■rў╣▀C8█Fn■vd■=┐√ї%▐■fыяя їI?ё.YK▐-╩"y█ xЙ▄ЩНrУcZЁКх┐r╒ёю╟╣5rУF>╝ФJ╧°╛аа└Чэр┴-=Є╥╛xЬ╩╙д{Ф╣╙Э_ ┘PG╣Яб▀ЕР√ЭН3o{4O╠{>║лп(Н▒╔√$я╪╨dущ╣┬╤ Q║@oe№ф ╩;J■mк▀ №ЫPєш>о└пВтD╩  Х╥\ 8╬8Р╩║ф¤▌Здtwа├#ХzC9√wУ йКO°~tЯИp/&)=╗│R5∙ЄЯ■)У╛╪╛$Ьў''ЎУJ Я╝&є▌ф═г~EТЙ2?╛╥ЄCW|!H\Dr╤~Л°6)EE╔ўР!ч▀х╝°╝▒№J∙щ¤r}Р▓G%o▒MжЄ■ў■█Тr:ёП¤Iю6Ь╣r│3╣╫U╒ЯУO┐9иЮi_Z┐В>╧Ў;U╣╤С№k┼*°▐} Yр╕еX%'N╢?¤╛│?∙@ЮфУM╢╙№СтЗQIчz2Бj▌╟ЯP0wЁgg■YьХЦшDБAў╦°╘+UD9╟за√5ВюK~pH╣иЫКх&╟╥№єQщ>їш~(ЙюєВўУЕг&|WттЄ!X иx>ЙААААААААА└?5Оюу/╢бБ@J)█w%┬П╫TЎПё>|▐╝yMЫ6хn■rЕбМЕ >ё─■╡г┬╗/ PSPуш╛фRY7Ї`P▀э▌ K╬}щцЫon╒к╒р┴Г+╜┬ ╣рВ ·їыw■∙ч я╛АААААААА@═BНг√$▄0┤@PХ\G"2г∙оьЙ╕Я*╕э╢█Z╖n=`└Аrt▀?ЁЬs╬AЪЛ.║И(┐АААААААА@MAНг√р°╗╩GUЩ;▀сЗ ╔DV8їп>n┐¤Ў├;ь╬;я,w'ПэБ$▌║u╗ї╓[{Їш!Х╜+T@@@@@@@@@рОFў],'БtЕёЛыRY╒╖\╔╥д╩▌▄v█m-Z┤4hРT6.▀?ич▄s╧э╫п▀Е^(юёиYиyt▀Т=│0Пn\╖+33¤░цiкКдAўТPуш╛Л\UТ■Ўы┐▀}╟3]║t6╝G0╙j╒║О╩д█Я`Aў■ниqtЯ║─RH╞gп}vЇ;╗vY;r7ЭtZ╗с#zgе%Z4п ┬Пч8ё▀╟{╕▌°╖вЖ╤}№Еj!█╤ К▄яцо|ъйiС░СЯя╨.√СG·╥Xn╨0НH&▓РЙJИ▓W┬/ш╛АААААААА└┐5Ню╗▓mkбU╒)u▌xВD├d▐7Ы9┼JДЄ 6_vU╟^}╧l▄╕VzЖ.┬■эMВю №[Q╙ш>s┌╗Ъжък&╒uЙKeъH╗rэ_mр■qС"b█цm¤п╣░чЩ┘JvЦбя╛АААААААА└ *j▌w r- 2t9CrdтEъK─r ═-╓- ╧yk∙є▐j╫·░М┌;{ў;у║k╧╪ыЭXВю №[Q├ш>┐f╦0t]╙eIбHч(ОMrv─_Ъ{я░▒ё░к(r┐█оь~Aы╠l╣VЦб я╛АААААААА└ *j▌we╫5МАмhХдДIКєея ╗х╤Сп┼гF$╛є╥+Оя{ы┘ дзеi─ ▄Ч▌°_EMг√LрD РСУk._Ц√є╧^}u╢nd5l╪шЁV┴Б/╬к-╒кmHТ═b|ИтI╛╛/ш╛АААААААА└┐5Мю╗ТKЙм╔i3▐X|g g5nz№I═ПюX╖▀эчjr╔%[√p╘~║/ ЁoE═г√Т&7m■7ы_}хгSO=й▀э╟╣* 45вЙ[uТQуш>╡I,hdкrPв╠СяPW╒]Ч─U)@д¤стВю №[Qуш╛k╗ёPJЪкшD" ╙6 ═um"╣*╤%с▌HB г√LbЧшЖ hа■е╤;Jї#Ўwг ■═Ъ5}Y╫4эП?■и*╜OўAЇ▌°└~єь▄╣╙▓м+VTХЮ╙¤▄▄▄┘│g ║/ Ё А¤єюo┘▓eц╠Щ╦Ц-ПW┼qРsN╤ё▀└╨4 ▀ ёъ╒лk╫о=k╓,Ю@╨}Б┐ √AўAш·щз╤гG╫кUkч╬ЭEEE`ьЕЕЕ№s(▌WU╒╢mР~0∙.]║Їъ╒╦0 ф ш╛ААААААААА└▀Д¤ ц)((╤K╧╦╦л]╗Ўо]╗Тжжжr┐iЪБ@`х╩Хx░sч╬─Га√ЎПюу╨zPn№кк*ўхГт√ЯyЖ╚Ь■Н7▐X░`┴╠Щ3ё╜а√ЎГюу'╚9Ю╩╚╚└╧КЙ9Wч[uЧ/_>~№x0√Y│f я╛ААААААААА└▀К¤╗U|=Пу├Т%KкJ╧є╠╔╔Щ9s&┐UW╨}Б┐√w2O,K$КвTzю~▓w█╢mа√H?{ЎlдЧ─AЬ■╩н║Ъж-Y▓Д?ы▓щs}╬╞sss▀{я=╨}№─ў┬╗/ Ёўa Вy8▌ыkw╧╔╔A>╢ms =>dgg╫п_?СHь▄╣╙ц╫l №н°Лt╔Т%+Wо|ю╣ч6m┌ф8wъзжж^{э╡▌╗wc▀╛}╗а√ ?°ы▐}░№еKЧВёГ╖є=zЇш▌╗7╥#█;v╝ў▐{{в√k╓Ч╥¤╒kjytЯxЙв╫gєРпф3■d0╛o$}' P \ъF#╤}б√бФ Л╝ў~M─усв░жk .Т╪=╗Ў▓е╦╞Н╖~├·#Оh3t╚╨FН┬ D▐╢m█я┐║ ▐яГ┐ГЯS╫НД├ -*▌═г√iщщ1ю▌╧╠jZЖюWтр/е√║а√{ЖGўc√Mў-ZL)U%Н._╛№├9sо╕Є╩V-[╩КB▌'█╖oч▐¤ў>xп ▌_╠ш■фW_%ы╫оK╧HПDvєА├#Qe*U"з√Б@Яд¤ц9╢┬╧Sd°┐Рс┴╚Sd°╠Ё`ф)2№_╚Ё`ф)2№_╚Ё`ф)2мй║. яc0OиL0Oq1 ц∙¤П?└ї∙ЩЫЦi╞Й╘╘T$`ЗєФе√я┐ Б┬╬ю){2╧kпТMkX0O$]│vMЖGў]┬cўa[╕л┬bў =°K▒√bTЙ  !МxўeYГ▓к└Мp(╡M│░а└└┌УЄ█Э ┐@╫▓м№№№щ╙зу├sц8ў╟¤┼ БЇOЭ№*┘╕v7▌╧и║(%h╛.╔КM№ь№м╟1 = H]№ОН─(н─НЮ╠▒=║oЁгu(u┬сш╬▄Э;vь╪┤iSrVхЮ3З├_|ёE,Ыєсl П╩2■ Гю/МЗзL.Н▌{t?╜╢GўeB%WУ4т╚╗│.═Ь║╘╨ї`@;Ё╩°БэЙ∙О$vУщd╕╗ ╝м╚┴Ао╚Ь─╗Ы╖nЫ:uъ▓e╦Т)╛o3Fў╜37%WU╒uы╓╒л[ўГў▀▒]Ч▓═║n,Y╝xQ┤░Шyў╫о[Ч┴╝√СХk╫▓2ы59╘Сeф*НVv22P%алl;oЩ║TVЕд┐Сд:RR·╜╦ ║;/╫KЪtЁ'aчБ_C% ╜_+'bСMRЄ#I"V╘sХI\& +ТФИ╩╛!%бZ╝F┤4т&эp ~▌▌╩JЎv9SIё╛uЁwЩыа iЎЄЄgяр∙R┐"╗EuУ╦tK[╔%╘{КWг╝T▓╫эhй·I┘;Є 0ФЇ*RжЯт╦ТЩ╔-╫5i∙▐Э4∙▒┬ФЁM╝Б╠gLЎХ[╥ГIЄщ├дt╢СJз ╖DЬТl)╞-єН╣$sЮЯ7v▄▌b╚%ЙЙTv▄ Ц▌юсяП╣ЄЙ]/!√П║%ХрЄPo╢Ч+N ╚@q$г▐ТРм├=╬|√М ЗИN7I№╩╘щJ▓ЯОT1эW╖╚Т╦%eч├ф╬яО╘ыf№ .)MV╢ yН╞.║/эф╗Л*э]Х*°-■╪Ёg}O╕▌Э╩#lvЧ▌Тb▌фб└P∙х<╒ьB╗uZ·ёЗvТ╛¤L╦О#яУпX╪ЄхЪає│FР¤|▌▌ыЪА└▀╠╛Мю╗R$Ъ(╗х╡Єї└╨5Eёf╟■щ╫?∙░вк.▌Эx7ї'|╠вЫ╦ДRYQО>Ў╪Жc;u][#ТЙм\╢4^T<ї╒W╔кїjееШсвеы7Е│▒4+0еСGвJQИd)╢─ЦJvHЩ1└ТEн BJ■М╡╚е%ЮD,╙!Q╪╘╙гу-├╚Qvd╟Vи═Оr*kОв┌:ШеЕUKж0A4╟CfГZё╣v╥миHX▐X╤ОLdUfЛu╪/╘н╕8╨2лA▓¤таО╚▀ЦeKУmHы║&`K▓U)Aй*╣║╦Ў>'╚U9к#C`O"[E▓ё╝уи▐dюzмА2ЪякоWЙf+Щaв(R~Кdk4`I╘ёe┘- Ска╥n╔У;PеСa █┤!E4╫VйцJ║хИ┼гVФ┌╝)бdЫ(Цм╪h*9┴ЪМвВьр`Ь╨╘EcvBЙТ}=├DРd╧┬NDSт╢йш─бОБ┘╞┴аd,Э0:Л№1┘0ТH XТZъmeд╓╢═╥ЁЩY╩ьЦuФ(├P ─йКЬUЪА<ЮПУx,╕W█З┘&йБаФ▌S░7Ё:#Ьш╛g:aNў▐г(TgЗ╤┘жФйФтD▓LYГEдQ╦ЯUў:OV╒╔=G{╔т2╧Йф-'їЇDbd╘K╚ЦШ▐{Їу╣▀<▀Ющ(RB6`Я\╨}Ы║ЖED╢°!╢fy&SпBdЛєИбвшУ(EЎzу╛J^)└}=Н■ж(Фиь╓2╓нcX╬є┬бгВH█DEЯw0м` █6Ц fw┬"Б╒м└М▒+С├u¤N┴7юM▐oJ╟ВG.ШяI.ёт3+ИvФ-ў23╦Yм▒л"%e╢Сн*▓lBпй 2F:9`гOs m%╟0$X¤╪Ц└g,р4▒й■ъМэcпSў┴Ы▒лB9╔} +Хд║Kj5рЦ╝Ш)-й╩╡f▀Ч┐}*v $OЮ▒лш╪Uщк║ТZbKV k╟┌Э╦~<чШ#ЇDdZy║_╗I~Vг╡;Кu[aдUйд>ОдЦZя▐л╞▌╤8ЙКв{N}╫хЎА+╗е▄Z▒MU╙ccUsU┼3▄дT)&kв0Ц╧Фы░yФ═v вQННх║WeЛyTЬ╩ж╪JxОуY■fРЩ4С|Mp)к╥╖╦Єe└dИi╧vмxжB *Ed5JиEи&+!ИК)\uяфRы+Ы╕\╨уР │─aЮ┼( ▄a П╡╕╚'Р┤c┤8Л╡а[а╚киmQ=N+H╕зIе╘хIф$у╛ИЕГ9(D2'rиl╣╢жa▌Р║гЦ─?Ч┐нЎhЗю-№ШКM*█Оl█ XjмT,X&WE╡иf╪vЖdВП─ХАЩ05Нї╣╠ У$EWКj;ўў<Є∙*╗╟╣ЙФM_й╡WЩe╕б* ЩФqяKе tа|E╔Тя╔UT^┬ф*T╤Экпк\■┬bP*бR сzd№]Ы(`aкЖ є█U=╞т░Щ #╧r0│m╪Я ╚~\ТmMgГТquЭ1x┤▐] 4 ;ЪчВХЎf+мH║╜ьш▓N(Ъ)ГКiьЕ#s%ЄЧУ%7С0?Д╦{╤,p#jйNLsLTO╔И+)ж ДAў┴9Р╥г√Т)%Ўj0юлm╖g╦лУўБ8ЦеbъQ1}Ш╡овEM╪%ЪмЬY╩╠ёйГ╔▐мт∙hp}*;ЮЦЩрi║ы─TUшAOФd▌▓║ К╞fEд▒1╤Vд√хЪ╣Т6,s▌К[=╖тАGR╧Ў·й╛ч┬·#ОЖf%R╘ ╕Тб╣ Y▓-Y┼?Х╜))}vпєd■r╠ўШ╪из}ЗнUXУ╪─┴№╔Яpx√/`лЖ%є╔Ф-lP5ойm┼░n(шж┴▐kыр╙.)Єт╩XУвЯ╩КЖ╡┬б╘ 1ЗT░Y╒УЕwrЙP╣aлЪ╩*sВzжм╦lKм+ЭтEВ▒Wы°чЦ╠ве№ZU,LэКG Вz0n2У╩a/ч#дёЦАRI╩°l▌╩$$ьXР2Є▓▓у'*ЫX┤4 Ц ёб*╔Q*╟a╜KоNйтu?цLLгNL╥#Ж ╤(╠JЙ╬Мs╟D}Вs▒M[M лi6╡Вr╝В$╥?{╞оЁ¤▐gь*Лм<гк е╩ЦTRЦ:эЯs┐╠°wzўi╔#╒rг'I[юeD)#х╪3╩щ0∙┴¤ж%е∙Бяa $yЫ╖/Юw▐ёm╡X╕▌ч▐¤mEAIЧ%bWf&R,Ок+с_ХД0 нНй╞Ы@Ф╥Pf √:▓vyaQ╕■aнЇЇ┌qПщ2ОK@тЙЦ(╩▀╕ЪЪС:Н%Щuєй■о;{є▀╗┼Кг┌Л┤!к7)1o╜"┼&rд`Ц╢%ГЕ╩bPЇ╤!*(ЫтZР═ТYhРтЪa-И╣Kз1*Ыж !t═,МН| qbt╞e▐}У Iv+Ц·К╪;R┼єXГ╚8ё№▄Э[╓"sXZJF╜C[Ъ.ж"▌+С9zурЛnВЁм▌$║%╠JKцY&0}0▀Зєwю▄╝ES$3С╚к▀$н~#p ┬т4m╛Gлв╬л5█Ф ц∙[;[sй┬╦вмООAЬ№Э█Є╖oмSп~иn│8 (ыГГnc╒{ЫQЭь+нЫ┘{m╧Лd╫V░aIe┐│╫,ЮМ5Ячg┬М*{oЧYJЎv┼Очь╪╦╦kP┐ЙЮ▌0ъ@D┤и┌Кni)q┬▐8б╖;Кcя▄╛-RP +rJ¤C╥j╒6╤└Ъ┴^{якnЭj░O╫ыЎь% 5Он0Г╔ТI╨Т╙Xь2 GГ┼{СХИ' r╢мS1ы│¤Z├цэуJЖГ>╬HsЕлLа├▐=═─[a╪╥ьСwOл╢╟*╪Л,ХЦкTт╤▓ 6Т╝╫■VQx╟Ж5V╟dq╗╡ж6iПї|ъ╕мQ4ш_2у╣kзЩ╗╨ЕN@о╙▓VгЖXжўод2║нDЄОw┐ЪиЦw┐bz йГg▐ ╜√е╧rь┴∙їПЁю[╤ЙЫ╪╢║pїВ│┌╖м╠╗я╤¤╡█Л b ╩]ёе!жЫ9<╧/V╫Da^■Ў═CKm╘JVu~ь┐яцQ]уn│ХRуЧr╔lвtцO√ё[╙/| QgЮЗeLuьh╬цт]█ьА╔V4█╚Hпkш·╬╝но╙т ┴`уFjV╢K5Lе є▓0▀sN╚<К╧eoо┘э`rЙЩ╪Md:эХЧ╠Ъy╩eWЮ{]Jv╫И┐нєo)єя,рYan!╘ `╒зXх)^Ё╩Иa■Xxэ¤O╢=∙╘ц┼P-T╨ЛrБ▌A G# o┌ ┘ёЙў ▐╢|┘ХCG4ы▄╒█3AAЕС3─ЕФжд+z"-oыф┴ўм_│жўєc╙П<▐P╙╦╘┘▓,ИQ┼ ─¤Д╖!М$│p├┌▒CЗщЪ1р▒Qr├Cd▌РM╟С%v│/▐╝^ чГ╛l╧ъ═ЪK╘;┤55╥ожЫиБmkf\eС╣Л~{щю┘-Оь¤╚╪╘┤TEU,╟Є╕╪√b┬?¤═иty╔>╔КЙлШ╚■║БU]T.I╡s9ИТWO┬!Йыъ╘дl°1кMШ[└─N╠╚Лў▄╝qїЪ▐П<╒┤▌ёqU┼Ьбц+┼Д▌╢v╥Ё╗уС┬Б#E╧ kiJ▄JУ@й`√З╫/1▄XsЕahv▄┴QA░╤╦еД ╓╬LйУ╖5∙3?║}¤Я!7к╤░╠N╦nX╕c&Д┌M█ШБZ/\d(Zq▒╡~нa╞-░ъPjFГж[╖чж9E╡57╡L╪ Лt-■TЙZPЫР$ц─╒м╪Т∙_┐∙°ГDЖйг5h┘цЮ'Ю5хаEФ`└Ифця▄a9p~Э░╚;УbЖ╥%#╘°░6qSХ5╞╥\цbТ¤у╖_╬z№^"БPТgv┐ъоGЛ╘ ╠▐Юkbw°еWIУ_rНK╡.RфУ'З7щ╣RйЧ4∙O~b┐h?╜у8■Я╪lщ-@╛0%∙P╦гУ▐ю4Рi&Ь9ыЭщє^Я╥▒ы∙ЧўRмжzЫlь!+^t╙╛w╣╩;╣%│$`ЯlєШeЖ╖m┤ vцф2%┘Тй╡жbybK│├вдrvm▐H"Е!jЕ$g╩ЛУ6мXu┼=┘щЬДRdк9&Z▄&F=Ы┌й▓HG╖м}щ╔С[W.ACЮ7ьЩОgЮЫРмЮ,|Я9М╝║Tc*л6uSe╟Нь╠▀▒┴┤Л(ъВ_Nk\√Рp^Nq$Q╗y{WO!С]┼Ы■,^╖rъK╤BXйuы]╒яNгNУ║M[R#ЛG╤Svш▀~-XЮ├├щ=ъцсШ┼yс-жхэУLWrRRj5kБЩ UH*г╘ZКa2Є^Bг`╢l4яt▐Mў?v(Kef9єO╔vм`√жgўuwнUpа┤#╧╜Єъ█ЗYzpд-#∙?~╞о▓╠jоz╒ZRМnл┬AХ╝Zгр ╥╢o╓IH╗6m_<п[╟#лЇюЧ╨}Ў╬░вшом░yУ6█лJуЛШ√╞у5>тЁЫG╜,iA>ь¤9▌Лhg~50~╢┬bд: 7Q№┘╕┐} ¤┼w=p°i]░ЮзJЎG╙^■яМйТХ╟^э)i╟Эqn╗vэзMC═<вкжТzёРбmO9]╤╥ИE╪>&лJОчPё└WП▓3о)╦О*ГО[│fL_0g╓╔чў8єЄ>Ьюsё°Z┬▄5╦Ч╝9k╖ а$ШAcjШ[7a8Сc_°щз]oь╫∙вKн╘ ЧGcя.dkФж 3кTl%Т ▄Р;6-\p¤ccЪu>ПY2#+(▌▓┘Yиl├│Ь╚╠█9сЦ█╓н^╙wтsuO<ЕРНк╢eёy3i ╦ш∙Дэy░Aэ╖о^:·ю╗▓~╧шgН╞MH ш░0LмfШЁ═чя╕е`эr▌6CО┬L┬Ў&ъ4ьqы└├О?═╘╙DзVВ(╢#3Y╖№1╥р[▓[}█У/дgfYФЪXРtЭЦnJоd√Ў┴FхБнnх/┬▄*╢РJ6в\T%IuqЁ$поД@Wea╦▓-│=п░м▓cH╓Ўu+^1 1пyр▒&NМ┬Ў&Ф╪а¤·вmжО}2VШ╫ыо{ъ╢8в╚U╙ЙFbV┬0К╢н{■╢ФxБэ┌ОкЖ╠Fг ╗Цo° f▌№──┤#П╖иt┴D┴Вo>~ЄТ(В%j╨м√%W~■юФШeїёljєc]U ┘y$С╖тЫyяОЧт╥ДKSы╫яz┘еo╜=CK╒·?№Tа^3к▓У ,PeGеUЎЦЦ0ц═тдQхT7■ыgя╧xф>M'й Z╘iyd▀!╣FЪуВ╣Ъy[7<7т>g╙2ЁX"л╢m)*иЫ╒╢C√Лoj┌!FG╓0╒шкLСх ~°zьГЙВMЕ╗rOъqїх├Ю▌й╫╞|;JЦ*q{Ч╝и@╩лlффИBl█Ўз/ц.(еяОw╟{rn■пxД'│Щ▒L )nНФ2~0UЗЄ л╘╓1Щ▒п>∙pю&▐╢¤%¤яХ┤░Щ╟╪█о ┬чЭ|╢пивУ'T╢ЕJI└vНxdтГўnY┤@vbОf┘Ds╡Ї.7ї;л╟%{└6╘вG╞Єr&=2b╫Кек╣╢Y┤+"iЧНxЄ╪о=czк╦^░$0Y9ТЧГЪkе8С@tч #ЖоШ E└НcQ╣`ффу╗ЎH(Ж╖wV.y{├т╓*ЫTл3Щ·└р├:┤ы¤▄;TХ·╫=Щy0█hл:l┌uu╞ЫcЛ∙яЫ#ю╛мW▀#╗]СHлkK$▌Нї╞K▀╛■К╗k│╠╘k┌·ф3:tш0cтXЪ╖▒╕╕8╘╕y╧╗З┤:ё веI6;(╞!Цчщ)YdТ╖B(,т╓; ┴╡┘{╘H1Н╟ЖA╙ыФ цсk ўы√K _Ь\)aш║cъок;ТТt█║ЧG>┤aїЯW╜яш.▌# ╧.Ыщ@|-bBОАфцo^oX╤FЩ╞Шп■у╟╛гЮл╫ЎфвтpFэzz(ERГlR│н°цжп2& ▓qх╩█_ЧR┐С#j▌жКPU5┘┘v@°2VеВ╡+їа-┘ЕO ╛#иЗ?3L(F┤╠ЗРА!)─НO╥█/є ╔Iл▌К┼яKN4═/g╡:тв[·╖<ц$S╔"v"@Ь╝▄┘О:╗╓?u╟uїk7шщ╔E╤(V╛ь╞НM░ьu╢л■-с╝eQ╣╜|р╥<Р юаJ^▌╔┐\│┼╞и$YУ,╒О║с]У{`█В∙╜ю╣ И╬чЕН,S JОdч░аu▌е9;0Ж╥k╒К│И}Ў╬vH<аF╢о{u`ят5╦И!з68Dб![Х]т╚▒h"7З*┴╗'M1О<Ц╩йZ┴ЦН┐╠}s▄╙С№ЬPнZJ(═┤bЖ╗╓лйwMШ!╓╤Т╒4+g¤Чo╜■ьx7юf╒йч7П╚ж╔╦ 6m:ЁщЙб&G$Иж▒└BЗ╤}╔█][ X2Д╥Й┬е_╧yыб╗o─НПL╦!гVCK`$щ4V╕}¤+П?\Ї╦чj03%╗б-i*▒╠т▄DaNєS╧ь9pxJЭЖZZvВ*жiT╔  v╬ р╡9o╝xь╣=п╝o\╛V D?HЛ┘N▀╥∙РMЫКRт}/їгяS%}q7 ?}я wй°L╜▄Гr╬~юмёН|└4И╧╛чШ╗  Е╣xlfз1┐┬уг┼_╜6ю█ў▀:Ўт>ч▀2Иъ║╖?Ab[7л,QI┼┬▀№*u╘XёkO=╝m∙я╤Эha(√9╜▐щ╫▀z╥╣Ш╨!СИщ]Ъ№Їу╣л╦Й"ЭШE9[тЦtэГO▌╡gСЪК]Х,╞uЙК%UwнаФ╪╣z╔лгМэ┌═▀Nй{╔C/{Ў∙QY├╩"°йwмq*9Pйj╔лHgыN|┼╝o>Ш0оh├┌ь┌╡$▌АI╩^И█Ev┴vWVяЯ№╤╢b:х╤┴R╬кF╟t║■╓БFZQ╘┬Э9oL│u∙я)┘╡пцНzЗ╢рMV╞?U└дw°Ж` їдкY┐l┴█гЖ╙╚ошОэ╚<=╗n0╗┴╒ўП╚j┘╞tCД╪╢b╔qуn┴ОTЪ°сєП?Ш°Dы3zЇzdb▒ЮNe╠ Еmй ░] +y{6-№t╞ы_╬x╖├yЧ\;°бh гЪbVб╚А╬ZSн~u░┼>Шt  т@-СUчь═пmUа√ы7╓fqЦ╥¤C╓lиwBж\▒H┘бЖв`х5▌HС╡kє·sз?;Є░З]g┘цо├F}т╔▓┬▐┼√Aк:8иZ(╪╕iЄCГЩR╫ :┐■№ш5х╩^¤?№ЁыВД▄w°╚║З*a}МЗs Ш?n`ЯцMЫЬє╘╦F0ФFуEЫVOЫЁ№╬5k2Ы╡ъ▀├БV%╦╤═╪ш{Зжющз9yЇЁьCZ\▄wшЫSзkYu√ ╗/╜▐!c№ь-Пъ■═БЙ{x X╒▒UНл┐y>Pп/Юф╒ХЁпK┬JtШПVхё'║╓в╣╧╣cыт%Г╟LlxЇiEzF▄╒─Хг┼с╝эМ░ ТTQ╡╘┌┘r `{З`║F(м-VPЇ▌зУ╛/нvZп√$ї┌Gвы╢╜u▌Ффx~RZ√cВvj╬є^ypp<{єЎош╖ЩV?ТЧ√ю│#r■№9ШС}█ш╫ї6зF]9╛i╤ф▌1│╤qз]z█$hD╖n|{╘и╚Ж z├ЦЮЮФ┌днг┴Й╦,▐@e.йТ├L$╢╤_eмNrCV╤Я_═~¤┴╗┌▌╢╫°╖Кх╘идKЖ.Qв:ЙАY┐ш╟╫ЗЎn█й√Е╜ЪR║A■№щєЩ/<ХИ$ЪЮzn GЕхадз▓( █ ░ ~u▐█/~8■╤г/╝°╩{Ю.╥╥u╤┬ zюЎ6╘╡э╝▄аС┴мL-Ш▓ЫФя┼\'еБ┌lЦJ─уy╣9НXЙДЮЪСЩЩUTXРИEA╦1ЯжedЕ╥╥-З╞"СD╕Р┌Й`jFZVm╟ХTE)╠╦НEК!l05=%#╣ЖЛКтЕ∙▓LВ┴@0┌Щ╗У╤E╬╚╚V┤TSQ-ЩmS$G1у!Y∙v╩ШП_╙о╟5Чy4жjкk{цЛ╩╧@.э║дt│VщidR┘mq■+e:aIь╛m┼v_─wmRc╣SF?╛сз∙WЎxxчnJЎбvJfLeЫОd&█%╬█ъ&Єu┘╘▌╪╦O>╝х╖┼╫╒бы┼a=¤@qТwVзюЪК▐╡eїыЮ▀Є█В[Ж▌їх╠щkЦ.╣ф╛1╧╣ о`(в5∙щ4ТwQe]H┌]╟Т x&Ц─├№Mjьg С┐■╫яP\d█╓ьц-оpЗ\яРx(M┘▒уг1#╫¤ёГмз ЩЇ^^В╝8ш╞C.yЄхь&ЗS =Y╥╤т5Л_>╚М\7■═ЖнО`[Z\┐з0╙╓┐)з╠╬8╖фт╚тЙ&│єо┤▀[ФГТнDwEє╓,■ёлў╞>█║}╗.]╧?юец╟Яq├#╡┤Zаёжм░@Й╪ni{юьw>{l@Ы╙Aў'jL╖кФЁоЫР╪╣╥▐╞▐Z42ч╡Й_┐·ЯЎчў╝юо√гЪ┴;Гп="Х▌|╣╗∙K═тўяrIЎЯў═┐qKЎxФк{w $╣°┘кХЗЪХ3╢╦юйў█▀-=.Ф$ЕЕ╕╗├>я█─-СЗФT▒кє╖№LH┘B╔ю┤╗F╛g║дЎююЗK┌╢д▓о╗;╧▓ЁUr╘2u№ I*╣╔─/═пN▓╝ЇД Ч\юЮ#ьy)╔√Цhi╦&╖Nщу╔┬w7+∙┘▌╬и8P╬МГ║}кZ8 ▐}╫[\Уm0ХЙ┬н?}1s▄уZvгkюЦ┘╝}▒─ЇЦъD 7мxёБ;э┬Э╢л╚$ожg▄°шЛй═П С8qlЎ~@6MТ║ыП_&▀}}Zz╩рЙo╚)╡Ч,Y(┘С╓З5ЪїцЫЕ┼╤Ю╜·d5jъJБэ чНxcf▌╠ nш█оы%F6жё╚Же▀╛∙кd║ч▀xй▀╞{╬Яє_╝▒KvГц▄<┤їЩ="FА8ёв5╦╛xc*5╥/ъ╙_й╒@╓╒Й▓K8╝wХ╛╜╒FO@aSLL╙СeЯ╧z{°░V╟┘ў╣wКс░`$oUr5 ╖мЮ|s╖╓g]y╔ЭПЕ╒Аn[ЎЦ%s▀ эмў╢ы8Ё┘W┬┴,ЗэхuМ─░▄╚вi/0сЙ╢u┐j°S╢Ы▐JX Т╖_Y╨XёъEю╜╙)Оt╝кяЩ7Ўєw1╔Хx|ТШE╦(о═шнKЭўэЬ1ПкёЖ╧ьp·╡╖▄■Ў╦6/_@ь╕гД?щм│пюЫ╒┤ї▄Пч№wтCZ╪Ї°│оz`╝йЖ` ╝6jшЖ>EГЯ█√╬Уz\'Є'яN_ЇЄs`Ч═█╡м▀р╨yЯ№ЧнcєдюЧЭ╓¤Ж└!═ ┘╓i╔ Цk▒=пKц═¤ъ┼з▓3┤Лю}╞n~TРFB╢э╥GКiкB-*│#▀╪LN╔O┼;"┬цз_▓█\TЭ:ФE╔SЗ^Ф▌K┬Оh'▓╩nnaЫ,╒HPШSVЖU8■▐█╫╬√ЇТF▌¤j╔JE╢┼rЭ&шм45@Тbх+jкуLpїкЯ╛╗·бgОъrQФyа%╚─╬иє6Ьдю·єеn]╜lUvЫ╙n4dцШсЫ}{щ}/s^Oo▐6s7ITQ тФeГe"СH0#И╜EaVНiZ3q]╪; ╦V@Л┘▌60Чm╗ЕКyяJ+~Э0иO<o▀∙ь.╫▌l|дгЖ$╟ISуЕЫЦ}■Ў;∙E▌zg▄2?yщ∙C▓╙O╕}ибg!pьD■т ~ЄсДgH4┌ч∙┘н[█║╞z;bO5%╫aqA№тvF?█RSЦu╣а╞оmб▓W╝M╟╓UЗG5┘▒-╙С УTвеXё№m Ш1эЗщ│Э╨ю▄>Ч╝╪ ЮЖ╡ZЬwя¤┘'Юв3бw+Вc#├o>z │╟┤ъ|┴-#╞G╒,F ИMeЗэак.ГЇk6Э ┌│Я╛2жэW^7lФItъэ■gA╢░─й═Оъd[Ф╦є`.]Т├╢йТCUЫнq9ю*Xeя└AWёS%║,бяЁ,А·▒╫1№p,ш║╩╬Ab┘*╡ьxPв!ЙD%═н°&Н░Т<·I┘E╢Р┘ЕЦw=ОюP░adлzВ▌УCь┌ ╢/ЬЛO┘▌;└╔▒ГфдhМ8╡ UГ|Р╠f█/╤`ьг╥yоB╦жКfX;a\┼\х╪*;ЮЫK└N4f1▄zВbь└юvd7жЁг№╝cУв{ётlo║wX+U╠╣ ╒{OЗjгє1WжK¤еZHц╩▐▐v╓Ш^┘YпЪF5o│;;RНэ|B╣rЎО g]Ш╜e1`▄ф:▄vb╙█'IQdВ▓г┴┘^I╦1╪t╚╓╟╗mДU▓а┼Xм#8lрgxW]░\°{╚ЇO5ж+Ч┼╩─;╢Д╒Aб▐ ьeGI*─;бQё╬Не,╩Ы═K~№b╦╞uрр▓wя-╣УU3<щЇ3╒м·Xц тж[╧▌;pїw▀\Ў╨г╬┐F╢RбПиaт уf"аQ)C╡у0л Х@И:п╝rэП ╜|─Шг╬╛(жз▓█hВ])C╘x,▓ЄЫЯ┐╠ЎЭwы3,╗сaУЖ▄ узч¤╧}■EQ5д:$▌╢хp▐ў▀~П╔IP~M█s.e╫#vМЖє~Яўе═Sь(z╛т░sн╜CКЇИлЭrnO=л▐╬┼?О▄;гn╜╗G?п4hСCиl НZ #)▒0МBжмЗ[П╟К╡,SЧ,зH/╩¤э╜w╛xу?f"пc╖s;їz*P╖.Мё╪Ц Лч~ePд0о╩X)╪оI 7Шy№щчhщ┘2Йю▄┤z╔O▀├Т]Л1*Щ╜кXv0QjшШ│╧3╙ы$└ мЁ▓П_ЩїЁuk╡=бў-uПo√═─6|∙Yэ├Ы|сU7╘lХ2*фj╢н╗Ў╖╛7чёБmOя╓gф°"=У▌рщв}9e7cHЕжмj╢4 ╡1╛2║}ПлоЎDВ▌Ч'{╟ь2RkH4RШ ╦Чл╢YоУCu)З╡>Єф└|e╦б╣╣ ╛№< -╣8Ф▌┼У╡z-[╖:Ў8У9бЭh╬О▀┐∙:D-╨╧┘ ы└╦╢hр╨Ў╟5l▀!J╪m9ы╓o·ё ╡┬yтQIn}▄ MZnzж└Ц5+■№х√,уК═Ўе0**Гy╟\їИу:6jqДeajмYЇ╦║% В─╘);чРМeл ┬о34quъЖ_чхм\А|∙╒%БvDК╔Ї─╬gg╓kТ`ч■╩ °n╫·?┘╜:ьa╫;OА∙mй8∙Ї│BЩї-J╥ў╫o?/╪║. Y╠дd▒Ч6Ин)rи╓▒зЭее╫╡Y "]5ў¤№Ьm■Б(╝ЪаBб`JЗ│╗┌╡,Xfl╔ЧЯI╣█Pщ8Ъg┴т3Ф╚╚:∙Ї.ж^Яl┘ї╦▄Oэт\ЎZ FОчb=\6HjЭ╬║АъйОм╙шО_┐ЩeEуЪw┼к7Ц) ╪4ФЦ╒╢[П░┴"$х№]K> $ПЖ5яlZfЗ║─ HЖ╔sЄ9=hz▌Аы─wm щыOU'м╣qЩЕ┤│лб╝╕ХАнжЭtN)н6г√;╓╧√цsf┴3┴иw1ЮL╪EF4Li╫ї<;3 еЪ╫н№nо#Щq═;ўЖyъa3╩zJш╕3║Kб:║Ы╪║jё╩▀─ЄБ!г╕%w╞;l├║од¤_{язEС╝ПOO|├&rNВIF╠ 0!ТA@Q─|wErРЬDA9EQ0 FРd"╔ ╗я╛aRw лz▐]Ў]ТЬw┐ wъуэ-√╬█╙=▌S¤Tu╒Sе/╗с6, :°╧▀W ║aЭЖ6ёJ^аyдкN┴ЦКХ/i▄┌Ї5ЯОUu╖я)Х╢0ШgWмt╒▄┤ЄКн]╣z■╙{яЙ·]╓u{оuЧю`сВ-t┐о°hъєГ7╕°с│c*(0]lю╪ТЦЮ╟C═:S/6@╠0svо·hЄаю7tь{эАзуr└└<;╔6м░_1a№КйC▌█∙╬п╕Ri|Y╒╚WcЮ lцМЎ#╞╓╝щ.5N2id▐╚Ч~xwA∙:]s╧&╫▐мOфм√ЄЛп╝┌cфШ*Н35Н:,╙d$ Eд▄Хc╞}1g·Х╡┐йчKат цp,tЖТн║╣a)╝т╜y╦цПк╨а~│Nё╝ьх╙'G'Ъ=╨п▐ ═─гuйиОЛ}Ъk╛¤xз_╛√ р■Х╖╖╖╘4.╚F▒╪З p▀Mcёї╦,Э1ц╚╬н╕CэТw▄t Гщ5.tф ┬`ааАГюС?\╕|Єk▀N.╣Цj╥Ў▐ЫюэТVб.Xк^╘■qbЬRр.,║ ╦┘╙╛} ╤a,╞Y║┬НЭ║4╜╜=I/oл(DЭ╨╚цGu╣Ы╕QМP▒┬СDm]O╗╝yЫkdUмжЁ°тdя\>c─╫ чАС╙ЫQ╛┬Э]z_╥╝MTIзzXЁ╨y╡╒|ёхьЕЛ┌ №2qй90a└{╖мя:nq═ЛЫаKGСХ h═Оы╘Й▄9r└}▒гёVрвЫ@Г▀у╚Т █^№Ч5г√▄m'"оЦ!СтiщUНЩBk╫ЛшF└V╙,┘╘Фt7█ї█┬йу╓п№=ЙАў╫╚,u}П~▀╓RЗ╥uC╡Uj¤╣f┴°╫■№цc╞?hjV╡VЭ{7n~ЫУ^┌fШоk╚Цo>╪)k}UлNTU╥dч█╣у▐Ю0:TеЄнўї╕╢Y;W╓┼1шсЭ▀нnєЇ╨K[┤▒eW▓Ащ*1W╜3·г▒├o°_Ч▄╫З╚QАaжЬ!ГJu═РЯ>rшя╠Хx6 ┘Ё ▓Ю*A)Xк█╦#k_rCBd┘& │╧╞Х╦%fW8R+%еХь?lx┼zНуRHУI║¤╘г[╛Z┘ц∙Ч▄╤Y▒├а*▌Р2╒Й╟ ├╤J*╠ФИUВfўя░¤█UmЮ╤шЦVжАл┴з▀"[GwО№Pd√ж'_Uе╤-ЫLz╢▀ЎU╦:>7·в█[fл║тЁ,╟╡wn¤▄аг█╓I,я╪ыб╚^MлюУЦUj╪╘а▒ьЭ┐╜1и/▀┐E┬jо╚╟╞g ╘╙│·M|лbэЖо¤j№еХнЁ╪И мьyЦЖ╣┬A√h ╓ГЮЦЮ╚═Px6Ч┴,Q\ЮБe▌dSID═▀/}oхФ╔Тi5╝∙·>hThj╔░ту|їщ▄┴%'*к\0жРчS╤%%мTи▐√Х7╩╫мЧf¤щ╙g {IrуsУyЗJВf╘и╤яї╤JежjшТ╣v╤╘_Rя╥V▌▐Xc9?|?бo╧rФэ;rЬЬQЩb]d╤и·ЧK~ЁJ┐ o╝їБЧFчЩ░p J ─БЪ-kк▒Д√▀╠xcщфс╡ьpяSCMАЖ"G┼b╩Э═┐мє▒√I▐┴╣мWoq╖gЯЕ7 ╛│kэ┌IП ФЄОв{1·╢╤╟м/n▌·╛■П:║Иwєъog ,Щq,¤энQ#.!═]Z╙╬=яъ┘7 O╥╛]╢l┘sўvв_Хk═}╢EЫО ЕєO═ bфЙцI▄╬П7QР@X ▌єш7╡l}@JиЄ╗S╟¤8{ ╬4И╟ оdиТE$%нє+o╘╜оЩ%4R =т╣╡єFёВмd╪И,eЦэ9td═ЛЫ║jРYц╘б╧o |СфF$ъ$Ca ▄T#%╜Єj┼·╫Gд!╔єьc;V}"!WШЕъHЁ!IZX*Qe└Ё ej^dС0╖у3z7▀╡qНдiP~lЬjzХ║╜ЖН ╘мcJ ╧═Ю·x┐гk╛ХдШд║L╤KWпїф░1fЕ+`)чэ▌<ёщ~9█╓ГU%Иа!░╪ММ* ?K╬(ЖР┤oэ╕■эsўэЧ╝уR~8*╒J╫╕╕▀М╣▒мRЬё╚o▀|д?№з$чК°ЕY5д`┌3УцёЪЧЗШ╜}▌wSЯzTКРxLТ ╚Ф Мш╬м╪ь╠ЇjА┴Т╗j■ИзJvЯ╞▒єmxI3╒▓UzНЫиU█pьнЯ~Ї╬єOIЇидZ╔}а ДV║jХ├цЁЄ ╥ы╦┼o/∙▓─"╚▒УйКYlr╕Dн*[#@╠3^\:c ^├▄cсЧ,SbсмJЩўu╛√оЫоХms╥мdєЇю█╤▄MўKUЙдW▄w(■чп[?Э?CvПЮ░ л╓┐■оЖ╫▄╟bФRИ█┐}■ёЬg╗░~¤оcцхщiж J?б8 M R╗ФE<ЕDФаУ╪єэ╟u┐кmЯЫЮ№чK*AВ─u-├LgЙ╧╞Н[9c─Eю╗ыёWЪОЙ;Jtї╪ч┐Ъ5лу+├k5┐ЫXJИх╜;~шo╜}╙=nь▐▀V│бaЪ╖~┘√sЗ№ысc+7i p▀жr╪U2╡┤─К├┐Ы5 р■5}^Е.D1lc*│(хF║Ы╪╕dЄт9│+5╛:rшOы╚╛;:ї╝и┘=Q) sм╟u@╣0╨ШЦ╣фй.╛¤╛їа\~[;K#*fЁбLzrтш╪╟║go∙∙╝:дЧ*╖e├o▒Ь▄цП?ymл{,ы ╔╡╣Х▒єkПў=┤є╖Н. ┌╞_7Gs▌_xх╝Ы┌;$Щ▄vnЙ8 fe ▓·╡'ХнЬF . ш·wл╫Д3╦Ї~}bрВЖ░уrEУЭDtыЪС┤ ХjЧ▄H qy;╓|ЫaZ=╨зЎэЭє▓*hВ"Э║ў╫зїяjш№№&Mт9G╢н_ЧU╡v┐бce*;J└+7V(`╘_╬F0ЬРз,╬e)Us■|sЁC;╫ ╨yт▓┌Н/1эДж!E"QhПKXУ;╛oыф╟:╕╣√zЯ╕°fЛ1М╪хT█вz|╙i ъ┐ъ╒╖XR|√кuБ@┼~├Gлuы╪б@(A3mrTу!╨*Оyd╧О∙│жfваЬ°ЦяW┴v╒к{▀Лo╝[)] ыБS0!╟Ўя[:s║П╖ОфьX│)MO╗╣ў#▀tЫRкВ┼▒@)ў╣╪yК3%▄? ▓·ОЩg{p_0Фh░k╪fю▐ЭjзfДj╘нл·Юн[Ў ЄKХкUZїжt╙█VЙж╪О&Ыот╞A!;tу╠с>U╠ uL$vP═Ние(F@ТжyN8/yў$│#р╛*тЖ√и*Qvd√кП'=╒'Рй▐▌ ┼·═яC}┴,@╔░%м1║Ў¤ЙsЗ=Sє┌Vў┐<┘Utви%╠CS_░q┼КЫ√ ╛бэШkkGV╧│dЄЫMюlє└c╧GНR1*eъ|L┐╗V╓ё┘╫/o┘)╫┼№`]78lЎ,ялwF}:vDл>/7ю╨KRвTvr:VCч└°К/▐№╙*Щ'ИЁюуQ@н2м@ьиcvксЫ┌▀W╛юEX·├Q╓.[░∙█O ╥▀ Bю╣a4k█╣┬∙ т\Гi\▒шн╜ы┐4▄(ЕoaN╣─╒цК╩l╒╛CЙ╩╡\┘P▌°╟єfя▌╝ ·е1ЖI:0`_ЄюєПЭ_┐^╫ёяEї <СqвЁ*D╡ицO%╜√ФЧ╘Хї ~g╓s}nъЇh╙╛O8F║Ц'ЮNи▒4ЪX1i╥gS▐╕°╛╬ў<9─▓РЎKRbл╞┐Є┘дI=ЗОкt├m ЕUЭ3схuя╠╗▓k╖ц▌│H)░:╥▄╝нЯ╝3у∙A&L/▌ЁGГШdТP м]∙╞ЁogO╗кG╗z┐ #╨(sH└<КЬ_&╒5С-¤№∙√╙▐:x n╤xНzUoyа{Vн╦)т;фX╨*$Ж╠чЎkўыПkяЁ╠╒wu┤ФдwЮm3.ф╖ЦNЫ╜c╙=ўwоr^Эw▀zw╟╓-Ч╡ju┴еM)╫╕Ц =Rh Б╖чL═s#╖whUеRЕy3цfo?╨║u╟ТНЪ╕чхИAYюОmя╝7╦╚╥█┤oн3i┴┤w`C╝у┴J╡jвzивq+╢їз╫╕гz═ъ╜G╝'зg▄╖sёФ1Ы┐°4-│dЯ╫╞e╘n╗д#6S"v-Э4вLЩ╠ЎЭ╗ф=2ц,9╜─]Э╗ЕJU└т@$?ёц?1_■╧Haя╛LЩ┘?цСNЗw¤▐u▄тjї0E╞▓2&Д├▐╔-`4nr)╥L)Fфш╛& ┘Є╔ЖЦ∙╚░╖їWG4ЙF╢°~ez╕LЭЖ╫─$НиR| ╓┼г_¤улz┘Ъ¤^ЫY╡╢Л$Ж-CЁIК·>┼┴¤оc0Ш╟уу╟╥┐.VХКэ▀5║KєЖ╖╡m√ш╙p╙═k┐ hЄИCk╛к╨шК■o╬П:.ЗtмDХpяк Z╘╗O╒DЪ╖ФPT 3дYs4МP╒сGPЧ╝ИЁS0КъHК(└a╗U@З$r■№сє ГzUkP╖ўИЩ9с*Ац1ъБ┘░ Д`6╓╫·&┐єъ╙5п╗│╫Р╔&eоfФfG▐|■СН_|╤╝ ?оi√@╠e:√f·Ё%&6jvW╖gЖ■ &X(2cSы░√√хЭ^xгЎ нY Лz▒ФТjиЎЧsG}4цї;{┐▄°▐З=я╛%зШ)ГI@dсG┴╚CЖ4;ИиD∙М-ЧU=сЄ0p0╦╓ *йlEd╩б═╔└ф3I EЗ▒ n@Ыэ?м╛oЁЁЖ7╖2ЩаАkъz(√рБ7√╡Пl█(·6ДjУE5f║r╡Юг╞Чi┌4!+X╤Mh№╤pHZ┴ PQmFArОС╚Шu Ы/ВЦd╥г, ╜гУЯQ\Д а▒°жяF>ЄА ╡ю╒┐ёэ│I&`GХbф░Ф╚█╛ц{3л~YS╣Ty@┌J4чыg}6e║сЁЛo╛╣∙#}ьR%╦АAгTЧв 07.S ж╧7o└:цD╚$╙o╔!2МА/б2KfС┬N √мCeЛle√7╦зъВ╬l4╩рnРA█ТmДJ╫k·рKг╙╩TКаT5┼▒C╘Zїяў?2р№[<°т╚╝` Sч`jиоЛvО.┼Дї╚W╧∙╔─auZwъ°°ЛодАєW1fЬ┴лмa85-j▌*МdY$о╚╙Q▓т║╬╨╝Bt╞t░iШТp┴м1=G8╦3`╠Ш.Г╜х┌ШG┬N@╡E╓H Ф╟Fи!1═б╢кЛ▓▌╟┼╜*ой╔JBRуЁ╚TMgNШ╞├╘r9кфН'Z▄aКС&r#в2х└TЇП(в*Щюb0╝╓И"+жL░02╠ЛЕcф┌▒ =я╬0·А iaбрЙ Ниоeъe╜Lf"МХК·вКdщRBeг┴ц%Jzo 9─▓э╕кf└ЫGёЕ#т8у{ \Щ .СM0Х4xсX█r┬>,ы╟3Н╒Hш&v0ц ЙЫЙ1╫ ыаPME╦o* "rСўК┼вE╒6┼Жf1 eГ█kc╗╝xX■u═Де цЗ╧┌=вк°Q)╚єb└╩Б╟+БIыGrЭа 3яQЭ%Ус1ЯXЁ#LЗ{qE│еtxCX╤╤VУ╚[д╝J╣.UjI0■dМщ49╔CGa#ЯЙ╦EX$а5Ш(╝ОGL_m┘"∙C:Щ шб8&о5 Ш°;╓Ыу^3к;j╞│ <°█╧-.о6нЩ╙ОП▌ПФм-Qeч■ИОl─Vх┬ ┬√M╞YW╣КУццЖя╧~о▀∙ ъЇ5█R3 ╫├Т│gыo{ЎэнXлn╔К╒)Юwaь>м╔u╢|╡tцрЮ═:t╗кў█H8а№╣i╪Щ2¤ў╚С_LYг∙══юяU╖╓%╨ыC╤}ЛЖ┐ЇыGЯ▀ўпб╡ooз1M╢╬Я<ЇЗ╣o_▀еыm╜Я╚eЩТ0b┘;>y{╞ЛO;;╜┴uквоУ┼aЩЦЦ°b╘╪х╙'_╫нуm▌ ЙЪ▌╨▓AбЗ3иiзKЦ#9√■°сУ▒/┘╣ЇЎО=]3▓p╬Дм║їюю>░R╡:qЗ╦║Бй¤Ъj█Й4UЪїd╫ї_н╛уёчпl┘┴╩П▌З DZfщ T;7$ГrУТТ5XЧёаy:l.0ГДшОCq+РАС╙Р╠Б╣ш?8∙{╢Ж9╓°Дн╧Ж ╤%░╞╕ ┐ъ▓ Ж┴▓эAnхm∙qh╖╗кVл╘g▄9лЬх$b{╢Нь▀K╢Єюю╤╜╤--ф@)KMП3MAUХЗЪGс╬Ш0e╪,5#КяРVИ└№╛№9╗П╚╤╜ыv`╦┌^гц╘jx╣н#╡J,╚]@Ўомхэ█3о_';rx└ЁБ┌Wш*ЦВp0T╫tХ┤╝Mk&<╥с■ИбRч%╕mДе╚Б?З?18rЁh╧W_н╓и▒Cї]ы┐Ы·XЯМЄе[ўшU√▓ыX╕┤Щ│oўъ% ╞╝ияЙ1є╡║ЧG;╝uїЇО-╦U┐░mязл^q]" Kц┴ ╦ц}8a43╩5U+[UЙ`r%3ь╚Й┴┴Rёp Б▒є,9Р,╫ъ:rу▓ь]Ы't┐╡юэў┤ьў\BO1є╖O╠yn@∙єj╢щўьyНпНл!╪ШU,╟ш|7E0└}Г┌ @√x ═▐╢■gъЁТUкWмuЮыв╗ёtт 1├JЬWx Йщ╠▄¤э▓{Uo╘╕▀Ё)fzeєє@ cрР╞8ьi`Rl№`╥╗C╒╝║y┐бУ)│E╦■х╗∙у^▐╛~уЭ_║мe')ФNь╚╖│_ p№д+ok█i╨┐ЎГцСI'>▒▀=█Z╤щЕQunncia,\ш╪Кмы4ё═╗П}нE W bў])Нp ~;OH╘E╫#▓╘QД,.VsЧD%╕┘уY│MhT╟ЭУЙ,р╦%:Ш╩б╚░╟$v¤■Ў╨gv ▓╞╚╩h█є╤&7╢╢фtCIёC;╓}3эї╤CG√LЯ[жF -vЇлў▀■l■┤ZХлЧ.]╡cЯGг%JGQчЗt0зcкТе) SU,U'Ы░ЭлxДнтMm ?├╕iБgXР`ю7,. л>sтёЛ█ex▓┴ ╨N4ч╟yУ? нr╣ОIъНc╥│$E,);;зc┐5]nФм╡исZЩД._8ў¤7Юй{]│╛/П╬E"n lЗBзKё ╔│0Ы ╓Ш┼ok╨▓CзБ/q%hP╙Гq╘*zТ)аwЧ9╬┬T]к█А╞4Х:, НS+ПШ░бj║┬╨┴ Г╞∙\п*ЪюHаЛ,┤PИ+╕n╗▓ +╠└└kNa┐Хl═2ГаХИRtЧ─%╟С|ХЛzB0пЁтр`"╒эU.╬v ╝3┌ ▄VWРУмй"ЮиH╔u░о7Sём╚ХР:ЦаюRЇ"s·а╩аЫBeaо6 FтЗЎ▄Ё▌] /LЛ╟fNЯR└╠У╗~╫о╝2╒ОfV╪╝;;,Ю╙h>3OjC3ьF ьsUv▄0НmX╡hц?йP╜№Э}Гм╙@╨╢>]·■·U_^▌эбV▌z╟$\vоHЪQ]ч╨Жo▐у╣Єл╡№мФY6D├`l╞u'H═▀Ч,Y1eшЯ9√к^qM╗Vў┴ Wo·aї[s*Ц=я╬ч^╠hpy└Vт{6}0q╚╓х╦/╜йE│╛ї*&d═9┤kэ▄1Я╧Юxk▀чы▐╒5#Ь▒wчV∙╨S╩╡usу;я ▒Є╦Ъ═п┐▒EgXGqНTи▀DХ ╪ю╛ k%;╛pцШ=ыV\▌╛╦ э{)Й╚ЗУG¤Ї┼ъєп╣∙Ж6j6╝╥VCВ,▀ кь╧?6╠ЄД═х;z=v■7Щ*zY4FeЇЫxЖ╜╪ ┤р`E(ж pж17Ж[КвqLи╟j;░┌М░Ы░ ╠мж╚d$KЦДUttж№З╩╨bZ70Г= ╘ДГQ└`:Л"╚ К╓ЬЁ:Нц▄╤sp┌MT7█vI╒║Н╥3Ї[_ ╤вЗ?ЩY2у╬ЗЮ.ЫUуаЪыy┴▄гЛGL╩╦е=GПO┐№ =в┘Ё╒шGР▄HЩъ5юь┌G*]╒▌╖{ё°╫rN∙Kпь4рЙмЄU╥ь▐№√Фо7┬ОQё№&ww╪ ЗЎю№x┌$)н|хНэ√?нЧлъ└6П^BЖoM╤aў╗МEя>OТл0fЩ2╡╫п■bщ+}*]~u╙╢Э╒Тe/мUs√ўл▀~эХьэЫ╦Tн╤~рєyсТ╒ъ╓╙TВ╔d<_█Р:UWx`RW,║їч╫{?рFЄоь┌яЦ¤O╟╡яЙ8~LЙфф·}¤бЯ┐°ў╠ eлЬOЯ'j@а U*fЦлФGB▓▓(┬¤MЛ▀Ь7Їё╩ оl╤╡┐Мйo┌╥)oьY НкН[v╜∙■G╘╠Rё╚Б/f∙~сТ ^╒к╧У┴Л/Е▌ьшЪя┐Ў─▐mЫош╪√ълЩе:&MщКЪ│s√КYc~√ц╙█╜ZщЦ╢A шbщ█m╦┤.8GЕ├Mм* "NСH└ ,tzR[└С┌*є№Г°O╘xагў ╢&-▓є╜╤п■эЧ╦|и\УA7ФмDt√ТQп┼]еы╚й7&,qx├'Bч.ЩЄ╠ЮMыЪ╡}аЎ╡╖`Бjч╫.Yв┤ XH╓├<ВQZЦ╥╒]┐o`GЎ╝?e╘О_7\█еoє.│┤╩XlР#╝ВИл╨$VуВ░┘#MюOТ╧~╚УsГX_ ╞Ep&╦Е}╪рp│Г[g╝2Ё└╞o╙2│┌>°HF┘Ъ▓vОюЪ3fH$╟*WлA╖!гфРЎ╙╥w =qx┘м╠Ў={лe*╞]╒РГоijAАўдTн╦┤RетlsDwё9R░маАй$Р#GИ#ыИ▐\ЛЪ▓* ЧкИЧ$█╨`▒0Ь▀╢╢пY5 _¤ъ╒иtK╟Зh∙:ej╘O╫ї°бm√╢о=┤э╖╣╙&щщ]╢RЭ╞█vяWьШaц¤·¤W+▐Ы\н■енюяK╒4f+=╜J╜·&╪ё╪ю-?ЪЁ,╢¤У╖┐^2┐╓57▄rOOЮвf(щ%к╫╣╨█@>p╪╚дs╙с)ЪкГ╧╬С3└ЎО╣кжф╚┐Эц*ОBmLЯuЎT1ЁUр$и┼иEuД╜*UОk(f$.3о╙Дж╔▓b█H№s<╙еД[q╕+╣ ]бВfRУ┤L A3┼:HoNyA/г╟Г┬╠rGУё`ЕЙs.ЮёPX ь■Ъl ╟╡Б(DКf┴╒!ъШ`║Тp,└├оb╪T к╔,ьМ░'╣b`Y╫╓d,x.И0ЪГгЕCе|_╧чЗЖКL):p╜C№гЫ pХйq┴тТ ╟тsAuйШoэJ5╘Фbс√pm░╧i ЬrПLDcЧАцx?y├tВ╣`>д╘q░УЮ┬U╝Zг.аn zQ░"+┼ЩЧ╣╟{#°л0`dЧШ{УЪAУyс@╔SД#▓lЕC╩fLN"╘`(u╨ВїJ┬c]Й)╨и  !5№а ╛ї0▄пщ ╟┴,$L5ч*<dvFТ╪UЎї°KmЧсЩк"╦╘2░-ъPgуЪ│Х▌╪бЭЗ¤бeуzбx╬╘ЩУ╚Ўm╗│2┬ёxю·Э╗bе*чdT▄y8кБхфъ8╤'оLрFkХк:!i▓√╦w╦╛9,{╟&╔21єIмё╥Х+З╦Vlr√ЭЧ▐ЖiI ▒>Ш)▓┴▄ТRьўo>ЭЁ╘аv |▒ю ═╜Ф/А z╠N7г┐Є╓█oMЛь▄)ЛcoЦ╠*U║╟/ЧitmTТ│И2ї╒l·`.2╦Є╒Э╛н╟@░ЎV▓ш╜WЮ"nМ+Щ╛>▒aУKF╜Ї┬╓╧>ФФ╕DL╔bЁ╚й6Ш*Б╜УЦ∙Ёkгk╓╣8D╚kПї▀Ў▌╫Д$╕dJZ°╬G▐╡cї№╖$╟┼▄жМ╥▀Ш^║vг8╤B║rт├Яш╖ы√П:?їBу█┌Eф░#x▓СK?XУТи ЙчЩ ш 6[Э╕6╛!Ё7Мr─уdд╦B\$КЖ%С@ #│dxurEШ╧ ,Юу1╝∙\є^Y2бг*╠Ив█x№ў╫▄°╦▌;▐·3ьRТ(y~¤Б#▀TCЩё├√цО▓їзпйХРJ╒ш3llе┌ AУz+¤XЎ ╙3`хЙ *╬&┘1R┌┐[К▐Ї$╧КH╥iЮB№пх!дьє Z'S╩iMР`4s=.L e4НYj╬юСГ▌╜}G▀WGW╕°J;РеRЪў╟║QПў╢▓7ГХН*╩╡╨CгзгF"░Ш3║┐>╛qГz■yЁхю╚y{94лАнРTSТclh╦Zа╠#г'f╓oв┴▌k╛9ЁaА4х╩Ф▐▒{Пд░ГzаBул┌ xlГЙ─Yaорi q╞д╠П ЩдвmсшЁW к°ЕQc╔HIдСdьP╛╩Є╨Хк{vЫТbbєБхД№д┬║ж!7a┌uh├╖╖6о░гSg╜Ivo┘ХЩО&юяNФмЬЧ^qыБ\L■EИк]·xю!й.Ц8!│ █№є╖KжMРь<\j у·╗;6╝╢ЩФ^╥┴@IОДм"ЛNgVИ'~∙сЫщП=| 3╧5l╒>Ыj╘╤ь┴ЫШ╣?п°|╒{я┬╞Sa)ъ%н█]wў}Ц пОЭйKя═Ю·╦ЧЯj░Lиu╤-эоo█-└k╛\ЎщВ╣╠6A▄╫│OНzM▐Ъ2q╟Oл4ЮР╣-╓кJ╧g"зUj╫w@╒:╡AM╠5z Ж╜в▌┌╢]ю╤#лЧ}$S└ъо╬ь2реP╡║yD ╦,╙ММyrрЦяЦ▀√╠╦Mюшp▐? K6┬╓Й║ь▄╨╠ЯQр>?╪gV+X╠ЦlхM·b▐оmкИ░╦мz~√■ГхТ`!&Ўюx╠kС¤;IfйN¤/YхSMgАL╨шw─┘т_э╚╣УФ╧░╕gE╬ф№с\<Ёs&g4╠ )9¤Ю├лха╢ёкъВ}ъ─t+Є┌уПь▀┤бяыгл7╜щРлКЪў╟·EуЗЫ9√1dжИ╪с╥н·>q┴y5bЗЎO|хE╦CWnQ╦│JВeY ╕Fц¤П=UоZ-╪O╢o┌°▐° Х╦Х║є╓цo╧ЪЛ%ЖnФ.╫бw PЩjr(╙tI╬╛]є^zвzНj7╖h1}╩jYаv╦Uнzo╫юV┼:D .П}!i║└▀!7╛сУEє^|▓v╜┌='╛ХC1╨ЮFHжnШ;Gv№ёЎ°Qюс]V\I┐рКk█uщeшз?┤щы┼o│R▓F▌О}jЩеlЇ│Р7?Я3j∙─W▐▐ж├а9jivеRАвЗ Р║┘┐{╓╨!фшСK█▄╫ЁОv╔^ЭЬu??vl6fn№юы%3зиШЧ РА  &э▌╪с■╞7┤Hha╟eg │╙ЎуЧЯ}·▐Пhjdн]зN┐m▄╕ёзЯ▄╪╛╙e74[╢|∙┌EoJУїRU_q╧C=sgПqЁ╫5ам,5|SЧЮїЫ▐ш -дщЫY#ЦN|уВ;юы№╠P$#┴╕rЖ5эет:кEи9р═Й═5${є:┘Н╗вRЄ │Т╒┌ў\│J%'Цє╓°Q{╖lRЁL╫~NQФQ ╢ь╤зVу+-Yw▒t0`yо╕ ┼О╬¤zЎО?$+*+К├НЮй\я▓SИвБэеp╙╓S╧J╩ЮЯP6ирп╢.═╢o¤c■фёfЎ><`LHеpЙК╖wы]Ўв&Цд·m├{#^╤▌8ВКc╡╜Д!P5│DлБ├╩Tк*Й Еb╬ФЯ#\EУ`1╞эЭ;zШ╡wЫьZ\ T║фъVїsd}╫ц_Пж┼П(X(W-]йтm[┐3gv"'Т,;Ж■OXьо( дХмYя■■O1=Р╗ч╖╣╞;√°ТSa,ЙЇk╞]Eн╥ш╥О╜·:jИJЁ╣&Ато.dqzOJе·К█Ш■ў5№м├ FOд Юс9░*4╨├√w┘Ё}Л&йN▐┤ЩУ╚■?vd ▄╧[┐kw╝D╒╝ЇJ[DЕЛкpёЗ|ў'╛О8'B7▒б?ЪоR3Цg+i┬╢┬,u%Ь'Ън*niу╠5dр╓п?7яЕ┴═[╖nxGkнtu╩4фС%ш.Л╦!'OЗ╫▀Оc╥пв[F╚A-°.hV╟Mф)╘T▒а7їОQBчЦ?*┴5-√F ═Х▓╕eЖ└x░cКD▒╥┬}YS╨!LI╖i$иp█╤ёАcЪ▒l╔╚Ъ.QЧ╪ЦїVL[%ZиМЙ ╠tЦG╖ :¤Я╧FLўю▐Гъ\╒▄Cї/l┬IЦ*пИЬ▄ЛL ¤<Iz╨O√·√НЕбЎ░5:qеxnР╗▄r5R"╩d╡dщhK$nьDА┌Дхи┴4У(┌`Ршh</Ўш ЬЗяЯ▌3<9▄?}я■iкЙ ЇиO▓TNs╗·Ыче@NВ░A┴rЛзУ )mьаь▓шСЩг_█║Єу╓╜·╓kqw"│lВР07╡D.╓Ыс'HВ─ЭЕ▓└& B▒(БW^ЦEю,с.z▐U#тr#лмЕЇuА_9П╟┴└└ю┌ EUd h,Je-н┤┼╟qB║"9f┬─fБАi 6=q■j<Нр▄є╝ЮЄби"└╙┴8жЙ5/Ш¤ЄS╡╧?я╬з^Мщiы\°кыО ╩╠╔╦KЗ~)║ ╠HgКAtbбЖ=*%■─╠%0МtNe╟▓i"Ц╪■╦·╧▀[ё■╠╖▐u╧3#есKhN  ▌yyiX Fcс4─EтНN╥slвa ╚SГЁ·{▐}╨╠╠К╔╢lШqH-иoq└╡бФ`+pMr$'a╟r╥с▀ОeСТ╚ъГ'а ┤ОЛ■╨АM▌t~Д├уU╥M╒р!LИА ▌╬уX*QЦ╙2` ╚CbGуЗў}9{┌O╦?┐дїГ═╗Їa╚fэ buЕЬАK ─i3Fд└а Ш╪xvР'╕УИъYмH1╩Дц┴ ц8AUvb Х$Ж>;Ъщ(6,jЧ▌╚bТо(ЧIЦКJШXЎ''о"╟╢Pd┘тD╧░╒ #▀O┘bjdje[╕I1№8 8j@2Э ц╡─РLErР№lN╫Е`ъо└╘27√`║к║L-@л░└eмъГеЦ╕оah№жbеф¤КU)T╟ 7Гz╡Д$WЗ->r$Г8╘ц─(;"+╦┬к┌TK─x%СqЯPЩ╥Byy`╖+в▄1ц┬bЬЖмRGQТбfЦ┤0_╒$Цй┘о!2ёh╛└уЪ╞-.9к 9j░ТФt-нI╬_^hjN_cЯкЮєj6чv/(nд┼О:╗■┐√ ╧AЫ6╤░N┬¤яnmROs"3fL${7o╧╠ ч%выwюIФиIп pЯ+Ыr┴ х3єр╬фКRaЫОё▀ЦКiцЙ`nУm.╗╚ТA юйы╩*g+X|╫ЙTЎ┘Ш╫Ц/Z╪■Щы7╜YQ╥0ьHж."pYhОЧёxЫъ:|[┴нO%ЖД?Xт YУAЭ#╬╓Г▓а~bоГ`ьx╛├lт&░╪╕)ВyЖpSa╫dzBЦй&щЬ]УєСyOЩwътЙГЛ lВК█u,ьysp┐н?|╫nЁsНn╣;бg║xPD∙Ф;-╕JIЦ?=PyFjqmb ╟R;xЖсАь&Жкc╚ЦЕ╟"Л╣Мg▀.╒TЎ'IЫ.Г¤Pа%<╧;│sЙ3шсЩЛЬк┴sр▌'^,т╣У┐6ф╘╛""ЭФ:ё╠х▄═KAГrкSLjКA╡т?L┘"оiИЩёhПэ╗Ў>lЫGп║л}√'_>lФ┤,│┤ГXg O┐ёМ^╜З┼8Е^И т<┼dR)─EQ@<┴G╓gМSP4 й╫EР,&-`|ЕюрбЛOGў>╓аХ4 0f^JжОм~^Q▄sёbциОб╣AУc╒QМ┴О╛Чд|ўЛєкЄ.B░гш Лж +{7F╤ЮЁv(*,cП░ .{ж`XГr ЛКuР$░w■}К╗хIE╞─╥ ЪЇ▓{D┴XDГ Ц"Ж3З╣Ъо╣ам ┼:D░╙`Щ()"╛йЙМdГ]хz ОЙ╨qm ∙а\C┼w├З>"Q$@`JЖ'Й0 h╧<═S·│╥К';╒,╥р_їL ЇЎi6xZыЁ █<]9╛┴sр▌ я=╞┐┌аMt¤└╬ь ▀▐zI├╩ЭpчЎЭЩ!Їюя▄cЦмЮк┤ї`@.s)(-*K$щoуЙ╫МЙ3\жzхУС 4Ц╟╬o╙аtСБHEэм]8чє%я▀╘эс╦оmA)╣2f╝f║╘бжлIШ√вк▄MаWSГbLЬзEp"чЁWYд$л ЫВ╦Ъ8FА▐┼@Пr3╧Ёа╧"0ШK┴mv╨L :ЦЗ1Р^51ы~c┌cки┴█╜╠ГШгБRqeєш№Спo^є├нП╕ЁЪ[r└Ъ╤u6uF%жcxдЬ"п░рФкЖxья╟mEgЪЙTpjZ╕С╙а╧;╓Kпy╡хE╠│°А╛ √>│tЮ║Й╛╧v;НйЖMсIk"0═лФю kA.┌xсоЬYСр┬_,▄`ъKО]Jnг┬╧ъ╕O ўП─й\з1фтg?U#Rq╦Жд║▒╘╔9НОЯ¤r:ї╨PN╠У▀ Feb(иВE4╤┌╟ 4╨╗[·╥S[7яшЁша┌Ч]EXЖ@ъE{Оь ш┐$╔:ЪX╠╤ Ї─№K╣Y,┼√=║░╙є╘├,оччd├"R┘╔ё╧Ё╪хш│;х>~ь{Е<ГЕ-ЭЁ<╔▒I>хS&∙_O ЦQ─▓Еy1╧Зc*╡j[ЦмЗа╗v┌Ї]Л&╡ю╧Щ6Сl▐╡;33ЛG6ь▄meUЙеU┌▓?В>зМ│`<Юз╩KИ.н'╘а` тЮ╡КqrH╝┼AПф]─=?РЮ8ЬП%╦Kr@╞d bг┘═╥m╔гuP▌a└РсК:;"╫│$HЄ?.и*ПcTL-├8Q┴ыm:∙oЖ╚'"БИъФГjqD(%▄OR%=4"ёE°nЙ╚1A'А,@-├їXB╪>|DMXJ║*gЦЙA3╠ JоNб м*ХТ_я°╣/4Э$ї▀╜dЧУ╖SHpЖЄWFъ╞ ▌цX├Е/F╧F■вЄ▄Jо"&▌∙.ь▓АПh2I║июЩ┐йИЇtс]\┼╨ъДEHдв=<!йzЫЄВ■,ppКУ─В╖ь°Йxц№$П¤xuxq╪∙, зюyёЗ)З_h╚╟ є°хDЛ^:┐╕5IдS,╔╙[╪Е%х"?╢H╧Р{¤wИ╟У3Июk9╢7KdХйА|▀Lу1дЄ.╝[tFф╞╗╔|│$*ТE-Yд┌г┴s∙'{ОЬR▓┤9fNyўз\╔F╣H#├/RТт░┬ыw╩┘M9)шЛ╞@[rCf4v╘М24Т`▓м╙KФvРB0 Є┤!.╤-п4Лт)$╙╙dбe$УЗuЬ(г Ъ├0ЧЗ3JиБ,*Б гс╒▓╔DЮаП тАUЛI╧їz^уvк1цMw{VЩф╒╙F╥QЩЙ/пz=╠П`ьу∙o#їФ9^пК@Pя▄╟√╙;]L(╠?└╘.ф_gA┴▒ >Mф╨[╖ = ыR╕Шe ╓▀√O┼3Xфн+А√╟'┼{lq╛XЦОJ▓`Ё$иKe )т_Б1n╛RU╝ЬT╕ ЩDю│xь,╔l┬j1оY^lаT╩T ыЬ╠D▓'┤Л╕};C^╤$о [Еъ╕иЦР ╢zО*IФ╫ФKrr[ЇЄK ╘И$B~HЄbqБ░╕pё╚╔ЛУйbMж№СЭ5┌/┤┤NCcзЮ═┬z▓XНЭTQ┼ъэs╡G╫╞q=OюMзц ;р╣┘░КyЖЕ■╬КYаз╕╤╔zХjmЯ╨лd crЎў~ p+DЬ▀"єfбkRЇF╞ЄVXны:ЦУu7{╧■ ▀6┐┤оfE▐Ъ:Йl┘╛зDVZ"Ю│qы╢ИЦ╡+.╚▒РУ 7▓в ПG=√H╝эI╫Ж▐уя*├XI┼Sюf┐SYЬЮх{#Йфm║▄d▒1@500G▓U╫Fо╤а╟Д└ДЎЎ:|│└iW╪U!F,мёL╕pвр ( zZ▄{░в└Гp]с>це┬XvYDсxДкHe&rй╨Y╞Uк$dТP╤Q#YВPI╡IШ+║Э░Йцjdoв1 mТв┤ф)Iбў*е-Nд╘P5╡pС;NNlфtlЇcЧ[╚Н╠Q ║XDЎ:╙DБ# 3Yф√kв╥Д7┬ш$Ю ▓╨мР┬п╧'8M^┐В/жlP*д─К&║VЛ>C╙П╒╟.╠ ВOЎ╨ПєРS└}Юя ┼╣P╧S_Rt°∙ЎCб?ЗK -'Щ╫╚q╖(2фт№Cз╣ЬКЇ░xяiJюйBIr╧/EВТ╦MЄ^OT&@'ЖЁQ!"М╞├ё╕Кє┘ uEЇ∙▐ХcO@─▒$╤в]ё №╖ВGРyvЧTDОB\)Ш<┘qС(│ш)(╙Щ-C┼M Ш*CгA┬сZзhLbЮ#SЦDэЫ╚л═У║╖ └ C0dт"yЬ,JВbcV°dв░╤ Еqq+тH< ЪР▀├Cе╚╛меZу=чВю╜рZ*/XMB╦z  X!АkP╔тc*Я╙фоYK▌ Fyz▄╗ТВ$┴═![├зНїt$У╩Ц╨▄╕ЭЛ'лD6ШЙМ▄$,═pp;t6 оSрА?НЕ-гI)м)юo#╞|И╦░?╢фR╤l`qХ─▀Z▒йЁў>Цє@pэ╗e┴EФ С \Ф$EyЫ^С%Д▌Ju░ЙйнEЖ/*FZ╤дЮ┬7GpЩT1╜UOТ*┤nсвшзНЫфШ╙3 .Rъ`гуAў0ЦI╕█\▒ K╕wcy MЎlpТ▀E▒╦xp▐л#E─Уд°Оt▄#ЬёlРВЭСєфщК83sAёX┬A тuл┤IАb▓|кЮЯRн+∙ЪЎ╕═¤xНЭ▄=П>2I ўё)░УвИ3g╜GЦz.:_дЗЕ№)w└╙┘ЇП┐iКсў ya├Вp)хлrъб╗_s)EГ╟_-┬/СAЗЭF6W╥▒ODИ$)Її╙°ЪдкКe┘J Hй#хКэ▌▄т╩FкЫ3u ┘ї╟ЮR%2тёгЫ■°=ЗЎ╟╕C дlц6╥╤WВ ж╜UFRжВGбI |¤Р6╬у3вe'╦ОмЙ│K&ж;∙╓QYv╤╜@L ╕Ё)uT╨╩Ю╧ ]╦еpи└=t&щ$yт╞Е╗ИЛWЭPс<ЄFК>?с7a"Ю'╜Б,уtагТ├t4Вg╞ш╩"$i■╗вX ╕Aу\╡1H2(Юж║иПЙ┴4╒┼:&ш ▌`╘╥x\Ж1▄'Ъrкубум╪╘/ '╔#ЇУ5~╩Ю`DС┴кёR1╨г#О,Gщ,>НЕ}мцQс═├5sв"└п╖9с┘Laх| 0 ▀=лКпЇ!∙Р├╗УйКН┐Ж├[wo╞9OЮQу╤Нx╬йTO}2|Ьw┐`Р"Ч@╨w{┴┴╞ГEОёRШ╞f╕┬ЮФ▒ , mК┤МIz▓~ьж _рz/┌ЩФdП лЁКЩ0Н╦6УX?bТEJ╜нrKд!╘ёp З╫PЎxQЮgАbе_пGДЛЪ▓°▐1▓ЬD}`▒б@0╜ON╡ПЯО╞>ХзўNCc╖1╙УчDc■╩┘э╕Ыю∙)З)╙єs▓aЭЁ ПЩ╟∙■╬рF'яU Гф°O=пНe█зфjSEUт?с▄BПч0Miy╕о╗{ўю-[╢┤m╙╞Q k$2d;Н╕─О╧Ъ:Эl▀╢#33#Лn┘╢5лDй*╒j╢1Ж,йя╜бы┴АюеьЬd┤▐АyкOПЩK∙ єеjф$╖8S)Uq╖+|╙.(шg┴з'я∙ ╛HqЯJ∙╫ЬфS_|∙OH╩╫PТТїЪУ╛ir▓+ тнеУк{^|╢═_▒o ;╩К╢yТ7ёD}Х AaфРRн╛Єь▐kТъўЪ:;M^АExб▀IсOy∙ьвrСп№E)№ф JГ'▀ O°(хz√Л8сF╝Ёа─? 6╟в¤)*┼q╩ЬEOО√=┐['ь╘дH╟╬bнж\ ┼_|9З┬8ПEзt╥оЗГр:С░О= Е G Йf╓В┼ХПKэ╚╤#У'M▐Ї╦ж┼Л▀O& pП╞6м_ЧЧЧ7c:└¤э█322тё°╓н[KФ(QнZ5пнтN░| └¤`Ё╕яЛ/╛°тЛ/╛°тЛ/╛Ь М▒X,vzp?\АоcB233srr о)И ЄВ√)еЁ√п┐■:yЄфH$▓d╔Тdї=╬г╤ш·їыюOўс╛/╛°тЛ/╛°тЛ/╛№чфьр~"САo ▀░aCс╦<4я║окк^╣т¤√ў/Z┤Р¤З~ш╡у├}_|ё┼_|ё┼_|∙Ыфьр>рu╙4E╘^pM$┘▓eKЭ:u╥╥╥°ряы>▄ў┼_|ё┼_|ё┼Ч┐I╬ю╓pи{├Ж ▓ЗFVо\╣`┴В.]║\u╒UЖaPJ=я■┬Е с·EЛy▐З√╛°тЛ/╛°тЛ/╛°Є7╔_Д√? №3№QU╒;vМ7╬▓м▓e╦Ўю▌;++╦З√╛°тЛ/╛°тЛ/╛°Є_Ц┐ў╫н[░▄u]EQа)° Жсеъ·p▀_|ё┼_|ё┼_■ЫЄс■┌╡k▄├?U,9═m█Жz╕▀З√╛°тЛ/╛°тЛ/╛°Є_Ц│N╒Н┘╢m└z└·оыzn~M╙3П/╛°тЛ/╛°тЛ/╛№нrv▒√ЦedWP{╤Л ╝√p¤▐╜{▀ }╕~┴Вкк·┴<╛°тЛ/╛°тЛ/╛°Єў╔Y{ўм{╝√·╟╤4 Б╓<а^8Шр>▄b╔Т%╛w▀_|ё┼_|ё┼_■V∙ыUuсП┐■?№н┴eЧ\r аq┐╠Ц/╛°тЛ/╛°тЛ/╛№Чх/┬¤ 6x░~я▐╜'N\╗vэН7▐╪гGЁ>▄ў┼_|ё┼_|ё┼Ч ▓№E╕°~:ОгкъЮ={>№Ё├6m┌hWхlр~VV└}/╧ЪH┘ю√тЛ/╛°тЛ/╛°т╦)┼C╦зў` Ё╕°чЖ ─█╢э1lФ╫їbўс/Зzя╜ўрпкюiеъzI┬)┌0,р6Жax▌:╟O┼_|ё┼_|ё┼_■!p└╖З╤O"А▒CбРчЮЗп|▀┐?@Ї═Ы7n╨√е╓C│999╦Ц-Г+?°рГb╕#╪ йс~╒кU╜&рf)╗щ║$ю√тЛ/╛°тЛ/╛°тK1┬ЕvдЭ╥Н^XюГAю?xЁ └ў╡k╫■bс#З{Яn█╢-==}╤вEрр■║uырчЙp~йPбВы║^■o╩C°H╙4А√з<ТЁ┼_|ё┼_|ё┼Ч │┬є┼▓мSzў{└Ў|ЎЁsх╩ХГ ╘]°Ъ┬╨┐└С╧Д\w▌u├Ж k┴;OH$Ы7oN┬}@∙еKЧОD"Ё'╕ ╨я6)╜ўС-T\:п/╛°тЛ/╛°тЛ/╛№ыФ┐=х┼Й╢p▒ы║╓╜аЭ┬╫№RЁw┤ЖOOOяБy°г%dц╠Щў ├╚╬╬▐│g╧)O|ё┼_|ё┼_|ё┼Ч }▄├№∙є╔ш╤гшя┌╡╦; °ow╠_|ё┼_|ё┼_|∙лтЭ*╚  k┼ endstream endobj 8 0 obj 179765 endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000383 00000 n 0000180438 00000 n 0000000324 00000 n 0000000187 00000 n 0000000015 00000 n 0000000140 00000 n 0000000431 00000 n 0000180416 00000 n 0000000158 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 180493 %%EOF ess/doc/ajr-talk.tex0000664000175000017500000003237712423756516012747 0ustar eddedd%% Given in Seattle, at the National Research Center for Statistics %% and the Environment, and at MathSoft, October 1997. \documentclass[semhelv]{seminar} %% comment out the above and use below, if you have font troubles %%\documentclass[semlcmss]{seminar} %%\documentclass{seminar} \usepackage{slidesec} \usepackage[dvips]{graphicx} %\usepackage{html,heqn,htmllist} % LaTeX2HTML support \begin{document} \typeout{ } \typeout{If you have font troubles, comment out line 5 and uncomment line 7} \typeout{ } \begin{slide} \slideheading{ESS and Literate Programming: \\ Tools for Efficient Statistical Programming and Data Analysis} \begin{center} Dr. A.J. Rossini \\ Statistics Department \\ University of South Carolina \\ rossini@stat.sc.edu \\ % \htmladdnormallink{http://www.stat.sc.edu/\~{}rossini/rsrch/seattle-nrcse/} % {http://www.stat.sc.edu/\~{}rossini/rsrch/seattle-nrcse/} \end{center} Note: \textbf{ESS} is joint work with: Martin Maechler (ETHZ), Kurt Hornik (TU-Wien), and Richard M. Heiberger (Temple). \end{slide} \begin{itemize} \item Thanks also to Bates, Kademan, Ritter (initial versions), and David Smith (3.x, 4.x). \end{itemize} Recently, I've been giving talks which focus on Computer/Statistician interfaces, like this one. They tend to get strange responses. This is not too different from the applied/theoretical Comp Sci situation, where journals focus both on software practice, as well as on theory. Practitioners from both groups are also very confused. So for today, we will focus on one area of statistical practice, as opposed to statistical theory (methods/mathematics/data analysis). \begin{slide} \slideheading{Introduction} Topics: \begin{itemize} \item Computing Environments \item ESS (=\emph{EMACS Speaks Statistics}), and its capabilities \item Literate Programming and Literate Data Analysis \item Links between ESS and Lit Prog \item Future (planned?) Extensions \end{itemize} \end{slide} \begin{itemize} \item Outline of Talk \end{itemize} \begin{slide} \slideheading{Computing Environments} Computer / Statistician Interface: \begin{itemize} \item Command line: keyboard based, minimal mouse usage (SAS (old style), S-PLUS 3.x, R, XLispStat, Minitab (old style)) \item Graphical: pointer (mouse)-based, ``point and click'', minimal keyboard usage (S-PLUS 4, ViSta, Minitab) \item Mixed Interfaces: S-PLUS 4, SAS, ViSta, Minitab \end{itemize} The \emph{Interface} is dependent on the particular user's practice (note the repetition of packages). \end{slide} \begin{itemize} \item Importance to Statisticians. \item Issues of efficiency \end{itemize} \begin{slide} \slideheading{Computing Environments: Design Considerations} \begin{itemize} \item keyboard entry is faster than mouse entry (eventually?) \item mouse entry is easier than keyboard entry (initially?) \item At present, keyboard interfaces allow for more complex/powerful methods, but this is more a function of current software than a design limitation. \item Keyboard interfaces generally require memorization of some commands (at the minimum: those required to find others!). \end{itemize} \end{slide} \begin{itemize} \item Not discussing using keyboard as a substitute for a mouse/pointer-based interface! (i.e. keys to move the pointer, and to press the pointer buttons). \end{itemize} \begin{slide} \slideheading{Emacs} \begin{itemize} \item Text Editor (not a word processor) \item Fully Configurable and Extensible: \begin{itemize} \item Communication with system processes \item Automation of procedures (version control, file comparison) \item Language-specific customizations \end{itemize} \end{itemize} Currently, comes in 2 GNU Flavors: \begin{itemize} \item Emacs (FSF/RMS developed) \item XEmacs (derivative of the above, more features, more bloat) \end{itemize} \end{slide} Some current modes: \begin{itemize} \item \LaTeX \item C, Fortran, SQL \item Makefiles \item version control \end{itemize} XEmacs features: \begin{itemize} \item Embeddable images \item mixed fonts and rich-text (near-WYSIWYG LaTeX document construction) \end{itemize} \begin{slide} \slideheading{ESS (=\emph{EMACS Speaks Statistics})} A package for Emacs, with the following features: \begin{itemize} \item Mode for generating program code for statistical packages \item Inclusion of statistical processes as inferior processes controlled through Emacs. \item Interface for on-line help features for statistical packages (via calls to the package, standard WWW documentation, etc) \item Interface for generating, documenting, and reusing transcripts for data analysis and development sessions. \end{itemize} \end{slide} \begin{itemize} \item Discuss the README \item What are we trying to do \end{itemize} \begin{slide} \slideheading{ESS capabilities: programming} \begin{itemize} \item Syntax-based color and font highlighting \item Access to on-line help facilities when inferior statistical processes are running; to WWW based facilities when not. \item Connection to statistical processes, ability to switch processes (i.e. different instantiations of the same dialect, different dialects) \end{itemize} \end{slide} \begin{itemize} \item to improve code readability. \item on-line help, split off into a different buffer. \item connection to different processes: \begin{itemize} \item to compare different results \item to get different help information \end{itemize} \end{itemize} \begin{slide} \slideheading{ESS capabilities: inferior process} \begin{itemize} \item Syntax-based color and font highlighting \item Searchable Command History \item Separate buffers for help output \item Log (Transcript) of commands \item Debugging assistance (of source) \end{itemize} \end{slide} \begin{itemize} \item to improve code readability. \item ``Splus -e'' improved. \item split up output by context (help, etc). \end{itemize} \begin{slide} \slideheading{ESS capabilities: transcript} \begin{itemize} \item Reuse of transcripts in different dialects, for different sessions. \item Commenting of transcripts \item Comparison of output \end{itemize} \end{slide} \begin{itemize} \item One use: authors who are targeting a number of dialects of S, S-PLUS, and R. \item Readability \item comparison of output among different statistical packages. \end{itemize} %\begin{slide} % \slideheading{ESS: examples} % %%\includegraphics[height=3\semin,width=3\semin]{ex1.ps} % %%\includegraphics[height=3\semin,width=3\semin]{ex2.ps} %\end{slide} %Discuss example screen shots. \begin{slide} \slideheading{ESS: future plans} \begin{itemize} \item Improved support for current languages \item Additional support for other languages (Fiasco/SPSS) \item Inlined statistical graphics (XEmacs) \item Object browser (partial implementation exists for SAS, eventually for S and XLispStat languages). \item Language independent UI/GUI for data analysis. \item Language independent UI/GUI for statistical instruction. \end{itemize} \end{slide} \begin{itemize} \item ESS as a general purpose statistical GUI \item ESS as a general purpose statistical instruction/assistance tool \begin{itemize} \item Statistical help via WWW \item Download similar Analyses \item Guidance via Literate Data analysis \end{itemize} \end{itemize} \begin{slide} \slideheading{Why bother?} \begin{itemize} \item No real need to have a unifying mode (both too much and too little). \item Different languages have different syntax \end{itemize} \textbf{BUT:} \begin{itemize} \item Common, generic interface. \item Improved documentation is important. \item To this goal, want to encourage documentation and revision logs: \begin{itemize} \item Revision and Source Control Systems (not discussed: SCCS, RCS, CVS, PRCS) (automated via Emacs, or manually implemented) \item Literate Programming (discussed) \end{itemize} \end{itemize} \end{slide} \begin{itemize} \item Why 2 topics? \item Single common mode for Literate Programming, Literate Data Analysis. \item Revision/Source control is extremely useful for keeping track of document and program changes. But will not be discussed today. \end{itemize} \begin{slide} \slideheading{Literate Programming: Introduction} \begin{itemize} \item Introduced by D.E.Knuth for developing \TeX (1984) \item Intent: The task of programming should shift from telling a computer what to do, to explaining to human beings what we are doing. \item Remark: Every use of the word \textbf{programming} (used before and after this) can be exchanged for the words \textbf{data analysis}. \end{itemize} \end{slide} \begin{itemize} \item Origin \item Goal: a means to document results. \item \emph{Data Analysis} can be thought of as the implementation of a particular type/style of \emph{Programming}. \end{itemize} \begin{slide} \slideheading{Lit Prog: Example} {\tiny \begin{verbatim} \section{Introduction}\label{intro} For regression models with interval-censored data, there is generally no simply means of conditioning out the nuisance parameter. This nuisance parameter is generally a function of the baseline cumulative distribution function, such as $\Lambda(t)$, the cumulative hazard function, or $\Phi(t) = F(t)/S(t)$, the odds function. However, with right-censored data under the proportional hazards model, we can condition out the nuisance parameter. This simplifies and speeds up the resulting estimation. The main body of code will be the simulation routine, given by <>= bag.sim <- function(beta,N,nobs,numBSsamp) { <> ; <> ; } @ %def bag.sim N nobs beta numBSsamp This can be divided into dataset generation and analysis sections. <>= for (i in 1:N) { <> ; <> ; } @ %def i \end{verbatim} } \end{slide} \begin{itemize} \item Basic example of literate programming. \item document chunks start with '@'. \item program chunks start with '\verb$<<$' \end{itemize} \begin{slide} \slideheading{Web Processing} \begin{itemize} \item To get documentation: weave a web (forms: tex, html, etc). \item To get the code: tangle a web \end{itemize} idea: don't want to read or change raw code (and discourage this!); documentation should tell you everything. \end{slide} \begin{itemize} \item Not WWW... \item basically text processing. \end{itemize} \begin{slide} \slideheading{Statistical Programming and Data Analysis} Is there a difference? \end{slide} \begin{itemize} \item Why literate programming is of interest for data analysis documentation. \item at the most, differences just in the intended use of the code. \end{itemize} \begin{slide} \slideheading{Requirements in a Literate Programming Tool} (for statisticians) Program: \begin{itemize} \item Language independence \item Platform independence \end{itemize} Statistician: \begin{itemize} \item discipline \item interest \end{itemize} \end{slide} \begin{itemize} \item Language independence (examples: S-PLUS, C, Fortran code mixed interchangeably). \item Flexible and platform independent \end{itemize} \begin{slide} \slideheading{Relationship between ESS and Lit Prog} Good: \begin{itemize} \item Documentation (using AUC-TeX), ease of programmability \item Ability to test out real code (dump straight into a running process). \end{itemize} Bad: \begin{itemize} \item Not fully automated (yet!). \item learn yet another language (or meta-language). \end{itemize} \end{slide} lack of automation implies that one needs to access a command line to actually produce results. \begin{itemize} \item Current Links \end{itemize} \begin{slide} \slideheading{Future Extensions: ESS/Lit Prog} \end{slide} \begin{itemize} \item Templates \item Software packaging \end{itemize} \begin{slide} \slideheading{Where to find} \begin{itemize} \item ESS: http://ess.stat.wisc.edu/ %%\htmladdnormallink{ESS} {http://www.stat.sc.edu/~rossini/projects/}: \item Literate Programming: \begin{itemize} \item General Information: http://www.desy.de/ftp/pub/userwww/projects/LitProg.html %%\htmladdnormallink{General Information} {http://www.desy.de/ftp/pub/userwww/projects/LitProg.html} %%\htmladdnormallink{http://www.desy.de/ftp/pub/userwww/projects/LitProg.html} {http://www.desy.de/ftp/pub/userwww/projects/LitProg.html} \item %%\htmladdnormallink{Frequently Asked Questions about Lit %%Prog}{http://shelob.ce.ttu.edu/daves/faq.html}: Frequently Asked Questions about Lit Prog: http://shelob.ce.ttu.edu/daves/faq.html %%\htmladdnormallink{http://shelob.ce.ttu.edu/daves/faq.html} {http://shelob.ce.ttu.edu/daves/faq.html} \item %% \htmladdnormallink{Noweb} {http://www.cs.virginia.edu/~nr/noweb/intro.html}: %%\htmladdnormallink{http://www.cs.virginia.edu/~nr/noweb/intro.html} {http://www.cs.virginia.edu/~nr/noweb/intro.html} Noweb: http://www.cs.virginia.edu/~nr/noweb/intro.html \end{itemize} \end{itemize} \end{slide} \begin{itemize} \item Where to get it. \end{itemize} \end{document} ess/doc/allnews.texi0000664000175000017500000000015612423756516013046 0ustar eddedd@settitle ESS -- Emacs Speaks Statistics @include ess-defs.texi @include newfeat.texi @include onewfeat.texi ess/doc/README.S0000664000175000017500000002505312423756516011572 0ustar eddedd-*- text -*- ($Revision: 5.2 $) ESS: Using The S family of statistical languages ================================================ ESS (originally S-mode) was initially designed for use with S and S-PLUS(tm); hence, this family of statistical languages currently has the most support. We denote by _S_, any of the currently available members of the family, including S 3.x, S 4.x, S-PLUS 3.x, S-PLUS 4.x, S-PLUS 5.x, and R. In addition, we denote by _Emacs_, one of the GNU family of editors, either Emacs (as developed and maintained by the Free Software Foundation) or XEmacs (which is a derivative work). The following is covered in this document: - general Emacs features. - Editing files. - running an S process as an inferior process to Emacs - using transcripts. - Scenarios for use (possibilities, based on actual usage) - Philosophies New in 5.1.2 and later: use under Microsoft Windows OS's with NTEmacs. See the file README.SPLUS4WIN for more details. Emacs: General features ======================= We assume that you are familiar with Emacs terminology and syntax: file, buffer, region, description of keys etc. If not, please read the New Users guide (found in the info pages, "C-h i" (by pressing control h, i) or Tutorial, "C-h t"). To find the key-sequences for commands, view the keymap (C-h b) or view help for the current mode (C-h m). ESS[S]: Editing Files ===================== ESS[S] is the mode for editing S language files. This mode handles: - proper indenting, generated by both [Tab] and [Return]. - color and font choices based on syntax. - ability to send the contents of an entire buffer, a highlighted region, an S function, or a single line to an inferior S process, if one is currently running. - ability to switch between processes which would be the target of the buffer (for the above). - The ability to request help from an S process for variables and functions, and to have the results sent into a separate buffer. - completion of object names and file names. ESS[S] mode should be automatically turned on when loading a file with the suffices found in ess-site (*.R, *.S, *.s, etc). However, one will have to start up an inferior process to take advantage of the interactive features. iESS: Inferior ESS processes. ============================= iESS (inferior ESS) is the mode for interfacing with active statistical processes (programs). This mode handles: - proper indenting, generated by both [Tab] and [Return]. - color and font highlighting based on syntax. - ability to resubmit the contents of a multi-line command to the executing process with a single keystroke [RET]. - The ability to request help from the current process for variables and functions, and to have the results sent into a separate buffer. - completion of object names and file names. - interactive history mechanism - transcript recording and editing To start up iESS mode, use: M-x S+3 M-x S4 M-x R (for S-PLUS 3.x, S4, and R, respectively. This assumes that you have access to each). Usually the site will have defined one of these programs (by default S+3) to the simpler name: M-x S Note that R has some extremely useful command line arguments, -v and -n. To enter these, call R using a "prefix argument", by C-u M-x R and when ESS prompts for "Starting Args ? ", enter (for example): -v 10000 -n 5000 Then that R process will be started up using "R -v 10000 -n 5000". New for ESS 5.1.2 (and later): "S-elsewhere" command The idea of "M-x S-elsewhere" is that we open a telnet (or rlogin) to another machine, call the buffer "*S-elsewhere*", and then run S on the other machine in that buffer. We do that by defining "sh" as the inferior-S-elsewhere-program-name. Emacs sets it up in a "*S-elsewhere*" iESS buffer. The user does a telnet or login from that buffer to the other machine and then starts S on the other machine. The usual C-c C-n commands from myfile.s on the local machine get sent through the buffer "*S-elsewhere*" to be executed by S on the other machine. ESS-trans: Handling and Reusing Transcripts =========================================== - edit transcript - color and font highlighting based on syntax. - resubmit multi-line commands to an active process buffer - The ability to request help from an S process for variables and functions, and to have the results sent into a separate buffer. - ability to switch between processes which would be the target of the buffer (for the above). ESS-help: assistance with viewing help ====================================== - move between help sections - send examples to S for evaluation Philosophies for using ESS ========================== The first is preferred, and configured for. The second one can be retrieved again, by changing emacs variables. 1: (preferred by the current group of developers): The source code is real. The objects are realizations of the source code. Source for EVERY user modified object is placed in a particular directory or directories, for later editing and retrieval. 2: (older version): S objects are real. Source code is a temporary realization of the objects. Dumped buffers should not be saved. _We_strongly_discourage_this_approach_. However, if you insist, add the following lines to your .emacs file: (setq ess-keep-dump-files 'nil) (setq ess-delete-dump-files t) (setq ess-mode-silently-save nil) The second saves a small amount of disk space. The first allows for better portability as well as external version control for code. Scenarios for use ================= We present some basic suggestions for using ESS to interact with S. These are just a subset of approaches, many better approaches are possible. Contributions of examples of how you work with ESS are appreciated (especially since it helps us determine priorities on future enhancements)! (comments as to what should be happening are prefixed by "##"). 1: ## Data Analysis Example (source code is real) ## Load the file you want to work with C-x C-f myfile.s ## Edit as appropriate, and then start up S-PLUS 3.x M-x S+3 ## A new buffer *S+3:1* will appear. Splus will have been started ## in this buffer. The buffer is in iESS [S+3:1] mode. ## Split the screen and go back to the file editing buffer. C-x 2 C-x b myfile.s ## Send regions, lines, or the entire file contents to S-PLUS. For regions, ## highlight a region with keystrokes or mouse and then send with: C-c C-r ## Re-edit myfile.s as necessary to correct any difficulties. Add ## new commands here. Send them to S by region with C-c C-r, or ## one line at a time with C-c C-n. ## Save the revised myfile.s with C-x C-s. ## Save the entire *S+3:1* interaction buffer with C-c C-s. You ## will be prompted for a file name. The recommended name is ## myfile.St. With the *.St suffix, the file will come up in ESS ## Transcript mode the next time it is accessed from Emacs. 2: ## Program revision example (source code is real) ## Start up S-PLUS 3.x in a process buffer (this will be *S+3:1*) M-x S+3 ## Load the file you want to work with C-x C-f myfile.s ## edit program, functions, and code in myfile.s, and send revised ## functions to S when ready with C-c C-f ## or highlighted regions with C-c C-r ## or individual lines with C-c C-n ## or load the entire buffer with C-c C-l ## save the revised myfile.s when you have finished C-c C-s 3: ## Program revision example (S object is real) ## Start up S-PLUS 3.x in a process buffer (this will be *S+3:1*) M-x S+3 ## Dump an existing S object my.function into a buffer to work with C-c C-d my.function ## a new buffer named yourloginname.my.function.S will be created with ## an editable copy of the object. The buffer is associated with the ## pathname /tmp/yourloginname.my.function.S and will amlost certainly not ## exist after you log off. ## enter program, functions, and code into work buffer, and send ## entire contents to S-PLUS when ready C-c C-b ## Go to *S+3:1* buffer, which is the process buffer, and examine ## the results. C-c C-y ## The sequence C-c C-y is a shortcut for: C-x b *S+3:1* ## Return to the work buffer (may/may not be prefixed) C-x C-b yourloginname.my.function.S ## Fix the function that didn't work, and resubmit by placing the ## cursor somewhere in the function and C-c C-f ## Or you could've selected a region (using the mouse, or keyboard ## via setting point/mark) and C-c C-r ## Or you could step through, line by line, using C-c C-n ## Or just send a single line (without moving to the next) using C-c C-j ## To fix that error in syntax for the "rchisq" command, get help ## by C-c C-v rchisq 4: Data Analysis (S object is real) ## Start up S-PLUS 3.x, in a process buffer (this will be *S+3:1*) M-x S+3 ## Work in the process buffer. When you find an object that needs ## to be changed (this could be a data frame, or a variable, or a ## function), dump it to a buffer: C-c C-d my.cool.function ## Edit the function as appropriate, and dump back in to the ## process buffer C-c C-b ## Return to the S-PLUS process buffer C-c C-y ## Continue working. ## When you need help, use C-c C-v rchisq ## instead of entering: help("rchisq") Customization Examples and Solutions to Problems ================================================ 1. Suppose that you are primarily an SPLUS 3.4 user, occasionally using S version 4, and sick and tired of the buffer-name *S+3* we've stuck you with. Simply edit the "ess-dialect" alist entry in the ess-s3-d.el and ess-s4-d.el files to be "S" instead of "S4" and "S+3". This will insure that all the inferior process buffer names are "*S*". 2. Suppose that you WANT to have the first buffer name indexed by ":1", in the same manner as your S-PLUS processes 2,3,4, and 5 (for you heavy simulation people). Then uncomment the line in ess-site (or add after your (require 'ess-site) or (load "ess-site") command in your .emacs file, the line: (setq ess-plain-first-buffername nil) ) 3. Fontlocking sometimes fails to behave nicely upon errors. When Splus dumps, a mis-matched " (double-quote) can result in the wrong font-lock face being used for the remainder of the buffer. Solution: add a " at the end of the "Dumped..." statement, to revert the font-lock face back to normal. ess/doc/ess-manual.org0000664000175000017500000000510012423756516013256 0ustar eddedd** Introduction to ESS *** Why should I use ESS? *** Overview of current features *** New features in ESS *** Authors of and contributors to ESS *** Getting the latest version of ESS *** How to read this manual ** Overview *** ESS features for the S family *** ESS for SAS *** ESS for BUGS *** ESS for JAGS ** Installing ESS on your system *** Requirements *** Unix (Linux / MacOS / Solaris / ...) Installation *** Microsoft Windows installation *** License *** Stability ** Customizing ESS ** ESS mode: editing source code *** Creating or modifying objects *** Loading source code into the ESS process *** Detecting errors in source files *** Indenting and formatting code **** Changing indentation styles *** Motion and completion *** Maintaining source files **** Names and locations of dump files *** Summary of ESS mode commands ** Inferior ESS mode: interacting with the ESS process *** Starting an ESS process **** Running multiple ESS processes **** ESS processes on Remote Computers **** S+elsewhere and ESS-elsewhere **** Changing the startup actions **** Is the Statistical Process running under ESS? **** Using emacsclient *** Interacting with the ESS process **** Entering commands and fixing mistakes **** Manipulating the transcript ***** Manipulating the output from the last command ***** Viewing older commands ***** Re-submitting commands from the transcript ***** Keeping a record of your S session **** Command History ***** References to historical commands ***** Saving the command history *** Summary of iESS commands ** Completion *** Completion of object names *** Completion of function arguments *** Minibuffer completion *** Integration with auto-complete package *** Icicles ** The help system *** ElDoc ** Transcript mode: manipulating saved ESS process sessions *** Resubmitting commands from the transcript file *** Cleaning transcript files ** Developing with ESS *** ESS tracebug *** Editing documentation **** Editing R documentation (Rd) files **** Editing Roxygen documentation *** ESS developer ** Other ESS features and tools *** Handy commands *** Syntactic highlighting of buffers *** Parenthesis matching *** Using graphics with ESS **** Using ESS with the @code{printer()} driver **** Using ESS with windowing devices **** Java Graphics Device *** Imenu *** Toolbar *** TAGS *** Rdired *** Rutils *** Interaction with Org mode *** Support for Sweave in ESS and AUCTeX ** Bugs and Bug Reporting, Mailing Lists *** Bugs *** Reporting Bugs *** Mailing Lists *** Help with emacs ** Indices *** Key index *** Function index *** Variable and program index *** Concept Index ess/doc/lectures.txt0000664000175000017500000000203712423756516013075 0ustar eddeddDate: Sat, 11 Oct 2003 09:37:10 -0700 From: rossini@blindglobe.net (A.J. Rossini) Subject: More teaching/training materials. To: ESS HelpRUS Message-ID: <85d6d3vih5.fsf@blindglobe.net> Content-Type: text/plain; charset=us-ascii http://www.analytics.washington.edu/~rossini/courses/cph-statcomp/ Lecture/Labs 1 and 2 are on For ESS, ESS-Noweb-Sweave. Lecture/Lab 4 is on parallel computing with R (each Lecture/Lab was just under 2 hours). Comments/corrections welcome, they were used last week here in Copenhagen, so "most" of the bugs are out. best, -tony p.s. Lecture/Lab 3 needs to be completely redone for WWW work; it doesn't translate well (some might say, "at all"). -- rossini@u.washington.edu http://www.analytics.washington.edu/ Biomedical and Health Informatics University of Washington Biostatistics, SCHARP/HVTN Fred Hutchinson Cancer Research Center UW (Tu/Th/F): 206-616-7630 FAX=206-543-3461 | Voicemail is unreliable FHCRC (M/W): 206-667-7025 FAX=206-667-4812 | use Email ess/doc/images/0000775000175000017500000000000012423756516011751 5ustar eddeddess/doc/images/skyline.jpg0000664000175000017500000001144312423756516014134 0ustar eddedd ╪ рJFIFHH ■Created with GIMP █C  !"$"$ █C └╜└" ─ ─M  Qa!1ATUУ╤"qБСТФб▒╥#2BRS┴bв╙Ё5st▓с$%346VdrВ ─ ─<1!AQSaСТб╤с2qЁ"в┴тBcdБ▒ёCD ┌ ?¤ФИЛхz╩ЎEдС┴м`.q<А! Фы┘YИ1%}╬бт)дВФЩЦc[▓у*ТNdТvм _O`ОB╪b/y6┐БZ8z;#Ъ П▒сk■бm╚▒Q~Ёз№ ╡uўo∙╛лoEИ"}р O∙ j{╖№▀U╖в─>Ёз№ ╡=█■oЗк█╤cvg╜ЧZW1╬kДн╚ГСу["╓`╓╖Б╥шh╪┌╫╛рx*Яа√БЪW╕╛VєDDWК╜ъ╘Yы П2∙ {Z5Т╙└╗|KЦ70фE╗W╙Xрс╣bоШ╟ J&ТуmfЫKеДq┤ЄЦы?бЕ*-p\┐▐░ "{tZч ├▓5/ЧТЦ╕R╒;@ЬF├└¤e╜oЩИ6Zs4#HН█■┐╩ЗEо▓═f{Ў[щ╫ ┴ н{wТ╤╤┤╜XZЯ╗ў¤Чў*Пy/╟╤d╡■ЄZ:6Чл хSk░╥╙╛вжОКcnУ▐ЎЖ╡гY%~°¤└\╘яю_гдw6x·,ХКуП╖;дЩ╤┼B·╠ОZPRНт-\Ых`√~╗┘b∙╒c║3B╙cZ▐яюVьУx╕дwoвт╡i╥ z▀К┘VP═╙0█xsN`Кh╕о╗ўф├┬ё╘╟№┼кш√Ё№"DjоoХ╖╫┴TbX^'[ ┘▄,-┼i│}∙0╟0╝u1 17ф├┬ё╘╟№┼}пpюhU■ют|Т┤ДY╛№ШcШ^:Ш ШЫЄaОaxъc■bk▄;Ъ▌▄OТVРКт: Ok7 {'daхЕУ45└П!#▐жUЬr6V░▄ХL▒>Ш▐,F┬s╓╓╥╤5окЭРЗЪ]╩║ъВ;Х║JWф ▒▀Е├Ио╤ЖЧ№ЧщЭ╫╦┐╢ОРГ╥Э¤┤tДХЪTC%<яВVЦ╚╟╕Bв╛DD\8кcКJ ┤B╙╗√hщ=)▀█GHAщT·<+_WKL4NОFщ4щ╗х__n┐ЯEы╗хPМ#aРЎz)bj├№╖╒Z√√hщ=)▀█GHAщUOn┐ЯEы╗х^п┬fМ├йЯ▒▓╘ ВД ╪{=═X?А}umяэгд Їк╞$╡Zю╙ь╒P}5┘ЧBB]гS╛*сj╕[╞utпН╝Z\╛С└╝XЭб{б?∙ ─ Kг┤8Е#Ы!╥$e░їp+ъУкжиmЕН╫F─UVYН[$}(qН├╞ИЄхЯ┴h╘Х0U╙▓вЪV╦╞msyT>(├tўx╠╤h├XЛ&\╪ю╒I╡▄оxfф°%Н┴б▀[╧╢Г·ПzєX+*·9 зл╗р? ╖╖и∙vp[!ЗiТ├ ╠q· kTX╟э zй·}В'╣ФтQ0э╕╕ЖГф╤'╧▒kvЫХ%╥РT╥Iд▐'4¤жD,│ЎД░╧!г─PF_l·=FCь ╔cО╠▄F~Mjєд:|-╧з7╞уx▀ы╘╛·,#Пcg;m~6┘щ╓▒ф^Z╥ч┤fI╚pж▄╙╘@╔гбПAу1е %цФ╘5WЎ,.╢v^│UИSQ██╚|оU9╫zь_╠выBo]Л∙Ф]hR╡&!╔wbЗпЁ╬{{U)╫zь_╠выBo]Л∙Ф]hMIИr]╪Ъ  ч╖╡RС]wо┼№╩.┤&ї╪┐ЩE╓Д╘ШЗ%▌ЙпЁ╬{{VЙ╕¤!7°В┤uK▄К┼r├°zZ+Ь")L┼└WEъШ\nОО&A#└TЮ║:╫rlо'╕?┼Фl╫х GZ╛ЛX+бnP╬|p>ы ╫П╥лkX╫2ов│Nkщеы _kЪцЗ4В╥3rЕхU░%╫╗╙Ыl╬·╚Жqx█л═ЁЄ+4╥б|оЖ4╕х▒e*#0<╡█ЦТ╠nїюКйс╒пЪ╓zн∙У├л_5мї[є,ў╝╕W▐Y2}П█й▐Ь∙2№!КoШє-║╛ЮSLХMЬзё3Qўц#S└щ_0┤╓H^·З╗МeўN╠╕╜ФЦ<┴╢▄WCгP▒╖(*ZЫ2╩'a√f#╢:ВчЫ8╪ЎЁ>7kiф?В▀ьШЛs╝A]4я ╥ gлМxТ┬сп[O┐Н~Р\╖K}╥ВZЕ;*)х=П░эK╛+ГG\Н:2 Ь?_нКf О╔З╞ЬN═зЇ·▒UН╬ё▌*жIбKtcsТЯ>ыs5НЬc▐о+є╬ш8*сГ+г║█j%uu╞v╗)!w╦▄G╣_74▌. ╟q┤▀╪.G&G6Y2s╚?u╟Wф╘бa╪╙█/╪ы╞МГ#╣▐╛┴O┼p▀█░уе╠ooаэcj╥СiЦIF(╗╢╒BK52pD▌_╜цR╒P╤RIS;┤c`╠э╪6м╥╛жкїu╙╤.ТWh╟фБOбж#■цбVT└c>"╜ьЦщя.хдэЇцРЁф9|хitЁ┼O ЕБС▒бнР.,?kО╒@╪УеwН+ ╗КхWRj$╥▌╣uжз2█ўв"(кB"/А3<yEЯ▐k_y─╨├K#ДmС▒─цЭ╝.■╡%"x : Эд_ф╕├0Цфd ╛k╩╦7k┼7ь?s╖├h╕:ХТ┬ч<╪ь╚v_xймOЎМ■┘┤ З∙ЦkдТ╔ў╞т ╞╨ls Q╤XcЫc%hp▒╪E╞GКмoУН║q■╧╩ЫфуnЬ│┼ЄкТ/4╓u╝чwПЪї}SA╚gty+n∙8█зьё|й╛N6щ╟√<_*й"k:▐s╗╟═5M!Э╤фн╗фуnЬ│┼Єж∙8█зьё|кдЙмыy╬я4╒4ЖwGТЪ┐т╝C~зe=┌ч-L,vРfЛZ▄їф╨3єиPH ВA Д^ЇЁ╦<═Ж9Є<ф╓Б┬Tg╔,я╗╔sПеJО(iу╤cCZ8X·[r√╘╫▄GYRт·Ж одПЮ2G■╬рь╒∙W░/p▓ўr2uC╦┐∙рOЭXVr▓_k3ЬпйcЎq5ил╪│┘1<РKuЖgI-cгФ╖АЄjVPеЖ9Ыб#A╕SaЮXзЛOl| zl!∙U╛╨{zl!∙U╛╨{ї]UC╔oty)Ъуч┐╝я5B▐Ы~Uo┤─▐Ы~Uo┤┼}D╒T<ЦўGТkМCЮ■є╝╒ zl!∙U╛╨{zl!∙U╛╨{їUPЄ[▌Iо1{√╬єT!╣6>хYэ▒M╪p^▓╚%ваotOУ╞*─ЛдT4░╗J8┌PrЫлЭ║2╩ч─ ТИИе(h╣ъhhк^SIO3А╚:H├И╕WB"..Ї┌║2Лиobwж╒╤Ф]C{j"..Ї┌║2Лиobwж╒╤Ф]C{j"..Ї┌║2Лиobwж╒╤Ф]C{j"..Ї┌║2Лиobwж╒╤Ф]C{j"/XгdQ╢8╪╓1г&╡г └╜С ┘ess/doc/images/logoESS.gif0000664000175000017500000000627712423756516013767 0ustar eddeddGIF89a└╜ч  b b¤f ■g√k j√k∙p∙p&Їs-■t!ёw-ўv'єy7Ё}7ы=ЎБ;їВCщЕM°Г=цИMьЗH Г9чКU ЕBяКQыНQ МL РM∙ТYЇФXєФ_┌Ъs┘ЫyўЧa╪бГэЭnьЭt Ъ`щаu╒жЛ╙жС╧йТ аi№гpукЕ╠▒гЇк~їмА ┤╚╢л ╡Є╢7ЎнЗ√╖ё╢?·╢% ╢∙╢0ф╣Tї╕/┬║│ъ╕U╦╣п■╣х║\╪╗z°║'ы│Фю║Hў║2Ё╗B╥╝У∙╗3я╗Q┌╜|э╡Ц╟┐е├╛╝╛└╜╫╛И╞└м╝┴─■┤З─┴▓ ╜-ь┐S║┬╩ы┐Z└┬╛о┼╫Ё╛Z╖├╤░─▌ї┐F┤─╫л╞▐з╟ф┬─└д╔ыа╩Єй╔цЬ╦∙ў┬HШ╠ к╩ч─╟├Щ╬ Ю═√ ├Dї╜ЭЪ╧ ю┼s▒╠ф ╜Фщ╟sа╧¤╟╔╞є╟a ╛Ы■╟Fщ╚zф╚М∙└аж╨∙є╚iв╤ ╔╦╚╜═рї├б ╔P ╔W■├Ю╦╬╩е╘ ї┼йк╙№─╨▐я╚п▐╠┴╦╨╙░╒°м╓ ╧╤═я╩╖ ╚й╟╙сь╨Фо╪ ╫╤╨╤╙╨є╤Гы╤Ы│╪√■╤k╔╒у╙╒╥■╥rє╙Л╢█■╗█∙▌╫┬╫┘╒╣▐ ╥┌т╒┌▄┘█╪└р■√╒┬─р°ў┌Ю■╓╜ы▌╖■▄Нё▄╖°┘─├у ╫рш°▌жё▄╦▐р▄╪сщў▐н╚ф№я▌╥▀с▐ё▐╙ рЭсфррхш уж═щ ╫ч√ъфуфцу фо т╙╙ы¤цшхёш═┌ъ■№ч┬Ёщ╘ўщ┬шъч▄ь цыюЎъ╔·ч▄щыш ъ┐сэ№фэї№щ▐ыэъ■э└уя■їэцэяыыЁє ьсюЁэ¤эшхЄ °яш юуЁЄю■Є╤ыЇ№ўєф·є▐ЄЇЁїЇыєїЄэЎ ■ї┘¤Їэ·ЎчЇўє■ўт■ЎюЁ∙ Ў∙ї¤ўЎ¤∙ъ°·ўЎ√■ ∙°∙√°№√Єў¤ √¤· №√°■ № √■ №!■Created with GIMP,└╜@■  H░а┴Г*\╚░б├З#JЬH▒в┼Л3j▄╚▒г╟П CК∙РЮпNmкЙ┴▓е╦Ч0c╩ЬI╙х.Т8s"▄W│з╧Я@a.се│и╤]5iA┬┤й╙зPгJЭJIвF│j¤WюHL/∙4▐ ам┘│h╙к]╦╢н[ ░Zь╟Н▌╗xєъ▌╦╖п_╛d8 Д╟3З▄▐*^╠╕1\╣√▒∙{╫LпС╘╠шхrn!+1/%м╞@-БE[S┤7Щ23╬Db╗;FЁDt^aВMHd@┌ЗTkeэ Щm┬%ц)Ь,б.j?▄KN2^qуЭйOtЕ#жЭ░ч■eP╦ЪvПф\Зyb,aлаЁу╟╖aй!iь9_qЪ▐1O@╢╨{Єh`LHи▒ПE╧йх┴t№ Ф^^dHAKДBd[@иS~И(┼#╔СSу]dz╨=░╡└Пг═  аH└ЁА┌°СG Ў.Т╕ы._ C^еЫX-Р▌Y╪╖Лg Й╙ь╕=[бIИx╚оpН╨5д╔═Р:Л ы%8XЖ▒РЕeEj6■┼IГ№╥tо ЄFГfс ЯЪvЭZ┤Й;)фy*ж'd\GИo║бKlаCД -├]КcЩ8uB&<@G║Є▒5Ru╤н╝хНф░2/_├├╪D3Є╒╠┴╚ ,ЇТ╦ї═╠Ч│√ANtХ-dA┬yЩ┘КЖLЫ9 #∙Е^└Ё╠ф/QR5kАdб!∙f^└ЁtжF╖фд %BЛP┘єЮ°■Г ! c|Є#═╪Ю@╫64XИMhqz┬╤yPбе╠4 J╤КZЇв═иF7╩╤ОzЇг йHGJ╥ТЪЇд(MйJW╩╥Ц║Їе0НйLgJ╙Й┤Cв4ФшT'╣Ьъ╘rЗ█G|║░ЭBD-*P ╖Од*╒аяpъбМК8AH5PK-\>wU∙Pr^Ш °ч?Ъїмh`C Z&5¤>Ї╪B$ь ─ ,аАРeЬН╣дОбГШЇб#С(`5e╛=╔c 11В90▓К┐.6SН╘$ъzWК╚с▓╡╩мвОсVШ6"ў░,hЗ$ZИ03в░╜■K#╚T+Dv▓!╞j7╒ZИ<4╢%% ▒YШ╪╡!ўPьnYЫ╒З╪C3└Еиъ`╥Ц!ДX.s9ЄB╩─╨"√└G=▄!ОhЁ┬МрB■"Д╘ ╖U╚▄╥Аа °═п~ў╦▀■·ў┐ЦAs#тлт@+$° tєrЕ╡д╕/▒Б,┬Омх5 ЧКSЖzd├xс4b]Ш╪!!риАZ ЁК╕Ygб╚Й=ЪЩ0Ж╝7╛Q─,╧АаmМ┼Й┼HВV┬И`B&FH6аЦ░#\дL╣D2L╗МAfQFi_rтДР`┼-ОФГшсНшГG├Н╚■Нa"┘Дш8-=ОФ:оCЖь|фЦ╙┼╚СcТфГАГ╔iq▓в·"╫Ф$ЄЗв5вeя(ф╦ia▒в▓╫@5с╛l╞эA▐МЦ└`PotM╫┤gШЇ┘ nЄУїД>┐МaЧkj┤Й f=щг5ФБНЫ.НуГ@b╟fё┤ЮC8Х·%к@▒╘БU█╔YОУ2(ї#┤├╦к-ЛPqз▀■е├pj├LКPfБ№╬/░q\sЕД▓л@┴AН¤╝ь┤4╗N▌ї╦цIРw├√'E╚ЩBJРmHzN╨юK╠▄¤яQ┴!чюt║хbbf┴╬Бl╕|в`LЖАг▐h╣7Ь■╝¤ЯБRуЁ╣6%rВВo█MU╞K║yrФ кH─yїn А`Тh└#Й'░ С█уЮ- °║Gтy.└>9ЫD├▓{Е °ЭVБВDШт√ЬGУ┴└7╚ї▒М└Ї!a╛]:Y}ЬL╫vГў─I■Є AJ╞·П┤:c[a╚а~Хё╡GQ]░5|їb [╙╫~ЖsQW~Б╙u[ЄWQM╖Б ehPВ┼АqХВ*╕В,╪В.°В0Г28Г4XГ6xГ8ШГ:╕Г<╪Г>°Г@Д;ess/doc/images/ess_32_32.ico0000664000175000017500000000427612423756516014060 0ustar eddedd и( @b b k√MИцUКч┤ 7╢Є/╕їФ│ы─┴╝╩┬║╤├╖└─┬ы╔д∙╦Ь ╠Ш√═Юz╚щ№╙кЛ╙є■█╢┬╒√╖▌ын▐ў№ф╚жу хшцыяэ№Їы▐є·Єїєў·°°∙ °√∙№ ■""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!"""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ess/doc/images/ess_176_176.gif0000664000175000017500000000623312423756516014230 0ustar eddeddGIF89a░░ч  b b¤f ■g√k j√k∙p∙p&Їs-■t!ёw-ўv'єy7Ё}7ы=ЎБ;їВCщЕM°Г=цИMьЗH Г9чКU ЕBяКQыНQ МL РM∙ТYЇФXєФ_┌Ъs┘ЫyўЧa╪бГэЭnьЭt Ъ`щаu╒жЛ╙жС╧йТ аi№гpукЕ╠▒гЇк~їмА ┤╚╢л ╡Є╢7ЎнЗ√╖ё╢?·╢% ╢∙╢0ф╣Tї╕/┬║│ъ╕U╦╣п■╣х║\╪╗z°║'ы│Фю║Hў║2Ё╗B╥╝У∙╗3я╗Q┌╜|э╡Ц╟┐е├╛╝╛└╜╫╛И╞└м╝┴─■┤З─┴▓ ╜-ь┐S║┬╩ы┐Z└┬╛о┼╫Ё╛Z╖├╤░─▌ї┐F┤─╫л╞▐з╟ф┬─└д╔ыа╩Єй╔цЬ╦∙ў┬HШ╠ к╩ч─╟├Щ╬ Ю═√ ├Dї╜ЭЪ╧ ю┼s▒╠ф ╜Фщ╟sа╧¤╟╔╞є╟a ╛Ы■╟Fщ╚zф╚М∙└аж╨∙є╚iв╤ ╔╦╚╜═рї├б ╔P ╔W■├Ю╦╬╩е╘ ї┼йк╙№─╨▐я╚п▐╠┴╦╨╙░╒°м╓ ╧╤═я╩╖ ╚й╟╙сь╨Фо╪ ╫╤╨╤╙╨є╤Гы╤Ы│╪√■╤k╔╒у╙╒╥■╥rє╙Л╢█■╗█∙▌╫┬╫┘╒╣▐ ╥┌т╒┌▄┘█╪└р■√╒┬─р°ў┌Ю■╓╜ы▌╖■▄Нё▄╖°┘─├у ╫рш°▌жё▄╦▐р▄╪сщў▐н╚ф№я▌╥▀с▐ё▐╙ рЭсфррхш уж═щ ╫ч√ъфуфцу фо т╙╙ы¤цшхёш═┌ъ■№ч┬Ёщ╘ўщ┬шъч▄ь цыюЎъ╔·ч▄щыш ъ┐сэ№фэї№щ▐ыэъ■э└уя■їэцэяыыЁє ьсюЁэ¤эшхЄ °яш юуЁЄю■Є╤ыЇ№ўєф·є▐ЄЇЁїЇыєїЄэЎ ■ї┘¤Їэ·ЎчЇўє■ўт■ЎюЁ∙ Ў∙ї¤ўЎ¤∙ъ°·ўЎ√■ ∙°∙√°№√Єў¤ √¤· №√°■ № √■ №!■Created with GIMP,░░■  H░а┴Г*\╚░б├З#JЬH▒в┼Л3j▄╚▒г╟П CКI▓д╔У(Sк\╔▓е╦Ч0c╩ЬI│ж═Ы8sъ▄╔│з╧Я@Г J┤и╤гHУ*]╩┤й╙зPгJЭJ╡к╒лX│j▌╩!=_Э┌Tгм┘│h╙к]╦╢э┘]]╢╙ф╢о▌╗xЧЁК╦pY╝А╓╦Wс.┴И╗%\°р5┼Р#Ыe▄Шр╛*Т3'ж\Yрa═аsюМ'┤i╗гя;═║mъ┬ыZ╦N√Ъя╕┘╕╦╓О√.7ю▌q ·f ╝ласнЛsїЕЬ°▐╬є oоY9╫╧liA┬╜╗ўяр├■ЛOIФч╨z╔■фС1mЁу╦ЯO┐╛¤√°╡╔KOР▐Р╡A┬▀OхЁаб °:J°МВ>сгЗZ6╪";Дм`Б└З Ж(тИ$ЦhтЙ ▐1+6их╔G▄Ш0К4╓hгН а╘1:и╒GGСpуРDЩ#QхбЦ∙htЗЗEF)еЙG%╧jaFл@9хЧ`VY╘ZtП`ж∙еШEMBбЕ╔бцЬQ▓YФ+-жїтD╨щчНvuМБi¤╤=^■йhЙБ Д╠/РF*щдФVjщеШ^К═?I.┘фC╨,**г:t ижкъкм╢ъъл■░╛┌И5 ╘cEЦ[:D╠и╝Ж╪ш?¤Ёы░─K,Ь GЩ q╙ы│┐■єН▒╘Vk,ПфfZ6tПР╧Оэ?ЩXkю╣лЪёGAx║╪╨сК[jAЎШБю╜╓ЪQЗAГ·╚!ёК:ю?└╞'мЁ┬ ?!┼├R\┴]ДAF▒b╘iZL*4+:Ё?ИK╩E√рSП;тD├Л)МpFмR T╕*tК ДАB @-Ї╨DmЇ╤H╦0пAф\ЫH▌ФR╞лWрУ╨▓iсЁ BўL`тэ╜Ч▀╪dЧ=▀~ Эb, "сCК╜м^Б6B█вeГ, ▒s@■ЙxT?lkF/#Q╖к\Ь│Лj]ТP5 РH└"IMclVЛd∙к\И├P┐i┘С8Рh└+I5bь&$Б▓ъ┤2┤1ZДO 3К8└!H┼sэ6#┘│к╞8ts╬)▓И╘А╘й┼╞AТ┌йВ▒tBy0{╨,Р(┬=Fkl,#5Эj┤DД╔Zx#ФM$F└ОQ╙;╞▄ ХМ*·▒ВCу ЩGH─Аj┼u┼J─H`Ск1Иb"╩ ZDЧШuD▒GрИegИ L╓D╨б$О}ъ D╚]ИvWd+ Щ√И>RЕнК/-ZJИЄF╘╝вшПX■' Й■╠р╖Кd/k╦Hў╝>биуZК╔'Pе/МмO-э;8р7"∙ %k I<6┴Е+и!#■ BH@еtс@"q╪Q#T b┴ЭN( , TB┌Э╨ ) ГRоb▒ю'°└suР2A╤`▒╚<а-8HFBt╤╜}аЙ>)XЇДr┼┤d╤ [М▀№|╥ПлBq┼ ╥т╕5pD А╞O╠Gм1╕C(y ЭB·(в?·Б─RаPHшйДAКф]OЇ▒┴aup(СD▐A ▒╝У=qб cФOЮ┼ID)It╩ЮиоXA■J+╤вК╤9АDШеN|╖╔(EЧz<$A╪LaюМ┼b[QФС'┤бL╘З АКЭИПГs$J'╓┬tXЫ"@ vR?baо(m`K╪YrЄЁ;Бц░ЩР|╝уз@ кPЗJ╘вїи╥Д[ЇаРyЪХ6╤ф▒:ЙРVP48(Ю?*PЫиТX╥KИUпк(ь├c┐Q0sbKX}!}U%лfК└ ЖФ@гpжMИ лГiї cХkdl`ЙЖ\sD╪N ·*2HсБblfирЫ2з6моPЗ│FV▓СiB=тT╒│&Ыk╒▓`╨╕В2Qx■ЪC└ё╧╘&ў\╒ЮЁ╫╧╛61O8цCцб!└б3iiк╠ .$░┐ ╠ ▓0СрХг3щЗ#тVЪ║6║БB╢&r╪Ф*6& \U▓р╣Ж@╝v┴┴о╫╦Ъ│.Imч√Рў┬╫-HPГg)R┌yк)ЙGU┼▄┬Ўў┐wB║Б┌ru%¤ал╕ая*─┐╢xлт╣'БЮк└ЁДЎ>8─kё─PWОXwDшшIФЛ*╟┬" п p@ГБ Y┼h=┬ФЖHn0Й=№Р.)МW"┤hШЦ╖╠х.{∙ bPC!Da o Q■║*┼ лa╔jИ.╩"xC$┐`╒┴┤gИ░аDH°┌c)№╕╧ ▒АЙ"АрМшГ╩ ╛B┬nX·╥Ш╬┤ж7═щNw║лрКZрС)╛N ┬╩Bц'Г#ъT╒┴jФU│ЪN#ЁEН╟BV(╢╛╡Ъ@kЛ╘2n╨╡кЕ=зT"#щU╒─ █бЫ┘`·FЪбgх┌╪ЮТ р<W∙╫,┴Ж╓MОЙА;▄QТA╡%ТaюЪ∙$ж6Г\№Рw├{HpBк%втTiБ╜/!f╬( █Fа.ExМЖ▌╥▀йт║√¤p)Бр╩ЩrХ■Э█╛J!ююxСрДЛ+─╘Иы.L4Мк1dс▐ q╕╩Kx"y^■ТbиJ ЗИ╬w╬╝Lx"╖8L}Ч'dщL РFрэИ<║╩I_ 9 ▌у'рOщY7С$ SцяЁKж╤MTБa]┴:╝`АP =H2╣!btб?Б┬-Q▄3~h,∙ёРП|Ш╟\цКЁ┌╟,▒2┐▄ў∙╪СfД>·A·╥Ы■ЇиO=ъїaПxиГ╪@╞->AvW-╤╘├Чюйеё>s{ў└/╓╔уL╨р U6╟9_┤{№ц╖ щqО╢єзПЖкC(Р╘Я>╠tо Сg·wWP╜┐?¤+4╛3'┐ё═рy■P\¤└┐=╝ уў~@°PCфў╧■╟╤А8АXАxАША ╕А ╪А°АБ8БXБxБШБ╕Б╪Б°Б В"8В$XВ&xВ(ШВ;ess/doc/images/icons/0000775000175000017500000000000012423756516013064 5ustar eddeddess/doc/images/icons/icon_external.png0000664000175000017500000000034012423756516016421 0ustar eddeddЙPNG  IHDR╘║S PLTEp)A}╧╒ф╘╘╘7z   wГви~┼KtRNS@ц╪fbKGDИH pHYs  ЪЬtIME┌;%╦╘DIDAT╫c`└\\X\\B├DАthhhР#Р66VQ╙Fоб`Z%иЦ%╪╚BлЗАш g ╘ж]АА'╕ь ╕Г╛°IENDоB`Вess/doc/images/icons/icon_mailto.png0000664000175000017500000000060712423756516016072 0ustar eddeddЙPNG  IHDRJ╛УPLTEHР┴яЪ╔Ї°Z8№¤■·№■q▒ы■■ q▓ь╪ш∙Ёў¤ЁЎ№╫ш∙▌ы·тю·╦сў│││шё√─▐Ў╥х∙ўM"є°¤╥х°╟▀ў╪щ∙щё√╝┘їхЁ√ую√эЇ№юЎ¤∙v^рэ·┴▄Ў▄ы∙ьЇ№Ў·¤╬у°ў·¤цЁ√╟▀ЎЇ°¤хЁ№aaa```Ы╩Ї▓▓▓   q▓ы(zдFtRNS@ц╪fbKGDИH pHYs  ЪЬtIME┌3$│гуmIDAT╫c` шБААш0шщГЛЧ П.Ф╦╬*к,-╧мл ф0▓▒╚йє2Л0iГeYT╕%$T┼┴К9 8e8Е5┴\vVMY-%1~!)Р^]`a WGGG[Dhi Xы╧ВbёIENDоB`Вess/doc/ediff-sas.pdf0000664000175000017500000003127012423756516013043 0ustar eddedd%PDF-1.3 %╟ьПв 5 0 obj <> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЩъШ(шъYЕМННаJЇГ╠\Є╣БЪ. пendstream endobj 6 0 obj 56 endobj 9 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <> >> stream xЬэ▌√y█F╓Аqи╩╪к└VС*p╢Вp+╪╕ВP─й`╣|Vr*И]Aш "Vа1bx4Ч3gГ█р¤¤┴g`.AЄЁ` ]№∙чЯ═Wчєy╖█QжLЩ2e╩Ф)S^u∙в я^╜z╒а  Дw?~Ь{$(АЁа*╧┬╗█П_╢m╛]┴M(ч╒вLЩ2e╩Ф)Sж\║ьДwX3xўц■▀o▀╛∙ў┐▀╛|∙ъ|~||l~¤ї°█х╧/П ║║z∙ёЗўodFЛuШ;╓жLЩ2e╩Ф)пл№t╕i╘...ЮЮЮТ╢o~yh√z·їmR-Oxўt╕№6ьs╙<6═╦жy╤4зv═╣]┌┤├:№x:>╝>ш;иL▐ЭN'═Ц╟уёююо яТ╢ ;╝Kя┼3ўюЧ▌▒iv_╛|yx°tsєЎ╒л╦╟╟єххю_ ║mг╜Ч/█иЁr╖{▌n№хЧучП╧т┘Ш.╬╜8|Tn?╡╣PжLЩ2e╩Ф╫R~·їэч╧Я ·ып&жН╡·Ёоu{{┌Єссб▀╛яТzСц▐╜■ЁєээM█uO╗tт╒╒ЛЗЗя▐¤rss╒ОЁЄЄ╒┼!Юf4C║еЗw:]^MУZ▐ї╜t╗m:ц1╝√Щ╛¤Ї■┼х┼хЛW═╖╪ю|>Я■:}|є╦╧ч√╢Ё·╒ю▌╗¤хпкЭoЦ▐-уwe╩Ф)SжLy-хМЁо╦├╡1Щвї·х▀├╗п9B│3Ю│в╜xЎюхq є■║╣№сыФ╗┐#╝▀ ¤щё╙ч╙╙ы╫o^]╜·¤П▀O?■╫мbM04у╣~Йwб║█Вu BkХ-1╨k0${з я|╜Ш╔?│Э@xў<2╜∙Ї■э█╖▌│╟╟╟Пў┐╜█┐<№ўЇщ╟o?╜ Єх╦зЫ├▀█нeехB╗>┤ъC=oV/T┼: r/╩┴}·t °Я k╨╣ ^c-уkЎ.╡Ч╚▀╜√з|w█ЖД▀  К╗Н╣dэц■@Щ2e╩Ф)Sж<д∙╗wXЧgс╓ОЁа*ДwUЙЗw╓Я▌{xxш■Юrшп-k╕m║dw·/l┬Ў┘;Rp0¤0╞OЇАGGUк╟~╣√ч╢УцОMъи/1Kг яфЪС!Z╫▄ йге}х+wd╘╪╬;Шёк╜GгЪ╫АЕ ╝с]▐┬М.fнXИЬЁ╬║rЪqeM√▓yX▀xш+▀╜H┌7┌oяIГiсЭ╗╨М5Bw└├pcюО╗Г═єГ0p╟3fta╒ор╛ФцrкФ6ў╬·▓┤ж╟щ┐з╜_┤▐а'uЮ▐ywЯ6╛└╬[е°Ю& 8iЄ┴СB┴oЬ└KXШ╘ЕY]s"С╧TlhЎю6k╬╛rb╓ьсЭЬxKOjшf╢S$:╔яю╕~ГRп╡╣с`k Дw├у wсb├╗╨р5уШЩВ│М┴╚├Цфїе▄а°kmо"╝lD╔Ё.щ╩▌├╗╝kФBxwыЫ 7$╠;8╤]╕у╩гС║Gйп5с`#f╗╡┬|j~щЪ єтШ█└t7яBaGB▒HУ╗зV,╥°оZЭ уIЖ╡юЁвЭ┘qб}aбж !Zuў"ЇZPЩн№╫ ▓5рlс╢Вs░[ я6ВЁа*ДwUy▐]__?==]\\x///ч-@U╬чs4··№∙єn╖ы╖Ч╦WWW╧┬╗7o▐▌▐Фї°°(мэвп╙щ╘FkЪ╓З├▌▌┘;А┘h▓w]xзЩJw ■¤{▓w│╤gя4с]╗ ┘;Ф╘Э'sПА5Q╬╜{¤·ufx╖═ьAIALТР╜IALТd╧╜є■7жї═╜kў│+t√▄╝k▌Z¤Bєi_┼фm3┤Н╖5═ив{mYm┘\ы=bcю7╞щн└fхeя┌╪о+X▐╩▓wf╨рНэ╠╡r└!?═XWp╤П*'ЕZО)╘▓╗яMюС jДwшe╠╜ыc╗Оснiю]4╬╧ яBYо!c╬Xj┐e╟Ь=l╢)5{g┼vЭ>┬[SЎnоЁ.zqVи._∙Э+╝s╜Mx└x╢√wяъ╚▐╔k' яДэЗПY╙H├┼Y╛┘ЇЭ│ец▐╔u╜╒їУW O╦▐гаЯ{Ч4H═Ш5├&╢а╖ї┐{g▐jр S·╡╤║M°вdjlg>ї╞:Ъ╡ю)[О^V╢Zv/┐sCъАDЫ╬▐YъKН╖GS╢LъА$╩╣w╟у▒▌r╖█ї╡Bх╒╠╜s╒(T▐╒ўв06MЎ.tпg╚j▓w╤ЛХл3▐н▒e╢IУ╜kу┤ЫЫ¤уZ│w╨dяЪ─o5┘;А·Р╜и ┘;АкР╜и ┘;АкР╜и ┘;Ак,"{╖?█╟у~▀Чнз]Yxj╒▓ЁoI└v,%{'─gэ*sб√┤yЁ╣-▐АэXDЎо Дe▐UIO╢fA┘;┬;Ас6С╜ут,╪ОХeямЩvn┼PxGl6b┘╗■╛КОўюК~UЇ6[лRw`SЦТ╜й;░)Л╚▐аФ·│wЫBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dяАэy+мmOщ╔F@┘; с`∙╚▐ я╦GЎH@xX>▓wЩЎ╟cW8юўcў2j░BоQc,┬;└ЄС╜д ┐╞О╜Т║Ш`m╧║e╢йь┤р°SЫ*╛╫ў`"{Чщ°ъqeЁу╡╝╠~G╒Э╟e+║л▓{)8к▒ЫуHiv`]и┘╗LДwл@xWк)┬;XСнgя┌Шж+XСM╖╝_h>элШ╠ъ¤╞▐╞З┤<╫YWхz¤ЧлyХн▀╪№ъї.Їо╡.╪E[ёО┘ ╦B√"Wt√R╞¤ю╚G)╘{ ц Н*щ8ЗОк╡d╘#й▀г╘Ц5╕: аVЫ╬▐Щ∙*7we-СЯ║-7╧c)}SC▓hуэQФ№ m(┬Z╖ЕдиNшZ^%?═ы"┤}уDlEъfgM>rд#й▀г╘Ц5я╘j╗┘╗Б╤O4╝)╠uПвB▀╡╤8cH`С=кшЦЪК┘7(dяаPwрqЦ72╚дЛ│7А-█nЎОЁN▀oЇвa#ЖwB┼├;w`IбC┴╣hюu╥╨└Ц▐ 9Т╤№\v╦░edяВKяТш│wЄ┌i┬╗дpG▀l▐РЦР╜ыЧд╛ОeПdvHЪЗЛ│j╡▌ь]У2S═ЪKчnя>mtsяR[ЮkПвК╠═Є~▌&M▐RО╩Ы%╥rHЭўЦ]W?Hс8 яТОd╥.д╢мA■@нФ┘╗уёиlp5┘╗Nш>Swн7ъ╦▐@Jh<╗х╣ЎHf]Dє^┌╙мu├ e╦Ъы┬n4cоЄF▐║Єхци■ ЦQ╤к╖о▄мuЬ▌═ФW╪ЛIы┌┤Жf┤мAъ@┼4┘╗╨МаР╒dя╞Sх▀РЫFї Х%ярТ╟V▄жv└╓h▓wmЬvssг\SЎn$Дw┘к ╥]ь.v`АTЪь]Усm={'_Е%z∙╡&╫d╟╢йуAЎа*dякBЎа*dякBЎа*dякBЎа*dяк▓Иь▌■ы┤=юў}┘z┌ХЕзV-  \l╟R▓wB|╓о2║OЫчЯ█с╪ОEdяЪ@Xц]ХЇ`kФ╜#╝n┘;.╬АэXYЎ╬ЪiчV Еw─v`#С╜ыялшxяошWEo│╡Z u6e)┘╗ёР║Ы▓ИьJй?{░)dякBЎа*dякв╔▐ЭNз6 ▄эv▌B╣|uuEЎ`6Ъь]▐╡╤Ъж╡├сpwwGЎ`6╩ь]н╔┌mьЁОь└ФЇ┘╗╠ЁОь└Ф╚▐TЕь@UR│w╖╖╖юf]Бь└╠2▓wVД╫╟v ┘;А┘х═╜ы#<3╢k╚▐╠.{ю]сY▒]CЎ`v▄9 PюЬи ┘;АкР╜иК2{w<Ып▒рn╖ыVЕ╩dяцд╔▐╡хд6ЯЕwзыЫЖ Ащ< я╛\▀Ь>ЭЫ▌ющ|╛╪э┌xТ2e╩Ф)SжLЩЄ║╩vЎю╦ЯчyуM agя■№┤а╪sтЄс·тЁ╟╙r╞CЩ2e╩Ф)SжЬS^oЎюp}y°C║┘dЪЛcэШ ~tЖ▌-ўо┬JЕ^ыe╥М6у╫Я╪╤╞їu═х┘Н╧nтПпщ?aЖў╕┤OEy>╬ЯvЩ╢╨x┌╡▀▄╙у╣╗╣Ьы8фХ╗уує▌═хd╟Нrш▄■■> °╪Я█┘пЛЄ№4▀5цy2═∙╨ЯУэ■■ЄёQ╪Ч╘ё╕ЯB√·║n;╓q6_╟N╖¤╝╟┘:ццїК╗O└ъюc┐▄=п╠╧aяq╢Оз╛о┘oj]╣▀╘s`Ў╧яk7ЎўСun╕п{Ї╜Р¤L[█K▀Чў№4▀┐ц{pМуц}Нв¤ уO-чgяц═ ╕┐Qм%S■ИY]Oxэ╓ХьйUЇЇ╪Ъ░eу№╩Ь°dzьVеi╚'CR]¤ЗТuЬчz╙е~КЪOхSE╕>═9╔╫ф6S√╒Xц╟{Їm2eзCNд▓C2OА╘O╤▓╟-щS7Ї)1p<Щsя·╕RЯЦ¤эв∙}цН╙▌▀═б╝ЕўwбЁ;{iєЎм╠БЫ'░╓║п]ЇXYuC9'¤яwlB.─=■B▌х╝.·▀г╓√лx>Cш7ЪгЄЎk-▐S╩}O·╠╤ ЖхЬ╝mFы╩9∙wywl▌c>ё9ж▀_9г9Vб╫NєїчХ№┘Ы╘яЁМ■╗гH]∙|√√HЯO╩87F:Зїу/°L:■б╧╪9у╝ьЭ`О¤c4╘й№s┴Тжe╦r▌YDs╤ь]┐Vn*╘rи·Р1ы7о щ╛┐ф<КЁ#5щh╕щ▒ь~╜ш╟ ,Т╜є ∙эа▄гд%є8че$ЗУЬё)з┘}·G?░!¤jcn┬▀)╤wJv]═Нt:)ЫщУ!{<Є╞╓wV¤Ы·√Т@Ш$Ї;|`∙sяB┐е▓╦▀╠∙w|й▀Э╤▀C╤¤ ¤vwў╚╩)jЎ7їwГ█ОХЯ╨╧╜ы╢4є1Єя я6╩▀a▀BьwП5■д║л(╗yє|О╬)Сч┴$╜пї¤Z█dчвя═М╧Ь╝\жЄsC┐▄╩┼Ж^▀)╧1wгЯ╜┬{-:OT3ў╬[Ws╜(п▀╘s@sn ЩЛж| ╩япС╛ПвяЭ╨чЇ┌Zи▀шШ5яeс√NИЖ+ў8(є╓ц{P>╧5╟*'{g╞д▀╞▒а▀ЭOЕЕц┌F ┤Т.╥ф'в┘;яЦюы■╜VЙ╠Щ╒╛wB╚uWG╬юx_}R-┌п;}╦├'ОЮ-)ЭМ╤lЬЪJ ЭЦ╤ьь2▓wЪФэ'╡ЬЇъщW▀аwР┘Йm¤╗;:*═┌l▀кй[OЎ6eGхm*5ё▀ √2эф╠╜щ:z┴▀ў┬яц╝▀C╤Ь─rц▐ ╠▒ y>хoаш6I╣Ц╝ё├╝eynVЇ▐╥╘▀▄▐║╩yx·9RI√о №Ij┐°╝╜R╦Щ{7K┐C╬б▀шыЫT7Ї9?√▄;}N}╩╣w┘╟a╘╣wЪkГ▐эл╘ьЭ2s60ъ,2ЖR┘╗сЩ┐ЙEsu┬╠╣ожйF|щCш√ug$дОa∙фь]╙$Ь▐IG#·FV╬ ╥ўC╞йхdЎРў╛>█╖┤ь]шi°▄Ио╩uгэ щW#я{бT2/4АEeяю`┴!щG5ъ{0{TЪэї╥ц▐yяНцZ╞° Э[р╜Ою╜зOy=[╕pБўN╛╧4tм╠Z]▐H▐╞o═▒ щw°wН№╜р=WУъЖ╬█ь√C│єdю╣╤ПM9oO~ХЫr▐Ю√ЩS6▀iУМ~З╟Qk¤пK╦Ц-g0а▒РФс┬√]ц╟{F╬[│т 9╗РЬY┴{З)SжLy╩Є─s■ж╧SFs╖ єРёЁ}D∙{yе┘;xe■▌;╩Ф)SжLЩ2e╩╦,? я▐▀nvM╙чя(SжLЩ2e╩Ф)пн№,╝╗╛╛~zz║╕╕Ё>^^·яЭ@Ює∙Н╛>■╝█э·эхЄ╒╒╒│Ёю═Ы7BўДwe=>J7;w╤╫щtjг5MkЗ├сююОь└l4┘╗.╝ыв5┘¤¤¤√ўя╔▐╠FЯ╜╙Дwэ6dяPRwЮ╠= ╓D9ўюїы╫Щс▌6│w%q0HBЎnD$q0HТ=ўюЎЎЎсс┴jm}sя┌¤ь ▌>wяZ╖V┐╨|┌W1y█ mуmM3кшE[ЦE[6╫zПX╞Ш√ Дqzл░Yy┘╗6╢ы VД╖▓ьЭ4xc;sнp╚O3╓▄FЇг ┼IбЦгC ╡ью{У{$CБсzsя·╪оcFxkЪ{Н3Ж─s├├╗PЦk╚Ш│Ц┌o┘1gАmJ═▐Y▒]зПЁ╓Ф╜Ы+╝Л^Ьк╦W~ч я▄БE/F▐0Юэ■▌╗:▓wЄ┌╔┬;a√сc╓4╥pqАo6}чlй╣wr]ou¤└фU┬╙▓ў(шч▐% R3f═░Йэшm¤я▐Щ╖x├Ф~m┤n╛(Щ█ЩO╜▒Оfн╗G╩ЦгЧХнЦ▌╦п╟▄Р║ ╤ж│wЦ·Т@уэ╤Ф-У║ Йrю▌ёxl╖▄эv}нPy5sя\ї Дwї╜(МMУ╜ ▌ы▓Ъь]ЇbхъМ╖GklАm╥dя┌8эццF ╕╓ь@4┘╗&1┬[MЎа>dякBЎа*dякBЎа*dякBЎа*Л╚▐эП╟Ўё╕▀ўeыiWЮZ╡,№[R░K╔▐ ёY╗╩\ш>mЮ|n Дw`;С╜kaЩwU╥SАнYPЎОЁ`╕Mdя╕8 ╢ce┘;kжЭ[1▐█АНXDЎо┐пву╜╗в_╜═╓jБ╘╪Феdя╞Cъl╩"▓w(е■ь└жР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘╗L√у▒+ў√▒{╡Л ┤чТ∙┤=пц K@ЎnР6№;ЎJъbВё,MwжNYАЕ#{7с▌ья░╠Я╜ып?Ж.wЪ(╜█╚╫I√╡}/I╤ТY╤;╢╨h√U!Ч╒п╖Л~wб╗Vо█8╫7{}╘m╨=э76├#яBяZ│)M╦!▐1[═mмхКю╪XЛEdям╚Ih╝ёК\╤ Х┴Ц╒r┤w╖7╘▐п╗G┬Sy┤йqз{ЩЩ07+fнu[HКъДохUЄ╙P yг`Fєgя]X╩╠ З\йМI│0#Бзь7┤v╘+╣бx(╧ kхЦЗМ*║%g╡ZJЎОЁN┘п{6){к╜8█ИсЭPq╞Ё╬с` ╚▐∙-3╝╦>PЪ║Q·ьЭ╝vЪЁ.┌ g╡ZJЎоЙ═╜╙D-ЪКyС╓>qю]vx'ўы═ф)зтEыFЩхЪ{'ИnХh]w НШ╜є╢CЖ░F ╩▐э┼;g{┬▌а╤;gC█Дьw░║W9▀╜╜{чЛ╝~Ы└▓▐ЦўБ{c5u╤?ь╜G╒]█Я[й-kо ╦╖═z#╝╝~X▓еdя▓пвNfГ\Е╡д─╓2N, ╩▐M▒╗мbРл@╪└иц╧▐╔ЧVg4фк.L╤╦пааEdяP╩╠┘╗/^Д·&┼Рс|~Ь3{╫Жw▐0ютВЁ ╟уу_┬┌)▓wДwС╜fЁ█Ы?■єщzюQъDЎоАЎл║}╘[w█'U╔ыиxS¤╚;ы PТv┐рa7█\я╤,┘╗22╛нє╛р ЖйMew╜╠P&iT╦▄╝╚▐ХAx7F┼Q▐j╡╤ь]╣н ┌Ў~╦WQ═╡nїш╪!сЭ╨x╞Ш▌*╓ыЪм╖}s╖бв└[=╗w└·#й|}5чU┤GyTцf╛=`├┘;ыл╘¤ 7Яz┐дн F_W^о╢╖Сь1╦G, Cо8кшиїСl╘пoЇ╝Є╓RО*4L═▐5╞з7╤НН▓╫╩ ї├v$oT╤РT?рЕДwЦшиКI∙╝zWА(MЎюt:uO╧чєn╖У╦WWWл╔▐Н▐╣▌╒▐╣╗\$Fxq6uTДwА:h▓wmx╫FkЪ╓З├▌▌┘;╒WЄ╥┬╗~Iъ╒фд└q2гZKx╟┼YАLЩ╜ыг5Y╗Н▐н4{╫$~г7bfиь┼┘fД╣wц├╗╝гQЬfT═8sя&яИэ}Ў.3╝[fЎю╖ч7EZяf╩F▄╡┬rя╤a з▄Э│юfB╪! ╪┌Y¤╤Х0к╘#й<7вчХ№ъ[m ]▐█═▐┴Л╠╨┬ёв6Ъ╜ГбШ?{jЛЁn2ЄЕW░.3gя./Гс2╠Ь╜ы -К8Я╧єfяяJz||╓Т╜X▓wU!{З╩╡gЪ∙Їй─-┘c┤йь┤р°SЫ*╛╫ў`"{Чщ°ъqeЁу╡╝╠~G╒Э╟e+║л▓{)8к▒ЫуHiv`]и┘╗LДwл@xWк)┬;XСнgя┌Шж+XСM╖╝_h>элШ╠ъ¤╞▐╞З┤<╫YWхz¤ЧлyХн▀╪№ъї.Їо╡.╪E[ёО┘ ╦B√"Wt√R╞¤ю╚G)╘{ ц Н*щ8ЗОк╡d╘#й▀г╘Ц5╕: аVЫ╬▐Щ∙*7we-СЯ║-7╧c)}SC▓hуэQФ№ m(┬Z╖ЕдиNшZ^%?═ы"┤}уDlEъfgM>rд#й▀г╘Ц5я╘j╗┘╗Б╤O4╝)╠uПвB▀╡╤8cH`С=кшЦЪК┘7(dяаPwрqЦ72╚дЛ│7А-█nЎОЁN▀oЇвa#ЖwB┼├;w`IбC┴╣hюu╥╨└Ц▐ 9Т╤№\v╦░edяВKяТш│wЄ┌i┬╗дpG▀l▐РЦР╜ыЧд╛ОeПdvHЪЗЛ│jе╠▐П╟цk,╕█э║UбЄj▓wM╩L5k.Э╗╜√┤╤═╜Kmyо=К*27╦√uЫ4yK9*oЦH?╚!ht▐[v]¤ Еу<0╝K:ТI╗Р┌▓∙?╡╥dяBЧМB╓С╜ыДю3u╫zуб╛ь дД╞│[ЮkПd╓)т╜┤зYыЖ╩Ц5╫Е▌h╞\хН╝uх╦═Q¤,гв9To]╣Yы8╗Ы)п░?Т╓╡i+ ═hYГ╘АКi▓w═╫ло777╩╟╒dя╞Sх▀РЫFї Х%ярТ╟V▄жv└╓h▓wI▒]√╕жь▌Hя▓U е╗╪\ь└й╚▐Х'_Е%z∙╡&╫d╟╢йуAЎа*dякBЎа*dякBЎа*dякBЎа*dяк▓Иь▌■xlП√}_╢ЮveсйU╦┬?Ч█▒ФьЭЯ╡л╠Ею╙цy└ч╢@x╢c┘╗&ЦyW%=╪ЪeяяЖ█DЎОЛ│`;VЦ╜│f┌╣Cс▒╪ИEdя·√*:▐╗+·U╤█lнH▌АMYJЎn<дю└ж,"{АRъ╧▐l ┘;АкР╜и ┘;Акh▓wз╙йНw╗]╖P._]]С╜ШН&{╫Жwm┤жiэp8▄▌▌С╜ШН2{╫Gk▓v;╝#{0%}Ў.3╝#{0%▓wU!{PХ╘ь▌ээн╗┘├├CW {0│МьЭсї▒]CЎ`vysя·╧Мэ▓w│╦Ю{╫FxVl╫Р╜Шw╬TЕ;gкBЎа*dякв╠▐П╟цk,╕█э║Uб2┘;А9i▓wm9й═gс▌щ·fДa`:╧┬╗/╫7~:_ьvm$┘ьvOg╩Ф)SжLЩ2e╩k+[┘╗/ЮчН70ДЭ╜;}Ъ;▐\j∙p}q°уi9убLЩ2e╩Ф)SЎЦл═▐о/H╖вL╙`ёaМкэ?Е╪Ш╗-▌═·4Н`vб╫qЩ4г═x╟ 9iCu═х┘Н╧nтП/¤ч╧rzЬ~╠2y+╧Oє]cЮ╙╝П·єн▌_с╝║√vЎ∙м╨Я╖B]╖ы8Ыпcз█~▐уlsєsр╬∙фw▀у¤6эrў╝2?З╜╟┘:Ю·║f┐йuх~S╧Б┘?╝п▌╪▀G╓╣с╛юЪўВўЬ);╢ЎШШп╫Рў~Сs├√y╒┐v╞УС╜│т═&и▄!═8цAС▀ ы╩ нNЇЇ╪Ъ░eуфиж ╡ъ▒[Х:д!Я IuїJ╓qЮы▌Ф·)j>ХO!ў═p╚╫ ф6S√╒Xц╟{Їm2eз·╧л▒п╣╣ямё>═внЕ>п╠╧ББу╔Щ{Нy3~C,k~ЯY┐│Ыoq¤?╟ў∙яЮ╨ЄFЭ\╬╝=sД▐¤║є 7П╥ ¤╢хЎмМEш8[э[у┤О╣r┐4╟─╗_ycїuьу ┐єц3Д~г9*o┐╓Є╘╫(Ъ{pПIvО╩ЫsЄ╢н+ Оws▌6цqvП∙4Я▐}СўW■^╨л╨kзyН·єJ■ьMъ7у№Q~зД>╟╓UцНF·>╥ч▐Bчs┘є<·Zы▀┐▀│╤╝ЭЁyе╝Ж-ПТ╜Ы7y║Ш- юl┬A╜░0┌▓\w╓ф oк ┤╓jD°Б(мїnSъiъTШдLI╥и╞у■╝Ує(┬Oчд1╗?7│√їnаГ░|HЎ╬{4ДCд▀гд%є8че$ЗУЬё)з┘ЕьдО0░!¤jcntЙвшhR]═Нt:)ЫЭ,│и?mКў▐┐m┐/IO╤е~Ч╣r■юЭЬ╧k╗у│rlЎ■Л┐уK¤юМ╞у┬oG∙╖{С¤═;╬ю▄D37f═√ хсЖ╠╜│╢СчРYc6ы║}╔c ¤ЎЎ;d╠уХ▌╝Оy> ╣ я╣ЭёЫ█╩3i·╒№f═■▌/╠зI:Rєd╩╣;╩хV.6Ї·NyОy╧∙│W°^И╛_4sяBЯ╤\H^┐┘yЪБє2│ыz┐яж∙>К╛wв▀ ┬|Mo┐╤1G╟#_╙╦ы╫√·МЄцЫЕє<щ5кpю]^Ўn`.ЪїY╬!ЄNЛщЧ(3Ry┘;є╫╠?KЬaлДtЭ░qФ╨яР1ПG╬ю╕nЪ`&└╗Dю╫Г╛хьЫX4Л6KЎ.i∙РQНЄwяJ▌ўQ0v~z~▌┌═]5▒√4Яэ▓s ^╕piўN╕7╓Ъ[у╬Yё^√ЧПХ╖}ў╛░шy%▀ыоU▐ 8д▀ дp Ч╗_┬{б╦ y╖q▀S▐c.№m3бЭ╘▀гю╩юШ5ўtkЎ+Ї~Й~&═ыrg0╦╟YєНwОЕ▐√n╬)t<▌╡I╟J■╝Т?╧│√■]#/x╧╒д║бєVsнй°wКў¤u▀ ┬~ Ы0╖пь√KюWєyU ОкЄ┐V,-[╢Ь┴4&ЩцR¤XH╩pс¤.эу╜УС3F}к¤Я│ ╔Щ ∙]8RyЎ▄ъ╟╝сfPж\т│b╩ў╤Їy╩hюvБc2Ю~Qп\gЎ!╓=;╒№Млu┐╚Рєwя(SжLЩ2e╩Ф)/╖lЖwяя? їэЪж╧тQжLЩ2e╩Ф)S^O∙Yxw}}¤ЇЇtqqс}╝╝Ї▀А<чє9}ЭN'}ГWWW╧┬╗7o▐[▐Фї°(═я├╗6Z╙┤v8ююю╚▐╠FЩ╜ыг5Y╗Н▐С╜ШТ>{Ч▐С╜ШRvЎюЎЎЎсс┴jНь└╠Є▓wml╫мПь└╠Ш{PeЎюx<6_c┴▌n╫н Х╔▐╠IУ╜k╦ImТ╜ШН2{з╔█ue√╧У╜ШТ~юЭж5╧Я5&{0%■ю@UЄюЬM°├(dяжФЭ╜╙■Yc▓wSтя▐TЕ╣wUQfя║?kмAЎ`NЪь▌а?k А╡#╝и╩▀сЭ■j..эR.ю 5зg] endstream endobj 8 0 obj 11979 endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000384 00000 n 0000012650 00000 n 0000000325 00000 n 0000000188 00000 n 0000000015 00000 n 0000000141 00000 n 0000000432 00000 n 0000012629 00000 n 0000000159 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 12705 %%EOF ess/doc/TODO0000664000175000017500000014146412423756516011206 0ustar eddedd -*- indented-text -*- $Revision: 4.13 $ The original TODO list (nothing fixed there yet): =========================================================== The following things need to be fixed. In a very rough order of priority. * (DS) M-RET in *S* doesn't work properly with multi-line inputs. * (DS) Typing C-c C-d in an S-mode buffer can read the wrong file (apparently the wrong value of S-directory is used.) * (DS) Maybe S-eval-region should do S-view-at-bottom, too * (DS) It would be nice to interpret a nil value of S-directory as the default directory. * (DS) Add a predicate to control when S-object-list is dumped. It would be nice to dump this only if an assignment has taken place or the search list has changed. * (DS) C-u -1 C-c C-x C-c C-o produces odd results * (DS) Automate inferior-S-send-input to delay sending to the S process until a complete command has been typed. (I.e. when presented with an incomplete command, RET behaves like LFD). If this is done, multi-line commands will always get into the history as one entry. * (DS) The menus need finetuning, and a binding to a keyboard key. * (DS) Need to decide on a sensible policy on csh-like history references. At the moment, expanding such references is only possible from the menu. * (DS) Need a keystroke to kill an edit buffer *and* the associated file. * (DS) Need a function to copy an object to a new object *and* copy it's source file to a new source file, modifying the target of the assignment. * (DS) Debugging support, through trace() and tprint() * (DS) Modify S-beginning-of-function so that, with arg n, will move out n layers of nested functions. Wiht C-u arg, move to outermost function definition * (DS) Rewrite the S-command and S-eval-visibly functions to use transaction queues (so that we can really have S running in the background) This is a big job. ============================================================= Here is the new set (a start for S-mode 5.0). NOTE: Not all of these are clean OR are even consistent. -------------------------------------------- * (KH) Fix indentation for "{" in the GNU style... Kurt> * What I also find frustrating is that the GNU style does Kurt> not get the indentation of `{' in: Kurt> fun <- function(x, y, z) { Kurt> right (in fact, the results of hitting TAB on the second Kurt> line seem to vary). But it is not important. * (KH) It may be worth while replacing ("^[>+]" . font-lock-keyword-face) in R-inf-font-lock-keywords by ("^[RS]?[>+]" . font-lock-keyword-face) (or perhaps something even better assuming the coexistence of processes called R, S, S on a system with the corresponding prompts. (MM) Yes, add "S4" to this list to get something like ("^[RS]?[1-9.]?[>+]" . font-lock-keyword-face) is not quite correct, since it includes ".3>" buth should rather "R0.50>". * (KH) In R at least, asking for deletion of a file after loading it with C-c C-l does not make sense. (MM) Yes! -- this has been a real pain, especially when the file was version-controlled, it sometimes has just been deleted w/o asking ! * (KH) Also, there is no support for an Emacs-specific startup file. This is not really important right now, I think, but anything based on comint and term should support that. (Tony, if you look at my R-inf.el, you'll notice that some effort goes into doing the right thing with output from startup args and files.) * (KH) The function S-complete-object-name() in S-inf.el currently returns (or (comint-dynamic-simple-complete pattern components) 'none) with the comment `always return a non-nil value to prevent history expansions'. Do you have an idea what that means? Is there any good reason to break the Emacs/Comint convention that a completer should return a non-nil value only if it did successfully complete? The specific reason why I ask is the following: S-inf does (setq comint-dynamic-complete-functions '(S-complete-filename S-complete-object-name comint-replace-by-expanded-history)) I don't care about the last and prefer (setq comint-dynamic-complete-functions '(S-complete-object-name comint-dynamic-complete-filename)) Note the reversed order of filename and object name completions. I think it makes more sense that way, because if I have the file `anthony.dat' in my current dir and do anthony <- read.table("anthony.dat") then typing `ant TAB' at the R prompt should complete to `anthony' as an object name, as I can always force the filename in the current dir by `./ant TAB'. However, as S-complete-object-name() always returns a non-nil value, the comint file name completion simply does not happen (well ... that's at least what I think is the case ... but then also, what is the point to have comint-replace-by-expanded-history() in the list of completers, when it definitely will never be called ... hmmm.) Please let me know what you think. My suggestion would be to simply change the last 2 lines of the code for S-complete-object-name() to (comint-dynamic-simple-complete pattern components)))) and set comint-dynamic-complete-functions as I do :-) Well ... what I said was not quite right, as S-complete-object-name also tries to do something about `./ant RET'. In any case, please let me know what you think. * (AJR) Need an AUTOCONF for configuring Makefile, etc... * (AJR) Move S-extras into the mainstream distribution files and as an S-site example. * (KH) So, need a "create-debian" entry in the Makefile. * (KH) MINOR REMARK: Currently, we have American and English spelling together. If we want to change this, please add it to the TODO list. * (KH) MINOR REMARK: Some of the doc strings are not o.k. (first sentence longer than one line ). We eventually need to fix this, but perhaps not for 4.9. * (KH) Btw, why not have `M-x vista' too? * (KH) MAJOR REMARK I: The code for getting the `right' history file does not work. E.g., when I start R and XLS in the same directory, they both use .Rhistory. For a possible solution, see the novel below. * (KH) MAJOR REMARK II: The code (condition-case () (load S-object-name-db-file) (error (message "%s does not exist. Consider running S-create-object-name-db." S-object-name-db-file) (ding) (sit-for 1))) in S.el causes several problems. First, it produces an error in the byte-compilation process. I noticed that you put an empty S-namedb.el in the distribution, but that does not help if `nil' is not in the default load path (because then the current directory is not searched), which I think is the default. Second, there should obviously be different namedb for R and S. (What I really mean is that the setting of S-object-name-db must be a function of the implementation [have we officially decided on using `dialect'?] used. Hence, the right thing most likely is to execute the code not when loading S.el, but when it is clear which process is started (assuming we have different namedb's for each dialect). This could probably be as late as before inferior-S-mode-hook, but I am not sure. (Note: currently this is not a problem for me, because I only have R, but what does Martin do?) * (KH) NOVEL: So I spent several hours yesterday trying to figure out the right way of solving our problems with local variables, in particular because Martin explicitly asked me to do (only to find that the next morning Tony had already done something about it ...). I think it is important to distinguish two kinds of variables that need to be taken care of. ** One group is those variables which need to be known when the inferior process is started (i.e., before the process and hence also its buffer exist). Such variables are *) dialect (currently transmitted through S-proc-prefix) *) program name (`R' might be on the load path) *) program args (such as for `-v 10' for R) *) program startup file (currently unused) *) program history file (???) ** The other group consists of those which are not needed for startup, but need to have the right buffer-local values in the interaction buffer, such as inferior-S-help-command inferior-S-objects-command etc. The problem we have is that there is NO WAY of passing non-global values to buffer-local variables in Emacs. Something like (defun R () (let ((inferior-S-var value)) (inferior-S))) does not set inferior-S-var to value in the interaction buffer if it is local there. (Sort of static scoping.) There are several possible solutions: ** Keep manipulating the global name space using setq-default, as b4 did. Of course, this is terrible, because it overrides defaults. ** Have one function which does something like (cond ((eq S-dialect "R") (setq ...)) ((eq S-dialect "S4") (setq ...)) (t (ERROR))) after calling make-local-variable() on the relevant variables, and wrap the code into a function. To add a dialect, users would need to to this in there inferior-S-mode hook, or to advise/change this function. ** Have a list similar to S-style-alist with settings for the variables, and a function which sets them. This is similar to the above, but keeps the code for the function and the variables separate. ** Have a dialect specific hook, e.g. inferior-S--mode-hook ** Keep manupulating a non-dialect-specific hook in the global name space. This is what we currently do, and not `optimal' for the same reason that using setq-default was not: If we think of inferior-S as user function and S and R as simple wrappers, then calling these should not modify the behavior of the generic function. I think the KEY to a clean solution lies in the observation that there is really only ONE variable needed in both steps (i.e., cranking up the process and setting local variables in the interaction buffer), and that is the information about the CURRENT DIALECT (which I think is currently kept in `S-proc-prefix'. We need to ensure that this variable has the right local value to be able to run a specific hook (or a simpler hook as explained above), and that it starts the right process in the right buffer etc. To get that, we could either create a global variable, KEEP IT GLOBAL, use let() in the wrappers, and assign to a local variable afterwards, or (and I think this is the right thing to do) PASS THE DIALECT INFORMATION AS AN ARGUMENT. I.e., we would have (defun inferior-S (&optional dialect n) ... [NOTE: I am not sure about the optional `n', and whether this is used. I think that users might want to have (defun R (&optional n) ...) (defun S (&optional n) ...) and we are safe to give inferior-S the interface we want because it is a NEW function anyway. We could also have it prompt for all relevant variables if given a prefix ...] and have (defun R (&optional n) (interactive) (inferior-S "R" n)) Now the function inferior-S has the information it needs. It can figure out the `right' startup settings (history file, program name and args) based on the dialect information in the generic pre-run hook and perhaps a dialect-specific pre-run-hook, and PASS THE DIALECT INFORMATION ON to the function S-multi() [or whatever it will be called]. I.e., it could be (defun S-multi (name &optional buffer dialect) ...) S-multi can now do (make-local-variable 'S-dialect) (setq S-dialect (or dialect S-default-dialect)) and go on with the buffer-specific settings, again using the dialect information as described above. [Yes, there should be a default dialect which is used when inferior-S is used directly. Perhaps naming would be better with global S-dialect and inferior-S-dialect as the local one ...] * (MM) My WISH: I'm using ess-eval-region and friends very often. If the region has leading TAB, I think the readline feature of R, does a huge 'completion ...' which can completely destray the whole evaluation. ((Try C-c C-f from within a function that has a bit of indentation, and therefore leading TABS (unless you 'untabified' it). )) Yes, I'll have to 'untabify' things before I send it to *R*, but it's a pain, anyway. One could do 'untabify' in ess-eval-region & ess-eval-visibly in ess-inf.el. But actually this is not quite correct, since I may have real TABs in a string nchar(" ") #-> 1 because it has one TAB which should not be converted to spaces. Hence my wish: Write a function 'untabify-leading-white-space' and apply it to the regions in ess-eval-region and ..-visibly. * (RMH) 5. ess-s3-d.el 63 ;;(if (string= ess-version-running "S3") This comment seems inconsistent with ess-version-running. I think it should be ;;(if (string= ess-version-running "S+3") 7. ess-object-name-db-file ess.el line 775. Why is this EVIL? A nuisance I understand, but EVIL? Does the database get built automatically when ess-mode is installed? That would be the right thing to do. Then individual users wouldn't need to know about it all. 10 ess.el lines 254-270 This is one of the things I put in my site-start.el. I think this is too complicated. I think that when item 2 of this note is corrected (that is run the ess-pre-run-hook before the things that depend on it) then the nil value will work as advertised and the comment beginning with the word " Alternatively," will become completely unnecessary. (defvar ess-directory (file-name-as-directory (getenv "HOME")) "*The directory ess is run from. It must end in a slash. Provided as a default if ess-ask-for-ess-directory is non-nil. A nil value means use the current buffer's default directory. Buffer-local: in process buffers, this contains the directory ess was run from.") ;; You can put something like: ;; (setq ess-directory (file-name-as-directory (concat (getenv "HOME") "/ess/"))) ;; in your ~/.emacs file and ess will always start up in your ~/ess directory. ;; Or you can say: ;; (setq ess-directory nil) ;; in your ~/.emacs file and ess will always start up in your current buffer's ;; default directory. [[[[ delete ;; Alternatively, you can get ess to start up in the current buffer's directory ;; by putting this in your .emacs ;; (setq ess-pre-run-hook '((lambda () (setq ess-directory default-directory)))) ;; Better (more correct) version: ;; (defun ajr:ess-set-directory () ;; "Set ess-directory to current directory." ;; (setq ess-directory default-directory)) ;; (add-hook 'ess-pre-run-hook 'ajr:ess-set-directory) ]]]] * (RMH) From smode.cmt (from the S4 package): <-- AJR: some of these HAVE been done. --> e. Problem Working data will be in /usr/people/rmh/.Data > !pwd /disk5/rmh/smode > Reason: .Data has not yet been created in /disk5/rmh/smode Solution: quit S, mkdir .Data, start again Recommendation 1. Tell users in README to create .Data first. Recommendation 2. Tell users in README about Info item - User Option: S-directory I for one always want the current buffer's working directory. g. Question: S-help does the following: (S-command (format inferior-S-help-command object) tbuffer) which seems to going through more work than is often necessary. When the .Cat.Help subdirectory exists, why not just M-x find-file the help file? 2. S3, Splus 3.3, S4 e. S-inf-font-lock-keywords In inferior-S-mode the expressions below are in the indicated faces: > tmp <- 1:3 # > is in font-lock-keyword-face # rest is font-lock-variable-name-face tmp <- 1:3 # <- is in font-lock-reference-face # rest is in default I don't understand why. >From the definitions in S-inf.el, I expected that there would be no dependence on the presence or absence of the leading prompt ">". In particular, I anticipated that <- would be in font-lock-reference-face with or without the prompt. f. S-inf-font-lock-keywords I recommend adding several keywords to S-inf-font-lock-keywords for S3 and Splus 3.3 as noted in the attached s3.el and splus.el. g. Interesting glitch While fixing C-c C-l for S4, I found the following: >From the *scratch* buffer, both the commands (S-command "source(\"junk.s\")\n" (get-buffer "*S-errors*")) (S-command "source(\"junk.s\")\n") work correctly when junk.s is ok. The first one puts an error message in "*S-errors*" when junk.s has a problem. But the second one loses the error message. I chose not to investigate this further, since S-load-file uses the first form, and I doubt any person would consider using the second. 3. S4 changes a. S-mode.el [C-c C-l S-load-file] ;;; The S4 requires the fixes to ; S-dump-error-re ; S-parse-errors ; S-prompt-wait ;;; in my s4.el in order to respond correctly to syntax errors ;;; during S-load-file. ;;; Without these changes the system will freeze. ;;; (^G will clear the freeze, and ^XB *S-errors* will ;;; display the error message). b. S.el and S-site.el The variable S-version-running, defined in S.el, with the option to revise in S-site.el, needs to be redefined to identify version 4. Some of the items coded by S-version-running differ in Version 4. b1. S-inf.el (setq inferior-S-search-list-command "searchPaths()\n") ;;; This variable needs to depend on S-version-running. ;;; the function inferior-S-search-list-command should probably use ;;; inferior-S-search-list-command, but it actually has "search()\n" ;;; hard-wired in. ;;; inferior-S-objects-command is the same for version 4 as for version 3 b2. S.el ;;; inferior-S-help-command ;;; inferior-S-search-list-command ;;; S-dump-error-re Add a new line ;;; inferior-S-objects-command b3. S-help.el ;;; S-submit-bug-report needs to know about version 4 for a bug report ;;; to be useful. c. Other changes in s4.el respond to changes in S4: .Help is now __Help Errors are now Problems "Dumped" messages now become offers to Debug Additional keywords should be fontified d. I have placed S-namedb.el in $SHOME in my s4.el file. On further reflection it should probably be in the $SHOME/library/emacs/ directory. Question, does it make sense for S-namedb.el to be distributed in $SHOME/library/emacs as part of binary.*.tar.gz ? * (RMH) Rather than have the site installer change the name of the directory, it should be possible to find it out automatically. Here is the relevant code from my spread.frame package. It assumes the user started up spread.frames by typing M-x load-file "/path/name" It then finds the directory associated with that path and goes from there. Some similar trick should be doable when the user does a M-x load-library "name" (defun find-spread-frame-directory nil "Locate directory in which spread.frame functions are stored." (list-command-history) (set-buffer "*Command History*") (goto-char (point-min)) (search-forward "(load-file ") ) (goto-char (1+ (match-end 0))) (setq beg (point)) (end-of-line) (search-backward "/") (goto-char (match-end 0)) (setq spread-frame-directory (expand-file-name (buffer-substring beg (point)))) (kill-buffer "*Command History*")) * (daven@stille.llnl.gov (David Nelson)) Transcript mode is delightful, with one possible improvement. Quite often, when I'm in the middle of a session, I'd like to insert a comment in the transcript, preferably with a distinctive type face like those provided by "font lock". Is there an easy way to do this that I'm just missing? (RMH's thought): I'm writing to you rather than directly to daven@stille.llnl.gov (David Nelson) because I'm not sure how to tell him to do the following fix in .emacs or S-site.el because of the local variable issue or if it even is the right fix. I think the permanent answer should be for you to add the lines (make-local-variable 'comment-start) (setq comment-start "#") (make-local-variable 'comment-start-skip) (setq comment-start-skip "#+ *") copied from S-mode.el to the files S-trans.el and S-inf.el (4.8 notation). But when I tried it out with M-x eval-expression in the *S* buffer it didn't have the effect I anticipated. I can't figure out the intent or meaning of the line ("^\\*\\*\\\*.*\\*\\*\\*\\s *$" . font-lock-comment-face) ; S-mode msg from S-inf.el and S-trans.el * (KH, 010897) Can we combine the inferior-ess font-lock-patterns for prompt and input into one regexp? I.e., use ("^\\([a-zA-Z0-9 ]*[>+]\\)\\(.*$\\)" (1 font-lock-keyword-face) ; prompt (2 font-lock-variable-name-face keep t)) ; input * (KH, 010897) Perhaps one could have an option to install the Info files gzipped (as is default for e.g. Debian GNU/Linux). * (RMH bad behavior) I loaded ess-site from *shell* in directory ~/ Then I M-x S from that buffer. It asked me about starting S in ~/ The with in *shell* I cd /disk05/rmh and M-x S from *shell* again. I think it should have attempted to start S from /disk05/rmh, but instead it again asked me about starting S in ~/ * (AJR/RMH) make sure that font-lock stuff is properly set. (look into file order, for example). * (AJR) Kurt> * When first starting R and then XLS, we have Kurt> ess-history-file's value is ".Rhistory" Local in Kurt> buffer *R*; global value is ".XLShistory" Kurt> Why is there a non-nil global value? > Because of the nature of buffer-local variables. It doesn't really > matter, since I'm ALWAYS ignoring the global value (at least that is > my intent). * (MM) Date: Fri, 22 Aug 1997 09:11:25 +0200 >>>>> "Kurt" == Kurt Hornik writes: >> * Questions: 1. I don't understand why ess-customize-alist is not >> buffer-local (This definition is from ess-vars.el.): (defvar >> ess-customize-alist nil "Variable settings to use for proper >> behavior. Not buffer local!") ;;(make-variable-buffer-local >> 'ess-customize-alist) ;;(setq-default ess-customize-alist nil) Kurt> Personally, I think that most of the (make-variable-buffer-local Kurt> ...) and (setq-default ...) will have to be replaced eventually Kurt> by making the variables local when needed and passing them not in Kurt> the global environment but rather as explicit arguments to the Kurt> caller functions. Kurt> E.g., Kurt> (ess-start-process NAME BUF FILE ARGS ALIST) This is cleaner from a programming point of view, however is n't this much less CPU efficient ?? >> 3. Should ess-proc-prefix be renamed to ess-language? I glanced at >> the result of 'grep ess-proc-prefix *.el' and don't immediately see >> a problem. Kurt> Yes, good idea. Could we then have Kurt> ess-language ess-dialect Yes, this looks like the thing to aim at !! Together with what Kurt wrote in the last e-mail's PS: Kurt>>> PS. We should decide on a scheme for languages (S, XLS, ...) Kurt>>> and what we call ``dialects'' (for S: S3, S4, S+, ..., R). Kurt>>> This would allow us to have a general mechanism for dealing Kurt>>> with the above, such as Kurt>>> Kurt>>> * In the caller function (M-x S, M-x R, ...) set language and Kurt>>> dialect. Kurt>>> Kurt>>> * Then, we don't explicitly have to assign all variables which Kurt>>> should be local (such as font-lock-keywords) anyway, but could Kurt>>> figure them out by Kurt>>> Kurt>>> looking for -font-lock-keywords looking for Kurt>>> --font-lock-keywords Kurt>>> Kurt>>> Hooks could be organized similarly Kurt>>> ... (ess-inf-S-S4-mode-hook?) * (RMH 31 Jul 1997 07:22:10 -0400 or earlier) * what it doesn't do 1. The effect of the second line is to prevent * font-lock information from happening on input lines. The prompt * is highlighted, the rest of the line is not. The effect is to * cancel the usefulness of syntax highlighting on user-typed * commands. Syntax marking is only in effect when the system types * a function back to us. 2. I can't figure out what the ess-mode msg line is doing. ("^\\*\\*\\\*.*\\*\\*\\*\\s *$" . font-lock-comment-face) ; ess-mode msg 3. comments (beginning with #) are syntactically ignored by highlighting. In ess-mode, comments are not picked up with this table (actually ess-mode-font-lock-keywords). They are picked up by ess-mode-syntax-table on line 733 of ess-vars.el. 4. what are the < > characters doing in this line: ("\\<\\(TRUE\\|FALSE\\|T\\|F\\|NA\\|NULL\\|Inf\\|NaN\\)\\>" . font-lock-type-face) ; keywords * open questions 1. I think I want ess-mode-font-lock-keywords to be effective in inferior-ess and in ess-transcript. That means to the user, the <- and function and T and F will be highlighted as commands are typed in. 2. That means to the ess-mode designer that the line ("^[a-zA-Z0-9 ]*[>+]\\(.*$\\)" (1 font-lock-variable-name-face keep t)) ; input is deleted from inferior-ess-font-lock-keywords. 3. Further it means that inferior-ess-font-lock-keywords should be defined by adding additional definitions to ess-mode-font-lock-keywords. * harder questions 1. these keywords are hardwired. They should probably be put into the *-customize-alist. In particular, S4 uses different keywords for errors (problems) and so forth. It also uses different keywords for the Help file (__Help instead of .Help). These are functional differences, not just cosmetic differences where the font would be wrong. See the comments in ess-s4-d.el (based on my original s4.el). (just noticed, the current ess-s4-d.el has two ending pages.) It is easy to make ess-mode work for S4 by overriding all the differences (which is how s4.el works). It is harder to do it cleanly so the same emacs session can be used for S4 and S3. Lots of currently hardwired variables need to be moved to the *-customize-alist first. xlispstat is quite differently structured, so I am sure that the keywords and highlighting here will be either irrelevant or harmful if applied directly. customization is needed for that generality as well. * comments I'm confused? I've always gotten comment highlighting in inferior-ess/S-mode. Or do you mean that it's not done in the right place? correct, it is not done where you think it is done (right place or not). It is done by ess-mode-syntax-table for inferior and transcript mode. It is not done at all for ess-mode. The font-lock settings seems to be irrelevant. * logic Richard> 4. what are the < > characters doing in this line: Richard> ("\\<\\(TRUE\\|FALSE\\|T\\|F\\|NA\\|NULL\\|Inf\\|NaN\\)\\>" Richard> . font-lock-type-face) ; keywords using the typeface for the inequalities, for boolean statements/tests. Not so. The < > do not appear in font-lock-type-face. * Hmm... I think that was the font that was to be used for the prompt. Not so. The previous line is used for the prompt. This line seems to be used to suppress font-lock control for all characters following the prompt. Note that the (1 ...) is in the position normally taken by the "." . I assume the keep makes it stay that way for the rest of the line. I haven't bothered to read font.el to figure this out. * *Buffer List* . text.st 0 ESS Transcript /disk05/rmh/text.st test.r 0 ESS[R] /disk05/rmh/test.r test.s 0 ESS[S] /disk05/rmh/test.s * *S4* 236 Inf-ESS Note that the *.r and *.s files include the [R] and [S]. The inferior processes do not include the ess-version-running, I wish they would. The corresponding modelines are (ESS Transcript [] Font) (ESS[R] [none] Font) (ESS[S] [none] Font) (Inf-ESS [S4]: run Font) I don't know the original intent of the [] and [none], but I would love to see the name of the buffer to which ^C^N is sending stuff. * ^C^N goes to the wrong inferior process. I opened test.r in the same directory as *R* and sent a line. It went to the *S* buffer in a different directory and running the wrong program. There needs to be a way for the system to ask me which process to use. Also, it's default guessing system should have guessed *R* based on the file name test.r. * hooks in ess-vars.el, line 317 and following, some of the hooks are initialized to '() and others to nil. Is there a difference? * ess-source-modes in ess-vars.el line 382 Is this obsolete now that auto-mode-alist has the suffix information? * (AJR, via MM, RMH, DB): distinguish between files of dumped objects and files of loading objects. * (RMH/AJR) Richard> essl-sas.el Richard> SAS-log-mode Richard> As present, SAS-log-mode doesn't do anything but be Richard> human-readable. My intent in basing it on Richard> ess-transcript-mode rather than on fundamental-mode is Richard> that when sas-clean-region and related functions are Richard> figured out, then the log file can be used to re-enter Richard> commands back to *SAS:1*. We will look for all numbered Richard> lines between a Richard> 34 PROC abcd; Richard> ... Richard> 38 run; Richard> pair, sas-clean-region them and send them over to Richard> *SAS:1*. This is NOT an exercise for 5.0. But because Richard> it is intended, I feel (weakly, not strongly) that it Richard> would be better to base SAS-log-mode on Richard> ess-transcript-mode. This plan should be formally Richard> entered into the TODO list. I would agree with this. I'd also like to make sure that we have a means of easily going between linked buffers. Added into the TODO list. Richard> While we are entering things in the TODO list, I would Richard> like to consider setting up *SAS:n* as a unix pipe, Richard> rather than as a unix buffer/file. I don't know how to Richard> tell emacs to do that. The idea is to mimic the behavior Richard> of the SAS edit window where, once the Submit menu item Richard> has been clicked, the window is emptied. No, I think that using as a buffer would be better (especially for debugging any weird problems). Hiding it, though, will be desirable. Richard> I can also see a case for leaving the *SAS:n* buffer as a Richard> buffer. We should consider making it read-only to force Richard> the user to do all thinking in the ex123.sas buffer. The Richard> only reason I can currently think of for letting the user Richard> write directly in the *SAS:n* buffer is to enter the Richard> commands Richard> stop; Richard> or Richard> endsas; Richard> I can't think of any reason to save the *SAS:n* buffer Richard> and would like to know if there is any way to prevent the Richard> user from saving it. and not even that, since that should be the result of C-c C-q, so that we get a nice, uniform means of exiting. (RS1) I don't believe the sas-log-mode suggestions were ever implemented. In fact, sas-log-mode is not a default option anymore since there are so many different applications that create .log files. Instead, a few changes were made to sas-mode based on requests for syntax highlighting of the .log. This feature can be toggled on and off by F10. This temporarily turns on sas-mode for .log files so you will not experience permanent extension collisions with other .log file generating applications. Also, performance may be an issue. Extremely long .log files (particularly those generated by macros that involve alot of code-generation) can be extremely time-consuming to fontify and lazy-locking is usually not an option due to the complexity of the SAS regular expressions. Fast-locking may help a bit, but font-locking of several minutes is not unheard of. Also, the font-lock code was re-written to properly highlight either a .sas or a .log file. See ess-sas-run-make-regexp below. (RS2) Rich re-did sas-log-mode to use the font-locking from ESS[SAS] and it seems to be working. The only caveat is that I found that fast-lock is very slow for big .logs and I switched to lazy-lock and it is much faster, however, I have problems toggling; usually, after I turn it on, I can't turn it off; but, that's not so bad with lazy-lock. Also, a new function creates transcript from your .log, ess-sas-transcript * (KH) Font-lock needs to be more intelligent about recognizing reserved words in non-reserved contexts (such as in "strings"). (RS1) If this was a SAS problem, then problem has been fixed. To turn on the new functionality, (setq ess-sas-run-make-regexp nil) (RS2) This is now the default and most known issues have been addressed; even hanging then statements! * (AJR) SAS indenting needs to be fixed. (RS) I don't know if this was fixed, but I haven't had any problems with indenting recently. * (AJR) SAS fontlocking of comments needs to be fixed. (RS) I believe this is done. We made a few changes, but the biggest problem was that Emacs 19.34 was misbehaving. See ess-sas-run-make-regexp above. * (KH) explicit statement: I have only one remark (one of my usual ones). I'd like to be able to pass command line arguments to the inferior process when it is started. This is currently not supported, and poses some difficulties with an interactive prompt mechanism. (Also rules out my suggestion of using C-u to force prompting for command line args.) Hmm ... Perhaps we should have a variable (ess-inf-always-prompt-...) to get around this problem? * (RMH - SAS) graphics are possible in two ways: a. proc gplot; plot a*b / vpos=25; b. goptions device=psfile; filename gsasfile 'temp.ps'; and then use ghostview from another *shell* buffer. autoexec.sas defines the departmental printers and turns off overprinting. My autoexec.sas file is: libname gdevice0 '/home/public/stat/gdevice0' ; options noovp; * (RMH - SAS) I have another proposal for font-lock in SAS-mode. I think it will be easy, but I would like discussion first. My new proposal is that proc whatever data myfile %macro macname and maybe a few others (including both the keyword and name of the dataset or proc) be in font-lock-function-name-face %include will be in font-lock-reference-face Any other FIRST word in a statement will be in font-lock-keyword-face My reasoning is that the current laundry list is too long, and still misses many keywords. The structure of the SAS language is essentially keyword and arguments, so let's follow that. (RS) Essentially done. The following statements are in font-lock-reference-face: macro statements, PROC ..., DATA, RUN, ENDSAS, and QUIT. See ess-sas-run-make-regexp above. * (Tobias Laatsch - SAS) There seem to be some problems fontifying SAS Comments in ESS 5.0 Pre1. (I'm running xemacs 20.2 on AIX .) Currently I recognized following problems: 1) Multi-line-comments are not fontified. (open comment "/*", some lines of code, close comment "*/") 2) When typing / , " or ' in a comment-area, ESS fontifies the whole line as normal code instead of comment. 3) Typing a '* in a comment-area fontifies the rest of the line as string. (RS) Fixed for /* */ style comments which are now handled by grammar only. * ; and %* ; are still broken since they can't be specified by grammar. * (AJR) Richard> I think of S-transcript-mode as identical to Richard> inferior-S-mode except that the transmission is to the Richard> same buffer in inferior-S-mode and to a different buffer Richard> in transcript-mdoe. So I expect ^M (enter) to behave Richard> normally for lines that begin with "> command" and "+ Richard> continuation". Which is what my proposal does (send command, move to next prompt). What needs to be modified is that currently, it moves to any next prompt, including "+ ", rather than just to the next primary prompt -- it is smart enough to strip the "+ " as well from the whole command, and collect the rest of the command line. Richard> I haven't tried eval-region commands from either *S* or Richard> from a filename.st. I think both ^C^N and ^C^R should Richard> make sense and work if the region is valid input. Both Richard> modes should strip leading ">" and "+" characters. I Richard> think that a region which is a subset of a line, or which Richard> doesn't begin with the standard prompt sequences, should Richard> send it over literally. So, C-c C-r would only send lines beginning with inferior-ess-primary-prompt (up to the last consecutive inferior-ess-secondary-prompt), strip off the prompt, and ignore lines which do not begin with prompts. Does this sound correct (for C-c C-r)? C-c C-n should be correct (comint-next-prompt). * (KH/AJR) I see. This is what the "help(\"%s\")\n" does. Well, we have the following problem. The `new' interface to help() I created is help(topic, package = .package(), library = .lib.loc) This allows you to get help on a topic (R object, ie fun or var or whatever else is documented) in a package without loading it, via help(topic, p = PKG) I've eliminated the help(data = ) part, but there may soon be another argument to search for keys ... If we want people to be able to use the extended forms, we can * use "help(%s)\n" for the format, which means they have to quote special things as they would need to from the command line * or do something smarter, such as quote only if object does not contain "," which appears to be the right thing. What do you think? > How about this 3rd alternative? > C-c C-v works as usual > C-u C-c C-v prompts for the extra arguments (a "wizards > help", of sorts) > Completion will only work with the prompt for the command, and will be > turned off for the others? > If not, we'll go with the "right thing" (option 2). The alternative sounds good. We might still want to quote the help string in case it does not contain a `,', so that C-c C-v + continues to work ... * (RMH) His (Tom Cook's) sas-get-dataset is a very good idea and was not in my proposal. I would do it using the same mechanism that S-help uses to put the results of ?function into *help(function)* buffer. It is a relative of ess-dump-object-into-edit-buffer. The major difference is that there is no sense of editing the object and sending it back to S. It is also a relative of the display of a spred.frame, with the difference again that there is no sense of editing the object. I like the switch-to-sas* functions. I would like to generalize them back to S. I think switch-to-S-source when entered from the *S* buffer should go to the filename.s that was the most recent sender of ^C^N or ^C^R. Here is cook's sas-mode-map and how it fits with my ess-sas-d.el "\C-c\C-i" 'indent-sas-statement) \t use recommended conventions "\C-c\C-a" 'beginning-of-sas-statement) use "\e\C-a" 'beginning-of-sas-proc) \M-\C-a "\e\C-e" 'next-sas-proc) \M-\C-e "\C-cs" 'switch-to-sas-source) use "\C-cS" 'switch-to-sas-source-other-window) use "\C-cg" 'switch-to-sas-log) use "\C-cG" 'switch-to-sas-log-other-window) use "\C-cl" 'switch-to-sas-lst) use "\C-cL" 'switch-to-sas-lst-other-window) use "\C-cr" 'run-sas-on-region) ^C^R "\C-c\C-l" 'submit-sas) ^C^B or ^C^L "\C-cd" 'sas-get-dataset) use "\C-c\C-c" 'switch-to-sas-process-buffer) ^C^Z or ^C^Y (RS) Can't comment on the S aspects, but you can now browse/edit a permanent SAS dataset (provided the library definition appears in autoexec.sas) with F9. * (AJR) REWRITE INFERIOR-ESS (AJR, for 5.1 series). * (RMH) Add explicit directions on installing or using dir for info. Makefile ; for 5.0 line 96 of pre5/Makefile included dir. dir does not appear in lastpre/Makefile. dir does not appear at all in the directory. You did include instructions on line 194 on editing dir. dir is needed for the info system to get ess into its menu. Please include the sample dir (below) and instructions on editing site-start.el. I have the following in my site-start.el ;; (defun add-info-path (newpath) (setq Info-default-directory-list (cons (expand-file-name newpath) Info-default-directory-list))) (add-info-path "/disk05/local/teTeX/info/") ; stat dept (add-info-path "/disk05/local/emacs/S-mode/") ; stat dept (add-info-path "/disk05/local/info/") ; stat dept ;; Here is my 5 line dir file from S-mode 4.8. It needs to be updated to 5.0. The first line is blank. I think the blank line is required, although it might be there only for appearance when the info menu comes up.  File: dir Node: Top This is the top of the INFO tree * Menu: The list of major topics begins on the next line. * S-mode: (S-mode). S-mode Version 4.8 This works correctly in Emacs 19.29. My memory says that when I was playing with XEmacs a few months ago, the add-info-path didn't work correctly in XEmacs. Only the first and last items on the Info-default-directory-list actually got displayed. * (RMH) >From here on is NOT for 5.0 ess-create-object-name-db and ess-load-object-name-db-file 1. e-load-* doesn't ding if not there. good 2. I entered e-create-* manually and it did its job, creating ess-s+3-namedb.el in my home directory. Then I did a name completion and ESS redid the entire set of searching the directories. 3. mv ess-s+3-namedb.el to ESS-5.0/ 4. Quit emacs and start over 5. Then I did a name completion and ESS redid the entire set of searching the directories. 6. Quit emacs and start over 7. Manually M-: (ess-load-object-name-db-file) 8. Then I did a name completion and ESS redid the entire set of searching the directories. * (RMH) buffer choice (questions for 5.1) I opened lots of simultaneous processes. The q() from *R*. Then M-x XLS XLS came up in the *R* buffer Tried it again. This time I C-c q() from *S4*. Then M-x S S+3:3 came up in *S4* buffer. This is obscure stuff. What really should happen? Problem in inferior-ess: logic states that if the current buffer is iESS or ESS-trans, and doesn't have an active process, use it, instead of creating a new buffer. (AJR). * (RMH) * iESS [S+3] 5.0? 5.1? 'single quotes' are in regular font "double quotes" are in quote font This differs from ESS[S] mode in which both kinds of quotes are in quote font. Should be fixed in 5.0 if easy. Not obvious to me where the problem is. The identical S-syntax-table is in use in both iESS [S+3] and ESS[S]. The font-lock-keywords don't seem to me to be the problem. * (RMH) Dumped problem in S+3 Here is an example of the Dumped font problem in S+3: > "trellis.settings" + "x + z + abcdefghij + klmnopqrstuv" Error in "trellis.settings" + "x + z + abcdefghij ..: Non-numeric first operand Dumped > Note that the Error description from S+3 truncates the command and adds the ".." to indicate the truncation. Part of what gets truncated is the closing quotation mark. Hence everything from that point on is still inside the opening quotation mark. Everything includes the rest of the error description, the word "Dumped", the prompt on the next line, and all succeeding commands. I normally go back and edit the line by adding the closing quote in front of the prompt Dumped "> I would love for iESS [S+3] to monitor the word "^Dumped" and make sure the font is back to regular. * On the Dumped ".. font problem I have an answer that I am uncomfortable with. The problem: Error in "trellis.settings" + "x + z + abcdefghij ..: Non-numeric first operand Dumped Potential Solution: a. Look for the pair "Error in" and "Dumped" b. Verify the number of uses of '"'. c. Insert an extra '"' if needed after the ".." and before the ":", thus Error in "trellis.settings" + "x + z + abcdefghij ..": Non-numeric first operand My discomfort is that we are then modifying the output, not just highlighting it. * (BR) Scripts in S-PLUS 4.x provide quite similar functionality to the ESS front-end, and are worth investigating. * (Duncan Murdoch, on IDEs): I don't understand the details of what you're saying, but for an example of a very good IDE, you should look at Borland Delphi, version 3. It has some very nice features: - at any point, you can ask to see a list of legal identifiers to insert. These are presented in order from most to least local, so usually the one you want is near the top. The IDE knows enough about the syntax of the current line to only suggest things that would be legal there. - when you type a dot (more or less equivalent to $ in S), you're presented with a list of fields and methods for the object or record you're working with. - you can point at any identifier and hit a key for the help for that identifier. Because it's an object oriented system, there are often multiple different methods with the same name; the IDE picks the appropriate one by the context. Other unrelated things that Delphi does nicely which Splus would do well to emulate: - you can ask for a new object of a specific type, and it will insert appropriate skeleton code for it. - the object browser is quick and convenient to use! Of course, the objects in Delphi tend to be quite different from the objects in S... - it has lots of nice visual design tools for writing user interface code. * Bob_Dorazio@usgs.gov (Bob Dorazio) on IDEs: I have no experience with emacs, but in response to your question take a look at Watcom's IDE for C++. This IDE is the best I have ever seen! The source code editor is fantastic and the level of integration between the source code editor, the compiler, the debugger, and the utility for "building" executables or libraries surpasses that of any other IDE I have used. * From: Sandy Weisberg Subject: Re: ESS 5.1.14 supports ARC To: rossini@biostat.washington.edu Date: Thu, 6 Jul 2000 09:42:19 -0500 (CDT) The name of the program is Arc, capitalized because it is a proper name, but otherwise a normal English language word. Thanks for asking! > > Thanks to Doug Bates' prodding, ESS 5.1.14 (Emacs Stat interface) > released an hour ago, works with ARC). > > Should it be referred to by "ARC" or "Arc" (or?) in the ESS > documentation (which still needs to be written)? > * From: Sven Garbade[SMTP:garbade@psy.uni-muenchen.de] Subject: Delete forward key I don┤t like it that the delete-forward key deletes backwards in ESS-mode. My default option is, delete-forward deletes forward, but ess-mode ignore this. Is there a simple way to change this? (RS) Put this line in your .emacs file after you have loaded ESS: (define-key ess-mode-map [delete] 'delete-char) * (RMH) Stata question: delimiter I noted that the command lines are duplicated. You might need (setq comint-process-echoes t) in the defun stata Date: Tue, 15 Jun 2004 01:11:33 -0400 From: "Richard M. Heiberger" Add To Address Book | This is Spam Subject: Re: change in ESS with edit() in R To: rossini@u.washington.edu Cc: Stephen Eglen , ess-core@stat.math.ethz.ch I think Tony spotted the source of the problem. I think I did it. The goal in ess-iw32.el was to change the behavior of ess-eval-linewise and ess-eval-region to call the Windows S-Plus GUI through the DDE protocol. This was successful. I and others have used it daily for the past 6 years. I intended to restrict the change to the S-Plus GUI. My thinking at the moment is that I didn't do that restriction well enough. I get an emacs freeze in both R and Sqpe on Windows. An initial look at emacs variables makes me think that the "if" tests in ess-iw32.el for the substitute definitions of ess-eval-region ess-eval-linewise ess-load-file ess-dump-object-into-edit-buffer ess-display-help-on-object ess-dump-object aren't precise enough to detect that R and Sqpe should not be sent to ddeclient. This note goes on the master "To DO" list. Do we have one? Taking it off the list is not a high priority for me because the work around of C-g is so easy. Rich 03-17-08: Add advanced features to ESS[JAGS] like thinning and multiple chains (initialization and creation): Done! Rodney 01-24-12: ESS[R] and Tramp bug The help doesn't work nicely. ?chol doesn't pop up a new buffer like it does locally; instead it puts you into a pager of some sort. Also, help.start() doesn't work unless you launch firefox remotely (which defeats the purpose of working remotely for the most part). Rodney ess/doc/README.additions0000664000175000017500000000073712423756516013350 0ustar eddedd-*- text -*- The purpose of this file is to describe how to add new dialects and languages to ESS. The code is divided into 4 types of functionality. ess-*.el : described the underlying mechansim essl-*.el : language specific considerations ess-*-d.el : describe dialect and process specific modifications. This should also contain the language specific interface functions. essdd*.el : modes for writing documentation. This will be finished for 5.2. ess/doc/Why_R_mode_not_S_mode.txt0000664000175000017500000000504212423756516015450 0ustar eddedd O.k., here are now some general remarks. Tony asked Also, why are you interested in writing an R-mode, rather than modifying the S-mode? I'm curious as to what features you feel are needed? or is it simply a matter of avoiding code bloat? Let me try to answer that. * Apparently, S-mode currently is not maintained. This is a real problem. I don't know if Richard Stallman (hereafter, RMS) is currently aware of how well R is progressing. I am sure he would eventually love to include it into the `GNU' distribution, and I am also sure that he will like to include support for it in GNU Emacs. This means that code will have to be cleaned (and copyrights transferred etc). No maintainer, and code which is not `clean' ... no inclusion. * Another crucial problem is terminology. If the documentation keeps talking about sending to an S process etc, and it is in fact an R process ... I am not sure how users feel about that. I am also not sure how much Ross & Robert want R to be treated as markedly different from S, or what the authors of S-mode think of that. * I've encountered a similar situation with MATLAB and Octave. An Emacs MATLAB mode had been around for quite a while. Eventually, John Eaton (the author of Octave) modified this to work under Octave, too (which is harder because there are syntactic differences as well). This did not work satisfactorily. Two more hacked-up MATLAB mode versions appeared (one by me). So, John wrote a new Octave mode based on F77 mode. Of course, this was not the optimal thing either. Eventually I ended up writing octave-mode (plus I/O stuff etc) from scratch. This code will now be included in the next version (19.35) of GNU Emacs, and from what I heard also runs without problems under XEmacs (which I cannot confirm because I use GNU Emacs). In a way, the situation Octave/MATLAB is very similar to R/S. It might have been possible to have a joint mode, but it turned out to be more convenient otherwise. * Another thing is, what happens if we start putting even more effort into improving R support in S-mode. Will this eventually be merged into the `proper' S-mode distribution? * Thus, the question is whether it is both possible and feasible to have a package which FULLY works under R and S AND solves the obvious documentation problems. (And of course, we know that there are major differences in the I/O system, for example.) Please let me know what you both think about this. -k PS. From the length of this message it should already be clear that I am willing to put some time into this :-) ess/doc/bugs-ms.texi0000664000175000017500000000333112423756516012754 0ustar eddedd See the file @file{README.SPLUS4WIN} as well, for more information and details. @itemize @bullet @item (RMH) system freeze and ctrl-m, a solution for some cases. Frequently, when the *shell* buffer freezes while running either COMMAND.COM or a DOS or Windows program initiated by command.com, it can be unfrozen by entering the key sequence C-q C-m RET into the frozen buffer. What I think is happening is the coding-system got confused. Command.com is waiting for the C-m C-l sequence and it only sees the C-l, which it knows is not the end of the line. When we manually give the C-m, followed by RET, it is happy and completes parsing the line. For example, from a *shell* buffer running bash (with ps in the path): command.com ps C-q C-m RET exit C-q C-m RET command.com /c date RET C-q C-m RET command.com /c date C-q C-m RET @item (RMH) Changes in ess-r-d.el for Windows One of the design goals in ESS was to make it almost unnecessary for users to make modifications to the ess-*.el files. We have split the R function into two clones. R-unix is the old R function. It uses the starting argument "--no-readline ". R-microsoft is designed for Windows. It uses the starting argument "--ess ". We detect the operating system and fset the name R to whichever is appropriate. No user changes are required. M-x R always works. @item (RMH) msdos.el Start an msdos shell inside an NTemacs that normally uses bash as its shell. It should have been easy, but had many parameters that needed to be set. I am sending a copy of this to the Ntemacs mailing list. I think this function should be merged into the Ntemacs distribution, but for the moment I am attributing it to us. @end itemize ess/doc/rmh-talk.tex0000664000175000017500000002705112423756516012752 0ustar eddedd%% Slides given at S-PLUS Users Conference, October 1997, by RMH. \documentclass[12pt]{article} %latex2e \usepackage{slverb} %latex2e %\documentstyle[12pt]{article} %latex 2.09 % Warning: do not compress blanks into tabs. % It will destroy the spacing in the S functions in the Example environment. %\newfont{\sltt}{cmsltt10 scaled\magstep3} % load slant tt font Large \newfont{\sltt}{cmsltt10 scaled\magstep5} % load slant tt font Huge %duplicate for Huge \newfont{\slttH}{cmsltt10 scaled\magstep5} % load slant tt font Huge \newfont{\ttHuge}{cmtt12 scaled\magstep4} % load tt font Huge \newfont{\itHuge}{cmti12 scaled\magstep4} % load italic font Huge \newcommand{\LB}{{\tt\char'173}} % \tt { \newcommand{\RB}{{\tt\char'175}} % \tt } \newcommand{\BS}{{\tt\char'134}} % \tt \ \newcommand{\HH}{{\tt\char'043}} % \tt # %\newcommand{\slLB}{{\sltt\char'173}} % \sltt { %\newcommand{\slRB}{{\sltt\char'175}} % \sltt } %\newcommand{\slBS}{{\sltt\char'134}} % \sltt \ %\newcommand{\slHH}{{\sltt\char'043}} % \sltt # \newcommand{\slLBH}{{\slttH\char'173}} % \slttH { \newcommand{\slRBH}{{\slttH\char'175}} % \slttH } \newcommand{\slBSH}{{\slttH\char'134}} % \slttH \ \newcommand{\slHHH}{{\slttH\char'043}} % \slttH # % These commands give the stated character in the correct font in LaTeX. % Beware of spacing in the "Example" environment, where spaces are significant: % "\LB{}contents\RB" produces "{contents}" % "\LB contents \RB" produces "{ contents }" \newcommand{\hlinefill}{\mbox{\rule{0pt}{1ex}}\hrulefill} \pagestyle{empty} \topskip -1in \topmargin -1in \textheight 7.5in \raggedbottom \textwidth 10in \parindent 0in \oddsidemargin -.5in \special{landscape} \newcommand{\la}{{\rm\Huge$\leftarrow$}} \newcommand{\mc}[1]{\multicolumn{2}{l}{#1}} \newcommand{\marpar}[1]{\marginpar{\raggedright#1}} \newcommand{\Twiddle}{$\sim$} %10pt %\newenvironment{exsf}{\begin{list}{}{\setlength{\leftmargin}{\parindent}}\item[]\small\sf}{\end{list}} %12pt %\newenvironment{exsf}{\begin{list}{}{\setlength{\leftmargin}{\parindent}}\item[]\small\sf\boldmath}{\end{list}} %12pt Huge \newenvironment{exsf}{\begin{list}{}{\setlength{\leftmargin}{\parindent}}\item[]\sf\boldmath}{\end{list}} \newcommand{\s}[1]{\mbox{\protect\small\sf#1}} \newcommand{\msf}[1]{\mbox{\tiny\sf #1}} \newcommand{\msm}[1]{\mbox{\scriptsize$#1$}} %\renewcommand{\topfraction}{1.} %\renewcommand{\bottomfraction}{0.} %\renewcommand{\textfraction}{0.} %\renewcommand{\floatpagefraction}{1.} %\renewcommand{\floatsep}{0pt} %\renewcommand{\textfloatsep}{0pt} %\setcounter{topnumber}{25} %\setcounter{bottomnumber}{0} %\setcounter{totalnumber}{25} %\renewcommand{\dbltopfraction}{1.} %\renewcommand{\dblfloatpagefraction}{1.} %\renewcommand{\dblfloatsep}{0pt} %\renewcommand{\dbltextfloatsep}{0pt} %\setcounter{dbltopnumber}{25} \newcommand{\shortspace}{ \setlength{\topsep}{0in} \setlength{\itemsep}{0in} \setlength{\parsep}{0in} \setlength{\parskip}{0in} } \begin{document} \Huge \parskip=1ex \begin{center} \Huge ESS-mode and S-Plus\\ Richard M. Heiberger\\[1ex] based on joint work with\\ A.J. Rossini(U South Carolina),\\ Kurt Hornik(TU-Wien), and Martin Maechler (ETHZ).\\[2ex] Thanks also to\\ Doug Bates, Ed Kademan, Frank Ritter (initial versions),\\ and David Smith (3.x, 4.x)\\[3ex] Richard M. Heiberger\\[.4ex] Temple University\\[.4ex] Philadelphia, PA 19122-2585\\[.4ex] {\sf rmh@astro.ocis.temple.edu}\\[2ex] S-PLUS Users Conference, Seattle, October 1997 \end{center} \newpage \begin{center}Abstract\end{center} ESS [Emacs Speaks Statistics] (formerly S-mode) is a a GNU Emacs package for running S(plus), R, X-LispStat, SAS and potentially other interactive `statistical' languages in an `inferior' buffer, editing source code in these languages and interacting with the running program. This talk will discuss the capabilities and advantages of using ESS as the primary interface to Splus. I am talking about the version which will be released in November 1997 as ESS-5.0.\\ \hspace*{2ex}{\sf http://franz.stat.wisc.edu/pub/ESS/ESS-5.0.tar.gz}\\ \hspace*{2ex}{\sf ftp://franz.stat.wisc.edu/pub/ESS/ESS-5.0.tar.gz}\\ The previous stable version was 4.8 in {\sf S-mode-4.8.MM6.XE2.tar.gz} \newpage What is S-Plus What is EMACS What is ESS-mode Why should I use ESS-mode with S-Plus Other features in ESS-mode \newpage \begin{itemize} \item What is S-Plus? The best, most expressive, most fun, most powerful environment and program for designing methods for statistical analysis of data and for displaying and analyzing data. \newpage \item What is EMACS? A text editor that is fully configurable and extensible, can work with many files simultaneously, interacts with the computer operating system and other executing processes, has language specific customizations, and can indeed do anything (the previous edition iconized to the Kitchen Sink). In addition to S, Emacs has modes designed for \TeX, \LaTeX, fortran, c, lisp, text, directories, telnet, rlogin, terminal emulators, nroff, pascal, c++, ada, asm, etc. Mode customizations include indentation patterns, syntactic highlighting, comment structure, and interaction with the program that uses the file as input. \newpage \item What is ESS-mode? A package written in emacs which is designed to work with Statistical software. The initial development under the name S-mode was designed for S. It has been extended to dialects of S (S-Plus, S4, R) and now to other statistical packages (SAS, Xlispstat). With the extension came the name change to ESS-mode (Emacs Speaks Statistics). There are three primary components to ESS \begin{description} \item [S-mode] for editing {\tt myfile.s} and submitting individual lines and paragraphs of S code to the running S process. \item [inferior-ess-mode] for executing an S process inside an emacs buffer. \item [S-transcript-mode] for reviewing and possibly re-executing the transcript of a previous S process. \end{description} \item Why should I use ESS-mode with S-Plus? It will improve your productivity. \newpage {\bf S-mode.} Automatic syntactic indentation and highlighting of source \vspace*{-.5ex} { \underline{\slttH \slHHH\slHHH as typed -- too long. Line is folded}\\ {\tt case0701 <- read.table(file={\slttH'case0701.asc'}, header\BS} \\ {\tt =\underline{T})}\\ \vspace*{.0ex} \underline{\slttH{\slHHH\slHHH insert line break, syntactic indentation lost}}\\ \tt{case0701 <- read.table(file={\slttH'case0701.asc'},}\\ \tt{header=\underline{T})}\\ \vspace*{.0ex} \underline{\slttH{\slHHH\slHHH automatic indentation at right parenthesis level}}\\ \tt{case0701 <- read.table(file={\slttH'case0701.asc'},}\\ \tt\verb+ header=+\underline{T})\\ \vspace*{.0ex} Here by font, on a terminal by color.\\ \underline{\slttH{\slHHH\slHHH comments}}~~~~~~~{\rm underlined italic}\\ {\slttH"quoted strings"}~{\rm italic}\\ \underline{keywords}~~~~~~~~~{\rm underlined} } \newpage {\bf S-mode.} Fill-paragraph understands comments. \vspace*{2ex} Too long and folded.\\ \underline{\slttH\slHHH\slHHH~Sometimes statements are complicated with many}\BS\\ \underline{\slttH levels of}\\ \underline{\slttH\slHHH\slHHH~ parentheses. ESS gets the indentation right.} \vspace*{3ex} Fill-paragraph broke lines evenly and generated the comment symbols.\\ \underline{\slttH\slHHH\slHHH~Sometimes statements are complicated with}\\ \underline{\slttH\slHHH\slHHH~many levels of parentheses. ESS gets the}\\ \underline{\slttH\slHHH\slHHH~indentation right.} \newpage {\bf S-mode.} Detects unbalanced parentheses \vspace*{2ex} \underline{\slttH\slHHH\slHHH~Complicated statement} {\ \tt if ((abs(end(x) + tspar(x)["deltat"] - start(y))}\\ {\ \tt \hspace*{3em}< eps) \&\&}\\ {\ \tt \hspace*{2.5em}(frequency(x) == frequency(y)) \&\&}\\ {\ \tt \hspace*{2.5em}\fbox{\slttH(}(length(units(x))==0) ||}\\ {\ \tt \hspace*{3em}(length(units(y))==0) ||}\\ {\ \tt \hspace*{3em}(units(x) == units(y))\fbox{\slttH]})} \vspace*{2ex} On a color display screen the unbalanced parentheses are bright purple. \vspace*{2ex} Syntactic highlighting simplifies detection of unbalanced\\ quotation marks. {\tt tmp <- f(x, {\slttH"this is a string, y, z)}} \newpage {\bf inferior-ess-mode.} Evaluating lines of S source Program statements and function definitions can be developed in an editing window that is NOT the same as the executing S process. The lines are sent to S with keyboard commands. \hlinefill \begin{verbatim} lm( y ~ x, data=mydata) \end{verbatim} \begin{slverbatim} --**-Emacs: test.s (ESS[S] [none])--L1--All------ \end{slverbatim} \begin{verbatim} > lm( y ~ x, data=mydata) Error: Object "mydata" not found Dumped \end{verbatim} \begin{slverbatim} --**-Emacs: *S+3:1* (iESS [S+3:1]: run)--L6--All-- \end{slverbatim} \hlinefill Errors are corrected in the editing window and resent. \newpage Errors are corrected in the editing window and resent. \hlinefill \begin{verbatim} lm( y ~ x, data=myrealdata) \end{verbatim} \begin{slverbatim} --**-Emacs: test.s (ESS[S] [none])--L1--All------ \end{slverbatim} \begin{verbatim} > lm( y ~ x, data=mydata) Error: Object "mydata" not found Dumped > lm( y ~ x, data=myrealdata) \end{verbatim} \begin{slverbatim} --**-Emacs: *S+3:1* (iESS [S+3:1]: run)--L6--All-- \end{slverbatim} \hlinefill The corrected {\tt test.s} is now a permanent record of the commands that are needed. This form of interaction between the editing process and the S execution is usually the best way to develop a set of functions. \newpage {\bf inferior-ess-mode.} The session file is always available. The entire S session is in a buffer and can be be searched, edited, reviewed, saved during the current session. Previous results never run off the top of the screen and are never subject to arbitrary line restrictions. The buffer containing the S session transcript can be saved as a file. The file can be revisited later for editing into a report or handout. The file can be brought back into a buffer in S-transcript-mode and used as the base for further development. \newpage {\bf S-transcript-mode.} The transcript of a previous S session can be brought back and used as model for further development. When the cursor is placed on any line of a multi-line command, the entire command can be sent over to any relevant active inferior S-process with a single keystroke. \begin{verbatim} > xyplot(data ~ voltage | power, data=time.powers, + scales=list(y=list(relation="free")), + ylab="powers of time", + main="case0802 ladder of powers") > \end{verbatim} Once the command works correctly, it can be cleaned mechanically with the {\tt ess-transcript-clean-region} function. \begin{verbatim} xyplot(data ~ voltage | power, data=time.powers, scales=list(y=list(relation="free")), ylab="powers of time", main="case0802 ladder of powers") \end{verbatim} \newpage \item Other features in ESS-mode \begin{itemize} \item Help files go to their own buffer. Many can be viewed simultaneously. \item Several different instantiations of the same or different dialects of S (or other statistical program) can be controlled simultaneously through the same emacs process. \item Multiple S source files can be developed simultaneously. \item ESS-mode recognizes functions, multi-line statements, highlighted regions, parenthetical expressions. \item When an error is detected in a source file, ESS switches the display to the file and places the cursor on the line where the error was detected. \item Object-name-completion. \item Menu access. \end{itemize} \end{itemize} \end{document} ess/doc/onewfeat.texi0000664000175000017500000011502012423756516013206 0ustar eddedd@comment @itemize @w{} @comment @item Changes/New Features in 5.14: @itemize @bullet @item @ESS{[BUGS/JAGS]}: Batch BUGS is back! For recent OpenBUGS versions, 3.0.8+, a batch BUGS script is once again available, but for Linux only. Therefore, since it seems that BUGS and JAGS must co-exist (rather than a transition from BUGS to JAGS), .bug files are now in @ESS{[BUGS]} mode and .jag files are in @ESS{[JAGS]} mode. @ESS{[BUGS]} now works like @ESS{[JAGS]} rather than the original mode @ESS{[BUGS]} mode which was difficult to maintain. Although, @ESS{[BUGS]} appears to work, there still may be some features missing as well as bugs. @item @ESS{[R]}: New customizable variable @code{ess-swv-plug-into-AUCTeX-p} Commands to Sweave current file and LaTeX the result are now available to AUCTeX users, if this variable is set to @code{t}. @item @ESS{[S]}: @kbd{C-c C-c} (@code{ess-eval-function-or-paragraph-and-step}) is now skipping over comments as the other paragraph functions do. It (and similar functions) should no longer wrongly find @samp{function()} beginnings inside comments or strings. @item @ESS{[SAS]}: improved by better support for GNU Emacs @end itemize Changes/New Features in 5.13: @itemize @bullet @item @ESS{[R]}: On Windows, for R 2.12.0 and later, the Rterm executables (in subdirectories i386 / x64) now are found as well as for earlier R versions. @item @ESS{[S+]}: on Windows, both 32- and 64-bit versions of S+ (``S-PLUS'') are found now and made available on the menu. @item @ESS{[R]}: When prompting for a starting directory, the R version is (always?) correct now. @item @ESS{[R]}: on non-Windows platforms, the @code{use-dialog-box} variable is no longer temporarily changed (to @code{nil} for R-x.y.z version functions and to @code{t} for @command{R} itself), but rather the user customization is obeyed. @item @ESS{[R]}: more Roxygen improvements. @item `Rd-preview-help' now generates preview buffers with navigation facilities the same as regular help buffers. @item @ESS{}: New functions and keys C-c [up] / [down] for evaluating the buffer ``from beginning till here''. @end itemize Changes/New Features in 5.12: @itemize @bullet @item @ESS{[SAS]} Font-locking: update of PROCs keywords (up to SAS 9.22); error/warnings. @item @ESS{[R]}: Roxygen improvements: S4 classes; also optionally keep spaces when filling arguments @item @ESS{[Rd]}: support new keywords: section-name \subsection plus a dozen ``new'' keywords; should match R 2.12.x now. @item @command{ess-display-help-on-object} (@kbd{C-c C-v}) now @emph{caches} the list of topics, thus speeding up the improvement feature introduced in 5.9. @end itemize Changes/New Features in 5.11: @itemize @bullet @item Filename completion within buffers now adds only trailing characters to complete the filename, rather than expanding to an absolute file path. This filename completion is bound to the TAB key. @item @kbd{M-n P} in Sweave buffers now prompts for the command to run instead of using @command{pdflatex} unconditionally, offering completion from customizable collection @code{ess-swv-pdflatex-commands}, the first of which is taken as default and that defaults to @command{texi2pdf}. @item @kbd{M-RET} is now also bound in S language (R and S+) buffers to @command{ess-use-this-dir}. It sends @code{setwd(..)} to the S process to set the working directory to the one of the source file. @end itemize Changes/New Features in 5.10: @itemize @bullet @item @kbd{M-RET} in *S* buffers is now bound to @code{ess-dirs}. This function will set Emacs's current directory to be the same as the *S* process. This is useful if you use @code{setwd()} within a *S* process. @end itemize Changes/New Features in 5.9: @itemize @bullet @item Toolbar: The toolbar now has an icon for starting Splus. @item Indentation: New documentation and code has been added to make it easier to change how ESS indents code. In particular, see @code{ess-default-style}, @code{ess-own-style-list} and the documention subsection ``Changing indentation styles''. @item @command{ess-display-help-on-object} (@kbd{C-c C-v}) now offers completion candidates for help file aliases, in addition to object names. @item Font locking: is now turned on even without @command{window-system} is @code{nil}, whenever @var{ess-font-lock-mode} is non-nil, i.e., by default. @item @ESS{} script editing: ess-eval-deactivate-mark default is now t, as suggested by Leo Alekseyev and subsequent ``unanimous'' ESS-help discussion. @item @ESS{[R]}: Editing support for ``#!'' (Rscript / littler) editing, thanks to Jeffrey Arnold. @item @ESS{[R]}: Now finds all R versions, both 64-bit and 32-bit, on some 64-bit Windows machines. Please report back to ess-core success or failure on your 64-bit Windows machine. @item ESS Manual now more visually pleasing; @uref{http://ess.r-project.org/Manual/ess.html} @item @ESS{[R]}: Roxygen on XEmacs no longer font locks for now (as it required missing features and hence broke ESS startup, there). @item @ESS{[R]}: Roxygen has a sub-menu on the [ESS] menu. @item @ESS{[R]}: Function @command{ess-rutils-htmldocs} in @file{ess-rutils.el} offers an alternative to @code{help.start()} for navigating R documentation, using the @command{browse-url} Emacs function. @end itemize Changes/New Features in 5.8: @itemize @bullet @item @ESS{[R]}: New @file{ess-rutils.el} with utilities for listing, loading, installing, and updating packages, as well as object manipulation (listing, viewing, and deleting). It also provides an alternative to @code{RSiteSearch()} that uses the @command{browse-url} function, so results can be viewed in an Emacs web browser. @item @ESS{[R]}: much more extensive Roxygen interface, via ess-roxy.el from Henning Redestig. Ess-roxy supports filling of roxygen fields, generation and updating roxygen templates, completion of roxygen tags, basic navigation (marking and moving between entries), folding using hs-minor-mode and preview of the Rd file. @item Emacs lisp files have got better names (partly, for now). @end itemize Changes/New Features in 5.7: @itemize @bullet @item @ESS{[R]}: loading a source file (@kbd{C-c C-l}) now works in Windows, similarly to other platforms; (further; it had accidentally been broken in ESS 5.6 on all platforms) @end itemize Changes/New Features in 5.6: @itemize @bullet @item @ESS{[R]}: help() calls have to differ from old default, with newer versions of R; currently via .help.ESS <- function(...) hack. @end itemize Changes/New Features in 5.4: @itemize @bullet @item @ESS{[SAS]}: The long overdue change from @code{make-regexp} to @code{regexp-opt} for font-locking is complete. The new @code{regexp-opt} is now the default since it is better than the old code in many ways (and especially more maintainable). However, there are certainly some special cases missed (bug reports and patches welcome!). Setting @code{ess-sas-run-regexp-opt} to @code{nil} will result in the old code being used. @item @ESS{[BUGS]} and @ESS{[JAGS]}: typing @code{=} now results in @code{<-}. @item @ESS{[R]} function arguments ``show'' @code{(ess-r-args-show)} now uses the new @code{(tooltip-show-at-point)} contributed by Erik Iverson. @item Toolbar icons now also work in (beta) Emacs 23. @item @ESS{[S]}: New function @code{ess-change-directory} for setting both emacs' current directory and the directory of an *R* or *S* buffer. @item @ESS{[S]} when transient-mark-mode is true, the mark is now kept, rather than deactivated, thanks to a patch from David Reitter. @end itemize Changes/New Features in 5.3.11: @itemize @bullet @item @ESS{[SAS]}: work around bug in Emacs 22.2 & 22.3 which fails to set case-fold fontification automatically. @item Rd mode: support new keyword 'Rdversion' @item @ESS{[R]}: now again works with Emacs 21.x @end itemize Changes/New Features in 5.3.10: @itemize @bullet @item Fixed noweb-mode bug accidentally introduced into 5.3.9 @item In noweb-mode, e.g., Rnw-mode, electric ``<'' also inserts closing ``@@". Further, the code chunk boundaries are better kept up-to-date, such that code[R] <-> text[LaTeX] minor mode switching should happen more reliably. @item In noweb-mode, fix a buglet in rare [Enter] or [Tab] behavior; further, by default disable the former `[[' .. `]]' code-protection-when-filling behavior which has been found to be buggy. @end itemize Changes/New Features in 5.3.9: @itemize @bullet @item @ESS{[SAS]}: evince PDF viewer now supported as well; search order: evince, Xpdf, Adobe/Acrobat Reader @item @ESS{[R]}: added support for Roxygen, potentially to be extended. @item @ESS{[S]} (and R): inferior (@code{*R*}) and transcript modes no longer fontify language keywords (such as @code{for}, @code{in}, etc). @item @iESS{[Stata]}: Customize the @code{ess-sta-delimiter-friendly} setting to @code{t} to convert embedded semi-colons to newlines for Stata processing. @item Sweave fix for embedded blanks in PDF reader and PDF files @item Several fixes for Major Mode Convention violations in @code{ess-mode} and @code{noweb-mode}. @item @ESS{[JAGS]}: @code{M-x comment-region} now available! @item @ESS{[S]} The @code{ess-swv-*} commands (and keybindings) are now in a submenu of the ``Noweb'' menu, when editing Sweave files. @end itemize Changes/New Features in 5.3.8: @itemize @bullet @item @ESS{[JAGS]}: more separation from @ESS{[BUGS]} (as much as is currently planned); now @kbd{C-c C-c} on an empty @file{.jmd} creates a template as it should; symbolic links are created for CODA output so BOA is happy: from @file{index.txt} to @file{.ind} and @file{chain#.txt} to @file{#.out} @item @ESS{[SAS]}: buffer-local @code{ess-sas-submit-command} and @code{ess-sas-submit-command-options} now recognized by @code{ess-sas-submit-region} @item @ESS{[S]}: When trying to evaluate code in an S language buffer and there is no associated process, now start R automatically instead of signalling an error. Also, restart R if there is an associated process which is not running. However, do not start R just via the ``electric'' @kbd{(} (@code{ess-r-args-auto-show}). @item @ESS{[S]}: For (one-line) functions withOUT '@{ .. @}' bodys, the end of function is now correctly found more often. This notably improves @kbd{C-c C-c} (@code{ess-eval-function-or-paragraph-and-step}). @item @ESS{[JAGS]}: cleanup/re-organization of elisp code; symbolic links for CODA output are now only created by the new JAGS @code{system} command in version 1.0.3; specify whether this command is available via @code{ess-jags-system}; if not present, then no links are created so that the @code{*shell*} buffer does not become unresponsive during the batch run @end itemize Changes/New Features in 5.3.7: @itemize @bullet @item @ESS{}: @code{ess-default-style} now *is* customizable, i.e., changing its value in @file{~/.emacs} now does have the desired effect. @item @ESS{}: @code{ess-font-lock-mode} is a new variable (default: t) which controls whether font-locking is enabled in ESS buffers. @item @ESS{[R]}: for XEmacs on Windows; another tweak to find R versions @item @ESS{[SAS]}: font-locking updated for ODS and SAS Bayesian Procedures; a more consistent handling of SAS options by @code{ess-sas-submit-command-options} which is buffer-local; portable snooze for MS Windows via customize-able @code{ess-sleep-for} (floats welcome); Xpdf now supported as a PDF viewer @item @ESS{[Rnw]}: now also works with ``emacs -nw'' and Emacs 22. @item @ESS{[JAGS]}: now requires JAGS 1.0 (see the new ESS for JAGS help section for more information): both need work; suggestions welcome @item @ESS{[R]}: [TAB] completion now uses the R-internal completion mechanism (for R >= 2.5.0). @item @ESS{[R], [S]}: interpretation of ``_'' as assignment has been removed in @code{ess-continued-statement-p} for R and S. @item several internal code cleanups. @item @ESS{[R]}: An experimental version of a new command @code{Rgui} on MS Windows to send lines directly from emacs to @code{Rgui} is available in file @code{lisp/essd-rgui.el}. Preliminary documentation is in file @code{doc/rgui-doc.txt}. @end itemize Changes/New Features in 5.3.6: @itemize @bullet @item @ESS{}: for XEmacs, using ``gnuclient'' (without a ``-q'') works for things like fix() after M-x gnuserv-start has been done. @item @ESS{[R]}: M-x R-newest should now work in more situations on MS Windows, e.g., when R has been installed in a non-default "ProgramFiles" directory tree. In these cases, there's no need to specify the name (and full path) of the R program anymore. @item @ESS{[R]}: For XEmacs, startup (with new tooltip code) works again. @end itemize Changes/New Features in 5.3.5: @itemize @bullet @item @ESS{[R]} a new defun is available, @kbd{M-x R-newest}, which will start the newest version of R that it can find on your system. @item @ESS{[R]} add Sven Hartenstein's ``R function arguments tips'' functionality, via new file @file{../lisp/essd-r-args.el}. Note that this includes an ``electric "("'' behavior inside @code{R-mode} which is @emph{active by default} and can be customized via @code{ess-r-args-electric-paren}; i.e., use @code{(setq ess-r-args-electric-paren nil)} to turn it off. Further, @code{ess-r-args-show-as} allows to switch to the ``tooltip'' mode. @item @ESS{}: functions @code{ess-get-pdf-viewer} and *-ps-viewer; built on new customizable variables @code{ess-pdf-viewer-pref} and @code{ess-ps-viewer-pref}; currently used in @code{ess-swv-PDF} and @code{*-PS}. @item @ESS{[R]} Improved @code{ess-swv-PDF} to run pdf viewer only if pdflatex was ok @item @ESS{[R]} Improved @code{ess-swv-weave} to start R automatically if none is running. @item @ESS{}: Do no longer ask @emph{which} ESS process to use if there is only one. @end itemize Changes/New Features in 5.3.4: @itemize @bullet @item @ESS{[R]} now better work with options(error=recover); and the new default of CHM help files on windows. @item @ESS{[R]} some more cleanup in the ``sweave'' functions @item miscellaneous fixes @end itemize Changes/New Features in 5.3.3: @itemize @bullet @item @ESS{[S]} fix buglet (5.3.2 only) which left command prompt in ``execute buffer'' and hence help files. @item new customizable variable @code{ess-display-buffer-reuse-frames} set to true (which changes default behavior) such that execution or help *frames* are reused. @end itemize Changes/New Features in 5.3.2: @itemize @bullet @item Classic BUGS now supported by @code{(require 'essd-bugs)} with @ESS{[BUGS]} and JAGS by @code{(require 'essd-jags)} with @ESS{[JAGS]}. But, only one of them can be used at a time since they don't play nice together. Also, @kbd{C-c C-c} is now bound to the function @code{ess-bugs-next-action} (@kbd{F12} has been retired). And finally, note that @file{essl-bug.el} is deprecated and the replacement is @file{essl-bugs.el}. @item @ESS{[R]} Improved some of the ``Sweave-make'' functions (yet scarcely documented) in @file{ess-swv.el}. @item @ESS{[S]} No longer mess with .Last.value (nor in other ``languages''). @end itemize Changes/New Features in 5.3.1: @itemize @bullet @item See the docs for 2 ways to install @ESS{} for XEmacs @enumerate @item by uncommenting the XEmacs part of Section 1 of @file{Makeconf} and performing @code{make install} @item by unpacking either @file{ess-5.3.1.tgz} or @file{ess-5.3.1.zip} into @file{PREFIX/lib/xemacs/site-packages} on unix or @file{PREFIX\XEmacs\site-packages} on windows @end enumerate @item @ESS{[R]}: fixed bugs so that Rterm.exe can be found by XEmacs @item @ESS{[S]}: @kbd{ess-toggle-S-assign-key} is slightly changed; in particular, the default @code{ess-assign-key} is now @kbd{C-x =}. @item @ESS{[R]}: @kbd{M-x R-site-search} is a new (slightly experimental) utility similar to R's @code{RSiteSearch(..)} but with the advantage of using Emacs' preferred browser, see @code{browse-url-browser-function} @end itemize Changes/New Features in 5.3.0: @itemize @bullet @item @ESS{[BUGS]}: sanely re-format statistical output, @file{.bog}, from scientific notation to numbers rounded with 4 decimal places with @kbd{M-x ess-bugs-sci-round-to-4-dp}. @item The keys for navigating among section headings in help buffers worked, but only for one language per session; they should now work for multiple languages. (They were also broken on Windows machines.) @item @ESS{[S]} long standing buglets in the internal logic for loading lisp code on Windows. Particularly fixed behavior in help mode with S-plus GUI. @item New variable, @code{ess-use-inferior-program-name-in-buffer-name}, which enables using the executable name instead of the dialect name for R. Feature request. @item @ESS{[S]} @kbd{ess-execute-screen-options} now also works correctly when there is more than one window *side-by-side* in the same frame and runs in the correct buffer also when there is more than one S buffer. @item @iESS{[S]} new functions @code{ess-eval-paragraph-and-step} and @code{ess-eval-function-or-paragraph-and-step} are bound to keys @kbd{C-c C-p} and @kbd{C-c C-c} respectively and to the menu in @ESS{}-mode; also bound in the help mode (for evaluating examples). @item @ESS{[S]} new function @code{ess-toggle-S-assign-key} allows to assign the `` <- '' insertion to an arbitrary key. @end itemize Changes/New Features in 5.2.12: @itemize @bullet @item @ESS{[SAS]}: @kbd{M-;} fixed, but the XEmacs function @code{comment-dwim} may be broken, if so, use @kbd{M-x comment-region} and @kbd{M-x uncomment-region} instead; only valid PROCs are fontified which is very helpful finding syntax errors (currently supported: BASE, ETS, FSP, GRAPH, IML, INSIGHT and STAT); the ``feature'' where @kbd{F}-keys take you to an empty buffer when the requested destination is a file that does not exist has been fixed, now the request results in a no-op. Further, sas-mode now also works in simple terminals. @item Rterm/Cygwin combination works under Microsoft Windows. @item @ESS{[R]}: internal calls use baseenv() instead of NULL and define 'baseenv' where needed. @item New experimental support for installing ESS. See the file @file{lisp/ess-install.el}. @end itemize Changes/New Features in 5.2.11: @itemize @bullet @item ESS Info entry and @file{dir} handled more effectively for GNU Emacs users @item @ESS{[SAS]}: temporary files created for batch submission of a region are now named based on the current file; see @code{ess-sas-file-root} for details; all @code{lag} and @code{dif} functions now fontified correctly @item iESS[SAS]: fixed a few nagging bugs, however, still does not appear to work at this time; please let us know if you have any ideas. @item @ESS{[S]}: Support for running other versions of Splus has been added for unix. Two new variables, @code{ess-s-versions} and @code{ess-s-versions-list}, are used to tell ESS what other versions of Splus you would like to run. @end itemize Changes/New Features in 5.2.10: @itemize @bullet @item @ESS{[R]}: ess-r-versions can no longer be customized (since the customization was not taking effect unless customizations were loaded before ESS). Its value has been changed so that it will also find R executables beginning ``R-devel'' and ``R-patched''. If you wish to change this variable, it must be set in your @file{.emacs} before ESS is loaded. @item Installation with GNU Make enhanced: unix and unix-like operating systems will now be able to install @ESS{} for all users in either a GNU Emacs site-lisp or an XEmacs package configuration by editing @file{lisp/ess-site.el} and @file{Makeconf} accordingly, then issuing @code{make install} @item @ESS{[S]}: Filename completion (inside strings) now also works in XEmacs for R and S-plus. @c working around a bug in XEmacs @end itemize Changes/New Features in 5.2.9: @itemize @bullet @item @ESS{[R]} for Windows: the \ directory character bug with respect to ess-load-file has been eradicated. @item @iESS{[SAS]}: @kbd{C-c C-r} and @kbd{C-c C-b} once again work as intended and documented. @item @ESS{[S]}: M-x ess-fix-EQ-assign is a bit more agressive. @item @ESS{[S]}: Imenu now also shows setAs(), etc. @item @ESS{[R]}: R function pattern enhanced with underlying code such that @kbd{M-C-a} (@code{ess-beginning-of-function}) etc now work for many more cases, including S4 method definitions. @item @iESS{[R]}: myOwnhelp(1) no longer wrongly triggers help(1). @item @ESS{[R]}: Improved detection of bogus help buffers: valid help buffers containing with the string ``no documentation''(e.g. contour) were being treated as bogus. @item @ESS{[R]}: In R help buffers, if @code{options("help.try.all.packages" = TRUE)} then @code{?rlm} will list which packages rlm is defined in. This help buffer is not bogus, but instead is now relabelled ``*help[R](rlm in packages)*''. @item @ESS{[STA]}: add ``//'' as comment starting character to syntax-table. @end itemize Changes/New Features in 5.2.8: @itemize @bullet @item iESS: [Tab] completes @strong{file} names ``inside string'' as in earlier (<= 5.2.3) ESS versions. @end itemize Changes/New Features in 5.2.7: @itemize @bullet @item If you use Custom to change the variable ess-toolbar-items, the new toolbar is used in all subsequent ESS buffers. @item @ESS{[SAS]}: new feature: if ess-sas-log-max >0 and your .log grows to more than ess-sas-log-max bytes, just the first ess-sas-log-max bytes are refreshed; this is helpful when your .sas program generates lots of error messages and gets too big for emacs to display @item @ESS{[R/S]}: @kbd{M-;} in R/S editing modes will now indent with either one or two hashes depending on context. @item @ESS{[R]}: David Whiting's Sweave extensions (to 'noweb') are now available (from ess-swv.el loaded by default). @end itemize Changes/New Features in 5.2.6: @itemize @bullet @item Removed non-ASCII characters in a few files. @item @ESS{[R]}: now works better when UTF-8 locale is active; in particular, you get correct directional quotes in R's startup message for R-devel (unstable development version of R 2.1.0) when using environment variables LANGUAGE=en@@quot LC_ALL=en_US.UTF-8 @item @ESS{[SAS]}: toggling of .log mode improved (@kbd{F10}); toggling of .lst mode now also available (@kbd{C-F10}); killing all buffers associated with .sas program no longer bound to @kbd{C-F10} since its a bit overzealous. @item S-Plus 7 for Windows is now recognized. @item @ESS{[S]} (incl.@: R): in auto-fill mode, strings are not wrapped anymore. @item @ESS{[S]} (incl.@: R): font-lock now correctly differs between R and S, e.g., for "_"; both now fontify warning(.) and S does terminate() additionally. @item Support for `bell' aka `beep' aka `ding' aka `alarm' in all inferior modes: When \a is output ``to the the console'' at the beginning of a line, the bell is rung. @end itemize Changes/New Features in 5.2.5: @itemize @bullet @item @ESS{[R]}: @kbd{C-c C-q} or @samp{Quit S} from the menu now should work (again and less klunkily) and do not append @samp{-exited} to the buffer name. Further, the behavior of @code{(ess-cleanup)}, called from ess-quit, now depends on the new customizable variable @code{ess-S-quit-kill-buffers-p} which defaults to @code{nil}. Consequently, the question @emph{``Delete all buffers associated with ..?''} will not be asked anymore by default. @item @ESS{[SAS]} -- ess-ebcdic-to-ascii-search-and-replace will now work with the @code{recode} application as well which is available on many platforms @item @ESS{[S]} (incl.@: R): Name completion for slots of S4 objects now works! @end itemize Changes/New Features in 5.2.4: @itemize @bullet @item The documentation now includes an overview of how to use the emacs TAGS facility for S functions. (The distribution also used to contain a directory @file{etc/other/Tags} where a ~1990 version of @file{etags.c} was distributed; this is no longer relevant and so has been deleted.) @item @ESS{[SAS]} -- When you are working with EBCDIC files on an ASCII platform, .log NOTEs may display as gibberish since the EBCDIC characters are not converted to ASCII prior to their display. So, the function ess-ebcdic-to-ascii-search-and-replace is provided for convenience and is bound to @kbd{C-F11}. This function requires the @code{dd} command (only available on unix or unix-like platforms). @item ESS: Completion of object names is now always done dynamically rather than allowing the option of using a pre-computed database (by @code{ess-create-object-name-db}) since modern computers seem fast enough for dynamic completion. (We expect few users, if any, have been using the pre-computed database method.) @item ESS: object completion in iESS buffers running on Windows was very slow (for GNU Emacs, but not XEmacs) and has now been fixed. Further, it was more or less broken for all versions of S-plus 6.x, and has been fixed to work everywhere but with the Windows' GUI of S-plus. The list of objects now shows unique names also when an object appears more than once in the search path. @item @ESS{[R]}: Completion of object names now also includes those starting with ``.''. @end itemize Changes/New Features in 5.2.3: @itemize @bullet @item ESS: When new inferior ESS processes are created, by default they will replace the current buffer (this restores behavior from pre 5.2.0). If you wish new ESS processes to start in another window of the current frame, set inferior-ess-same-window to nil. @item New variables inferior-Splus-args and inferior-R-args provide a way to pass command line arguments to starting S and R processes. @end itemize Changes/New Features in 5.2.2: @itemize @bullet @item bug-fixes for 5.2.1 (require 'executable), html docs, etc. @item ess-lisp-directory/../doc/info added to Info-directory-list if ess-info not found by info @item @ESS{[R]}: If you have other versions of R on your exec-path, such as "R-1.8.1" with Unix or "rw1081" with Windows, ESS will find them and create appropriate functions, such as @kbd{M-x R-1.8.1} or @kbd{M-x rw1081}, for calling them. By default only Unix programs beginning "R-1" and "R-2" and Windows programs parallel to the version of R in your exec-path will be found, but see ess-r-versions and ess-rterm-versions for ways to find other versions of R. @item @ESS{[R]}: Other versions of R, such as "R-1.8.1" on Unix and "rw1081" on Windows, are added to the "ESS / Start Process / Other" menu. @item @ESS{[S]}: If you have other versions of S-Plus on your Windows computer, such as S-Plus 6.1 or S-Plus 4.5, ESS will find them and create appropriate functions, such as @kbd{M-x splus61}, for calling the console version (Sqpe) inside an emacs buffer. By default only programs installed in the default location will be found, but see ess-SHOME-versions for ways to find other versions of S-Plus. @item @ESS{[S]}: Other versions of Sqpe on Windows, such as "splus61", are added to the "ESS / Start Process / Other" menu. @item @ESS{[R]}: (bug fix) ess-quit (bound to @kbd{C-c C-q}) should now quit the inferior R process, when issued from either the inferior buffer, or from a .R buffer. @end itemize Changes/New Features in 5.2.1: @itemize @bullet @item @ESS{[S]} (R and S-plus): now have toolbar support with icons to evaluate code in the inferior process or to switch there. This code is experimental and likely to change as XEmacs/Emacs issues get resolved. The toolbar should be enabled if your Emacs displays images, but can be disabled with the variable ess-use-toolbar. Thanks to David Smith from Insightful for the S-plus logo. @item @ESS{[SAS]}: ess-sas-graph-view (@kbd{F12}) enhanced; you can specify external file viewers for each graphics file type via the alist ess-sas-graph-view-viewer-alist; also .jpg/.gif are now handled by image-mode on XEmacs, if available, otherwise by graphics primitives as before @end itemize Changes/New Features in 5.2.0: @itemize @bullet @item @ESS{[BUGS]}: new info documentation! now supports interactive processing thanks to @uref{mailto:Aki.Vehtari@@hut.fi, Aki Vehtari}; new architecture-independent unix support as well as support for BUGS v. 0.5 @item @ESS{[SAS]}: convert .log to .sas with ess-sas-transcript; info documentation improved; Local Variable bug fixes; SAS/IML statements/functions now highlighted; files edited remotely by ange-ftp/EFS/tramp are recognized and pressing SUBMIT opens a buffer on the remote host via the local variable ess-sas-shell-buffer-remote-init which defaults to "ssh"; changed the definition of the variable ess-sas-edit-keys-toggle to boolean rather than 0/1; added the function ess-electric-run-semicolon which automatically reverse indents lines containing only "run;"; @kbd{C-F1} creates MS RTF portrait from the current buffer; @kbd{C-F2} creates MS RTF landscape from the current buffer; @kbd{C-F9} opens a SAS DATASET with PROC INSIGHT rather than PROC FSVIEW; "inferior" aliases for SAS batch: @kbd{C-c C-r} for submit region, @kbd{C-c C-b} for submit buffer, @kbd{C-c C-x} for goto .log; @kbd{C-c C-y} for goto .lst @item @ESS{[S]}: Pressing underscore ("_") once inserts " <- " (as before); pressing underscore twice inserts a literal underscore. To stop this smart behaviour, add "(ess-toggle-underscore nil)" to your .emacs after ess-site has been loaded; ess-dump-filename-template-proto (new name!) now can be customized successfully (for S language dialects); Support for Imenu has been improved; set ess-imenu-use-S to non-nil to get an "Imenu-S" item on your menubar; ess-help: Now using nice underlines (instead of `nuke-* ^H_') @item @ESS{[R]}: After (require 'essa-r), @kbd{M-x ess-r-var} allows to load numbers from any Emacs buffer into an existing *R* process; @kbd{M-x ess-rdired} gives a ``directory editor'' of R objects; fixed ess-retr-lastvalue-command, i.e. .Last.value bug (thanks to David Brahm) @item ESS: Support for creating new window frames has been added to ESS. Inferior ESS processes can be created in dedicated frames by setting inferior-ess-own-frame to t. ESS help buffers can also open in new frames; see the documentation for ess-help-own-frame for details. (Thanks to Kevin Rodgers for contributing code.) @end itemize Changes/New Features in 5.1.24: @itemize @bullet @item The version number is now correct even inside ESS/Emacs @end itemize Changes/New Features in 5.1.23: @itemize @bullet @item Minor more Makefile clean up. @end itemize Changes/New Features in 5.1.22: @itemize @bullet @item Besides info documentation, PDF and HTML documentation are also provided (instead of built using "make") and available on the web as well; see @uref{http://ess.r-project.org/, ESS web page} and @uref{http://lib.stat.cmu.edu/general/ESS/doc, StatLib} @item Now that info documentation is available, the README.* files are no longer supported. However, they are still distributed for what it's worth. @item ESS is now an XEmacs package! See @uref{http://www.xemacs.org/Install/index.html, XEmacs Installation HOWTO} for details (specifically, items 10-15). @item @ESS{[SAS]}: more user-friendly enhancements for remote SAS batch jobs with Kermit file transfers (LOG and OUTPUT function key features now supported). Multiple shells now supported so you can run SAS on different computers from different buffers by setting the buffer-local variable ess-sas-shell-buffer to unique buffer names. @item Major re-vamping of Makefile/Makeconf. @end itemize Changes/New Features in 5.1.21: @itemize @bullet @item @ESS{[SAS]}: info documentation now available!, see ESS->Help for SAS; @kbd{F12} opens GSASFILE nearest point for viewing either within emacs, when available, or via an external viewer; more syntax highlighting keywords; more enhancements for remote SAS batch jobs with Kermit; new framework for remote SAS interactive jobs, see ess-remote @item @ESS{[S]}: info documentation now available!, see ESS->Help for the S family @item Makefile: tag now independent of rel; info files made by doc/Makefile and installed in new info sub-directory @end itemize Changes/New Features in 5.1.20: @itemize @bullet @item New `options()$STERM' in the S dialects (S, S-Plus, R). The S program can determine the environment in which it is currently running. ESS sets the option to `iESS' or `ddeESS' when it starts an S language process. We recommend other specific values for S language processes that ESS does not start. @item New `ess-mouse-me' function, assigned to S-mouse-3 by default. User may click on a word or region and then choose from the menu to display the item, or a summary, or a plot, etc. This feature is still under development. @item GNU Emacs 21.1 is now supported (fixed for S dialects, SAS & BUGS), (some from Stephen Eglen). @item XEmacs 21.x is now supported (fixed w32-using-nt bug) @item XEmacs on Win (NT) is better supported. @item Workaround for bug in Sqpe+6 (S-PLUS 6 for Win). @item should now work even when imenu is not available (for old XEmacsen). @item @ESS{[SAS]}: XEmacs-Imenu fix; @kbd{C-TAB} is globalized along with your function-key definitions, if specified; you can specify your SAS library definitions outside of autoexec.sas for ess-sas-data-view with SAS code placed in the variable ess-sas-data-view-libname, also the dataset name is defaulted to the nearest permanent dataset to point; Speedbar support now works for permanent datasets, please ignore first./last.; new font-locking is now the default with more improvements for font-locking PROCs, macro statements, * ; and %* ; comments; you can toggle sas-log-mode with @kbd{F10} which will font-lock your .log (if it isn't too big); submit remote .sas files accessed with ange-ftp, EFS or Tramp (Kermit is experimental) by setting ess-sas-submit-method to 'sh; ess-sas-submit-command and ess-sas-submit-command-options are buffer-local so you can have local file variable sections at the end of your .sas files to request different executables or specify special options and the local file variables are re-read at submit instead of only at file open so that if you make a change it is picked up immediately; @item @ESS{[BUGS]}: font-lock with `in' fixed. @item for STATA: font-lock bug fixed. @item for Rd mode: @kbd{C-c C-v} and `switch-process' in menu. further, @kbd{C-c C-f} prefix (Rd-font) for inserting or surrounding a word by things such as \code@{.@}, \code@{\link@{.@}@}, \emph@{.@} etc. @item new functions (ess-directory-function) and (ess-narrow-to-defun) ess-directory <-> default-directory logic (Jeff Mincy). @item Re-organized Makefile and fixed a few bugs. @end itemize Changes/New Features in 5.1.19: @itemize @bullet @item S+6 now supported (Tony Rossini (Unix) and Rich Heiberger (Windows)) @item New BUGS support through @ESS{[BUGS]} mode (Rodney Sparapani) Templates assist you in writing .bug and .cmd code (.cmd and .log are replaced by .bmd and .bog to avoid emacs extension collisions). Substitution" parameters facilitate "automagic" generation of data...in" and "init...in" filenames, "const N=" from your data file and "monitor()/stats()" commands. Activated by pressing @kbd{F12}. @item Fixes for `ess-smart-underscore' SAS breakage (Rich Heiberger) @item You can change between PC and Unix, local and global SAS function-key definitions interactively (Rich Heiberger) @item @kbd{C-Submit} a highlighted region to SAS batch (Rodney Sparapani) @item New and improved SAS syntax highlighting (Rodney Sparapani) To get the new functionality, set ess-sas-run-make-regexp to nil. Also available in .log files via @kbd{F10}. @item Open a permanent SAS dataset for viewing via @kbd{F9} (Rodney Sparapani) You must have the library defined in autoexec.sas for it to work. @item User-friendly defaults for `sas-program', `ess-sas-batch-pre-command' and `ess-sas-batch-post-command' as well Customize support for these and other @ESS{[SAS]} variables (Rodney Sparapani) @item `ess-sas-suffix-2' now defaults to .dat via @kbd{F11} (Rodney Sparapani) @item Emacs/XEmacs, Unix/Windows issues collectively handled in ess-emcs.el @item defadvice solves problem of missing *ESS* (thanks to Jeff Mincy) @item Improved manual a bit by including things that were only in `README'. @end itemize Changes/New Features in 5.1.18: @itemize @bullet @item New `ess-smart-underscore' function, now assigned to "_" by default. Inserts `ess-S-assign' (customizable " <- "), unless inside string and comments where plain "_" is used instead. (MM) @item Fixes for longstanding interactive SAS breakage (RMH) @end itemize Changes/New Features in 5.1.17: @itemize @bullet @item Documentation for Windows Installation (Rich Heiberger) @item removal of ess-vars, finalization of customize support (in the sense that there is no more use of ess-vars, but that we need to fix ess-cust) (AJ Rossini) @item Many small (and large) fixes/contributions (MMaechler) @item addition of the "S-equal" variable and provide @kbd{M-x ess-add-MM-keys} a way to remap "_" to `ess-S-assign', typically " <- ", but customizable. (MMaechler) @end itemize Changes/New Features in 5.1.16: @itemize @bullet @item BUG FIXES @item Better SAS support @end itemize Changes/New Features in 5.1.15: @itemize @bullet @item BUG FIXES @end itemize Changes/New Features in 5.1.14: @itemize @bullet @item Yet more fixes to SAS mode, (Rich Heiberger and Rodney Sparapani) @item Customize support (for most Emacsen which support it) (AJRossini) @item ARC and ViSta support out of the box, and fixes for XLispStat (AJRossini) @end itemize Changes/New Features in 5.1.13: @itemize @bullet @item Version numbering finally all depending on the ./VERSION file, thanks to Martin Maechler. @item Yet more fixes to SAS mode, thanks to Rich Heiberger. @end itemize Changes/New Features in 5.1.12: @itemize @bullet @item Splus 5.1 stabilized, thanks to Martin Maechler, Bill Venables, Chuck Taylor, and others. @item More fixes to SAS mode, thanks to Rodney Sparapani and Rich Heiberger. @end itemize Changes/New Features in 5.1.11: @itemize @bullet @item More fixes to Stata mode, thanks to @uref{mailto:brendan@@essex.ac.uk, Brendan Halpin}. @item fixed bugs in ESS-elsewhere, thanks to many testers @item README.SPLUS4WIN has DETAILED instructions for S-PLUS 2000, thanks to @uref{mailto:brahm@@alum.mit.edu, David Brahm}. @item Fixes to SAS mode, thanks to Rodney Sparapani @end itemize Changes/New Features in 5.1.10: @itemize @bullet @item More fixes to Stata mode @item primitive generic version of ESS-elsewhere @item Small fixes to SAS/Stata. @end itemize Changes/New Features in 5.1.9: @itemize @bullet @item Stata mode works @item Literate Data Analysis using Noweb works @end itemize Changes/New Features in 5.1.8: @itemize @bullet @item Bug fixes @item R documentation mode defaults changed @end itemize Changes/New Features in 5.1.2: @itemize @bullet @item able to use inferior iESS mode to communicate directly with a running S-Plus 4.x process using the Microsoft DDE protocol. We use the familiar (from Unix ESS) @kbd{C-c C-n} and related key sequences to send lines from the S-mode file to the inferior S process. We continue to edit S input files in @ESS{[S]} mode and transcripts of previous S sessions in ESS Transcript mode. All three modes know the S language, syntax, and indentation patterns and provide the syntactic highlighting that eases the programming tasks. @end itemize @comment @end itemize ess/doc/README.Microsoft.texi0000664000175000017500000000222412423756516014300 0ustar eddedd\input texinfo @c -*-texinfo-*- @comment %**start of header @setfilename readme.info @settitle ESS --- Comments on Microsoft/ESS Integration @comment %**end of header @comment $Id: README.Microsoft.texi,v 1.1 2000/06/29 18:35:08 rossini Exp $ @node General Installation and Use @comment node-name, next, previous, up @section Introduction @include ms-inst.texi @node S-PLUS use @comment node-name, next, previous, up @section S-PLUS use @include help-sp.texi @node SAS use @comment node-name, next, previous, up @section SAS use @include help-sas.texi @node Microsoft Specific Problems @comment node-name, next, previous, up @section Microsoft problems @include bugs-ms.texi @node S-PLUS Specific Problems @comment node-name, next, previous, up @section S-PLUS problems @include bugs-s.texi @node SAS Specific Problems @comment node-name, next, previous, up @section SAS-problems @include bugs-sas.texi @bye @c Remember to delete these lines before creating the info file. @iftex @lucidbook @bindingoffset = 0.5in @parindent = 0pt @end iftex @comment Local Variables: @comment TeX-master: "README.Microsoft.texi" @comment End: ess/doc/atouchofstyle.css0000664000175000017500000001672112423756516014116 0ustar eddedd/* 6 January 2007: - minor cleanup - add CSS3 selectors */ html { margin: 0px; padding: 0px; border-top: 1.4em #000033 solid; font-size: 12px; background-repeat: no-repeat; background-attachment: fixed; background-position: top left; background-color: white; } body { margin: 0px; padding: 0px; font-family: "Trebuchet MS", Arial, sans-serif; color: #171717; line-height: 1.45; /* something smart Eric Meyer said: no unit here */ text-align: justify; width: 40em; padding-left: 15em; padding-right: 2em; border-right: 1px #000033 dotted; } h1 { padding: 2em 1em 2em 1em; font-size: 2em; color: white; text-align: right; margin-left: -10em; margin-top: 0em; margin-right: -1em; background-image: url(../images/logoESS.gif); background-position: left 25%; -o-background-size: 100% auto; background-size: 100% auto; background-origin: content; border-bottom: 0.4em #000033 solid; border-left: 0.1em #000033 solid; text-transform: uppercase; text-shadow: white 0px 0px 10px, black 3px 3px 5px; } h2 { font-size: 1.4em; border-left: 0.6em black solid; padding-left: 0.3em; border-bottom: 1px black solid; padding-bottom: 0.1em; margin-top: 1.5em; letter-spacing: 0.1em; } h3 { margin-bottom: 0em; } h2,h3 { clear: both; } h1 span { font-size: 0.7em; color: #EFEFEF; } h2 span { font-size: 0.7em; color: gray; } h2[id]:hover::after, h3[id]:hover::after { content: "#" attr(id); float:right; font-size:0.7em; /*line-height:2em;*/ color: maroon; padding-left: 1em;} p { margin-top: 0px; margin-bottom: 0.5em;} dt { font-weight: bold; margin: 10px 0px 2px 0px; padding: 2px 0px; border-top: 1px black solid; border-bottom: 1px black solid; text-indent: 1em; letter-spacing: 0.1em; position: relative; } dd + dd { margin-top: 0.7em; } table { font-size: inherit; } /* so that the font-size is inherited into table */ small { margin-top: 2em; display:block; clear: both; } pre { padding: 0.5em; border: 1px gray solid; overflow:auto; background-color: #EFEFEF; } kbd { border: 2px gray outset; padding: 0em 0.1em; background-color: white; } kbd:active { border: 2px gray inset;} img.left { float: left; clear: both; margin-right: 1em; margin-bottom: 0.5em; margin-top: 0.3em; max-width: 45%; } img.right { float: right; clear: both; margin-left: 1em; margin-bottom: 0.5em; margin-top: 0.3em; max-width: 45%; } /* link styles */ a:link, a:visited {color: navy; text-decoration: none; font-weight: bold;} p:hover a, p:hover + p a, ul:hover a, dl:hover a, table:hover a { text-decoration: underline; } a:hover { text-decoration: none !important; border-width: 1px 0px; border-style: none; color: green; background-color: #efefef;} /* navigation menu */ #navmenu { width: 150px; position: fixed; /* f*ck, Opera 8 'loses' abs positioned content within fixed */ position: absolute; top: 0px; right: 0px; padding: 0px; margin: 0px; display: none; /* the TOC script will make it appear */ text-align: left; } #navmenu > li:first-child { font-weight: bold; color: white; background-color: #000033; } #navmenu li { line-height: 1.4em; padding-left: 3px; list-style-type: none; background-color: #2E2E58; color: white; margin: 0px 0px 1px 0px; position: relative; } #navmenu li:hover { background-color: maroon; color: white; } #navmenu > li:first-child:hover { width: auto; right: 0px; } #navmenu > li:hover { width: 298px; position: relative; right: 151px; font-weight: bold; } #navmenu li:hover > ul { display: block; } #navmenu li ul { margin: 0px; padding: 0px; position: absolute; top: 1.4em; right: 141px; width: 150px; margin-top: -9px; /* 1px between list, but with 10px padding */ padding-top: 10px; padding-right: 10px; /* so that the box still overlap; helps with hovering */ font-weight: normal; display:none; } #navmenu li ul li { padding-left: 0px; } /*the links should fill to full size of list item */ #navmenu li a { display: block; text-decoration:none !important; color:white; padding-left: 3px; } #navmenu li a:hover { border-style: none !important; background-color: inherit !important;} #navmenu #toc li.h2 a { padding-left: 0.3em; font-size: 0.9em; font-weight:bold;} #navmenu #toc li.h3 a { padding-left: 0.8em; font-size: 0.8em;} #navmenu #toc li.h4 a { padding-left: 1.2em; font-size: 0.8em; font-style: italic; } /* for IE: with some scripting and these styles the menus also work in IE */ /* Do not put complex selectors IE does not understand in same style declaration!! */ #navmenu li.first { color: white; background-color: #000033; } #navmenu li.expand ul { display: block; } #navmenu li.expand { width: 299px; position: relative; margin-left: -152px; font-weight: bold; background-color: maroon; color: white; } #navmenu li.expand a:hover { background-color: maroon; } #navmenu ul.ulhover { display:block; background-color: #CDD5DD; /* background-color so there's a background so hovering works... */ padding-top: 1px; margin-top: 0px; margin-right: 0em;} /* -------- Requires CSS3 Selectors (O9, IE7, FF, SF) -------- */ /* well implemented by http://www.askthecssguy.com/2006/12/showing_hyperlink_cues_with_cs_1.html */ a[href$='.pdf'], a[rel='pdf'], a[rel*='pdf'], a[rel~='pdf'] { padding-right: 18px; background: transparent url(../images/icons/icon_pdf.png) no-repeat center right; } a[href^="mailto:"] { padding-right: 18px; background: transparent url(../images/icons/icon_mailto.png) no-repeat center right; } a[class ="popup"] { padding-right: 18px; background: transparent url(../images/icons/icon_popup.png) no-repeat center right; } a[href$='.doc'] { padding-right: 18px; background: transparent url(../images/icons/icon_doc.png) no-repeat center right; } a[href$='.xls'] { padding-right: 18px; background: transparent url(../images/icons/icon_xls.png) no-repeat center right; } a[href$='.ppt'] { padding-right: 18px; background: transparent url(../images/icons/icon_ppt.png) no-repeat center right; } a[rel ~='external'] { padding-right: 18px; background: transparent url(../images/icons/icon_external.png) no-repeat center right; } /* faviconize script needs some styling */ img.faviconimg { max-width: 1.1em; margin: 0; padding: 0; margin-left: 2px; border-width: 0px; vertical-align: top; opacity: 0.5; } a:hover img.faviconimg { opacity:1; } p:hover a img, p:hover + p a img, ul:hover a img, dl:hover a img, table:hover a img{ opacity:1; } /* -------- page specific stuff -------- */ /* Sortable tables */ table.sortable span.sortarrow { color: black; padding-left: 0.5em; font-family: sans-serif; } table.sortable th { vertical-align: middle; cursor: pointer; } /* CSS Exp style */ dt span.expdate { font-size: 0.7em; line-height: 2em; color:gray; position:absolute;right:0em;} /* -------- various media styles -------- */ @media print { html, body { border-style:none; margin: 0px; padding: 0px; font-size: 10pt; width: 100%; background-color: transparent;} h1 { border-style: none; } h1:first-letter { margin: 0px; border-style: none; } #navmenu { display:none !important; } h1, h2, h3 { page-break-after: avoid; } img { width: auto; max-width: 100%; } } @media projection { html { font-size: 1.2em; } body { width: auto; padding-left: 3em; } } /* voice styles */ @media speech { title { display:block; speak:normal; } h1, h2, h3 { voice-family: female; } p, dl, ul, ol { voice-family: male; } acronym { speak:spell-out; voice-family: female; } abbr[title]::after { content: "This abbreviation means" attr(title); speak:normal; } acronym[title]::after { content: "This acronym means" attr(title); speak:normal; } } ess/doc/name-completion.txt0000664000175000017500000000374212423756516014342 0ustar eddeddName completion (for R and S-plus): ---------------- Want to keep an up-to-date list of S object names, on which we can complete. Additionally, list-component completion "x$a" also work, as does slot completion on S4 objects "ob@". Historically, for S and S-plus, we had made an effort to only reread the objects of database entries in search() ``when needed''. In particular, for "non-compressed" directories, one had looked at their "modification time" and kept as timestamp. And they were only re-read (by listing the *files* inside !) when the time changed. For R, this is not available and for newer versions of S-plus, with "compiled" (or "compressed") directories this isn't relevant either. ........... I (MM) think R does never re-read things as long as search() is not changed by library(), attach(), detach(), source(),.. These calls are, BTW, given by ess-change-sp-regexp in ../lisp/ess-cust.el (initialized by dialect specific ess--sp-regexp "defcustom"s). How are things working in ../lisp/ess-inf.el currently : o) ess-search-path-tracker is added to `comint-input-filter-functions' hook; it just sets `ess-sp-change' to true when the above regexp triggers. o) Main user functions ess-complete-object-name and + ess-resynch {also sets ess-object-list to nil ..} | call the "main work horse" | |-> ess-get-object-list either uses | |--> [V] ess-object-list or all the following | |-> ess-get-modtime-list {when one of the following var.s "says so"}: | |--> [V] ess-sp-change |--> [V] ess-sl-modtime-alist | \-> ess-extract-onames-from-alist | |-> ess-dir-modtime | \-> ess-object-names | |-> |-> [V] ess-object-name-db | |-> [V] inferior-ess-object-command \-> ess-get-words-from-vector | \-> ess-command | |-> [V] ess-cmd-delay | \-> ess-prompt-wait ess/doc/dir.txt0000664000175000017500000000103712423756516012024 0ustar eddeddThis is the file .../info/dir, which contains the topmost node of the Info hierarchy, called (dir)Top. The first time you invoke Info you start off looking at this node.  File: dir, Node: Top, This is the top of the INFO tree This (the Directory node) gives a menu of major topics. Typing "q" exits, "?" lists all Info commands, "d" returns here, "h" gives a primer for first-timers, "mEmacs" visits the Emacs manual, etc. In Emacs, you can click mouse button 2 on a menu item or cross reference to select it. * Menu: ess/doc/requires.texi0000664000175000017500000000505112423756516013237 0ustar eddeddESS is most likely to work with current/recent versions of the following statistical packages: R/S-PLUS, SAS, Stata, OpenBUGS and JAGS. ESS supports current, and recent, stable versions of GNU Emacs (currently, specifically, the 23.x and 24.x series; alpha/beta/pre-release versions are NOT SUPPORTED). Non-Windows users beware: GNU Emacs 24.3 is preferable to 24.1 or 24.2: these broken builds suffer from bug 12463 @uref{http://debbugs.gnu.org/cgi/bugreport.cgi?bug=12463} which will cause emacs and ESS to get progressively slower over time. @c XEmacs currently does not allow all ESS @c features. Basic ESS functionality however is supported for the time being @c (XEmacs stable 21.4.14 or higher). Due to XEmacs lacking some features that ESS requires, ESS support of XEmacs ends with ESS 12.04-4. This decision will be re-visited in the future as XEmacs continues to sync with GNU Emacs. To build the PDF documentation, you will need a version of TeX Live or texinfo that includes texi2dvi (BEWARE: recent TeX Live, and some texinfo RPMs, do NOT include texi2dvi). @c ESS has been tested with @c @itemize @bullet @c @item R >=0.49 @c @item S-PLUS 3.3-4, 4.5, 2000, 5.0-1, 6.0-2, 7.0, 8.0 @c @item S4 @c @item SAS >=9.1 @c @item BUGS 0.5, 0.6 @c @item JAGS 1.0 @c @item Stata >=10.0 (command line only) @c @c is anyone still using this? @item XLispStat >=3.50 @c @end itemize @c on the following platforms @c @itemize @bullet @c @item Linux/x86 (all but BUGS) @c @item Solaris/x86 (all but BUGS and S-PLUS) @c @c cannot confirm this right now @item SGI (all) @c @item MS Windows 98/NT/2000/XP (R, S-PLUS, SAS interactive only, and BUGS) @c @item Apple Mac OS X 10.4-5 (R, JAGS, Stata) @c @end itemize @c with the following versions of emacs @c @itemize @bullet @c @item GNU Emacs 20.3-7, 21.1, 21.3-4, 22.1 @c @item XEmacs 21.4.0-8, 21.4.9-13@footnote{ @c require the files.el patch to revert-buffer for the Local Variables @c updating problem}, 21.4.14-15, 21.4.17-22 (betas not supported, but 21.5.23+ may work) @c @c @item GNU Emacs <20.3 and XEmacs <21.0@footnote{These releases of emacs are no @c @c longer supported, so an upgrade is recommended if you plan to use ESS. @c @c If you have GNU Emacs 19.29, see @xref{Unix installation}. Also, note @c @c that the `custom' library bundled with Emacs 19.34 is too _old_, its API is @c @c incompatible with the `new custom' bundled with recent Emacsen. @c @c The `new custom' for Emacs 19.34 is available for download @c @c @uref{ftp://ftp.dina.kvl.dk/pub/Staff/Per.Abrahamsen/custom/custom-1.9962.tar.gz, here}.} @c @end itemize ess/doc/stabilty.texi0000664000175000017500000000056712423756516013242 0ustar eddeddAll recent released versions are meant to be release-quality versions. While some new features are being introduced, we are cleaning up and improving the interface. We know that there are many remaining opportunities for documentation improvements, but all contributors are volunteers and time is precious. Patches or suggested fixes with bug reports are much appreciated! ess/doc/installation.texi0000664000175000017500000000440112506744203014067 0ustar eddedd@c This file is not used anymore and is the same as installation.texi @c @section Unix (Linux/Mac OS X/Solaris/etc.) Installation @enumerate @item Download the latest zip or tgz archive from ESS @uref{http://ess.r-project.org/index.php?Section=download, downloads area} and unpack it into a directory where you would like ESS to reside. We will denote this directory as @file{/path/to/ESS/} hereafter. Alternatively you can use @code{git} to fetch the most recent development version to your local machine with: @comment @comment @example @comment svn checkout https://svn.r-project.org/ESS/trunk /path/to/ESS @comment @end example @comment @comment or @example git clone https://github.com/emacs-ess/ESS.git /path/to/ESS @end example @item @b{Optionally}, compile elisp files and build the documentation with: @example cd /path/to/ESS/ make @end example Without this step, info, pdf and html documentation and reference card will not be available. @item @b{Optionally}, install into your local machine with @code{make install}. You might need administrative privileges: @example make install @end example The files are installed into @code{/usr/share/emacs} directory. For this step to run correctly on Mac OS X, you will need to adjust the @file{PREFIX} path in @file{Makeconf}. The necessary code and instructions are commented in that file. @item If you have performed the @code{make install} step from above, just add @example (require 'ess-site) @end example to your @file{~/.emacs} file. Otherwise, you should add @file{/path/to/ESS/lisp/} to your emacs load path and then load ESS with the following lines in your @file{~/.emacs}: @example (add-to-list 'load-path "/path/to/ESS/lisp/") (load "ess-site") @end example @item Restart your Emacs and check that ESS was loaded from a correct location with @code{M-x ess-version}. @end enumerate @emph{Note for Windows and Mac OS X users:} The most straightforward way to install Emacs on your machine is by downloading @uref{http://vgoulet.act.ulaval.ca/en/emacs/, all-in-one} Emacs binary by Vincent Goulet. @emph{Note for XEmacs users:} Due to XEmacs lacking some features that ESS requires, ESS support of XEmacs ends with ESS 12.04-4. This decision will be re-visited in the future as XEmacs continues to sync with GNU Emacs. ess/doc/Why_S-mode_Rocks.DMS0000664000175000017500000000336712423756516014176 0ustar eddeddFrom: David M Smith To: s-news@utstat.toronto.edu Subject: Emacs S-mode Date: Mon, 5 Feb 96 10:03:48 GMT Without wishing to inflame this somewhat evangelical debate even further, but since it seems several people are wondering, I thought I'd point out just what benefits are available in using S-mode under Emacs compared to the usual Unix "Splus -e" or S-plus for Windows: * Much improved command-line and history facility, including recall of commands containing a particular string, and saving of history between sessions * Completion of S object names with the TAB key (like tcsh/bash) to reduce typing * Automatic recording of session transcripts (input and output) and facility for re-executing commands from saved transcripts * A specialised mode for editing S functions, including automatic indentation, coloured syntax highlighting, and error location. You can easily edit more than one function at a time (and continue to use the S command line in the meantime), and do partial or line-by-line evaluation of functions for testing/debugging * Facility for running more than one S session simultaneously If it seems like these facilities would make your life that little bit better, and you have the time to invest in learning Emacs and installing S-mode, then it may be time well invested. If, when using S-plus, you never think to yourself "Gee, I wish doing *this* was easier!" then it's probably not worth it. Nonetheless, more information about S-mode is available from http://www.maths.lancs.ac.uk:2080/~maa036/elisp/S-mode/ # Dave -- David M. Smith, Department of Mathematics and Statistics, Lancaster University x3952 http://www.maths.lancs.ac.uk:2080/~maa036/ ess/doc/help-jags.texi0000664000175000017500000001056012423756516013253 0ustar eddedd@ESS{[BUGS]} was originally designed for use with BUGS software. Later, it evolved to support JAGS as a dialect of the BUGS language via @ESS{[JAGS]}. Since BUGS and JAGS are quite similar, @ESS{[BUGS]} and @ESS{[JAGS]} are necessarily similar. @ESS{[JAGS]} provides 4 features. First, JAGS syntax is described to allow for proper fontification of statements, distributions, functions, commands and comments in JAGS model files, command files and log files. Second, @ESS{} creates templates for the command file from the model file so that a JAGS batch process can be defined by a single file. Third, @ESS{} provides a JAGS batch script that allows @ESS{} to set JAGS batch parameters. Fourth, key sequences are defined to create a command file and submit a JAGS batch process. @comment node-name, next, previous, up @node ESS(JAGS)--Model files, ESS(JAGS)--Command files, ESS for JAGS, ESS for JAGS @section ESS[JAGS]--Model files Model files with the @file{.bug} extension are edited in @ESS{[BUGS]} mode if @code{(require 'ess-bugs-d)} was performed or edited in @ESS{[JAGS]} mode if @code{(require 'ess-jags-d)}. Three keys are bound for your use in @ESS{[BUGS]}, @kbd{F2}, @kbd{C-c C-c} and @kbd{=}. @kbd{F2} performs the same action as it does in @ESS{[SAS]}, @xref{ESS(SAS)--Function keys for batch processing}. @kbd{C-c C-c} performs the function @code{ess-bugs-next-action} which you will use a lot. Pressing it in an empty buffer for a model file will produce a template for you. @kbd{=} inserts the set operator, @code{<-}. @ESS{[JAGS]} does not support "replacement" variables which were part of @ESS{[BUGS]}. Although, "replacement" variables are an extremely convenient feature, creating the elisp code for their operation was challenging. So, a more elisp-ish approach was adopted for @ESS{[JAGS]}: elisp local variables. These variables are created as part of the template, i.e. with the first press of @kbd{C-c C-c} in an empty buffer. For your @file{.bug} file, they are named @code{ess-jags-chains}, @code{ess-jags-monitor}, @code{ess-jags-thin}, @code{ess-jags-burnin} and @code{ess-jags-update}; they appear in the @code{Local Variables} section. When you are finished editing your model file, pressing @kbd{C-c C-c} will perform the necessary actions to build your command file for you. The @code{ess-jags-chains} variable is the number of chains that you want to initialize and sample from; defaults to 1. The @code{ess-jags-monitor} variable is a list of variables that you want monitored: encase each variable in double quotes. When you press @kbd{C-c C-c}, the appropriate statements are created in the command file to monitor the list of variables. By default, no variables are explicitly monitored which means JAGS will implicitly monitor all ``default'' variables. The @code{ess-jags-thin} variable is the thinning parameter. By default, the thinning parameter is set to 1, i.e. no thinning. The @code{ess-jags-burnin} variable is the number of initial samples to discard. By default, the burnin parameter is set to 10000. The @code{ess-jags-update} variable is the number of post-burnin samples to keep. By default, the update parameter is set to 10000. Both @code{ess-jags-burnin} and @code{ess-jags-update} are multiplied by @code{ess-jags-thin} since JAGS does not do it automatically. @comment node-name, next, previous, up @node ESS(JAGS)--Command files, ESS(JAGS)--Log files, ESS(JAGS)--Model files, ESS for JAGS @section ESS[JAGS]--Command files To avoid extension name collision, @file{.bmd} is used for BUGS command files and @file{.jmd} for JAGS command files. For your @file{.jmd} file, there is only one variable, @code{ess-jags-command}, in the @code{Local Variables} section. When you have finished editing your model file and press @kbd{C-c C-c}, a command file is created if one does not already exist. When you are finished editing your command file, pressing @kbd{C-c C-c} again will submit your command file as a batch job. The @code{ess-jags-command} variable allows you to specify a different JAGS program to use to run your model; defaults to ``jags''. @comment node-name, next, previous, up @node ESS(JAGS)--Log files, , ESS(JAGS)--Command files, ESS for JAGS @section ESS[JAGS]--Log files The @file{.jog} extension is used for JAGS log files. You may find @kbd{F2} useful to refresh the @file{.jog} if the batch process over-writes or appends it. ess/doc/ess-intro-graphs.pdf0000664000175000017500000201721112423756516014410 0ustar eddedd%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Introduction) endobj 9 0 obj << /S /GoTo /D (section.2) >> endobj 12 0 obj (Emacs) endobj 13 0 obj << /S /GoTo /D (section.3) >> endobj 16 0 obj (ESS extends Emacs) endobj 17 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 20 0 obj (Features and capabilities) endobj 21 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 24 0 obj (Interactive Processing.) endobj 25 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 28 0 obj (Batch File Processing.) endobj 29 0 obj << /S /GoTo /D (section.4) >> endobj 32 0 obj (History of ESS) endobj 33 0 obj << /S /GoTo /D (section.5) >> endobj 36 0 obj (Conclusion) endobj 37 0 obj << /S /GoTo /D (section.7.1) >> endobj 40 0 obj (References) endobj 41 0 obj << /S /GoTo /D (section.A) >> endobj 44 0 obj (Appendix: ESS Resources on the Internet) endobj 45 0 obj << /S /GoTo /D [46 0 R /Fit ] >> endobj 48 0 obj << /Length 2470 /Filter /FlateDecode >> stream x┌Н█vу╕э=_сG∙ЬШ#^$Q╙Ч╔╠╬vчv6'ЭЮюю#╙1Yr)z3┘п/@PО{█╛И$ nЇЎцт╒ПR╧x┼/f7ыЧК)Q═╩F)g7л_▓ў[╙ єЕ(Єl╣│цaЬ▄▄╕ўk^фяЧK°kВ\╤░▌╖┴-vн ы▐o/ч┐▌|Ь-d╔╩вЖQ0]ХСO┬3═Г╣╖pTъ╠u┴╢н╗╖] Аэц*╧~w╛я╢ Ре╔0КdZШ╬┤OГР'▌Ф│║И7UКu LЧ$└√╚Hфп¤0╕╬сB╒┘W╫lМ_╤╓ЧДЄУuw╓╧╣╬юн√Ugч╝╚ЮТ╪и6у═╬A╝{%Щфz╢9лПЬ┐\ЧD$U2-─,g9h Q~Е=R]╬╩Rс0nЩf╙в ▓иEЎ ∙я}HRЎ╛st}0k┼ъК╠,Y%╩ЩbФ╔ч╣<геп╦╡КЖRE▄L░`b╔єL└▒W<%ёу╒kй^чъ@J▒Zsb)XQшYI|╡sQА╫wЙgв(шЬт3═j┤ HPV,пA]`░\╨ЕпюЖрM\Ю▒y┼+Шh&*B╫ow√5─U╢є¤╜7█ныю югgIыэоў┴аwс▓Б╙}g╟e┐&ьaт■ўv░╞7ZЩnEh+╠"_Я(rЮ▌l╚-AR╔TC G╞\Л оО┬с╪┘╞ГёшYК'Ч°~Иў└щ╨я6ф¤┴ош( р\КоD╘дё╤ОьFHв╧│Gя┬БC│B┐╣н├уьf╝}>Г╩ПюB :Я*@╓ї!ншIZ╤/╥К>J+√бЛ юVv ╙xЬ-тъбк┴ЖfБ╧m ▒¤:▐а▒Дg├гЕ3╜╣P╪К╠ш;·Q.УЙ4╒▄MU<БiяИ╔@░G6Dby╡╝$╪rq¤∙v\|Mcт │╪√─lъv░~6hФо[Нтб─з╓╕э▄wаоrЭ}qНяQv└п╩ь█\вNV=цуРРH╪╛┌эZK╙/ж┴IХї;ы y┬Зз!╪-Ъ╖╘uR`┼Д°Ї╛Пt УўhЄВOШ┤▓+^8T╩v╤иZв)Ъ╣'И!╔nL┴Y[Ў~D =НР>м┘╢о│ ╛IУрrн+БмВ╤OжБЕАN║ЛИВвUрjр╘$дРxxъВ∙NєТГ еФтРIКчW-оZ╙▌яуЛЙ°.4╩╥√ЗДФ|.^╤ф8ОЁ,EIHй8║^эзч╨0hє╙ЫLtнJpxpп8/&^╩3  Гvo@ж 1>В*∙NbAкwё╜@Б-aRВ*│;PC8% Й8═>Y1Юш─Бц4Жp=MКЪ°╘щЁИ┼К#:R╙"(  нг╨╬╙t4 FГтu╢ь╖Цv╠QЙ┌DX5&╤╗│D▀я└$ CЁaF─wБ└фЬ%e╓╦32mKс}x√Тє╔1п!и'╚шA]9oЫ╨>╤▐|cЧVЙИc6╜жл oя╥AoГqщЭ5КК8Є╝╔at╔ё)ЦY█ўЛsўъVЛ╡╡-гJт█r╣еВ|^нTвnшЎ┤ Д╔$TpIA_ЁclЧ *╫aКа╠S╝|`Л№╕║@А]#(пDуl╫Pj* Г▒xйбxС▒xP-хP╗╒YпЎ OSMЩф\ X^kНe:B^eW)!@╥╟╫$├ b$ >.BКlЙхЦцXЧвИ┘╤╞"~п┬Нг@u2ХoЯ!╟Ль╛╬Э\p▒Ў"▄─ kd├│DЯO╚Ь╔Rд3"¤eд}Ж╛`u═юЄДT╔rYе▌Ы9Ё╝Ъ╦Ы3t (-хDN┼╧РуXзgш┼┘ Q(ы╦\_■-ЪюЎп╤yЩ¤╝Лй,╖ьў╛▒й%ЪUJ`══ъ╘{-'╧╩%9╘;LлЗvК`╖Ё>ё╠╙т├┤цИnvё■ц╒Х╧°моXUj░'TЭкЬ5█Л_№Є[>[]ф│П`и╡aЮ3^╫│э/┴ШZдu{▒╝°█Б╓"[Lи╜┼ЮRшY┌╙д>@M┬uYофi╖1ъYе╢ъw9щ╟ф┤У╨e┼ЗБ╧7zt|F(Uа√~ Й1f#<╙ШRL~░╨Уъ!!Цїы·ччы░к└вщ∙їёГ O╟gb╛1├В-ЇЙe0Ш|ь▌╚#К╕HE?▄VUqф5╡ЯcЮл│/v{Gщ╕╬LВСф"╧~ЇvEаЯЎЁЇ╣nИ\╥┴s╞уs┤z)Ў═╢y<я 9╝Z?[IтЁ╧eе>▓dU ∙иУ_> 2чт░s°уbRа╤МОК/oм5╨t╔п$╤5°Р╩/rS╚Аы0ь_жтУ├ыXк?s1uС$ ╤╡щT▄┬- ыu* uh∙g╖)╧▄ЖЮ└НщныZ0:tц└йў.q█Уэ┴%▒╚Л#█йфРКЫMчРlкt╬ъъРSъ йЦ°fУZл┐╧╦╕ьL\эЗрЭ9qT (╩c?¤■─╚Х▐x(аKЙm└┐ оXяя╧TИ+╕ВJзfZS├╟2э?╡O┘endstream endobj 46 0 obj << /Type /Page /Contents 48 0 R /Resources 47 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 61 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R ] >> endobj 61 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [362.023 187.81 512.26 196.465] /Subtype/Link/A<> >> endobj 64 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [479.009 173.115 514.476 182.269] /Subtype/Link/A<> >> endobj 65 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 158.918 165.714 168.072] /Subtype/Link/A<> >> endobj 66 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [285.516 144.722 397.496 153.875] /Subtype/Link/A<> >> endobj 67 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [352.459 131.127 512.26 139.678] /Subtype/Link/A<> >> endobj 68 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [274.623 99.598 430.14 111.285] /Subtype/Link/A<> >> endobj 49 0 obj << /D [46 0 R /XYZ 97.768 692.105 null] >> endobj 50 0 obj << /D [46 0 R /XYZ 97.768 667.198 null] >> endobj 47 0 obj << /Font << /F38 52 0 R /F27 55 0 R /F41 57 0 R /F28 60 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 2409 /Filter /FlateDecode >> stream x┌нXKУ█╕╛√W╠-T╒ИK|fO╢c;ЫЄь║мq╝й8И┬МРб3; >¤"EОd'З\Hа╤ht7НпёцЎ╒OяУ°*NBЭdW╖wWeцYqХеyиtzu╗√gп╓qE┴/M▀от"Ё╗бъЭoV ║¤█OяuqUЖeжqrt╡VEиТДц▌°о_нuQЁП╙╗оwХйЩ╓┌╬Ъ╢┌c/ H\й4xt╜│▌їjЭ(M Ж┌┤ї3O┌С├╙Ш·╣sЭHhvLо№с04░ъ(Т\│Jврqев└╫Пл8 ,╧ъ№┴Є┤;▀╨"4"╬├R+2┬▀┴pжQъqш]sо╓YR╖{ЬЧ)░-│ ▌╪r урnG`Юj╟ ~?t< X├рnЬ3ОО┬-°Ь<╘╓╫"ЕХRгlW╗▐аn<┌ї'W╧ ╥dPo║ЗМ╨y|▌;йаy─¤hzrSp№W{╙┬Ўа]╪%?cу╛5╟=я'v]ГЬ═GSёO╞`у@ёАнG╫ у<ЇЯo`щхкЖф╧s#╚╣гgaПUЪG█ю═<ОыжIHSX╡╡Lиp;ЬД fK')  ╜╟H|b╓из}&^T|╓╦▐wЬр`C к,x═Гмш╢╔┤ЗвЁУныїуЖfg█оўг"Е¤┤xМR┼█Юj^ВI[╗7╒П╬╖ПVжс╞▒їщПngЩЮ▀{╦уўл40ощx╨╔,{З╓Л"U9█T(сyХе╞}МqяdЭг9Rм╙▄╛┼м`eш▌┴T▌Е├┤9Zє@╙┴fМRщЛ╥ш▌f┐°D°ь╗╬5О ╢ч┐й├kn)╨Ўч%сMЧ∙╗■Й╝╬ЫП┌Vц^:O╖{бЯЬ$КИL#╩й^ЖУzaчh*хЁlыl ╠ j°╧O&H+░рЮ╬Ж v╙бIгЩB╤)ЙШ┌Їx·р\гRР═K╚┴s═└│└Ъ(r°cРP Еi@╙ш┐╘6QгEB┐зd,CK7Т_KstwЄ"c╔z[▀я┐│тb╤┤ї█ ╝ёцам^√уБ┤N%Uacgшй|mP@GьдЯL^Оd`Ж°н╩▀╨rи+╢Xkв╡NТoRЮ╓е0ъA╥вЦXШлqсШTOмR9^J▄йМ7l║.х*CN╠╚kzr74'Зв∙5╙╞]─)Й аWC█ВыЁкей├ёш[╩o╨уxДхЕyJi┬M ┌4ў┼╚∙щ└эЪкv╕eA╥рЗ#olїАB)ПЦ%ЯvУ╙н╕,КЯ╣∙vo[ЛПX╚rШєW╢┌Й╜T/╪O#Еф нSTЎcM▀Oи╜s─4:I├2-└┤с#Н ╛`ш└╝С7 ╙╝Dц╕uйоtX(╞NЯЩ'╓W╚KРgн┬·ы(T▒°%N╧▒TЗ ▓щ0Л╙╔┐4Э╗▀ўw_эpЛ├x║pє[▀╤eа&╚X,M╞A·g■С─╜y0▄ЭЖ?`╪ГiD 8,Г·y1∙/П ╝е[╖+╕┬н9Ь┤Qи ╚IКB№■Ъ╛|й pcQТ3│:S▒3шM7}щ══ыН╕▒L┬XйЕ┴╒╜ы╩RQ▌К1╩╤е╪бТlж√3EН1dnW:+┴HiЭ)зTШe┬Mj┴й5╕Н╫╝4°-Ънў;yьу┘кe&щ(ч ╘ }?]ЇGY╞┬{n@F·Т■чrЄ0NуЩю└ ш╚╢Н%ф А╟"╣┘г1S┘Qz 1 ╤[Иn▀t<°║нx┼╛ї■Б╖Jiи0ЄdС0%─┴╫Uч║нeдs═фq├╕'▄*°√*Ш║Б╚╞ТB╔Б°╟*Ж4ф╬Q▒$вxJD$nМcлр жн/6<И"n>┐х╬ч╗9╬╥Ч╞ї'9┘7Hку)yи▀yЎ№э@N"╨╢7ВЦ┘уx╚GFЄqЁRЁ5ПБCp?ЦT ВИ╚░Х9У wV╨=БА/M`'ш▒у h' ┐╝░єhАС/■s[╚МЕkХt─╚$Н╛s╤°ЭРЭvы┌5BЇ2D 45▐ДiDА╢Q╓▌╚ ш╖o╣Ъ¤>vта┬█2AГ[LsС╢╧L─S╡n╦ Л7`╠4q0╪Эы¤X ш8?MAш╞A╜+тТ █qПPD4!XZЖL$╡%╢X о╞*$Б]°U┐╛Аа°№й( 5ЦПй Л(УF^╜╗}їЧ╗l╗endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R ] >> endobj 74 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [195.661 536.174 249.469 547.118] /Subtype /Link /A << /S /GoTo /D (cite.ESS) >> >> endobj 75 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [252.489 536.174 274.406 547.118] /Subtype /Link /A << /S /GoTo /D (cite.ESS) >> >> endobj 76 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [152.528 446.511 205.456 458.213] /Subtype /Link /A << /S /GoTo /D (cite.BecRCW88) >> >> endobj 77 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [208.926 446.511 230.844 458.213] /Subtype /Link /A << /S /GoTo /D (cite.BecRCW88) >> >> endobj 78 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [234.593 446.511 322.767 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJH92) >> >> endobj 79 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [326.238 446.511 348.155 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJH92) >> >> endobj 80 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [351.904 446.511 394.295 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJ98) >> >> endobj 81 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [397.765 446.511 419.683 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJ98) >> >> endobj 85 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [473.739 446.511 514.476 458.213] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 86 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 428.578 121.18 440.28] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 87 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [125.584 428.578 147.502 440.28] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 88 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [187.734 428.578 277.765 440.28] /Subtype /Link /A << /S /GoTo /D (cite.ihak:gent:1996) >> >> endobj 89 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [282.168 428.578 304.086 440.28] /Subtype /Link /A << /S /GoTo /D (cite.ihak:gent:1996) >> >> endobj 90 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [308.768 428.578 423.755 440.28] /Subtype /Link /A << /S /GoTo /D (cite.R) >> >> endobj 91 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [428.158 428.578 450.076 440.28] /Subtype /Link /A << /S /GoTo /D (cite.R) >> >> endobj 92 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [494.212 428.578 514.476 440.28] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 93 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 410.645 148.692 421.589] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 94 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [151.249 410.645 173.166 421.589] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 95 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [211.727 410.645 253.57 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Stata:7.0) >> >> endobj 96 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [256.126 410.645 278.044 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Stata:7.0) >> >> endobj 97 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [338.363 410.645 370.841 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Tier90) >> >> endobj 98 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [373.397 410.645 395.315 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Tier90) >> >> endobj 99 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [490.894 410.645 514.476 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 100 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 392.712 153.252 403.656] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 101 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [156.652 392.712 178.57 403.656] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 102 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [228.399 392.712 279.093 403.656] /Subtype /Link /A << /S /GoTo /D (cite.youn:fald:mcfa:1992) >> >> endobj 103 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [282.493 392.712 304.411 403.656] /Subtype /Link /A << /S /GoTo /D (cite.youn:fald:mcfa:1992) >> >> endobj 104 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [344.301 392.712 440.672 403.656] /Subtype /Link /A << /S /GoTo /D (cite.BUGS) >> >> endobj 105 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [444.072 392.712 490.896 403.656] /Subtype /Link /A << /S /GoTo /D (cite.BUGS) >> >> endobj 106 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [143.531 374.78 198.43 385.723] /Subtype /Link /A << /S /GoTo /D (cite.DTLang:2000) >> >> endobj 107 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [201.623 374.78 223.541 385.723] /Subtype /Link /A << /S /GoTo /D (cite.DTLang:2000) >> >> endobj 108 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [152.907 178.416 258.386 189.36] /Subtype /Link /A << /S /GoTo /D (cite.GNU-Emacs) >> >> endobj 109 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [261.223 178.416 283.141 189.36] /Subtype /Link /A << /S /GoTo /D (cite.GNU-Emacs) >> >> endobj 110 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [342.94 178.416 427.079 189.36] /Subtype /Link /A << /S /GoTo /D (cite.XEmacs) >> >> endobj 111 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [429.916 178.416 451.834 189.36] /Subtype /Link /A << /S /GoTo /D (cite.XEmacs) >> >> endobj 73 0 obj << /D [71 0 R /XYZ 97.768 692.105 null] >> endobj 6 0 obj << /D [71 0 R /XYZ 97.768 667.198 null] >> endobj 10 0 obj << /D [71 0 R /XYZ 97.768 288.354 null] >> endobj 70 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F13 84 0 R >> /ProcSet [ /PDF /Text ] >> endobj 130 0 obj << /Length 2454 /Filter /FlateDecode >> stream x┌ЕXMsЇ╢ ╛┐┐┬GэМ╜СDQ╗ЪЮЪLТI[O:S╖щL╙WтzKв*QvЬ__|Q╥┌█Ї$$AАА№·щ╦W▀┘]╡пJuўt╛л√Cy╝+їaЯ+}ў╘№+∙є.╫Й}?y36╗З╝PЙщЕxЇєdЩ№бц░▀¤√щO_}зОл└Lе√м║KI╘O█єЇo;SOL╛э▓41ЄуGўьz╙╢я°_$oг ╗, ╢┐GЖNъЛMь╕╦╙фсd&+║л├ХQкE│p▒и╓▌ГиЄРЎХ╩Iб╬Og╙╝вЭжпYр1щl╕xб¤Щ┐╡я└LPЎчeumзi┐{P`─7╛ы< Ў<╢╪Hы:85∙Л║┴fт~┴єў╧├ю2Э╝3c▓ Щ-ш5▌УйXа╚Вz┤&╕■48╢k┼_╚Э.~ ї&■=√СЙ┌ў╗"M^q╛эюЦФUЦ№╚<ЩЗ'─1i XЗ'Ж?НнMГGЮ)╥*ЪЛ .FИУEЗуlRъ╫`ёx█0M╞iEЯM{═pq╡iaТ>$oоo<·шН═╓Ї>█бNаГ:╔4╫" р√╧,[ВRяїбва<Ўе*ю╘╛╠8╚Я└ю▓▐yuР:_чгrДЁЛHж ├a`b╟]╧_#▀╕0m╤Aydр╨hoрyж┬┼aРп╬╤ЦU─E ╨SСiс8hY√╬$█T-hW ШбШаАгЦЦ╛яTы`; яEа[┴з"Ъ╞q▌эF╝Д\╕]╫╝ЕЇKпа┼~ дмEОс╧╔╘/є░ VAщ ЭEa▄ш (#ИЇ┴╓]╦═Зf0тkF{CнБ;ЬщЖu╫ +лнк*)DР╦╖йwс╞╢ №┼▌¤fySЮ┐*тp{)єр┌чЭцОG░fR╣Г╞╙вю8С{Сv▌UV|f8}°;■Br╙vй─v'█ИВ\░НNr╤I№З !л╞xB▄ф B┐nA┬╓ї▓ВD┴╤#,B┬B{ёjЫ 6ГмЛm█√iЕ¤e(м["·┐ь▓ ╦ТЛ╜0NаЎчPБ)N8`TgЩфъ г╥░е гBK|├░лрKнПЬА`pSР╞xД44э2Гу│[ВyYКu*╖кКч╤w╠Ф·Ш]wL8тч░╠зWд▒└. яЮ<Х╥ЬЛОAр# У╫╕╝gЯ╩√з▌ єWШ%╬k] lдЛЛ PMe╒ ╥∙0@заSЙ1ь╨}ў╠ФДBRъ[J5┐ Rъ╪Qcwe═X_"Ц╖Ў├>+╬Хd4\╪1╙■O╗їh~!ЇМО╔┴°G╫G▐гo!WнUv▄g·CkЕ j3ШУk)═YЪ\╙╥х ╧ўw"(ЗС╓ Ър╧Z┬ о▄╞ї╦рЎj┼Ю█(Qgымє▄╫╦%Rm^В°▀╔wyv╚У┐└MВЩ?з:╡-№Снмo.ЇА1Q"7лк ч╨}Wн╫\┼Ш_├▓gZъТС╟╖lЕВ╝═Ю▀Пцb║UvЙ▓ў7"1jн∙HvtС┴}ЦВаX┴(╜Е|э;OCo( (╕ JЪT╫EБ╔ОQJюЇН}┤N╖рЙ]╬ д▌сJ┌Ыє√РWТ▀└уg6u}┼Б%д&q4Ёh√*]ОY+*сЙЕ°ю┴,о7)l╘PgVфыУ┼▒·А0o)═їMФ╕р3`'5~s+ZrS]=rS╢▄я╜▄PlVьлв╕Т╙ щ*╜▐╒▌SS╨с'▐╝>а,Є{ЭщцД ╩<╝`LQг╪lкїyшы#0╢o:>ъ"▒>?pn~╢bУ┼JЧРА┌Л.a5р?ШщEцHНR№0ЗЬечZО1VUkoВCЭqнЁу6зQ^┘ЦI╥{ЧхрGnRT M ╛ЕPя Ы√■V_▄E eз0%MвbxЗыр╟v╟╬qЭс╧єfF\■бuг┘!>д/╧╝9╜╜Р╬╟╘╫(┴┘|e/ЄП║18Ж╕#wд▄┘┤н{цС▀kЩK╚ii╝╦t█]ФKwQfь╣Т║ n-ф?v{.┴QyXХ/S9й2]¤^n╙иМ═к"w а┴╢М^к°оTR═ASЄTяUйбк}z${|∙Ўщ╦%g╤endstream endobj 129 0 obj << /Type /Page /Contents 130 0 R /Resources 128 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 135 0 R 136 0 R 137 0 R 138 0 R ] >> endobj 135 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [265.152 230.421 300.907 241.365] /Subtype /Link /A << /S /GoTo /D (cite.RChassell1999) >> >> endobj 136 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [305.118 230.421 327.036 241.365] /Subtype /Link /A << /S /GoTo /D (cite.RChassell1999) >> >> endobj 137 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [448.456 230.421 482.538 241.365] /Subtype /Link /A << /S /GoTo /D (cite.PGraham:1996) >> >> endobj 138 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [486.75 230.421 508.668 241.365] /Subtype /Link /A << /S /GoTo /D (cite.PGraham:1996) >> >> endobj 131 0 obj << /D [129 0 R /XYZ 97.768 692.105 null] >> endobj 132 0 obj << /D [129 0 R /XYZ 97.768 667.198 null] >> endobj 133 0 obj << /D [129 0 R /XYZ 97.768 479.113 null] >> endobj 134 0 obj << /D [129 0 R /XYZ 97.768 267.283 null] >> endobj 128 0 obj << /Font << /F41 57 0 R /F38 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 143 0 obj << /Length 2684 /Filter /FlateDecode >> stream x┌НYKПу╕╛╧пш[dан╒√Б=M3HВLщF░└flЩ╢╣-KО$wOч╫члeyьЩ═┼"Лd▒Xм╟WЇЯЯ>№Ї9нюъ░.╥╗зэ]]ЖeQ▌y&i~ў┤∙5ШЎv╡N╥(°w%-╖у`z?*╡фkWq|Эl7║╛╗'Z╕╨Жлueg&═▐ жЩь0J▀LЄ╒ q`╗Н2▐^М\ю▀ЩГї├Ю┼╢o█~Хф┴Ы▓ЦйG;╕^y╢юeУм┐=¤эз╧Y~Wср<-Л0╔▓╗H╬№uТ)K▌─E√ ў╫▓░J№Ёx╜:╤єЛY;╨▄Уu%a^Uwы╕ ы4nf№▒4дфд >}5ЗckI│yЇл8╪Js┌;%╛8VoЮЛzA9Ш▀∙ й 5сдcЖZК╦8,J▌ї╙уупП┐]KЦТ& Эd░▀5ЫgKЧl>▐bФеaФ╓ч3ТX_╝╕9Йы╧zъ6░и╔°├!Л┼№i kЁnЭTIXD^╜йиў╜Ы╠Wмиг@8Tu░╠с`Жoи░┼┴n√┴ ¤8Їdїпnce▄uУm[╖│▌д+htВGМ╥O═^GFYbNS0УkДМ√▒н1┤ъg\,ь╡3л$┬6╗ОFt>Ltq ╫БACn"╓e"W ╥┘ч╚Є╩Ууn|┐u┤еї▌т█оЩ√G,З>О{!┴Ў╘5,o│▒дglK╟╘в1 ═╬О?╙QUЇ·┘Мvsу█╛Ы▒jМ2╧╜ъ╤h·╢▄╜ZТм>ПёЭ@ЙУыvBС=╕щ9с▓°Rэ╠░[e╨*▌ L┬З,UЬЕ5"┴╥┐╕Ом.M+ou╘╝╕~"4=∙▀▄ Ї9╝ u┤├лk№"ЙWЧ-Є5iПнk╠sы√═╨П║PuЦСЧв#!▐┼╛/d╡╝ь∙YЎ╘╩,Мгф┬Б}Кїгс:╕х$▒аВ,!{А╨ЬЖk@т▄Z∙аiRЄyQ'4{8╡f▓>▌jCпЖ▌У г¤╧Й#лж-ШJи ╧:╟t╜ъЗ°n▄фў╒▄AS╞ы ║4РWw1D└v ─Х┴_I№,╠f├сЫ\!Uл╨ФCвAqВ╛g▒╤!gд/`aщHF у█iш[э1╫°дH╗w╩ырcпёj╕▒тmяuu9╒Єьz╟HЫ╓ э╗┤гу╙jZ╤└JmF °DlТТ ар°м>(▐ТG▓╔?ьдYЇЕrt<ЮО╟~Ш┬k╜WeШ%▒wD cXqс╨Я(gШnD║e№└sЛях;╪COжFэYvЭ# I┤пф╙Эх┼▌gu 7wXиы╓t~JKмZ|й[1m└╪АВгWgхd<рK&ы█r│Д{┴░` |Ь).b;!4$]D"AaЛ┌╤t╙L|п х╢╥_Ш.иov╨Е╝AЭА<─╞Ъю^ZM№aйsуБхLСDi<├:е█d▐NФG7└.rrT$3▐┘їv:▐@╗9Z?D═eШFs@ №x├├kьдNЬЖHфщ┴bщшЕdИDqjЇ▀`9ўr▐ бУX?>oйjЫг*g╨э╞¤B5jnKЩ▀Кк░М/нMНЖЄбk ЕВЗ╒Й┼█▒Ч╓Б*Я╬╟═ щГP╛01БЖ$СUЮ├йыf$щ<∙М{|┼Ш$▌iKтm) j║°Г└ёЙ"-3пиb╙Вy╝7ъdQG}щ╟I╓\РкЄ╒Il·ц─рSс3HУ_FЩЖ╙П╬3aPГп=KS═iФD┬8АmИFШ ▀УJ╡╝&╜ГJ╛╢█п(м7Т_+═m,Г▀ф$б╕Gш@N╡ю╧Д╞`Ы~'╡Ец▓└·hч┘ Цp6]:W9╘- [¤qpЪж+╔\Ї╝єM╜TsV-q^VКYА Ыч\Zk.н.si5█*НИЙв5J▓P·╢oйЁ╞NўR╪Їз %ЩяУ·wг65WBе} Вїe╝┐!╝!McпЇХД╔MDLД}╢!╨╠-d_{╥▄┴зц┘Cв-╣MЯL7╤ЦcxА│у╠K├0н╪Z3Эц▒єО■Ждз^H[_b╜┼]j└i=C*Ш=иЎ№@їЬОы┼┼БшЭD&╔o-╕▐┬А│▐╟╔·Э<ш╩%╙`°я│зa]fМвє д╕Л├!Ь─¤xjЗ9fєФ'>eЖ[в` Б╗$>(╣B9S╣ЯB'%√$╠jz ▓ZЁX№╞┴№ж 1╧┴: У├▀ЛW°Gиc~ГКу№┬в~с ╛Ёя ╓1r╞тйЖ#E╞jK&O+TmиЙ^╘╧S¤HИгt─!S ╡┘╒3q~¤C√`6┌Т└╩йЭ▄╤П8aЗЧ#в<Р> endobj 147 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.235 104.892 184.209 115.836] /Subtype /Link /A << /S /GoTo /D (figure.1) >> >> endobj 144 0 obj << /D [142 0 R /XYZ 97.768 692.105 null] >> endobj 145 0 obj << /D [142 0 R /XYZ 97.768 443.248 null] >> endobj 146 0 obj << /D [142 0 R /XYZ 97.768 356.947 null] >> endobj 141 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 152 0 obj << /Length 1600 /Filter /FlateDecode >> stream x┌uWKП█6╛яп╨-2░╓JвdI╜5mHБ┤hcаЗжZв╫l$╤йlў▀чхG╝A╙93╬єу8ЛR№ЧEMХTЫ:┌lк$kъиюв/QЪФUС{ЙЛх┬KгhЭ╤_ ╟я╧ь,ш Ф/w▀▐YЇл╣√є.Z■-ы`╦·┬Ш╖█╗ЗGQGM╥lD┤▌Gy╛IЄжКК▓ID]D█юЯ°Q?═УZнє2Н│ЯVkСеё╗NяWyяЩl┬╫=п└4╝∙║╩╩XMVЫ╤ВR4'1╔ЯOiЪў*Y¤╗¤ .чuRцM┤yТе┐YО_чКЎиZMчZ▐є}SgГ▄*Л╥ёf╨vРо=ЁNNA┼A?z№яTPо╟ ┴Я╓МnТЦTщёiбїfZХeьН}xД}5B╢бРБПp6И1ЩмШ= ]┼л║ 2╠фH1z ╞╙╞╖∙иИ╩ы ┬S%Н■xЁ∙│╖.oК°Y╗п|Ьh▒дGMjlсЙ▓L'_щ╦бDцKоЭЮNЪ&╒:3ieУ╒║(Є°o ▓ внvzT▌-9r h9;▌kў┬Ырa\╦9сp_4▒5є╘кuk:╩Щи9'ж▄ы╘pП═)В1Ощ╟╔P4┐ъО# Ч ╬╧VMLb пШr╠ЄT├D=тИ ЧtкWN▒АЩX`0Иq8d╞■хмЇ╥-╬╪9Ь3╘■╤L.4╞e (Єрw┘Ц$+Тж(о╘╛dK кФK*▀4%Ed{&^ъБоФгуэ7┼╥б▒)нФ mGЁоВID╢fН ф╙в┤ХGОкуЮHElgЯn0a╥m│T"йBiИ╦Д╩╣iЦ╡иыд╬Є+g?еe┌i█╬╓·j█Ф\о°~Р QVh╔еL4=.┤Ж} ЎО╜Є╚Н┘∙╘НйyЪ'в┴TПъvr║╡╢I*ЦЎ┐ч,ьМяиЎЩ┼ў∙а█├b╢S╙ЮЪX╢КITu■{┤╒qЖ╪╦XР%09┐jШе;)▀i[7═-%5с&[rъYfЄaHєp Иt Ч6С┌ЮUy├AД╚@е2vс░╢vЎH3╬hrф=╨╧qЙГhХ%ьзРdP╨ўЖЪрЩ°╖-BOBQQС ю╜ы╔мв9Уcж'j6bxы ▄\РЬ╟╬░шй0_VBэ╡H┬C3рьшz/r╧М╜/Ъ┬╖╖Пt-йє7ОД7Кh╚iс%?Ўп╖РВyГР!▒щ9▐ЮnЩшє╘1m╧`У╞H2т╟DЯ╒ўбЧNЕУзМ\щ;И╬фє-k%ВU┬ХP:DЧ╜5п╕е╟╢Я9J%Щ│у┼nт<?}XJzчt @СS╠yЪ╠|d╓дdwфTЧ■Э'яh┘TKo▌+0╚=ЁЮКпBЭtфлё╗К[ ╘ЭтВ$Б└ ;йA∙Rы╚6г/чЮ)ДП╨З╪йпО║о╚у.hхr┐yЁа│z^ЁпГПЧЦскB╩0p?=▓с╦$ЮзУ@е$qyёШФXцqНВМ┬Х╝:√O№CБ╧╘z╕Xoр┘Ўаь09\Р╙0G┐x╣є0хЧdзєГо∙+∙s6ЧкжЧу╙М▒Иy╬ б╒д╛╠ЪЯ▌лг╕уи√s╡┘27Q ·aE─Пз╨├ь╩OOв┴п│<╠└├<■ ┬ё╦МЦ №ь ■~Ы7Q%в\F/ ╬┴Ш_■╛Э1ь2UY░├Ц&EЭyщТXwя╢w▀k╘·endstream endobj 151 0 obj << /Type /Page /Contents 152 0 R /Resources 150 0 R /MediaBox [0 0 612 792] /Parent 69 0 R >> endobj 149 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ediff-sas.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 154 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 331 724] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 155 0 R >>>> /Length 156 0 R /Filter /FlateDecode >> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЩъШ(шъYЕМННаJЇГ╠\Є╣БЪ. пendstream endobj 154 0 obj << /Producer (Aladdin Ghostscript 6.0) >> endobj 155 0 obj << /Type /XObject /Name /R7 /Subtype /Image /Length 157 0 R /ColorSpace /DeviceRGB /Width 842 /Height 385 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 842 /Colors 3 >> >> stream xЬэ▌√y█F╓Аqи╩╪к└VС*p╢Вp+╪╕ВP─й`╣|Vr*И]Aш "Vа1bx4Ч3gГ█р¤¤┴g`.AЄЁ` ]№∙чЯ═Wчєy╖█QжLЩ2e╩Ф)S^u∙в я^╜z╒а  Дw?~Ь{$(АЁа*╧┬╗█П_╢m╛]┴M(ч╒вLЩ2e╩Ф)Sж\║ьДwX3xўц■▀o▀╛∙ў┐▀╛|∙ъ|~||l~¤ї°█х╧/П ║║z∙ёЗўodFЛuШ;╓жLЩ2e╩Ф)пл№t╕i╘...ЮЮЮТ╢o~yh√z·їmR-Oxўt╕№6ьs╙<6═╦жy╤4зv═╣]┌┤├:№x:>╝>ш;иL▐ЭN'═Ц╟уёююо яТ╢ ;╝Kя┼3ўюЧ▌▒iv_╛|yx°tsєЎ╒л╦╟╟єххю_ ║mг╜Ч/█иЁr╖{▌n№хЧучП╧т┘Ш.╬╜8|Tn?╡╣PжLЩ2e╩Ф╫R~·їэч╧Я ·ып&жН╡·Ёоu{{┌Єссб▀╛яТzСц▐╜■ЁєээM█uO╗tт╒╒ЛЗЗя▐¤rss╒ОЁЄЄ╒┼!Юf4C║еЗw:]^MУZ▐ї╜t╗m:ц1╝√Щ╛¤Ї■┼х┼хЛW═╖╪ю|>Я■:}|є╦╧ч√╢Ё·╒ю▌╗¤хпкЭoЦ▐-уwe╩Ф)SжLy-хМЁо╦├╡1Щвї·х▀├╗п9B│3Ю│в╜xЎюхq є■║╣№сыФ╗┐#╝▀ ¤щё╙ч╙╙ы╫o^]╜·¤П▀O?■╫мbM04у╣~Йwб║█Вu BkХ-1╨k0${з я|╜Ш╔?│Э@xў<2╜∙Ї■э█╖▌│╟╟╟Пў┐╜█┐<№ўЇщ╟o?╜ Єх╦зЫ├▀█нeехB╗>┤ъC=oV/T┼: r/╩┴}·t °Я k╨╣ ^c-уkЎ.╡Ч╚▀╜√з|w█ЖД▀  К╗Н╣dэц■@Щ2e╩Ф)Sж<д∙╗wXЧgс╓ОЁа*ДwUЙЗw╓Я▌{xxш■Юrшп-k╕m║dw·/l┬Ў┘;Rp0¤0╞OЇАGGUк╟~╣√ч╢УцОMъи/1Kг яфЪС!Z╫▄ йге}х+wd╘╪╬;Шёк╜GгЪ╫АЕ ╝с]▐┬М.fнXИЬЁ╬║rЪqeM√▓yX▀xш+▀╜H┌7┌oяIГiсЭ╗╨М5Bw└├pcюО╗Г═єГ0p╟3fta╒ор╛ФцrкФ6ў╬·▓┤ж╟щ┐з╜_┤▐а'uЮ▐ywЯ6╛└╬[е°Ю& 8iЄ┴СB┴oЬ└KXШ╘ЕY]s"С╧TlhЎю6k╬╛rb╓ьсЭЬxKOjшf╢S$:╔яю╕~ГRп╡╣с`k Дw├у wсb├╗╨р5уШЩВ│М┴╚├Цфїе▄а°kmо"╝lD╔Ё.щ╩▌├╗╝kФBxwыЫ 7$╠;8╤]╕у╩гС║Gйп5с`#f╗╡┬|j~щЪ єтШ█└t7яBaGB▒HУ╗зV,╥°оZЭ уIЖ╡юЁвЭ┘qб}aбж !Zuў"ЇZPЩн№╫ ▓5рlс╢Вs░[ я6ВЁа*ДwUy▐]__?==]\\x///ч-@U╬чs4··№∙єn╖ы╖Ч╦WWW╧┬╗7o▐▌▐Фї°°(мэвп╙щ╘FkЪ╓З├▌▌┘;А┘h▓w]xзЩJw ■¤{▓w│╤gя4с]╗ ┘;Ф╘Э'sПА5Q╬╜{¤·ufx╖═ьAIALТР╜IALТd╧╜є■7жї═╜kў│+t√▄╝k▌Z¤Bєi_┼фm3┤Н╖5═ив{mYm┘\ы=bcю7╞щн└fхeя┌╪о+X▐╩▓wf╨рНэ╠╡r└!?═XWp╤П*'ЕZО)╘▓╗яMюС jДwшe╠╜ыc╗Оснiю]4╬╧ яBYо!c╬Xj┐e╟Ь=l╢)5{g┼vЭ>┬[SЎnоЁ.zqVи._∙Э+╝s╜Mx└x╢√wяъ╚▐╔k' яДэЗПY╙H├┼Y╛┘ЇЭ│ец▐╔u╜╒їУW O╦▐гаЯ{Ч4H═Ш5├&╢а╖ї┐{g▐jр S·╡╤║M°вdjlg>ї╞:Ъ╡ю)[О^V╢Zv/┐sCъАDЫ╬▐YъKН╖GS╢LъА$╩╣w╟у▒▌r╖█ї╡Bх╒╠╜s╒(T▐╒ўв06MЎ.tпg╚j▓w╤ЛХл3▐н▒e╢IУ╜kу┤ЫЫ¤уZ│w╨dяЪ─o5┘;А·Р╜и ┘;АкР╜и ┘;АкР╜и ┘;Ак,"{╖?█╟у~▀Чнз]Yxj╒▓ЁoI└v,%{'─gэ*sб√┤yЁ╣-▐АэXDЎо Дe▐UIO╢fA┘;┬;Ас6С╜ут,╪ОХeямЩvn┼PxGl6b┘╗■╛КОўюК~UЇ6[лRw`SЦТ╜й;░)Л╚▐аФ·│wЫBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dякBЎа*dяАэy+мmOщ╔F@┘; с`∙╚▐ я╦GЎH@xX>▓wЩЎ╟cW8юўcў2j░BоQc,┬;└ЄС╜д ┐╞О╜Т║Ш`m╧║e╢йь┤р°SЫ*╛╫ў`"{Чщ°ъqeЁу╡╝╠~G╒Э╟e+║л▓{)8к▒ЫуHiv`]и┘╗LДwл@xWк)┬;XСнgя┌Шж+XСM╖╝_h>элШ╠ъ¤╞▐╞З┤<╫YWхz¤ЧлyХн▀╪№ъї.Їо╡.╪E[ёО┘ ╦B√"Wt√R╞¤ю╚G)╘{ ц Н*щ8ЗОк╡d╘#й▀г╘Ц5╕: аVЫ╬▐Щ∙*7we-СЯ║-7╧c)}SC▓hуэQФ№ m(┬Z╖ЕдиNшZ^%?═ы"┤}уDlEъfgM>rд#й▀г╘Ц5я╘j╗┘╗Б╤O4╝)╠uПвB▀╡╤8cH`С=кшЦЪК┘7(dяаPwрqЦ72╚дЛ│7А-█nЎОЁN▀oЇвa#ЖwB┼├;w`IбC┴╣hюu╥╨└Ц▐ 9Т╤№\v╦░edяВKяТш│wЄ┌i┬╗дpG▀l▐РЦР╜ыЧд╛ОeПdvHЪЗЛ│j╡▌ь]У2S═ЪKчnя>mtsяR[ЮkПвК╠═Є~▌&M▐RО╩Ы%╥rHЭўЦ]W?Hс8 яТОd╥.д╢мA■@нФ┘╗уёиlp5┘╗Nш>Swн7ъ╦▐@Jh<╗х╣ЎHf]Dє^┌╙мu├ e╦Ъы┬n4cоЄF▐║Єхци■ ЦQ╤к╖о▄мuЬ▌═ФW╪ЛIы┌┤Жf┤мAъ@┼4┘╗╨МаР╒dя╞Sх▀РЫFї Х%ярТ╟V▄жv└╓h▓wmЬvssг\SЎn$Дw┘к ╥]ь.v`АTЪь]Усm={'_Е%z∙╡&╫d╟╢йуAЎа*dякBЎа*dякBЎа*dякBЎа*dяк▓Иь▌■ы┤=юў}┘z┌ХЕзV-  \l╟R▓wB|╓о2║OЫчЯ█с╪ОEdяЪ@Xц]ХЇ`kФ╜#╝n┘;.╬АэXYЎ╬ЪiчV Еw─v`#С╜ыялшxяошWEo│╡Z u6e)┘╗ёР║Ы▓ИьJй?{░)dякBЎа*dякв╔▐ЭNз6 ▄эv▌B╣|uuEЎ`6Ъь]▐╡╤Ъж╡├сpwwGЎ`6╩ь]н╔┌mьЁОь└ФЇ┘╗╠ЁОь└Ф╚▐TЕь@UR│w╖╖╖юf]Бь└╠2▓wVД╫╟v ┘;А┘х═╜ы#<3╢k╚▐╠.{ю]сY▒]CЎ`v▄9 PюЬи ┘;АкР╜иК2{w<Ып▒рn╖ыVЕ╩dяцд╔▐╡хд6ЯЕwзыЫЖ Ащ< я╛\▀Ь>ЭЫ▌ющ|╛╪э┌xТ2e╩Ф)SжLЩЄ║╩vЎю╦ЯчyуM agя■№┤а╪sтЄс·тЁ╟╙r╞CЩ2e╩Ф)SжЬS^oЎюp}y°C║┘dЪЛcэШ ~tЖ▌-ўо┬JЕ^ыe╥М6у╫Я╪╤╞їu═х┘Н╧nтПпщ?aЖў╕┤OEy>╬ЯvЩ╢╨x┌╡▀▄╙у╣╗╣Ьы8фХ╗уує▌═хd╟Нrш▄■■> °╪Я█┘пЛЄ№4▀5цy2═∙╨ЯУэ■■ЄёQ╪Ч╘ё╕ЯB√·║n;╓q6_╟N╖¤╝╟┘:ццїК╗O└ъюc┐▄=п╠╧aяq╢Оз╛о┘oj]╣▀╘s`Ў╧яk7ЎўСun╕п{Ї╜Р¤L[█K▀Чў№4▀┐ц{pМуц}Нв¤ уO-чgяц═ ╕┐Qм%S■ИY]Oxэ╓ХьйUЇЇ╪Ъ░eу№╩Ь°dzьVеi╚'CR]¤ЗТuЬчz╙е~КЪOхSE╕>═9╔╫ф6S√╒Xц╟{Їm2eзCNд▓C2OА╘O╤▓╟-щS7Ї)1p<Щsя·╕RЯЦ¤эв∙}цН╙▌▀═б╝ЕўwбЁ;{iєЎм╠БЫ'░╓║п]ЇXYuC9'¤яwlB.─=■B▌х╝.·▀г╓√лx>Cш7ЪгЄЎk-▐S╩}O·╠╤ ЖхЬ╝mFы╩9∙wywl▌c>ё9ж▀_9г9Vб╫NєїчХ№┘Ы╘яЁМ■╗гH]∙|√√HЯO╩87F:Зїу/°L:■б╧╪9у╝ьЭ`О¤c4╘й№s┴Тжe╦r▌YDs╤ь]┐Vn*╘rи·Р1ы7о щ╛┐ф<КЁ#5щh╕щ▒ь~╜ш╟ ,Т╜є ∙эа▄гд%є8че$ЗУЬё)з┘}·G?░!¤jcn┬▀)╤wJv]═Нt:)ЫщУ!{<Є╞╓wV¤Ы·√Т@Ш$Ї;|`∙sяB┐е▓╦▀╠∙w|й▀Э╤▀C╤¤ ¤vwў╚╩)jЎ7їwГ█ОХЯ╨╧╜ы╢4є1Єя я6╩▀a▀BьwП5■д║л(╗yє|О╬)Сч┴$╜пї¤Z█dчвя═М╧Ь╝\жЄsC┐▄╩┼Ж^▀)╧1wгЯ╜┬{-:OT3ў╬[Ws╜(п▀╘s@sn ЩЛж| ╩япС╛ПвяЭ╨чЇ┌Zи▀шШ5яeс√NИЖ+ў8(є╓ц{P>╧5╟*'{g╞д▀╞▒а▀ЭOЕЕц┌F ┤Т.╥ф'в┘;яЦюы■╜VЙ╠Щ╒╛wB╚uWG╬юx_}R-┌п;}╦├'ОЮ-)ЭМ╤lЬЪJ ЭЦ╤ьь2▓wЪФэ'╡ЬЇъщW▀аwР┘Йm¤╗;:*═┌l▀кй[OЎ6eGхm*5ё▀ √2эф╠╜щ:z┴▀ў┬яц╝▀C╤Ь─rц▐ ╠▒ y>хoаш6I╣Ц╝ё├╝eynVЇ▐╥╘▀▄▐║╩yx·9RI√о №Ij┐°╝╜R╦Щ{7K┐C╬б▀шыЫT7Ї9?√▄;}N}╩╣w┘╟a╘╣wЪkГ▐эл╘ьЭ2s60ъ,2ЖR┘╗сЩ┐ЙEsu┬╠╣ожйF|щCш√ug$дОa∙фь]╙$Ь▐IG#·FV╬ ╥ўC╞йхdЎРў╛>█╖┤ь]шi°▄Ио╩uгэ щW#я{бT2/4АEeяю`┴!щG5ъ{0{TЪэї╥ц▐yяНцZ╞° Э[р╜Ою╜зOy=[╕pБўN╛╧4tм╠Z]▐H▐╞o═▒ щw°wН№╜р=WУъЖ╬█ь√C│єdю╣╤ПM9oO~ХЫr▐Ю√ЩS6▀iУМ~З╟Qk¤пK╦Ц-g0а▒РФс┬√]ц╟{F╬[│т 9╗РЬY┴{З)SжLy╩Є─s■ж╧SFs╖ єРёЁ}D∙{yе┘;xe■▌;╩Ф)SжLЩ2e╩╦,? я▐▀nvM╙чя(SжLЩ2e╩Ф)пн№,╝╗╛╛~zz║╕╕Ё>^^·яЭ@Ює∙Н╛>■╝█э·эхЄ╒╒╒│Ёю═Ы7BўДwe=>J7;w╤╫щtjг5MkЗ├сююОь└l4┘╗.╝ыв5┘¤¤¤√ўя╔▐╠FЯ╜╙Дwэ6dяPRwЮ╠= ╓D9ўюїы╫Щс▌6│w%q0HBЎnD$q0HТ=ўюЎЎЎсс┴jm}sя┌¤ь ▌>wяZ╖V┐╨|┌W1y█ mуmM3кшE[ЦE[6╫zПX╞Ш√ Дqzл░Yy┘╗6╢ы VД╖▓ьЭ4xc;sнp╚O3╓▄FЇг ┼IбЦгC ╡ью{У{$CБсzsя·╪оcFxkЪ{Н3Ж─s├├╗PЦk╚Ш│Ц┌o┘1gАmJ═▐Y▒]зПЁ╓Ф╜Ы+╝Л^Ьк╦W~ч я▄БE/F▐0Юэ■▌╗:▓wЄ┌╔┬;a√сc╓4╥pqАo6}чlй╣wr]ou¤└фU┬╙▓ў(шч▐% R3f═░Йэшm¤я▐Щ╖x├Ф~m┤n╛(Щ█ЩO╜▒Оfн╗G╩ЦгЧХнЦ▌╦п╟▄Р║ ╤ж│wЦ·Т@уэ╤Ф-У║ Йrю▌ёxl╖▄эv}нPy5sя\ї Дwї╜(МMУ╜ ▌ы▓Ъь]ЇbхъМ╖GklАm╥dя┌8эццF ╕╓ь@4┘╗&1┬[MЎа>dякBЎа*dякBЎа*dякBЎа*Л╚▐эП╟Ўё╕▀ўeыiWЮZ╡,№[R░K╔▐ ёY╗╩\ш>mЮ|n Дw`;С╜kaЩwU╥SАнYPЎОЁ`╕Mdя╕8 ╢ce┘;kжЭ[1▐█АНXDЎо┐пву╜╗в_╜═╓jБ╘╪Феdя╞Cъl╩"▓w(е■ь└жР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘;АкР╜и ┘╗L√у▒+ў√▒{╡Л ┤чТ∙┤=пц K@ЎnР6№;ЎJъbВё,MwжNYАЕ#{7с▌ья░╠Я╜ып?Ж.wЪ(╜█╚╫I√╡}/I╤ТY╤;╢╨h√U!Ч╒п╖Л~wб╗Vо█8╫7{}╘m╨=э76├#яBяZ│)M╦!▐1[═mмхКю╪XЛEdям╚Ih╝ёК\╤ Х┴Ц╒r┤w╖7╘▐п╗G┬Sy┤йqз{ЩЩ07+fнu[HКъДохUЄ╙P yг`Fєgя]X╩╠ З\йМI│0#Бзь7┤v╘+╣бx(╧ kхЦЗМ*║%g╡ZJЎОЁN┘п{6){к╜8█ИсЭPq╞Ё╬с` ╚▐∙-3╝╦>PЪ║Q·ьЭ╝vЪЁ.┌ g╡ZJЎоЙ═╜╙D-ЪКyС╓>qю]vx'ўы═ф)зтEыFЩхЪ{'ИnХh]w НШ╜є╢CЖ░F ╩▐э┼;g{┬▌а╤;gC█Дьw░║W9▀╜╜{чЛ╝~Ы└▓▐ЦўБ{c5u╤?ь╜G╒]█Я[й-kо ╦╖═z#╝╝~X▓еdя▓пвNfГ\Е╡д─╓2N, ╩▐M▒╗мbРл@╪└иц╧▐╔ЧVg4фк.L╤╦пааEdяP╩╠┘╗/^Д·&┼Рс|~Ь3{╫Жw▐0ютВЁ ╟уу_┬┌)▓wДwС╜fЁ█Ы?■єщzюQъDЎоАЎл║}╘[w█'U╔ыиxS¤╚;ы PТv┐рa7█\я╤,┘╗22╛нє╛р ЖйMew╜╠P&iT╦▄╝╚▐ХAx7F┼Q▐j╡╤ь]╣н ┌Ў~╦WQ═╡nїш╪!сЭ╨x╞Ш▌*╓ыЪм╖}s╖бв└[=╗w└·#й|}5чU┤GyTцf╛=`├┘;ыл╘¤ 7Яz┐дн F_W^о╢╖Сь1╦G, Cо8кшиїСl╘пoЇ╝Є╓RО*4L═▐5╞з7╤НН▓╫╩ ї├v$oT╤РT?рЕДwЦшиКI∙╝zWА(MЎюt:uO╧чєn╖У╦WWWл╔▐Н▐╣▌╒▐╣╗\$Fxq6uTДwА:h▓wmx╫FkЪ╓З├▌▌┘;╒WЄ╥┬╗~Iъ╒фд└q2гZKx╟┼YАLЩ╜ыг5Y╗Н▐н4{╫$~г7bfиь┼┘fД╣wц├╗╝гQЬfT═8sя&яИэ}Ў.3╝[fЎю╖ч7EZяf╩F▄╡┬rя╤a з▄Э│юfB╪! ╪┌Y¤╤Х0к╘#й<7вчХ№ъ[m ]▐█═▐┴Л╠╨┬ёв6Ъ╜ГбШ?{jЛЁn2ЄЕW░.3gя./Гс2╠Ь╜ы -К8Я╧єfяяJz||╓Т╜X▓wU!{З╩╡gЪ∙Їй─-┘c┤йь┤р°SЫ*╛╫ў`"{Чщ°ъqeЁу╡╝╠~G╒Э╟e+║л▓{)8к▒ЫуHiv`]и┘╗LДwл@xWк)┬;XСнgя┌Шж+XСM╖╝_h>элШ╠ъ¤╞▐╞З┤<╫YWхz¤ЧлyХн▀╪№ъї.Їо╡.╪E[ёО┘ ╦B√"Wt√R╞¤ю╚G)╘{ ц Н*щ8ЗОк╡d╘#й▀г╘Ц5╕: аVЫ╬▐Щ∙*7we-СЯ║-7╧c)}SC▓hуэQФ№ m(┬Z╖ЕдиNшZ^%?═ы"┤}уDlEъfgM>rд#й▀г╘Ц5я╘j╗┘╗Б╤O4╝)╠uПвB▀╡╤8cH`С=кшЦЪК┘7(dяаPwрqЦ72╚дЛ│7А-█nЎОЁN▀oЇвa#ЖwB┼├;w`IбC┴╣hюu╥╨└Ц▐ 9Т╤№\v╦░edяВKяТш│wЄ┌i┬╗дpG▀l▐РЦР╜ыЧд╛ОeПdvHЪЗЛ│jе╠▐П╟цk,╕█э║UбЄj▓wM╩L5k.Э╗╜√┤╤═╜Kmyо=К*27╦√uЫ4yK9*oЦH?╚!ht▐[v]¤ Еу<0╝K:ТI╗Р┌▓∙?╡╥dяBЧМB╓С╜ыДю3u╫zуб╛ь дД╞│[ЮkПd╓)т╜┤зYыЖ╩Ц5╫Е▌h╞\хН╝uх╦═Q¤,гв9To]╣Yы8╗Ы)п░?Т╓╡i+ ═hYГ╘АКi▓w═╫ло777╩╟╒dя╞Sх▀РЫFї Х%ярТ╟V▄жv└╓h▓wI▒]√╕жь▌Hя▓U е╗╪\ь└й╚▐Х'_Е%z∙╡&╫d╟╢йуAЎа*dякBЎа*dякBЎа*dякBЎа*dяк▓Иь▌■xlП√}_╢ЮveсйU╦┬?Ч█▒ФьЭЯ╡л╠Ею╙цy└ч╢@x╢c┘╗&ЦyW%=╪ЪeяяЖ█DЎОЛ│`;VЦ╜│f┌╣Cс▒╪ИEdя·√*:▐╗+·U╤█lнH▌АMYJЎn<дю└ж,"{АRъ╧▐l ┘;АкР╜и ┘;Акh▓wз╙йНw╗]╖P._]]С╜ШН&{╫Жwm┤жiэp8▄▌▌С╜ШН2{╫Gk▓v;╝#{0%}Ў.3╝#{0%▓wU!{PХ╘ь▌ээн╗┘├├CW {0│МьЭсї▒]CЎ`vysя·╧Мэ▓w│╦Ю{╫FxVl╫Р╜Шw╬TЕ;gкBЎа*dякв╠▐П╟цk,╕█э║Uб2┘;А9i▓wm9й═gс▌щ·fДa`:╧┬╗/╫7~:_ьvm$┘ьvOg╩Ф)SжLЩ2e╩k+[┘╗/ЮчН70ДЭ╜;}Ъ;▐\j∙p}q°уi9убLЩ2e╩Ф)SЎЦл═▐о/H╖вL╙`ёaМкэ?Е╪Ш╗-▌═·4Н`vб╫qЩ4г═x╟ 9iCu═х┘Н╧nтП/¤ч╧rzЬ~╠2y+╧Oє]cЮ╙╝П·єн▌_с╝║√vЎ∙м╨Я╖B]╖ы8Ыпcз█~▐уlsєsр╬∙фw▀у¤6эrў╝2?З╜╟┘:Ю·║f┐йuх~S╧Б┘?╝п▌╪▀G╓╣с╛юЪўВўЬ);╢ЎШШп╫Рў~Сs├√y╒┐v╞УС╜│т═&и▄!═8цAС▀ ы╩ нNЇЇ╪Ъ░eуфиж ╡ъ▒[Х:д!Я IuїJ╓qЮы▌Ф·)j>ХO!ў═p╚╫ ф6S√╒Xц╟{Їm2eз·╧л▒п╣╣ямё>═внЕ>п╠╧ББу╔Щ{Нy3~C,k~ЯY┐│Ыoq¤?╟ў∙яЮ╨ЄFЭ\╬╝=sД▐¤║є 7П╥ ¤╢хЎмМEш8[э[у┤О╣r┐4╟─╗_ycїuьу ┐єц3Д~г9*o┐╓Є╘╫(Ъ{pПIvО╩ЫsЄ╢н+ Оws▌6цqvП∙4Я▐}СўW■^╨л╨kзyН·єJ■ьMъ7у№Q~зД>╟╓UцНF·>╥ч▐Bчs┘є<·Zы▀┐▀│╤╝ЭЁyе╝Ж-ПТ╜Ы7y║Ш- юl┬A╜░0┌▓\w╓ф oк ┤╓jD°Б(мїnSъiъTШдLI╥и╞у■╝Ує(┬Oчд1╗?7│√їnаГ░|HЎ╬{4ДCд▀гд%є8че$ЗУЬё)з┘ЕьдО0░!¤jcntЙвшhR]═Нt:)ЫЭ,│и?mКў▐┐m┐/IO╤е~Ч╣r■юЭЬ╧k╗у│rlЎ■Л┐уK¤юМ╞у┬oG∙╖{С¤═;╬ю▄D37f═√ хсЖ╠╜│╢СчРYc6ы║}╔c ¤ЎЎ;d╠уХ▌╝Оy> ╣ я╣ЭёЫ█╩3i·╒№f═■▌/╠зI:Rєd╩╣;╩хV.6Ї·NyОy╧∙│W°^И╛_4sяBЯ╤\H^┐┘yЪБє2│ыz┐яж∙>К╛wв▀ ┬|Mo┐╤1G╟#_╙╦ы╫√·МЄцЫЕє<щ5кpю]^Ўn`.ЪїY╬!ЄNЛщЧ(3Ry┘;є╫╠?KЬaлДtЭ░qФ╨яР1ПG╬ю╕nЪ`&└╗Dю╫Г╛хьЫX4Л6KЎ.i∙РQНЄwяJ▌ўQ0v~z~▌┌═]5▒√4Яэ▓s ^╕piўN╕7╓Ъ[у╬Yё^√ЧПХ╖}ў╛░шy%▀ыоU▐ 8д▀ дp Ч╗_┬{б╦ y╖q▀S▐c.№m3бЭ╘▀гю╩юШ5ўtkЎ+Ї~Й~&═ыrg0╦╟YєНwОЕ▐√n╬)t<▌╡I╟J■╝Т?╧│√■]#/x╧╒д║бєVsнй°wКў¤u▀ ┬~ Ы0╖пь√KюWєyU ОкЄ┐V,-[╢Ь┴4&ЩцR¤XH╩pс¤.эу╜УС3F}к¤Я│ ╔Щ ∙]8RyЎ▄ъ╟╝сfPж\т│b╩ў╤Їy╩hюvБc2Ю~Qп\gЎ!╓=;╒№Млu┐╚Рєwя(SжLЩ2e╩Ф)/╖lЖwяя? їэЪж╧тQжLЩ2e╩Ф)S^O∙Yxw}}¤ЇЇtqqс}╝╝Ї▀А<чє9}ЭN'}ГWWW╧┬╗7o▐[▐Фї°(═я├╗6Z╙┤v8ююю╚▐╠FЩ╜ыг5Y╗Н▐С╜ШТ>{Ч▐С╜ШRvЎюЎЎЎсс┴jНь└╠Є▓wml╫мПь└╠Ш{PeЎюx<6_c┴▌n╫н Х╔▐╠IУ╜k╦ImТ╜ШН2{з╔█ue√╧У╜ШТ~юЭж5╧Я5&{0%■ю@UЄюЬM°├(dяжФЭ╜╙■Yc▓wSтя▐TЕ╣wUQfя║?kмAЎ`NЪь▌а?k А╡#╝и╩▀сЭ■j..эR.ю 5зg] endstream endobj 156 0 obj 56 endobj 157 0 obj 11979 endobj 153 0 obj << /D [151 0 R /XYZ 97.768 692.105 null] >> endobj 148 0 obj << /D [151 0 R /XYZ 265.639 477.317 null] >> endobj 14 0 obj << /D [151 0 R /XYZ 97.768 176.365 null] >> endobj 150 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /XObject << /Im1 149 0 R >> /ProcSet [ /PDF /Text ] >> endobj 162 0 obj << /Length 2622 /Filter /FlateDecode >> stream x┌╜╦О▄6ЄЮпфдF▄▓▐ПclМ┴╞ШЩь.░▐[т┤л%ЕФ<ю¤·н5¤r░з=tЛ,Лїо"▀=¤ЁЎCZ▌╒a]дwO╧wuЦEuWфeШд∙▌S√пр0Z╜┘&EЇц╦&О▌7E╝A`╠Э▐─ypd┼╕QЁb═<ыБбF╛К╫▄мfуf╙и^рГъП╬89Fmт`╪/j/ч╬ЭЪy4¤СiX¤чbмvЮА?h╓v▓■хиещEP▐l■¤Їы]&Y}╖Н╦░NТєq│═грg·ЗqBжi ╪@jф╡Ф╞a╫wэ{┌д1lГ]2Є╪лRУ(,вD╨ЙhМ┐UЁO:я╖[GФI*{>n╢EВL┴ зk·q╓u,╕╫▄a│kfпщфaT√3Cd,~╤Г╢hз4NГi▒╙ш4N20█╚ёkP╙и╖WЬ─yVE.'№NЄkЛJLK╩ЁqаН^єШ"]4* :zEп─ ╨"F╧GЖe&х╣Гe╩B░╓МЗiЩ7ШEЎ ЩХ√т№yM┐┤▓"╟лЖ░_5─╗Z5 ├'yНf-зЮ│┤sо' 2;В8KbР═ K╞IДэz═2*@╬Н Кс╧╦╨╠f<ё5VOqf%vбSDў==| h·p& ЫНЙчh╚║ЩЭцк▒гs<>,¤l&:2';А O░I5_╘└ф*─ЁSgd7╦а═Р▌Q╬h┘:8v▌hчfЩeУЁвщ┤Еъ└en╚╤4║╫>ь╙"╨нПRШ░ ┴ч(Jz*@р╠T]°в√ЮG▓;Є╫{╠Jч┼╠П░Д╥`RЇ░Ї╩Є▄!╖з╡ТpP;Zиг¤ ·jм╦Р}oЛ╞fW0└ЯXЖ┘О=OH6╩} o╟eцАTх╨кjh|Єb 0¤q `╝їЛBЗ{sС╥▄дгzєЯJAV╖f7`>Рг;▌O<▀╚z╔I╓+2(=╙w<#mт@V┘б;ЬОЄшЛCI═▀╥ зыrХеa√┬¤╒е?д_╧"L╩╙ъT√hГ3р╨ШЗлЬ$Vъз╨╫╦Є▓ A.W2яPФ?~┴и╫вAяF▒√ЙN╢Т_K(ыщyВEuС!кB╥& vjжRUС;5мMН0ЦeщН╞"NТ░╠╩ ╜J├,ў}Кdв°/;ат ▄┴О╠█¤ф4ыГZ~~x╧vы*■╛Б&╙<╬К Lk╘├@▄╥ыyюь╕ь;6JВ■Ь╘ч-И┘w=№n4bП-9┼ ╖hТ"Ля░й╔sB>═├мц0IC`,Ов2,▄ Є▀&оэ.i╘дv╪ЭXЄTW▌╤$ сb└J>3:qГy4╛`=═Яs▒Ш╢P('Ё ц\p#єAерkЗsс4Y╞╒┌lwВMUЛўс@m┬░\╦б╤╩Q'├@ю┤Ё╜ИDЗ'jїА,КХl╢KCэ\СS╚ЭVХ@бЮh╦▒▄Є╩ h┤н├<Ш%kккя¤ Реё,cdШЦA0 ┐┘ЙkР] |5nG╘░┴tIН┴ў s Jш░м<щ═└═{╠6Й┘ сф ╡╠уAQв {Уjб╔-H╠Gу4wЩ└JУ5╘э"АQL╤╞2╦ПЇ"╝Ж╓с>дЎнч╧IR╠h╣k╣Ъ^-NУюъ2ш╟q"ea┬JRоIUЮG4XU╗╦Z╟*zЁЕCЬцTV┤ТажМюХHр╚Ё│QQч P8з▒fГпGФЮ^8МЯo7┌A_Б╡Є╫Ж╙4Т_^Ю│zэл}хц/ЯД╖ь╒h┤8O╕ч°╬я*И│ВУs w3Я&Я┴,█~l╛lшWQ 5%Нлїк╚бT'pйN╬,Ї┴ьЄди№Ф╪Ьazq е█АO:^ ЯМ╩WV8╖р^└~╜=░'№Q└ы▐H╨╩ZrFДVЭqRГю┐╟═ХfаЗQфЕ5╧╫┌╪fдє№\ЇХ а\ж╨,a3╫ёDёзI$▒ЇА1Yм╗Ф+╦ФмЙ_юiJ ╨{Q┐╬Бэ &▄\o1░МщK ╣hh┘и╜иDА╩O9ЇtуУ╒-╤│0п│┐ъXV·7у╪▓игвJII!╩Чm╓ярДЬФЄxYH[DH▓СBфJR7▓ xw┬√?6Ц╗ыPbлp▀Ю┐Ж@Ъ√ў─▄┐╧ф╖j&∙KZaБ╕╪х+К P~╗@9IЩx6лGg?N1▌╤+ы╣Я1{O|@ 9╩p╪se$GД▄H╢!> endobj 165 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [140.783 307.009 147.756 317.953] /Subtype /Link /A << /S /GoTo /D (figure.2) >> >> endobj 163 0 obj << /D [161 0 R /XYZ 97.768 692.105 null] >> endobj 18 0 obj << /D [161 0 R /XYZ 97.768 443.248 null] >> endobj 164 0 obj << /D [161 0 R /XYZ 97.768 415.326 null] >> endobj 160 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 171 0 obj << /Length 1487 /Filter /FlateDecode >> stream x┌н╦О█6Ё╛_бгмI╘│@щ&┌K╥мБТhК╢╪Rв#╔┘╕_▀щ╡c7@Бb╜цp8ЬўГ╬в■▓инY]5QU╒,kЫHw╤Ч(ee]ХН#9З├iEIЖ▀ю╦эЯП3╧┘c╛▄}Зx∙ыРGпэ▌яwQ°Ь(XЪf└:oXСg╧╩TЬ]°й┬ EХ─9жНТТ7моk$ e}ўЄ-oвЦ╡П╓█р<▐rVч╤║√┐╒╗├дVI▐Фq■╙*сu ▒j╥╪у┤1ЗyЩ─тў╜ ╘Ozщ ┌┌qХ┼╦L;1vHkьР√¤dўУ>ё┘┌ Б"g─vz▐q\Ue╠VIСё╗╤sбecД№ы;aO╜╓Я╫┐Б3Тмf-╕э[╘4шQ░,oт'Еk?н▓4╢╙·0+6 1▌=ь @ПЭЪ `ЇиЙiГ8а╛\CO╚Ce@h>>~╛Ц╔ ╞ЛР╒▐щ└П┌hШИqm■ЫЫ>Є░Д∙їФ3▐\║Є▄рYHr┌8s`%~lьS╘├л<;│шFы!uы╡|ёс┼╡Y┼2(░нжE╝╛╒^r╬`6¤8c9kЄР╘Г°╙% ищ▌Р{Нykо¤^▓┤ми,№░(ВАлpв╖╝╫ф$╢n░уfЇРр7╨bФр8е@фu╦▓в║Дъ4F ▀█u ю└ъж}хmсi jP├FM■А▐╛Аў/║┤ │Яє├р╧+▀ю▄Г{╛}МбВё/Б2> endobj 158 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./font-cor-s.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 177 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 221 721] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 178 0 R >>>> /Length 179 0 R /Filter /FlateDecode >> stream xЬ3╨3T0A(ЭЬ╦U╚UdШШы)шXшYЪEА,и ¤ sЧ|о@ Оl Дendstream endobj 177 0 obj << /Producer (Aladdin Ghostscript 6.0) >> endobj 178 0 obj << /Type /XObject /Name /R7 /Subtype /Image /Length 180 0 R /ColorSpace /DeviceRGB /Width 858 /Height 263 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 858 /Colors 3 >> >> stream xЬь╜Ф╒Хи{*╟?з■;╖"Q${М┴6 "gуД╙`{юЪЩ7Г┴BуЩqА┴А╔Y !ТBЙД▓ZЭ√╧йr╝√Tu a╦яzЁ╗ы▌;л6м╜клNэ│╧>ї¤√Д"FЎ╛D▒ ═ гcЭb■ЦGУ╡'dIч▄ЬнЛ"Y$ЙD╟t=Ъ&Xd┘zВхH▀r=╙єMD╪y$вВ$! ∙4Bс√ИЁр"LЯ2ёБ╧рK°j °кГ°dpХAИtI╧%]Ч┤Ъ╡А┬лlа√pъ┼U;$a╙ЮGа└Ц@C▒}╟3g╚¤ъл Єт╣И)#R ╬╚╔с С"ї╨gЯ└╫<2мОDn<0^х░YlZс╠╕ !Аx└%( нгъ°ТЫ└gpэ&в:╕ NkкэУОчs>вёэдюSm\ЯЫAЬ+C▀ю╟g╪q\й'Р>E∙\ ═дg}Ё№Щpa <\Н<╨$Й┬О░'├Ау> ,БWj+Мg+~6АСDI$СD╔√П ]╡їйB╖нiUСI█Ъ E╙┤IFAДп]и╔Л√Ё:Ж710эQ Q.ЧЗЖЖJеТ EЖAТф* К▓u═ЇNЦ┘Trя╚0╧ИЙ4еЪ{Б:c>re Dк$▓=╥еx▒\iЎч╒k*r9ю#vRQыJЭ< ▄Oуco╨,Я╧ў╕H╥d╗(Юh·и╠°I╫ф)* ф┬┐rP/vр·р┐ыэ,А┬Н^h*░╢╬▀gК╙│Шї╬С╡4&И9кcLЇу.г aф!╬T1╤Б?ф~AЭ┴AWC╬╪Эm2Йf№ бkЎxц<`мЬa▐-щHG:╥СОtд▀ЧvgдтбНD╫9`*з╬б╫сH┬Ef▌╢iЦ░mЧc╟є|▀е)ЦШбЗ?п`└ ░б╤P$Щ╖M=&╟\пCУ Д8фfj gpлб╢cRжг81Йъ(W;∙<ЁМї█▀▄їW ╤nО╟┘Ч_}╗▌)яр╔й╔Б∙Нvk╖LзhВgАLm]▒6е▓1ПуeOУhB─I'▀▓m╦q└!ВB C !¤ауbw g?рЛс╢т╝ZШ"В╘аЕУs>]"╚╠с╗А <°Yъ`Xёi h╥cM°тчТ>╪ўp&r&<B┘╗Ъ аЗ о╟ДЗяE,щ╩°Шjxд╬y╛@:i╧чHBўHУ$Tl┴уА~}"и ╩АWЁS6▄Л╜┬aЁ'╨>F3Ь┼ }2ш./Ё$8MgP╨"|>╝J╛AЫudСЫ╞Цш*╞l╗ИSxtg=БЁi╩╟щQ╕ua4а]dШЮ ┴Т ▓Ж╠LwБKщCрyxь)h"└kЯ'эрj╨b╗#щHG:╥СОЇ√╨╛╘lК╔дly╗╞@ok└iЮРh┘A'}<╔GLРMЇ K;ьЁГ╞F'╢я╪zфG√╚gXJреЩб╘ўhG7┌ОM0T┌▒¤╣єzuнг(jз=OЫ8;hБqDv0hсB ▒ЮкЩЦAuхчЄLrўЮ╖ vr`и√╤√╓.╜с?ИЧ6н·└?Є°К╒Й°a╢┌ 8fcв`Ж└С╝уXоп!╓p)╒жuЖe╡6с{┤я√A╨4MQ ErИа]g├№`tuv\╥ЩсB#CLт6SMl╔╔В╟б/ГЄФ╖/Jь╫^?И9О╞МЯИ╞а93░ю╬─Ы╜Ч▄oD╪ ╨▄Щ¤%│┐┘H"Й$ТH"Йф┐.^Мб8Uo"╘f)СF ╥N╦bL3з0$Ц╨ИG`"┌aYzxя лC=TQФr╣▄╒╒еы║я√мАh╙"I'э:>AлЦ▌╓u╗з'б#д╟ kgС╚p`┌┬I╓r\7Щ(Цж┌жJз2bў╢:╙o╛╝ч√╫ РP█├вФZ╖с Sя┐°▄╣|[█В\Гє 45д3И═з╙ЦgО6G}╘╩жSЦнШЦG I └ДЦA┌ОC╙ВЗq╨ЫЩ█ЗN/0y<ЄdМ8√хРтаНHг ЮУG!┬╞oE $МГдI ╨жlЬ═ ЖМ=╩'╚А╛├!Z╥%и┘фа7;э╜ЛЖя╬) )╟┼pЖ]КсУ#°У0`Mг║лal ░ {`ъ╡У3Г╫√О1─б`┼y╡░RЪD6цqЬ─ЬЩ#0h0с╧)t▌└IS/FxL0аРё0╖q┴╕wУ8GЧр.ЬЁ#бnb_>б┘V╧у▄9%╨╨√&╬H╚В─ь▒Шs▐Эйщ яNёМ$ТH"Й$ТH■ыт√╝ЙА4TБ+!в!s ╔їЦK"Ъг╠pю ^nА│Гt° 6╜п╪]йTDQTUUqХЫ`Y╓0М╪'P╟оЛtП─╢╡ОГJ]╣DйRЛ дуЧ ╗/9!ВХДIr╢aйЪeдх>╫ф┘╝ы┴k}к╛n╒єKЦ▄@М ┐Х═u┐░∙-╟ю;уМТШA▌▐ЩI╡ЦХg·,█PPЫF┤Н┘Лящ.LХv┘ом~Р9:AТ▓cSxb)b*!╜ЩLUШp┌╖L╧Ф▄ЧcgRS╕L8│Р■┤i'NрAX╙Cf0tk═фс┬┴тЩ!┌Р\а!с╜{ ─q~С0ў╦A(╓d╔┴&▌─6ёЄ[ oЇfЧШр┴_Об0у╗рV0ЬibЇт╕НДВs{°A┴▒ ═Гqyrv\╪ 8/<Ёfsz!■ю[Lу·ДхЕ╔ыwу░ Jo┐U;┴-x╞dДГСDI$СDЄ╖ХJзЫп-X█▒c╝jE2хxRZHkF)@╞ўDЬЇ┴IЯg╪О▐i╣э╘$"ЛKквлnG$х?,Ж╖z<ЭЪк╘%tШКЪ ▐iу>▓єйЬкNR |/Р└8h{ШОT╤[4uRm╥4Єш#K╙yўЩ'W-Y▓Д╪єЎЁ╨AГ/╛№кж%.╛Ё║f│Эыm╞bцg_t■┘gsфB╧7╖l█r√Эw▀ўЁКf╙Щ;tДжэж█n ┼2╦░q ╙ы~д2CсЁ(Ь╖▐╗Ф#bЎ{GаpВ└Л$tЩБц┤╜╗xВ┼3▐░ ?╚╒Q> ЗЮ├▒╬}z_ж0мВЮ=АлЭр*▄┼`dg╚`З║╒ГГBpc=(/LDйр╝║▀шъ╛V└+│%╔р8l ╪q;Ю@ АЛWщ@ы─`iG╦ ъ ┌л√┴,╨`VAш-оЛ└ЧP`╨Щ╒╪Н▀3ВL└П┐ЧQ╕ЪєО[я╝с{╫9Ю ц[o╞ЩШШ╚хr╢m ╣y оЧ=■ |¤Щ╠╔эv│к<╢}ўЦ▐ю■ryJГ▄РЦ gFК└Kч╙й▄яo╛є╗ ·уГ√╧▌:·╩К ╞ЁнН╧┐Ї╜я}ПШ▐])Їg7l┌XmQЬw]бля├'t-<8?╝mчЖїO]~┘)0I$╥=?¤SК┌шыў·z О-)ю▐╗W▌w▀к7╝═pI9Юyq╙яsдx7╠н :№░o█║╖{╫╧ф╩fO%▄ю\╢05∙╥De-╦аBЎr╧╨iКЙ╬Tщ╤Fr╨чuш╟cТж7F╟яLжРы"UE<ЗЖ┐и(кябJїMCТМ< х│_`СHРГєЖ╢вOщ·╙╙ил э▄Йц╧G▓tCЛ╛GёЬ╝c╫o▀╪i!ЖFjyф╫ыэ╖*╒╡оН╬ ▓в╪▓Lm█}S2Б■є└╛у╫ї::h╬Ч:╞дaни7Q■ ЦН╗■TSYfи╪}!▄;UzX╧Я▄ж+O8J$?A╤NнЎАкаdБ├вДк5t╪aWШ:2м&°3]║_3╤┴}║╒Оcy┘ШЬ╛╗╒@P;°Yка∙sO!ШД╠╥i4Сё\╟E┘4о \л$▓ёЙ▒Ы└├dW╤W╝"ХN╘кКЄEЙyk╦╜ЙК╟о@6═ЙYSзYF░,Ыуx╙╥▐╦йфьNДЇ,pGI$СDI$яOЮGж╖з╤╣gx|╕<╡WрcZ├ч8┴4k▒8▀VZТk╡-IТ┌Z9УVн\¤у№╕╙щLr┌iзyБ0 ур┤осuоЩlv┘▓e-U[┐iєПо╣Сг?ъ∙V╙║w|ztяЮ1(П| ╣Q3x└╨2L5ХК)КF,A╨kVп_z¤M":q┼ъе.1╜nїєK╛┐Ф█>╥;з х7_щиЙ│╬╕╬0щDN╦╤tЙ7╬A∙╚┌╛уо\┼х╙xIВЁНН▐S)г╣Гч7┌ПR4*.Iеc[▀║Хє╗,╬┼mW┘╣ыЮtuTЇ▒П}njj2Ля┘¤Аmсс╒dтB╦╖ Щ┼╢Зў>dшG_н4∙щ┌°раЁ┌╖ё,╘uБЙ╖▐3█Э']RW╞cёm╗~СHбФt▒ ╥oэ╝7У┴Й╦tЄУК╜╙47ъe2L╞sеЄї}мV~о▌DCЯ╙н╟kН╞╨R^:Gт$Qж╞&ю*ЧQ_ йє▀╣ў%├|,W8[m 4═ 4с▒L її]┘ъш╙е√╕╩e╧░ъYAXшСЪйы╚є│╣▐jх-─Т]]т3л~[,аEЛ>;92йъ╧ I )СL╞vюZ&╟╤t }рW)m▀ьи╣┬вJi\Ц{e┬,Жc·╘╗[[GI$СDI$У└╗╡НИЖъ▄Qй╫╖m{yГТ,═z╛ю╕║iщ4├QдH▒Фi7╟^єЇЪ_№ЇЖnФ╩еm[wЬt╥╟$)окэp╛ Р\╕щLлU_│ц9Nъщ^s3GЭъyp mе▌├{╞=ЭsЎ┘Оjм▌░╔┼iEю·╪q╟▓"┐b┼JВа╓м^╖Ї·[D C+V/q╔ёuл╫cмОLe║╗6l▐▄V│ч|№'о╟3█ъ$A}Ї°y╟|PМ%╒r}ДfЕZ┼│Б2Н▒uk7]~╔g+┴Т=7| ЯО;Ў уУUКб+╡З|ДR╔+LЫ`йШсЪЕ╘Аж╘ъН_┌┴∙В┴O╡█┌Tхa▌@З║▓Ч┌v┴Duн}WеО║ Шф╥┘ЛSЩBлUk╡яm╡╨┬ЕЯЄ}┬▓ЮЛйКЮLж╟╞▐jгЮо╙БЄтёЬз╚Ъc╩4з85SyшрC>┐wdW<я┤╒x<їцычs(Я√"p!═╕К9кыл ^Ь|Б·|dRиbшO┌&ь ╝mr>бVZwА╗щыклЪ·нИDw▒Й┌О√4Їpeч\0Р▀║ушюlцTE5'╞╓gЄ╚2Сяа#П°;╟*]ё4@ўo▐ЫKгtъJВ ┌ЎD│·┤$в▐т▀Ч[u╡∙ bIг╔)t▄▒▀▓Lп▐╪в╧┌J╩2BJКy;G■рZhсрТV &аi▐qHhZ╗=Вh9уmє а╧∙є/@U/?H°АЮgЇtПL╝m/8┴м╙LюЛжК╖>°<сєЪ┘(цз╩г┴XsРВЎ├iЕсfрц╗{gFI$СDI$яKтX╛Rщ№╢┌м╛·╩╟┤2ЙK│)ящ'IВO0ЖЙў-ЦуЁО╢Ю^■ь╥%?0 k╧Ю]╒j¤№є╧╜хЦ?─у2╧ЛнVH╬uэ▒▒Йп~ї╦╦Ч?ayюЛп╝ЇГknхЙ│pv╨╜eвЇ╬ЁЮI╧%┤Оq╔┼Ч╤4¤ф╩р╞ЩgЮс╕╓ў?$╟RAоY│nщu╖Кш#Ёо_▒ц╗.9▓n═к%K~L╘F'S∙№ъ ┌Jёвє~эг"'8)о╤\╕@°рq╠Ь╣-шr<>╝│366╣u╦лей┌З>p╞@╧QO,▀Dв°ЮщIЙL·Д╙h? s╥╟║'ЫюнЦu╡д╢dD<йТчПЙЛ╔JmI"CC═√В╓Ц╫и+7B╪ZM■▀w';m¤йOE(ЙРn[+ _!j┐mХЎ}V╡Ъ√ШnсйП`ЬNо┤▀YO|╠1}E_Oина├∙ЇDYaPЪ@оБFluНов╛▐╧лVзШOя╣qt-:Їк█▒╒х║ГXПкЎ|N╤█╝HЦ+PJ$.sL;СЛ┐ЄЎm∙,КS ╚$гЪVЗ!│╢WвhТа[Им5ўh:Ъ;tБе╣;╢=V╚z^LР╓ф─cвМЫh6ъы┐JйЫё°┬v╗Mв.╝▓╒■3Г%>(Xh.XёВУШжI$СDI$С№ХL╜в|r|к~Ус6vэ▄ф9n6╤_Ъо▒Є<З$IЮЧзK NрHFЗ3/mxe╔ї7XЦ╡uы╓ССС3╧\№╠3O╣о g|▀П┼bщtZ╙┤П|ф#6l0mы┘╡kn╕ЎV]р!│щ▐8^~p9 EH║к_pс┘6аПП8ЮфСGDQtЁ╟;И5k╓,╜ю╤? !┼Ъя╕╘Ё║╒АГ?!╞╢э*Ўўo|їU═ш;ч╠_[vПЖв&^Бv\~∙A же╕╦Ё┬О-н╫^█qхХW▐|уЭп╛╝удП^ф;ё╡7ЎfL╫и4G ¤й╜{QwгЮИ│ркЬЬR┤mїQ├F╝ИкU R▓М H<вЕу9Фk╘н5╤ig\▐jЧG╟W;>:ЇЁ┐▀│уэ╔Є Йx0єПТ- -v6=HQ~й2:9}O"Е&&Q*Еr╔│Rb┐уйгcД*╥┘╖m_█╒Еz{O{fj oкАs║Л_#H╗┌▐^ппХ$@╧3ъM▓9╒yS╤ЯШ┘░┼EКОкspАушЛ$:=Y╜YФ└э│╗ЛЫ▀■^DЗГfЮ╔%Oн~аРAвt4х mи"ш TЄlEєI$Т╚Og╕▒▒╗┌-|┼4ё▄A)ЖЖЖ.m7═╔╔eПц|ёш╚[Ж╡]mа\■A6зжГ ▄ ▀''¤Сй╗Tb_WEЮ╢╙u8щТфл╞И(щ╙Х√Бz%ц(Q.╘+O╢Ыипчt╙kЫъЛ═6Jf1┘╔╠)┘т1Э&┼╤▀х;┌TB.╢Фi╝hf▀ЖИxб ?╗(чА;^FI$СDI$Х[аX Ъоt~╫╥╦╗vm╢-ГёэжЮ═&}ф6ънюЮБfC-Ўu5Zу╛я.{h∙№фg@~хrybbтшгП~ї╒W+Х ╧у═°L╙$Ё╞*ш┤╙N[┐~╜aщы^xюЖknУ╨┼Э▀МW^Їmа└1▌l~ъSЧ>}чЭw В└p╚е:Иt0~я.╤∙8╝ёWм¤╬о^З│ГУ;ЗЛ¤╜_{Y╤║╧<эоЫТCmОжLg╦ўЧ\╥╙kkF╒2й╟}m╦█У║э∙╛р"I$ORэN!┘SjюWu}9ри#┐QлжфЦlш├4Ъ╥н╡╨ВJх ┴f-5╝T┬╖PбpЮeк═╓│ЮГ╕°▀uх┘=c╧&J╟П)Ў╧█╡є>CGЩфY▓▄з(&╧$,╡╒██зеzcl┴┴▌/┐ЇG╞GВxC│mхбv╢ш╠╤▒Х└^==ЗК▓щsкХ╟+%t°б_mйc╜}й╫▐╕Р┤Ш D│Щ ЦMь╘эХрY.{╢й ВфХЪс┴bс ╚'ъ═╢Г·s_и+{LЇGЬbv╓МЦQ ц┌bсXё;vо═цГ╓UPWёмB╛8▀h╓tMД··>╔ l╗▌t°A@x╛╡c╟УрC2~─╨ВоGY╤Хжч═¤ФG4лНх`%Э:[╫Д╩к┐П┐S ФO5Q█LУ ╟уcТ╘Qw▒вji█╟╦ы3)╘▌ujг╓6ї═А■|ьXG╤s╤GN╕шЙзHОЯMxYшo7╘┘¤tlЬ$їЩ┴bП pPМp0ТH"Й$ТH■v!Ё,Жa'л╩Ow я}]р(╟рЛ∙╛йщЙL&╙jvVl╖tЖ'[ЭйL&ё╥Лo|ў╗╫┌╢╜e╦Ц▒▒Й3╧╙╫;p╫]w;оъ1:вм5kV-¤▐▌вsB╘К5 d╫`мПLз║▓╧╜┤╧<ыЧ╚═У╝GЦнl╓∙┼/┐$'┤fн*r=W_їєR├ iОщЄ|Й%%╫u}d R%щ╓Цн╖цЄ(Э>▀62╥З═ ш█;7ЛнW_4Ы@<■▓Х╧■{:Щ8т░┼╧?╖>! F<^ИzєyOCжЛxkЦC╜▌g/+ЭuА% ч¤П╤ЙJBшRt;&─,[╒Ь▒Б╛ЮRuЗх╘;ъF▀E▓p^▒╖o╟о_$Т┘├C*цН:К╔xН│╥F▓ИА8у▒╦{√цМПmjhлpТТ9 бE∙t▐e▐~g√нТДdщ┤╕8а[ХЖ║lr -ш■d<Ю}k█╧єy$╤ЯЦcDй}ЇqК┐▄wbMуf╝gЛЗЎШt║obЄ╤rq╘й{Яm╡╤╨ЬЛLUe∙оЙЙ█t-:тr]WMEБ╟ch■┬сЭ√e╝█РЛ*eh/│Хх╦т)Ї┌ыўqъъ·xBюkщcК¤$У╚п"┤Ъ┬0Фa╖iM&╥,═╓FG FТё!ЧW[ы(її^║їЭ√┴H│Гr=и┌╞+йуьеI┼№ЗъUУжY╒j8млI№`s!└┴p█Eч∙аGI$СDI$IHD▓x╠m▓i¤ьЭ█gBЕЧ6nъЯgZ2Щ╢Lg║▄8ьЁг╦х)╦н%У▒√ю}Ї' ЎяЮчОПMLOЧO>∙─Х+Я"┐VkрЙЖ>A╙$I╥АЙ=Ї┼ач7о╜■┌█eЇ)iMччУХН├╗╦╛-2dЎг'|МD·╩'G>{цЩg√Иxю╣uжы ╥[│v╬в│┴╔л╛э╥█╫нyz╔ ?&&vя╠╗7l~═tz.:я?5-юS:rъйG▌u├ ЯD╦▓╝├цd╤!ЧF╥е$─HЦюQT XРбX█Эf8┌GэzєFзх.'=БcтэvЫeYПщ┤Я45Ф╔L1Я3ln▀ #╧йtшб_x¤н[Т ╘Э√ЪуZ$?*╟Й;WКy°9УSП█╩f.гЙШуQеЙ<╗{┐ии┐пV╤ВC╬╖╘Тbm*о╓█╙▒Ь╝gяэ,П┬1┘ЮввhщTNWС╥qY:УЄнЖе+ZrkН;! щ О\`ЪUД╞[╓гЮЗ2щЛ=НцУt °(┴|Ю@l╦№щ;^,H╥Dуv├@З]╒иYКї╙A╞╩уСs-t~2}KЎLM▀┌V╨╝╣Я6█fK╜и1!ЭCrмчRвР╤Ъу╙н╟ |Q╫: ▌╬з лЮ║-Cй▄yк╛ |K%.╖Lfк№╟Xe╙'2ц╔Д█╒╢FГёlОж1ц┤Ы█ ╬ь┤─Ла│ЛE!╣¤Э╗b1$JчЎє>╥\_┘=ЄРЭ,_JСЮ═лб №hбI╩ё╘`)I╕╤ м#сfq╨Э╔sG:╥СОtд#щ ║^лФЙF єўo╝│╒Gх▒▒Э_■√oh ▐ е▌RZвhсбЧ╪1Ь╒i7^┌Ї┌ K~`┘ЎоЭ;GGG/^| ¤ў'УIК┬▀3M╝c1┘Е^xя╜ўvўЎ=╛№Йып√╜МNЛoЫ,с╣ГЮ├Ь│°r]╫xрЎB■4Zi║v┘%ЧёBl┘Єg<КX╖цЩе╫▀&аS└╤╧■лKяX│n∙R└┴;7═ЯwЇ┌U╗Фvўgо°7═р\dЙТБиёN··╖.Ї▄V2ЦЯЮ0╛їХНL╣ИъўР,{Ы|Д░yБ|g█ж╙H╙СясE!х:фр╧!╧l)w█ъ╕Кх-Цг╦╙ЭVє^╕7!~║╓∙#M└]БР(&)MлLЧ╞SSд3╣];nВZ*%DR(УBsчл61Юю.ь┌∙лZхsи╒B<·┌╥T ╣j║▀╛єжЕ;б'{|░-7Е,JМui5Еф╗< Фdэrх╖╛Пz║┐LG0Тя╡л═▀ГI∙│BМ$э■M<ОЄЩoZj╗i▐ -°Т┘*5э╟t8ю в╤TH╔п7ю├шЦ╝Ш╜┘╝\M╞/Н╔▌ЦЙ╞╟жкhhЁъFу╫ОЛr∙/BIОМ╢╞H┬ш╪п%Е+(QЎ=`|ЇЁ╖╪}u╣№kшq <╟ArerЯЄ}*.╡j5NLШFч9Qv╞П┼y╙╘+хЫ4Бc1-\°ЭzyСr*ЭhTзЭ;lїї^kjК(uij++v:uЮПЖ▓▀WЮЙ`┐ю}[╠x│[RG:╥СОtд#щ ▓&СЩр=╙▐=ЎGТGп┐╡ЬdФє╬ Д╓°C╢Ё+/[╢Мх^@jз╣iуцk┐√}UmjЪЎ╥K/Эu╓yєчОППу╠ЪчС$ аVо\I╥у+6▄|уГЦ.ъv├r_ЯШЬx{╦ыАП╡ZНa(Ц#ho$ь╪ЮМiQВФgXq═ъ'Ч\є╙L№фf╗╣q╙s╟│k№┴╥SїW йГW?;сшЯ√O-№╤╢6B╗/╕Ї╕o|ыопй єн╫G~√є{,+[эфAzMре'> 7║очz<ЕТн╢■╬╓7п√Ч&cG╡:Эх╦o╢╝▒Ч^}ъKo vП?╙S<ьщХ╗$Ў░┼з_- ▌Жe"R!╣й╙╬<Є№ ?┌▌Уг\юеMя▄s√Кёqпн?Й│J3ВЫБBЖеL╜├Й╝eЁ'═Р╢о■И╖═"уА╖АtрУb)╡3UьY85▒в&HЕpпmф;▒x╢╙ЮК'║Бjы╡ /HА}ЦYGИвЩ╘├0JзТ╔Ў╓кS┴gеЁ uТ(9Юjc╝Фr=└О"╫!E!=6║бDЁ}6|A╕■HТaї'8├#dд2НZ)╪{ЕCHч┼╝бщ┴]р8хyюь▄ЫHВ` ┬Av-4╬╖# е3╔Z|3й╛Vc NКrZah-а╖x2┘n·r<н┤GеDКв¤vmnюъЫ?=╢ГтS╨Ў`вб!& Zk║{рачЯ ╛ аZ ╧н)ЁёQG¤Cл▐BоЕз(x╪7ТM{ЮПЕdТЙDкQ┴юсЭ б╥к %dYмФ*4K{╨О№жЩ}М#Й$ТH"Й$Тў+Фяxn╗'/м}■ЧП._f∙c╒╞оxB А%"Ы<░XFR╘└QлS╬f╙╡ZэW┐·╒ЁЁЁ╧■єX,&Вкк<╧+К8ш8N&У┴x`Ъpid╕╩╙}?∙ўЯ═Ъ╫Q*7н╜ыю[}dQ4N╥∙P;╨АП╟pAHТЎЯN╠ЩШ,╫kеЫ~wЧ╠-АлП-┐СУЪO=╘щtt╗ЮКu7;MyйX┌▓,╒lИ! $k∙IRЮd.йШmСС]╫5=ЭDtx,SHXY▒, ▒<═▐4GwR┼═NН!D┌ОqE├┤]Dён╣Х╛b╫─╘ДЗ:2_PМ&Bf69A7l├G.OЛЖcdУ┘j│КpоМ╦&sХ&рЪ▌Ы?╪┤ЇJs\b╙ке'е8x█╘U╔ДГуЦЬ╤#8Ц3,#ЭLWЫ╙=sG&ЎРИ8A5л в╒-=!'┌JГж]╦й╨Tz╖гLHЖшьD"QoTiКMз╙х╩HOў п@!mШрS2k64ЙЭo█ЎКХ7ydщ╣чZ║Їb█;c чўо]U%Йьg|Ю@)hВ╚ ucBвI╦i%dЙб°Vл═"┘EВН54╓Ы╒x■Щ(Є(ЖзxtИ╘hи╢оT)$╣xў▐╟▀ьp8─Щи┴вдЕZJЪ╚)ЧT'x2axнЧ4L├Eо╚КU2*╞▓,┤x09ПWZ#С╩& Vsq6■Ш ЭOхЫ═жх╫%6ЗwnDфЬ┴y;Ў╛╔аФП3xЗВ¤{PЪ╔HS/3H▓С*3x`║▄┌+3y┼. TJw┴,P*ЇЗgуeФДZ!╛╨8єG'└ ╒v$%& ╨f·:ДHfхОUБ~ФшдъАqИ╙AНDhЭПьЯqnЗ╗А▀M╧ъ┌=■VХB╝ЛЇФXhh8w(R┘b▒0>1%9ОStЕFмЙZ:{┴─Uт,QIAЫJ╙AКDeLW#q┬╙H┴Є╡9ФvСMтЩВЬёI$СDI$С№M/┘ЧюШ5ХУкЪ█ ЙФHу ЦО{.K ЦcЕieЬ├_╥╡\ф╨мhZЁЪV3╔ЮVлх·о$HЁ╞яh-YИ╜╒щVГgТЖ▌ФШвm│"JРФg╗ZU▓|жeTmдHЬЭїE╠°ВHYк$т\Gi1Ф╠°9┼iм~ц~Я*п^√└╥╛CМ Ч√√r╧>││╙до■ъ5э╢п║И шЗбI╧1hК0\┼FN%YVR,ф┐gzY╕@IiIs┤L,╓;uСUUB┤|+)%AF'Fдж─.─ ?b*nд#щHG:╥ 7j╤x%0reD$╙мiWkЭix┐├kЪD▓ПАфЁ2 xC╗╛ч°Мэ║АmеУr╡═1╝iwH─ГДФ№РJежззr╓P|∙┴8╛i!НD╛╚▓жеЦ╙йАФАРя┴)├%ЪbЬi4зX&%1yЪAw▌ўK1fо|ЄюеK┐Cь▐╗np`■ /╛.K╣Ч_▐&I9КО3┤l[>╘*Є0д\,┴ аФR╦°3/Ф╫щ┤l█Mе2`дO0 ^Г╙щt║╗╗iЪ┌╛}ы18 4MУ▌┼┴v╦ж)ъЕ╓бB1░┘▀▀_.ЧFFFb▒ЮSшyP]╡:нh5IК`uiК ╟Т,иКn┘ЄIОgр╠╠1'jКk█>T fбЦl░HMЖЖчє['&&рOh>╧│Оc$ KВ>Ї╨Cыї:Ї¤ю▌╗{zz┬┼DИ╪╝yє*ХR/Г@У!░ЭОК═°#6,╦C╪зз╦`■Д┬╣|┌╢ёVцP;hh2Ь▀а╪_°Iу`ЙIд#щHG:╥С■ы5вy: o^iЪ▐И'╟5▓Щ╝e"╧e█7MЧa(Т▓Щv╦q]Uw│╣оJеR(B╪╗w/0 `╝ёе рш┤k#ЙЛЫ║УL╩Ъо0 Y*OuwАRВ╫╜ )8\ДЁВ8┼04рчyДe╒Ze┴┬╝кЧ6o~z╔ ▀%жл│Щь3л╫ b╠▓)БOШ&йД($t┼И╦▒О╥┤МN>Ч@╚Є|┬▓╧g▀├└>с(&JїVУг9ВжЁg7\╟╡ьx*й+8.ц M╒:J,Щ░ S╖L м└├Жч╥Йdг▌2TMN─h╥sСkjPF/d MTKUN─ (:■GМЙ╣tnў▐▌]╣.┼j╢b╔Xг┌╚ф Уc╙ЙTЦgx═░8Ж1°╟РУRлQС2ЫОK║A▒"╟7;mЙфD╝QнБ╧<├┌Ю >▓ч█кbщ╔PЩ┤╘h╫)DQ,х┘╔Рp▄ьрЦВOдOjжgр┤кгVWT░?╘?0YЪЦСЁ╖l1&╫+UрїL2еш╪╟Мo╚ Ii╡yIД╚$╥)ИЙf]╣№─Ї▄ ■└U╟ў▓йtе^УоT- Їl gXЦ─у╚ мЦuЮ<Ф╧ф┴╛йсXYЖПБ└rжcГ5├╢а╜=¤}`zНЇ╤{╡З√ЇЯЮПtд#щHG:╥╡F4`_LN8оf┘║уX▓,;Оpс{tLNu:9&*jCТщОRН╟уPЮх─f╜K─iТыэюq}╧2LЪel╙e ┤i[йD▓╙QIВї}Ь╣є|GY╫sБk6ЫвИз·X ВаЁше╧╨┤\)╖║║КхR]bёД╘lN "zЎЩeKn╕Ц╪╗ўЭББ┴╡╧нu=`ЁЮt=Кж$╫! ∙т╪ш(╟╤╛з∙╛╞╨~░╩БA:УтуйdТвБiptldЬвМ%╩ХК└єRLR;эx2QлTбIЙX|34ю PТcX╨Р A╕Т4C·,/HНД#ж┤ХD*╤j┤@[Жh√з Р. АъШ╛ЛhЖЧДx│Р${>nwGQ╥й╪╪фH_▒╓иP$FWСЛ5ZMи▒╖┐o█;[╗║ЛрI8ф+Hв╫n ЎhЖ>=95o┴┬fн ~В}├╥Nl+-иХf)h/╞`Я№═s┤к+оэф╗ cу,└n26%Aм╓k1IkЭV"└╥Му┘4э▒<39>18gиR*CФТёДэ:J╗╙▌█Sп╓T]╦д╥UСE Z ┐;└>╟ЁPТg╣└ЪQЕG4Ўс╜[azо+╔r╜VЛ┴│ЛMLNjк┌╙█лk\е) о╢[-Тв:эv6Яi╘ъr\kЁ│зпwjb▓PьВ(╡Х╘h9v.Ун7╟CпA+Вz╤ЯhСа╜P"gр.]╒рI╦хjез╪нh*Ь╔Є%╨эfЛbhhуфЇTwWСдйVг gа╜┤┌Дл╨kp QBЮQ ╦Г╖`Ю7Ё╙s\░├P4/ p g ┬p·ъВ'Ё/┘Пtд#щHG·¤j2╚Жy34Ы2,гБ╠Вє(▄╢9°л>Л|ъпп┼Я1ЯЩ╝ч╜;w1Ь;шЗдЗ╔√@рOД'╜А▄╡°л$▀#ЎюЮ,м[ў╝ы;@uОяy.п╬ZнЩJf|╧)ф╥╡┌═А)<9Пf$╧є├M█└^В@╙┤eYнVЗч∙■■┴Jет{x╪Ъa№н,xmI┬_┤S%H╡Z QЗЧАЪu]7tз╒4·z ├▓mSТb╝└]▀▓ Кb0BO8Ц▌╙S╒┴┴╣├{╞r╣ВоPW&Ы▌;gn ффX6Ч4 ЭдPл╒шъъr<┴O╝╜▀ш(P┤╕╗sч╬╛╛>8оVЪТШДКjI▓Dды:єц═▀╗wО┤╣█Qъйt,4Мчж╒├/OГM<ГP╫б▒SSSЙD╬CБ╙┬$p&У╤4н\.╧Щ3з╒jA┤9О чыї:x%MKOз╙эvМCa0╘ўВ┘ў╠aЭЙВ╕Е#ї╨MpTЪ╦хBkP)Д(h,ЩШШ╚f╙"°%?2··жж&Tlл▓ящ)ОНMЁ<█┴_7ё║╗{еmЪЎgNh╕ЭE╣R)╒ы═9spЯVлeТдб °ЕЎ''зУ╔8 mй4╒██_пWЖK$р┘иГ╔dъ╪?а}°╤#╦"╘lўГqъ└2\Н┼Ё╠╪╢╦▓t▒╪366qАVА¤оо<╘>Qоk├] '╠2Йtд#щH 7╙>Б▐gВШ╧шрK`Ш■pI╝s│ ■в<ЪШб╖ ╡Аq▐~╜■T╚"─еБЧ\П╘1JzМJz,и╡kV-Yr=1║г╒7_╖юUМГ х{╒:ИваА\OKDV>Ч&|{dbп(s"АxqлвЪпgt{сF)`Л╣sчm▌║аЗ┬9P°И7Rщtl█"┘╢m█G1= oeыаГз( пЙ%9V.Чл═fл╖╖╟4нf│╤╫╫пi*▐Nя@°х╕z*Э0ї}╥╨-`┴щщ╥@ M^∙дуXM┤Zїt& dhNU ■аd8╙Ш Ъ6wю▄═Ы7ўЎЎОНаEхRupиb|jh╬└Жч7╗ <'x╞ ┼╙<Б BЁВ&├Б╘ ╡ у y^*Щ5tИ6╬ l ЁаОЕЯж''''-Z┤wя^ш0 ╤ЖV@╪б `jgp9╒]r╔х▒Ш!2 √ХW6nЩuwwГ`S╙t└Aа2а║лп╛·G?·QWW╫т┼ЛЯ|ЄIи ╚ Jо№1 aуyйЮзйF"ы┤U╫│ baУ ╠RQ0№}ї+_├s ЩfHА┌Н/n(MW└╦Ё#г├ ц╘ю4УЙЇ╘Ї46\ЄьЦ╧<є╠Ыo╛·//Ч├╒<с\а$№ Q:`.║ш"╕4■|░М F `чЫ▀№цo╝П┴╙O? НВж┴#tЄ╔'C├!к=Ї╨╚╚H┐~d▄я┬╗я╛√╝_7■B╠eЧ]Ўы_ тО┴ЩpuЇ╘Єх/∙Ц[nБ▓xSJ Ю(8'XДЕ#Й$ТH"Йф SёЁ(Ё ╬тр■WС╖▀Я$╬·x╥с_kpР▄/yО|я┬Ў)S'╞AП6>ч╩ЁчЪ5ыЧ|)1╢s▓wи╕nэKЮчS4Лq┘4ууЙm╛Y-O_r╤gn ├яR╔<щ╙кbvўЎ╜■ц№рЗn║щ&` *└ВXL┌╗w/╝nс╠╢m█-Z411┼▓4Ь╝└╗├ЭI?єу╦]xQ(Zн@╨┴ЁЁ├l═щ?№Ёгyф~ ЙЕ ~·╙Я╛уО;▐У¤┌OАN;ь░▌╗wЗ╞O=їф█n╗Н─[TcВ<{ё+V<ж('wю╪├╨ТЙwbDчЭw▐э╖▀~°сЗя▄╣оЖiB@Ц╛╛>░L∙tъН╩рPў╘╘$0─1╟%Гz{{▀;2√Юx√^1~Lю:щдУ|Ё┴0╔wхХWФPBcБ а║D"ю╕MУАА└В┤3╬8у7┐∙ Ёл$сMдэ@р8LdЖDС scЙDКaи╨[@┤:%z╢o▀щy╬'>ё╔╝?Х╩(J[ЦуZ║n╬Э;┤yє╦Т$фr@(и:▄▀Об.Ёgх╩ХLш&`8ш ╝pи:ф■┐Їд^zще┐·╒пP└s╨╥C9Иэ┌kпЕОГ`ЮУн[╖ ╞Б}xrа№PГ╟▄g№Еvq╟w▄Ъ5kЎЭБP┐Ё┬ an▄ё┼ЗЖЖрy; №є╫о] |0>88Xл╒ Ш@█P┼_jB$СDI$С╝_ В╤ь BЄ╜чў╜=▀%E╩ F№╡ОЩ(└┴┘┘Бp`!\Я┤paO┬#┼t█pуАГkW=┐ф└┴=;zЗ╓пy╤ё(Кц\▀ї|Гd]╙j&╙Вo█╟}°Ь═W#ЗЫorВЬ╔хўОюэщщ∙Ёё~b∙a╢ ЁиVл└√╨▐╡Ё2n╡ЦщД├ЭЁ╞а ЧFJ>¤Ї╙@xсиЇ°°8Р\mwЪOЛ`пMЫ6hВЕ|ры╫пsE&$╧Й╡Z=ПMЧ&Л┼▄9ч.■├nэыыЩЮЮЎ}т╝є.▄╡s╫Ц-█ ∙тю▌{ї\'ЎЄ∙<р P&ГхpЯ┬0лBыЖЁ,А:aл*vуХW^6╝░$ ў╙∙s─ ╝ўЖєєN9эФ_xЬБкП∙р1o╜ё░╘╪╪└ └Цж+эйjыВ .Z╜·YU╒!27n\ U]╫╫4@ `n||▄╦А╤▌▌╜s7а╖L&cЪ·ь╗?Ё*кVы}╟{▄cП=╩0XЖЄ┘l║╤hA] ╝{ў╬b▒X 8IЁ╬F┘lB&h∙@ЖЗЗП=Ў╪зЮz <БFA▀A ЁIЕЗa┼КЁxД▄а ]wю╣чn╪░И9№x чП>·hи(',X'GGGбL?Ю▒p└@Уф 'Ь}ЗPЯxтЙы╓н v█aбўь┘▐Ж▀Ў9чЬs}ЇQxJч═Ы╖c╟(ю▐Чвь`$СDI$ d┐a▄}й;"xSю~дHб`Ip╒Э¤рэU╚¤Ў XячC0жМ╖ЪёЩY,AuДУDЮ╕vї·G6ўЎ╧_┐Ў%╟e(Z└Я5ёMТ│]┐э╕*с:g/■┬Кe╔|о2iqф╤уе▌Я╛Є7▌t╙т┼ЛЧ-[oю┼Л╧Д-╨╔=ў▄У╦gр¤ Ф╨h╘є∙АK2Б╫=└K'Еж[нV,шyю╣чрЕ я√ССС▐▐^p@ф_ їЪz╜┘h4А!Ц/_■Нo|у║ыо√╬w╛v4Яj╖М %Щ%vbrЇ╝є▀{▀]@!с─╕уП;qїъ╡║f]∙┘/╩r╝┘мVkєц;╬9ч╝EЛ√╔O~ЄЩ╧|цСG▀А`АtЦ.] Їv·щз/[Ў°E]" 2└ж┘l~с _▀|Ё┴ўеЬ`┐▄ к+о╕т╢█nc\:Є╚гЯyц)Ф%KЦ№ЁЗ?p'╧? B▀├?pэ╬;я>ў▄│;ї┼_А√╩Wок╒m╖▄ЄЗVлёП °╧`Ў╞o'?~╞Y∙BЎ┐°E°ЕV`╕с ■FН r╛G8оu┬╟Ny·Щ'▓Щ|й<┼2╝eЯ╝т╙4Г╖Ў╣єо;║ ▌|_·╥U`╚°Ч┐№%xxхХW■ьg?zТГ╚@эрєЬ9sB▐Ъ;w.t╓#╤{уН7аsЛ-Z455y╘QGн^╜P !В>║рВ ўбЁ7░2Ї╘о┐∙K╧>№~А▀ [╖n▌╛Ўn<°рГ┘!╝ккB7┴C╡└3 ╨|┘eЧ┼~єЫ▀ДЄP ╬▀|є═PаT*┴╙°ЧкИ$ТH"Й$Тў+d└d░▄#└╡РЎg?ь VcdЁЄ╥ЎИ┐╔`- ся√k▀┴{qpvra0 ╒qxclR'шI ЕngW?╖dщbtts_▀▄їk79CQвL└#Y╫s; Л8Ж>Ў╪єцЇw╡kv▒0wщП~╠ ю∙-^╣r┼I'Ю·╥KБЦ,∙~▒X ?■Ї╙+VА6z√·*Х ╝k ═H└ йT ^Ё@o╟√QQd&╢m█Ё┴Л∙_░|Gрc ├ДнYїь╔зЬ║nэЪN<щ▐{ю4@#├Х╥┴ЇIНШШВфy╢╤мд3ЙП}ь#[▐yHPцРCЩ7ўаgЯ]▌Uш9ьЁE┐┐щ╢L6╤nO_w▌5АhgЬq╞я {АТK.╣ф┴Зb╕я╛√°  №╧  Ч╬;я51y·щЛЯ}v%Dг^oЬ~╞тїы7№ёў▀?ру╔'Я l 7╨кЖ╣лO~ЄУ@╧╟{,╨эЬs╬YЎшуп┐ёън╖▐·╙Я■4z=╙ўя└SОg█лTK_╛ъл7▌№╗x,╔░╧Йg-■°os#E╨х_∙ъUw▀uяЧ╛Їе_ ·╖ггг@├_∙╩W ю└XзЭvZВW]uЁ.°6[щ╪b ╚mЎ чэ┴НWхлp╚яЎ?▐П ■Ж╡о_~∙хАw▓, °╟?Ї│║Кў*З ЪX№╧╠∙чЯ╟]]]а├╦бПО╜Ё┬ Бe!Ш;wюДксG╦З?№с╡k╫~ЇгЕур╙╧5 Є▀¤юwPW8їЁЯNў "х■▀$ НЫI$СDЄ7 ЙЧ √√>ч ╙▄ЗГ▐l╓РЪ┴A┬є ўп╟AДЧ╔?√ ЁБ▓Гaj│ х·"LВк`O╝Є╕╡л╫a▄╗w█└└Ьuk╫╣I╙lЁ╔cЗb└K╟umа╖УO>єО;nе Очхt&├ЙЇЗ?|ь·Ю;∙ДЙ╬?явГЮ№ Пн^√4╨РМ¤4╚Bм▌l А)A└Я28ю╕П▄r╦═1╢m ЕУ╒N9х┤Ч^┌>#~эл__Ў╚C'ЭxЄКхП_q┘?№ E1 яЭуy╓>БaиK3@4CЦJSАJЫ6m4 8г┐┐╤в#╫н[ч8▐)зЬЄ┬ЖMCу(ЄФO╕ч■√>ў╣╧=▓ь╤0)°╪КхgЭuЎ╙O?I╤t&У9т╚гЮ|jхХW^ 0▒p>^}@Нf¤▐ў╛wчЭwn┘▓░ь@╜у▒ д0ъa7I`JА6 Бч┐¤эo OЎ╬NкbY°}тф═С]вbD╠с^│bV╝L(Тs╬ТsAв&LШп fЇК┼ИvЧ═У├╔члъЮ┘]dё>|╛ўЇ~SЄggNшtж■]▌U ╓√o╝ёFАрX$ъp9╧>я№ЭЯ~╩─с░╦/┐x ┌ 8М∙ LЗ├a°hцгП>bж╙m▐№8└kы╓нCбGхИCТx╥БШ/╕рвў▐{'KdeeШж}■∙ч╜∙ц[╠├ўвЛ.x■∙░▐|єMАQ╕Є╒W_¤╔'ЯЬyцЩАPPЭ~¤·зю┘│:·nWWW╚uДEsєД╡k╫2+ ╝┬ДКэРф√Ў┴╒Ап╣■║╖╖┐Нлъ┴╦:УЯЯ▀╜=7o▐ Gzщ24 a35╪┘ ┘+Ы]tёEЫ{Ж▌╗w№ё╟бО▄╨ysч╬Е}Ў┘gАЙlЯb│хБb░ЭС└F'Эt╥╟МЩЭuюu┼WЁAEр\└Vрц /╝к ,u┬ '{ь▒p( ╬Э;б=Еo╗э╢/╛°в▓▓рЫ-ЕЫ4мK│ўЕб",┌t4Ь╟я■·ЫVее╨┼╨╬7▀zы╙O? W╦+╚fФ╓э╞w}╡+┼xЦАЫ║iJ.ЗEбКKЕ▌44:·ъК▓tU╫+_yэU╖╫{╬yчn┌┤йCЗPY╕яё╟Э√┌kпjCэ╦m┐■·ыДn:№═╟э┐%┐┬AТ┤ 8x8 Т4ж%-iI╦_P■ ВЦpA/ро]БирO╨¤,┤ЄeЧ]Єю╗яЯ{ю╣ ▄·z╖Ыn╪№╪цмм Оzў╛o■№Е%нJB┴ИьФ№■`qq1РНD═Еddd┬5п╣цЪ■w╤egg№} ¤ўpр╬Ж Z╡i ў:чм│╖╜∙╓U]╗╛Ё▄є▌o╣u╦Ц-NзУ╞╘жhЭ┬APEЪв█юШЯ■YЦeUUс╩└j@ZпА5╫^{-▄▐ №ы_ КGc"саF/╜Ї╥W^▒ы╦]╒╡5Ч^vщ[█╢_|╔┼ |у ир▐¤√z▐{я╫▀~{╥ё╟╡k╫Б}√БН:uъp6~№°╒лW°pG\I└djAh<а~¤·-Z┤@· ъэ ╜ u∙хЧмПрвЇЗ g2=l┌Xil:▄FHHЪ╙ТЦ┤дхп' ЩЪbЎ╚г7▌╪эЕчЮ√с╗яAVо\IЪШ╪П╦UQV0╠p∙├?,X░°▓┤┤┤╝╝°`оввюXWW╫к┤%g█╙жM╦═╬йи<8uъ╘ХлVО╝╣э-8f╪ИсP╬УO>╣WЯ>Pf`И^xбд░оyчЭwю┌╡ @sю▄╣└гGПЖ:6█м└^PЧд╛рВ ■Ў╖┐}ї╒W:tz*В[ЧХХMЬ8 дrO╧{Б]Ш- Рё╞oD║ЕKїъ╒ ю ЕАлр``5А9шАдQгF9вA3┬┼с├f╦╙р. ╓╗woш2└AЪ╩╨Ж╗▄{я╜@]~┐ щзЯFЁPh└Аpп▄▄\╕руЙ'ЮPuБВ1 ТуО;╞ PT√ЎэбIПРэДr┬Eа√аMату╞НГы°ыъg╧ЭL╞№м╟О ЧВ╞Щ2e╩ё╟ЙD``,п8ж¤▒═╞5d,r╤┼}Ё■ЇЁ╬= №єaLC╜а ─}/\╕░KЧ.Э;wf╢O ї┬┬B`M╢q░╛╛■▀ХД%·╧Р д║д%-iI╦ ЯЄopШ 4·|p╬9ч└Зи_ Sф` РЯЯ╧V0YИ8ц7 фхх▒х`╢.\яўKNIr`Дd╨╙phb8rч╬ЭаШБlрt╨╟@lБ@■№e▀^Ч╧ ╫╘╘Ь▐х┤ЪккЬмьx4ЦИ┼р,Т2о╪M│╘╫╓┴щCaМНг░ш═АSp#°Ў·ып▀╝y3А'Ш,N6еьXPT°┼_Ь{ю╣Ё╒юя╛ЕBк:vшyё┼ Вuї@Щ@-hЮ┤м▌╗wCБ┐р·═6+|ЫP1M ╞AЇ·>¤ЇSh%(╔%Ч┴PSаJ# юM═ Ь,z3\╜Aа"АMЁ░√щзЯа<Ё'45\ °щHSX└BV°O>∙║ШПєГOр=Лфъїz┘-Їfqq1Ё4Ф`ЭЕТЖ╨ЗК│5n6Bа0G^pРа·Zъ╬bkч╪╖ ъkпБЎЗт╣Nцb хiQZ┬Т°┴Я>П`СМь7Т.Ї&№ ЧeF┘ь╠,°юWЖжГFЖЎД?ar╜ 3и┤* Th:6ъ■KП╦яХ├iщH╦┴ьє?]¤FйЄf~|Z╥ТЦ┤дхп" Б@IГ:╦B~а│Вe 6╧ЖaJ,gш├Х :П├)@cаtлък Пh╚тa░X┴p№▒╟√■√яГ╩ЗсЪбHX╖-Ыч$^АkVмl▌▓eA^■ў▀~╟╓Щ0 ─^%AДлё╝22O╒-Z┴@ Y\e╕Q╖n▌Ю|ЄI°ИОlYR║я└~ЦG`jъ═@ч▄6э┌}ї╒WPr╕РДS`РXсNЭ:1{╥ў▀╧ЁЇp ДpYl(4#ЁTН┼\ty▄p ╞хж.╖A┐ЪФ%&fСqрЪщё)зЬ┬ьpp:Ё1┤█ш╞Ўb┬{╕РФЦm╬k╢<╕ЕСЎ ╠ьВP)hph h%и0b╫о]сНJJясj,5╘pоW`б¤i4l╟СЛ┘ЮE8╞\к├Ў║╜╪)М╔аЕa<8$Щ 88;7ЗэSd>┐P5=б▐щД╞St╕\PЭЖм$p╝KV6аaII Ы└╝Е9@├xю╣чауасp╙╢m█┬`>┌'ч┐. 6ьiv╦]╙O■8╪Ї╧├+Ш&┬┤д%-i∙ ╔┐┴Aр<╨┘аnЕИ╝ hъ╜КF_jkk ЛЛ@щВъэ^[]ГЙw│sБhw zчuВJЎPa╠┴И╤H╤ЎЙ'Ю╕ ~ ╦№▒╙ ╟╟5╡╓П9Е[Ч╢L─т║кВО/е^)═VГЩ╛~°са╨Ї{ЎьДЕRhю█╖П▌Xa╫о];v,--ЕТ ▓oп█щ╩/─╡B -8╕}√Ў@ZЖYЩ1оvд0╘hЎs╣<Э┬Вrг-9К╙Ї}ЁfXбvхвВBVB°Ё╟=?A√+#&: h3 MqкWc]г░Ц╒т ╓b╨ЄPlhи5t.░/@№I'Э-е:¤Ї╙Б░├к·ЗK1▐T~╡хой╗t╙j■yфЁ▓¤╩?·Wь4ж%-iI╦_I■ ДБ┌U ╗m█╢а8Y8bq╠Зў@yYNn.р╤┴jд:P╧а}ЛЄ Шu░UiK8Ф┤aщ,СЁЬ╚╝\с  Бў@!А └7eхААП,+р └JЬZдRs9y ╞ЯГГзА▐@ыwщ╥х╗я╛Y{oAЫБA;@I╤р═QХЗї Г6╓Шp@|р│г║╬"8Z4z ╘═х@{3єX╟?=▒RТЭО8L\N╦0y├jб^╠bZTPXSU- №¤?mэ;ZбNО+W╩f ╥╣ytуъ J╪З0З├Ё'LрёЗ.K>┐^/L│` *Ш║x▌ю4ж%-iI╦ В└я0а│М0З PпЁC}д=ёyyy▀}ў╝fddTUU┴Ы║║:8%ЙГЁ ^ZZ·сЗ╡└/>Лi ┐Єшu┴є,╕1C"╢╣═T╡Дк║╜>├╥├╤╕'╦ыryj\╫LbЫ'И╔ЎfUФ(╠/К┼0╠o│╞VФАRgv&╘Фn╠TСWРeГёДeМfzИ№Пс \Р-hB1XЎ°Г ЄGwцf╡є╕▄▒H=L╦эC√вElЛчАEз├внйjж╙#4з>┘B╢v╠З9╩`оОгкпmCСШ╡╬ДRФ$╛╒u■Б╞WMЇЁ ┤M╙╓M5СPт FKPM▌44┤OZPshy5бd╗<╠°dеМmмYbb└JМрia▄fтU` ¤Щ ll\1Лo╙qїa├ T]├v)░х?╠ЙЙБkб╗`┤│TЁ:pOZ╥ТЦ┤№ &┐▒·┐╜╠Д╟lF╠3їH8к'''заарУO>щ▄╣3№╢│0p[╖nM.╖l┘p.┌йS'╕shhHt╤р╛А.ВhыFfn6┌╜▄з╦SUWх╬╚└R╦╢M╤╝.g8v;eIv┼┬aУkЮ└аЇА,$^X@▀4ЁВ└O▐╠ `%P-┘┘сzї╞ХDc4Б┬?Dў├е╪JbVv╢I╙l░uUPфЯяиnuq╗▄╨{ДуХP╪щrщ jS ╖хАГЖe*Ж.╣Э/┼╒QНfq╨чєAС╪R/n│гО╪аwПV▌▓н~0`IDрtиsя8кы№!- эЙE╒nм╠p{`Ф╠╘HЇDB3tрfxMшЪ7├з█раhX ═&жA┬▄qdG~vОжи╠p┼┴Ь-в╤Р∙з-(╣E╟UFУqхжуК╕∙єЗбцE┴ыё┬п{Nс!ЗaНFah┴s укииHt8┬╘M[╩ ╙┤Z╥ТЦ┤№╚oм 2WQBгyАоa{еОФ|╛b√╛&MЪ─R╢~¤ї╫Ё╗¤╓[o!■Є╦/%%%;vьАC╗tщЧPcqщeAЎЖ∙єoД┬в╫Mр_╫ИCЖ7║i─ФД╧уSХД,IЦк╦Nич@yEvIK"Ёф╚ъБm╫cк│ЮИ&Б▓SlЛЁD╙u┬гСмAQ&пg7¤уw╔бк╫R5цiБ┼`p═е■¤ЧEW5╨С└Вx╗╛ek@Э8eиQ0▒E▐хЇpШ┐Ъ4ыЛ┴мz╠ЖЙDаП╓.╚·j─▓┬@;├иb■"GК°?*6]є5L├!ИМУ АШ+чqч(░┤ b6╕й┌╔^`з7t;| и dщ╦╠╞O ╙R|Цў┐5$■Xa%V5шNШИWMG╫xрб№Y$ЦИ├Ї&Л▒╔№pДГ!Ш]└Р6:бC4юрфн ЯЎ┘ uб╙ТЦ┤дх?HОДwД.р░└Aп╫ *Ф√Стщ▓,6l2dИкк;wю ЕBя┐ >т`EELю▀}ў]рПSO=Хё№▓│P&LШ &иt ╒Ыe╖KЛЖeЧа╨╨TаEж┌нXЬw║Йn═ в@Т┘y№╩#EQ╖ИкY$кJ▄╬@Muv1Жt1-ЇфmjA∙}╓┴├╖є╙л╦4∙oЫ:+К+;╦▓П┬┌Б)(░ЙLS╒ B╕`BБкв╩4MKWБЙИ.б2╠3Щ│╠fнГДобCЫ К█Оф╤|$i┌╬╨н, sЪ>кы№Qвh[rJ╕№ўв$╕RШ ],"`╪Цбh0z,▄\HТ╙Гж╓Ahчp0ШЧЭЫфн╕Вod'═¤∙R│f{VГJ╤q┼(PQt\aeЫ─ToР?ЭuРfОО╟в^ПЧ.f∙f╗НК^oТщ ж$▓Ёч▒╬ж%-iI╦АД├сf?gБф■ь╩╩╩rss∙хШ╖)$0K$Ў┌kп№▒╕{}ЇQ"СDd╤F▐{я=└╛.]║0[ pCГлA rЦMНp▄д~}gоzРH┬╪!Гц-\ИfBM#'2ЬфШ1t°¤УзРМмўї\№°гh ╜Щz╧[o┘Ёш&ТХЙ*╛5гb=o║y├k[I<╤√О█╫╜■Z│8H(╪2█Р/лO░▓&╦ЭЕъУ-1+1тїШЙ╕рr$эFм< Эv╡Ы╝·g]y∙ц═Ы┐°Ї│|╨Щ═ТaXD·н┼ю├/n$QFТ╢"Q^rрJ1Ьк*сРрТ'ёh╪ЭХ▄лS ВtДъ░╕╙дIу44╫╤Uў0Є√■√яП;ю╕г╜╬(0▓╜.7Т┼Н·_Ў>Ў╪cЪвО?z┘ЖЎv╗вСР73╙╨u▒aXКMJ,цq{`■а╓╘н^╢"T[O4cЄ┌UDж ЁБтъ$~а№Й═Ыw~■┘╩UК╣9╪▀╢Хс▄_э╘╥|EyyiI)Ъ╥ /;тuїю▄<№:Y8gю▐_~Y∙╘f"С4ж%-iI╦(GК╗ ``└rm№№є╧э┌╡{чЭw╪║b│╟cЄЛ`Ё═7▀\╕p!sWЎ│, ╬B▄w`?├A°иsч╬Ё*p|CЦЖBЁ@═JЁgB[╓зў╨╙И╧╗j╞м▄vk■Щз-Б╢БHМИЄ·╔Sю║╖ЗгM█╟&L║╡╟=╥i'Сj╘В|уЖ:Bb╤HЖ╫З{Ў"1З█пў/Щ3╫gЙ√╠█░~ё╠щ#╞П%Щ>"И└Э╔MWфP8C}eр+╙вНЦ$╛Q'┴MЩ▓хЦ║и2ЖOM3G▀ы╕├п·Л▌ЛЦ,Ь ╨Z╙╘╖ПX:bhSї╞ё w&M╜Оn X╠┘u╡╡╫он▀S.ШfvqQU}ufV╬╪▒гем<ТИРlк╘p╠эї4.Ч║¤7sЇ╪▒c╟K99v<╞∙°ўЮ╥^E°1╡lYЦuU╙╪│ /SqdfM%б╪╕┐Я;ў╙ў ' ?ы╥%я╝G╕╔ЄвЖ╙-╥g▐v╦дч!▓8ў╥k╟╜№2╔pЗ@▌C╙уЪщ╔Ёжv╬┘N°!╫T─N╙Ш▐л╧фЙME╝ЮЩ3ж}√╦╧Ol{їJ,╬y2шсTKTБ╒tXMUI$Dr╝x├жЪЮо,K\\U▄NQ-$╙┤L╖южнSЄs"ZиР╧Dl▄╒'╕IU=Сsз▌┌m╩kOЪnN0╪bеEq▄Ч&ЛX}а^Опї╫хфф3╡У▄P╒╣zМ╕°▒ў~ўэC├з/Щ;п┌VЕ,ЧbШ╦ц╠]░t1UтС╦№$+┬мйZСDМ8▌иэв С]C.┐j∙є/ ╪$.Б8И╩бzCц7й{ ФЬз┤e╥-wЁОnM├╞A#.о}cy@q╞вDв√ъ8°─·П[Ч=■q{_рvjФx╝X*┘БlЭШPё"└+╪o╝жк▓╦e╥НСUс)╪JH╒TlЛєq lТL║╣/nСП;q╦зрO5q ▌-├5ХЄJgn1"EЖhЁ─пД ╬╛т┴Ч I╘8ёJ$[BЖR4ф╖G╤/т.╕x4єф IмПF^пУD,╢┘євЛ7╝╡Э8*┼&]Й║9^q+'╓ NЗzAГ+*╢к█V╡ зL"a║БЎв@ШМ6о┌ЄЄ№ТR`P5БWkъ╣╪Є╨wu ВVнл%0Їю┼НО<╛w@k█z4!sGU~Цy╧UWm|{ий╩╞eq▐<╠ГDАГ╥)░╓╤:▐0Щ╤ФирєFгсLgu╔╤h GЕx\─Lр*-с┴Р╦сEЛD <░0 ИЕЭЩj4цp°p0├░Й┼qwЗ,c\╕Hд╛╬ЧЧЧд@╕f"Б│/J.yrs▒їlk№ї7═┘Є ~Ыс┼ ─Y╛Р?РЩЫMв 8rЄэwN▀╕ √╚%┌в5ЯьeplGdКт°Хсб╤Й[╕╛╛.77/╣СV3У^U н ї▒▓pОaЄЬD╧Хр╣└╣Н╟I8#y2▄ЖТaмBерс═╬'Х╒д╕╢$!ВЬ╚╗ё1HKZ╥ТЦ┐░  %┬мм, ╖¤√ў╖i╙цн╖▐┬Д^4rs0ь╤г╟ /╝_Э|Є╔d!i^¤їyєц▒o┐¤6╟q╔┼тЯ().∙ЁC─┴.зtЖ`С.kqМr╫▓%цЗИ╓cр4а├5╙ж╡єw~№nЫл.091╕єчЭN·ЙПOZ╛Иx╜sz(ш▒░?Qъ╘V╡S┴с ╢m╤s┬╕ьТ╓╕╩ P┼ёq▌LШЖ╟хЁЕYЩВeZUХ|f╓Фю╖M[╣Ъ╕▌аьH░ Ёсл_|БD#─ЧEв4№╤5щtрЖ3f<ИFчў╕ў─Оэо3|╥╨A3Чо .ў╪юw╬{z3С9╘╨║MlСДФ9'jN)м[╝l9░I,█ ·╘WFНюУG ╚∙гэYз/Э~¤╒У ї▓*ЩN&■ ┌У&иPF▌┬Н╫<Ш╫к5ъ╘╛!6т` U"шОs2фьо+_}Э└;ЙM-лZ2d№╕MпeиКh║з¤у╓В╓еВ╧┘g╘pjNФзЇ╕пEFNхю=yY9┼%е▐№)\3ы▒ЗЎкЛЄКЭPб║'╔s&LeЬУЩ5f▐\l 5БKЎ╠~ОL9┌┴ J"цu:╞OЯ▒f┴┬╛│g╜ц┌Ц%еeee'w>е▓жP╠ЧЫ=r╤╘┬6eJUЯ▄гO╦№№╕aЦ╫U/x№╤qCЖ╠]╜к>PЧУ[ИJbЫт` TЯЭЩ q┐┴├т╜ЛOВx]Kz у▄╥=+f┬сY*7єо^Yy╣ГжMЮ7kЪЩP│вцАеЛHом6╬гiS/ы>¤ё-ПМR)щ?;╘.╧Ф╝А&aUїy|\4╢xьx9Юи,/kuь▒}g═2N╦b║`bаi#o║e╤ц'ув┤ь╝м ЇQ╫bАчfЎXЬЭ ┬ММZ┤Шdр╛╟M9ЇЯз╫╚S√Ў╔╚╧ ┼в╙V>@ЬNвk▒P╪SPШ:|Дйh╧█║э 7▀┤vуЖ{ю╣'зeв┬XфчДю>▓4hс<╜оZB╖'КХш(у_4y║/Трuш║З╞▐q√╝gЯB^еДж╚no йWja╒ ▐_9э▒╟V╬ЩИEъ╦.┘░ълЖ¤ОВK╫ySZ2r╠■ъГ█╢╡kВfO'Y2,Ь,6▐FG┬│PY6╙║ЄИ▀УЩ1gъtbа╒╞╪┌IЦYиЫ╗acьрA╧┴ЗГоЩ╗h╤вiSАЎ№лgm~┴СРy╕тj┘ю▌'v:▐v9+┬с╕╧3kїJтp╪║╞AFc7Я╥∙Щ/w=4щ■╧∙▒эy]FMЮЕQCa┼╘3│(н5c&9*TVqRi╗▓=√╟?·─вбГGо[[]W-ч╦цOу`Z╥ТЦ┐┤-▓(╤W_}╡жim█╢]┐~¤╖▀~█▒cGА║▀┬Af№р0й╥чL+Нfz1ЩЫфЎ√ЎКUUлg▄▀cц$Ч/k╘Нў,▄Ї8iЭo90jааЪф█}ўП6уй╡─Pf▀╤{┬ЖMvЖ╠╡iЕLfєжn╪В╠╔ВA y@R"▒ME╠иоЩ╪o└м╟O.╒╫гz,*┤#aОUч!¤U╖Щ┼╬╞Р">/Ъ7╛╪u И!-╗ЬpKП╗Я|tsEY∙М%╦ч╬Ю1nїЙhD ╞│ Кs w▄!фиЙ°ъ┘│╟?Ї`─еIз !5їуцLэ█╖o6'gХvxш·;*┬■╔;╖Ь*Є╫gў0a┬$MS№╤Ё├O>1~┘2 ┴КЬ6-Qї"bй][╨Vз=wKn"▄▌ёьG▐~ЯdJDН(║ц╠╚ЭvэнSЮy╩цвЬ╧;╡█▌Sз╬Ду├fтБ╡k'.]М9U#1нЄ╦o╓,|`ъЇЩ╕Jюv$▄ТлM▒сuъжцJШДw,5fш░сДF╞Щ5oюдuл)щDUИ$-Ю;ўююwxNз(GГБеЛ╫╒╓.{№ т└╖Гя║{·мЩ┘m█┬ё■·┌ЬОэЙCвд╟O>jЄДi▒яК─cEчЭ=╢Oпп╛ ■їOwR`iм/.╣ri╨eAn ╬]Щ<їЕчИ!Y>▓{я]={<№┘;▒ф┌Ш■╙Б9 цJ^ў═=я:╢]{х╟[^~ёОc╠LПДпЫc╧╣ц┤Vэo6ШtlY,[є╪╞╔¤З╔АNЧ┐▓j╓╚╤3GМp┴T┴уНя█╖цй'З/_Ж;bKсMЫDвУю╕{цУO╖╟Д'Б'J$шt╣ИiМю~╟В∙ IL9°╦╛№┬вM╧<█k╞4█0╕L╧╧_;г╧}gЮ╨i└д√cї╡ЮЬь1у╟╬▀Їю@а╬@УЗэqч]╣Щ9<с╡u/╜Є╩ч╗┐|°┼IMС]+'N8hИ╨н)+╫нЩ╕v·▓dR#ЬmO>|┬Рс═]·└╩X╝z╡│e рж Иrє8и&ъ╛¤n∙ФY>ЯяЮСГ ╬.╬+Z╜xI┐┘3сИ·┌Г╣E-юя~я┤1°6-~ЄiЛЦ╟.Э:a╪ыИУПk 7Ск▐¤|¤┬eD╡┌v>сТ▐▌n▒.<у╘╙IВР`t╤Р┴#'O[Z0yv╙цKЦДk*2Z├x&JeїЁ╗z╡?╢▌▌¤яГ9П Л▌[^~щ╛)У°м╠э╚чеХ│чН3 bd9тР|э┌ДaЮf▐ а╠i ╕9/+╗▀░0Ёkё}xш╪QYyy╚аС─ЇC'ПЫDтJ0^ ЇугV.йо*+l╒ТШd╔°√З▀?¤гMПЯs∙Х─хZL▄╬iч\4хеWрW7K╔Pvj\╡x┴щq&,╢}ЛHАГ1hЎ3у_я┌░fЭaЩ╡сpлc█ї:э4сLШ0t╕DDБуkk№Щ┘Y┴pдд]Ыa#)D╒>зЭ▓ЎЯ/СВ▄╛W\│цЩчИaН╘ёєOсrдьYxёї^ГЗтN5аU7;╕t[Рw▀хW<Ї■{Н|╔╖И\├/я║фї7│tbыJ╠ЭЩБб1ыjIFйк&nоП├УЭ ┼А╣ДИ[ю:ымGЯ{пPT8╓э№sЯ{ч]тrE=hр╕╤cr;t─▌БzJEў№╒ФвУO^5f| 1уqх┤и;╖╛f╓╠щ═╖UЕ╦═╫┐ ╪Qг│█┤┼pKА°55#╞МY╝e ─@muvI ╕\C─ ╛a│ЬmXсяpў·√еєf╧╔=я Ofd╫7+╫о╖j╥8┤▐ЮГд░▌ТgCKN╕╢ыьП_пЛ╓fчцг╔:─Н8ч┬┼п┐√сk╧┼зGЇ╕фv;б UСGО0l()╬#yh%?Ц/Ь>k╘гы╤ ├ЖKЩ#о╕n1L-К2p^с╠q¤НЛ╖┐О#ц]║▐√мs╫╜ ю─Ажs╚hNшО└LБМ;O?ы▒ч╢РЬGp▀Є▓)sfL{d-V!к▄wу═-YAJ[уТq$Bjлp:╤"wю║Э3FМ║п√Э-NшМ╗>рАкъхы╫ Щ?Kй)w╢╚┐ё┬┐= ╩╦Феi<єЄ*[╒╕;Yи╘ццKGИыЩЦ┤д%-9Zь╤г@▐/┐№┬RК╢l┘rу╞Н f▒╕┘╜ГШ Дв╤h^NОв(ЪвfddД{h╞ly╫ю▓~ш╪їВЄГХ┬┴xыcО∙N О┘╕╘╔╥╛3ыуuU█№э╘║Ъ╩ш╫{Оыrj]ЫВ;╟НР\Щ▄█Й!ВM╒+№░Gq╟y"ю╓╥t°▐¤Э├хtфхя▌єул█▀4yкЫ█│k7ЁUVF&▒Ем┼Х√╦Вёhз.ЭI Hъ├уnщ6w█VP.э·рыo┴╒^sхJPcа┬▒Aw▀╖тЙgp█sQН╟&ш;ыщ ╚71ЄП.g<√∙╟t?╛DАRkcє{ЎєЎsшаjР■Ч\q┘Ig─ъГ5A┐'/╖. jъBА╢в<╘С╕u0╣М!олБ■v╔Ън╩?ЎТЫц=ўЙ╓вnЛEЙ╦;хЪЫзmyЖиБСгFЦЧM2[Ф╒╫и@}ї5+Z+ffтъV8v╫х╫>║¤╝(BШБЁрuДкк2╜y¤╬┐╕C╗cr│sА╫╦*╩UbUъVl}Флъп╜єЮ╧╝ЎZjяаMВ!l^Ч ╤А╧Cnы╛№╣чRaЁ╕єМгЦE╨ыё─│Чj┴HХ┐.зи(и╞╟м\ *?Q[э*.в,°kW#╜╘Й)кп╝╜ └EЛHKк∙2 ┬IуF=▒║ов,/│ФФWO4p·є╧Rх╠С╒╙ЗЫ№╥fl288aN╣╕█┤з_д∙цxтЕ╞Wя╛Є·G╢╛┴\Е╞▌uwы╠╠Т╠╠√Ў .gY 8√Еч▒Вх└1~?а▐╨┐_╕l√vdYМ└iрЦJCГnZ>l╕ж"СШЪ╨JJ[╢{ў№Ч^"С`X72КЄ√^xсh.иLuЄsзЎэ=u∙X$зчюло|ф╡нX╡Z?ё°po%pж(&~уM."t9їTxиЎь█+z]?э▀╗w╗a√я╝є╬╟Ю}7B1lМ!┘ О█Чо]ч(-Б2уАс┼├p╨в~$║]]3д√=╝№2v:.утЧco╗uP,╠╗$╟─╦o8╣m√·H(?3╗Аs╛╛у¤9_╜нЄ яР%У'nїнўЇ[│Ю:)ё2o░-зAkv╖[N<ЎШ╩X▌wZ0'+╫s0к─╒ЙЫVСш╨C№╤й▌юЬ }dЗHж ╛╫∙[┐є#K┬l*Pїy├FМЭ5Уфг├;ZOЭю+LGИm╬я7`╠Ъ╡юGQq+ч-▌6╝¤* ╩ щz▌╣'tГ#■ььl- ъЙiпФ q╥ея┘╗хС'р)╙#1°Э┘w░|┬Пв¤OрL▌]╖▌~╔9ч√╠ц1(й_3╩ъыx∙9▄Xщe╓-[ ╧Qв.\ZX№╒╫▀M{~ ▐TтmYИшЪOrж]I╥ТЦ┤№ехhqЁгП>*..ЦeN4ифцц┬╖Ъж¤■R~аддфГ├\IЬ2ц▒РECRc┤;Yr║╩?■д4n<<nўёC.▀д^CfнXр╘ь3OЕb>∙"Ы8зП:z╤ Wq■╝[я╗j┼A^kq╓i╕╚k"┘║)╕╨Q@з│v╦╨%]]H"Б╩fщr╩(qтёЇ╝хж Ы'Тьпл╧).FЯDPЧс(╩X╒L█╝n└вШ│o║~┬ЛOБЄu▌M 7<╘5в√-Л_}БnЙ]{уК5Iv6EJрў▌xїCя┐a&bВ&║■Жп┐j╒╫ЁЩ$!╝пўщзм√хл╕┐╥Э[<шЄлЦOШ╬╖iGjл╤╞щt(╤аУновБkd6ЙЗl├iс╠X"ъq{√t╛hэ█oгbsRu_Y9╣╧░щ"y▐юW^■─╝ХЬ╙еД№БD8лд╨СЭ┴чfБЦ╡┬▐уы}їНы6=Клы$'7р Ї6UБ┘ю?└W▄вт╗яJNэ фДыюy┘└┌)ў╝э╓ O=e°"T┌╟с└вАыd`╛Ы╧┐рЩw╖cw╚4{J} *xц[[W∙щютvэ═а▀ЦKЦнX6~┼К$√r)g╒AЧН8\G ЕeЗoЁ=ЁЎ;$QНЎ╘Дuў╣g?Є═Gx| √╗ ▀ ╛j╟{l│%Q°с╫tЭў╪CrЛ┤GDч^┴р╠N`d╩3ЎО√цн_O$i╞РбўП/+s├Сnрщ╪┴Cч╜ЄКЇє/VРzH <я▄Хя╛Пю8PмxDI─Ь∙∙z▄=в Аl╖[Р]┤·\ўn7m■╫Gh ГЩЖeН╣ёЖ∙+Wс╞M(Ч┐■▐█o°Нb}-╥ ╓[V=Є(юFЗЪV╫*╤ЩУz_|╔║UыL%Бa┤m=a█.АYFР"№}╫_√╨ /гТ$╤РЬО^7▄░■Х╫bї╡▓╧'∙| ├ж╤4ИЩ╕=└┤F^s╙взЮB/]О>*▒─РЫo^■┬тq╠4d№р▒$#n'·Є+Ў╘▒#з~Є:qQ'gНРИ╨╗¤Iыvэ&А╢D╪═0v"JжФs U7╠Ш0ЦtlUнїy<╬╕8ПЬ▄Сxh╘wNЪ╒їцЙ[Ю$А╙ёЙ│·Ю°т│k a,6шЖW<ї4эаR=Цx· ╕бП╣■Ж∙Pц· ),$&?ьцыЧn}═Щ12Є┌fMШъ<жНтпu┬ЇГ8╠░_8й=Z═5УhЖЎ├^3EQF╙#OV?┤╢▀фё$;УDгўП3ЁЮ^Е╛,░X3 шDзC,╬'╢Бnj<й▐∙I&L"=╕`m╞╒uП>╥o╔b%ьwхX─┤gqZ╥ТЦ┐╢-┬ЗyoПзккк┤┤р╧яў{╜▐▀┬┴╜eН8╪е3т 4г)*╗(░Ъжь? \Ш_рr║H\щ{с∙k▐xЕdfї:яТї█▀!.^Л╟р╝ьШr╫SW,фr▓G_y¤ВчЮ'YюP$╠┘\F6ю"╥Mr╔сД╩;03▓ГуC5┬a╤у╜ц╘.gЮz┌ф╡kP7к┌Ygt∙╫ў▀вg▒оsGУ╫Q╗"и d░b7├ЕbГо╜z┼╟я┬Y╜/╝l▌█рШ╛W_▒цНWЙSXЇє¤уk╝t)Л 8п▀аБ#ЗyOъАкWj>√lх#знXF┬ СЬў╢пЄ└┤╛@dЛ─tїч¤═_:`┘ j┴КЗ╝`┬╪╤,ЛTW°Z╢д:Ь╖УjГbNaУИ╝^чЯ}я░)7RWJ┤╒нШ4щЮknЎЮzR╠_eZ·3╦╓▀7z :QВ╩JD ю┐т р?^ПF%╖ўЖ┐_Є┬╢╖У +B┴┘ цО╜врёРъ┌e│ч EЯМ╓C|▐ ={╠~|S░lVыЦ_■ыу-╧<;cЎ┤f,б Н7a■Г+I0 et_ЯO>AГдШ└Oo~ьЪntggАЪЯ9h╚д┘Л╘y║ъЭУ3°Ў[X╖y4рГ?4а╝╫╤y┘┤АZЖ\p╒Єн└%P▌ж1У>¤ЄЛ▐|ПоР▄┬■]╕ъ¤wqЭF╢BцО9n╙zт░═Д"H╬qЧ▌tB╦╓wA7A╦є·°ёгю╛юЦNч  юuў]ы╖<Л.└4є═м╗ю▄[]│■╜pеТм║:╕!Y5jD ╣єРмF+▒ сAўЎX▒∙IъёmС`h╒┤AE?w·Я ЬQWw╧ї7<╢mйи 4Ў╜W_¤Ё+п`ЩE9Їє╧╦Ц.Эт░║4b▌╫┐_fQ>ЧУ┼bЫ▒┼╙ы nZ7 D$SЫ;y┌╧o ыЬ╬зmMH┬╨ЖЇP▄с┤╥∙dP╞5╗~|щЩ-БР_pIq█7▀Zz▄qУ\ %Щ6bДGH<·▌gЯv>¤ +3╗:Ю¤└2▄Ецє°№єНk╫e;]Цb╚╝╨зo┐■├Ж╡юt▄DШXць)Sў~їUыВ┬IлWAз Їє▐_Оi▀~╩Є░Оq5\]│a├Ж` `Ц╧уНkj┐бГ О=Жж╧╤B?юyЇСGаwаШ╛№Ь╦п╜║├)'г ╣╢╓ЩЧ_■╒╫П>╝1;├S^^>}цМлo╝ёВK/7{6M╫ДTюTd@Л║иЫ8~ъъ'Ў0c╞Ї╤sжwш╘╤╞n∙╟?ЄO; ╫ОBїO?-9∙┤уOм ЗФxbX▀бCЖ <цв│Ж╬ЯН ыЬ8└Ё?¤║є╔з$8;С!O^╢ ЬИe╕|zХ_Єe╗wmz№С¤J╨эЇd─э╛}√ еЕ$/ n╛r╩МП_|э╝є╬щ╖|ЮVS╣i■ЄЭ_э╩<╡єМE Э`ОЪ░_ў╚┼нJ▒¤сЪВИiLк+їh╚╣ш\┬Лїq%╖┤ ┐║╩ЄHm}Ж╠{y>У┘х╚╩╠╬╬фaьМ╣н(б0з[╣┼%╨ь┴ЪKЦrZЧQмкм┤гС┬м\_╒ъkkКТСХЩСЫПK╪ЦmFQ╘x┬0,┤цёvёqш#H═Q 3Л╞TEЄ╕ЄK[р4Лz ═Wъ+*LU╔╦╦у%╤ .К9ЕEpeE╒$gc▓┴ФiРfmЖ┘ВEю9єВН╝л╓ DГ>╤хi▌-Ф"║¤лJ╠*hс░КcJ╠.neTV╟83│M+тrXёx╕║еD,.╣▄0бr┴sуКY7Б5c╗оо2ьЗ..╠╚Хаж║Э бДыj╒·Р╙)√КrqР╫Зъ┴┤F~~ЦЛnВ Звїї E39Сs╣│є e/▌Р MP[e╟в0V=╟Oё║@ЭкkN╖/3 ▌G@ЪQWоє:╗ ▓╜∙╣╘╓k5о(ПЖв.З ┐КўffyK░ХТб┐БqуЪ )с╕вhN_╢ЮЯ┐Н╟ВїujB┴дЖк.╗▄пW╬╠а╧Сhrщ0╘iIKZ■фH8x┌Ї╕╧ч{чЭw*++Б|д$uш%╠є╒╒╒╦Ц-5Л┼AC╜ё╞GПГД█ўс╟mNыB$ю╗П?щt╞┘tYН■dЛЇ°Зў>ьxю╣Ё№эЗя╓yиf■ Mb5Bs0И└5`X╨DLВЖ└с╬$LnБ*╪└Ї!Ц─ЇYS$tiI кb╨5Юю▓2i АJчdJ╫D╖V▄`' ╔Г█*▐Бч-С┌█lMOp&'╣]─рЙ╒D^Ў:1g █▄ejЁ /)Y"Цaе9▒8╙░ nm▓JбИXK7xЧМ╫┤tKDw╝W,Ю$iМ∙Lc CХmЛо╤╦Dn╥ytВСSщИ)"┘2эXP▒p,Ї ▐є;єtЫ -54жnbD█ СGK']j╖iЬaУn▌4що/╕5/&UпО╚░7-HЖfЛЖkтл╨ВMуЭ█ЦХ┴п1│ KВў┼ХєxDч-╔Gб0ЪК╫ё`■eвШf,┬╣Ь<?▄;'tё░. .L▌┴2╪╨]ПJўКAQ╤╪╞Т з"нпЗIЭ6hэа5$1Щ╕SHk4;ИЖ╬4Pk5Б╠ ░И╓ьдЗY=нD▄А^s║╤m╓в ?,л1▌юе╔6ЁX:rL║рЕсА▓m▐-у^RK,Ю^qЬчP┌&ЙКрё■*Ij║c╤╘6╡кnц░1У╠з&QtдLxутЇxзкуОF╧Pг 68┤?кGў1^┬м+ЬА 0ЄКeЪ°;юабb,═└kЪh(Щ╟P╝Цf╪▓+9G╖Ы╪Фи¤Л▓Е┼▒d VR!&@└└to&╒iк_О╪З╪Mтп╛б┌.╔┬┤'t═ 7╢k╢G8mЛgСисЎGєТёАP║-┌"аKR╟еО╤$Z│¤╤фc4 ИХZ%eъ╧dу╣T>Тd3%┐VpЯ#▐├ й$x|у] C╡╨Ї&P4L╒╣!Ш5╟зR▀ $їYу?ЮD)т26[Ыn┌Q╪т6u[хТэ '$s╚Єhy▓iё9б1╡{┼l.6^▓i*╢&╠,аJL;F▀7йn├[}Е,Й▌ЧТ▌Mi'У|4>J╥д╩р'Е┌ i▀╠Tz7┌VйgАж╨╨v2√пm▓TXT&.2^╘▓э╟ж╞^ГXA─4Т▄ЩZM│╜ё╚0▄п█Рu0═^g6Ї∙!ЖmГF09ЇЖJSЫ!M╫Ву*мЫк`╙■ei┘ьbЗ~?0Ъ┬ЇрмT└╘■.╣w▒П╫8╓▓<╬╪ >СHФfц╦└\┘мЧщHуHrWn├6:Aву■Й&/a -Л╖t┬фс╣Ай=│╔│и▌Ю9╤Оє╨ ╢м╤.ё°$рЛhИЖ:;[nЛ╝EгЫ ФJщS`[&f┘fхa шx№1аюэFv─│Я╘лНГ√РО┤г╔8ЮЦ┤д%-F∙ ы &цy ╝чЯ^u]7MУуЪ ▌Г▓(К?¤Ї╙ф╔У сУ7▐xo╟ОGНГ<¤¤UL=ж$|/╙: [У8Y#ЪЭ&l▌RсcЩ╟ЬмЪaвLБП╞ф│єсZАTиKS8╪hzв╩Й│t╬6┘xц╛ШZЇiФ╔НAЦe║&г╥ K┤й╢╨U├эPЙ.PGUTЖ7░жвlШдQ$╢GбЎ~╠"═╢щА╓а-Е╗█kA╣Їдж9═-[G&ш~[Ч8Йcг&ш$gsh├Fы <з╨c"о╔ёk╝(т▒й▒MGЁпў╣ж%-iI╦_QОДГёx\Цeа@╖█¤уП?vш╨Aг6{<|ЙD^}ї╒;ю╕Ъ|ў▌wсчu█╢mИГe√qЁФSЫ╟A╨р E^└хKкХx─щё!ОеXDUЗ╙Й6░Д":1OоЦ▓a№ mjДk╚╩└ьЇЮ}·ТЪ6╪rп-│▀■╥O╤А$╪а*э8U ╕h%9Q,jEгЙ{5┤▀ШQ9╝├SV╙Fsh>╕Цnс)ГЪЭ╫NХЯн;ЄIУHу▐┼C K╘фCMLdТЄ╡У')РXмd;РFу O 3┤dВР┤шQАтR╓4ЕZВD T(Z█hQ4дPО,┘╘╔╕vv╥DREg+║ФЄЫFХfLNД&BaВО╞ MОMКIk┴,;╠╨'╓2&╙3pб`ПИА_╨22]^F╙быЙщ┘@█вАw▓йЯ<г:Т4╨щжA7├Є\╞L┘їq╦ ╨,sЄ╘ш─╙Ц└ чN^L А8J@нkжДegmNxfyвwGSmN\╓o`BМЯНЖ'ЩСfУ═IЪ эд┴rw7Р║шR╕EЧ4.╚5\╖ jL╫и▌Tцыылr╧З╓L─x>╟6^в?РйKВНШ┴╥r╝╤d%YZ╡dъжc╙═ D)┌"f?фУc╗┬ц╪~╡╘*sТ!S>3Ц7▌№@?oX░хЪ╢?IZ░щ╠Е#йNol┐ЖЮрМd;:йиG/ ЯK╡5]ї┼у8┘└Лg2╓з-П'дЎЛR`bK╧Т═7О┌m;Щ>zqj╤s╥Ў╫E│lЩ╟A%jt╩БEА╔}ЄXА!B1]╚У╦╡╢╒╕ Ы▄p┴!╔&Ён╨╕УбсЯШDS;5aршs$┬гI7╬Ы╔БfШЪ╠Ihin╬┤╥6}д╕$єЩН█ИНЫ&'Z╠╫З╨аiLKZ╥ЄWЦ#с`"СА▀d`3з╙YQQ╤о]╗O?¤╘яў╔Х─ыї№¤ы_ >|8├╝╖▐zKQФЭ;w■┘b1ш╪д·▒╔▐A╩Q■·@nv6б^┴PпЛ┬йi╞ ╖╧лjкhЄвCК╞╔у4щП╡▄IRGЪН Ыюd╚вв╙Ж)╪ЦИ▓T*f7n▓Щ-Ei╝hуц@ЕjpРVъ ]LZ╤D┤Ц ╤Qjl╗u╧mЇG!I&╒)╠q╘╩Ш╘гЖХtї%НGтъЯaО╘J+╫╕ДjзLDё╧dxe'┐Цyfk4mK6Й╚ < Z*ЁЗlsN▄Э╟76╤бД─n`ъh╦Ф╪ц°├О╘S#░$hж%;Шs ╝(Єl│6Z)W!1╡■оQГAБ?╘╘╫Аъ▐hп┼}УИ▓2*vKvЄЖnЛАA1h█Їж╪2[|З√)8вЫ°Xe▒UL╗!└!·├Ё ;* Z ╬▓шb6ЧB╔T lў'эWЭ"I,бщRhSрШ8ЖГ╝ ╙Їw ╠$i╤%√_хт3У╡─Эм╔yi0GZ╕Жm┴АO┬нe┴Y+sIЎ▒щ@рSW5МфB}cьA╞╥ (jЦ╙├!╗Э'сX8CpбЭ╠%├L NЗ┤[зCЪгЛ╚ФМtС╙У│█╔lкqУоуr╘Т▄8ДXщC╘тщ╙ш├A0 GЛq№6т─3б─pА╚<Ьа ЖmЫtВ@7х&[▐а{>шf?┤Ї╞шr╣З╥YТ╠ujFЧ2┬\a<$╣╣C▄Лbr▐ХЪ■5tЩР*0╡Ї┴Ё▐4$Yд[)<Ъй&D╤УcBd\h&няй╜│iIKZ╥ЄWХ#с иoП╟#Ru▓wя▐╥╥R`9 ═7 лНb▄П╧>√ рПa▐О;ррн[╖■Д_№┴┼0УУщЪШж╔5`pD5 Q°∙6,^B 1R┐╪bSШHYSЁMpщ─HmЦчТW░ЪZ┘╢}В8И╛┼&Sо║хb{╟M\-3ь4┤аН4▄[EЭЩп!Ы)n╨BЯj У╢Ыд└╩:TХ┌M^Ы╝6Xa╪нркR╙╩R╡dъЖрЩ¤мб)T├░e─р╞╜Ж╓!+ашУ2р5║у4u╗сS8Ш2d6i▒дeкIЫз ╫Дю╛ЙсДoт8╠7Y╖эдП╟oс =_гф ┌M(НЦ╙Р■{╫'EСїлsў─ЭM, *ж╧Д їPAФ$ц└Йи╚ F@QDE╠9+ &TDPQ0Л∙<╜;L(░lЪЭ╘9}п║vЫЦ=рЁ ╘ Зcow┼Wпк■ї*Еiє=╙ИHJУu╟ЎЪ╢Cq;&'Kh▌╝y│эЦ╠3тэ.ЮE╞╢;Ць{Ў:d╣D░∙╨2MITИ_┐┘\З6╪╔ДЪзЦГЭE9Ё/Dh$;U70╣7█kЩ DЪo;╝╚7:Ы ╚v<JPM\ЯkЮ╨$Kю╓ЩCI1мЕ╪|>_&╟=╦rDБОФаЛ'╢═@UD╗Щы4)звiZ╒рYqVl"CиЙАп╙├fC].╨т╕hжММц1 gт'5 спoo╥╬└·я·<}6o∙┴|╟ЄmрнР[ я▀тПє╦yы&м╡р1pYЯ╘┘рлэтЩq`Д╢ы°иН6Яэ┼F┼mEЁ╧ё = ╞Д▓lOщ ┼ЫвГn`Д└kклл;uъЇ╓[oс¤▐╞+№1EQUu∙Єху╟Пў╝■·ы@Ч.]║;Л╣bsL╪VгM╝ё╫'-ЇаSЛт ╓Я ▌8в&ж╞lK3У╪pй~QМ-O}┼╚╡ш`c%иЕ╝l"К Тn m┴K3{[/6б]╢"▒Н╩i=RF╦%RH+`Z╨Зpz┤╡ДЕ*╡Бbбu`6їы7эЎ[╩l╦в[ ыЖЙнgsc]▀(@┤AQnцLеП┬хq(┤2Mylr┬43їbК_Їi▌(mMQ4ПЪЖ%═KbC[9 ┘ i▌Юы"√kЁ╗╜Z┐D╝`═m╙─u╘╣9%ыЖCa░ы╫MпU╒m╜@╫KS▒_:YLAAёG╞ЦC qSю[;ЖzKщр6╬%┼&@щ ┼v J)(((((((╢kP:HAAAAAAA▒]Г╥A КэФRPPPPPPPl╫аtРВВВВВВВb╗еГ█5(дааааааа╪оAщ ┼v J)(((((((╢kP:HAAAAAAA▒]Г╥A КэФRPPPPPPPl╫°▌╤AYФXаГМЗр#∙╫1 └W|Є┬Пl╙╙Їе╠║hB┐,┌ЪC├ЎЫ_sи9IAJ▄ц╟жўEQ3~ A▓ы┐^?нL╤│┐Йп┼n╓GsH,▐·▀╢ ┐бп(pv=O═¤fчБLXЄЗшсxCo╠·9Є╫╧╦╞∙*╩╗╧рШ╕тў╠║4┐q┘√═ ]╧Zп╚H8ы╩▒Iё<Ё╙ф╩g}ж┘{╦ЕЛZ.▀Н╥╝ЮГ░Ф7╚~иsБ║6√bЩї┐{°┴ 4Р]?Oa▓╫╝YhMz█./[м╖aQz═Г7иXс=пщo,%6,ЛMk(┼я #:╕ЄЧ щ ╟░Дl╙Тe╝┴sI*Q;Ц╞ jTQ4О\1 b9ф╣╕wТ°╡-K└ЗC║ОЙ"т╪ ╤Исq┐e;Hрq▓ ├О╩Вы8<╟л╣L4sTНЧгMь┬▓░_9Ъ╞G#Z!I─M█тQu БбГ3С┼!cLCсeд("[╧с^╨╖г>╟·ШТfЄYЁ}кр<┬qС─┘╢┼K╝Г|╙3БUИЬtЩм$i]╟Пл&У╤lA/Й*╚┴)Tsj┤$ QШ╢ЛdrTЁ-Щсуж╧░\6ЫЙХЧ8X╬FBРСэg ┘xYЙ iеi╘QD▒EЕЬcK╕Z"PA&пб@W▒2rЮ┼B░ 5$рКJAAAAё├ И■╨┴ў7вГA╦0q|ОЙDфh┤РйПAяe┘ПM┐єь╤Ч├├№G?юЇ╙QiSiЖQфЗo╣m°ЕAx╧дI7Ю//ГЮ Ц╟¤в╫l╨оц{оcшRDn\SЭккBЗY&╟yЕD═B7,∙··xey└▐D├╡YN0С╪QxY1$F=i6DПтQ_с ╤uZж,RA(0BАМ├ц !U>aкy)uСгZЖ,)ШЛА*BЧ╔ztё@Q┴╖бб╢м╝╥G^┴0b▓Ьk╚$KJ0Э*фQ$Оt`'q¤оы2@}>4Rв&√▒╬А°╙ў=╧2 %йп^[^┘[щЬ══пА0+$Э║к;в┬лЦ#ЙШ║ЩTд└>фйЕ\ш06NB║Лe_d`╕l╛б╢"^юпйБ▄б6ХВуYаШ┌ИAaгУw╦дIуж▄А-╗>╕Кm█КВyЭн└ъа╪╘·ЖhEЩ═░6ЄАдbєpFЦ═х▓r,┬ЄB:Я)ЙЧpЫАC`ч;ЦЮwL11=4Rр7.Ё6AЇ-Ы`ф@Asб╕Єy╡M4ъщЦ┼╕▓$!╦├╢2*рЙ}╠╒\▌t|ПХ'ояЄЫ qЁ▀ъъъОm;└│V0EЦсy.│vu╔;@╩5Ё<╤╠Bc!Пс8╕u╢@№┼ЁР└:║Z░Є%й╞╞zIО(J╙Q?(ieu#кИ9'ЧфгPЬ╛Еtаї▓╚s(_╨У1Тял#ёЮf▒╤єpнsy╘hвь1 ,╥ТX}жF<Х╔2?Sв1H ф2mв╝$Р6J░VUгЙh`л┤у З жЯX.жсmЮВъ Kr╪/■╖═┼ ┐=E╤╡AL]ч8.СJAcдkф╥╥zїЪ;▓╤E├╬╣ыёЗQi ёшЗ┐█i╟╬╚2O0`ю sзЬqdПYя╝Лd╙A╟х:-рx╬9 iоi╔Ш[╪╛n0Т╝ц╗я*╦л Йl<▐Фv]GКВ\ИгH╨У║A╧n°└_ @╢1]╙)▐╙╛l%вHцЄЩXв\AяgeЄмщЁ%I·kЖх]╠ж\▌рв2ЮFc<╒PБ°jЖ╣О*1╙0#╪BЙ╣[&ЫС#ПmK╕оT0r)9Э▓п[ 6╟БЇ]█FТР╓ЄЙHBB|█]o& ┤MKТdрRЮa▓Т╝j┼ўm╩█pЫЭ_ЙсЇЪ┤"╦кmЧ╔d╪PЯ)л(!Е_W]▌╢MЁб╫╒*ххv6яЩHк(╧:║АГї$ф▌6с┌Ш╧TЦФЯ0т<Б(╗XМ>cy<М ╚1фп╬ЪН ╣▓ФЭ╟є╪ч{┴┤(№╧u░═,Ся┐№▓║CЗM╡l▀vШИвЄJ2^╨T╨▓ щГА│9TТ@ЦБв2Щт4\KцD█▒ЯaПе@╠xЎ╒vl─ 9]/НD═Є ЭЕбИn<0∙&$0╗aВО╤8$+·═у В└м[_S]^Uйц2PЎ▒d╥│xрDY═хвёvя8@е▒Щ═(ф,+U^ЙSeqI╞`√wоk#Б/d▓1йЙd■╘╧┴6]╚├∙└Ў98║мЁЖe)"╚╦v]Зg╫p╫Хb▓CFAЦ╟Ўr7пs█ГБ,FDИWsM(п╚Р/╦┴Жo[z╙ e%╕╕kkк+┌╡ЧЩ··ЄD9j╠┌"/дтНЖ╩LМ1'Е┴PcсвaС─Ш>жГЮВ(дааа°ус7жГ>6cA╟@L∙l╢P(┤▌a ╚6ю╕|╠йgн┌{┐'╟_█чШ╛U=║#[s8─+шся╗■·Ю╜zю~p╖чо╛■и>}╦{Й╬╘ ў|╪╞в╢" ЖщD$bRrа╟╒ыыФ╥▓╟ю╝УA|>ЯЧ$e─ШKзМ?сЦйn6╧З╠TШ╞┼dшR=╧f8Aї Ж▓щqл3╛к1v@0-ГН╦ЦэшжЦМЧ ╟CЛн;"ы1Юo║ШsБЁ:H╫2Ё *╠%z^6WHЦд╓V╫T╡m┐j╒кvhLЮB ╣╡u╒йTЩ─уC+Ы#I°4c╥ф▒У& }DTu"MA'MPDс╤05┴└Д╞0jCC┤┤ьС;юdV═mn~}╙`}│h(cж│R"U┐re∙ОЭm╞j╠e+Б4h:тx╠>НK W╨Ек╥F#ЧгЄW|┤\4эЫo╕∙Б╟Em╩4KgХЛx`4x╔фES?·Ёг}Ў▀_Й┼1Х╟ыI╓%х∙84t.░КLp╦─╥█ШNKЙ&@Zfu╡мE╦ЫcжрРО.*╫╡eN┬B&\I┼L╧m·Ш Ъ6╢2└╔L\╚╖@вuЯ№}▄╒у[ЎvПз■Чч]l мпО╟]│-акШ\в└фщ│НлWзк┌A╘XкС╬йяO╗ф╥╦з▐Иdаё F3u1 0╛з╘X4П╕░b ^ сє╢ю р╪ГўLЩr┴5W;щF>G╤и╧c%╢'жk╓ФЦз рmUв14Ш$Нg3*ЙbG└D¤`┘фKБ:G#JаИ╛зъf^НФХуe Q╟┘\6Y^fЩж(IШ╚f (Г╪lфь▒Б┬r╝Ы/{┼-30╟┼ifєЮe│╝╠HR`Мgш·A К?~{ы xsmGЦe╟▓ ╩h4кп^ч─ 'Я4хїЕи1s╙_╧╗Є∙9╚╫Piы╛√+╩╩{ЯxR╙║┤═╠п,┐v├T╚▌р╤#ю}ь╤Qcо>Ї╪╕ gOЯКвl]║о\О═╛√~ж:s·Е#g┐№мъ8FF?g─ИHз╢N0щЙg▓│$FЖ█ с╫`─▒*~П╖ўpОs╙°ё;╢k╖ЄчUЧП┐КMХ┌ЕВРМ7m╦ ╓с▌0qbC═┌=ў╪-Яm}ї5wПЯpс ╫! OЪ[┘┬╙ў<`¤Tg°h"q▄ewXw╞═╙╗Ф╢∙╫┬ww▐╡╦J┘W#\Yi┼E_Ай" !╪└╪ц▓╙╞М▐}ў=kы╬╜ъ*─yЖо╔▒6ж:╒╘?q╫▌Эў┌¤Ып╛: Т╦G 9¤▐╖_┼FP╝ЛДє╓нГ8е$п>ц├k╓|№ю╗5л╓4╘╫s<▐u╫=4їжє.ЗdiъфIэb╔х/╝8░wя<ЄjLUiW~╬ec ПyнаH2╧Є╒▀ ╥ ╧Ы9U═f█╖л }░єx╪M╫?є└#'ЯtВ/К╡║╓vя╜N:ўьЯлл;┤k╧8ЮъU╡Wy╕╬╓ыs╣▒]К*╦}Є╚iЧНМ ┬│ж ?╘╩ЄшGў┼v╙rв<ч∙─вч▓К┴¤Уч╫¤/єЧ-├Й═л(Щzuяы%╦Ўъq9iуЎёЖЬyF}}║ах,\tэ]╖#▌D▒`О╧░═┼Я▌x¤u╗<╩TШГў╪Oy╙ї■яш#,▀Я_°╤Э3ftь√Чяsug=√ып┐▐▒]√}╗uC∙╩f│я.]v╟╠зkЦЪOgfLЯ>fь╪▓к╩мZ░Р╖[ў├▒9ЗmЩЪ╣╝дDХ?ш/З┐Ї╬;A~3(█▄№Єа[■L╦ФE╔smИ/╒G.RН╤├╧╣эё'░╜PТ0a╥t<9╚ёx7╟?8e╩Q=zь╥╜;╬Нкцkkf>¤╘илоBяz&Зу5зЭ1д▀чЫ~ ┐Ї└жКДMV^ёП╥hLў#.╕wjNd╗▄ Зь3(ЯCrфс {rш.╜√тРY┤т═7Бs :эt╛кx╞╡Ч_~╩1╟ьyxwlwR ( ╟дkъ8╙V%:j╨а{ЯyE#╪ЮьDФВ╔тНш ╬%▐°L┼2H╫/~▐Р_╟ ЎjxЫЫ_▀GщьНз ■ыНWu<╝√ЕG╕√║Ы╤╬{L9°ДWЯ]]¤K√кО╚Ёпя{№y#FTЭ┌'█Й|╣ш╡■¤ўєп╝OВ╗ЮxE№'ЯzєЬчЁиИаЫ6'Ё"+c.I2м│ xтН┼H│p╓ОИУо╪└оuїkыШr<┐ ╦ч_ ж]╒¤P╫W╣d№╦>┌w? ┘xЗ▓нЙч ╣■╒чаЇqЎM4f▀├o}ч=$[Ш─┘тГR─ so╜г{╫Г*I~ ╒мпyфЩзFM╝ / ▒IУП▄яаЭО99°яєoG]6·■ў▀┬#Ы╟{┴6╪eLну∙rЧwГ%wЦщЙ'▀~╟]ив 9)ч█ "e%ЭОьБ╫Гтє∙╦{ЇЪЎЄKHWQY<╪║МёЦ`ъ·┐?°x╫├║уХЛEгpў{Kё╔26юMшs╠ФЧВ9kZDAq╔┼з┘╝х╜rч={ХUю8xedЫ5K?°рл╧_3&ШЎ╟Ўюs┴=Swъ╥e┌iчЯy╞Рк╙·▀┐ўЛп╜Й Дж√Є╜w╖▌│╦Б¤·сM!лk№Ukf╛4gшmSj╫№\┘б#$|l┐уGМ▒█аc1M/Xу╬r╦Л╧с─у╙q╨┘▌О|l┘;┴┌ иС╝═°╟a▌ЄВ║ R:HAAAёG┬oL=|·ЕСxипнэ╪▒гm█│oЪ╤eM├7Я~▄циГ╙ЕB▌Єo╗qD]Еr№Еч!Yy`ьХ;i┬w▀~│Sпnїkл▀√ЄИcО¤"┴Ю:~М$E╥НщTксн$:Р$ #сГ┘N?·и┘Л_GЦЙщ t╞Zpf!ЇЇЮ6╓п▀уєцс╙╘T▄+#Mrт O/ZДT∙6ЄTmU╨;╝JяКс├o~·i╝гXЭжтЕb№&ш 9pF7p| ╘г{? ∙5Б╢КxЕ fц╛Ї }{L∙x ░РсїЁыя Ч╜цФп[2s_═Fi¤бСЧЭўЁ¤╚JгКrФv ДSЇ~Ў═Ш╕+ZSЗRхїю{╫ЛРм╢ф█4N┴Ы^l 8ы╚БяЫ= %RxaЬaс═╬╢=ф╕БO┐║)╟┼я!┐r0ЩkкияН╕хЪkеЬy`в=jT}О}q┘ы3>XМ├┌иOЇ╫ё│ЮA2А▓ЄВ╗╢О+лIО8°а=ўйj╙ФЮХ┼Ьg╜║Ї═зЦ╝Б\ ФсьЮ╜{їu,H[ ╥ёуN>сЦЧЮG╙Aх,]N$─АZМWPK#┴j╤Ъtу╩_ц═zжmiЕЦ╦Gу▒┤жЮ>aГ┌╞зXO╩e2йTКЧд┐ЎцоЪv┘шс╖Oaei╞╪kоЫ>уГ┌=їTPє №>Юї'^0ът['WФЧ_ц▀╞_¤К2yПcz#LД 9╪│йщZDЙ0d╦з\─P(М5rЄ─Й▒╬ЭГ%_К&0Jч^╕╞ ыьуп,─&%КЙ├Н:ф╢Щ└├T╠├|╒8czuыя" Л╖UГaГг:а_╧pЧvя~√чя"▀04S>Ч+`u╩▀╬?eрри,Г°*█╢н╦eV7╘r╞щ┴6ы№│╬║ ▐{P,FОMF║Жвп╛Б--ZЖ$e╨>√╛ЇхЧШ)╞вИь┤P"-пv╠╞злcF^0щЪkТ8┐2╡══/шДЗ.■╦w~╜Hч╣▌z>Є╞2dаQ╟Ў╣ўэЧPiх Дфєv█ўб/>G╤`w-УDkк╧╜Ї№G^zєрг└ПsъeзЬ:}┴+╪jUp┌ ъ╠└hЗ╨ЩG>є▌ўЪ6ФрЕ}╪j{┘░aSo╕A└Y$\F@ЄАCО@ю═koЬ<ЇФ!\:▀╔Йd~^═╦ЄЇ╟ю╗Ў╒╥ лKл┌#╙╗ЇргoXмН@И┘ЇП▀Чv▄з╨BЧ <хъk}╟6tыЧ┌╒{░ К5?э█│'КJ^═┌╦.║°╓Ыfа╢UШ├Уc─}z?°┴Тт╔bmт╙p ОкH&Й║Й╧!·qenm▌к~м*п└';Gхgч╧yєTь╞вp╬┴З<·╞Ы╪Р\╚бЄR#Яхяv╨ ╖▌▒GU╟.m┌▒кSМ╞o╣яюqЛц6цS╤$Pє3ў┌oц'Яр╒омЛ╣╗"¤▓fuЗЎэAхF█Ю8┘│ЇЯsН:wЁ╥Zн┌╪ё°╛XШл╘iчЮs∙ OЭЭ╪эШыЯ╡OЭ9аў╠зЮ├№█p.=nр w▌ёєO?илъ▄{╡!╦ж"╩!]ё|▒К╟K#{s▀в╫0s5 ─╔C║u{·│ПчСє╬╧8ЁРYяМЩ"М4D■ЗЯWv▄ilё$g¤Pы ┼ ┐Л╔b╫vb▒ШЬ╔З╧UЯЯx┌ ╫/]b╠р╙oЭє√ьS▒╦N°фш═╠пcбЖЖ CNЩЄ▄Sимt▄р╙oyЇ)─+г║m╔╦╚┴фe╡kЭ|╪aЗ3nК'QНЎ╥мY√ї:╝уБ√"╧╞ЎE▌FМpq┐■w╛ЄК`╞Аxощю3рvyа\┬шУN╣э┼y└▄╜BБmWE╢Т,_╕ Уnь}▄ ╠╢Ax~Ь{■╢█N╛xФЗьs╧?я▒Щ│1uegё┤iєЦ╜~я╗п#╤ў5╙иmШ|ЎE7═ЩЛН┴<▓ы╙п┐▒и▀йCВ)√─К╫ ¤у/N╕`К─pЩZЎ╦│xъ)и, ╥[ї┘Kц╜<Їкл▒Y╤ў▀zў╝E з╬z8▐жКuAя_lpз┘▓"ЗН;╛ab;├.Щ∙╘QП├╞I∙"tщ░a╖? pw│РУbёQ}√▐;o▐]ZВя▐╗ю5flpо ?мGя╟_]ДY2и/оxш┴█Ю~т▐o>┼< 0Zшsь¤п╝ВCОF▌B~╓╦єO6Мчёб0╦ЯЫSўп¤а4Ag`Ь`xsюЬ~тХг▒и ▄дуO^<eg ╜pьS3СЮ>ў╝│Щ┐]n═╗я|°┼ч'№mтL▀iЎНУOЯz-оJ>Гъы'^|┘ї╖▀Ж√t0┐╗а {^ЬНb°╠uрш╫№їьыn┐+╪n╠╗О■╘№y'Ьrкг█йX┬QM>.m┤єЭВВВВтўЛ▀■▄AYЦ ╣╝(тSw ├(jхzs'N>кч%=Эqуu{╗ы_╔ЫкЛ3Ю╦╣▄╙зx@╫▌ї╜oъ Gu=h╖^}Ё▐^МАЎy°T8П ю╩b|▄+YjA°р|8яу┼п √╗uЩ╝ K<├564Ьp▄ё╗э╗>=╫ўЦ┐╣фЗ╛╫4]РД █kяоGОOf╬gА╗жєЎГ╧╝Ё╠3GЬ:╪└Gp0ч^zQpXМGNО^p█├o╝Ў┌G¤┼К ▒Т╘░│╧┴4╦4Г]в▐┐/^╗ъЧ_~^═p,$rп¤ў▀√└ё╝a@■■▒Ёї¤у+╒╢╬╦сm░~╧#П┌ч╨Cё:HM√d┴в_V■╪Ш═╗М█yЧ.╔╢UїмР\п╝ЁППнГ°>╚p}°·ы+Vми╧4n~~Q:¤╩╝єю[їя╙л_┐ЙЧМыu╚с╟9ывчю╫ў╚s/Йщаэ^▌ °a├Ж■│ц▌uEO┘yП=ўю∙ФК·Ж■фГ y=┼Л╦Ц,;м╟YфцР;rЇеP@╢к┐6чE╜оў┌в╫П8(ТHд│╣3/╣╙иDСV°j∙Єп┐·╥╥4▀sX╕ю■┤_▀▐Рх/╬ї ·ъ~7№Д ▄¤░I╖▐▄їШg_2JМDРГV╝ЎЎ'~тс5ЭB▐╨w▐yз▐╟Ў├г9КLлЎ╦╝╣hФЧэ9╛└╥г√ю]ў├ЫlXфgr №`∙gЯ~к·Ц─ёь╕ыCO>~─Щ'3°╕иRb ~2БXО│=Оc]9ЮЕЇр╕яВvъ▒╟°{э╝cз╞╞м(I╤Tкв}√├O:Oшm╠f╛^Ў╬WЯ-Memлр:{ь╜Wп^╜]├Ф╪sц∙Щ№ vзvэ╘╞╞=w▌ї┴9╧Хr└%╫\НG╚√iщ▓Я╛√юч5k╥ЖY╡є╬э╗ьz°╤╜Ї╝крМДХKЦ| пo╙j└╗~ УОOэ╜+и▄Вйw╝<■С' <¤╥╤ч|D┐~¤]qщ▀╬9єА}ЎL╘cС$┐єь3ЩЖ┤]╨ъъwю▓╦N{ю╛cП┐Xщz1{Ї╛√Ч.~г╧╤╜ЗЬw╕Ьy├М╖Ц-8ь╘г√пкDЦєЎмчkъ2Н╤КЄВ┬w┌c╖ю=z)╝╚8┴1Ш<╡RPPP№СЁ╙A╠ ╩╦sЩ,D&Лву8ёx║╨ ╟Э2хй'Рг ?°├╧╠Цу"ЧУd8H7╟Яy╬╘'Ca─IГ|■╝╚,ё\З┼77 ├┤╝mY6╛ МgВЁТ3$╟¤ЄуПXIi─яЦ╫Tп9ъ╪┴6 ╙s,6ЮЬ?ый]║ьЦ╬жя╙7]╜║┤▓ °А@ш yє#╫4╓ъ╛$╥h╜ырKч ЁїЯп╝%╒+Kжm╜.Я;жф·╛осгy1▒▐Ю7╖вмd$ы|Ё┴MУдР*╝ Чух+;uЇxФ╒їL>╙┐w╝%─v█f─╚7╦?J7fYБU"▒орЧЧЪд╛■1╘Юя░ф╨;?╕ЮXАД╣Я}№С J[Р_¤¤╡E╚s▄Ш┤▀С=>[№жнY▌· №╟▓е*ы|╘СXр5u╫]2цЪ╟√a┘[Ъэ╞cхЭ?ЙТ╦q╠╟o/C Y┘ё╩т) y ▒╝яЇ9сД`/нўсв┼аG@їЦ╟╟ўБDё╨╛}0s╩k|,4шГ%oдq╫▓█eiПю┴>leЦ╜°ry4├Gвш·ўO?jdь#Оэу:N╛>]RZ╣|с"█qСФ╚Б=О6 ╬qPн▐x╜Яы█┐_╙┼╙9 IС╝ё&2э█╡пнйю▄є╚пЧ╝eзR]П8│XCЕКї■Kє"▒Dм┤№З5╒}ОlкжД╧ИvPp7▀Ы│gэ▓╦оїїiиЬC╝@Кy■▀п/K&u╣╠^=z|·ь▄Є╩╩N=╗┐ ц"Ёx@ПфZdфв/_}-UV*EФп┐¤ж╫Й'р¤╬ЖCФO?№ ]▀ є┬сGўЧ_-~Лс9+┬pdўр\nрїшЛW_├c9▀╬Ль}·ШОt╨и═*└╦геГ №╞tPU╒╩╩╩B.СEd|п}ч+:tД╬U╦а╗uкk╫м°╛c╫}Сo¤┼Є╜<▀Ъ`╗фТ:°gZ/туЭ╔┼$╢эI└╥0W▓Ё!,ёДoшНойРh%o\╗6UQ╤t╓ ┬!╪к*D# їuem*uMcБрpм╚x&╢┴слG╞╬yЦ$сUwxГГn╒Оєх▓щЖdUEc╛PПС QЇlF)I6.нк(kX]]╓╛ГY╚KЙxp└КЇваi j╢ввЭЛ|═RУbФ╟K╞|K3\╟цQP$8.▐│╝сЭ┼с%u╢m ╧р╒xоС/╚ёДзммшъццWdО Ўм@D°r?,╙жm1$*|╤·[▀cX░╒мAm█г╝Н-Э боР~UЙ" ЫрP^╟У°└з9|Ї`бPИ)▒рli'╕&єьь┌Ъd╗╢Р ]╒2Й┬сБXШ|uu╝m<╪Ж┼:'GьЪzб┤'─0Ё>9╢┴H╟qаЭPTX╝¤'ШEНЩFЦчёD>ЫM─бРQЯЦW╖┴XA│ЁЮа╕,ч╫╘&*╩Гхq>ZUЗ*Rk J_R#IЇыiж,KMТўPжж6.I\,КчИёЇ(▐н74(хFA"▓ \ЧчQc#║злl2цz~N╙ёБфЮпИвпъLРZпРcS%ДЄ"Злнпл,/┴╗pЁ5ЙиЕ ЬИ╦bSw %▀5kх╥╝╣G╟[ЕмXТДa├╦·┌╡J▓пГЇГ┤r┴СщЦ╔+▓a2#сЫ╗ё┌G?ЧkL┤oЛ4,ме╔eaЬГw 10^u ф╓5Е╧ч│ВчGХ$*Ёщ╓╛g!ЗН(yC/СуМMjдааа°#с╖?w0ЙЪЮ9#Пc╢сж ЮcЙ<Г°l6WЩLpf╨═фTL2X╧RбєЛ;о├√b`lk┌Gс3┴┼R<0вwФAзш╕8|IБHe`0╜!┐Z&├KвЙXЖ.*Кы╣@5╙РВЛeY╫c |Z ╢┘Ф─]Щ╒▓Ё~c&БўmУ┬(HЗ~Z╗жк]╗рX╠╦jкW╡o█юзХ?ю╪й3Цм ! ╣L>СLjЪ╠▀=ЛПГQАЛфЁn|e\.█ │b SНf√╛7В,┬cЫтjжГ^3ЇА9ВTёоjrDЮч9.+╩Ж║╣∙НH"C.█рD╫0╕^ФЩih())ЯШdФWL┐b▄Gя.¤ы)з7r$NДИw╦цГ;▀аPX╤R╠`X╙│└Ч$t╫8Я█Зw╢xз│▄GьsЁ┌ёyЮйййm╫ж▓fэ┌к6ХжЪЧВ╪M`р└q▌`лuиБОЕ Ь°nдЩ°°F$Ы╧Цч╙,ь@A<О'> U═;║YU^a┴%l кол-н└7╗оg▀░W╫пMHR"Q▄╖┴Ш╚хUЫEGАжЛ.()лiz╧Єгж▌▄ОН╡В╓МЄ°hELIГЁыъ3е▒╟5m<кллMЦW Б+hF,"{О/sМоYJЯ╒чx6b9╙┤вВь,>/Э|б1ПЩЪБ╟X▌rf$▓<)В▒є▄·╞LyEЩ╫t)J` 5<╝~4╙╡|╧g"B*з$·H╚ды┌╟*pP<■gт-ьЕR ▀&R╙X/Ф─lОН 1▄ЮшeTЛAREФР=╝Aс2┴∙▐ ш>Ю╒╞ы+}&g║╢├Х&ш┌A К?■Gtpe@▀▌ИВ╟qL▌ИFгр xLЫк*DоfБ5FK╦ x/f@"9o]tё]└°·8|┐мЛ\┼╟╫|╣>NП0▒Ё|$ МкЩ▒Иь╓╒|╫Л╞"∙╞Жx*ХMgТех╢e1┴vH ╢■D"Юm│ВР╦чЙЮ╩S Q|a+DЕПЎ┼<▀i QZ║─8Ь`!GF╝ЩNЧ&K▒ MєщЖxEЇЭжяB]_p&▒\╨cXр+йx╥0-YТu▌TЙ!ЩЄ╜жЭ┼ ╩ЗLщ|фi+╔VcF,)┴;m╠╫ї╡E╓A|┬Lp#-8╨їФ_,╦ейTcc&Х┌▄№BРЪЪЛGГcлЮы∙,░їАu·∙<Q>\╝(СБ ь▌╜;╢%╦╥╣╞hyJCЦИя╛ї┤ъ┌ТТ>┌Є═о═ЛТэ║2╟╣:ФЗЪЕЪ¤╪fй·м╧е┐EхaЫП A~)(■4°Э╥ADbБоLDкg8>Є9"#й▓"эИ¤ЪЛОЛ$n╜юЗДF┌╩M%z┘Р[╘╒╒A{ Об ЦeаШZBщ ЬbЧ-|СЖЪШ╓]╢┬V─╗∙АNВИаYД└╙щtiiщV─ RЕюзввВ№╣uЙ$МЩt] :ш° #ГGA▒B│N┤p█rхmИїкu╟д"АLb▒ Фr·В╛К ╛ТЧ (pе@|Бш@А▓Ё<╧c_P]ШаBx╛ЗВWPУ╫с9бЩ¤сё╒::И░=ъЬ|#цwp г2║L╫▒9Псx.`lШBР┼Ў╞fув╫№В ┬▀└I╢┬Д├─▀┼DУхH║Г`Л┬hЮ%А\@6%A`ГXAoAhдЎmNщ№Jp└CиЦP:!Я█╥ааL├▒d J|Sыg╢U¤ B#L┬▄К)$№ЖB@БКТ|бm!Я-┼пЪ_ К?~╟t╨Є-Чсг╚bёжЙd ЩZу[*wЁZ?╟СбыГ╬┴vЪьL$щ█(6┘ УиI│-┤Jбу╨╢-<┤j╔Ё "┤)[▒№qЛт▌RЫЪHW6И[/И▓I|KrK,!РVьgиH╬!┼EДH╖нФ■{┤вWн2ОI╣Рт╪Ш▀[А╨Fv┬─l╦r\Чt▒Д'Вюl╠ypф{.ї+4р∙ы&|]iЮ%░╕G4l=.(fAН(QG╙ШШш▐0╤ЇГ ╢J9─╢e ї~!║║║║pрHЪр┌┌┌╩╩J┬?4MГ╬жХpH▓блNеRd║║uУ[яЦ╥╪РdТ╟L&Й$нс┼ЎR(0}БшBInEк60Г╡2:'V╥є╔64ЭnC┤вWЫЄК З▐И)ОЁ+|Вzя╙щ4BМйаф Р№┘LФ=+0#Бp╚Фq!ЯПБ|·х:№Q№`q у7¤╤─ч0┤Юц z>е─БН ЬшЩ▌а┬a:ШюрSsRюEє┼Д╢Fm$З╪2ё▀,CfБЩ`ЪШЗ`!&█ЖDcтJ┬gЪHнкй▒HФLбЖ╒№7Я)&jЙk.─vG3м╢┴+}0╦╖$:р╗Г╙0W█ в`L├└9┬3х\qбc█gЇ[╧ЇAьPВб1  т&РBgn`.╞╢н┐╨└'ИЧ╝▄║&и8я─,GКlЫ╦g3ёkчЧВтOГ▀+tСп9│ЯїМaГL ПЕЮЙ &─Р' │╣█i╢Ed55YБч┬ И═┘С╓╘╘TUUAS-4мД'СVЄ9БOнX√аЧРЁM i°Zi╛7Е-Нwые╨бC"№нОz p 9]╗vmЫ6m3█╥Ц╜╪ЦC║▒╓M иhR,ЇЄЫД6╞жЇк/PЙ┌ЗKWбPаЧ"ы#CЫ |Х╟;ь░├!XЖщ╗╢Й8A┼├д╨,~PW┐ОaЁ▓ ┐rYeф╣иЙ8о╖v|@/m°╢└0╢▓tЭўРп[rI М└l╞eE+70■1ы╜█,:И╨║┌БEЛ Б░&ж√P▄Ш`n<Ч0BаЖВ$Вю╡k╫О(ъfE·лБ╠ДТЄ┌:zZм╥a╤╖ВmU┘$F&(0|▌╥ЇгвМo╝Ьу┐Ч╧Vр╫╬/┼Я┐W:ш ;g]>ю·█╕▐eГ∙"шЩlД╖H:,╥Q═7ш╟Х *h9╙▒єnc√▌╦·╦╛┼ЦХ╓9 DG╢ж^u╒U7▌t┤╨yГ"!sщtш▌m╖▌6~№°╓%H67▄{я╜_}ї╒Їщ╙б-▐║ЦnKу▌"└ТЇшгПBYB╚Р╚pр┼KDD─uхХW▐xуН─J╖u┤ь█o┐▌cП=а %нKм╕kД,tъ╘ нO'hEпZё5uъ╘╤гG├╨в┤┤tГ▒°Еz┘? №є;ь0xs╞gРН╞d═%ш№Зя└│ш└Г╗}╛|9╝┘ рГ й" ┬2╓ї├? ┘╪╪x└бЗт?┼@Ш▐·g╖╗I4яь■▀▀|#"Vm╠ю{рHт]▀cQУ)9n╙Є>О grQё)3■F|1Q░T wX= {x)бя8L░н°Я}nh·ЗЎё▓e@(:╝{pXО_╜fї├П>Z]]O&аб eЄЩ ╟┼пR╨ЁNеRhєf'6d$\ZGЁ═7▀ь╣чЮнx┘&їЧ4ы$^x═┼▄╣s√ўя┐ )╠x( И~╖Й|╢.1┐j~)(■4°]╥AЖ├Ў?=~ K├FBЛGЗd╫-Ї╨ХХХЧ_~∙4} Г¤┌kпЕ╨2Щ Д╓║√MaKу▌"@q^}ї╒└QB▒ЗжИ-КЧ ▓y╧=ўАў▒c╟nE│NfЛ&NЬrГВr╨║ХС╨A╥мOЮ<2Є█v на╜jРыi╙ж╒╓╓B_N нoG!АчIУ&Буыо╗О╝ й├УП?a┌Ё{ьбЗ└┴yчПD┴)lДъ╩0dJўГ%oup╥IБu0аq▐z═Рї~v`rч√с╗яКУйня▌яX╜pЙыiкjЫxпz<ш┌1ШuМp ╧<,·UsYC╒"ёШЛ7╜ЗЇЁ╕╬Zк&F"■є│gл╣№░є╧~цL╟uO;э4FЦ╙д └}ўе3Щ╔╫_╖f═"лншєл4*w8D┘ъ$с▓иV э &А┬╖n&▄Жї7мГc╞МБA#┤i[Ъ■0уDT°s[╔gKёkчЧВтOГ▀ШТэ┴Ч@Цc█PаГNp╓@Bдыr пp╚сРЖ╞Ь■шн│╬┴=|Кn╢Ь;СЩ&╘<┼Lмzбm╛Т3>Кў)З6!(─;8#k┌╚╝9о╕g*▐3ТQhўj1^pY|Ц![З▓ЙЕНqF┬ 'kКЩ1yА,УцxSёвв┼4ф=сОд╗╩чє#9Єн├^xL╞╞┘$1ТУ)╚╫VшёE&┼ИLК╩!╝vГНКаZЁ b{ ╨uРUx.`hХД?!G-Цo(XYlD\Ж{ЖBъ┐]°ХЬТ╩У<Р,УўDЧB∙ЯО╓ТЮ 9=x }О>j╟Эv~рЮ{·ўя_Ю*Х j:YД №[_|·щуЗ AоГд@╬оЗ 9ф╗║бЛ▒H0D`<╫ёWд│Яыъ)Оcs▓DьАжк╣╢│ЁХ'Ю|▓ч8м"У╒КЕ▐╝y▓ЕЧ╢CЦ к щhYйп ╝4-$Й│}ьМs╬╞DR▒;ВR└H╞█Gxс┴╗я>с╕┴х;ьpян╖Ю~╞йк*╝Э╝3╚│ёIЦcIйЕ2l}х∙ Е╚°П╦И╪╔╨.рСZМВж |I6(Р║┐A╣РyГ-╒+╘╝╒&8ЧС'!ўбЖ_фeЛїЧ─BДдВ■CvКЧXРЇЗ qOД┴ВЎB%"i(▐▓ГZ=IА)ДарсвЛ.ъ▄╣3Д |+LCx┬$5м│┼▓X╝мЦt▀Y2kЙ^╗у√K┐>╝╟~▒ж!√Кщ╟ я╖Et* 5╫\ тХW^ЙК:r2йВAd╟О/╕рВ░ё"KL└б8лWп~№ё╟├╞Єэ0Пqу╞СЕ╔SжLБмЕчZ]zще$вЄЄЄЙ'^u╒U╙жM#═:i╝ZМЧ╠├B░7▐xc}}=4м0·'M8Жў?№Ёў▀чЭwВ╥фMЯ>╜╕kД&"В▀ЖЖpL:E┬I?┌b╝ЁbДДAsL xУ&M" ён╖▐ТNр■рў┬ /le╥6Ь╦#Kу!@╥ФЗGшЕ%╥·|1D BГ╘Bf/╣ф╚,Y4rфH╥РFПMN┤о?√ь│{ь1╥∙AЗ@A'OЮL╬v╣ыо╗BA╡X╛┼ >|°ю╗яБ@DW_}5ДE9j╘иTh! ш°▌w▀ ∙╜тК+HБd└ 9№тЕЗёу╟CqА/╚ Nbi▄s╧=PGf╠ШAdЕ6AI,aўF▄<;√Щc·Э,-]0o~п^╜░·q═Х┴┤╛■ъ+688║╦╛√>x√э#@аa:РE_3╛¤╟7╔x№╟ьz╨Б╤ЄRЯёГн#L░╚в №гOЬ<фtН`уЬяCО~Zё=Д╢t╔[={Ў$eкzП▐Gщё,█Жй│а D З█n╗эзЯ~║¤Ў█├їйd >ЙZPTPWТЧPЖнWUr\<Ф;дЄ╛╙N;#▄└X<КCA'╧ds(<╘ шx~°сиЮ┼юA$¤-╓_H*4GрBГ,CUВ╢¤║ыо+с▀t╙M 7Єr[хЧВтOГM╤Aи&d[¤ЇSh_╚кdr╝3┤╣Ё┌Ёь ┌5b-8 №єў▀DMMM]]ph+╤·лт6О╛B1<ї╘S$ЕPZРr2с Dzгn╕Z№Л/╛xЯ}ЎqC[ ];┤Єdд┌─.]║siRЙ236ОM'╨Vh" █Г■zAаbчЭw8=n0щ┐▒Zi[MИ] ▓*╥А}Г3)Zt║0"Б\@яф ─ ∙Еqш╨бфJ"ч<РЇт■кUлал#ЎKшРа┐ (zH╚d8b─И6m┌@╝-Ц/Їы─ЮiГп шЫ!┴ае06/ №P$ ф№єЁЎx ╨CA=Ё└сЛаP+╚P▒У╡эaў╓  ╖╪ў·°уП>шИ°█┐╜╟^{!r\Я B?Ў╒Ч_ЦЧЦеыъ╦╩╩▓Щ╠╫_}╥Р!┴в=ё▄з╦▐+-)QєDОE;ь▐в5[─ж _█Ыє°У'Ю5 <╣╖╬╢м▀№T¤Э╖Ч╥нЦМчБЧ╜║юЗуїЁiO╧ є╦/YСу▄ p╚їn√ю V ¤/┐№▓rх╩╜ў▐╩4╛cЧЭ/сq╚Fc¤є╦пv▀cр░?|єэN╗я2┬t0╪Нща(Ыўц╙ALBМи qыVЯ ,═а∙▌║u#їў╦/┐сCэА*▐с■ДAPУ┌┌Z╚oUU╒░a├┬S╢Hп└/9PZи┌PM@sА┘├$"h{heЗМlк■1"лWaX.! м└ваu¤ўЫOщ'WГ@ ЕсиШМB!RР4▌РkєNН9@╗AМгPA╚znЦ■WlЭ ч─I!В>▀Еъ ]№U╜уО;P`рДД▌{я╜ чы/ 2 ╡Д╨АM~Ў┘gрЮмх%zСB, C(&Ё╗MЄKAёg┬жш 9▐Х┤`╨є┬╚s╤вEdZпEўdшрдIУа*A√Ё├╔Ы╓ш Їш╫╔╘'жГ6МйёLёхч=<э■с(╥|G1 ╢У╘ЙИg╞Ь■тн│ОG:B└D╘tю╠fГЛ╤ЕGоР╤vё╠ iИйП0h╕/╗ь2034CЁ|┴ dЪ?xэ ╟Г8ртВ▐И>·шг/4m▌#╤ т@є╧гGПЙA8ў▌w▀ў▀)A═S├рх╓[o└nб9#В%ЦhбIЕ~Е4Иx$У2ДIl*^Є┘¤А^тМи!К▓ц║:~ATЗ4┴─аэ2ЇX╫\s Щ! Н|н]x [y┬, ыВ?бБ; фh1╕Ос├WР4Ї╨# с@I╡R╛(шn!┐dв ╞F╨+CШk╓мБО'Ьл"Э\(""╚)д (рW_}╝Т !@ЪБl э╨#)ФVшрЧ╘B└e╤ШNзkЦcШ╝(¤¤УOA╢√tРХ═ЙСш╖Я╒░яАShY║╢╛ы!З"ЯЁ■┼G н{пгL;╚/р9\█}ёйY╟;+8╦ЙьMAОn°О√╩╦/8ПДHЧм4MCВ∙h┼W_э┤cgo Ў╒tz╔Т%O:Й▄2╥X]╜|∙Є^╜zсп w├рbQи╪,Ь│Ь2нesСD╟еi|4Вiжы└Ъ╙LЭ╖ИB9cx╫S#РьJ:h┌╧=1єФagуЧQ┘(и26G1╛a╬|Є╔бчЭ@ш╣@S" ^&ивPИ>·№¤ўS┴║I╥┘├аЁьС#1 Кl╬╠Щ'ВW4ZВбЪрН,╝aК$гЁ4─цch<ЯG═pм▄Т╟▒xЙ╔╤Ah2бГф╢ю┌┌ZР+√pI░D╘└ц┐¤Ў█w▄uр╩▐Р·BTT Э T╚И5s╩н╨+▓■Ш░ Ж1─ТG&HK▐:╙b¤%БC┬`─B╓Т%tс6█Pё╚дm1W#З∙ГGpъdиx$aнИЪ╠фВ╦)SжпnСл<╘ИРН▌s╧=дйДАиA╬d*ЩИЪМс7о┐р╞ЦРl▓├Ъ,1ДФД mII-#Ж╒mХ_ К? 6EбК┴Pъ ┘╗0+Кl]7═ 3ф8░АА#оkX#лл.о├*╚AТE0Ё HОВsШ°\d┼|Lb o~ў╧=[▐├вмXч╙KOwuЕS╒}■>ue.Дo│f═Ах$Qj,Q оY│ЖЫ┼xя¤єЯ ─э|Ё┴!р ▀Тx8╣йgЩчC:уу╣Tї╛uЎ3o R|g║├*\оB>мПл├n}┌s╫[z┴TH╛O▌:к:,aM8Т*Юo^bЄ√>м∙(@ro▀╛pяb0Я┐╕$n|їз┌дьxW _dxI├aАx╣gee=Ў╪cJЛ╖]Ф▀·ЇщИГ┌╛■·k╓ЗА!║RС╧bБвdB═Р" ╤U\е¤;UkЙ╞[XXсДQуъБy°сЗesJE6┌ТkУlP╩fё!Msta/j+wmjъ╖▀~{Ж╜йьРр3ЪГАБPсV▌М3TD@т^╝ўЫ6m╩:╤Ё▄АdM4┐b@F,cў╚ЖЭ8мCt.aС@8A▐x╤Эь%л9:ўi;О─█г▌Шх[ceШsДm╪я▓┴\Ueхk/┐r╦M7╗Rьч'T■└K+W▐╥╜╗┤╔бЮ}z▐ч■▒квЧjdд╫м[з`_ёig¤▐^сAK ╬s+оъzлхтRАГЦGФ╦мм\║dI╧Ў╟ы=P^V╚╥▐∙╛^ўeЭ┤ П╦╔─╕х╦/┐ь╓╗╖ЕБJ=Ю┼│gыш╨R╓оTN+їЬ╙NBb╘ЄA╗!╦Г┌хqK╩ B _Uї6Л┴p<} Згя╤╙ aЕ<¤Ї╙╩╞mg№0Ы0aВ@:fОў~@ИTw]с╜┴@BЭ┤#╘▒гhї$Р{▄чЧЯ=У'O╞Я>°рИ#╨╖'Я|0.╛pD'═▌RqT'?╣ЁdOY╖еIbK'ЧжLЩжс╞Й'&┘,VСmг<=NpХ╖╨XP▓8&y~qТg7nLs┤{ ¤ўы╬7J√r;*у5dшxвDpP╝╙╕ Жp├Ж xr9ф╤1ўє╧?╟├╦▌║uxИ▐ ¤dpРЭ╖ЁтйFУe∙▐Ъiй*OН∙┬ф╣╖кz╩яS╝ЩГе╩V%╡!и▌Є╩ь┼7*Ь─╗╤щ╡}лбD╗m█╢}я╜ў┌╖o╧m▌╕ FХ╞УЫЫ{ъйзтmN╡КЎтєЧ2F┘п@цс├ЗCъS,сп]╛╦Ё^╛я╛√ФцRJq╬O|<▒эВГx?F 8эRy0i╥$╘&z╝%ёB─╦.ъ¤оl╖╠тР!CP/b╚Г╤гGглQz╕╪vщК1tшPL<ф╬<є╠3ШD З√ь┴Х╬чIXОчJВїЖS3┴╫ё!SPlpхё№ь┘│╗т╪KВ┬Oia,°f'аJrмM╩■Ї'╔с]╗v┼Э_q╗A%Ф=°┼-║УIЧ7ш*жЮ,ве&°╓▓e╦▐╜{у^`A,'АT╠;Х╗╩╓_Юw▐y█╢mНQ8и4] ╕ъNёДm [W@Knз+рўo█╝┼[Yu╞╬к▄┐┐FЭ:ы>√p∙·║иTwав|╧Ю▌Б*o█╙;Z.└weaсо▄ь╢зЮф╢Ўd▐К х дж╫|s∙є╫▐|Smеy,а┤сўЭW_╜Ї╥KнїЖIЇz╖eэ8ё─Эй)>ЯўЕчЦ▀┘їОГaГ┴вьlk│°┌k╙"ё▀]╡ъ/∙Л ░OAY┘╢ █╒юМОUбР╟щ№)nс`╪N╕ °f:0║Г┴┴╕V-8ип.>цЬш$ i┌qтF╠Я?ЯOЬ`)+nщЫ╫t∙SJ═▓В▀¤н╧- Nlz╪ДG╝─,ъyOсН7▐╤#GОф╖╗▓CЛсХ▌дI╝у╕п*ИyрHHw▄┬ШpTЮp┬ @Д▄Dз 8~╣;STT╘жMЫЮ={▀шyт╢ль¤j╝Ўю▌ 6Lў0d├╙O?Н╛QН7f╠Ш9sцМ5 Х╔б├(Iи╬пa╝jQ¤Ф╘╖Й┌┼1^пш6mwю╜ў^А┌Зm "N5ВЙ\@hF╠╣имM$╤u╚8}·tpLГф`╪С╕3Вщ@mР cDА╚{Q ╞Оў>Ш├├Ж гаК;┐X$X╛МЇЛ1vА9└ГБj╤y╘Iы@B7╘?a┬╧░Tи▌gыШ8L:ЦЛ2ШP|wёЎjн+░шЗ╓┤╘7c9q!Йb▐iя╚O╛ObЯ_6Н╫┼▓e╦PувrQI^ёеБ┼)╦Й.T2h3z+╓,ЗTХMЛ/Ю/░K╘~QБf▐EE┤Ю°Э2e ╙л`tрOЛ-·ўя╧-ю█╞}~├v`╝oЩ╘+Ьц4┤ещмY│P'^ЙGq╝Ж 7Фd│╡Qxn▐╝Щ╧W╣Oп╕╒лWSЛёщзЯтўq╤ ▐|O▀р╠╖_mк*з:ЁЪHї╜╩хk╪иV█vнъ6▒ГkФл|╢5?пЁw'4+-+ty|Чv>_ейj┴┴(у}3-┴щx+Veb╣В7^ж№jь╒лД:N▐~√эxуп~└aр▄Е╖6!И╞M┌эсЛйx╙)-┌E▄vй├/РY^^!╩г-"Ж┤р(р8 `─ЖH╞т*^ўh┤CЗ╫\s ъ┴└!Їbl╗▄c┬y┤xын╖тхЛ╫4╞Еw4 -м╤ ├П°╙яez╫▓╧z╛∙XFA┐ў▐{YYYttК╦g"'МВRР╕ДJJ\┬К─└мl║Д╙$?v~q╛_┐~─ы┤pG+Р╗иэ║ыоЛЪA│е╤>ЙжЩ@Б $"Аь /╝┴ПЪ!щE0У∙DэшАHSс Х╛┤■д" ¤Ч =╖ИNЯП.:▀╝ys+ОwN8АхЧЪСШUU^ К╬8ьOї5L│ 4QQa!`Д3l%Ў№╩що▀░^5╥xrC!t ┬KВ▒BнKa;▒░C9╢■° а-ЄКс▄░Цjb,брfL╗сx¤"rBЩ╝№╝╠&Щ╬HМON7Wр!ўЛлEq╫Ы▓╧qЯ_>Й▐Гx∙░sўЁ╫X╩H╚ Ў─'ЖЖй╓{C▓nЁеJcDvI аПr@-?b┘с Ь{o╝ё=/q╦Г╒z~QАЯй▓╜├╧░и╠ц?▀x :(dА<·Eр ╟?■°c╗vэЁa╞═╔Ц-[ус╟8C╜Юb|Ш 2o╬>°Ён╖▐:дюК▒ЕqЫх)╣┐╝Ц;├┴<A;TнK)эк┤L╪]щV┤ъ¤√╜uЫжZо$╒hrЄМсжи╨MFFНЕ┴HxUщ╓rД┬|▀%jWEВ¤рАїЛzГ╕Б¤з9?╗Йи▒`gd√4БВ|M2^∙2цЗ2Г√у.L*MmжNЭ ю=Ў╪cG ЖYч╢m█┌┌г├I!гl┼ ─0╤(!`\>3H/╬3GяЧZ╡j╡sчNPL■ЕbчЧZ^e[< Bx╦@ФНhЙ)┴ аmpi°ЁсМ·A7j2P╩ {Q╒ь┘│ё№╨AREб>5└>иж┌9иHМЇ╕░IфХныТлtч'tйи┤(zDe ┌(J%ZS╚&ZssУSЖ╨зфРэFСX·sЕ`╩Ю~·i№тл&;;[ x8В─┘I(╤zуе╪чЧ°`*эQ╒GqШы ,B1╘Я▄j╜7─]cш╨бxGуТюt╠╫Р╛юв^т░╔У'гK╒═╥!·Wе=Р°Н√╝({5╞Цg╓j=┐~q╠1°∙╞k╚╨ёDIр ╥4Ы╛·ъ+|╫qwВеxM╤уН63|]у*До╙O?5╝є╬;исЛ/╛HATе╨бД^ ╢SaL╬╙РхFbYЯзJ&,Л┬^хH│г╠T_/@/Wn&ъБ■∙·└РжOЯ~▀}ўqЫ)//Пйr%DЦXЪЛ%nдХ╧Гe]▄═втЯЙ┌Щ*РK▀lе;Bв═2LрВ╛┘!C)'/еАзГд╨аb▀#FМdu9OеО╛yt87К.D?ЩД╧Й 7>ё─XЛРШt^╓бЙцЧ[ fliєJ+~║щИЮr╩Ф) ╣─єёЫ+_OоА3ш╧=ў▄#{|Ьс* ─*┼ЖГ>}·аcA-╣m■╦gГn ФД█▓╣п/'¤8УTWзиE(rрТ'гZдГуТТТх╦ЧcжPн$ыУ╒√sф└Н╗▐T╠єлb╥╔PAЕГ#XWLRвlMд╝dт╢Ыш∙7nЬ▓Y7o▐<|ЭsФюJВ 'LША┬╥║,0.f"█аф f Yў┌Й}^ТЧWЗ¤№R¤мgРByж·╣╟k╚╨qCЙр d+╨╛6ёТърз&Гp9"ACu┬C╟-|От$=Сa;и"о^ 4Г√- J└ЄО [D9]ОшАВ43Дё╔эNqYёe┬╒ЖГ Ббg0SЎ╦/zHа?-ыI4║цFio%юMP-╟э!e┐йaЁ0ЮГk╓ ЮQэКРC╘Й_Fф]╘0Qy@E#QS`Л╗4ї ─Є╩▐Bв╚GsЇ▌ЙmWвl╕ш├T°+ъ.nHUГ√ЎpШ%OчЁсАBzf╚6∙╦gщПиjиДгвn╪░aHT┤ОDє+$*№Тб %╡GиБhП╠╤s;╡dTб╔I╔йЕ╤Й Ырю]Шн▌[зУN┘ц╜Зф│╛~TD/(╢Йв┤уGЩ╠╦n,ю╒а<│т╧N╠zЇ1JЭ*в╝Фq%o7.ЙP╟[ HДi▀АЩвG-КZo╩ЎXR1╧/GБщFatЖ|ОЇъ0╓Хш9я╝Лf:╒zoLЮ<om╝hЇCtИVЁ+ZI╛·И╘%Дз╪квк(gй├$╤bЄ+Лю║J3╣╤ЯЧDххЭSнч7*Рз·ifфЯi╝Ж 7Ф$I▐BЩЩЩxB┤ёП│З╨MУ╞·xM╤ъЙOиY│fЦр╖▀тS╡╔ї╞Тz▒(╧М╪∙┼ aФ ▓И!ftф*Sг4уtzTInb┌u l╥Щмыl8бH▐vL hQ╬@пa╗Ъ╝ 7qrvnы$;■b┐еЯ kСtвОiЁиЗK┤▐т>┐RЮшЦЫ▄@йю║bЦs╤Ь╤┘.Q╗┬У╪чWпl─I>kЄвулOПX─ў╗Z2Є▐и.╙Їч(nшиичEE4аq/■єл┐ЭД3<∙│О╫РбуЙ┴A2╤╡у╟─W¤eЩ╚ П-?е╕M┴╧?кEpcєц═ё'р n∙№є╧У┴AСj4┬Iр╩кк Ч█сr╗ЬVd]k8ъ7╕и┬╕ц░0г╙>эм ╩ tZlz╕▀*Iвш╛*с?pМў5wЇ$\0cы3l7■SЁf╤e?уlЛ╛A─ЖоєH╘.kацТп? Л┌UQ╢ ┴эQ:еД)эМ>P═╖]Jt┘#гxу6e0ТAKt╔сH\К шu8▀хb╡&░X┼`м(>su╥W╖ ╒ ВHт╬п@L\%TТ╜<Ъў╤=HfAXб+ДїP-a╜╛ыGu║|QИCk├0cн╟╪Ў_OиS-■╙ZWg∙■в0ЯЁMФg║5км╞╕_мъ0█╒)╓!кW·Ч└Qд╕ыM.┼>┐МЛ╬O\╜{╒ZWqAнЬм╓{CЎ:ф╦Р|}ўmU─rFEРЛ┼F╓м╤ЮMЁыЕХ╟>/Й╩│'╒z~uЮшо┐╠x :(дФ┴╫Ю/F0еЫ╒№$Ї бs!^GbG8Из~¤·ї╕e═Ъ5╔р Х(╩ЖЯt/░?╜nK╞Д\╫▒ [█╞?yПр ┐ъЬк┌ЫD║}*╬e9ю@Е#A^tQ$иЕПo(nзтгG█т Kvїи{Дq║&OEb╩─╢+ЮХ"Ї]E╬╒╧│9╔[ нг?(г┐O╡╦zшё-╩kZФyd╚8urc]Вл ╣╔(░ГжH─▒|ОU7 paц┘Б╒▒Kв∙╒yBС╧IС╩┼Ш/*bОn ж│ХИ╘'┤"JаbIyВ┌E▀й+EiжЕЇ)√Є:|╦?с|"▒J╠( BiH╖MфG>G]M╘n\╥wЩДНS&я ёKUЙ5╕  Eн7eЫL─>┐J{0┼╗_╛┴]Ex╚Au▀Є║аJМXЗЎ╟xщэ▀┐_╛Wх5(є+╓вЗ\]q)╓░5╩M;кL▄ЄПP(∙єлєAEВ╧ГL░■│О╫РбуЖ┴AЖзh▄╕▒▓7Л∙zбBG╩Ёэ$6хLУЛуVнZсDЩ?№Ёо$$V─]K╟V═a8"ТCФvxуЕВV■ЧE─єдIУh╫╠┤"}Аb[Ч/( ї╨═:Ос[[ьЪE?G}g\У>╛аqЛ╛1─··NGX3╔П┌К█.їOФ[!;уЛH G$ъЗК|Л╙ї─╔}╠фi?№░їLв,Dгyyy╦Ч/oe─Э¤%К╕ ▓╝о╒╨eз `еi╦д qNT┌ж$РЧН0╟╠яс╠пК─√РQ'Я_=бт<&╙\ANъ`"yМ╔Y╫├▒!0ЧL╘CЖ ·┼(IТ:Ч_/∙╜{ўr;ЧTq╦;lЯ╞ 9ё─qцуП?ЖЬ:Dj╣ ?ЗГбИ╖3╖╥╕й y╓╢m█■¤√╦Ч7¤╣e└}кЭ─ЕBE╠▌(P #h╘в"fRт│&}Xб Л1КД( p№%юe¤щDLfggГ{ш эУШЄ8n╗t,РЪqЖVV┴РёhИa∙T─XЗ╤#├vpWegЕ┬y▄В!╚Ч7У╤б°╖░{c╞Мs │УkeЇшМl┬ЮйъxЖ;╝:Жр╖Ио%р╙+ G·ш╢сN;ё▌Д И├╠№&Ъ_I3╚!АЗрГ░МЭ_ G▀їSvn└н[╖тQт&)╗эМДH■┤в█h║}√Ў╕о╒V└ЇЕ^╕n▌║╪НrCЖ 2Їs╨q├!HMЯ(Нd╗ А╚╔╠╠▄┐?Д47Є:tш░g╧J5Фa╬╨XUИ~ ▓РH┬┘LPyd0Ш8Э╨DН║ в·щVмn'б╬tO├Xж$э6 jA╗ =═╔Уxн,╞°,h2їQ╚ю▌╗[┤hAaO╞ЄvF╚жLТй|аЗpг╖и╗Фн╕Х═8В▒╟|г]ЛR│ё3@RКQ▌hц7╔№КЦN╠^┘Я╕є+▄УБ|√э╖╫^{эП?■Иj├Ъл╗DФМ╗x;в▐1* /┼╛ 2d╚╨╧J еpЁаЭрс¤┌эG╦! АЙ}╟ОKС┴6i╥$П?~╩Ф)L░БУў▄s}oQ├─Й╤╧=z@вг 0 j3fМШ(с^╚?А╦AГ5m┌TlЫиUb6LHю√ю╗o┌┤i╔гFН┬Яиd╝k┤╗rхJА-VZ(i╘Lх╨└Б┼ив·┼_─$сф▄╣s╤ЁМ3╡ :═=Ї╨Cш6цЁW ~°aтtO▓bРє╕gЮ|ЄI№П<ЄЪТю┌╡+╬╠Ъ5Л:$МHаFД3LвЪД$╩#ОsrrVмXAфGDgїЎэ█г!Ь─╒-[╢0║├О╫гlМИл═Ъ5SЪ╢,кЬ─и┴Нx└╠oЄ∙┼nAБa├Ж┐ЄzШh~uєG▀√я┐x┐·CЗbI<|г2Vє @╒o╚Nю'(▀ё╙ТЖ 2dшgе V8xЁl<┐т╕┐СJ(5ХнYщ╨б─-эиyы▐{яЕ$Ж(b@╚iB&╗d (▄YзNЭ={ЎР╒tYШ7oд;CUу`Єф╔║U>$.╖╒└;┌G}╡AXв?├З╟╜D6Р╛@ешЗ╧ ╕щ╙зя█╖╝гВкwя▐МЙЕ╓'LШdьТЫЫ╦─/р$а┼╢K╫nМОQ[╟Н╫зOr#E╙CЖ Бь█8=}│д├BUшЁИ#0v╘Гb8╞FД■Ё^BРфb; -)сх0╠9sцЗQЩGУ8T╪╝ys 0eяBВєиЯ╛лT┬qи═EЪю;I ║GОс└╠oТ∙EўА>q√АШ! hЬ:L4┐┼,j╫о▌ц═Ы╣╝&Iф#╘Жe@] _║егБГЖ 2ЇK╥- ┼m&∙¤AW$║/═╬>Ж@DE╝"°+╞°B( H┤БnPсбл;ЪALцфф@Ї2ю"D/ъg╔]╗v╜Є╩+∙∙∙└╩О√?zЇh*`ЙС 5`ч ╞╒ввв╠╠L╒бJВ┼ф▄BEЭ╕:rфH╢Л╩█╖oфБ╩i·&+╢] ЁйзЮ┌┐?· йП>CвгBeу░Е М3Ж╞mbщE╗░sЗNС!BГ ·ўя▐├ХФФрМSЛ╠-Bar,щ┌ ёягiўR%M └╔╫╖кyЛ°АKх▄;FМK2╟" 3┐QєЛУГ╟0бД╝П?■x^^p▄∙UСX0▓б╧;у╖╤T▄~=кТGД▐╟zаu┬A ¤╟da╥Н╥Р!CЖ ·яДГ╛n└ДЁm╢$─∙╞FeУx qedd@Р8 Вa└ВgЯ}6;;[Т▒М1%Yy,с┘┬цЯтЬБR▓I╠Ь9УHв╕╕Ш▓ ┴├nPeB╫Ke█ЄЧЦЦ╞mW╫f1· G╬HafЫу3Фd╕2╤▄╨█╜Ф┴qЛ-vь╪ёшгП Vр/РY│f═╢n▌7_0)*x■─`щМFБuИ∙└фбCЗв└М3ИWPxўra 2D@з╕kиЯЖз╤с╛Щ▀$єKєJL+°я░c╤a°Т)$v~й&ФД#iy%ы┐╛T<╟ Э°ИJщЖ╠H.в╘WЫNЇУ┌VCЖ 2Ї ╨qХrVTT9S<╖'ьє[∙╤k╫r╗%U▐tOJ8Ё╕▄%еъ╘кн!П╟х Yё5▄; йK5м▀╟Х_zj ┐?рTОк▓ЄЇЪ╡&├sZ#8p ]2%я╙Д (∙ ╠}ЪТXi▓,╞] 6ДшХШ#ТN ДK¤·ї_TИXT5m┌4"╞d╛Q▄ЮЧЧ■в@вvЩ-W№m{Ўьy╓Yg 0`╤вEЫ6mЪ2e Y╞═VN3└Gу╞НЩрDg+·3uъTЇ}h▐╝∙Ёс├╒OдE.p'ЪЛ·`╝ў▌w░ки▓┬/p■─Oа╪ш╤г╤.╨ ·▓o╕w╥дIтjU╣юЗ╦ Y└8=тЙ0ЗиЕ.├(Гж%░▄oj~∙╕ЙяЁ▄╣sўь┘3n▄8╔В;┐║┌ПСЄгf▄H╬ЬЗ|bibHKеэD╦Б┘,6d╚Рб_Т■;с`╡7Л╛а+┼у╡Бaк}knщ■f-Ыэ/й}с╥╩Жuы°B┴ЗK∙Bu╙\∙▐▓╖█QP╖?%X█Хцлиd╘╠HKёVЭБР*ў╗k╘Wйю2o∙SS&Б#FМpDТУ╬Ь9sш╨б╠CЖ i┘▓хр┴Г╣ї aЁОдб╢ТуЕ╝Дf░e№ сКЪU─▀sЄф╔А&в╚!А╟RFбгБ┌╗ Dgjr╚ РЛh@┘·0f9cШ╝DЎцияЙR,qаУ;vьШ5kЦ▓╜pЮ√ТRЖJ╡c(╢├19XХ бШ'ЗS#ЦЕ,ьИдbгr +Ы╕< M═/▒)ниЁг╩ЦXРкDnщRХюИдсfЕT=вЖЬЬЬ(lТ,5lЕБ╨Щd╢ааАй0┼Й8╞[ш╓фР5d╚Рб_Ж■kс`u╚╬[v9KU E╣╥Вv$[Ч║чбы5l0fшИЪ╩r@оt╙Фk╔╙я╣╪ ╠ЬЁ√2л\▌Ж d8Jе┬╩щ·Я┘Уzфс ;>=Ь>р9ц `т?Ч┌╖▀уП?ЮЩЩ┘╕qу═Ы77k╓ьЗ~?~|▌║u /жLЩВУы╓н;э┤╙╢l┘▓`┴fс20nд▄epьЗzш╤GUvм╗x┬╡yєцРп╗wяFЩ1c╞0t0g>ц╧ЯП{Яxт └ HS░╜j╥дIqq1ў╫&rssщdJ{я╜ў2╢N╧Ю=[╡jе~Ъ┌Д.ииlЄ╔'y5г!41j╘(╠_aaс▓e╦PfмM@Dsц╠Б╠^<д┴╧Dz|&Ig╞НЮa-їэ█Ч%Б8 W┴v хщ LP√э╠/7@OtМfОф пКw9NЩс.J,Aйг6l8LЭ.ыдF6yшAЙь(ЫуьМ▄Х╚╘Р!CЖ ¤|t╝└┴░ ▀е8=╩щё;м85)*kя▐Ы о╠ч╧ймm;Ъ╡o ЗЖ▐╓г}З╢┘Х%╛КЄЦоЪ#GНЇ■о╢█сйqаR╒H°└░А╦Y├СR█УюЇЖ╞О╤д<╬Ф4ў■¤Ц^Ё(++лc╟О@H:┐└&аH}░уеoFДqххх═Ш1ГЙф√ўя┐pсBeЗ5СшtУ&M┌░aC├Ж !qq;│Щ.аfHtFmР╛ихя╣ч^)))8h╫о▌┐■їпЦ-[RаУ(/ЙЄP?H▄fмАz\vbbB%ЖЧcр$╚Nї╙T╣Q█sР|tYХ\щ╗vэ:сДX'!йхв·дааu:"9╗0 ┤НгПнL3 JР╣ЬЬn╜бc╘ЦсрЩgЮ┘╕qу╘йS╔dvТЖwyl3f *╘PHСЭЭ aП[Ї╝Шn>NШ0a╟Ои╝zУї3]O$Ъ4°F┼7"%] ╟<Г (├вrcРОу∙Х¤▄'Я|2??Єф╔ЇeцГ╔лSжL2Ю9sж╥bwЛп Ъ├зMЫж┤─╛ъз╛фЙИ┴╖ПT╬v┘sЁло║╣░ 2d╚╨С╤ёё└i√ЖФФ╦н№UкVZ и}фСG[хeл*WFНz╩SъєХ:u▌Ю&ЦАxk╣a_є@К▓ЎМU└a{ж╪√╦хХОT+Т$gЙ-Т┴жгавЁгАgДjk &zш!ж╤гG+1р^О ахi┐E,1Я╫sпQdjмФФФ@LRКc>pЖрЖтЯъ:ЩTT2k╓,ъuпWп^4є'Dа╨X└Ak9А"╦╟╓тш╓ДbСЖ?|Ё┴▒c╟╥3уРрg%┴Въ─mЕЧ$`^╘╥в┘]Гў ЦцwЎь┘└Иfp■№∙╖▌va.*фF-с~┐~¤0┐шГю╛MЮрj▀╛}┴(6$c╘K&"╞Э~°сЗ ■ў┐Л▓РШRL'NЬx▀}ўCн│!CЖ ¤жшxБГ6yaw0ф*ёй╘╢;pX╣_╨эqэ°╦╥╦╖└щr(=P│Vmo8фv8=ZZd╢EGФфюЫЮ│4j╘(└X╞П/Ю░╝c╘┴6Ърт *Б╚I╟шж·╘EЙ┐-:Д┴─╡CЗm╙ж═╬Э;Щт R_E Со4╒*aР?]O&╥ЭaM░\иж"О╤уЖTo╩ОrБ'р FЗЮИ~NИJяЖ╛#`BVS┐е∙Ф╟qaa!╪dЙ?e ЛiIМї@╩╩╩j▌║╡Дд&WїШЕЙHВТ▄╨gzh╔ЖLЮ─ d╚Р!CЖ~&:.ра▌a╘u фнщLuЦйЇЪ╩х,/9РЪQ╙Эъ*wк╫│~╒лХЮЮс 9*Ь.З╧СVZ╤иa¤¤.o╜`°O-╖╫о&╒┴ т*oEJjZед╞ЄzkдZЫзР▓РR║╡z╬xЇ╟d(56┴ФхФ═"S)ЫQ °EuСоттЖ,oСшqсHa▄Щ 4жу0▄╦Т╝%77Д╛Щ,)8 РВij┴єXЁД·1@це└4ahР═(╠╩гТOl▀╛Эє}мИ\_Юd┤Z2▄▒ф│дEЭЗ├╨0┐Э∙┼In╙oХ3Ї √п_8жPB№╚╫В╬Дфє┼иp╒чЕaфc5╕Ж 2dшауЖT0д┬▐ЪО╘Ф¤╩ЭкR<*P)n`╗▓ЄАпж{ю┐╓ьи*йЯ┘4╗░(РТСтp╖к▌`чО-йMыдя+{ф№╬ ╢╤a Do└Ёз╒░ь л№■TOj(рOqДФX4ЬwкГ"ЯтP44╘B)═ЫТъ└pC:Oщ ФА }┬$ФШRS$ео─BЛ(АєФы"_uJnЙ╞В:H=ЇИТ╨<й" *A!сHj8ю°Ч'2\zHW║мJ`с[ii)■dpr╔Ж"∙м&■жцWтf3╝3·HG}fYR╫;к╢У╕х<╚¤b┌z▓ЗT.ъспщ╔─W╔▒5B0d╚Рб▀p╨К3гB~ИВHO'кГ d╓ зк л}ї─║Ў╫йQбB^gJy╪СЮЪ^3.-▌пъ╕ФxЯ<є▓┌┼■Ї┌Ю@eХ╗fZ( ;BU~_zJZХ╖кFj║ЮzAw)р6%√,╩!Й┘лЛ4ЪL╔ш─&OюКВ/мЬЫХ▒ВVУ╓ФХХQ═Г┘[*╖OОcЬW╤c╒мYSЇRQ°F6+%▓1Є\а┌L|B%QЗЇMF─└╦4у@0 ЬС°╥▓/Й>ыЪ0]_%\$┴&ЇсРL '█пг@ЖПО М"╚O▄rйiг╬МЖЖl"*║Эd%┤б╘)cO▐nЇТ╢ыaCшВ>$Б▌(А╤I№чаMK2d╚Рб├дъ┬AючHЪVЙ)╦є╟VкA-`┴а нjЬЗJ+5q¤╟Eї╥╩aп╦]Ў╘лSw_vNЭ║Х)■Ъ╣√Ю:гє╔!лв░╧яHє(з┌[Ш▀иa# ╓Y╪*╠дm37а 4#мГp 2[T*В╪pwAAA╙жM "9RbAЛw─ЗФv]╘NQё#°Cа~╣лX\\ ▄ т?''═qУФ!B╪PT╛>`& !j'Q╝tБERlт]иБ│ЖKhШЙЭЩ2e╩╨бC%▄▒МC&7ИeХ╜бI MwгВКю ╠B ╩шzьП└>║▀тА┌)ъ╠dD^ЫpIя=-$а QЪд▄P6vд1ю┼y▌hRЎаёЛ QХ4дkEЗ*xЭ╤R╪N+ЮцЁИm7╤ТжТL┴Qш?К$wnсBM∙╧Р!CЖ Квъ┬AHH=И3╚&а№тШrЁXnЗU╚g┴╛юмН┐,8ш;Ьб,Rъя▀|RXп╞з├чtй░¤Е@■ь¤7╬╝сКс▒-■x╢rYйm┐т _ejZъВ∙Oш╒╟7у ЕC+WоДTFW╚vuЕ1Я╛лИ_HkjИ Ji{|╝EЁН╛9(█ЧЬ1;C▒зЮz ▐s╧=╘ЎMJ%Q6pрЁгП>·Ё├ыо ▄ў─/!Фh│вм╕Pd╟РЦ^HЗrssйОТ! У█е6сШl:3щ-╤Хю╡ .║3f╠ш╫пЯ╬@FьcЗЩЩC╠╬OЩ #JKОб*АW`qЁ_DЇ S1ь#чevШDШCы:Щ║ /^╝╠G 8?`└Э{I┌Н╗ЮeЦМB╟ШЙ$╤·Я>}:╫┘ыТb╚Р!CЖ %бъ┬AВИHЬ╠╠╠─/О О▒+Й √B╢Э!-8┤\Л-8Xi╗ ╧Ж╧ ъeьwйа├YKе8Гс╒я╜бrv■■Ю>┐+єOnqQ╦JU├eG"м(KпSs┴в∙┐ ~╓фщ╪ ЗK╦╦xр╚ЄйSзлБ/вWН б1e01Я ?╚f╩xs▓╡*ЄЫчEс${╡lK╢,╣u8f╠Ш╟{,мeK╙Cшт ro╝ё╞┌╡kg╧Юн┤°vв├╜bЇ&}`tЎЬ OПМ:я╛√nЖ\f Ї╠└pц╧ЯПK*▓I╩_Ї─mУ┤[PPАz└I\bЯ :ЩVUяв S_▀Dй!Й╢ЙсЁчаAГ:vь╪┐ иPyd┼ш╤г5jtя╜ўтЬчж69╞Єz,b>▒8ЁЗж9▌zЪ▌ l┌┤ UqЧ∙м│╬║¤Ў█ёlЁо$эbY█бQa√Ўэ┐√ю╗DЫ┼═YYYx\ ┴╣ъв|Б 2d╚РбDT]8ИєLё╨мY3@№тgtc╣cУд╬Rщ9├щК:ГЦв╧M8X8°═Ъ№·щ√]g╪┘└чJw:_ьr╒Y╦д┤мЯЮS8 д+█рn+▐ЕЄЕ№╬4╦}v_IImwк╙хf2Э$ЩFн+ EЯG┘┬(╩в╥^я▀┐Чшк ╦<╓,*7а ╟иGb6 *╞└|nd╫н[ЧНК>LZkЖГ┤дЗЮQv╝j┌&RqE}XT^2 MДД_\вВУ¤^DsшўИEЯ╟рИ▓ nг V-Nд%fИДГ┼┼┼ш$Ю°M│QQF)эP╒││А dц_T╛k╫. Б}·┤n▌Z▓K9ЇЦMШЬЧЦОh5г&О╓РTpКТH9C@В8tmЧЧ╙╬-т┴oH8╒ |╡6┐A·>ЧJўлE╛E7▐8·╦П?▌╝>х─╞з╒jp_├▀╖оTйR╡╙╩№e╡Ъ6:PZ^╕oл║НmЕМУ┌#@:оКI╡_8дЄ═7▀╨╦╕SзNЭ;wжmўю▌АГ╕·╪cПm▄╕С.чЭw^я▐╜i,ИБ/_╛№√я┐g┌▄Ўэ█П9▓ ■L█╓╜√ю╗mt╢┤Ъ8qв°53q* Є╦/P0Аz╕]iю╧╕Ш Ч╨оД&╞∙┴Гr{┐└O@~LLLГ?╤▒їы╫cж[╢l╔Ф╛т█d│uы╓╖▀~<╤7p╘╨I▄;h╨ L+Ъ`}ъйзd║p Мb ▄ шЖaдв{D╞▓WЛМHL eЬ8{·щз╗wяаМ?^Б√Ўэ Ю`\└a╠зЗ╖l┘Вzd-б6Ї▄╞($KпК(Pq╫мY│╢m█FE)=c╕>qуzЇ╤G1ПMЫ6й$ч╖╞ВЄ∙∙∙gЮy&nзFЧqPE┤Ю\<▒э&Z╤вбE/]ў┘2кШ/╔тbЭc 2d╚РбDt╢Г4ЪРЄ@;°%::ж╢Г!:T0%Va7░╬Xp╨Б┐Ф╡∙л ▄j№?╫ц╫tЮспё─eЧ xяхвTп╖AКoєое▀▄hЯГ:P5▌Оt╧╬}∙u╙ъ╓@]^Jъ┐у┐POг'╫┬Я/╝Ё┬√я┐┐d╔eK·бCЗvы╓Ml∙q▐Їщ╙i5Hкўf╬Ь ,`┴?БuЦ.]╩]?┬,рZ┌Р-cа=TE╨гGП┼ЛKC▄a$АаеЪ▓H╘R}┼2tЮе╗4K╥П▌╞╔█o┐}с┬Е─.LЮKДAм &`iЙ╣!ыg░b XнoМКл/XЗєc╟ОfZ╢lп╩╕p;А.c┬R╜w▌u╫]~∙хш╥JЫ^{э5▐╦ kBdY]▄╡'Ф╜W+╒bр╕J╨,Ы┼ЇРb'yг╬F┘╞хр&╕ихa╛Lbвv=~2_мЩП\"╫╨!З╔jY'Ж 2d╚╨!й║pPErJ∙сЧ╕E┘ВЄ┌Zк└r;╤WF8дВaх░=ДCN^-HSу╫о═mР^ьvжЬнЎЗц▌╨е╟Зп:+иКSSj?tт┘Щеvъ:А╟tз#╒СЄ║ФгОrx5ЭЭvEё#pР┬Э_▒bАК5k╓ '{Ўь)╢bТГ`L№┴8╞▄щ╙m╘XШ▒Qq└:Ьq√Oь╔8z┬z"c:O:щ$АKF4$WЕ╖hВPEМ┘5Ъ┤├#PSС╕0МCл┬j@ClЕ╬╘ @г"J/▄ ^Б╕╩{Х0░°В .`МгЫo╛PМS░╟He$┴?DP├└Б[╢l┘кUл╖▐zk∙Єх@в└hK╢G┘UЙGг"Лмгї!ўСeOаУВzКЛЛщї┬╒ ЇЙжЯ■y┌ f╤ ;77}ш┌╡+Э`и!'ШzШ╣у8ъ$э&!~i┴│ТD%9^Ё ═IЎa│Sl╚Р!CЖУОЗ╕Гр лаSХ┘░VШжДN+u°р╒╜йj№Чksдyр`єчт.]оzeIнVНvхfЭr?y╞е═|6мTV-О4╟ ■ЪоМФкЄ┌оTЗ;-м■╜mGщ╤Л1╙┘'БQ(щ єєє_xсе┴A}╝ВWШ╣╙^Kpрд░┴О(ДЎВМ H√6ц║ B¤%kЦ╕Ж╘]йЯЯI;ЮФ<№S╝C°зlkтOЎУыh¤!PуlтFа@О"j╝vivyў▌w3F4 уR┐~¤.┐№rо0хVs_ыП' ╩ч═ЫЧХХ_v┘e╖▐zлl▄c\╕Л║=qнphдlШ╦└H\uД}`яуП?О ё'┌j▄╕▒фdЫ>}: М7n├Ж m┌┤┴1│г02■|о{k]LK>МЪст╢Ы▒щ ▀p▄┤iSц╨Л[Ш╩yыa)M┬7CЖ 2t8t\─ █цГnUj├┴МРэYь░│Т╪-T║╘°їkєд╣)AG╙}сo╜їц╒пeЧ]┴╙▄П┤9╖╣_9А=╩а4еQэтp░,XЦЎxЬхp╒Qгеза0`└┼_ L─@y№Ў█oмu╤л╖░░Р╗л`:АNЄЎ╛}√Ю■∙А5МH.бФб┐гЗшд┌╚ЕЪп╣цtЖ<дЎИЧШюн0 JX╦b┬nЛ[л▓w9ЛШ3А┌Е Ц─╤╥WZEц6k╓ УНв3шууp╧76Y-√М_F║Y╢l}2p№╬;я▄p├ D┤Їa▀$Й░Д╦сynC╦Ўўт┼Л╫о]√╠3╧рx─Ирф├?мCЇ]┼к╒cn-°вк╪цpЙFЗ·ЬКmЯD▒VZЇ:юsSипчЬЬмv┤vёkБCИ█n"Т─0 8╕c╟*}cЙkА╛)ш!:МvMТ7CЖ 2tШt\─$tк*{√4═▓┤]IN\ё█aиў*5~├∙ї╙ЎYp╨┘░╪ цвg╒I┐╗шк?{╥\Mx╟╖╗шДРr3╓М▀wў╜C[¤ёЇ>╜·4╗,┼г╦╣bх BоС#G2М┌ъ╤гЗфо8pр╣чЮ vфччC*Ў┘gKЦ,БРЖl■рГn╛∙f@в[n╣Хx <°йзЮъ┘│'D> *]u╒U@@ы╫п ╟?■СХХ%VwCЖ ╣Ї╥KБ#ЛЛЛ1a▀~√э╙O?Mж├═Я?┐wя▐`)╞Н7a┬Д>}·ид`СбCЗЮr╩)иJ╠°╕ $┌кU+Lкzў▌w╢║uыжlЗП■¤√/X░e╨(.с№Ь9spW14.Э{я╜w╓мY╩Va■эoC ┴╠#К]}ї╒▄/((Ф?~<УЎт └¤oШ°ф╒W_]╣rе╛И╖Ф/╕р┤KьИєрdЧ.]╪+Ёm┼КГ BЯ;wюМ╩йЫ|щеЧ>¤Ї╙yєц╤хEiБ!╤тє╧?Ў╥w[Т─АQDоъзq зХ░█▓т─T°╟x1 чЬs+┴[ЎеDра╧NIЄя$u▀}RTпFЩ# 8°╗p║+~n╩cкCлЛ: ╣Э3mt█ЛO░6К-'eЧ├╩w|K▀;/║рВ{юьзк|*гFХпК╬н╘!щ;qрA! иR\ўы╘sОйHИiqнЁ█Д┤Б╕ЩиQв╞Pг&К%F%#╓s╙щЭ={Ўь╨б├¤ў▀╧▌dp[J■°уП'ЭtRQQЪ&"Л╩wG┐!t¤b╬zi╚ш┴Hn "<┌╞UЙ╤"РqнгRлХЮs╬9CЖ ╔══E║WлИ▒dA0"Їpю▄╣└═@┤ъзцwЬпЩ3gтъ╥еKе~6Gы╔и─zb╩Йб╤iЪД?╤UfФц▐:=9н▓╒.єОn╠Я??n╗▒мИ║*╩Ezе$║Е.J*Є▄╥т╙x2d╚Рб├ду"ю саSYЮ└ДГ! ┘ Ї6)їф┐>┌_'нBЕ]agуPНв№╜ Zf.Ю<ё╩~= ╨ащАж┐п ;ГбЇЧ*л╩)╚o╨·Дю╜юza■Rхї{C╛╘Z╡D Х╠░yЇфР@╟ь?ЛсOМx(;;╗QгF─Ор#╤Ю▓ ўQ█+п╝┬h╞М№▐1p ╩эБ╤ЩЩЩ* MГ╦иЩч tOgtЖ┘28gl║░░ў:ФIъиTги▓╖zї5Б.{aтщPL`Ghи'эРр2DBшZd2"┬Н=Ищ∙╦╨ЙмвУRЫ` ╞GФЎэ█Чn┐,\ИБр╧иБ+Ч/X░`ф╚С:╝(ЁОS6xЁ``╡ш╙ЬиЯf"┴Xич╜Й╚l╦Ї)fВ;Dъ╧Х1c=▄юП█n"Т╢Шп=7n▄╪▒c%/bБE╙зOWЎ╖ YїЕ`╚Р!CЖ %бу"ю`$╨LХ├ВГйдUбOY^&У┐|пмvк7vЖ\iбЪi5x╦¤╬@н·╡╗є╞_╥еn╚КKу Д<'*:а|хeeM3ъл*пJOним`>4Uяд╕╙┼Ъ>╢uъ╘бП┴ Гє,ъfaмсо╗ю+lтё╟ЧаtTqQж4FО 1Ш 7ь═ДiхиЦУ№┬▄fх6oфаA!]"╪.їСв╘┼3Вk┼хB6O%mЙ(чШYO▀мk╣иcc jЄD°IL├ztGlvПfЧМк-О)QъL\┬РeWЧUI6$Бщ-wZU$eЬФС№╬▓єОK╠╬в#TVЮд▌╕+ЪSжoЭЛz8.qy░] ИШ$ыЙ!CЖ 2д╙qwP┘Бfк╩2 Ti┼═bЬСЄБп╦Є пвDЕ5▄iк*ь▒╥Ш╜!Я╧·]НМ ╥7MO8w╝щ.ОpХ╦Qщпмчкaз╝│6г1BZ╝)═єФСфиCв"ЗA°ЇМ*B(НЄaD"JА@ц@c$B╕F$┤ЙpДgвTТq eИєt╜ufTIв║w░є╡Sтф╦X3Їqц▐о░ВC╙ычFj▄ё*- !б╤d>╦?V"CРЭkв^╞U!Яй╛N─УMXЗЭжY╨з`/9 +JJxE9#ЬШо╗$ес jK╘n▄о╩ўЖ$Тn'"=╡┤╬^CЖ 2dшРФu╨╖ТZBєR┘wРaМQждддCЗисгП>В(№%р ЭIкь0╥щEэ`╪$Ї╕]О░Є:╒KGLQо45║,Аg,╟-J╡└ЯUЎеxR\~╦19╖|_ЭZї<и┴ВqUй5*r(уЙ-$▐гI╟vМN ╝е в2O┐WЗТUВJ/=╔yeг&╢b4#г┬, mшХ^ш°МнЛ:P/GFИJ2=╫░рб(5^╓/5╦Ў(╣$Хфчч7i╥D*╤г┤Дэ▄0║;0╦р*нуЄA*dqUt╝QtлЭtТk=l╟ФцЁ╡─°╒Ї}цТ├О▐╕qc╫с┤лУ$TС8СIn62zг $╩hg╚Р!CЖ EQ"8иl┘╟¤╔н[╖2| DГщ╞╞─yгL├Ж щ∙┘gЯбЖO?¤ЇgЗГ▄+Ў█6ВБГn[езьР╘'.Ф8н]уTШ╧╪▐Jц]╡╝aY_├]╕паIF}хvUZхГ╡Х╦_хOIє0РїеQ0K╘`L)╞╚╧ЇЇЙNbp8^┬Б8ЕИ╒ryLmL├;▐Лcs вn╞Z■щ╜вОW┘xВ)}1иБЫкt^aаъy%йдф╛'&ЕPOм!╤У╥╥R·№ъz5БТТ#╤xUDё╞5$Лf╣─ї╟█ЩIП▀"T╘╤|S┘°¤бg c"ъдєAPг╛╗Кz╪╤АЄFGЬ▓,ОГ!2;°`B╗Т╕YZз╦KвvУxУш>C4:L╛_,Уїy╚X6Ж 2d╚)ДиВ▄'ZАф▌░a├щзЯ╛g╧╚▀╕qq~ўю▌;v№■√я╧>√l╘Ё▐{ябЖП>·шЧАГ┴И╦H8ИcoP╣U)V▄Щ╘P0+П;R)+qЙ╧cХu*:B┼▐5k╓NёЗХ╦UоВaз#C9 є ы╘лЫТЄoН єv%RЫQG%AXpРD╡ГлвeеЎH╫юDЩ*ЕpєQЎТ NВДiSЛ&И┤T h0┴ш┴Рy) ю╝Ї╥K7▌tУ°XРИэa]╫иMzЛт<┘╡yєfjЫiФ└:г@сЕ Rk╗╔K╥¤'Ї.бУ╩Ў>╞╬░╠]w▌╡xёb·2ыqПзNЭ:|°peг╠╪ёFMPща$║C┬╩O>∙(Ев°Лщ$Ж╞─!ш9=уМ3╚оX>3▌yчЭЧ^zй`Vq[N╘7┴╕n▓█Л.-]║Я>е6▀p├ °fа√3·Ци▌╕-Jх·nx╦Ц-│││=°,├у╟ ўю▌╦H┌Зl┬Р!CЖ "%▒dЎ l┌┤щДN╪║ukff&бBl▄AЬ╟╒m█╢╡n▌Ъ6Tk╓мБ8√ь│╧~╧тИ └HК▀ЖГ)╩ч└╔░S9Rн┐Cе и0P ╤щ.wx\╩С▓▒д╒ZИ─№pE║+╜n┬_nOaQQ¤┌u╦ўХжdдz╥н╜@Bd8бc)=║Зln╥уБ - [и▀"Ўv(├OGI,┴Э° P╜$ Be╦■Ўэ█я▀┐Яг{oшЪK бGЛ┤иh,lЭ┼t;vГ]╥ўЛ┼E№ЭйїФ╓1▌'Я|23а$/╖╝iФ БХэвK-гdуаЦQEv╒i[й"p╢ккКшН3Еэ\,шs\>╨вС ПЩZШ°D┘`ЧЩЇс╓0▌оU─Ы▐═4 ]iеM°6"\&сБ∙Ў█o╤m░Лс╡ЫИh│╚я &G!hО[ШZa^еlr█DCЖ 2dH(d8·ИА╢o▀I═j▒q)ВБ│▓▓╬8у ╘Ё┴рфъ╒лб@3Ц1]Ж¤Ў╖ 8,ГB\KQ!З WZ╨PеY╨╨UeсFХfYЖ╝a г╟сVоpЕ├Yъ+kтй∙╞Лп<╗т╣W^}╡▓╕╝FЭ ╘╗'█╩└Б╗ ШsssБ6$Ю]e1~ &,╛ї╓[E*ГG№1О/╗ь▓Ч^z Ьm╥д x$С)│WмXБк└┴│╧>┼pїтЛ/~ў▌wQ∙M7▌ЇцЫoмpkХУcШЖЙ╞╔╧? |╧Ю=ШдSO=Х╨JФCЇQ}■∙ч▀zынХ+WJмV~хХWв: ═7▀рфE]▄ м8ПУ╖▄r╦·їы1йш$╖╚┼┼с╣чЮгЦ╕g╧Ю*╜Z╢lY│f═о╕тКЧ_~#К;▐w▐y';;╜Р╜·ъл?∙фУkо╣Жy ╞бЁЄх╦┴║gЯ}Ц+u▌║uEEE`яхЧ_N█╟еKЧтЛw¤∙╧Fы╠Тv 80.0▐=zаЁw▄!J\╘МK7n─*┼╨░j┴>(П┬Ш;tc╦Ц-MЫ6┼1└+уЗу┴╕Шe╙ЬЯ ═╩╞ышб▓╙[╟╢Ы(v╠┴}^√∙(=pаVЭ┌їъ╒█W╝/ю╩╖VrZjХ╧л√Ъ╧bCЖ 2t°ФЮQ!KУ-nu╞Н;(чё )П тq╫/wРХ╪┐ОГ ┤)TT йPЁ▀╟*h╗Щ╕xП#r│#Tсє{RR}·f)[ 6d╚`Ъў▀╬Ь9їы╫╟эw▐y'╨!d<l└Вя╜ў▐╛}√АE║tщ╥н[7аЗзЯ~ WБКо┐■zHz╠╩°сЗJ╙Dвп┘Д█╤bўю▌/╣ф\%`_N╕╡=h╨а%KЦхp┬■Ў╖┐a(OuP0╨Л/╛╕h╤"╢ЕQ№х/QСнэЫo╛5гo2П4к├y fа╧ыо╗¤aP@ ЯО5хххш?╗yєfTt╒╖o_`G╪#? khZ╟e+╒о╜Ў┌╡k╫■щOzуН7x\BC7▐x#а'└+°I :&ыЪK║H╙│NЭ:Їд ╚╞╕dБЎ╕s═ {лVнBЕ b+[GGуттb D┘О#АЮ°e╘МeА╟ЖjKb╗╕э&┌б╢г╜4}~ХКuКч╙T╘g+'НY.qЗ┬╚*|Х▓sk└j╚Р!CЖ %бъ╞dР`╚5H█Ж тЧ╤x■Ш┼Ю0z√э╖Y╨[п^╜Ё+█а╕лsч╬@─=╘╗^─l▄╕╚яЕ^P╢╗ Р╕╞F╞U╞4╨Е[ЗT╣IJ: р┐еKЧ<╡h╤░ЖAtRЇOL+МУ└ЕSH0ФХХ╒жM\%~т-°ЭbOШфГЯиKM╙НИК.]#E.Сcф*Пy╗▐╩UW]ЕQ╬$╤cЖ▄■ц┌┬-╕ р{├ 7Р▒╕ ▌Ы7oЮЮOЕ[лДя*bсGМ╦■глшС▒8&│u╠N╥ЧЕfLH═б╤]у┬к`ЦjЬAхhЭуf~?▒№РJ╘n,╤S ║├ОрcК+д┬.з; 8<8Щса:X╘хqW8h╚Р!CЖОФкwr'БюА∙~°с№тgИПM▄┴гH╒@ТД╟▄е"@G"3h║╜pс┬Ц-[ю▐╜p p AР░ `Б V>ъAmвУнF1zcЛt╚рUеyЄзJ6zЄ Jc eiQ░├, М├└╤g╔Bob▓|h╨а╤/щ▄P├>цfАF┴C*тFCD╪╗wяNЭ:б pИ█o╣х╞чcЗЩпПю╜│РХащ╞Нг9\И┬Т"№ ЦЁрQ В%6$бъ┘(`%▌А╪IjR╤е│╬: #z ¤ў╤4гв{(└(М7▌tУЁA╟№иаBWАr▄vу,B█ ╨нБ░▀уpЕU╕Ж╟эї]vЇдРЭ}Q _1╙nЧ╙Wх5p╨Р!CЖ U7ю ХA└|┘┘┘tvдg1╬│╕ГGЧХ@- а╪уЛ╔#Q╟рТШjбє7▐x#╕ЙкpА3o╜їj8Ri▐╝∙╞Н °p#8EWе!*Й▐@╜i╙&ръ]щ3 О1 s ╨МП╖╟ал╕╪ИJ AGPлlЬGM/C┤р.@F'╓┴иqХ╛тЦ╜┌╛}┬iИ,BmиЩAдХOЩ╞гMЫ6YYY╠"S@8Й3tшPTВєиw]oУ▐a┬_║K╦╘p :wю Vўя▀╓мYп╛·ъъ╒л% wэ╤g└5nИЮ!ЙzХ(dЫуЖ~NN╕WPP└°;╘дтЎ█n╗ ¤сЇ1еFЯ{ю9e├h Ьдц╧c]Fп╡w2Вж╙T■e┴┴Ъ)ю*Я┼g{Л╪ОЄx0S╖u&═└ACЖ 2ЇPuу╥GЦъ$l╬╨╖Є╪─<║─ЮPr╙°П C~гв╖]~∙хў▄s╧╡╫^л"└ш∙чЯ┐∙цЫ┴ ~┘Зе% дб▐иQгАаБo╪БХ+Wvэ┌Х:$ 3j┌Ё'xр╞╖▀~√К+о_]┌╔бWTбЧраёeцf%5Леее8Оaх║nяї╫_┐ї╓[eRИ{ииУ!P-Ju╒и\*b!HД3Їб╤чwс┬Еw▐y'√ФМ■ ╥qЯX^`5|т{!fОDБф?▌ЬСЇ!▒`С╟╕Дz$*5gD└4╤ЧЩ4зь╤hФКOf7A'Й°ЩwШL 7PТЪZю/ЛяИt@╓xОлI┌Нва5)`9G9╩Як<рє├!═╪╒Zл*╢Гf8h╚Р!CЖ■кn▄AZчЛ-ў╟pчПY▄┴гKЎ╖▌v█u╫]w╦-╖Р▐╦/┐Lб~═5╫,[╢ ▓╛°тЛ┘[▓1c╞Ьu╓Y@@!ЕЕЕ@Wsч╬н[╖.ЖЖу;ю╕8пsч╬иРАиюклоR6\6lXзNЭp/0═╥еK▀}ў]LАьЯhт╞:6э╪▒c╒кUп╜ЎЪ▓с╦Єх╦q/·АЕ [▒bzЎ┘gБ╜T0vЯ>}.╣ф№кHь┤╒╗wo@X└G ч├?Ь={6jFп╨IЇW_yхХє╬;ЕБс-ZD┐f┤Л Ты█╖яТ%KьШ║tщ")U0@Ї¤К┼U v▐╝y;wюl╒к=М╨t ;;√▄s╧┼Щ?~У&M╪1n═г█CЖ ∙├■ A╔e{лг\R[╔X┘°┼╩├▓Ы>}║DЕФ ╚ L╩┐■їпЩ3gт*BгDв▒IGФЭ ▄`╗$nы3╠5¤c░B└лЫn║Йй╗?■°у)Sж4l╪Pv║у╢╖Eu╨|0T╪_├с┴гтr║CaK K8h+-G)Юё╕▄2d╚Рб#жъ╞д┘╨└1│Тр№1О;xTИЪ√з:t°Є╦/xв_┐~*╒uL8 б■цЫoъ╩W_}5w?QШ┼%/╗ь2ЪСTб~└&`Иэ р*Uw^xa╙жM┴tр0ъЬ╕) ШД1`└└mр'`э &а9T╛wя▐┴Г+[Хї■√яуЭXAЧгтKSЗj%[Ъ▓5p√█▀p▌╘╗¤Ў█qМAс-n┘▓н┘`р°═б╖[рP эєШPО╣ч╠ЩCНq[ўю▌БеЄ╨%МФЬdаЬЬЬЬЎэ█╙kИ CRhP т*╓МШrяШЮ╣\*·&5╫Дrnn.:╣F °╨(юbР$q╟кe,Жвд╕ь0Ьл┐ЙєЬЯЯ╤я->Є╚#t!в'ККl╡╟╢ЗшKВз├эЁВ░%а2R=х~┐r┘:C┌~єюРr:л|2d╚Рб#дъ╞Д░ j┘▓%@┼)зЬВ_у ╬╙╕ГGП(з2АfzЇшq├ 7Ё<Aя .гь!L█Lр% ╓ Хщ╪+!NXГHsє7RxPrW|xХН!ФнаТ(═ВЁ}PШAO─tOXg╪Оeнь┌ы┘│'1лЮр▌`6f√`¤tйV╝E╕&║.Й H>ш┴┤qЖо╨А┬(Ає╥√,╣П ╬P-╡eД╬╕КKМТНкю║ыоo╝╠д√0j^▒b┼лп╛╩р5╓8╧V^xсЕеKЧ╛¤Ў█Q┴в╔╧Ч^zщХW^A╬U▀z╢_NоlGё<мeНSСМ╞╡▓h|Ы╩H┬b▄О▐╞m7■d╩E<йк*NsXс╘3RS╩¤╛АЫ╓mCЯ =!`DЧ█Sхї8h╚Р!CЖОМкwВТb└Ж~Ц8#I+Оe▄┴ ЬИW(P!╫√Ўэ√№є╧┼ьzZ3Й?о}Ї╤G`.н┴╩Y│f╕шЩткKЬ,z│в9 ┐с├З/Z┤├дFW,їО╤tЄиМўИ ▌└:ПE6l╪░х╦Чcе~ї╒W№Єш╓н█т┼Лп┐■zтr Б╩BSЬ={6╧и>\NЯ>╜QгF┤Бeр╞$1_IQ|N─╖М=_K╚Fi┘ $╬┴D/iщк"иR\▐Uьї6H╡Ў╕╜▀№eєKmэ$РrM@┴2┐эTTйо;яъ>u┌ |f╚ЬК▀М!CЖ 2tHкn▄AаИььь╙N;m¤·їgЯ}6~qМ38<─╘ #╧╧╧G╖ПовЕ·<└@╩l╘щеЧ╢l┘Т9б╤╓кUл└zQ°UЛ$▓ ¤}╪sQ╦хффа!1Сў Q%sХТ$╨├Ъ├к┬z└,А-8╛фТKpPPPP╖n],Pм0┌оR ╚ИЖЫ6m:ї╘SU>3ПЛ▐бgBE]bК╦чD$кV║M╠═▌▓Q~0▒бХCGЧФ╘к▓SjуZ╓ю╝-2ў█J├┌J╒S*#`я╗№G╕иp_У&MБ5┼AG╪h╚Р!CЖ Ткw░ммьДN╪╕q#0▀╢m█ЁЛcЬa╬Е_}▄Ae#'tЖщVб(│ПV¤║┌ЄЫhF▀╜╕п¤юъ)▒ ї$З▓$Уa0]ё╡IzLАlз 6├%Є|м+.│ЇЗ╤╘ROОЬИ╧Ш▀╥╥RЁЦhхПl╜%тsТ[Ё]E м(╒Э└A╓PхїЗюк╟╫▐ТЬ╩═ъf·к╝йй5*┴<х л`]┐┐Щ▀qnzГФ░Є:Ц+Йr║ФSTПр└G0.CЖ 2Їдъ╞┌ ь╪▒уО;233ёЛcЬ┴∙у!юаШ╡U╨qс(ЎїK╩┌ъЙBОpР>░4<▓Mj1яУ█ >hф╟P|М╠╠(┘Qjн$юо┐бЗ7QВ6╙ЭЕ>,мC+*сPЮ&оq∙,^╞zv┼#шd">╟-,aqkgШjЕfTКлК7*9+p╫°╪┌JЗ╤7.#Ю╚%Ы┌∙∙∙tп╤=u0Ї_0Y,ЯХэыг╫)╛/╒ъg">'"=шt╚&┘йЧ¤zVb 'Х┌е╘Ф/?икЧЮЧУ▀║їЙee╣Х*2╙U8°╗R╗Jч░│/oД%jч0╬PwdPиБ╙z╚^2d╚Р!Cдъ╞l╘и╤Ц-[:vь╚Ь°┼1╬р№ёw0h7UKKKы╘йГёCr-Е┘Єх╦я╕у╙├@ХSQ'Ъ*4НKq3Шц(╕ч+АR0G'▓S╕Э*N╕Qх&iZ╘i FньH.Xd╝JPK▐(╟tюї0│Ў╙ФCEМDz ч╤Р!CЖ ¤║и║qЛКК┌╢m√▌w▀╡i╙&//┐8╞Ь?тъДсхццЮyцЩG▒╬zїъm╪░Б╬АQE°ЪaъОLРЎА_{э╡z>┴°ьe№dю'╛¤Ў█]tmр╞bФ_ТАЬЁ+j-Ї¤бчпю[S^^NZнмм,┼&l╨аA\>K"ЭCnя&зф|Ое■єЯgЭuЦp▌`knd┐Ў┌k■єЯЙниЦ5kиTe5╘─o┐▄(╦╬╬k▄дi╚щк╒кщ6u└нB-°┌фЦO╝ш╩┌+▒q¤)/s;]тК┼CCЖ 2d(9U7ю d╓о]╗N;э┤═Ы7т╟8Гє╟C▄Aё║P└и·їыў╔'ЯE[║є╧?э┌╡ъз&zееер╠_ ·WQ2UTTАGр╒Ї=i╥дW_}╟Q;н звяZb:{їъ╒┐ лп╛Z¤tCєXСьчr hPiрxЖiўDНJ ]r╔%q∙МoФло║Jb╙Hд├г╚ч╕х/╛°тЙ'^p┴ ╓игF с·ып>|xзNЭ:Ф°┬Ч#╫еЎVнОЦЇ╛√─█n?√┬ЛwЦХ╘sз8├Н╩}-wЧ╠╝шпU*ьQ!╫┴╠┼бPИ╛╥Ме┤ЭqCЖ 2d( U7ю ─ p▌╞Нe┐8╞ц╚¤╒╟╘ЙAрИ└RМ╪м"Y╤╪gA*bЦGWf┴╜А╒"8├q╨tа KNNnПB?ТНЕ█ЩYрP9╡A─@ь zUTTДT(щ:А шrKЖ╙Ы─nЁ<5В╝хp\XtН#·,╤RЕЁOсА~K"c √∙М3°·╤гъО╧ш61Щ─┴I─g* |(█"; uaкъ¤э█╣щюЦ┴z/_╦_▀|╜*▌Sт Э┴4Gиu~щ№ОЧ╓*WБ хSбT╦│╪Р!CЖ :BJвД№В╝Г№Вt╞└1D?Дf▄╕Г8O╦(>∙фУQ├ъ╒лQ├п╠vР╩$Ич?№pс┬Еп┐■║\░FAчЙQ^}їUИЁK/╜ФYkWмXqцЩgЮt╥IЛ-·├■═Ї─r╗Ъ╛сЖ─ЗC┘JT ЕqШя┌╡л[╖n▓1КГo╛∙XБLCЛя╝є╬UW]Е?Q}аК Vо\9c╞М/┐№RЄI·щзШ?└ЪNЭ:с╧uы╓a^Q■К+о`.>┤╪╜{w\╜є╬;щДq8√з┼П?■\Eэ1f╕ 5Эr╩)(Ё├?a╝ SЙ╢кЪ5k■╥9цW┴g┤ОЖ№6aUГ^x!И┤Р`аЬ┐№х/вЮL╬чып┐╛OЯ>Шыєг*рTю┬4╒g╦√% j╫╔ ╝>oiнSN∙├Я ф╦p∙▄aЧ;xB~┘┬╙ T╗By╙-8XC9П▒^╫Р!CЖ ¤Ъ)дXдОf√Ўэт╣╣╣РЫР√qут<$o~~>D-PўЪ5kP╔пO;H¤ ║Б!С0т1╬Еl╪░Б}Ж,\└а└кО.╗ь▓╡k╫╬Я? ¤ў▀gЬ╞╤гG_r╔%;vьh╙ж \p┴и5vИ╖а╥Ёс├wю▄ X▌╡k╫я╛√эM/_╛иьC╢l┘2vьXnЙшLЫ6 `И▌cИDe╟┤CQХ╛=z▐yч╖░гWdh`шжЫnZ╡jХД)╬╦╦├МрЧ┌йф6ЛТ ╕ ¤┴]шэжMЫ╨1*S ∙╧в╪╣чЮKфДЮzъй √┐ ЫЩЩЙеЖn`ЦУ╗8№*°М■pt&А z ЁнlE#:YXXИзх °║ ▄Й'$.Я╣┤^gsdЭq║TP¤Я[Н▄Єб7│Q╒ ц{J├я<·╪ї╙зФ╘Mё╣Гщ*╪в░l┌■T╗Jy╙T└╓8h╚Р!CЖОШ┴AА H(j╩wаbўю▌Н5КwчqїЇ╙OЗи=чЬsPф5▄З~°+ГГ╩▐e┤ёхf+▌6┴▓TЫ°зКД╗М╕°тЛ_¤uZn1√XaП┬D3r Kb╝╕ЪУУCЇ ╓g░3иї0hо╛·j░юН7▐Р── ┼╠>s╢└F┬м<ї╘SчЯ╛▓Э╜|Ё┴uы╓сЦзDKO'D├/mУЁ_6|i└.бє╔%ЎАyAt8и$╗╞─▓ ¤|ЦеK%▀┘gЯНU■╫┐■Х║F,·С#GтI`*уЄ`╓fЎЩц6г╒.Зї├ЗеїjUn/■cЫ╙Я8ў╥~o╜▒+#шuыДВ═ ╦&■ёO╡╜к*╒r%IU╩└ACЖ 2t─t8q┐ ■√vэ┌с╖EЛЗМ;╪бCH4╚Ї/╛°5№·<Лi╕╓╕qу~°Эм_┐>1 8╒мY3cPtЫg╕Е#*--E∙Z╡jс╞вв"2╕┐Ї?Н┬C(FЗ_F╖й[╖о ¤°уП┴Y !└\║ь▓╦─╩н╝╝Ь║@№╔ vJє└еQ▌ХW^∙└ю 6ьып┐V?u░@╟Аыўю▌╦╨ГQщ╘т:╣yєf▄Д─└~иРqy0╣(@х8АVИ╒hкИ▒HhШDЇлр3Ъ#О$л▒fЁlач╘∙╡m█v╦Ц-yyyИ4Ч╧ЬИттb єФSN┴UTU╗^╜АR┘J=╕щ├вЇWЙ:нAыз╬■є╚w▀■1г╩ы7ЄЫХ=tсЯj·Х╫c4p╨Р!CЖ ¤'Ф$ю ф,1єxA▄┴w▀}8сWf;H'SИч6m┌ь▐╜ЫPГШЖ┘Дё'Кэ▄╣°cу╞НЮ0"FяуЯ(МzЁ 6A╪╙]АZ+z0@ЁIр.цЛ#7d#Х°Г╡Б┼8[Z╡jїуП?╬Ъ5лSзN╩1иРЬdркЧит┌╛}{ы╓нqїє╧?шбЗPrц╠ЩШз&MЪшyJd.$t_Т@3▄шDЗХ0ДЬЬа(@(hЖt^│fН▓iQ╓╞xъйз;aDлWпжoв═т_ Я Я╜яАЧв║■┐╙╦юl▀╫HУжb/▒Wl)╞Н5▒DEВИ╜╤kМ%&5jмиаа╘'M▒+HчїўЎm▀Э┘щ3 3;░вв?У№№E¤╧∙Ё9╠╗;s╦╣ўЮє=╖ю(.ЁН;v┬Д Зr╚К+N?¤t@{оарCў╟oТ│█└ хЦ-[└¤PMл`XyЖ╝e▌Т4CqБHkO╞^~б=Мiд╫м┌┤t▌AЗ° dФa S╛╫╪#П<Є╚#П■=·&8Ц м╣;лцо▄┤iXфT*╡╙s!▄Э;v╧г b°С▌JR!O╕;C▌▄┬3И░Е;J┤d╔Т├;╠-аw▀ └#wXJюaН╩ sКA<Yрew╦]u/■А°▌√┘>¤ЇSwzтY╛|∙бЗъц╩pю╬ 7щ оJз╙Й╗ 0P╥*┐э╢█а ▌гП>zъ╘й√ь│─ЩфсО╜╣°Ю!9ww╚7ЭнєХa┼╩ЦИJx.Чююйь╦∙╩╬Йo┐яG!gИ▄╜Y╬НХЗ*Бфd╚Р!рHFДo+√f▄M─_Ч│;эю;оLpЫЛm╘ЛбйZp0╖╡oс─Ы╧°єЩ0еf╘░к3╥Н√4СM8G╠РЇ╚#П<Єш?аo┘Jт.▄c f╦┼yю■тЭЮ;шЮpш░ннm╘иQи╝v└вEЛ~dp╨Э;vьW\@─=Є╓а├3╧<xВу╕|pЎь┘o╜ї╓СG 2Z│f═^{эїсЗрy■╜ў▐█{я╜?°рў╬>└4 ш╞╞╞1c╞|Ї╤Gв(z8Ў╪c▌┴HИ▀}ў}фСG ╛ЕД╞Н╖zїj7?РЇ█o┐ в╠d2Ё2╝Ё╟?■░Л╗w╒┼%.╥:Ё└я║ы.п 5рWЄ■ *╚drэ┌╡{ю╣'drЇш╤ю∙)Ё╬кUлf╠Шё─O╕╪┼▌ўЁM┬й кюб╩T┴vА юф,ФТs'I+'?╗ыч╨ t[╞ПB╬ 1Рde╪╜▀хШcОЩ6m┌%Ч\┘C█Ы┤╗╗∙Ыфь╛С/^╝°▐{я}¤ї╫Эk▓)JGh+BS╫/э─u^гs╜щwю╕ўд╗я.1ШЙ>Дк╙╥н{3Vю+T∙▄AП<Є╚#П<·ўш[n%qП▒C╓▌▌эЮUчf╝╙s!▄Э-,ч^@Х╧ы¤С┴Aў>1w╪╞Ок,A│эЮxБп╝Є╩Й'Ю8АK0╠СH$|>Фдp╨A╣з╙-X░>(h тБ@Бп ЖW_}╕;ї ╔q─soo/аь'Я|╥¤ВO*▀вrХ╕q~╙V Р^>Яп▄>╛ббвЪ3gN6Ы¤эo h#Ч╦4q╟вЩE"°─s╖┘■╫o│°с╦bsч═▌▒╪╩╪'д ┬м▄4шN|гЄ╝ЁNх\БГю3╘╝I├ mFhЄ║Е¤,▓╪ЧN·╒╧^|ЮЇsZ 07НQ(╪Ы╣{ПгbЪ│гШ─╖CэСGyфСG }t`крАюm`=┴Т677o╪░aш╨б└сBьБЩонн]│f═БЖягП>+<уМ3ц╬Э ям[╖·└~√эPoх╩ХЁP╣бD-АяoЧsеЩе╙iё8Ж3▓х╬y¤▒·¤ў№ы┼WЮ~є═Kz6ю╢ў▐БЬb[FЖTу%у╬бG4X█G╜▒AП<Є╚#П■·ЦЭ┼А═└tВ╜л ЎМ]*Х╧#FМшььМЮ7n▄8l╪░╒лW0аннm╚Р!`┴[[[Б┐№Є╦?&8XAА!s@Ю+ГI.БЎ║Kш[я∙¤ Ш╪ёOў║│пoр▌qlзQ};мРYж╩Я╗П$,Кв{+ЪЫД[╟PЕ%E█7╔Vm∙/╥_╬-╚н╜╜¤▄s╧бн]╗vф╚Сdч╠Щуb┴J$n)╛I╬nыюю шfй$╩<╟mQХз╙Яп╪№y─т|СH!ъSM├ЧЦРme9г┌"nut│щЬPшl>!zфСGyЇo╙╖ь,ЫхО╤╬█{я╜Ч/_Ш╠Їр┴Г?∙фУ┌┌┌b▒Жь╙O?4hPoo/Aр{ь▒Зв(3VнZА ╛¤1┴ATЦИ{Yн;;ювw╩ v%oХЩJўf╚┐√f&Уqп╡p_█q╘ ХЛщY╣Ы XЦЕн2╣ ▌wи╣ я°mЕ╛м└Зи|6┌~( pИ╢2 ^╔9═]▓цЦH+]ж -I■ЇcСєО┐Vv╞╕ш║║║аcьИ_+РtзrvЫЩ│Й╟Эы}ДR╨f% R╫gZРgEГс}Yф▄ХWE▓8БК< Xш╫u├k┤Є╕ Б;▄ГГyфСG¤╗Ї-w╗Kц▄╡Ummm---ю!~°сбЗ·ю╗яО90▀сЗ!Ас╡║║║═Ы7777Ге~ї╒Wg╧Ю¤#ГГюК~Q╣г8юR╢КEл┼√╩▐Xwl╣{шЭ╗Я┤rИ▒√Бю╘нП{`е░юj?ў6О t█ё[x▐1╬ЭR%Уn~@ьMMMШт ў╩57ЯХ╔╓ ^м└п ¤(фМ╢OdМSUТлЬV]┴Июам╗г┘=J}M╬n╙кU╜эю@v&RH╘п!Хa kх─╨g$чd{┬x█I╔╔ О{p╨#П<Є╚гЫ╛ ║а╚╜Wb┼Кp└Єх╦w▌u╫н[╖О3fёт┼t╨{я╜сннн{ь▒ BБw└└u╘Qи|#АНў▀ G+фщ╩)┴ХГш*o!М7╝уnи▄╖QюЕfиl√с╡╩6╒з>¤└ЯюnSўМ├╩^TH╛┌ё█у№&к▄ч"║ypяп√Кxw<ЁыY¤?жСЬ┐B;kw▒ЫT^Й┘°&9╗VбC6ТrE",dб6В╥┌КУeyб(~╙пЦeДВЩээЭ-═M .bК (I*ъ║щўєжiЫжn█Ш└∙l┘в ъН2Ф┤"8(o▒ ;█{ъыkЧ-[Ж┘·┤H╝ ЭбA Г- ├2$C;#!▐B(П<Є╚#П<Є╚г *╛ ·C!m]эЭ -MK8p╟I8(╛╛╛■ъъ╕вh╣|▐ТvGUU╞q┤p╔R@xзM╣ы█ТиопZ╡lа╦=vs'Л╢}▓╪БГ╢ )gQы▐╝бойq┼╩Рьи=v3mфL6#{█╜оЖ,8H`,╦Т╬U°ў┐n╥#П<Є╚#П<Є╚#T╚чwюL█Є|.Ыї∙|▌▌▌-╠~∙хP(T╣vG┬mL┐?Ё·Ь╣ў▀w_к?ЙXю¤╓VДco.\0р`z▌чС··ўт─n{юi ╠╞p▌4с w╬ЬAЦс╠CЧвvю`u.\Ё╚#П<Є╚#П<Єш{'нX▄i╕(КСк*UТШ`0▌▌нл[0wnKKKooя╫_╢TGєВ ═7ц▌:їVеPB ╣t▐№p8<ўН7ж▄6У╓mрыj▀_╢▄┬░Q{эca╕БУЖeт─╢;am╦┬lЛ╩2╬Э\█#■╠з{▄уў╕╟=юqП Ф╣Ь+YШ│Чу+▄╟ёйL:Л6╙D5Х═м_√yA> ╫▀71\┼1YQ╓оYsє ╫┘жВ,┤rщ К"▀Ь?ЄЇ[▒┬жнBm¤╗o/╙╜╫▐&N┘cсH╖:ыmR"Ъ@А)╥ГВў╕╟=юqП{▄у G<Я█╔Юbр8BЩ\n@s╚BшoП╛░·¤ў JrЙ└Ёп┐oИxEW╥Й■7Я}F╥КBнЛVкТ°▐╗яLЩ:ы█┌U▌P┐l∙*┼BCGяж╚dhЫ ЙЬM─╢У№гчсхи=Є╚#П<Є╚#П<·╛IQvОN3P╘ЗТEt·щg╛Ў3┐д(BQ┤пoI11K3Dб:жЙRРуц═Ю▌ |▓·╥▓▐zуuчТ║5Э=M ╡╦V,jzуаa9E╒0╩└qВсНэI─1мМ1m┼2Ь╒Г▀tО╟=юqП{▄уў╕╟ Ч8О▀^(цu═илПvu&cё(Iр∙BСe╕п┐oужlH▒Hазн═OQ╗64ў╖╡·zi нZ▓h╞ф)╪GЧ}°Y║дЫvщ╚цJкe8йPЖЛ·0М▓1▄F:$haД3YбёgyP│МX╖¤П╩ob╓┐Д▌╠я █_∙ ▀с5 }Снsш╝╛├'f∙'┬┬Ё/х╙Мk╗[▓Эpx 'рWwЗЎNrhэЇ'╦═╘╢Кfy5ЯЄ~═4JеNh$бHЪ2u├┤Ї╬ЎО┴w)ц <╧#╦─(J╖ЭeИР]╚М,╦.с╣ТW█╢UUЕКв▄(ЖVt ║uyз┤e№─▓мъМЦZ╕Няиz░эЦ╧vLIY┐Ф- X╛`╨┐╡н-НЪЪКl3Йф2iDa∙|бвb:▀нI'Sсhи/▌╦9ЛNФJJА Р6muH╬Й╧Q╢РОн(%Я╧УU╟ ╦Вh╜╜IКе Яn╪H╓M▐`HФJ%}~Б└qE,T┼├Fds9PЦ\*╔∙°┌ЖxWg┐ПRYТ@*╞r┴Ьд>.еJf▒$Vл¤)%ЯпolhяэцkкdK7╩езMМ░p╥BШлё╬╛н]m\PЁ¤▓ZВ cО,РRRЯ_ХхА?h*Й∙LJБ;╠┴nХM/ }Гт°жGЦ4+ й┼,aiMU╤юо6Ц"U├Фd╜yЧ┴]}IКца┴АЁ d│,Я╔9wuЛ∙Вeъ<╟Жж╩%Цf№~┐(КЁy╣дDгq├╢rщaиёh8Wб┼R -3_сe╦▓аe:Gpтx( l┘▓ейб╬y═ьN%lЖ╪╘Ш▐▄Е·е<┴1 IидYAhЫHзкCqЮдeE·■фщt=╦В<╩кО╙ AP~?╫╙┘ПЕК╣tcc¤╞ ы8┐р Fd═Fу`W] p\▒$йЁ I@уq%╙йАЛyh╞ВПЧе╟1A┐╨ЯHРН1ФNУ%CД`кзз┌a0,Ы═╟ъкD█L2сp┤Ф╦╒b∙tКєq∙ТшFТщL0ГfhjЙ[╢оF╛╛▐ю║··╬о╛ъЖЖ╛d2@╙╬zф2░╞╖┴AД┬&9 dUO╩№,cкJ╚░ L╒A1i4╦1 w%zkjыA╓╒╒+2дEa&bH╞╢1]Ws┼L╝:Ц╧ч├сpбPPt]Ч$й╢╢╢ппъ2 Ъз║║║╜│█─щa├к╓мщнКGГ▌╫УДЧгс 4╨╢╣\N╫MЦчб╧АcL#╦.хMC├hФЭbвh,ЬLfЭоgщ▒hZРгUdZ4T▒Р]╩ЇM╙-<@л#▐NХ Є-2И*╛5l╗P,24Є√▓Щ~Ю└ЯkЪМ╓h*щЦehдйEГ~╚sWOws╙YSYЮkяъйЖг▒Tb8Цд°,├Д┌╒#┐H╫Г╢"░Тк@а9║╜╜│к*Y╦х28с(pшТ===PkP╚╢T*В■ЗЖy▓4 %Вg┐/@QМX(R. чєq\&Ч├("Нu'У4╧YVCаeq╨K╨_╨╬ь╚ J ╧ю о]р2┘╡y@c┤g╦╞├МDл6mmkhlN$√kkъ ш┐йT z4╘{"САtД@@EЗFBA>-█Д╚UE F┬Т$лЪa┌}дXД╫D╔╨Фпд U┐BЬЁ'Tеs"[∙W°й┐┐ _к_∙юхеY6+}┬wMъЧ┴¤?N╫+яOг╝╨║YЦУ┼@кЯ├йR~∙kпЬ{ЇQї~n▐ьзO╜█╝y═└Б├ZW|ZрВЎ░Ц┌rжМY* 0╝БЩC@_П`мкkEЖU9B░H╒d╙,Y0┴┬╢├lОуoM;ёд;Ч,ЙьЖН[GНЁ┴╟ЫГ╒5+ Ь▓lа px╓tЁ%IсжasojjВ╞PР─Т,2джоJ╡ФT▒fЖf└$@п▒MдЧЇА/оdtf9]─pа~K>? O}c=Ч5k6 2jZH_oя.╗ь:mєцMCIе√kтUЯ~·)Ї@К╓ни╜ыо╗цЛbQЖД№fIХ└Цd?╧ри┘VR,О│ЗаЪд│щ|8.фКЖУ4X6▄Д*рШBAT }╙щЙ_▓ Ьж)╨bїRnпсuлW╛ ▌╓┘5й[Тв╓7▄╝╡нйy└·ї░_lкг ┼@(■4ыуsщМ_╪╩ЇЇt ╘╥ЧHCKK$S┼╘7Tй:╩цЯЯ-JtКпе+╦xЮрjBо╩жЦБДЧJ╢л┴e╥C|*ЫнїБ>╩>хAY(кк)АC!+▌▌▌гF √├йg¤nтЦдv╨Т╧fу╡upфM`n&Уооо╧ЖбC?╡,SеH$Ь╔dYРЯНFр@hРt:П╟с[╦БЮT√eS╕mКк2[БГю ░жf▀╞uЙtкЁА&x│Ш╦Тo уJ∙Те┌Цf╥Nе·лjcЪYЄЕ№рSrм└▒C╟LН╘d%рЛbVS АГбP╚r╨пщpz>ЯЕКвdrY0КJIо VЁ%5Хюэ:dPб(Q,КtS&┘Os╝Ip■а/╤╙╫ДKРЩG](▐t у ФmPч┬╓L1и.╬uuД?~*9■ЯO╫ЬЧ( Y$╦є╟Vy~Y│ ЬгrзAрШЗsЩФTtЪ╝:WUГ┬╚ЎЎnЮєC[╖Ь2Фgm╩уВХ)UьЗцb4╫Яь5╕j╙зkg▌t J&%"Ь?ы╛Ъ╞'d EpEа"ЪЭ┴!Сb▒ш╞╧3║кшЪ.┴З╝ў╧G ъьРяъtсмY#w█}╦Ц-А{┌7 u╓э(F6б·FшpуoЯсу @└gЯ}JSD}mu_O/рЄн[:ў▄▀╡эЫ} н┤'xЪ0j╫дШ√╖r∙к┌@,Y╠GF ЦL3╬LE ^хCZ╢ G╖\x╔м^"Y,┤"КЙЮ6┌+╖└&S#Fя╣o║а╘T│мН>X╜Ъ╪ч╧х Н═эээ├GНLз│ h╔ОК╤G4Rку5[║ Jы%6╞╘WМ╤ЫЪy┌o╦вж·+fNk┌т(йl^░╔Ш |╛ё3U╙йя╢ч>[;╗ПВ╟Q╓пYs╧Э3Q!З┌┌■┤|┼p}ЩbN,┬Aиgh╧╨ъ╦ЩdwG┴┼uf:╜T╤ъвСB·║+о@НtэЖ{юБvK2d╝║ Ё═r╨ЬбСp╠яф╥┘АЄ√▒╛>ЙfЁdж┐жж╖ ┴№Cузi▓ззп╛╛╘▒э ▒ЁлоЫА2єв ║╬╧√}╛ж?Л▓h ёxx¤·═╡ Н╨U$YСUu╖▌тgП8Ex╘╤v├ЛпV╒7ы.k╚!cшxИ╜ЇтЛ/╜фbиВXM}IVqЪа ┼╔х│╒U5yшкЬЇ'╦pК*█Є А╫EЖе┼вT[WО(]Ца╩ф%╣жб.Х╩╫U▀]╣║о:ЖtYєЪR┌w щ┼TDdУ╔*ЭщяЩy╔%╘о├ї╬N$°╧?б║╢╞fr∙кЪъ\>UЪ╜│▐▄┬ЛEЁ╜∙╒╓VГжT┘.ЬУo┴EOеR ^╨╞▓XLwїш7u<И║║:шw├З Y┐~}_тс;gт┴а╡aкпGк|ээ╖√#╛ж6W╚▀zЇq(uTuбИjЭЮXпzЁA╓*РьM75╘Ky <╦щ▐&H  g╥YЦc4UП╞"ЁМс╚╟√╙ЩT^╥LЬг¤╝╨ЯJ╘V╫Ўз·сЩbHUgU3uЛўs8─E M╤A5Г╟жы:°j¤¤йp4ътЧ$Йдш/Ы┬╩вЪэЧ▒Tр`RЩJЎ┘еQW╘╛ЮЮ╞║*0s=╔>:,tїЎ:"Ы╔у╕3░╕a╦цї MTU┼@еA_┤hu}&'БК┤ │╠-╡∙╝ТHЇBHcc]ggOй$╒VWУхС?PаРI╨/КT"4╬Екуз╦к"ЎeJ|0 ЁQSei6Nў*$├ UСэяf)щЪs╧A=∙{^ЩЯУ═p}C╩Ф}A┐\╚p║┌┐n├]Ч^ОHQ°я╛єyO┴ЗЬuНЦ│┤С4╖нtqраm*Ът °Xs9LW[ъыЄЩ,")QВц ^18 ╛`(ЖDб 9k@юом┬С╡}йНН Р╓ФuЛбLУ&П=Є┴┼o┌║│f└'╧9ррЫ_~┼МY6A╨Tв╖╗бо╢╗╖/V▌ ГщEШб)ЦйЕB6УЪr╔┼╖>Є╘T,╙tу╩│╬║цЮ√Ж iщьъ╜∙ДcяШ FIU|■ЖУ)ж ·Ф{▐^йo▐▓й:┐сК╦QO┤P-░xдz▄M7╓xэ╣чвї[═№щн╫╙е"t┌╞ЮД  <є┼зЛкЪ╪╥5r╪╨\V·■$JZfФe.>рА?╡╢▓~▀║ї[┴╠═Ш:}·1jиF$B їЎ!Т╜mю╝T^аа,д╔S╬ К╞б8MЫЎЁХп{№q0Ьсpx╦цMр O>ї╫ИеQ88сж[я║h▄╘Ч^КмiK$┴─·pв▐╜°шгs┴·Ў═ёA╥е|.W1l ·xї;П▐?I"тW╬Ь5ымsюY╣в$J}]э#v▓uу║ц╞·K╞Ю0э╣sТL▒B *Х+Ф╪╤Ў╔b╖(ЖxJaЦZФB0}:JЎв|ё4°═╖╬ЪО╒dК▓h╪#Ж╫f█3╬9ы■'ЮhыhшМ█еo>¤┤√-))r2Ч┤╦аd.ыИE╤hОў ╖БF7AХБЁ9ЦQЁЁ$ыK5╖4ЪЖ] ╒╒╤wЦп·█ ╖Ёї %pл(jцГN·∙Йw╧Щ[] ═^{=0>╘Чру-ЪN_}╩)Y╣в-Я%{╦.┐·цЫGЬIх║{╗вUёл╞{уЬWбAQ┘tОг8[//%еH╒·к]░╪N3T{_4╦▓A!дИ┘Ы╧=Щ *)ИуСj ┐їgnyuОnZрtўЎ┤┤4ЪХ═жm╙╠фrБ`╘░нX8"JCS┴X▓▌▌▌ВЪэшК─т∙в4rTSWЯЮJeтё(ЙY║■╒t┼RС─)░_`╦ ЗР├╥!ъ╬2ьtЎ╗╓пв╔ ┼~▌~Sy%йHсФah>ЯАу(У╔Щ&╪▀Р;эj╨ацLж╕7.w╔ ╟щzх¤iФ0лПїЧTХЄУ┼\oЬ┼▀zЎЙ?Ь|пФЦ/Ьч└┴ны>h:▓їэўKBLn░zsзЯщТIШ╢И5ь╫╡ЪфУ┘ЬЄ#Т eЭuV№░Ж│ж┼`║X╙▄¤Ююx4zхЩgОЫ2%~z$Ю)ц!Г*°▀$SФ с`8<N3HЪqC ╩Э!)Cs & ОчЭqAЯТ░╢O г//м.пЫ▐╢QcЗЭ6aY╕eц3щ┌киПж╫п[c(rm<Жщ&ШgВїЕkj╗·√M╦│й░р+e╙Cw╕~эч╒їMIQfВ╤H}c╝эР?Эш)Eжа 9gс╧rБА░uєf(8@UЧъOE¤╠╒З└Л░ YЦ│∙┬Ф│/xЇ╜ЄвТHж(>√фУH,╞вP:и @ Ёr0р╧ч▓╫wь] шььДцt═▒╟╬Z▓─YЯ!К╖ЮўЫY╧='kZ$ў╞╟ Оёъ{юб8┴░V║ж╗к┌зЇУ┘$ЕQТ* Ь`6оP,~°┴╟╕ gЯ}Ўзkп╜яяOе·zлллA6.╗  П< BбШЫx╬╣= OМ93<PТчq─}o╜eBЙlЦ▓эиЇв`∙▓ЕьЇ)╖^;}┼╨р░А] 2qжY─╬P УBй└╙╝м╦ QВQM5фAИЯїзr)раA-<╜zчўz╧В┼ ╟_rЇ╪√▀|+_(@ З:_Э"HMS¤>_$х|╛оЮh▐╤hф▌UяРV__яАVЗ░╢╛|ч╛D2ZSУIgъ┴Щ╘НпжЛQШйЪC░$k ├╥,`;F)ЖB"r√ыЧтиRбё|╟ЄBn-╒ДJ√k9ыъ-Ъ√KБ┬q▓Tб~╙щ$Д╚2╕CВcIJ¤П╙ї╩√╙(/┤sЮтeMaC4n+Вн╜ё╘▀/:ёД*КX<яUg▓╕m├═-C╡╛▀kС■╜Ў[Ч╠Ki%"D4I╝i╨╬0-j&┬▓ДmУР)Э┼I╨б6f┬!@пац┴▒fiшЙм&╔Оо?■Д█ч╠Бм сРКсЩЄ¤*ШЬ5╤<╧юШЯ╗?гX,jЪ╧`нЮ+d▓Р"°ЧР,ДC║а╫0чв╗╝з├┴>╓;┐_БГ.╠зScv°щ√ЯlnX√╔'│╞]КL ъK"В╝√∙чmОН66Ю│╧^иеm┌Аpт┘9sN?■дjHбЪ┌ЛoЭ4яНO$Л┼#DCс╛М°¤┴A╩2п;№gў╬ЫЛ4/ДЄE@;E▒Р╣у?с■ЕЛКb)ПuvўLЭ2эъыонО╫~╨2Чz╚Я/╔ч2╒▒hб О?э▄iO<Й╟*fЕ┴■оЯj_Ў╣S~д║╣!бK:БL▌░U▌пбkO8юOє_б9ЪтГ█;ж▀pым┐№:;Eт44/╙┘Уqс╧╣їХ╣М/Р.Ф°P└p·пE╪8aUЎЪ:▌▄&Ск*р▓4ОлЖ&лД╨я╟wчв┼йB>└єBе|NЧ─йУоBm[ж┐№Єuу╞9ыЄl√·ЗU╣к║Жўqж ■QvЄ╣чB"З ╣ЇЄ╦¤<р▒ожжзпo╩еЧв╛╛?╡╢^vЁ┴hшPФ═▐Є╨CPя═НMЪоR8XЁОЛ.B╡5HФ╬╛■╞¤8╕7С`}A╚/E3Ц*5Ж╕3wї╨╩wsТfЬти8┐ Ч─Є┘T}u╒Еь√р╩╒8E}Ёёч#GяKЇDг╤t2┼∙ w<┤7╥)║sNБ ╩r╬■]К8хL┘┼l╬/qЪuv с8T0M ОDО9№oKщК ЪЙфДtAJФЖ·┌Й╬█k╠c+V╢ышющK$■tєM╙ ╨k8▀╥e}N║NЪ╬╘ e8║╒ЖъaЖ─pк╝+ А]gGБсАAЫbээ}╫О=~╞ып╟гaP╦▓TВBы║∙ТЛf>■8Ж,(T>Уї >Аtа╥]M9я№;ц╬═Ydq─р┌▐╢Ф.Кж*╖ Ё╗Ў╜ёхчФ╩f$Qx№э'д2ЩX] ╕ ЗВX╘Aу┤:▐╧ч29\ ф¤Z)YЖIсцUGzя╦/╨,╔G=╝|y6W╝ц─Уя|sОH$Щ┘░a├¤7▀ВФ*пxр0T[W╖v═Ъa├ЖМ;я|╨№╖╝°т-Ч\тЬ▐VФо¤╟╙кж╟т╒╡НС-[RЬ▀gЫк│Mэ╦щB┘ MЗРТшМ¤ЗГ!├2 ╣╝3 GРС╪wн_(8<╬╘∙w+/╘t4и ░┐╨O└ v╢╛х√ ЩД*▌╚Ч ф_C▒MSн 4]п╝?НЄ <_╠ЙБ Bўs╕YHнЬ3√╠ГНQ°в7цL┐эfLJ╖ёСк╒л╫оMП<Їє^yё╝╓Ъh Н╙B(╪СъqN.╚J╗э╛G7KЪjц%├B╢ ╥p9аJЎ█М$i]]CюТLЇ_s╠▒w╜5Фi*Чз¤Вмk,╦Bчlmmюn╤╦┌эрГ╫о]╦│hy░х=Й>@% Ф▌ЎумАVuЪч╦л┌ЬY*;И╖├┴Є,┌v┤Зm+└sйЮюж┌кu4є┬єQ}═УO<J.┬ёз¤цLй╖kтПGЫЫ#╒Q)ЫЭp·hk√Э{lт┘чДЖЯЎ└ГD╝*c█}╔■&?`█┤u]ГК┐°РЯA╥Ю?ъ lч╕▒╟CъO,y√ьS vхёys╬¤∙▒H▒g╜╜.ф╧"╝сo╣х/╧r╝ ъ3OA╔ 7 хЙ╚■╟nшTwёk┤Ц4╠▄°уОE ╫9 m╥W4MфqOuuL╣ьRФ╣ч╛ ╧8∙╣YO?ЙBqЭ щ╚┘ж]┘bmс╢ЕY~g█fW]$ФяOL■╒пPI╛що{[ZZ2%ёЦЩ3─dЄЎ╟■нo }][g-X;├])XХqцЭn9є╬Ц╡єуV■;Є√╓|№┘n#]·є&▄rCU$Нчж▀_ИтuSx8ОeєК└uU╣y№хH╙яxЎ┼BIЎs,t/|ХL& L:щ°й╧┐ПG e∙жє.Ш■╠╙щT╢╣йA-fЛЕI1КжCc║}┬Д┐╝6wk{$ Н╓╧: Й/?ъ╚{ч╬ :hIЖо5юшг■pї║5Я▌}┌9│Юyц╩3O{iу║_╢░c├╡├oЯ=[П М (¤∙L&нmкмa°_'╩╥п;ЄРц╜╬ёBwвЯє9[JЗя┌xЄаa3^№ч╓-~Ёбi╖╧Pmb╚И▌6vЇ █lМ.°эoоЬt ┼r$ РЖ│,;+ТВ0P/╓uУ&^5щjЁЭO│,рг╒═їk{{MКрYVЧd┐О]y▄ёП/m-шJЧФE,Ab╣╥╒Ч^2э╢RЩФъ╞Ц▐■\}s│у+2tйР╒U|┬ 'Ь4уї7 DшИ$y╛dJN▐>:╕э╪╠┘Y\,№пЧК┼jbБ4ьл~ёєk▐x#V_┐f├n╗!TS)ф4Q╝·М╙E▌∙ў╟С░Бу8ьРV╜│╡╖л&k4pэuў=є,и▌Do▀фл&О┐ёжгFЎїЇ ┴и╦ё┐9х w═ЭG°╟?ЎюЧ^c BooянЧ^Є╫╣пГ#¤ў▓│╬╣ъО╗рA1мц]Z:╗√}&`ъ°г┐√не╬╚&жшF8Aжf(▓НH@╕шАо{Ў9(L▓~йTВ╒╥|щЕ╖кkk~IQ pzm№Ц▌Ў╪├6MАк╝ў^M]]к┐ЬdPЙаў│┼╥Ш=ўKr&ХД.@тЎ─├v╧ы╬`АrmгшьчLMхm¤ПcП╜у┼;║:б=╠Ь:mn╗o╤B├╢ЪT=ў┬╝Ъ║Z┐/ л Ї#PЭQ┘}╠О)ВtW┐W_WУJЇГ5|■h8LУОcbб <цШє^╧╔┴╥U▒h"┘аЬ%иSе$B- yш,-й;а╜·┌жЎn.ZэєэЭЖй╚ШMA-╠Ь°╟█ ёw═6lgv╦·НчПгPЬЮLV1tР╞A щR │nэZЖу В┴■╛>Pz▓$Н▐}w┌║R║∙wg?Ў№3Щ\с╩╙╬xЁНyр>№■╫з▐t ць╡`:c▄e3Ю|ТvJB\vЎ┘7╠║+Гk!У~¤K$+╖╢к║╛тyxўЫ T▌а9~├ЖMМ+EГ┬W╥ХЭQcЙf┘L*Еp<НЎГA┤э}ЎУLdЫZ┬▀▒~m уF╒┐ky5EUD╔G;Ў|Гh┼■ю7&С╚╢┤Д_xсн┌┌Z┐▀8╪й_╠╬Kтш1 i║^yхe┬`Ф?└w$┌h┌R╥ ╡╗уЇГ~ц7┤wZM┐эVмsу╡Н>·d╦╟╜щЖгПЪ юзwН┐╤ё═╗·╨А&╘╙в╫▌p=█Pk √ЦБ┬T╠;7╓ В3Є4tЁ─o ЕаВ ┼)W_u∙UУ hXu]К аg:NX▒И┬Y ▐ШIТ╝¤йзаl╨╡з]s ъъD▓ЖZЪPG ЗQ46щЖылтuЁ*H▄tN] ▌sdP∙pЩЄ┬AнrЇ Q╞Вхэ▒ иQ)сЖ2ё╘SРXШ■─c M╠√║аФоЭ0^║}с┬юDwM8╠ъ╞ХЗЙp q№▌?$4╡$L3Гcсp╧&3Эи╝┘Ы"ё╔Ў╛Ч^їRТ─ ┐№ яyф/усбжъпП>x┴qЗ!Ь√╙╩═¤▌эS╬·Щ- ╛l}lМfэ╥%G|t№ЛЄUсРФ&Х>О5.9ЄД ў>єrд║1 В╞▓∙,KX7ЯxЄу/╛TэО;тHdш |wEПдhlT├Ш `3qча 7J▓ е|*╞rу~s&┌▓Х"f6uч?Ю╥┴РЗ├|,╛╛н╜кeсєўеs├:geX╬Qy4`A 9G░`H╟@pкМЇА·╕Ш═B╤nШ8eSРы{Я·╟cO║o╔█хМcJI"1ло║j¤ж═t0В╙╬ G>ЧШBр6╘√%√я{╟пГ╦aX╬ЗI╟О}xї╗rI═еТБчб(╔╫Ь>2ь┐╛9э· CЗ PS]▌▌╤╔0╘─cП╣щЩз MsЗп╣р╝;ч╬f0ьЄ╜|l■[ч]Ў√Л╞П{x┌m╙|ш║╙╧√ы№∙[UшtШЎc6!╛■^срс=0o.┴ЁТкb8ЛE╓п[3э╖┐A~ >╘┘~ ╝∙╛pu_&╟°"Жй!)K"√╩ Q▓с$ Д╞]¤Ёс├ Аъiил[╣j∙Гў▌gA?эяCбшэz╘вY,фcВ~АGА╠Д╚∙{яў╨ВYEтjв%KФМkц░┌║-Ян╣~▄яР└вd╒7]}ы4Ьв ░y├·╞Ж:АГАo╞u╠эo.20Тё{fhл╝│╕▌IТ─s┼|$╠з√у5дбЛЩ▄Х??yцкUЙb>╔∙ЬФL nl -ыВГ|bYk╛р╠3Ўд·зMШpэC╫TI┼№н'Ь|¤SO577pбitыдSO╜с╤Gkjj▄¤О:ъСХ+│┘,ЇoАSWН=ЎС╓еааA)]¤ЛУo■╟?l3,P9Дм[wЯ √;-f}БЮ╛├∙8Ehєwю ┬╖ _адcрК░]╚gkba┘9V╣щ'?▓ъ=ы╛`X7 е(C┬─3╧t╘ Dлiзip>&▌~{,y24┼x╡╡бж&Ф╧#pў ы┌З ЕвЖб√R.dо=■Ш;f┐XS╧хЛ:FvїзЫЗИ┼|ХЯ═gТУ.∙Гs╟иnLyфсw╤m\╖╠@(8■╠▀Ц╙EN║Ё═ Ю√╠x╘Iў╢є╬u╥▌║┼I7mШBЙ─╘чЮ2░щ│╧╓M>уМ{Ч.RH─ЬЦ└ємхЬкDф▓┘┌┌jUw┬~·yч!├╝■ы╓н╝ыи■М╠╨╝нi`MI Ё№eЗ2k■ыМЯ-*├▓ ∙)W^хl1)*Ид├АЖъ┐c╗]Шь╪Е.'├--О╣qьBЇкыппкк"LSК~Ц*Hе+O·∙п═uLl&ЙD└┴╦хr╫Ь0Ў╞gЯ1lЁЦ-m>ЮХф╥u'¤тЦЧ^xE┘tцц_ЯЄЇvttшхо═░№я<шО∙oA#Ьt╩пitw|=]з¤т(q╠╣▌2щ╞▌їй B¤f│о№.хяхкЯЧ╙qБ¤ї и│ r▌M7▓4у╘/h~Т@&T╜цpЖF;i╞ЪоW▐ЯHy;╗РвгЦz╘╣U u─юг'Ь~Z├╬Ыу└┴ю═╒ ▓d╤╗E.h ■qGc√Эї<&fcЦJ:чЪ·4(h┬─c:╕╚Gуюс░╢sЦА&°lтНчЮw╙Я Dв:1}Ws`аЙ3─щ%ъТjЧw╨:ё№ p7мкP ╙╫u╒Й╟#Ъt.]АYМр0ЗкbИ#п¤єЯIЦмЕд╛─╒╟ОEЪЙ(цЩ╖цчq▓╧0╕╞Ж-Ы7ЖU∙ЎSэlЛГ*╧х@╙!Myd■ЫЖм▓ }■QG#Ю¤╙УO^v╞oРк╬~{╤╧П▄i╪Cяl-дУ╞О@ж9wm ч¤Rйd─№°█ Ек╟?│ўЕ[╪"!'№ьЬ¤ЎGx`Ў█ян▀┌IC╢Я╫,їЪгE║∙ь▄yЫ?·ф·ёуЩЪк+зO╕√▐Г**╬┤и6чЁ!ЗУ+0Цm╦bЮ╢uЖщ╔╘їЧПcTKЁxП└n{ъ)╔FС┌:УaУEСB║i¤(р ┤?MbЖВ2p?╟Kr2SШ>q╥╠'Я :з,ЙБJ∙Lмж6п┘`ТjыZЖ┴2dP\╝▀>╖═} МD2ЩL0щФSяxevIR"Б2╘tвя·ЙУn╗ў>AВНO$SВ АsжХ╘ ▀П9┌Щ.ДfЛБ┼║эБ{LОЄ╙Ї°}6ыЯ╧╒ ▌хМ├Щї№єЖП;х╖3 Ў79╚ъ8NыX4OKъў п?Єg╖┐°Ь/ /Э)DЭ}d¤╫¤№ДЩ/■3 Мw┘ф)╙·2b╙рбкEZжюCFв╗#Й∙B.Wл9ё°уя_╥ `иР╦и▓LРGТ╨Чъk;;zп∙┼iП┐ўAg!-Щxе,`I─╤√Л9&В║Qєb╜?Ь╪║iр└Ъb)п[╬ЁW№ъ┤ы{╛вp АQ(р╕0ё╕уX╣║+СтДи╡K;ЕГр¤┘8ў▓T╚`мr¤йkN;ї║╫_g#бR6oл╩о═uйоДе(УN>щ╧є^WA ─"Yйxхg▄■╥ UОEB°┘▀▀ь=╧єАцAЫ_q°с[╜ZUU"Аfо■╒пю~э5╚d__G;╨ п╦Z ╣l(:я└Q(шt|КAR 1>─rzЎ∙▐■Ф╧Щ?BЦ"ХьeG~╟Ь7╣pL6Ё╬▐╛·ЪZg╚╥3¤}UёшхЗ|█▄∙4я╙mL╤T °┐r"5сЇ└uЦ`:╙ЇpЁЖ_Ь°╚В∙А ,чде└G7у═еАб╒\TЕбhd╙ж-8A▄zхХ│■·hyХO▀пЬ%НХ√╗3хт╫E╪VЕуЦ h╧T╒@ `( ╚эG∙ч╖ЧФH╝7УА▐x║┐╖ПжI░4uї5╨S·√√я╛rт╒ў▌▌Зу╕TвЯ╘оУ,ує3L√╞Нгющю╝ёtш}/Y╬м┌╛|┘н}'oРЯя▐_p█м╪ k╫╘╒7^■Ы│f■¤я╨ЮбЕВбjp▄б▀1oЮПeаоCAр°°#Пyp∙▓\: └╒Ьp╠1╖╢*j ┤AєА[╢╢▀Ё╦_=╝ЄIVJК аЄ╗W╓ }ў√,~фХўе╝Ё ╪z▌╓ОРхlИ┤Ц╛Ї┬яПы╫┤╖╜щ└┴оM╓я2t╤вw \ ∙q{8МIА╥HkDXБ┴uqЖРгY*g┴;щА╢-Йря9g|454Ю?fўй│_сx┐=¤;g┌9V╫╢╦ЗзTИ╟▌Еmх√■Е╔b C}э√ь1Є╘#Е▌¤ь?┬ВPLзу>?A╥u╢х,у└cОn]╣lhSsозч╓SOуъъхln┌▌wЫ& УнпcHb┬~√ YzЇн╖@ых3┘k.╕╔е;Ю~zPєА╬Ўну.║х│пнXyт■√ГМЮxэ┼│O: Q▄}Л╫░ДuсCС,Nzр∙·С√┘8)Рц G\dZыV&Иr╢)ч/8Ёd0Щ╖c|"h2?Я.dж\z1╩дPNМW╫&√√С$Q├ЗL╛ч~╠е}сdв|Yф\_Эх╛▐DO}S}I╠│╚┌╘╨ёщЪ▐M▀{?░yзЬЄK$┴с~Є├П√ ┼ФXЇEлЬ├Y|ЇГЯ,vGiaтЖЎ│7оojj╣ь┤3&?■П╕DТ Жз?╤=|╚└нЫ6(ЪoФ╠№<'KEЯs╨оо╚╥фЯЯ|чВ%Y !U╫п:·Ш_~y└АЦMы7┌∙№mW^∙╨?Я├Кашю▐DйЇ ┌√p╗к* ╙√э¤▐╫У╝4БАИ#2·WGd╟▒!H1qFъДЦH A)"╒К гR┼F йдRДРЮ╫▀╗╜▀sO?ч┐Ў╜//ПсёfМd╞є{∙╓wrю){я│ў┌┐╡╦Z═ фєЦJC╛╙-║¤┐├┤ЭI┼m\`│НJg4·oя√рп6oн┘z╢RDОixi╔▀№╛Я╧ужEТJбfЫэёR:x∙GO╕{у·\й╥T┤ОюЮсссD,t■'?q╟г│4С═f}┴╨∙gЭ{хЭ?$XIтзY]zъ)╫?Є(╦s╨OS ¤╡>t▌у┐2╘┘СьH╞┐┤шиk|╪ыУLM Згgўс█╓м1$жк)╚Якз 7?ЎёЗ^|![л*Qh╘№^пеh~З■цI'^q╟wч-Ш7С/G╣°дO▌┤f Р0пG╥Ыu█╘бW^q·n{nлмЩ$'Бн°vУ┼u╡AQ$$XаБШ[<Й+х┌з~ъ╞MЫ╞ ∙#ц╟v╜>╬Zv" Ls╔зN╣ йзE╬ЧK╝╧w╤?~тЎ═[А┐ЦЄ╣Ц,╣№╓█т╤┌╒KР├г#7_│т█7▌ДНfЩА╧┐°Г╟п·═oБиеI╙2╛ёйS~№°пu╡ЩNзW._╛Є╞9ОуEQЄ■Ї┌6р7uYщьщ╙T┼эп┐╓Т.¤фI7?╡VЗfПvнВ╣NОНE^0у+Е№Є%Kn~р╣№QяЭ?4\жйvlШ╖─ЭI╢ЫT-Вс5▌╘ │-░uО╛Ё├╟▀∙╠У╚їО6╘Ю ▒Уо}r5и▀┘]ёR.MС ┌I═sч у╔7■цq╙4teЫ N║#А'╖b MEQjщO┤Ў╔Fн>л╖+Ч)hЪЪМ╟GЗЗЦ_p┴Ч/╝иZZ╫лпюШ5╗wbt"ЇГ=╢c╟Цa▐yщE7№Є!Т─!┴щЇД"+¤я9▓о√ЖЗЎїЦ=▓wo╚ч╜№╠п▄·╚ГЪнO (N{_9JЮIА┘ чKж- МрZ8и╒хo}тwо▌аf╦▒Kрдaъ╦/║°▀Ц^ЦL&C~▀Dz ЪЎw.║фЪ¤иШ▀▐▌`(^xтЙW=Ё╘vп╟_(Х@√.┐°Ты~ЁCE╒BбЖЎ\╨╙dz■ Є┐еуpH╣Ы▀w=┐hд╠┬ KгDшаП┬╓=№л┼'R╨╒Mm:8║яO╜Уt╨Щ╗Ё╒╤,cє@Ъ╬:ПРtdV╓фВ5[╥&уX`S#sаЇ ╠ai0MЭzнЦИ┼ЁДk{ФтEЛ8X~A86╣?┤╫фсд #ь╢G╝Г▐JbыЪ▀#╔хb$ш;√─▒ji╒ ╥j8ЩLЎ▀/╛ыHо╝щf╔чA*√sзA~ЎшгgЯ·i 'ю^╜Nч°н█wЬp№╬;·H"]╛|ywwўтє╬╤FF1пяЧ=К°ХЧ■╕тЄ╦1U╜ўСG╧=ў\│R·э║зO∙ш▒Ш?xщ]┐H┼┬▀·З#1╟─ч╝ ┌я ╕Xй▌rЎLЗяОЯ№\эX░c_Y╥Є>V/Ц╟n╣l)V7 m╒-ё╬YeMЛ╧Э=Ц┼їцqєцg^{╜Ю╔_╡d Л.╣·ЄгN°P║м"W╖6V.Цn<ы,░ВпЎ^тлrсPЫ∙▒Ся}ё Мc/║z┘╤G╜m`▀wЧ.┼Вбыю╝Г$┘0╝бШjZ║i¤п╪JтХ╟░Нf╡Q.J]┼л╛|╞эOЄП~yhШТxC╙бHiя╚u_<KЦ▌p}o ┬э{ў▌╕ф№ЫўHg.ЫО|$Б │°Д}├цb╡бШыq gЖн$Oы║fj:╧ТJйJZжD2ЧЬ·йk╓8fк`HОо Щ]∙е/|є╬;П8тИjнVк╫┐sюy №ЮD2e┘&Р┼KO№°┼?√ЩГуA▄p┘e+ю║KР$╚]$█│k╫w╛°┼k{Мb╟Б▐zЎW┐~╟э]Эй9sц╝░u╦ _|хm╖с$UйV▀s╘в%з~цЖ_■* ┐°╩ёX2рЇJцт╧|ц■-/ НчdУ5-Щь░u╡V╩╟"┴R.{▌чO√╤є/хКEЪC│x┤ц`н('ъНжЕSНжТH$XЦ▐∙╞6Ю┬n∙╞╫.║∙FPШ═Аё~╦7.╕uэжFгaл5┬6Ке P└█Ц-╗ы┴З5╙@ОuP┴N·ёA╧mQl╗,ЭКЙM2BдЗQМ%Cу, ╠╢ПЎ╤;╓оЕЦrюG>zщ]и╤4YлVУ╔°eзЬ·Э'ЯосФЁ█▓к╦uакg-:ЎЖ'С_'PY╨a┤ {°▐-4Щ08РхCА╓n6КЫ╕э╝┼▐єsЪхzgїA~IТ.є╢i- ъЩW■р.ЮcT╡y▌т┼╖<·IТг├#╟s╘╛}WЬz*╓╒u▌-╖(КJ╥╪*?▄ ╢К^оV{║╗Ж╟<╧;М.{hх;╥╧нЙ2ьры█a(▌№■є█■dX:%ТZша╜юС_-■зO Ж║qїSh+╔°└╢do Ъ╡@¤N №WG2 &8"Г╨, ╤AПОь╚:Гв░hb╤n ╤б∙bgrт├ЎИ^Mmк╞╨Феrгv¤щ_\■шг┤(Y()(BюЯХnOЛЇ:щ7ц═Fm{ЫFэ╖s4ус9╠2K∙LO*ї╒┐? °▒jщТ─L{┘▌ўx├сK╬9лХ10┘E■ю ш▄s╬!i▐╟<■{╖n╠Ў=_>щнHъ╜OХП╞╤D▐р^,_∙ўумзZkЖ╝шГп<¤єШж▌║·Щr╡▄4IЪДошКє╛Жv:{}h+ЇьY╪Ё╨mk╫Ы└siжбъM▌%П╓r╕Г▐Оf┼bQт∙А└]TГеА▀┐iє╢{h┴ыГуS╫b!_.=~═Ygb~я╥[ят=>ЖдфF▌ысХF=Ё┐Ў╩╦?тюё{╞ еU╧<эї∙s╣▄мю─Щя Z╜С╔бuK╤862Jy─кUл^╩х3A╝ь_Ча┼L┼<|>мQ ■УOЪ▓═Ул╬:лйШ╫ч╜?╬U╦@п┐ЁbмО<╓▀║iэюсс┘╤╬\&╦y=ЗоHБЖEf╔■юоM[</Ч╦л╛■5 ╚╪╚ПaщqlсBм*_sў}@а╤к bЎЪ ┐ї╨У┐>m▐╤╪ьy╨"n·╒C8ОПММЇїї5х·х_9у·Я▌s∙╥╦░┴}═▄|▀/cЭ▒ВiПх'╨ШSSю $╛q┬ ┐zхП/я╪Щ\0╖a4бEх'╞ч┼║Я°▒√V ю+'|i╡H№╗> ил+ЪOHф╡ъўJЭ·╧╖н^зЪNеоr^I│╡═8TEGm*Ю1j▓Чgг▐└:с╞зWWEф9┬╢фZ]т╣╦└(*ц░ОО7▌tфQ=ЯЮ ╘╞;RW▌vЗ╟+2олъ┐/^Мн Ч▌~;d╓яў'·▐КP├░Rщ;_+_zЎ┘ШmB{╕ё'?8lПё╤С+╧?-─ёx1U╣х▒▀ ПЎїўWju┤Ь╨╥╜д¤н a┘гПуМыHU&ш1Mi─#▐╤┴бХg|щ╞╟ГКЪ/Wzz{ЛхЖ[H╦▄\╔р$Ё╣@0Tи╚^п ц╬U╫cЩмZ$·g█√Ў`$╘█Vм^ё└├Р/еЦ_з╖Ухх?°Є∙o[4┼Ї╘дчФЪ$ьй╛g?¤D┴┴[╤Юlw M╟АБ╖W╩EIТЖo ┌╫Q3йT╨╩BК║ы┴_в╕v║~┘Ч┐МV╘Аn$q,├Жеў╡№ЖяTIЪє√EutУ╢э╦O√ьn}6Эпй@R╔Ў┤5ЄЧ╞┘Є█ЪЭ8╪?░ В>щы'~═ц3ZПncЧ▄y'|bIЄz╜Т─│╗ўь╣╛`> ■√┐¤m]FУ╚иЯbйb╛░№3Я■╤s╧-Ж╦ Ш ▌ё╪уХЖ ╓ВвНЎХ╨м:=Е?ш э╢Я▌ГР6YЛ▐эT╗∙=,Є эЛ╞h▌2(Й: Б>x▐╔ $ъъs╧>Б═МяLv═Z│■ПU╬ы╠]Ёзс4эЁОA2┤╫[#°ТЖш`Г┴Б╥v+J║╙]?9e BБ/qЗбшlfтИy 0┤ьD ╓╔'_√шу(┴IзЕ9╟░7yD~Л╖О¤tЁm▄PГ];>6┌▌СRхкe╤Рobl┤зпg╫╚`gooе╥ИД├╒ЪЪIзГ~юа░Xr│╢акЫ)DSС;╙ЙX\лха'Л╟уccc╡Z-.XР|уНqф╥П└Рg2U З├В @ЗФXлRДўkяў  ·с@в~║ёR╦e█4Нf╡сQгul<_^╨#I%рСЇкiЩы хЄ╜╟д^▀9╣и╚█╣BLh-сПEЦ2 э╢0[╖}Вд╘eMQ¤┴@.ЯяШХ╩Чк╒z%ЁШMEb(╧U*╒vx╔V{гЙЬQwuзъ▓=>ЮДВЗ┐jА ЙНZ=ъў ьM&вЕ\>О(Ж%zщ|IЇx)КиЛ╔X░ЬЫ>dP╝'ВkU-оI7M│T*еR)Вд2Щ P'ЦeбЮ(ХrW"┼pью╜√ЖЛ'R├г#╨ р8┘╒х}э╒┴X<ТOODгСЙ▒ёTOWC╙╜Сн█wўе║ъ╗ЗEЪ w'F│щd▓г0СIJсЖжg0ЭєyK#ЩcОш═B7╘ДcЩ╡ъ5▀№╞7VмшЭ3п\йy<"XbСА7ХоО╨╓н/ ^╔IT╦▒ К\Yп═Э╙▒aу ■╚qщ y"Ыё·└НЯe9#├ГЙD,ш_{m[*ЩVM9TUn╚о`F47ы ╞^ЁСП\yя¤*fш<HFъu╣7Ю░╦M┌▒нЕiм╟ч╔°┴b>чGоP-KkЪr═ч>┐фG?Эф"ТTвxЫ╔ uMйЛ╣┼#1CVК─5у┬O№ъэ?ш_░P╒Ъ>ЯЗ&╚rеlпппgpx$Ля╪╛kюВ∙Й╩фЪГГC ,HOМЎїuПE"С┴A╚]┬▓,hнкк╢CУч8№┼_CuГ P$°p0я▌=V_ww╖"╫х╓╬0LP$Ё~Ввu╣;░UWы+/╝pхOя╡IV E╩uЕ┬)Ж╞╙г├ с▄┤Ї╥я▀w_╡▐МеbЕТ┌TХЦяД?п зЇ!C w@PЖ╞╥ИШ▌█▐Ш?зWkTh∙&єГ┼J╕>╬KааВ>!С╙8IpgЪ(МR8.Бy9Ukж(рєП╪┐фfr$БF▒гt┤▄я1tлZ.╟ъщъ░eЛlн╠г( L╡`└Зvh┤)(@8╪│ЗaШD26:<╞ЗЦ╫Wn╩ЪёЛb)Эе ╝&7<~ЯН|звnеEQ└bв=%Л[S2SхS)d√z║k╡z╡.Г&даЄ▒tбTЖМ7jUп(∙^╟╨а]ь█╗╖лллT.╖в╞К┼<▀■Їз~·┬ нxЇz{├P▒ k╛ў}s╟╙Mи╪`A№ў·+╚╢╥>H║0-Фы╗Яr7┐яz~[kя(├╢ZгГ┼№┼╫╨┌Aї╣╒O 7╘c├;S]│Ю] rХў┌sц╜:Ьб1╙ О@1/ н├u4W[c[гГцфмbЫ@8УЇ═N─дн[╖═Э3╟чa╖┐╢▐ Ъ4У╦{ГС¤є╬;ЧУУ╪фжу╧йГ6O╤Dzl╠чХ·√┬█^▀'B/EсB╘_иTХЪB9┤ЧўДВ╚eЭaйZlеs┘p$с╪T╜вHbШplE)'SСббс■■nEБ ╩╗vэВм|¤Н╫g═Ъ╒N└──D0┤╣Sq├P ╗V.]}▐W┴М╛Є■_`█▌█[к╘└┬╬+6%"╤B n╩1ы├* Ц─7Ж╟bє:а;Д^г04▐ыёa═f╜&SёвcЫuБ-UJ~]V -оj4ЪвO╠Г║g ║5'L2╬Т$ ┤[wo╟Ё`:┬╠X╬╢Жц┬a_гa№пR'HlйPm╓+ЭЙ(иїжж·┴╤tО},яБ■H9aщ@А6hЖю0ЬВ^╨┤ ┼ ╜╛"Cз╬3h_╕┌Z?:Б┬н*к¤Y6ЭщN┼З%п7Й@mк7ї\!Пв#jЖa"╫Bh╦╝оХ╦┼∙sУ;wз╔[RФW$LcЮ/PЬ(b"+Ы:Pmг▐МK┴\еyOўp║╥щєз╟▓БР ·_Ду$В┬ш╚─Є3╬║ёў╨t·я░▀76:└╢cбPH╓tЗf1Ъ╟h wЬиДo{u;Ёджж╫Z=h╣\■b(&(ОбK┼╝╫+q4г+*K0f;╬дшisгуfй■¤л┐ ╒╣Х▄ЛєlSЦ╦Щ▄{║fХ╥iК├ ТФСЙ\╤C▒И<]пT(╠Z║фk╪└^млыч┐√m▒▄Л(ПВйК╜MР:Ь─БX4хкнъ"EZ▓zї%Ч`╒&╞╨лю╛;_╠utw ]ОUk╚@ьр]╔[,V0╦Q}╓мX6лx}|йZВ ·Б(T*5 ·КЖ,╤4Y,ЦБV еd2ОЬ3╦К╟├7ко4-█шN┼^yхOG,|O╜Qх9H!╝╬Dо╝ф` ╠Ё┬EЯ>+е1КZї╚o_H6p╣╡ А┬▒юдt▐щg\║ьjЯ╧╟(jЗДЎэql¤M 5лuHШш Фы /dЖ┴▓┘TУ ZaХp▄ж 1xk┤╟РЙГ/Д >ШкvvwООgАмБу%QXЦ┬кфщ╝T╚Д┴·5-PБp`dd ▐ъ°rйt¤ч>{┴=ў┤ъOТЇX&;зок█└в ┼2шh╓ZЄр З╘║∙=МЄ к╒$бn▐вГ╓ЖG\|ЄI@7╖гТ эьюЮєЇЪлЬ╫Ю; Х╓ш fеE┤7e^t▓╞1Kт┴АРOГъЯ;Nжд╚║ЙJ┘ж*7fuEuEiФє▒D▓P╙5иv└z)B╤аTгVе)┤ ║ шсТйф+п╝╓?w~kH@UХzWwjчо╜╛@и\оB╫MДsЕ2╦ЁJ│!r<├╥╒bиC<┘70фїЗM:X╔ч┘▓ї√KкИ╤ъCЧвоЫeЪ╩╪сї▓iу╞TM■Л╕S~|┤╓l▌╞ў √!Т!ЖЖт"ЯCБ╘КZТUТў`┤¤е+▌й╨гЙL╓ц╘·ЗX╧∙╜ЮPА╧e*,M▓E0ЇДRE;ЛС┴И.ПФ╔щa<в╠`5]y┴/ИZж,q,FZкi44Уц┼жbXюс╩░Р╩# гггТ?д╢7k╚MВBнЮ▓И╓╥Ц6SAf'╔Q┘bHЮо╘%ЖєєЬЧc▐°╙Ўо╬▐ЙLо^ўX╢(x┼сЙ▒гПЭ╜∙∙]cг▒X"фЧ╞Ж ┴# lй\#▄░5QР,█фX╛R-8 m9У╬vu╟є╣*Ь9т==╣╝2░o░▐▄l6╘0=>╤╙ЫЬЮHжт╒r╔▒LКвбю╜&(*с╢╜>ц&KbЙХыU_┤c4S40*B+gsЦоt$т ╣F1═Йао└╪└ырЧуОЭИИХЪUm(КОВь┴Чr Х┴-щfке╝╒&5∙q─HВ─═@╨366▒paЄхЧ;;║Q bи╓~Є╫bБнbrщ0v@Нcэ║ :б\.ў═ъА╩SЄЄpgО;nn.з У╔в╤░оЫЕB~v_bbвhhzWWb╧оБ@└WК"П'│ЕН&Лўю█┘▌7ўщg╖4БЬ=g█╨Е▒ОО╤н╫ш$Є;└HQ7id╠Qh▓█┐кя@?ЗЖ√Мg╣ЙЇ8G│╔x╝^нiЖN▓№■hj√MГА6ЖM▌▄Ъ╦8@█╙Ъ╬~:╪N :╫vCCRМж+э%qЙXddd8 хЄy╞├╤$уaДzо╩у Ё╧p88Ъ д┬╣ ▐#Щ&АOI═rшpc═╥Ко╦ ПGЬМ^J╙5╣ Meб ┼pEiВ▓VїР$)їJ╚чщьЭ|г\╩╖Cх*Жн[D l╘jMUїЗ∙b╬ч!q╦тHйQW╤QP)LЁЙж*УжБ╫ы~Ц;█ 5)\6UЖ |╝ж╢^o╜╟▓л╒║?RБЙ┌┼бtк║тїH╨уa|lв╗лKkj∙ЙL2ЮbiоФ/А╞Ь:h╖·TnБ6tj ║@Gэ┘▒c▐▄9╔ў╞О╤d з╕сёёd▓Г&ёЇё6КОFАM ЖЙ┬гК`Ы4I(jXЭ$Iууу@хб@О╧d2БPXQdI╦Хв╧а9ойh╣\.╒╤UоUБBщбK%уИn╩5┐:{▓O─ЇИ7р╡qн╓hX:┼▒PЮ{╢я>f▐┬t╛`xxNТкYф█0╒CG ╠x╝ЕB┴0▐ы Gb{ЎьБ╘жGЗА{y}B>ЫГ▓╥-м╘hJ╛РйЙ+f3PМ$M├ ┴ъsl╘э▀бi╕>ЮИ┌ЖnЫ4Юbфj-ПхЪ5Ы"P`бжJй&ГУ╦Z$.уVUСбz&2=сx╜T!9ЪаH╒4 Ж7н╓М<ю╥щЮ╬xеР7 -ХJUхf╛P ┼brS┼╚╔-o-:╪ZЄ╤┌T ·е╜Э])(yЖ└┴╝a1 x'Й3h▒Ъc╙<З╤xSSe]Н%hr░!г╒Нк┤╚+zk╒*├▓ vУ юb╘▌▌ &Ь,╦~┐lфеHQА┌BнАж Е`;╨ЦП$╒jЯGмU*в└9(юПГвS04╘Ъсц╠щЗъDУ$eйPйаэ▓В,e 2╒rtB",d3В└г=v└QLл х╞▒нЭ┼¤}┤и Й ФШнхi╩Пdи▓нл^Й3└ ╫Мо╛9█vьэьЭЭ+фБ▒kZSТ<иЖР═▌╗ўvttIju─■M$э╥n╒o1┬█k8с█╔═:4ЬJ╡ Jo╬Ь9█╢яДBНF3Л@1BЙЙвhШОЖ еr╣фў·Y} hGЁR░1<взQm╜K3hЬ╨uНдh╒2l╣-k╙Aм=YМ■б фwтИ╟╢ь3Н┬wk░ZпКЫ Йo6jР¤fгlsм╢ЛlрО@ысS▓`вФ+а[DЮЗК┴ hЪЕК╧ $═ ^ВИ$├┐╙VyHA╝├нЎс╡Ўч├═я_2┐ЇРМaщ┤@k═▓Ч┬╓<·лs>∙I▐╨6пv╒╩oу╗Fzz;_xi█╢]{╩Ъ╛}ў^'}пйщУt┴▓ ╦Aпg(╘▌Z╓]p▐ЬФ¤чСZ!ЎoM░ёwа■▐·Ll:|&Х╫~ыЎ└[&Я╨q<Ё{·п°4╫эїsnO+Yв=yБMЮ╖'}▀╠Мj├┌Cз╬tЫ{┌1>-╬pKв╗5BGв█0╩"&ў╡<>╪@╛нiQ_4ТЗ╡ЗE'╙?╜d|rs╧┤T╚╬T1N·ИЬЮ·щГ▐╢┤▀5┤╫R┤┐рЇo╜,йХр╓P\v{Ыд3∙YзU╚ Вщ%0U1жUб╖,MШ┌j╙69мVЯК╛╬┤69їEL┤W▓Eqf~√_√┌Ы╢█э ▀Z▀ЛЦ╓N+№@1N>р-П┤1ь└0|;GнQф╔ ╢¤L╡ыю[╧cэЕ3ез╜Тc┌SЙй6ї_дў/Di_:Щ|┌ХS╧Ъ~х┤zNL=╨■Я═╘╬█▌NьOiл┴╖Ўу┌нБї¤y┌ Z┐╔┬;K6э▐On9iЩ╠ф╘█ў?▀Ющ│╛╡;y╗QДФЁБЗ╠tr*╦╙5сTж4O╗йNmmv&?тБп╢▀є╠ УMO∙4Uf┐эМ╟Ыu(Ж╜╡┤Gь'Ї^■▀АЫ_╟┤f╠/XЫ`ХБс6-Ш|э█U┘иАv4`dх┌6GВ! svя▐╡Ё╚Еуг├$fўжТ ч╠Є░▄жч6\{э╡°у▌▌╔-[■╧]░`H║DД ╝Е╓м"шWвu;dN3\╕pс┬Е .\╝ ═ж9уyрd║оK█hhХJ∙(m- jфн=√Qлбmd~┐_W┬Tу▒╚╬Э;П=ЎXаvеR)Ч╦НММl┌┤ ╤┴▒|5Ўо]╖Юr▄q╟┴#АH╗tZ╦MЁ¤А╫0 IС╒"pс┬Е .\╕°[Fно╜▌O@╪№>▐▓▒Rйцў{-┤DН┌5dГeiЪ┬Je9сJ]│ EfhЄ┴<√ь│█#}╧? <Ё╚═Ы7#:80ЪюшИo┌Ї╝eYGqДЕ▄MС8▐▐ёЕ╖А╢[PД;4ш┬Е .\╕pё╫B╜б╬x╛х┬ ╜жЕНООIТ488hЪж ┘lvjU4┌∙╟0$Б√=╥°╪╚п¤ыgЮyf╦Ц-╤htїъ╒p╫╙O?Ншр╬╜Г╜╜=╧?П|/╔╢(e╡ZksA┤М║5:╪:▀┌tр┬Е .\╕pст╨г^o╠xЮу8`Д mxЪHчА▐m▐╝╣э'╡ггd>Яящщi6ЫхrЩ┬1Б╟╝хЦ[А&┬]└ iЪ^╗v-вГщt6 п_╗┴╞мў}мН|уЪб·<╚_Ъ ├,▄!HЪрЮ ё Ю @W║╥Хоtе+]щJW╛S)7Ъ3:ЪQd╡й╩▒Hx┌─XzЎЬYЫ7mQuЕgЕ║\Г3Ч\vё▌?∙ЩхШя▀▀э┘│ 9ж З№q э╔т▀ ■ўв(N╥┴╤сСX"·▄ЖM8Йwь√qфўБ4,▌╘нщtРbHxHфЪр▌Ў▄эJW║╥Хоtе+]∙╖ kХ·МчГБ░в╩<'b╕╜{чЮ■ys╓>╗╬┤ ЦцА┼}■s_РХ\∙шпi╘фю▐фK▀╢Я}Ў┘╗я╛{√ЎэВ l┌┤╔яў╖ ">8░╖з╖ў┼^0 cю▄╣ 9Оc╣Y▐Gср╗z5AжiвшСжйккАBЇ░pY│┘$)фАf▌║u╦Ц-kПn▐╝╣Vлm┘▓╤┴сбБT* ~[┤hQ{Cq√║6ж╓$)j╞4╣pс┬Е .\╕°ЛгZй╠x╪Z╣\юъюЖуїы╓m▄╕╪^>Я■зы:M╙pP,=P8YЦ╣aFў├■░P(└]п╛·j╜^ю╣ч\:ш┬Е .\╕pq°тэшав(ёD┬ц╟0¤sцМПП+К ·Б╢U*Uрq==]pREM╙А╓ъh▓╕ппo▀╛}pM│┘\┐~=╧єУk]:ш┬Е .\╕pqxтэш`;B7p6╔уynу╞Y│f[>ЩL╩▓\*ХЙ╨╛v╚uКfБ╦m▄╕ё│Я¤,№ ╟№ул╒ъЖ ни$├ГCйО─жч╢8Ш╡шиc@8r2╚ЫC8("I╤╟ $MLЭwе+]щJW║╥Хоtх!Х╒rm╞є/╒ъХP(кк▓оЩ╧0 _лХ%╤KP8\cY║cу└▀L├жh┌┴Ьr╣№Ё├/^╝╕рn═Ъ5╤htr+╔╨╨H*Х╪┤iЛуXЛТ (РSQ,с╟IК"8Nа▐I№u.\╕pс┬Е  T*╡#Мы║щєyhЪ%ьхЧ_Э7п╟О]к┌Ф$яЯ■Ї ├pЭЭйj╡НЖy^▄╖oO{[╔╞Нп╝Є╩Ў$ЁC='_xсЕI:ШLе6o┌d;╬╤ЛБ$ фФ╧8&Z|РGУ┼─срГ╟Хоtе+]щJW║ЄoAV+╡╧7c9NSUп╧380╘█╫│eє╓J╡*ЁbсСХZYрDТ&,├&А┤хШ└BсE%б╔├aр╘Хоtе+]щJW║ЄoAЦKХгТC├I╠╨╠`(P,ФрxчЎ]║й═▌И%Оу$Iо]╗v╩ їSO=%┬ъ╒лWмXБя┘│зггc¤·їp╤▒╟ Твиz╜╬▓,a╖╟pЖr═╕pс┬Е .\№╡PнVg<╧qЬ,╦┴`░P(ь▌╗w╦Ц-Ъж╒▐&Д а┘l&ЙJеr╫]w┴3с`ы╓н>Яo├Ж KЧ.┼GFF:;;_zщ%xш╝yєА'ч+Ч╦╚╦ IЧl╙┴vЬ:└tЧД.\╕pс┬Е .Н╞МчEI&УжimkУ4]╫БэЫёz╕lъQ∙|>я▐╜{bbшрЄх╦q`Ф▒XьН7▐А▀$Iц╟▓,\jY▐┬дZ0 уe╪Е .\╕pс┬┼tЫёЯRМ╚Р└ЗzПD"pЫф┴E└u]╟▐L■▐ОЩ║pс┬Е .\╕8tx╗a8рsЦey<Юz╜▐Ю╬=╚ В╨^_H░╛p8<>>■ ═чwд endstream endobj 179 0 obj 54 endobj 180 0 obj 116976 endobj 159 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./font-incor-s.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 181 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 226 738] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 182 0 R >>>> /Length 183 0 R /Filter /FlateDecode >> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЫ[шЩЪ)шЩъЩЕММ╠бJЇГ╠\Є╣БЬ  ─endstream endobj 181 0 obj << /Producer (Aladdin Ghostscript 6.0) >> endobj 182 0 obj << /Type /XObject /Name /R7 /Subtype /Image /Length 184 0 R /ColorSpace /DeviceRGB /Width 858 /Height 263 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 858 /Colors 3 >> >> stream xЬь╜Ф╒Хи{*╟?з■;╖"Q${М┴6 "gуД╙`c{l╧]3є╞c0X╚a<┴┘ L╬ СФBH"ГPVлs 9UОoЯкn!l∙]s▀zў▌U[м╜клNэ│╧>e╫ўяК┘╖ЕbЪF╟:┼№q,П&kO╔Т╬╣9[E▓HЙОщz4M░╚▓ї╦С╛хzжчЫИ░ЄHDI8BЄiД┬ўс┴%DШ>eтЯ┴ЧЁ╒@ЁU.>Ё╔р*ГщТЮK║.i!4kЕW┘@Ўс<╘ЛлvH┬ж=П@Б,БЖb√Пg╬Р╘ Vф┼rSFдЬРУ├7&" Dъб╧>БпydXЙ▄x`2╝╩a│╪ ┤┬ЩqBёАKPZG╒ё%7Б╧р┌MDupЬ ╓T█'╧ч|Dу█I▌з┌╕>7Г8WЖ2╛▌П╧░у╕RO }КЄ=╕ЪI╧·р∙3с┬■y╕:yаIЕaNЖ╟}X п ╘V╧ V№l#Й$ТH"Й$Т"A║jыSЕn[╙к"У╢5A КжiУМВ^╗PУўсu ob`┌гв\. ХJ%A(К2 Г$╔ГT@8eыЪщ9Ь,'▓йф╛СaЮiJ5ўu╞|ф╩@ИTId{дKёb╣╥ь)╬л╫Tф2r▄Gьдв╓Х:yс∙Я"╞╟▐дY>ЯяqСд+╚vQ<╤ЇQЩёУо╔ST@╚Е фxИvKфРРя;└'$└h2ыex@eH38#рУzп ╛"А╦ьнPД,cэ∙И$p▐ ш 3sМA╟еf═Є\#ГКf#╕┐jbЎO78жIDАГ╠МWdшШ*D▄╟M╖}а^$6ь└7.Ї┴╧█YЕ╜╨T`'lЭ┐▀2зg#0ыЭ"k;hLsT╟Шш╟=\FA┬╚CЬй bв╚В:ГГоЖЬ▒;█d═°B+╓■ьё╠y└X78├╝W&╥СОtд#щH э╬ H┼CЙо%r└T>NЭ!B о├СДЛ"╠6║m╙,a█.╟0Оч∙╛KS,1C^└АA` BгбH2oЫzLО╣^З&q╚-╠╘@╬рVCm╟дLGqb╘QоvЄyры╖┐╣чя╛■ПD╗9Kd_yэЭv[д╝C'з&ц7┌н=2Эв Ю2╡u┼j╪Ф╩╞<ОЧ=Mв 'Э|╦╢-╟З 1 -ДЇАОЛ▌%ЬА/Ж█Кєja■ЙRГN╬∙@tЙ 3Зя■єр▓<╘┴░т╙@╨д╟ЪЁ┼╬%}░ясLфLx2Д▓ў4@\ О ▀ЛX╥Хё1╒ЁHЬє|Бt╥Ю╧СДюС&Iи╪В╟¤·DPФ оржl╕{Е├рNа}Мf83К#@·d╨]^рIp Ъ╬ааE°|xХ |Г6ы(╚"7Н-╤UМ┘vзЁш2╬,zс╙ФП╥гpы┬h@╗╚0=В%d ЩЩ, юЧ╥З└є8Ё╪S:╨DА╫>>O┌┴╒а─,vG:╥СОtд#ща}й┘УI┘ЄЎ0МБ▐╓А=╥< ╤ ▓ГN·xТПШ ЫшЦv─СЗМНNь╪╣эшгОїС;:2╬░Ф└K3Cйя╙Оn┤Ы`и┤c√sчїъZGQ╘N{*Ю6qv╨уИь`╨┬#Дb=U3-Гъ╩╧хЩфЮ╜яьф└Pўум]z╙┐[6н·╨З?ЎфК╒Й°╢┌ 8fcв`Ж└С╝уXоп!╓p)╒жuЖe╡6с{┤я√A╨4MQ ErИа]g├№`tuv\╥ЩсB#CLт6SMl╔╔В╟б/ГЄФ╖?J╨^?И9О╞МЯИ╞а93░ю╬─Ы╜Ч<`D╪ ╨▄Щ¤%sа┘H"Й$ТH"Йф┐.^Мб8Uo!╘f)СF ╥N╦bL3з0$Ц╨ИG`"┌aYzx▀^ л├?\QФr╣▄╒╒еы║я√нАh╙"I'э:>AлЦ▌╓u╗з'б#д╟ kgС╚p`┌┬I╓r\7Щ(Цж┌жJз2bў╡:╙o╜▓ў7■ИP█├вФZ╖сMSя┐Ї№╣|[█К\Гє 45д3И═з╙ЦgО6G}╘╩жSЦнШЦG I └ДЦA┌ОC╙ВЗq╨ЫЩ█ЗN/0y<ЄdМ8√хРтаНHг ЮУG!┬╞oE $МГдI ╨жlЬ═ ЖМ=╩'╚А╛├!Z╥%и┘фа7;э╜ЗЖя═) )╟┼pЖ]КсУ#°У0`Mг║лal ░ {`ъ╡У3Г╫√П1─б`┼y╡░RЪD6цqЬ─ЬЩ#0h0с╧)t▌└IS/FxL0аРё0╖q┴╕wУ8GЧр.ЬЁ#бnb>б┘V╧у▄9%╨╨√'╬H╚В─ь▒Шs▐Ыйщ яMёМ$ТH"Й$ТH■ыт√╝ЙА4TБ+!в!s ╔їЦK"Ъг╠pю ^nА│Гt° 6╜п╪]йTDQTUUqХЫ`Y╓0МГ╪'P╟оЛtП─╢╡ОГJ]╣DйRЛ дуЧ ╗/9!ВХДIr╢aйЪeдх>╫ф┘╝чсы}к╛n╒ЛKЦ▄DМ ┐Э═u┐┤∙m╟ю;ымФШA▌▐ХI╡ЦХg·,█PPЫF┤Н┘Лящ.LХv█ом~Р9:AТ▓cSxb)b*!╜ЩLUШp┌┐L╧Ф▄ЯcgRS╕L8│Р■┤i'NрAX╙Cf0tk═фс┬┴тЩ!┌Р\а!с╜w ─q~С0╚A(╓d╔┴&▌─6ёЄ[ oЇfЧШр┴_Об0у╗рV0ЬibЇт╕НДВs{°A┴▒ ═Гqyrv\╪ 8/<Ёfsz!■ю_Lу·ДхЕ╔ыўтpрJяАU;┴-x╞dДГСDI$СDЄ▀*Х,N7__░ ╢sчx╒Кd╩ёд┤Р╓МRА".0МяЙ8щГУ2>╧░╜)╥r█йID2ЧTEW▌ОH╩>X oїx:5UйKш5╝╙6╞}dчS9UЭд@°^ Бq╨Ў0 ив╖8hъд┌д;hфё╟ЦжєюsOпZ▓d ▒ўЭсбC_~х5MK\zё ═f;╫█М┼╠Л╬╜ф┬s╧=юшЕЮon▌╛ї╬╗я}р╤═ж3wш(M!┌M╖▌@0К1dЦaуж╫HeЖ0┬сQ8o╜)G(─ь-Ў,О@сБIш>2╠i{oёЛg╝a~Рлг|=ЗcЭ√ї■LaX={W;┴U╕Л └╚╬Р┴!8tлЕр╞zP^ ШИR┴yїА╤╒¤нА&8VfKТ┴q╪@&░уv<<Бп╥Б╓Й┴╥ОЦ╘┤WўГYа┴мВ╨[\Б/б└а3л▒╛oЩА'xкв"l,3Н¤c╟▐▌Б▐▀СDI$СD╔@Ф═Xяь╝#СDй$╞"еБXчu┬╡д°э╝√╤ь>Щ╘рЫo╛ 95Е8е╙и▌F,{ыpпbаCЮ╒мёщDўDї╖D└e╢╝3╗┌tv▌* Cбёq44ўDДКsЛ╜╕ я]bz├║Чп╗ю√De╕├╟∙7╢╛к[╥Щз#█U|∙ї;╙iз]kЇУЖ1m;JRNйО=U1Уёn #├хН╢>ў▄+/┐┤}r XJ&Б{H╬'┬╒с└eш/Л\з йА┬!Z<@ь╠ьДт╔┴Ж,╒Щ╣qоDxqГЛдRgРvfоЮ{G═&└тЇY╧▀├┴p▓$╓│CЯ>∙▐╜xt╪Ъ░цВQQ▀E╛╣ё`R#Гgя└ж▌ ┌Ц└╝╨ДpI║Д│tV╖ЗТlтE'x1IЖK0ЁЄЧpХ44'╪╠%мФ└зш┬=e┬Ь( 7╚╞c№(м┴Ю°~Ш╣┤Г nЁ@╢яц"tВ╕т<+ЙЩ5°╧░ЇfQ;ЬЙИfєЕ>°ЕWСр А╪а▒┴f@38ш╬цC!  ═#Й$ТH"Й$Т$ДM▒b&ЫЭЗжk╙╢о╪a+lбP0М*`А$∙<№^Fсj╬╗n┐√жя▀рx■[o┐ dbb"Ч╦┘╢¤чцБ╕^Ўф ї═f2з╢█═кЄ─О=[{╗√╦х)Q rCn XВЬ)v,ЭOзr┐┐їюя¤╦Oэ?█шл+V№+├╖6╛╕х√▀ >1╜зRш╧n╪┤▒┌в.║рЖBW▀GOъZxh~x√о ыЯ╣ЄК╙`ТHд{>yцg╡╤╫яїї[R:▄¤ўоzрБU/oxЗсТr<єЄж▀ч H3Ёn(Ш[tфoы▐Ю▌?УS(Ы=Эp╗s┘┬╘фЦЙ╩ZЦAЕьХЮа╙Эй╥уН*:ьР/ъ:╨П)╞$MoМО▀ЭL!╫EкКx ~YQT▀CХъ}ЪЖ$y╩g┐─"С ч mEЯ╥їзжзQW┌╡ ═ЯПdщ"Ж}Пт9yчю▀4╛▒╙B Н╘6:·шo╓█oWкk]-Ь UE▒eЩ┌╛чЦd №Б};╞пыut╚ЬпtМI├ZQoв■№U,w¤йж▓╠6P▒√b╕wкЇи Ю?╕MWЮrФH~КвЭZэ!UA╔$ЗE UkшИ#о2udXMЁg║ЇаfвC∙lл╟Є▓19}oлБаvЁ│TAєчЮF0 Щ;м╙4h"у╣О'К▓i6\╕VIdуc╖АЗ╔8овпxU*ЭиU+хЛєЎ╓√9П]ЕlЪ│жN│М`Y6╟ёже╜ЯS╔┘ЭщYрО$ТH"Й$ТH>Ш8<ПLooгs▀Ё°pyjЯ└╟┤Ж╧qВi╓bq╛н┤$)╓j[Т$╡╡r<&нZ╣·'?№Iз╙Щ фМ3╬Ёa╞┴+4h]├ы\3┘ь▓e╦Zк╢~╙ц_w3G▄єнжu °Їш╛╜cP∙@2rгfЁ<АбeШj*SН$XВа╫м^┐Ї╞[Dt,0тК╒K]bz▌ъЧ№`)1╢cдwN +o╜┌QчЬuГa╥ЙЬ&ЦгщoЬ}Ў"ЯlЦ*%ЖMЇПv}%У-┐Ё┬S_╗ц{ч/╛┌╘еZ═Ы√7);ЮйtvшW,5j:█].CH╫юVm4w▐ н G Щjэ╬K╚C∙╠хЭw╪В├▀▌єp│є Gбx№bВР}ВЄС╡cч=╣<К╦gЁТс╜пRFs/l┤зhT(\ЦJ╟╢╜};ч!>vEЬЛ█о▓kў}щ ъишЯ°┬╘╘d,▀╗ч!█┬├л╔─┼Цo29Кmя{─4╨ЗО¤║╥фзkуГГ┬ыo▐┴│P╫E&▐z╧lwЮvTH]П┼╖я■E"ЕR╥еВH┐╜ы■L'.╙╔O+Ў.╙▄ иЧ╔|8╧Х╩Ou╘?ЇЙZ∙Еv |A╖:п5OAKyщ<ЙУDЩЫ╕з\F}¤з╧!IqUmЗєБф┬MgZн·Ъ5/pвЁф3╧■ш║[9ъt╧Г√яШ(э▐;ю╣ш╝s╧uTcэЖM.N+║p╫'N8Ю∙+V╡fї║е7▐&·X▒zЙKОп[╜у`ud*╙▌╡aєц╢Ъ=яУ?u=>Ш┘V' ъу'╬;ю├b,йЦы#4+╘*Ю ФiМн[╗щ╩╦>яX Ць╣щ x┬ё_ЯмR ]й=т#ФJ^e┌K┼ ╫,д4еVo№╥╞╚ ~ж▌╓ж*Пъ8╘Х╜▄╢ &кkэ{*u╘]└$Ч╬^Ъ╩ZнZл}лЕ.№МяЦхЁ\LUЇd2=6■єVїtЭ ФПчУGЦЙ|}╘ ╪5VщКз║▀|ы■\еSW╤╢'Ъ╒g%ї ╢▄кл═ЗГHMNбО Оezї╞V╒x▐vPR╛ШRR╠█5Є╫B Ч┤°7MєОCB╙┌эD+╚oЫO}╬ЯЄиz∙a┬Ї"╟RAоY│nщ ╖ЛшcЁо_▒ц{.9▓n═к%K~B╘F'S∙№ъ ┌JёТ ~эг"'8)о╤\╕@°Ё ╠Ь╣-шr<>╝л366╣mыkей┌G>t╓@╧1O-▀Dв°▐щIЙL·Д╙h? s╥'║'ЫюнЦu╡д╢dD<йТчПЛЛ╔JmI"CCЗ╠√Т╓Ц╫и+7C╪ZM■!▀w';m¤ЩOG(ЙРn[+ _#j┐mХЎ}^╡Ъ√ДnсйП`ЬNй┤▀YO|┬1}E_Oина#√ьDYaPЪ@оБFluНов╛▐/кVзШOя╣yt-:№Sк█▒╒х║ГXПкЎ|A╤█╝HЦ+QJ$оpL;СЛ┐·╬∙,КS └$гЪVЗ!│╢WвhТа[Им5ўi:Ъ;tСе╣;╖?Q╚z^JР╓ф─вМЫh6ъы┐FйЫё°┬v╗Mв.╝▓╒■3Г%>(Xh.XёВУЩжI$СDI$С№ХL╜в|r|к~Лс6vя┌ф9n6╤_Ъо▒Є<З$IЮЧзK NрHFЗ3[6╝║ф╞Ы,╦┌╢m█╚╚╚┘g/~ю╣g\╫Е3╛я╟b▒t:нi┌╟>Ў▒ 6Ш╢ї№┌57]╗А.ЄР┘to/┐8ИЖ"$]╒/║°\╨╟G╧?Ў╪cв(:°у─Ъ5kЦ▐pЧшЯВР┐b═w]jx▌j└┴Яc█w√√7╛ЎЪfЇЭwЎп-;ЛGCQ/М@;п╝ЄРЗ╥R▄exaч╓╓ыпя╝·ълo╜∙ю╫^┘y╩╟/ёЭ°┌Н{3жkTЪгЖ■╠╛}и╗ИQO─YpMNN)┌ЎО·╕a#^D╒*)Y╞$╤┬Й╩5jП╫ЪшМ│оl╡╦гул~ф▀ю▌∙╬d∙еD<Ш∙G╔Ж;Ыд(┐TЭЬ╛/СBУ(ХB╣ф9)▒▀ё╘╤▒?Bщь╔█wмэъB╜╜gМП=75ЙЗN4╒ └9▌┼oд]mяи╫╫JачYї&┘Ьъ╝ешO═l╪т"EG╒О98└qЇ%ЭЮм▐*JрЎ9Г▌┼═я№;/ в├A3/╝ь▓gV?T╚ Q:ЦЄЕ6TЇ*yов∙$Iфз3▄╪╪=э╛bЪxюаCCCЧ╖Ыцфф2ОGє╜ttфm├┌б6P.Щ ЫS╙O@Ию$ОяУУ■╚╘=кВ ▒пВл"O[Ощ:ЬПtIЄUcDФЇщ╩Г@╜sМ(ъХз█M╘╫sжщ╡Mїхf%│Шьdц┤lё╕NУтшВяЄm*![╩4^4│CD╝╨ДЯ]Фs╨/#Й$ТH"Й$Т┐JВ-P,MW:┐kщх▌╗7█Ц┴°ЙvS╧fУ>rїVw╧@│б√║нq▀wЧ=▓№▀·3 ┐r╣<11qь▒╟╛Ў┌kХJЕчёf|жixct╞gм_┐▐░Їu/╜p╙uwHшRМГ╬o╞+п·6PрШОn6?єЩ+ Я╛√ю{A`8фRD:┐Пш|▐°+╓~gWп├┘┴╔]├┼■▐Нп┐вh▌gЯё ╫M╔б6GSж│їK.ыщ╡5гjЩ╘УП┐╛їЭI▌Ў|_p С$Д'йvзРь)5wБл║╛p╠╤▀кU SrK6ЇaMщ╓ZhAеОrЕ`│Ц^*с[иP╕└2╒fыy╧A\№o║Єь▐▒ еу╟√чэ▐їАбгLЄYюSУgЦ Д┌ъээ╙МR╜1╢р╨юW╢№СёС Ю╟╨l[yд▌AG,:{tl%░WO╧G╞бвl·╝jх╔J y°╡-uм╖/ї·ЫwТєЯj63┴▓Й]║╜<╦e╧55AР╝Rє3XьqКFI$СD╔_<Лa╪╔кЄЯ;ЗwОМ╛!pФcЁ┼|▀╘ЇD&Уi5; +╢[:├Ун╬T&У╪ЄЄЫ▀√▐ї╢mo▌║ullть│╧Z╗ЎUэИв╠qМоЫоk3 w╩)'m╪░╤░╘╡ы╫,╣■N ]d1Q▐4╝w┘rу4Mц3ПНП╞Її▄s╧╜ОлzМО(k═ЪUK┐пшЬЗ╡b═?┘┴5ы#╙йоь [╓с╣Гч№╣yТўH└▓Х═:┐°хWфД╓мUEочы╫№╝╘pГБEЪc║<_bI╔u]ИTI║╡u█э╣ЭwЩw▐▌q╗$!Y:#.шVеб.ЫЬB ║?Пg▀▐■є|IЇgхQj▀}ЬтпЇЭX╙╕я┘т!Б=.ЭюЫШ|╝\EGs·─╛ч[m44чSUY╛kbт▌DЛО║R╫USQрёЪ┐px╫┼~я6фвJ┌Л╟le∙Кx ╜■╞З║║>ЩР√Z·Шb? ┼$ЄZД@SЖ2lр6 б╔DЪе┘┌шш┴H2■фЄjkEв╛▐╦╖╜√ ivPоU█x%uЬ╜!йШ H╜j╥4лZMчАї`5ЙlО#8n╗ш№OЇH"Й$ТH"Йф/ ЙHП╣M6нЯ╜╗s╗уL╚в░eу╢б■yЖб%Уi╦tж╦Н#О<╢\Ю▓▄Z2{р■╟·п цyю°╪─Їt∙╘SO^╣ЄВЁk╡Юhш4MТ$ Ш°╚#ПQ zqу┌п┐SFЯёР╓t~>Y┘8╝зь█"Cf?~╥'Hдп|·Iф│gЯ}оПИ^Xg║"╜5kWсь :Ь\▒ъя]z╟║5╧.╣щ'──Ю]╣bўЖ═пЫN╧%№Зж┼}JGN!їшc╗n║щsВhYЦw─№П-:ь2├H║ФД╔╥=КК 2k╗╙ G√и]o▐lр┤▄Хд'pL╝▌n│,ыС#ЭЎ╙жЖ2∙O(ц Жэ╧э;ibф╡Г?№Ko╝}[2Б║s▀p\ЛфGх8▒s╫J@▒гПJ0_$█2G·└ОЧ Т4╤╕╙0╨сC╫4jЦb¤┴tЗ▒Є@d┼\ ЭЯLЯ┼Т=S╙╖╖4oюg═╢┘RjLHчСы╣Ф(d┤ц°tыIADC_╓╡C╖єщ┬кgюИ╟P*wБк/▀RЙ+-УЩ* 1ЦE┘Ї╔Мy*сv╡н╤`<Ыг)FМ9эцВ3;эЗё"шьbQHюxўЮX Й╥∙}┼╝П4╫WЎМ<d'╦ЧSdЖgєjGE(?ZhТr<5XJn4CыH╕YtgЄ▄СОtд#щHG·┐оГ╫*eв├№¤ЫяnєQyll╫W Ў[ЪВўi╖TЖЦ(Zxфсev gu┌Н-Ы^┐i╔-█▐╜k╫шшшт┼Л|Ё┴d2IQ°[bжЙw, ╗°тЛя┐ ■ю▐╛'Ч?uу ┐Ч╤Щ┴`ёУ%єmKm7═█бEC_1[еж¤Д╟¤_6Ъ )∙ї╞▌ТЧ│7ЫАл╔°х1╣█2╤°°╧T ~╜╤°╡ув\■╦PТcгн1Т0:Ў+A@Iс*JФ}╧╪╜ №-v╜\■5Ї8Юу 9О2╣╧°>ЗZ╡'&LгГєЬ(;у╟т╝iъХЄ-ЪК└▒ШМ.№n╜<ВH9ХN4к╙Н╬]╢Н·zп75EФ║4╡Л;Э:╧╟ C9р+╧D░_ў■-f╝┘-й#щHG:╥СОЇYУ╚LЁЮiя√#╔г7▐^N2╩~Jk№![ xДХЧ-[╞r / ╡╙▄┤qєї▀√Бк65M█▓e╦9ч\0■р°°8╬мyIТа с`х╩Х!=╣b├н7?lщвn7,ўНЙ╔Йw╢╛°Xл╒Жb9ВжёF┬ОэY└Ш%HyЖ╫м~z╔u ЩЙЯ┌l77n·гbю|~═├?\·#bк■j!uшъч'}р╥є ╤BвЕ?┌╓Fh╧EЧЯЁня|╩ї5╡a╛¤╞╚o~ЯeeлЭЬч╟Г╓Ж▀ЎЁn╫аu■aЗONН9Ох√.\бP┘╣1╣lж+У╔ь╪║Z/%║╒╓dWяBAЖw╜Uь[└q▄──Дя√Об"Жb8gю▄┴эon:╔tў╫к╒T:-К"┤lў6FN╣оЫ╦х:Э─%Яы▌=A╥iТ╢c2╫█У═IO.┐.ЫC═&▐h┌╨РшЗП√g╟жtях╚Є>Ax]]]╗╖┐╘▌?wrt4Щ═┬еJеВўpйЧП8·Ccccн┌иЬ*x╛ЛIїz▌6Мt.gЖ╓м3R смЫ <чgПU0 IЗu ▄25╢}сс399┘i╘ВИ╤Ь$Щj9SШхGЎ╝ХщмMяцфloooг╤иЧ&zчХ╦eшNUU│┘ьш▐╜°╗tЮ┬╔yS)╦щn█╓╔Xylв╚Б▀ Lж╪cш&E1╜╜¤я╛│MО┼Х╢┬Є╝еU·ЗО°°Оmпp|ЧуZо▌Dd y№гЕр №И3hI$СDI$С№7p╨є╟2=]√├Ў▌нZ√-╦+MMwwwЧжФdвшШ\н┌^┤hQ╡6э╕z:{№СG¤л_йКZo╘_¤u ┐щщi └$8╥А]╫Щ/^№ю╓╤m[█ ЁO |Р╓░▌сw╢ОЦ*гоgPФOРExщЙO┬Ноы╣Oбdлн┐╗эн■∙G╔╪1нNg∙Є[-ol╦k╧№pщM─ЮёчzКG<╗r╖─▒°╠пЛB╖aЩИTHnъМ│П╛ЁтПwўф(Ч█▓щ▌√ю\1>ю╡╒Ву'qViцCp3P╚░Фйw8С╖,■д╥╓5└ё╢┘@dЁР▄ВbR,еvжК= з&v@╘йю╡Н|'╧v┌SёD7Pm╜Vс ░╧2ыQ4гАzFщT2┘▐Zu*°ьп~бN%╟SMcМЧRоg╪Q$у:д(д╟Fў Ф╛╧ЖВ/╫┴IТ мЮуgxДМTfаQ+{пpщ╝Ш74=╕ з<╧Э¤А`I D8╚оЕf├∙v$Aвt&YлАoF"╒╫jМ┴IQ╬C+ нЇO&█MаC_ОзХЎиФHQ┤▀оM└═]}єз╟vR| ┌L44─DAkMwЄтЛ?Tлс╣Х Е>>цШ┐k╒[╚╡Ё√F▓i╧єСгРL2СH5к#╪=╝S!TZдД,ЛХRЕfi┌qР▀4│Пq$СDI$СDЄAЕЄ╧mўфЕ╡/■Єёх╦,м┌╪O░Dd╙А╦HК┌8ju╩┘l║Vл¤ъW┐■∙╧Л┼APUХчyEQ╟╔d2L.Н Wy║яз Ў│╣Cє:Jeуж╡ў▄{╗П,К╞I:jЁё.I╥>т╙Й9Ухzнt╦яюС╣pїЙх7sRєйзяZ║Їblъ╡▐о├╓м┌╔╤єN<∙JuY╚еРM╤Э▐A╣XФ;d^W╛g╧ЎёН/╛▒╖╘д╤B╔Ac╜ЖB(Д#└*!з[ РРЯРє-е\Т ЩЮR ╕─═зЗ:ЭОn╫S▒юfзщ#/K[ЦеЪ-1$"рАd-┐C"╔C*└У╠%│-2▓ы║жзУИ╧Гe ++ЦE!ЦзY b├Ыц(рN а╕┘й1ДштПC█1оhШ╢Л(Юв5╖╥WьЪШЪЁPGц К╤D╚╠& шЖm°╚хi╤pМl2[mV╬Хq┘dо╥\│{єЗЪЦ^iОKlZ╡ЇдoЫа*Щcp▄╥Бє z╟rЖeдУщjszаgю╚─^1'иfХ!т@┤║е'фD[i╨┤k9ЪJ@яvФi╔pЭЭH$ъН*M▒щt║\щщЮПBнVI$eаX╕jFгQ┼┤жuт▒,До╒ъ°╕#,ЮI╢╩R╨3Р,╦╥НЎ$DLф А░║eРсЙ┐МГСDI$СD╔"Ж╙╤╘╝▐№▐ё═ЪК'╟5╡ОB╤I▀х<Я╣Фf6▓Щl╜рфeЄЕ╩Ї─└▄їz╜╙и я█&═Л` ▐цжжQ,ыЪf,Х┬ Ї&п9жH ЪSЫ;041╡╫▓i╧╖с]~р.╚gс(в ╙|Jжb═Ж&▒єm█^▒ЄП,╜Ёт#KЧ^Glwlс№▐╡лк$С=ым/(MyбnLH4i9нД,1▀j╡Y$╗H░▒fВ╞z│╧?E┼Ё4ПnС·-╒╓Х*Е$я╛├√°ЫЗ85XФ┤PЛCIЩ"%тТъO& пуТЖi╕╚Yа╩AЖ@┼XЦЕЎ/&╟уёJkД#R@┘$┴jо┬ ╬╞Sбєй|│┘┤№║─цЁ╬НИЬ38oч╛╖ФЄq╧тP░j@3yBвiъeI6ReLЧ[√d&п╪eБJщ.ШJЕ■Ёl╝╠┬ГТP+─:g■ш╕б┌└Од─д┌L_'В╔м▄▒*╨ПЭT0.q:HгСнєСЭр3Оу┬эpЁ╗щЩC╜C{╞▀ВгRИwСЮ чE*[,╞'Fа$╟qКо╨И5Q+@g/Ш╕╩BЬ%*)bSi:HСиМщj$NxZ)XЮув6З╥.▓I┤Їжя#├х■╛▄є╧эъ4йп_{]╗эл.b·ah╥s Ъ" W▒СGIЦХ ∙яЫ^оEP╥DZ╥-╦└ЯїN]dD@Х-▀JJIР╤ЙQй)▒ ╧tYЦ╦Н2┬├ЩРв─K-cZbc╢н[╛Ц3сf▄╒╓D01УєР/qnlы╔@i┘D▐4M└Q┘<┼╙'Сnъ.╥82юzn"Ю└∙?╫#р┐@ `╢╓ис└СIЖaрvIТъъФDзUА`>ZiO╥┘Z╜─s"├PMе═Т4■\МVшDИP+╟ EрЕD$CЛMНЛ╕ч,█bV▒[╣xPмю5у\║.A█лнкЗw{$*б║uД╪|╝PnЧIМШвхXЙX~L7G@З·ЗvПюЎРc╙ нШЬкЧ1√√▀▌√║Hfр╖АН▄8oЪЙLCEЮчш>░2р╢6Ї:╨p&Э)╒KЇ┴┐M╝ё ╖ШКщHG:╥СОЇ 5Бh╝╣2"Тi╓┤л╡╬4╝▀с5M"┘G@rxЖБ< Йб]▀s|╞v]└Г╢RОI╣О┌ц▐┤;$тABJ~HеR╙╙╙ 9k(╛Г|Б`▀┤РF"_dY╙╥KВiГT@J@╚ўрФсM1╬4ЪS,УТШ<═а{°е3W>}я╥е▀%Ўь[780 еЧ▀Ре▄+пlЧдE╟Z╢-jyЮ"=▀╡Ап,S╫TKМх¤Щьр√└╥u▌ >!А%B╗▌Nз╙НFP ╬$ AM╙аI═fЪж·j╡ЪчyЛ-┌╗w'A:Иp9ОГ#╝ЗsR.Л`P╩)Вe№Щ╩ыtZ╢эжR0╥'п┴щt:▌▌▌4Mэ╪▒э╕Ъж╔ют`╗e╙ФїBыАPб╪ьяя/Ч╦###▒X ╧)Ї<иоZЭV┤Ъ$┼░║4┼ВЖcITE╖l∙$╟3pfцШ5┼╡mк│PK6Xд Б&C├єyМнЁ'4ЯчY╟▒Е%A~°сїz·~╧Ю====сb"ИDl▐╝yХJй┐┐КAа╔╪NG┼f №Цх!ь╙╙e0Bс\>m█x+sи44╬ГoPь/№дё▓─$╥СОtд#щH ї╤<ЭД7пЗ4Mo─Ву┘L▐2Сч2ОэЫж╦0I┘ ЛL╗х╕ок╗┘\WеR) ! ь█╖Ш░▐°АRpt┌╡С─┼M▌I&eMWЖ,Хз║╗ @)┴ы▐РФ.BxA ЬbЁКє<┬2Иjн▓`a^╒KЫ7?╗фжя╙╒Н┘LЎ╣╒k1f┘Ф└'LУ╘ B║b─хXGiZF'ЯK dy>aYМч│яc`ЯЁеzл╔╤AS°│оуZv<Х╘ХєЕОжj%ЦL╪Жй[&ЕVрс ├sщD▓╤nк&'b4щ╣╚55(г▓В&ке*'тКО Й11Ч╬э┘╖з+╫е@═V,kTЩ\arl:С╩Є п╟0ж  9)╡9!├▒щ╕д++r|│╙ЦxAN─╒°╠3мэ╣рГ Kp╛н*ЦnР ХIKНvЭB┼RЮэС ╟═n)°D·дfjpОAл║!░1КauE√C¤УеiYI╦cr╜R^╧$SКоБ}№└°ЖЬРФVЫЧDИL"ЭВШhж╤Х╦OLO┴╜р\u|/ЫJWъ5IрJ╒╥@я└ж└qЖeI<О╝└ `YWр╔C∙LьЫОХeшЁ,g:6X3l ┌█╙▀6б╫H╜_{╕OA щ∙HG:╥СОtд#¤WkDЎ┼фДуjЦн;О%╦▓уx╛G╟фTз╙Сcвв6$Щю(╒x<хYNl╓▒DЬ&й╤ё▒▐ю╫ў,├дY╞6-QЦ@Ы╢ХJ$;Х$X▀╟Щ;╧wDСu=G╕f│)Кx║бП@Р  П^· M╦ХrлллX.╒E!OH═ц┤ вчЯ[╢фжыЙ}√▐\√┬Z╫╓яI╫гhJr▓Р/ОНОrэ{Ъяk элD╨бs1)>>1СJ&)РG╟F╞9 ╩Xв\й▒o╧Ї└`a▌║]▀кs|╧s xu╓j═T2у{N!Чо╒&hLс╔y4#yЮnК╪ЎЪж-╦j╡:<╧ўўV*▀├├╓ ├рoН`┴√hK■вЭв(▒@к╒j╕И:╝╘мы║б;нж╤╫;hЦmЫТєрю·ЦePsРz┬▒ь░(ШЮк╬▐;Ц╦t═А║2┘Їшш╛9s√''╟▓╣дaш$ЕZнFWWЧу8р x~тэ¤FGБвЕ@└▌]╗vїїї┴q╡╥Ф─$TTHТ%В ]╫Щ7o■╛}├p|░╜╚▌ОROеcбё`<7и~ylтД║НЭЪЪJ$pЬ&Б3ЩМжiхry╬Ь9нV в═qh8_п╫┴C(iZz:Эn╖█` ГAаv╕╠╛oыLФ─-йЗnВ╗а╥\.ZГJ┴ №@Б°Cc┴╚──D6ЫЖ┴/ °С╤╫7055бк`[ХхxOOqllВч┘■║Й╫▌▌л(m╙┤:sB╙└эФ(╩ХJй^o╬ЩГ√┤Z-У$ U└/$░?99ЭL╞iKей▐▐■z╜╩0\"╧F|H&╙P└■Aэ├ПYбЦ`╗МєP°Цсj,ЦАg╞╢]ЦеЛ┼Ю▒▒И┤ьwuхб▐ЁЙr]ю·▀aЦIд#щHG· 0эш}p И∙М╛ЖщЧ─;7╗ас/╩гЙz√Я w1с0╤ыOЕЬ!B\x╔їHгд└hад╟ВZ╗f╒Т%7г;[}Cёuы^├8╚PN░W аГ(К ╚uЁ┤Ddхsi┬╖G&ЎЙ2 Б╖*а Ё pFw▒nР╢Ш;w▐╢m█z(ЬСCЕАПx#ХN╟╢m Тэ█╖u╘Q╙╙ЁV╢9фРёёqКвЁкСXТcхr╣┌l╢z{{L╙j6}}¤ЪжтэЇЖ_Олз╥ S▀' ▌ЬЮ. Їa╨┤сХO:ОE╤DлUOgТ@fАVсTEЁарJЖ3эАЩRбisч╬▌╝ysooя╪(рQZT.UЗ·'╞зЖц lxqc▒╗└sт┴g └P<═°//h2(Б@╜P ╨0■ЁЯчеТYCЗh3сLA╨└ж_jрX°iprrrr╤вE√ЎэГN│mhДЪжFqЧ├╙F▀{LЎ╧]@ Г╟ЫюЇJеRбP└;ik╟╗)R4▄ГБ>ъш[╕p■+п╝6wю╨Ю=├mЕBЮ3╧Csp\лU┴F╗н4Ыї|╛ыа 3Ф7M}ddьшгMMХр╕лл╗╙iУ;бQЇ аЬaY└м▄жR└┴Э;w2ж╙┘}√Ў╪╘>@$▄ ^┼у└sd╗▌╨М┼р'▐q│╤hтB-P/xЁ>я▐╜я┐╪Жg 8;99Оsщ _ _Fд#щHG· 8э╠|v&KЗ?╝ЧЙ┘2■lV┤g)П$ jЇ╧ ~яГ┐?╟┴*ЁI╦гВпСyxхIрс ╚g╓мY╖d╔R└┴F▀`r▌║7рЕO1$@бу╗4Гl╟EVS┌▀■╓7ЫїzйT╦eВ└▄ё╟;■ю;▀°П ┘щз_°тЛOмюЧь▐╜ч╨Cр ўЪаdpA░ ╝b╕єЭя|чї╫w-X╨ l┤uы╚Ъ5Oт└Н└CТ$W*(Ё╨CЭ~·щлVн Уv ИOИя╝єT я~╧┼i╚є╬;Я┼_иC,╦▄s╧=>r@m█ЇPЬ╗c╟`аp┼╔E]ЇшгПтрzАрs╧=7o▐<АB ╣ ь▐│Ь^ЬЪЪ ╫па`WGАкГЎРяр-\Аъ.╗ь╩XLДЖ¤ълЫ7Б╠║╗╗┴░йi:р PP▌╫┐■ї °╟]]]Л/~·щзб. 3( ╕Ё─ ,ДНчеzЮжЙdм╙V]╧АИЕM■3oHE┴Ёwэ╫╛Бч2═Р╡_▐PЪоАЦсGFЗ╠?д▌i&щйщ hl╕ф╪,Я}Ў┘╖▐z+Ї ^^.Злy┬/╕@I°вt╨8\r╔%pi■№∙`М@└╬╖┐¤э7▀|ГgЯ}MГGш╘SOЕЖCTyфСССС■■~'№╚╝▀Д"Ў└(x┐n№ЕШ+о╕т╫┐■5─Г3съш ихл_¤ъm╖▌dёжФч╩ЁчЪ5ыЧ№`)1╢k▓wи╕nэ╧є)Ъ┼8ИlЪёё─6▀мЦз/╗фsw■сwйdЮЇiU1╗{√▐xы═°# ╖▄r 0 `A,&э█╖^╖pf√ЎэЛ-ЪШШbY╬^р]ГсNАдOЮ¤╔eП/╝( нV шА`xxпa╢ЗцЇyф▒П=Ў Р─┬Е ?√┘╧▐u╫]я╦~ @'Gq─Ю={BузЯ~ъw▄Aт-к1AЮ╗°в+ЮP МГУ╗vюeh╔─;1в .╕р╬;я<Є╚#wэ┌W├4! K__X ж|:їFepи{jjт╕уОГТАA╜╜╜яЩ}_╝}п ?&wЭr╩)?№pШф╗·ълJ(б▒└P]"w\ГжI@@`A┌YgЭїЫ▀№°UТЁ&╥v p&2CвВHЖ╣▒D"┼0Tш- ┌AВТ=;vьЄ<чSЯ·Ї├?ШJeе-╦q-]7ч╬┌╝∙Ir╣ Tюя╟P°│rхJ&t0Ї^8Tr _zR/┐№Є_¤ъW(р9hщaЗИ ─v¤ї╫CGАA░ ╧╔╢m█у└><9P~и┴cnЗ3 ■B╗╕N8a═Ъ5√╧@и_zще0 ╖ю┐№Є╦CCCЁ╝]xсЕk╫оЕ>м╒jLаmит/5!ТH"Й$ТH>иД┴hv!∙■є√▀ЮяС"х  #■?Z╟Lррьь└Г8pаоOZ╕░'сСb║Бm╕q└┴╡л^\rрр▐Э╜ГCы╫╝ьxEsояz╛A▓оi5Уi┴╖э>z▐цНлС├MП79A╬фЄ√FўїЇЇ|Ї─П>╡№й0[xTлUр} шяZx╖┌ ╦t┬сNxу╨ДKг Б%Я}ЎY ╝pTz||Hо╢;MО'Л┼░╫жMЫ4┴┬З>Їбїы╫З╣в?Тч─ZнП╟жKУ┼bю╝є с╖ўїїLOO√>q┴я▐╡{ы╓Е|q╧Ю╜АzоГ{∙|p(О┴r╕OaШ╒бuCx@Э░U╗ёълпЫ^XЕ√щ№╣?b^В{├∙yзЭq┌╦/╜ ╬@╒╟}°╕╖▀|Xjll ``K╙КЎT╡u╤EЧм^¤╝къЩН7оЕГкоыkЪа07>> nАe└шюю^А9И╨[&У1M}vО▌Я ° UлїББ╛уП?сЙ'g,C∙l6▌h┤аоЕ ▌│gW▒╪,Ь$xgгl6 б┤| ├├├╟№3╧<Ю@гаяа·д┬├░b┼ x<┬ nPРо; №є7l╪─~<ЕГє╟{,TПАУ ,АУгггPж┐┐╧X8hаIЄдУNВ╛НCиO>∙фuы╓╗э░╨П{ўюo├o√Ьw▐yП?■8<еєц═█╣s'woВKQv0ТH"Й$Т фАa▄¤й;"xSюдHб`Ip╒Э¤рэU╚ЎXрC0жМ╖ЪёЩY,AuДУDЮ╕vї·G6ўЎ╧_┐vЛу2-р╧Ъ°&╔┘о▀v\ХpЭsi┼▓Gd>WЩ4О:·╪ё╥Ю╧^¤й[n╣eёт┼╦Ц-Г7ўт┼g├Лшф╛√ю╦х3Ё■Jh4ъ∙|└%Щ└ыреЛ┐УB╙нV+ЛЇ╝Ё┬ Ё┬Жў¤╚╚Hoo/8 Є/ r]╜▐l4└╦Ч/ ╓╖╛u├ 7|ў╗▀;ЪЙАO╡[FРТLИ;19z┴ЛяраРpb▄Й'Ь╝zїZ]│о■№Чe9▐l╓ л╡yєKАчЭw┴вEG№Їз?¤▄ч>ў╪cПБo@0@ :KЧ.z;є╠3Ч-{ЄТK.`╙l6┐Їе/Бo?№Ё┴{ДАRN░▀n╒UW]u╟w0 .}Ї▒╧=ў ╩Т%K~Їг╕АУ^x1АяСG╕vў▌ўЮ■╣ЭО·Є╦/└}эk╫╘j А╢█n√Cл╒°З°'0{є═7ГУЯ<ыЬ|!√Л_№"№B +0▄┴pгF9▀#╫:щз=√▄S┘L╛TЮb▐▓НO_їYЪ┴[√▄}╧]]Еn╛п|х0d№╦_■<╝·ълЎ│Я=╔AdаvЁy╬Ь9!o═Э;:ыаСАш╜∙цЫ╨╣А┼Л-ЪЪЪИ<цШcVп^ Д (БA]t╤EА√P °АX·j ╫▀№еg~?└oЖm█╢э╪Б?{ 7zшбАь^UUбЫр!ДZрЩh╛тК+Аb┐¤эoCy(чo╜їV(P*Хрi№KUDI$СD╔2`2XюрZH{ДsЎлМ12xyi{─_ЛГd░ЕЁў ╡ р¤88;╣0ИЖъ8╝16йЇ$ЖB7Н│Гл_X▓t 1:║╣пoю·╡ЫПб(╤ &рСмы╣ЖEC№s·╗┌5╗XШ╗Ї╟?aў┬Kп\╣тФУO▀▓e#P┬Т%?(Л┴└т'Я}v%└ ╨Fo__еR ╢t╢├R│▐HеR$"А▐О?■ув╚Ll▀╛=рЫ.Ч■╦w>╞0@╪ЪU╧Яz┌щы╓о9щфSю┐я▐pA42\)LЯ─╤ИЙI HЮg═J:У°─'>╢ї▌7БTe;ь░ysy■∙╒]ЕЮ#О\Ї√[ю╚dнЎЇ 7^Иv╓Yg¤■ў┐(╣ь▓╦yф ЖxА"ЁO ЇOpщВ .Р$∙╓[юь┤U ┬╧■є7▐x#P╤Ч┐№хЗzш ¤CxOhЪо╝ЖШ@KУI)СH·ВyфСУУУgЮ╣°∙чWB4ъї╞Yg.^┐~├Й'Ю°рГ>Юzъй└жp# аjШ╗·Їз? Ї|№ё╟НA╨╬;я╝eП?∙╞Ып▌~√э ёЯ щC╧оNYї┬ЗГЬyРч;,╧8╢WйЦ╛z═╡╖▄·╗x,╔░╧Йч,■фos3E╨х_╗ЎЪ{я╣ +_∙╩п¤█╤╤Qасп}эkw`м3╬8кжЄЪkоЮ└└▀аRЯ8°°SO>%ХIKВO&~№├ Т╚1,▄xэ╡╫B4А№ю║ы.xTЁ7мu¤╩+п╝Уe∙'?∙ аgШEЖлАГ│э·SБgц┬ /ДГоо.╨сОх╨GP╦┼_ , ┴▄╡k`7№h9■ДПо]╗Ўу 8Я~оС юw┐Г║┬йЗСDI$СDЄ┐TH╝L╪▀ Щ8/`╖¤8ш═f й$<Яp zDxpЩ$■t╞╓┴▓Гaj│ х·"LВк`O╝Є╕╡л╫a▄╖o√└└Ьuk╫╣I╙lЁ╔cЗb└K╟umxЯzъ┘w▌u;Mpк*э ч╢щ3ЩIБ$$4ADщЛю┌╓^vэ╜/vA@DDzSдГВ╜▒k/иАаИXpUдиtHHB╩╠d·н ▀9gBЙ.╛√_▌ў╜╧ючzs╦щ├∙▐ч9чyP┘кккQгF= №є6lЦкwLEС@*АQ┤г(К`J@ИД7h╨ $RWWw╔%ЧВ∙т╝N8iэ┌╡▄ О╟╬>√lЁЪ╞ў жыыыq4│f═P5PщО;яzще┬╤HiЫ6▒hTр┬>шрbгN`k С*б3 ─|╩)з}Є╔╩D" r'Эtт╥е╦°_┤╔ып┐ └·p┘RФ*ОЬw▐y_~∙хq╟ў╓oв:¤·ї{єї╫╖l┘ВОЎ╕▄╚нжж&п ?ейЖpИ]U_xс╝ M ццт╪▓и(ЭLВТwn▀Б╘@Д°РX▒bъИ╤┬г╬▄|є═/╜Ї*╪hЖ■ЩхЙш╕_|СябQUї┌kп]∙╤Кx$┌┐o┐HМFп╔═з[pЦ-[vЄйзм■tїЙ'Э°╔кUЇsеzя_╬=ў│5k0H0x■ї▀Ю-╢╪bЛ-╢№╦r╚ї| И╢o═Я╪рЩдщNс_ЦГXРДГ▌хJ┘4├╩FФ1П3F╪╛}{█╢mWо\╔¤╦04╣+Aр&ууП?└┬З╦йкщs╬9ўгПЦЯ~┌Ы6nш|Ї1я╝ї&Рвкк·иг; D┌╣{╟1╟t-+█╒▓╕fzIv╨-├g"УPQ]╧їчЬy·рбЄЄr_└Н╟ ╦lQX╪√╕c┴"йD▓MЫ6={Ї°hщ▓s╧>ч█п ┘гWўх,з╞78КlЛ6cn┐█онУШ2└UKЦ,iХЦЦ╓╓╓ВiРкs·щз┐∙цЫ@Р╟YgЭїї╫_ўъ╒ OnzЎьЙ?O9х╨б█э6 у╧■3ЁЛ┐Вt╖▌v█╗я╛Л2№Ї╙Oў▌w▀'Я||9dўpW2T╔╩6[YЦ/_╬═п°├Р,Zї╪cП}¤ї╫╣5є╥K/░вСWп^Н╖Р)Ё╫╧<єL░#╪Е▀╣s'╩y═5╫╝Ё┬ ┴@А√гХ+&LЪИт}її╫└D ж└░I4щ╓$КГ$ы=НSш╩H`n╫о]? №s┘Y╙Р╫9чЬрCE╨╦└Vу╘SO}ч╜wщюЬгПщ╨бЖ╩┐Ў╦п╨Ю╒UUW_sї7 №жrOрЫЫ┬┴ё:▒МCYt╧<э┤Ц-у▐vhG√|x~у·їенJ@{hНло║jёт┼xL╜∙ь▌ P^╖n▓гNkj╨Ж═нэC╨╣шAЬ¤▐;яцx}'Эt┬3ЛЮщ╨щHT╓ыў}Ї╤'Яr╩{я╜w╓9gг]7зэў▀Яu╪┐╝П╦[l▒┼[■╫╔/р fYА ▌|ю╣ *№Й╣Щ╗V>ым3>■x╒ 'ЬЁ┴Тў/╜ьтЧЮ) Вt█m╖LЮ<╡UыV╤H╠сRъъ"Е┼Eїё╕ ЙТ кщt╨╓╫Ж╧┐ш№▐глшrrCн█╢┘°├xцъkпyr╤вvm┌ пу °зхKЧ¤ї▄s▀xэїkо╝ъ╒W_u╣\╠з6Cы#┘эП╪║u+G╜є╧?м╥╝k.╕рВ>°чgЯ}Ў_|СH$Аи╤[o╜yA^■>№ЁCTp╟О7▌t╙╞НБx(v╠1╟tю▄p6|°Ёyєцэ┘│ч╬;я<┤▒Ш]╫ЭBГБ╨J└Aаj$╣Є╩+Q6╨и t╥║ukэПв0`х|у∙?¤щOKЧ.и!й>}·аl╟w▄кUл2й4╩ ¤Жї▀|ўэ═7▀№╤╩Хi5Г"╡╚/6╒╥ШЕnGZ╫Р)zє─ODaxЇф@ t■Ў█oйўяtЪя№`б)@╒а▐n╕└tсЕвxш%я╛З╟n┐¤ЎysцАM1 ╨Ш╞Г╒╘╙ц>ц╛Є╩+╚L цk╤вЪt·Їщу╞МEэААи `MДfy∙хЧsss╤T=∙сЗhCФ _UUUh╠C╢3▀YМъа┤°P{╞gмY¤ЩЪLЭq╓-√И0@}яш7m┌┤+п╛¤u┴Eо_┐■Лп╛Do█╗ўo┐Э ┌п[╖kЛ-╢╪bЛ- фpР·f╗Aя╛√ю'ЮxВ[#AKЦaЮ~┌йЯн■ аАы└ВЗE╡G╒╒o┐¤╢╟чнммшl┘▓Еn (/w∙<Жe'╨ЁkЩL═▐ъ╛}√В╪@o■Ь└О]╗▐yя]╖╫є▌ў▀OЪ2yOY92 °|╧?√▄eЧ\·╞kп¤╕щЗ9sц╠Ю=ЫР,Z \ё║▌х╗╦`╛P(ЇуП?NЩ2хЗ~()))++[┤h`о╝╝9╓╘╘ФЦЦ░FПНчБP?№Ё▄╣sБ#╦Ц-├3Dн╗uыш┴cW_}їo╝ЇAЪ╫_=╨07qт─`08d╚╘ёР═ ЦE╒С·ФSN9∙фУ┐√ю╗#П<Ї*B╓╗wя1b RzВ└@c(РёТK.вБnС╘н╖▐К╝:р*< Vг;peеro╒р┴Г╦+Ў╝ сЗiк╢═ ё╜ХUН K╣я"╛ЖOЎ║S║]v█m╖б╦АГ,ФбЕ\Р;илооnёт┼t?x4┌┐фХЧЧЗ,АП]║tв.(Ш█эЮ5cfз╬Ga╠А╪:vьИ&дC√<¤┤╙B╣╣└A┤3AўбMPёсCЗ!Э┌┌┌ &АG∙>ыбCЗ")4╬иQг@с▒X ┤Кщ╨бCs~ 3·щзzЬу▌УN:iхG+╦B3▐}ч]Н:·Ю┼Щс ъО2#5╬^x ╔вЬА]\─Я\Л╩l╬XLXtTЩв▄ZТkAxhm╝╦ЩМ+/ё0R╞є:Н╗lr■у▒zqd╞у∙ю┌╡лKЧ.сhп# tCuUUN($Л"_Э┘XАж|╞]ўq сД░%биx(Be|hОн(▀Z┴╒lїё·wчю]╣L╓н_▀кU+┘бшкжЫЧGC&6│7Чs-:е┼├\НЗ+\UIРС+w!h█ю▌╗пY│Жп╦D}1$8ц,|атu╛kЗЯИ┤)hД:°GоyхпЁ+ЙTкmы╓Ы~№17д▀'йC╟Ю╢┼[l▒┼Ц  Т┼A╨f▀╧>√ P╥вE ╣ХУ0┼З>їfwУHL█д╚°Cв╬_ТЩ4Я°щtk░B:С,*,млбvU]▀╠нйСIMв ы"З$№ lтЮP▄N'ч3║ЕЕ█IўW}5жЎ√▐Т╝▄╙ x и▌▄╬┘цш╠-╦@X ▓├хмПP█оCV4Гp╤wh.dБжC@ъ yс╤╚<А2е+U╒2УнТ─нt2Щ╩┼░с▒Х168Ъє!Ї?АCYp╧▐и#Fw7x╚вRD"ЁЧ╟Н6IдТ╕Вd═fМ▌═ ╖Шг у··z№╔1·pы┼/ўх ╝n;█bЛ-╢╪Є█ цОT*┼5#|├Ж╟C▌qг┘┴ТЯЯ┐i╙&1MWVVтджжпdqР.┤*)Y╜z5╚ 37└Б6итGyФ0>eЄ┼mFFMe2Я_7╡·x╥Ї╣▌▐T&ййї@'H▓@B╛`y┘оЦЕйDLj(Vу<═O┬с05Юf0фжфd<┴╡ТиїН╚L╖╘З▒°NЄ▀МГ|У ╫zв▓_n6=▄щvя^jО╧╔╔ССd╞_╬(h(╩ыN╖ф&┘╞ЪА╟√o)?·Иoq60uс2°BR╨-Н·▀Т/&0 Rцы,Qkк-n╞с!╟ 7XСТтб╬#┼├@° p═1WЯгё∙╛ЬЯЙзwHс+D∙┌^╛ -yXщ№╗фp█┘[l▒┼Ц М4з╢└ ор*<оSр;SЫ├ALy╣╣╣-Z┤°Є╦/{ЇшБЗ╗Б[▓dI╓X\ZZ DвЭ;wFB|CCvяHГB Wи▒SТ-M╧╔ E├З╟щr{+k*=БIЦM ┘Т|nW}╕▐уr(wв╛╛╤5 Ч╞ПЛNвj:уu╗│АKз6Mn:T ▌ FjksB!▌д■ЬcЙ}┴─ЪBс Є ╝@r└8▀ЙD°6Л├J°eъ]q╚╠▄hЯ╧ЯМ╟=~Ябыр 4Чкktу╢м$Т ы0¤ъeu╖M══ьЬЪ│┘ЛGгНЮЯ┴.°6рЪ$МюЦТЗ`бы ЪO _$Ежу;i°RB ·░В╦б ╝нВбР┴ ╞эцап▀XEт[Ю∙Pо┤FkрЧ╥\}Ыж8╫╣))аЪH ─┼├Jч▀% Цv╢┼[l▒х▀.?c5т[x єцБ▒∙Zйц■▌╞-рр·їы|ЁA▓ї√я┐╟╘│l┘2КГ█╢mk╒к╒gЯ}ЖG{їъ┼ї:▄/a,╚O°&YQїh╜ьєP╟ЪJЬЬhЖЮHз№^&Эr(КЩ╤@=ЛД╦╩CнJС?}ШЫЙ+└Rжnд1#т┐║Az█╩▐6SIРЫИ;>]╙RъE╣щы√Т√/┴A┤;П▒ТC]°цb╚ю░╥бk√Шэ^q║▓-`-ЩPРЪоЙ╠зO,$╤═ЇВ╥aЦєН╩▒х╫tYБAо@АuЦEL#еж▌└#ц│░UНrr4|Э4зї<╠■т*4ю┌Ж∙║┬ю_кLГШ5лLХ┬?Ю╥88 Eс` єe и8( p╡ГЬ#╣nC├р╖╥ 6Цч╫╖│-╢╪bЛ- ▀фg>╦∙.L┬p╨чєaЖ┬l┬Чr,▄╦вEЛ Р╔d0}ї╒WШ┬VнZEq░╝╝╝░░ЁуП?╞|╨│gO╬`АЛ╒ | &U``n╨MТQЙйП[Н╫;▄.@боf@ЛЬч╠DRtyиE╒Й,Зb▓°rd═ QytС&бЦгQВtшuдя!jЪ }╞KЖiР┬Чv░щ┤КцхqA°цх=T┘╘u┘СmjТ╔║.qМ`{П%4Ч╠)6╕щ&═ьАnN°ЛbCvYЯ54╝ЙDTНRT&CN#Z/ ╩ЫZ&нЁРDAИ╓╒хфц2_єЁ√ э╞┘+ЙГA~Сы░∙|S╜ц>╨жрjИН╗С,BХ{щ┤;4-уp╡ГД¤8∙ж┬╘°t ╦a╢3a╗аЁЫ:р{рWдєoС├mg[l▒┼[■3R__╚ыШ/АgА?А▌ю▌╗єЄЄ╢m█Жя∙ц┤ё║я╜ўрП√▌[│fM*ХRф▐F>∙ф`_п^╜╕.Р;ця7т Q0-ТV1х?╪пя╪╣sИ" p╫дйSйЪPUЙ╙EYAqО╣gр╚ЗFС@p╨-7?·┬sYaS═╫-i ├мПЛ>?1(I·h:nЦ5%┴H%,Qа·HЎц~║л *э ╞[,╚7є╢=МTмЖ ЫЦЛ9№LKЧH#BБрв) .┐чёdВЎZ3;▓ЫKЮCdЫцh╤╒mй "э#Еjsнx╜РуQё]t╒йв\y┘eЛ_}їч▓9ЬsЛ*▀╬╒i№[хчъpЁЯMИH▓ЮHXжйр╦╔"ё╜{}-[Pїщaбp8 Е8rД┬oя╫н▒├Тяй"┤i¤V[7╗Эm▒┼[l∙ПHs┌A╛▄(р,W\\№┼_p└8фє<ф─gЯ}6■№э█╖у_°╒лWГCЎ9ЪA╕Дt{ўю═ўСp7╚Нд┬-╚t═╗(QЖл ю█wътЧИо▌|╒ХЛЮ{Жsи6wAuё─═Ч]▒ш╜%$Щ║э║kЯXЄ╫WСqРP▓dTA ╠▒тїa┬&l├2JWV╕JК(f╥В╟┼Нz U╕ЯL~?№Ё├QGuШйPЛз(HDТ2uag0ДkС▌╗ГееЙ╜{╜А┤[м▐дz;▌4h░ш├K>ло╕ C▓ю▌╛c■ь9Т VUT>>╡я╙ЗLвИш╡h$Т├"И\rсЕп┐ї╓╧es°¤╖k╫о╓н[є╜о▄Хў╧╒Б4Б┬&╓ФХ╜Ї╥K▀м¤z╬Ь9оv┬  k╟~~%%%Дэ9▄т|ХaЯ}№╟╠╖╒ ╩в№Ыф0┌┘[l▒┼Ц И4чwЩ·Ж3 kcы╓нэ█╖_╣r%╖;Єy<ЙDЦ.]:uъT╛ЭьgЪ&▐в8╕c╫NОГ╕╘гGщоОЖ(#|кфjк╬┬Я)їё█o╗g╠hтў═3юЄлп*8о7QS─х&▒СO>4ъЖЫ·8█╢{■Бпъsг╥│;Q╪&S>щ6N╜р╞p─bFNьйxj┴У{vэЎ*КаiВ$dd┴r:GOЭL [■ff+╬╛n DЎY┘LbКЇh▒#5DЫTЙ%p│g├u│сyбЙСВОIwэр-q┐BR<╡Ъо0ў▌╩╛b6н3оКO╢╔jH·Шiу╠TZe┤щ╕a├G<2Ж╕▌√Z&ЫЛ╕_ЄН=╔/щ:╜O?6e╥Ў-;rГARFM?·бQCЖ ёфхk╔Штё#;-ЪP~ЪЪH нhRC? +5-б N[╪И╓U▓┼╓ўU╓┬ТT4т╬ n■ц█а╫?lЁРЕЛг[-5%°▌їйD└хзїMы║ЪО┼9бАшёf█_`эo5ЎQC+╨ M7N▒╗сeF▐ЩС├ЖОЩ■8>?Итдc0w√┘Ц╧жi5`л@;СcХ┴nё\Ё#HХ▀|?э▒Gз,\а║ВвGde_ ├йq\эгIЦ╛ шЖ!+J═ю=∙Е-'Пz°■ЗУ:Зc╓▓&├h>им¤к┘0DpыС!CЗ▀?\@'ЩrW─gT╠ч╧┘gЕЖт4&b5╨:i$ws▀°9В+╒Ё)E√Ч╖ISЭи╨ЁJ*3b╚╨q╙з[Ц&8ш╟e"ЮЇ·─[l▒┼Ц▀NЪ3sя"бU m▐╝╣c╟ОЯ~·)ў x╚ч5M╦сЩQгFё СЯ■9ШАHqpK∙оV┼н>√ЇS║v░{e║t╧r8ZFU╙i░gЛ№К#'H╘ Й&Ж¤∙ДЙkWar°╟3[∙ R$ш├+D3IT{їХ╛■,q╚╧╝`╪[яoА8Щ▐╪бeТj╞ЧУЭ`╥Щ┤█свл E╣l╦рИ█╨' ЇрC#вn%╘║5&pSС~┐Гш$Т$╨Р╧Н%K┤Л1ўю▐╒ви5IжИаPWИ5╡Ba═@!С║p0/D f▀$ТJСМFЄCЖйJ(ХЕ9▐╩ь,w╢(bУоE2I╠Iл)Ч█C'╬tЖBg"A╝^f╝ж╩Q#Ч╨· F[╩O2├SЬ(2&R кё┤D5Э|╜ЭLDУЦ<зVu║Sх╤G^|┼Ш^$┴С╓)Э$^1i╒╙░V█_KЗ╣▄ й°w5т┘Твїa┘э3mBUм~ю┬∙▓ьpz\D%FuНlvз%'F╞-9LMИФnЕ4ё2Лd,ILК2Щ┴0I┐ФA;╫САе5,SR▄$╔╓'-╦v║yє┼Ч.Z№ ё╔к@╥Д* Б┤r2Н─W %6[ёйаo EСb╡Q ъднa1@L╒У▄АЦI( !ГQc"Mо,╜IeWNP6T)eСH№▐╦пШ■┴д>FrєikГfи 4gXzFFз╫╫уУЕ╚nВч=ЮМ╙L[ЩMfЇШНР╓Й!Уz│ yч╬Y╗<- с╩квЦ┼─Фў!#зЎ} ZM┌\tIU╥F]#бк [чZў%Ч═|ўzCЭ▓.Йd,╟эе╘о┤OЭ^╛BФЎ;ЬD│·Яu┴Ь╫▐жk11]┴@╞й└ИЙk╠п╕Sb+D ╢╫╥t]┴Cёё{щї·AFЇ┴ЦвA╥-ХRЁ;E╓hU$ПС?]ЙыФj┌+;HmКЄлЛ}dЧЇ▓%б:jФ╝ыВ╦f╜┐─T#bAР1еHS√єм-╢╪bЛ- Ii #┬`0r█╣sg█╢mЧ-[цt:yФ▌H$╥зOЯ7▐x╖║uы╢g╧юТц¤ў▀Я4iўт▓b┼ A▓╞т═{v╡*j╡z5┼┴^▌{Аodf,VУ╘ Zi)Нпнг╗3ъ№╤г█╫E╛·№у╢=┼ф╚W[Пь▄u│Ш|p╞4тєM╕нЛ░ЦипKХx┬╒Хэ╙ТтЁ╟J█▄№└╛╥VT╡├Ьеe2Ъцt╗$AФ╤2MQh╪Sвйw ∙дЩo┐IB■X4ь/h*┌UW1w╥дcИ√·AГ╟▌q{0?7QЯ║▐\ЁjЖЪкй фчуї ў22*╥l█╛▌┼Ч_6s■▄√~Иx╪4ЬVgПЫ░х╟ЯО<т╚;FПгоцУNЗ╚3R ╪╨СF}|╚ьydчЎЩ/>ЫDк┌#у╟)Ш; єсыпo█▓Ё╞Hq╦ЗяР╥╒#┌w╝}╪0ZрHиўш╚╡С░?6e<С┼:Н№╣2BH]¤ф√югт╘ШрwП ╚╘йУЗМ{╫╣tjY\╖uwЧ=7F┬e▒·гО9zрДq╔┌OaA:ЩP╝ФпШhдP[0y╥хЧ]Ц█онЪ╙й╫V .х╞╛╖=ў╥ЛАТL]XLi ч╠█╡is(X0d╓\"QG:Gv╠√[%Х╛хщЩ├я╕e┬┬'IB¤╟и╔ЧПSfF<┴Bл6:k─иЎn╫ wї{ьЙY╗jк]▓c┬╠9АW+rs@^j8цn=яв'▀~]#I▌що%ЪУ(∙─!hdЄ]Г╨╗9┴`▀1q -%q B[+ыъgМЫи╫Fъу╤.' ёЄw {р■▒S&╩а@`и%П╜нЯЪLu<жєЖ]█&>╜ /iЩY╖▐Yмx6¤┤╡╕m█┤('ЙРРДЗжOKj)OnN2ї8$щ┤!C№КR[╢w°Ьg╠Hн┌╢ЇчSi┤║x▓цс▒cI═╒ЖO}bт W√шяQb·Им'2NWрP8hА╝ыvэzl╥фVyy;~°1?<¤ёqў ё─B=СЪ=z┤й▀№╒┌^]╗╗B┴]СiС▀фpW(ЇЗbУ><2 ╟ОMр#╔)n▄╣u┴т┼йp─╚Э0`ИVMWDК╣┼┼%)╦┌йyш∙Е{ы* КЛи.╡6"╬I#GT─"бЬЬQПLвc╒зАГo8єВNэ┌?8k╞и╗я=m&Pr╩¤З`ЬЗrЁaFgфэ}¤nO,Г^F╒dТJ╞Ь▀─бt╬8/r ¤Гoў┤╚5┬ё1│fЯ┐╗Qў .V|╡▀■T▄╢їоАU/ТnMЪ·q√0  ■SgЛ-╢╪bKєr╕8╚╜DЯw▐yкк╢k╫ю╔'Я▄╕qcзNЭu?ЗГ\;°щA8(│R0LH═GГ╣)п╛c╗\Y9o╠╚>ct√ГГ/╣qъ3/Р6жS┬+R╞ wМ|яШW==■║█X°ё°I█╢lв╡ ]╡$Qr(UЙP═ГбkIбЪ !UiўЯu╓ф╖_'nG*vчЙВ╣ї╗oж▌z╫ёЭП╣q╘╜жZцП|`─ШW^аF:Гjn╞ ║ч║┐▌р-QилоYЄЎ;_~·┘ KЧ╙╓╥ї▒ў▐s∙╡WЧ┤kУNйєз╧1y2ц:)@╜сPХO$9ф·єsB╗}№∙ч$Вщrwьz 5·┼Й ?╠Ш8┴ЧЯч°о╜хQсO▀}фЯОз█лч╠!Гяxпйк&1╞M? │птLжTкTОЩpу5╫╨▌╛n1ПN~|ZUM╒вчЯ'{├ДH#п∙█#c' G┤╒йЛE[▌ЩЯ"кщФтqЫфP┌A4TMэаЫ·<·т│TMШуKFъ<╣╣f2∙▌Чk{ЮЇgN╒╧LЩr┼W$Т╔ВВЦєg=ё╖~}▌э[Ъ▒zq{эГ7▄а┤+>ёС▒у╟∙╟¤7ЎЇЙ'╛8┐╓╘ЄЙ/╢сз╤╖▐~dзЎ7О\ХМыimщ╦n╣ёй╕еожeпЗъР єж╙╧~j┘√─A╟JТ┬╡ид╙Кр* Ї╦|╬ЁxЇеИ▀Ею%)П╗Ь0х╘БГя║∙╒вI{ыk╟>>═p╔╙g╬P▄^Рт╕√ЖН<Фшжеыa=5c╤ВЗч╧"▒xr├&Пf<Ї╤YstAКЫV░╕Шю:·щзL,}┬▌о║р№ЎнJ╤к╙'<~яв∙a1ъq{ЭItЛ9l°=ў▄7╚з ╛ШЎ╩╪Щ╦w▄ї╩wъ9чЗsЎа┴▀m▀╢`┘RтuW}√mЮ П2lфЁaЪ(: [ЦeR%=║&u▌н(f<&й┌М#n┐■┴2ўbn╬Д╔ЖO Zєэ╞|зo╘└сгGПекGП[u+О╢E$рV╡МC╒╨Ь3 ╗{р=IФl╠zdЄ¤єч`QT▌╣ў▐;√╦>▀°GF?1uf╕╢nЁ├ОЯ6∙С╣sйС╨э╩╖_~┼В┘s├5╡бттqгё╚├диИ?екя~Шz} ю▌║^7eDY╕║╘5tшшWЮFЦн█JСi}?4g╞▐\R'hэr[:Э^╩%вНГ╢╪bЛ-┐Щ№ №ы_ ЪL&╣o╡.]║╠Я??ХJё@┴┐МГВ╣╧XLcцЪ╘3m2O─тнККУЙД╟ u╡─GЯy╩иw_%y∙ПЬ~щC╧╜@ZхRлPTпM║Є╥б xКx\гП?m╘ЫяQи╧O▄t╔W:Х0E┴эёиЖОRйjFMжВ9┴мiОYfя;ї╘io№ГNЎtКпл╡|┐█}kПуЯ№╟?ИеТвЦ@└kN■єKk>EI49юО;ю~┐яШN╘Жh╥%bС6DЗX╥Жьйxf╬Ь>ГТ╣Їоnк[+,\x╫╪С─уд?kєОю8~·у╘oNП.DK║3╫вfM╠╓imЁ╣gOЭ3gO]mqя^╘░K | ╕·ЕП=v═WzZР▄жъ╪ў▀/xх┼'(2Є╖[Fъщ╪С╘USc║[┌╗э'п╧чEтШe5s└Iз═X∙1ЙFH▌1гЕkХВ|к=═дDEVd'3■яПГ║ЙЄ▄r╞) ?YО ~oeYЛ╥Тd<цsы╠fШHO>№║>+ь┘Э¤-э\є▌ТхKo9XL%ЙщЭyї╒wOG┌Ч▄u╔┼│ж╧&∙н╝цЪ^Z┼║Д,8╟\p╤╚iУH╟╓D╧Р@░f├жчЯ{ё▐Й-=#8$кh Gя║№ЪYЛ_"!/║|пЪЄ║Ebijл5H▀│╬Ъ┐№Cj¤L┼м┤zу-уxHn]J█\MЯ+Q]С░ЇP(д╨хА йОoЙ╞iуKдяyч╬√5┌G║N┬СС¤юєЄ+дb/бЮ,%f╜5h ]╩дБў▐z═5y]║QK┤!Рpb┬дёў╠ЫШ╩$єЬ┴▒}√ї1$┐C[шо╫╔Ц╩Й├Ж [■K#х{CЕE`ЭFG3ь┐╠@lZ$Щ╝∙╥KЮx|жTR╩ йQ▓зТфхРэи╡yi┌ ={?ў∙ЧtВ╧CъS╔вс|RNY&ЪЮ┘Їг│e!Q\джЪ┤╠┐■Ї?? ┘j№и]v▌}╞╣3▀ZB╖RХэдi:╠&jFЎV/ЬЄ╪▀.╜Ri┘ТZЇ∙╫▀?є┬є7?4X(( Uс1ў 6·!еM╗╬┐d№ь╣дM╔А╦/Яё─В┴УJN~`─¤SжТDТx¤$Оэ)_╛ъуЛя╕Эh)║,б:z▀╔чM{єїt@sсw╡n<■Дз╫оа╞}┤Oet■5¤·.~)iTxZС ЖэТНГ╢╪bЛ-┐Щ.Ўщ╙Р╖m█6RDXZZ·Ї╙O В▒°РkiД AК╟у∙╣╣щtZM╙@┤ОяX╖aўП?v:ўФ▓=╥ЮdЫ#О╪ФЙ▄ ЇУ─▓жў╜3з6YS╣зэ╔=kЎV─┐▀rt╧^5нKо6XЄyїLZvSMМaЩ уИЪJ╣]n=ЮФ▌+Юe°9чLxуuкїq(t6AeЪ`ШN>s╞;я┼"╡u$╖х─╛¤Ж-ШGУЭwЭ{╬мЧT┤p ▌<╝U╒Т`ъюs╬Щ∙ъb:СKl╣Хш╣щ╝єЮ·°C№.▀*,┼¤╦ЕУ▐zЛdR─нпЛ┌╡▌╬TM─-9ATO?э▒Q¤КЦ!ШщЭ.╢▄M╛с╘SПj█о Ї:Эхe╗╨+╗"с9╦?п$+кo┐юЖч▀z╨@ўоКЙG3ЦъЇ║йL╜Й╠Ё+оЩЁ┌t║°TСжFг╠┘▓╚=3Ъ|╚┌┴Фz█Щg>▒r)]ЩЧIИnзЮQЭ.ж╖ЛеИ╙=тo}╞-zТ┘х┘ЦU╝■╠3Ю_╜ФjRлSw■ёO│╫I"╒ў▐~█ЇЕ╧gияз╬∙Ї})"ЙDSу■r■И╝LBn╢хV$ёфеgЮ¤╚ В╠RСЭгп╕v╘3O┘$n─жщ]╙ЖJэо$╛└=W^∙°{яР·:RРK=GВо\ЮыN?ыЕўЧRL╘У/э Z#г╔Aкъж▐?ddыv█╖o╢╚_╗■╗Щ+Ц╤Еqйq:n=яВ'_yНBаa╢╪╬MХa@Ў╜╒7]}хY:>╝kWОдаS┬к∙╧КЭOн∙Аъ╥v╫ї╜Ў┌∙o Э~УаxрЫ┌Ї#╫_7°Х╣Ю6нИ&R░SVЫьlм4╠╠╓-п?√B║жNпOф{}U;╦·■¤%т░H└m╒╘║∙H┐;z·)·0:╤щT╙ G PS]Н_НQQ■Ё└√zФ╢Kюи╚╧ %ыы-Ы&р;┐ъ▄|R^qєU╫.·шУь╓%0(FИ╧йкц°o;щФг█СЫЫK№оЄ▌e▐┤YQW3q┘█┤ИrUЧnп|¤%с═]{-··;Й▐z¤uO.[JЗМо▌s╒╒╖√И╓mMUг╦GrCo╛√╬k▀~═V[WGЭ|▐шeР<ТолuIy3n╜m└╙3,Е?║c╩Йч ┴Пх╚@┌H╣т&Q▄┤П■Mёm▒┼[l∙r╕8╕f═Ъвв"З├Бu&yyy╕╦ГС6ЛГ█╩v╡j╒ъ╙Г╢Т╕4~ЖCЦй√1ъ ═б╕▄eЯYТ╘ЯЪ<ёЪсў8▌■o0n╓▄░Р ╫┼ ∙MИ╕t╧Рic▄EУо║iшЬyв^t\o╢э╤─фл╘ЩЩnшIж~Х5MKжЭ>?[;и▀}╥I3Ч~H╫ыЕЗГвЙnМ<я╥1│gС№:}юНї╗■·y+ЦS-QF╗яК╦з╜Ё╤╙$H╡tVUНPРO╥l╛%Ў9хфg>YE╫╦╙Щ8Пш╥НgЭ¤ЇТ╫щЖ БmX╟√¤хпє^}Э*∙"└& √9"XP3HRyсEc^yС*ж╞x pC}e╫EЗ▌}╧└╛¤Zю┌░бuўюT╗щIqK╙щ%╟Ч]5ў┼ЧH]ШфЙЪаК.Щ-M 2ЄэєзУЯ∙°c╩X~?*лкЇ▒}╔$ХN╣\▐Cс ▌4шК╦╞=:═▌2ПюHEВiХ╕┌▐░ВЄk╓_Оэ╜фє/Ч5IтЁї╗рВYЛЯжж▐$сE╝ў*рc└┼╧x∙яDЁ ╛шВйл▐╖LKИdИ├3ї╠┐ ~∙DЫ'й~4'0ё▐√Ж=:╒╨2╩ЩLтш{▄ єW}JdГvУS4 #YQу+(в╚eС■чЬ;ч├ў│№!╥ш╝А╘■Ч^>ЗfgQ 2┌!Эа|щtPЦJe^Ь>√┌є.бJ╙=U$РCТЙ┴ГN] д╙ИK└ЯCю╕k╩┤╟И/HЯЙ╟щ3с0▌$Q{▀а7▐ЁhRкIўг┤jЩ╔СЬAъ{ъО╛VSDrУШJL╫ГЧ\<Ўу╖"сЪа╙G|~K╒Ф▓8╚t╠шzU╙~°IVuAtP5╚s╧,╝сЙ╟ё Ё┴Р╬▄|·╘б·┼э6УI1/╧┤,ъ█╟0чП╙ў·┐щe{dGИь)'ено┐ттч┐ '▌Ё У`юЭ\2√╣чшH05:Ё▀▓@ьн╙ оA╖ўўo█╝й}ў$Юб∙ЎEдоЖф┤xЇж[-\АС?Єьє╟╝¤.СфIw:.йн%∙y7Эy╓SЛ%"їйX<┐m╗Tї^w(H┌ФPu^Рeъ_о╝`9"ПОЬнс√о╛j┌gKЙ╙"║HjbO]{╫MПO!Gф╨еКU кпu)НОвl▒┼[l∙╧╦ст П)xєz╜ХХХ%%%А┐║║:Я╧ўs8╕}ў>ь╒Гт w4гж3AСЬ┴4р i╪эл╫уїO╠Yp╟╚fe╡╪2Я6T:■╨├ПxhД3'Фкй^8{┴їW\lw$|ьэw >╪╙╣-de¤ДЫo■─L╥2рхЧ?ЎЄbI ╝сoП}ЇОЦJ*╬Йkc■|FзОэп\4Ч┌y▄╜ў▄z[┐ЦG┤гц{ЁЦnС┤∙Ё%W<№Є+t╧,╒жф╒MЖctЭhZ╜┐OЯ╔єцЯЫ║C╫нH}&СЬ2f№╚Щ3I▓ЮДиЦЩИ=°Ёиёc╞▌╝т╠┐№¤└╜Г╗в|ъ╛A{ЎVНШ6Щ┤F_╟╤ц╖_}═В┼ ╚юО┼'NЮ2l№xПп/╡eыдЗF>№°,░,э·d·╔∙3 6ЇIС$┴╣ўыпЯzэХбуFУ·4q·Ю0dgU╒ГO╧С є)[[Тх╘ьfїFэ ╟A}╞ :Вj" ╢k^я<я▄┘_~R^W╒*7°5ш╢█┼woСФ╗юш?ы╔ь╖?√ф>\│Жи╡P╦ЄТ╔W~єхд╖_ег(Э$┴╝+N;эя}╠\ с∙шШ)ЗОсЁ┘cдкjЎ#юЬ1═Л╩ш'▐╘g╪│ шКЛД~╙╔з<╡j%СХй╫Ў4Т.█ў√(jVl√╢∙sч╒╒G^ЧJ╠`AшВЛ.ь▄╜╒#*JїЖMO<ёДшvзTMRФ .╜╕чzS=_:н╨╕,YУ19 цїDr█║Н/?√|О█K¤П{▌╒ёh┐┴ўЦvl┌vJr╒╢]Л=Ыммї{╝w@ЄC─я$uuOОЮ╕u╙ж[Ь■ш'Эt╓iз▀>rь зЭ┌щЇЬ2┼кй\╛▒зЭєрcП╬X8л╓╥ЄZ^r┼е▌z▓╜╪┬=w▐Щ'╣J\■5я|╪╗g1шн6R├зM|nг>ёш°Йf"md┤їы╫ с╪▐Ц"Е▒q {╜P7╥х╟O╚═U╒UЛЗ;р╜т╩л:vяFLбj▌·чц-Ї;Ь▒ЪHn0чкkо5цсЎЭПъ?i╗и└ЧS╜│ьС╟]u╔%▌/8єБ уйеX╙-ПГGЕk0sOУ╘^|¤╣чЎшttЮ╧W▒cGQ^╛ЪH▀2dа┌╢Х╚qаt-·уППMЪт ТЪi║<7Ў╜г¤╤G2п/flч╬┘S&ИрK5Щ║ёю;·▀?иєЯ■0-╘3ПШииЬ0n╝Цб:|Ми~wЎ/ь╘СЕБVй ╬к┌╔&hN╔яєщ╒╤AО [i╡╡s╟N.█╢#┐uл√зL╜∙─SO9щф>у╟▀sїХ┼Е╬ЮE2iМл╪╢ ц═╙SS7Кr▀░б$/DЧ@Hd№╜Гk╫o+,*Є╠\╘vт-wm█╢нeЧОcf=╬╝█Рфg▀<єтєХn3#ZGцЯz╞ЩэёcСl┤┼[l∙═фpq№чv╗yЇ∙x<юёxx╪║_╪J▓│ ЎhВГ<'║бвIР:▄ш{┌9є▀}Лц-Ч]╛ЁхWй3Й╟H2uўх╫╠|эUвР╛_4 ┘шPЧ╙R▓╙╔Б╨Hv=ЬЮJ'ъc(┤ЩМ(J*УмЧ_n^^n@3в╞cu╒▐Ъhn(HЄ№$г╞+ъТ]╔╦ў╡╠S▄bшF$оEтF"eh║!UZv>Т√┌5-ШвЖc:ЮIеєОьLН╚┴щ1-7kъНh╙зшu бАФыЧ\nBde├м_╖A2ММLtЧ├ x┐╫аn █╪С╠h{kbu╡Тi╥Ш╘а,╩┘M*╔t:FыХTУВCv√╜б╝\╔═вЖnEcА╣ъp─щvy0э√¤ЇЯzЕ╞v┌&╢X+ъ:Й╞╒h\KдшвСh▓P∙}╙Кз╒H mТIеrПюH╒Bш#Фв╝JOз!┐ЬЫ┘│'O▌5S^╢+Y▀сШгЇhJqюэ}┬ЇХ+*7~%Д╥║YzLWf▓ы╙▒x}LлЙ║Тjое(вШР┤╤ZїъF╫╟╙їq=Сe│Є ║`╣¤>╘W╠╓╫4ыcйdOъ║jJТ█я хPНЧIЭT╟╢юМE┬Кифбэуё(┴hСG}ь║═(VО╘E-"ффхчрз#╗ъ╬0└╟щh ТIщК╟,-!ЗeъВ╞╝@k╤=FZ-╩═WLG2Mxф`Qб"╣╠┤*z√y№ц-Мю╦dк╦╦Сzп╙!YDM%Г■а )√¤╘Г%pP╙H"n╨qЫМet~Б├p№▄ё9I╓gкўfвїMpхчЧЛGuз**D╔╡4їИйоН╓Жё╦Ж|yyДGД├W]aЩ№U─ш▌R.╔╧#9Оd<жV╓ ╒щp╚ UMд\нКмtшчЄyщf·/G╝╛жуЩ·Гt║\x7@▌\cиGлkеz5ФЫGЧ╥кщ┌кj|дyC9!<уp▒b╙|+ca№И B╣^ФЬ ╖q╨[l▒х7УцpTVWW╫вE p▐║uы6l╪PUUfуfтT*┼}т╪Ё∙|<3c╞ \Ьl┘▓e█╢m▀}ў▌су vм■╝эzE╪Ї∙ЧЭП¤Э?eС·╣ХeL'?~▓║╙ 'А├6о^uЇOдv4зdIЗ└AC7╜И┘╚Q7ш:*C#║жJврr+"╡╠жиQ7сПз(:8йоИ╘k╘jщї╖├▓ ┴╨┘╛ZЭВJ,╔<(Е%#9Х╨80p╫I=*;HЖmpр)PsRе°' ─еdQee─Ы.Н!RL┤KFtE║╡й&[zhT█ЗgЕzЬ╢ZА}qM,Ъ5▌ьнI└b┼╔ц√╓}ЯЩ╝%кБуQьLцZv4iн╞╘XvMы+▓·╩ьО╝╛█xлZ╘4I▌ЄY┤Aї)┌╚Е8В┌тїж╟%y▄┤Э╩л&▐qяЁ╟жС╥═дfзшдя0Mr╓▀рБc╙lLЗ░°$Н▌И╝ёБ"sЖу▒ьx]hЛYKqCчQbSpht М@7:│!Лa┬Фл<Z<┼bzM·a#fXyЬLщЬвнПZ╬и@3 ░P├*ы< #MCaп▓╗zЎG─┤ПЖE╒е Г шYЬE _Ui╨6╓QL ├Ы░M╓ж[cуBў_чkЛ-╢╪b╦o ═с P╫ї6m┌р|¤·їеееUUUбP(wш╨с√я┐/,,─38тWpD°╒W_Эp┬ @;п╫╗vэ┌t:╜tщ╥_ГГt■Jk_|&СL2щt3╖╠ви╤шj▐мс ╚Ф╬HgssI СЖйЧщXи╥│'UM1хKВ▓В╨u║┌Й┴ЙpgHM¤_`Є╥Д,╤q8tF@НVhС*]иСЩ▐f,f8HзJ▓`"7+SэpPf█p╤b╦┘QцШ6ЩгfЦиh▓й╘дqTш4М ╤=░Н8(X┘}┬ -╙╚Y╩i┴ЫTГЁЭн═р ╔Z┴J║└й,ырПNЁНї▓їхУ=╖КRпОмЙ╡=Сh<'╟'0┬└эpmНЛюЁЁ!QU2─rъЁЖ2ВD}6SынNїZTC)[)Un╣м╞"╤¤╪Н╢ём)ЦV╥░IРИ╤`└Р%█aьН╡ [DjЦиP╡$·PO ж,) ╖ЭЫ$kЪз╝iXTw╔бОб7√┐┼ШLhjПжj╚lYtfAWMЇмбmк уЙ^P5cЮнзk\s`щЪеИnлomL▓┤Х5ю╙q─╫:b°▓·Є╟щB╓ж╚╔╓6d│nЁqcй]5лHКУ┘}uV~┤9uK)╥╠<║.YВе╚lДяkMгyеQb╖╚wIgн┘tэ%╟x║г┴~nQa┌kТ╥TС╒Wф0▌Ёщ╨ФШm▒┼[l∙╧╦╧l%бfHъПШN╖n▌┌еKР_QQ╤Ц-[О9цШ▌╗w╖h╤GЬуJII╔Ўэ█{Їшё╧■є°▐]▓dЙa°є@ф╞bA┌ЗГL]╒dэ [pUW╬ ЕЕ63ХJ∙▄lязa$R)П▀ЧQ3▓!╩N%ЮH╗=xеЩ╔дq╪дjъ3║G`Ў6╔Aмм▓"╔ЎTx╘ ░EgK╣dp pP6LЩД╧ЎLп╞fgтўM╖4S┬DM*─I╥┼AЭ*лМА┼&▐dЖкC╤вЖbъ;;╗Ъ*]e┼J%Кt&═N▒i╢╔А╧ф5РsЇP4╡54ЛEН╤E╔N╚&▌нc1k/█вРРи╡Х┘╩йI517┤O yE^╛HС└Х}ї%,╪┤hRГ┤тT(ЩT+еKLщ├ ▐hуH} (oЩЖФуVx.щЪ╜оА/эrеИю'ЩWC`√5кT╦ЎРЪY╜╞>n╨йЪ╒d 9MEbЬе3╗ж Y K f╨7°╩Kбйo▀R7▒С╒X.їшСnлqp/0╠НK#їf█Gчл╣yXEXleЖ  ·DЎГ%З#ЦЕс╠R5i ?\{└╩BЮJS╜#╛LГоЗ4DЙэ жЯBУ╘╢л3║в%Р╕&▒qф:mZ:H╠}*d$гSВtJ▓dИ L═~"I╔ЦFLПf"a0)╒√йД+}i├J┘▒бє╧ЛЪАўНa╓}Ж└╕Z╘═<j* Ё ILк,╔оЫ╕╘°оdп┤┼[l∙-е94╪╥иу▒п╛· ┤W[[[XXЙDpф№WWWЗ#╬qе▓▓2///ЭNчццr+є7▀|#I╥[o╜їkpPч┌ъэ─`AlЙбкЕ!Ы@2ЖОIEвЫqMС∙Ч1з■0iШЇ∙#▄X,i*]"&╩Н8и▓┤[ё┼f&╔Р▓бH╥L#Fзтж4─юл 5OдQ_G#╖QхЩJT┼▓|fQ╓@╓Дd╫щ К:лaс?i▄,╥t1;;ЩжКур>╛a3tVГ╒а3╪zBY0Е}хцН.6┘Мq жI╢╛rc█qk░V_Щ#H├╗№1Гя^╡Ё%A√TfДЗ МzM I╩+J<UВ!╒╥<В"5XDў├A╓ЖTkkъS╬Z(E▓_Ё_fш▀з cї╨8╣6*5╞Ж┴╢i4ЇЯg┴WиYPУa ╦т╣X╦╩nRn╠FўН!VG═4ЗШ═ЭsМeЪкj)Ї√Б┌■-├I77d-7ГГ,x▒йщ" ╤fъьдq5^V╖┘╪├bcфEЛщnYбш╓q┴LзNa╣Qwj╤o 6HLНХЮy▓цЎhf▄Gwт ╜В45║%(├╕╓╔Нь";ъLщ'юS■q╖┬нь╔ъ·┌Кў▀=╠лLїЛVЦ∙Щ║e2 IР▒ёон┤┼[l∙ е9╔еR)&ЇX,╢g╧а!XW@~m┌┤∙щзЯ:uъД#╬+**┌╢m[^^.╦▓ккGu╫z<ЮХ+W■КЭ┼Т╒dvhв╪hЎ╩╛B:шХFЎM▒ +▌ЎMc кKl|z┐їy√'╘иОz└j╕ЫЭ}н╞в7р╫AйX▄жuiв▄Тzp_╓~7U эўhS▄_м¤│Йжj?░=*7Ц▄: ╟¤+q▓7BЫ`5IT M*√М╘д Цї└·яW■Г▀8Ё▌&╦[╡┘OЛжХiмя╥─T█4K8рйf╩ЁVГM║ ▓Ї*_I┘Lj ╜&xЩпGфА╔░#_└wЙ╔ЪY&6Єmh[╥$5бiQ5РЪЦj?О?xT╪8hЛ-╢╪Є█╔╧ь,ЮqЗВр<Ш┤П╟┴uы╫пя▌╗ў┌╡kq─9ор:ютa░\ы╓нё·G}Ду╟№kpЁ?Ps[l▒┼[l▒┼[╚╧ю,v2Iз╙ккn█╢н]╗v╡╡╡─Э;wvщ╥х╟ь╨бО8╟\╟▌Ўэ█я╪▒гk╫оHсГ>p╣\АBm▒┼[l▒┼[~┐╥В╓4Mуk╫п_▀жMЫ-[╢╒╘╘А╫н[Єлмм─ч╕ВыЕЕЕЬ¤~┐,╦Я|Є R└╤╞A[l▒┼[l▒┼Ц▀п4ЗГ 9P_Aшp8╛°тЛcП=v√Ўэ?¤ЇS╖n▌╩╩╩В┴ О8╟\╟]<│vэ┌?■ёПHa╔Т%>Яo┘▓e6┌bЛ-╢╪bЛ-╢№~е9ЫйкЪЧЧЗєя┐ ╛c╟О8ЦЦЦr_╙ы╓н+))ЙD"8тWpч6lш╘йУ█эAо^╜)╪km▒┼[l▒┼[~╫╥Вф|>и.ЭNГ▄╛¤Ў█.]║ь▐╜╗аа`╦Ц-▌║u█╢m╖уWpw╗vэ :<Ў╪c [;шїz│nиm┤┼[l▒┼[l∙}╩╧l%бё╡Г[╖n Г999ЙDвMЫ6ы╫пя╘й(G╛▓╫Б@UUUnnnЛ-@tлVнB"+Vм░q╨[l▒┼[l▒хў+═саоыЗГ;Ъ З├|Oq*ХЄ√¤ххх]║tс^fp─9орz2Щтс╬Э;#Ех╦Ч#{эа-╢╪bЛ-╢╪b╦яZЪ├AОg└;╙4╦╩╩°RBYЦAДЕЕЕ?■°c╖n▌╓н[З#╬q╫AqАHyду+Vр-[;hЛ-╢╪bЛ-╢╪Є╗ЦЯ╤║▌n░Щ╩dы╓нА╝ЪЪЯ╧WQQ╤╛}{єєє╧q╜║║║]╗v█╖oя▐╜;R°Ё├].╫Єх╦m┤┼[l▒┼[l∙¤╩╧D%цццтd├Ж `┴═Ы7Ж├ap▌ю▌╗y`bqО+╕╬cs┐Гр║UлViЪfя,╢┼[l▒┼[l∙]╦╧°ъ╧Т╔dS┐Г─ЄЄЄттb╙4уё8О8╟\?└яр√я┐яїzэ╡Г╢╪bЛ-╢╪bЛ-┐k∙W№r╧Вы╫п/))с┌┴={Ўч└Л8тЬk╣▀┴гО:╩эvГыVп^Э╔dьи$╢╪bЛ-╢╪bЛ-┐k∙эа╫ыu8йTК√ь┌╡kYY╫ЦЦЦ╞уq<Ж#╬╣vpўю▌▌║u√■√я{ўюMlэа-╢╪bЛ-╢╪b╦Е№╠┌A╙4Г┴ N6o▐ ЕкккrrrТ╔dQQ╤╢m█x№т╞s\╟]<УЯЯ_PPв√°уПС┬╩Х+6▄▒ZЎ"╨л:!21z*░'Ъm▒х жX═\¤Фp╚╖ДГЮ9ЁЕfr№ ·мГs<д4Ф╨■╣█bЛ-╢№{е94 ├сpx<]╫├сp]]] Hз╙╕RYY┘йS'юeGЬу оу.ЮЙFг╕ВЦ-[║√шгПEЖГ A4EI)ВС╩$NЗ@RД8ЙЪKoиД°╪╠ ЪDM╦LеRx]Цe┬╘ЫHэgj^VVVRR╥ЇITG╝ОЮИккh~ЁвТ╕X[[ЫЧЧ╘х╛╤Ви6оg2ф╬+┬_┴┼={Ўу$Йp╕& ┤Q}ЬаY∙nЮу!є┼ЯиЧ█эцoёsфЕ\p7П√|╛╞▓A╧∙IcЪНЩв№╚пг├d&чЛЗ].О╚┘% п╫╦л╞лПёБКу+Б╫·╟Тт%чeрm╬фw╤>╝)ЪО▄П╩╞k╟пр╡@Qq┬ ╔k!1с╖xOб5x√єОhмrг▓Q;┐▀▀┤╚eцяЄ[Аз╔ ─oгeрйёЪЄч∙(E;ЁА?M;· ▒ў`VUW█√╓╣w ├PдГ MЄi4ЖXгiиQQAP)"╥З. и°! ╜7PDк5j>Ур/Ъh4еЖ^з▀~ ўЬwюrs ┐% |g╔s=s╬>{п╜vYяY{п╡їn~Ё:s&oмrII YТ╖T$ ╬Ё╖qЭСс+.Ўф2шў╣╝ЮP0ш4╗w89tЇHГ· в*ъP╢Jь +┤■▓!П░═с8]ZЬУН╫гОи2юЖ"`л$ф╧6 ┼KEIй7;у Рs╪ь]Ў┤и┴Ы'├CбХХUdey+*╨С2 gIIYNNЦY▀И╙iя╩о╩+╩│2BJд{q╚/о\ш~╝ИdвКР-uюАaV0j╕т┴В*ЖMХ9╔2s\Ч╞╢m█┌╢mЫк\ц╔fц|═щX P(gєTNФБR*!#Д╬й(.bтЇ░пPy░ЇгGП╓лWYБa┤ ┼л╫E0тО;.╝ЁBйr╦Ц-СFt*ЩръХк}б3ЁEя▌╗= ░Я@Юи>╙ю─MИ =A5ЕFRШx X|KaШ╣Lbzй▓┼╗Р ╗Ц2u┐Ї:Ў+db/|9)[д╝▄юt(К ╦ЬЗ▄№(║N▌║DА└RзOЭ╠═йс░█mB╤╩"├└7їЕГ.З IKЛКjx2├еNАKз:]\Ф[#ўЛ╨═╝ЩЧ;ьў;XЦ-▐▓И┴i3Ъ>ШСёНGЁ_мНП√╘йвЪy╣р* x]n┌LЗ╦} EJJь5rА■Ф╦и╬▒S'НяЯ╥╥┌y╡t▄s.a"╜И:r&а╘I>ДT Q▒∙pЕr▄╔ў [ўю▌-Z┤PШРж<ў~Е_y]p??ТЎ7~С▓,}№ъ├╕ГR8{д┐·╪┴м╪╕qcЦ┬yCЩгШВT3кТъ!%F4к# т ;e+5U▒/в░╤Яg9░!╙Е█д─ёЛdФ чIЩ-ї/X╘бjМС√m╒╫"Лк U5ю F ц+МD()№тwp █Л;hsиРКЦл╤П,Ь<│o╪e,;вЖ*│┘№┴cЧ├Лы┘У66ouAy░d╧┴нm/or∙/.m╪░!>аС│■ЪФP%Мv╘Ё╛√ю[╣rе╚Кsэ:╚чБxцЩg°╙7жЪ@Х6▒8pU╗Ў┌kQ∙+Vи3┐5qБWщ8+)s^cMХ9г!C╬YI╦ХIКьqъDрЗ┘╩w│▒&'zZ8Б^yхХ?·╤Пц╠Щг╦'U╣,N7рШ├rы┌╡ы║uы╥OЧ,7b╪*-1вГ4#V*╒┐jКd┤QGL"2Ц<йwеi(p┤5jБWи!РхтжаOжO┌╛╠Y╖·шV^IFYщfц╗я╛{╒кU╕Г√пx]ьйn°б╪i"┬}ЁL5╔зHП╖Р!╛" иY│fб╣е╤┴└;|█ ▐╘б├_▀y%▐╪бю╦╦]^O1zWэZf▓╚gЯ}vфш╤▀¤юwХЬC╢И0 ╚nрH├№ЖСчrшD╢|№ПЧч─б#эuГ╩p°~П█4JX╓E√=8В╝!lЗa-ЛЪ6HCh;рRYiiн,жЕ╒││ ╨u33С╨f╖ЧЦФd╫╚ЙC▄h│Р╧¤╛єЛ/w╜у╫╖▀■пП>*-/╗ъ╞_ЩЛъш▒гг╞М>y·Ї ╠Ш6bdЯ╤XRbgУ/ХМ У:Ы┤MV┤и1кЙЖ44Aс3п~¤·z╧чЪ*ї+▌ ╠▀8╠Ъ╪▀RН_Ї: ╛╦IYбRй╞/e(&Ў╬Э;пY│})9WєSY╦ЙДзї°ЩGЖrСPК, $ёЩ,M'Ь2&┐ф в@u°╒JгП2NїВ┐Х·ZdQuвк╞д┬Е╢┬мr°Ёa№тwxZ╔╖wp0и'╘О=х gf╒UnП ·ФЧ?мьUоЮЮЇ┼Эw ш└Си╦csdWй=?║м%БЛn3K?уC5bэ╨бЧ~°БО8╤▄|є═ШAn┐¤v▄─b ╠╫Ш2и╕┬Щ║Ў┐■ы┐0╣ЁГТX S<~Й 9√@▄╚ЯпMB╓й╩Е"┴/x▄╞╘Жk}iШD┼└Щ)ї/o√b╞г╖▀~√ў┐ =▓иGнУX.╕%rU▒щ8NШxM√ь│╧.\╕РЮфI%,мB╕Р/r.√2р @24Гщжп8Ўы_ ·╡╫^CJ╓ЛЦB]ь4и╚ЪФ`M*H/6i╥DЄO┌╛Фк$°омjСg╕╪E·Ўэ█н[7|!шЎN P7ДЁфG▄|∙хЧби6n▄иbрПмКЇ╪│g╧FЖ▌╗w<Б<СцїW_ √}]я╗ ╣еK│sr╨─mЕСv╗Єтт├GП|Ї╤GЭ:u2`▒▒=7к№Ac4с═{vу7l|vEЬ╩■┼g ╠v{>√█╟wtщR\^ЬУW3Д№БLЁ }Ў╔?~·╙Як╩НЪ╓@mO_╪╪┐aцHдNTЦ┘Ї▐_о╣цЧ╩щV╤░▓9В~Я╙ыс█БЄ ╖├╡ц∙U╢pд╙╜ў-Ю3зfн╝;;▌КF2rsРb¤ЛВсp╫NЭ1─,}╓╧ЙpМ─HПа/╫╞СnлFbвt▌вv╟w¤#s.ёгЯ╚╬З*ї+▄a-Ё@ўh▀╛¤|└╬У╪▀R═W─4╩4}at0Б@Х0~iлЦиё╜ў▐{ю╣ч╨'iвЦuЎ─ПOЭ8╦! Д@;╪╕э╢█┌┤i3n▄8A╥╘"№WHМс╠w)v┌Фб.л─ёл╬▄ D>ED/o╝ё░Є[o╜еbГё ╜╛YTЭикq∙AЕy°р┴ГН5┬/-P╕ э┼Ts╧аi~└Ьц2~П ╒╔u╫EШ╪╘# Єш╝ыМ┼b╠oєЯ;╛iЛ1;p хbR@ Й°С╩%]ЁЙiВ╚ ╚ЧKиT├·G'^чlЛ Ь╥`(чwQ-Ь▌и║8йё╣a6LZ.ЛР-ЖbXBJ'ЙCЗ5h╨АЙ∙ї╠O[}Е lГ+┤═q:)▒\╛┼мt┤╟%i Ц*ъмЭ l#7╬░ШЪ╔ХрoZndA- б╖Ah_|ё╓н[уцhtSфЖDЕИ╨H""0├╬-ПJMJ┌╛┬Wlх6Я.vф)+V"Ї(фм┐Haъ╦R, гшЯ №'ZSЬ@PвAй>ї*s=щЯ]╛т╞ыо╜аi╙5╧>wї╒Wг╓^N8\^RТ хr=│pс¤·сv4─`3VО╦╩ гPВ▒▓l 6Ёэє√╝Юту'kdх╝╢f▌нўvUvВ9Eг`░┤ь■ЇзЫn║ └5ДмЁ5а└K/╜D{ыВЙ╕Wп^╕ ╦Ц-у╓F▄ЧнNй╩э┌╡+к Aн[╖R┼'>-o╛∙ж@ЯЧ_~∙ХW^Y▓dIЪm4ФтE┘Шпb┌Q┤ъEnумЮz&x╘еKф░a├иЇ(ю X╝x1ZБ/B_О3эО6j╙ж═Їщ╙!|Сp┐╫}ў▌Зъ╝■·ыhw┤5PуЬ9s╕╪Чж}d№с@>ы╫п''4vNЬ8b█АИzўю Yб╜Р8A┤╚BDР▄}ў▌4#нZ╡КНЛ╤vш0SжLсРд ╫Q(aЗш∙sчї╨пшфI╘┤у]wЗ|>з▌ЇA╜BбO?■8р3,О?√∙Uпм[w[Ч.■твМ▄H*)-▄╗пшфйь▄ Ы4Ў╓╩ЛДГ╗╤Н ш *ЗыЕЛ║Їьб23JК   ∙ПO┴╓зЯ№уК+ор(╦═лY???3╖Ж╣▄Fщх┼EЗ:}ЄdНЪ53\о&^╘o╦╩·№гП╩}╛-Я}vU√Ў┼зOуi(hsI╗м┌╡б░КD▌@ДQ╡a╒ w▐╙U[╣hёю╕╜F¤zFXБp( DшtFвЧ├I0┴ПqHJ╡иЗQАFdC╦╛╥4▐f·"и_┐~DhGМ▄{я╜ў∙чЯ╟#|Ь┤o▀~щ╥еш]шф@l ,Р}оUъW▌║u├╕ЖH1в√█▀в: √▀/╜ЇRЇ╒д¤-╒°э╘йКАp^xс░Нn╓бC╬?й╞/3─╣k╫.|t╜Ў┌k .дтvD$%ю`цШ·═o~Г9 О;юМKжoъ@▌! N┬{ўюm╓м$ЙЎ┬T╢b┼ q┼├└┴░E·TухBz╙ёю#П<В@дДяv(а_|С╤oе╛YTЭикqЙ0xб┴БFЁЛk▄┴¤o/юаr|¤╢╘╩╬;n·тїS Л ц╒а ├бэЫ┐╩s■и`└─╓П┘╜█v°▌5#M/пйЬ▀Шхpбo.I$кg|Rs·бхLЎrq╢NЭ:\╝гВ╝ыо╗ёЛ_@y7o▐|Ўь┘PсРA╛Є1чЎ!+иL╡─1╕9j╘(Z!м7▐xИP Ht(IZ.б%0╣▀yчЭ(є■М3▐zы-HПp√╓[oE╣Шs7nМ╖f═Ъї▐{яL?Se3b─╠к`щ┘gЯЕ*▒s7U╣(hЇш╤╨|@T▄К @├▀¤юw─Ф T∙мBYё─Ч7=] vLх4=BЕ│3(MO'w░n▄╕%ВБх╦ЧгєaBєўВчБвЫв84╓W&Бс;vp╞pО╝ю║ыЖ B╫'╘ё▌w▀@b√[гoа P.╘ Аю╣чЮ}√Ў ╨~А rHщ╖Q)╥iLв╜▀yчЭ_¤ъWи#.└єдIУЖ*ЫЁQU╖n]·:po┴ КF┼╤╗hЛbлсЪH▓e °-Ъ?v n▌║Н┘┐═Б└┐> <'+╪хЦЧХбшП=╬uсТу╟O9Ж▄U╪╪`РХ[#╖nmo^о╢рk|}нЪ┐░kяUЖ3шлp}F╒╬/┐t;]шx7\{▓Н╪>{ъ6l`аO╛U[ ёIж'гди╪ЫХYлf▐╛¤ ■щ/┌ущй¤Ех╛К═ чГ▀u°¤щУз▓r▓}х Z_hм(;\°Юєz╝Е╗╢}╒Єв╢АG╤UЪ4й\╚ОFёо╫ьKvЛ;-Mкщ=▄=гEМ·j√ТТА╦Д]}ї╒_№▐Э:u*║"@~,с[ }╥H$ВПfR╒~Е/7.Y ╖б'р[}г2i#░K┐лWп╞X@A@HЬ0'▄xуНй╞п╕ў▓╓┬─`жbkчhU┼┤ГяI┤ ж&░G╫~ф@/+┘█'k°Ем╨С gHщБє0ЕBЛи╪>Ht9LдI╟п2Q5-▓(а0ў╜рЧ▀]@ДШЬ!"Lд▀b}-▓иzPUуr╓е╗~qMПУo/ю`╘a╪KU┴ГП╬^їД▒ЁфeфAc╝*7╣▀5s╓ C =с5╘O$#jўЮс1'{УУwФS√ВкЗ>┴М╨иQ#╠_№vg^|LcвЧ->\┐У}К╚8╙7nт╧═Ы7ууИP╠`тOК╔╙Ььсу╢д─r!\╠qP6PhLАТ@6Шр qd└бLП4HIhх░Иt2Й/ch&ю(чlШк╛4уAчс[ХB╩n╕│0!╖3╩ЖH}H╙├─└нБ`xЁр┴╚╥^╡jUЧ.]╕d╡к█cТ6$╔ї#░'K<·╛1┴жм-╕EХеCгбЙo╣хю,Ъ╠хЮ╝дэЛkYўзу№∙є!║О;кШ9YPMe╕цzЬК\Ё 6sцLиd▄ДВь█╖/ZЯ^оHO▒┼2╬;ЩПєYб+p─ЩZ═·Ж╔чйУ'1эfижП■║йnЭ:-█^LП▀г;w}Є╔'┐┐╗У*/SЩЮэ█╢F№┴Л~ЄjE# ▐▒¤Tiq╗Я■╪щ1C█ФХe║С╣}╒▄]√ў ╩YЩХЮ├цяъе╧▄є└лщЎk6\0КДЭо}[┐jz╤E┬№Єyєz q{ эЎе│gў*(0ФХ)tcЫн▄_с═╩AбYЩYЖЧ4°Х▒ЬA·H0`╧pЫ%GГa#x0.:-w2╨+<═╖Д2mKшu°иm╙ж W!!%╚ ╒+\КеT┘п─T┐rхJ4┌С)щ+╞Оз√▒УWй_aдsOc┴аУ╖k╫`Иp$▒┐С├─ёЛШ0▐7l╪@╞└-░&~SН_Z11лИЕХбy╕ч╥Ё╥в╒дшжЫnЭ╕J[▀╨}╚dж┼M┘ь Юё╤Л▒IЛ6┬\ў╠3╧`║c▄УФt№╥bz°ЁaTЗ_Шп┐■:.0їqbЧ¤*╢╪З─╖U_Л,к6T╒╕ГЇ=а╤К╗V$ ╩∙─d1\╩сJК▒╥м\к╪░ю6y╓╙гT ╙4HбЄлPЖкPуz═¤яe {a╘\JЎШЎГкCaсBbrЦф╬6Щ5dQъ▄╕ItИ∙8 №╦вuЖь5сЬ╬%-|к>√ь│╘М9В┘JlЩ╠!i╣xr╗№Є╦СТМГвeQЎ8│\LЕ°Ё┼ЗRАГ^,М╞R+ов╣э┘│╠╙>'√ ыKeГ╔а Ш▄1YSt╘y▄▀Э▐:(KЎ▓Б|~∙хЧ▄p и║d╔h20vэ╡╫КєJ┬ЛP6иФю╚ Ю╤y└$X┼ўб.╚zФ(УHФ°Й]9 B8N°Х┤}┘+°щГ╫╣╘о4gUвL[|д@(@1CC#10:┤Ф╝%:Ю:RЪUo~█0МУК!l=G0p:Ь▄єgЖ$`с╝∙}√Ї▒{╝Ст;jЕo∙в┼=иЄRХУїтЪ╒╣Щ┘═Ы5+:~А╬=uтЎ.Э o╢Ъ?дь╬∙ =▒ #cT╪пCa ?{тдВ╤г ╫в╛ [жїА3аЫ╙■∙G/:u ║Щц  ╬└О~┐С▐ыЭ?eJ С#ХкДГБТwнЪХ▐(╥Хb■▓▓Мь,e┌√▌Ю ▐╢ЫB&юСШйv░█|ё┼`ГKэ aЩШёI╚└h>eNI╟/ў мKWчEU√?пi F2:╤ Wq╛є*цыР8~A└Ч█╖oчZ}Яо°J+sO* `Йs xг-MўJ│"╧╛║b┼КVнZa╥_┐~=:┐lL:^шКG│7юc╚\w▌uHЖт╕Ш@ ЯИL:~Q.R~Ё┴╨╚ЗЯўШ╗╛ы·ZdQuв8ю ^гKL+ ТA3а`H=╪q╥╙/П6Аа#fМ ЇPюzr▐ЖG Эї +пгJpу№pНШ╬ЬF%<)ЧlT╠#М :Їълпж╦ЧХ╣ХMT&_тKБ_.╗vэ┬ДОмаp2ВXWнZ╡l┘2ЩtRХл╠y№хЧ_ЦАgШ┐ЄєєёёM¤Gаг▓Ж ю╪▒wш╡╩н{Ь╘H7cд*WbтаарщcП=Ў╫┐■UV▄─└Р╩dк╗aв╧сБСК╘Щб┌RuGY Фй░;о[╖ЕBЄ└ЭH %!ыу°У╛╞xД:╥e╗e╦ЦPЩиK╥ЎеёX╠Ц▄К╬СЫА█╥iо╨┘Qh└╗у╟П╟ыєц═г{#Ем743зУДрfЛ?ё1@wщ3(╫Ё4ўU╕=nЫ▓№>#б°∙╜ЎтK╖v╕Y╣▄╤╥2PcT╜╕bE╟n▌Н╧кР#│VNnуFНВ>C╫Fь╢▓а┐NГ·NOFе┐╝╣Xlьь█╟АД@ДбРrg,[░аg▀~f9╞Oщ╔ЩYYvпO ∙ПOы╒о °kdчT°}EзNo¤j█]я5╦ +зc¤Єw▌ЯaЇ√TЖщГт░╟ЬУ&AЯ//╧▓Щ6xt╫КЄь╠,▌\з╬┴ПНEob╬YМ╪Ч┘шKДп╝Є ┌ЛыЮЙуd|M"╘CЗбe╣т_╒~%$√kщы╩╛─>#ё╪╙╠F°·ълп~°a сNЭ:uш╨Aмp╥у*ъБ°ВёФ X╛mdQ╥цФr╓эtши{ўюЭ0a8coйуЕ№KЖ╚№Эw▐aPz*Фx╙M7бюмWкёЛlС∙█o┐M┐@ф`7qт─ў▐{я{ипEU·су╥,╧¤[°5тЕ(пЩЭйК╘cг_?¤╓И]┘]f╕iЖ├╬┼╙╞┐8№┐Н;├│╪e\WUы ┐┐┼UЎ'a└ФН)F"$╦В/ўrїъ╒ыЩgЮ╤з`$╕э╢█▌ея╗я╛K/╜t─ИШtpS│xХb╝№Є╦?■°cFDн!НTхB-\╕РЙР╘╞<ЁЇ╙OЛk-_СH]GРx╙жMk╫оТC>╚╝GП╧>√м╠╦╘7й╩E┐·╒пzўю}чЭw"├ 6рk{їъ╒x:Йa№D,gХv╥-86═╞г╬ ╣ПrQё/┐№ТnMиї▌w▀¤тЛ/▓╛={Ўд·┴TО▓Р╨y█╢m▓ wэ┌ХN╩МYsє═74HШЙk_к s├4(в? oр\\l▒А \НвЕ°Ю{ю╣уО; I<Е$Ч,YВБбb$Ї░JлЫCььK▄M╞tp┘┴p╚n└)х°2▌ЮDН:Ь╬█╛┌╖gяН7¤ИЄDсБCЕ>∙°уоЭяq╒оЕ┴▓m╦з═▐дсy╡0мN<░kяЮ+о∙%сЭ= г.▌╕v¤═╖¤AeyВса И$Z ╫■gу╫\sННЫСп╖mk╓▓EFv╓щ'▐zу═{║▄cЪQ>Hъф╔>№Ё77▌Фm┤pY┘[o╝ёЛ_■▓V├Жше'N|ё╒╢Я▀p}№6Ф}хЮL/E\lGHFаOЇlQКвgЛ9G╥'╤СPV ■¤g╬Ь)╟/Gдл<·шгsц╠aVUъWл╨"гGПЦx\┤e╨AЇиХ+WB■b^Bгрф╣xёbд╢░ю╨бфIЧ д╣ї╓[ √▀ўщ╙'╙RИ╩╥╤Д7┘Л╕У╥Ffд@є└9у@А│P└ьў∙КNЮ",9]T╗Vн№zї1&Ы7iz┘/█+З╜в┤─_Rvр▀√╦JK]n╖═щи{AГ: ъ#FЙЯ sKж╙нб/?¤чO.√/{╢7т░]r╔%╢H╘щ╬V√ьгПМЁoхх╛ Ъ!;л═П┌f┬ся┘╗oчюL/4(╞x╪у╔№╫┐╢\r╔П█╢mу2О┐Л╪╜ 1б ssє▓▓│Ы╖mЫЇb▌DЗF!zРMв"лЇ╒ЩQr8жRєq1КСН`AП▒─ё√ълпr│┌╫_}ё┼жЁ# Oл╘пА1╥uNf╧Ю╜e╦▄чl ЇCoЙУt№Т1 и^x71!▄r╦-мЛ~рF.║%ЮrHК RQЇI╠-0╦fМЩ&hCт#╠_|ёrK:^ЇXKL,ье№КO╛╢m█rйЭш┐й╞/2╟d┼Ё:HЖСИi╘wZ_Л,кNЇ╟╠╠╠─╦╠xЯ&.▄ █_?═ ╓╡∙k"┘QП-ш:u°█╖o^iЇл/?( aVq█╜х┼■c?┐■ F╨=wвEїЁ И?i=zZ`бaЙaA└*fj0ЙywPUа4╠bPфxЪ╙& ╠Є@l╚┐KЧ.\╞┼\)м·`в┴+Ш│ЕKьЕМЦXоa╟░5Ш(┴Ї-F╚с┘gЯe╝╓|╙░ jБ4рDVёБО6lфМ&я▐╜╗╛ЖЫX.Ў╤D ╒Е*@█Qе▌t╙MH,╛Ьg5 ъ[Є╒ЩvНXНК! Д№їc▄xрПзГ4и╢┴ф╞НёБВ шHЎN╘TПSM7p╘явOB╣в[rI=i√вi·ЩБ·@▄▄:╞KЫ"═HzX]eв║БI╚Ў▌w▀еe*Н╡zїjz a(рB∙AэAi▒!╕LwИ3╕C;Є╪CSF═qaЪэвfЁ└hMу╬аФw}╜9╫лS╖Q╙fЕ╗wГецm┌T~;├╗┐·║м╕─эїdfg5n▌КaиA;wlпс╔tFTщ╔╙їєєў;▒█.n█╓0BЪ█KОЯ0bкв∙¤Ыj╒·B'аUl▀сюэ;▄NW0Ўz3Є/h╝яюЬЬ▄ЪujI0ъя▐щє┬с`^^э№FЁ╨ф╩rf╙W° wcьL▌Ь╞nЙ(w.j╗JОвё°э╖▀&И$pI┐│f═┬ў▐Й'pНET╡_!1рИ2▌Щ╣зП0╞╤ЩQ(Э-°Д─У/щ°Eзbl▄┴5╦л'я`\0(Х└b╥G└@╦Ц-QЦ{ямч┼G─▄╣s╤XI╟ C╨ ~хR8╛ўXwpДз7kкёЛGАЙ╚]=??П0ўb|}╧ї╡╚в пщО;(╗g0&KJJЁkш°╙▐ пв╗кC>╚┐└ИFцўйhЁд'лЦЄЩJ├a,AgЖo║JpPЩЛ&~°с╟<~№xФ+ч8'Б`Лў▀┴ВЬн$ъп╥bщщ╢╠╫Ш═┼N&oIldЧ0]gФ╢╟.▒\▒ищAнe╒М╛Бtж╙7╕pЬ─4╚Ь_╔xЭ^╒жjЄr┼√XvOън0╜АЎю▌шР_iDЗхf0vФ_тб├IЙ╗'Qq|y4i╥ДyъЫ╞╪ЕшBИйЬSррЦ╟$И├а╠°╥ВI█WКЦ8фд8iИoЁ▀Т%Kац┼ПD^СїM9╝%\}ї╒╨m║&[РЁ<г|/╛°bю╨glГ[_Е╦у▓┼╠уFPжp╨ew╪mЎ▒F °¤╢H╘%&4Ы9В*╜ї┘бКp└юr:\FT°╩╜ЧЁ2lnъ╦pDLмiжПV┬╧H┤╞Щ xЇ\IЩq@в╦юfб╙╫┌яє▒я╜╤6ьцЩ┌~┐╤k╓L╦+╩3╜Щ'OЭ╠Їx!Н &аэЁy·┘gЯI╝tК"M$snj╢┼╬ЦюФк┐щ1╠ЙZxп╝7~ICФЖ|юьмR┐Rц4BЧyе╣хвЧ"O|pа░█ИСX%М_P!ЦВВВ-ZbB°Ь4фФ╟{ ╪ЇклотZкМ#К│6^!Жг╨е_yчЦ;М8 Р1\╥МО╛иь╫▒▓в┬гLУdkJ▄°╒├n╦ИfЪя║╛YTmшО;И┴/о$\г4┤W$в*╩Ф▀оY*SUД╩<^;tЩ├V╤"еrTЕ╖Ї╕╩мбьюи╩ Щj═Uе═ГЬO1Г№їпeАe░!Vк╪┬yєцїя▀▀ '╦-)@WШ╢╚0O√ °р▄┴Ё╬2╫x╔с╝rЙLgrE╥r1]в8Ъп╪qЖес!ю %з@zё3 'т"Ы╨Щ>U╣вYщ└+>╚xЭ!0 КеKЧvъ╘)═I_:╤Є╩¤уИ╞J]╤&%║mК╗Ж4"▒Q2d%вР░AрЯъкs¤ /╝p╫]w-[╢Lь▐|У╢/ПЭeЮ╚mI2Ch<е╔'╬КАФk╫оэ╒лЧ@:еJ1КO┤xЙ╬Я?└АтЖЙмз┤Е┐х╦ЧC╔с▌√ю╗ПAR 4J#НDmQЪ╟├╤░╙f║mЖГу┼╥Т:юT╢x8lD|╧ H0м%.╖C╦с═ДВvз╣й "╞о]├Z *п╦▄Ышw9Ь╚03├у╩0╝FМб/Щp╨pхЙбл@0ф┤W:░┼╨■N'0.ЪЮгй2┬в Х*╜ХUь▄CкeхЖ!67;'ЎPн]╜╞╪'P^XьКЭ>╠В╬▌ЦC)&ЎTД/F`╚YЪ&╒°e░:╜╦Илj┐т╕fчфзWЖюзZF"фF=Х0~;vь╚LЁ9╬ Ч ╞─ Ч▄д°╩+п\{э╡`I>\еG!7МСa├Ж 8c0·жё┐╤ЯКИ8╛RН(r└S╩п\╢О|Eуsh¤·їй╞/sУMКР'4P■юъkСE╒Й~р╕Г╘х<█Чk▓Ш2╩цЕКJЬ5Шh╦№╩_^ьпYгЖMХ+хн8юїцШн║авКЬnиШ╠*√Т─HжА877Т└ВыТ^RЄEAУ@Ш!°о╠Y&A═╚▒WЬn╥ФKH╟ЇТL6╛`тCn▄─-0K?∙НYЙiMJdEТЦлЫ▓└9ЪЦ║G/Ч═Ч■зT▐!\щ#`ХH+╩ЬУц# Fr°w Р%1║HЬ?т YУ┬[шФKЦ,бОь▌╗╖:╙Аz╓ЎeПП╞ООхMr++▌ LБИEAъHНnа\у"дшзЯIшAIМ╩╠АmМEТсёD*сУЄ|╖Q\8tЩ└.Н╪MпО▓╥Rn╝#oe╞v■l-░Л?0j4g/єХgy2¤(4├ рНЦ∙╦3│▓Вба█ы*╞Ъt╚цt]:2*Н╓E%┼ж╜╤.NGeS·|Ш2▄А"А}Еee╗ХF╡@ Фсv2C*┌╠Пq}║шt^осъ─╔Z° ЙДЄJ┬Dc┴╠SСDe╟KoЗЦ`u< *а$╒°UZ F░У■sю¤КЖv5тZ.xФYщЕ&┐6l ▄)1iЁр┴ьKЙБЯЇLЁ.▐"КхВ┼+'╢й3чеD"8&╖┬dЪё"vSй▓аC▌Щ уЛу%щ°╒'в╕Щ∙╗лпEU'·БуJyQ= ╡├f╢5╚╘╢P4жL┐bЗК:Ey([─TNЧ.╞X08Лмщ╚ZМ╪╒011`ШL╟╝йbЗЧЁE▄бQH╒Щ╦ ╠0jSфДвb°F┐ЦiKЯ┘uP"kXrЦT"$MUо,KЖb&T▒yY|uяTuц┌ ╦тfje.х+-╝Я('ъ┐ЇЮwI█E@Т▐RqИ0MbБ┌▓T─А▄bh3╧к■_╒╛\xНкo┌╫уN╫╛Х╓▀╩░╥ХoХЦЫЮщh▀╙зЄjцб■ЖKп╫ ╣╕=ХRгЧqrq╠ ╟╖Kк╬аущшNм ┌H░qtM¤·╓ЭEYd╤ўCйр уrЕ╞<@AЎa'╞Tжbт═Ц-[тOA╠ЎgЙ;(хЭ ль╞ЗHdiRXй░iа=к :°╨бCPE·ўїл┤г%ЖИJП_oПВ╬Зq< ВatY╣жsЙю╘жoL╤ёК:╙MПq╦╚C4vд}кr┼@ш0╧╠х}.|ИQДЁХЧU╛╚їP[╚A╢├╙╪╞?Ес¤√ў7n▄8¤╞Ъ4эBо╚э:d9 ╘_╘3Ч-єтRаL\b╡oЪЎeM.йыОсй┌W(MЫ▄'Чж]Ru &└ДВQЩhZцЧлyVaЛ,▓╚"Л╛-к*фвhb▄AZ 08(Ъ5n{╕юKбbKzЦ╦╡<,n{╕ьвcTWrЬеan"Жа╓М ╝ '<Ёа╤WA]ъ*SПoЧк\▌AVmhz╤ЧrДyY╗б Mк╖1Я~▀6єH┘G[QЪ0нй┌EiGxйX╕2▒▒С[uж╗ЙРd┼╠еqe√┐ьш╖┌7U√wъжY┴pй┌WчS?╦!U╗$эB4И╞ЩоF╟ЕW┤╚"Л,▓ш╗жк┬AL┌Iуr-ыГГ$p1П9QЪNТ°T№вЙщЕ*ЫчdЛa_шЗ(w$жk*a╔Ц┴Ї&j╩д√▀хQQxУ╗u S╥r╣┌иNKz`Гl└╖_.▐qSЪсm`JЙPГ&4╣CxНокЫЖ█Еa;WZїъ╦SоРКшP║я(╗а▓ПФ:├G█j▀Tэ+█UЙ┬i#ф0I┌╛Л╥.`ХЮ║фїvIEz╗╛ы°Oпйю`СEYd╤wMUЕГ<#41ю w■РpPПfэBПм:wю╝~¤zufм┌^╜zqЙ:а,вкqHФЯnYQж┌у╢Ї5jИбE╖Р╤┼ЖqЄж\36Н═П¤─*Э ЪИЇї╕xаuы╓РЮт>├кб.ъq9Т╦y╩─╙зO ╦_■Є·ыпз?\.i╗РРЫ2qЙ░JА┬Р░:╓ФsЇl)CтTтB┤я╧~Ў3л}╙┤п╝┬хZёPбGШJh_╞Cц esOЩ2e█╢m╦Ч/O╒.iD─fк]╗6OёО KЙ*#+ ]╠Mч╜P`СEYdQХш<Ў&Н;°яTЪ&Ц=dDб,E▀чDMCXхGЁ![╨vэ┌┼ ИнВ┴YИЗ╫КZЎ 'MУадqЗ°I? @о╣╛Ж▓(\еэ▄?uъ┤,Тq╦▄1мМт#Z9i╣OСXим{l│ с╪щвJ;╛Э┴PФi3л<-╞┼ЄНcйI(uQ1╫уsoTД╓GYfд1еЭ╛еb╨lє√C╧Dqє¤°Б&MЪ@АV√жo_uж}С$U√r╦░ДPж╨0Є┐№Є╦дэТк3(mЛбДьс .▓f-Ю▌╤s8 █"Л,▓╚вoЕ╬cя`╥╕Г?№▐AЙр╧ї/шз)Sж┤i╙ц╬;яФP╔▌╗wЧлWпю╤гЩЖ*Z▓dЙШa·ЎэЛы∙єч▓LЫ6Н!ўжOЯ.pчбЗтNI╘К;ыEm>|Yбжи┼┬Е y№┌т┼Л∙Ц\CяО?lМ7ъЯпг&LША*Ё┤+ъiZn╞М│o▀╛ 6р>^;v,'ЦЛf╖?№Ёь┘│√ўя╢бщQ0J$╬ '$ЮЛп╕тКNЭ:IЦa├Ж1H▐Ёс├бЄСэgKЧ.▓!╞Z│f═жMЫp'Нsq╥v!"$╘└SЮ5rфH№Йз@lш-x├ т)З,nJ╢$тBЁМыEЛїъ╒╦j▀4э█╗woт-фL█▐-,,DЙi┌W?┴)┴├бCЗ╥╖K" p╖i═Iўу"=]м└YdСE▀Urяxb▄A▐ !с uХДОЬr╚jЄЇ╙Oг\`e┌<Ёg╧Ю=╣JYмZ╡ ║Ў╓[o═╦╦ГEMа▌Б-╚R╖n▌о╣ц$Г╢жЪФc╨Pj█╢m╦╩╩а)QS(°IУ& 8ПА&OЮLНОя╛√n╟ОY}┌uxрБло║КихЛ/╛Аве9GЩр 0аuы╓hшlд╢Жз? ∙╧С41КЖ─_xс№9g╬Ь┴Гг╩\u]░`0√▌я~gЖ ■&Д╧MбЇx╫Єх╦P5Ж ∙,[╢мOЯ>и2X╒П╦Cz:%m}yQ:с2М8qтбъ9уO}ЧчSA┬HА|ЁT└3o #РъБ╠Ы7╧j▀4э√╥K/сЛшЩgЮБpxsю▄╣╚ y"i;0П&рт▓╥b═░YБц!╘бb{s╙я?┤idЮrЬL▄№`СEYd╤wJ╒$ю T├╢1+7╤sUОkdr0ФмCщЛХ\щC(▄аA\C ┐√ю╗╚БиEto╤4Л'╠╫бDXiЪ4iRXX╚EC<ъ┌╡+╨┤x~~>р┬╞Нi!Sцт#Ї.╖|qСО9Sb6э╠4:ЦPЖ╚2G}╤~Мш┴eP ∙цИєеL╟дчО4 Уру╣чЮ*B)7▌t0M╢IJЛЁВWРк┼bfе╗п;vьйзЮB/Бd╨<' eб╙<№Ё├HАз╗vэв',▐Т(╙xJЎTla1;Ъ(К┴Цщ╧k╡o·Ў Ыg╫╠║!g░G░лbЎW╓Не;┘╚╔iвmГF&\+їЧр║xКвбс°Ц Ш(a∙Єх чA|Й я╗я>оu"╧у╟Пыз mЁPv■)ЛЫЄ'╥Р█еKЧвtК2Eq¤·ї╦Кл№УрЁт└Бz№∙Е_·,X░ ЮxтЙ!CЖ4m┌t╪░a┤д╥єTlo}tqщfEёщБ4шtB3бnhgД=0u"Yp╨"Л,▓ш?УкI▄Aк+}oT @ АъJ└6кF╘ЗХс┘k║ДТ;}·tTЛ ┬~Wп^╜a├ЖW_}U┼l'PЯєц═C╨ю/┐№Є╓н[╟ОЛ╫Qт┤i╙&LШ 4NХ5=UЩч=ў▄├°ЇrE╬|Ё▓В.─╗иBўю▌WмXбb╤а}√Ў╔┴*Ф~нZ╡Аq▀|є═?№pЇш╤yyyr┼Ёс├буY4.)ЁгЯ3! ВР═K╚╩▐п=z\yхХи&▐zын╖6o▐№╘SOбO0В─┤lе"F'"n nz$╚┐Йg√Jby]╬╨cЛK╕Aevh·aXэЫ╛}Йщi╘K╥И\зжI∙pY_ЪCм┬╗wяn╤в╩ад V┼6Z╓AЛ,▓╚в яиЪ─╘O5рБ│PH│g╧ЖЦЭ1cї"°|тЙ'Ю~·щ╛}√"╘04+ЩЩЩm┌┤╣∙цЫБ`PЛ√я┐х╩Х¤√ўЮ@EЖ 6■|№>■°уМ╖З?:─`Б─O5*ВъP╤вФ╧? №вЛ.ъ╒л2П█ьOсLЪ4i√Ўэ╦Ч/з╒╬Щ3азk╫оЇь┘OИjrь <°╥K/┼г4Mгc5eBZТ√ gbИ╕ГуЇЫ▄ёQИqU`WсЯьЧ4>·шгhq0f╡oЪЎ%▓─pX║t)$2╝ыо╗РLЬВЩ -Лoкqу╞йШ╦░юP√╙Я■┤ааА'є╪ш╕╨┘qd┴AЛ,▓╚в Lк>qUL┘pp7┴д.X╓TЧ╢Ьъ5C▒╨э Г%rИMЭ:ўС∙m╖▌ЖG@З▄" "+╝▄86Ry╦о┴8╦Я2c\л╪ItЄ╚;╟L"E╦#=fо[■╨R#хc╡o·ЎГz│f═╢l┘┬ЁБlbЖ!DM/╣фТ░О ╡H?Ъвг ╤╖lЮї? ZdСE¤gR5Й;ИМВ╨1vЫr╕вжWCE╣*gъ╘зВa▀А┴}kf╫▓▌*аФ█L ░a$3╚|┼б@$ТУч кH(\а\6ДЭNє$╓╥а╟уr╕ УЇ8д╞╥QВиm2├╞OXьhПс╗!У╕Ч_┼4:_чbэg▓ Тe╤Пwx№=vщ^@°.¤mQ.}QQ▄А.╜Ї╥n▌║╤└Е Лlcz-а9Юzъйc╟Оё╚ЁМL└фЮ={Ъ7oо┤╨═(аваа ёа^!AZ▓ЪЙ║╚mВм№JДdY_жs.3зУ╕Ю¤█Y¤Hx╖XЙС!zкx■ъ,<─!▓∙▀╙╛╝L10╤ФВк:╘аA\ 6 ПЖ╩Ў#Юз7h╨ажMЫвї┴ПHЖР1MLr ZdСE¤gRuИ;И\"*b╝К(Ы=ь░ЗХrE ╝ч°╫╝┤тцN╫;┘╣┴ЖмPк+ЕвxSЕ╝╕Ў╣ яyбЯ+NФ╫лЩiЯПёЗх^ъ╘▓▓2Zh(└√я┐2/,,|ї╒W;uъ┤xёbю ct_Q╞D$T├H╙│g╧ЇЗМ ╪░>|╕nZcГ╥┼UЭyю9Т╛_Px;лdДa╝h%Ж╖Ї╡ .Tgю_╦LЇIh╗d╔╞z$Я─мф -√╩+п▄~√эчrp_Ь╪┐╙№-▓╚"Л,:?к*LЕ╕ї№ГГaq╛ЕАчP8!е2ё└о╢ √_НЪфzU-[б╣б /█┤B#╠?эЖе0Ьз╩U░$ъ╩▓й,шнтrП╟лв6<*/UЩ5НdTЎв┼%фu"нY│f█╢m]t╤н╖▐ ▌,┴AкT/█Ы/aЯ╣Р'O╔П6¤(▄GJр(▌У'O9r$??┐o▀╛┤иХФФ0╘Я`┴m;wюl╒кUkЯTЩхъАOvPЕыЖ╜*С╛@Ьц┤_Трl·эЄнЇ0K|Ь╒Щ ╓Uв╣sчВ+ИўЖnрVоШыЮ╘┬6╧╟лj╣╠A>9ЇJ%╢o│f═zЇш┴╓I▄║Ч╪╛\·п]╗Ў╫_}ё┼╟э■$·Dn█╢нКEnтв│:▓}√Ў╓н[WUn▀O■YdСEUХкМШp0к┬└Б╬Р├ї МкКP╣=├.═·╦м╫▒5Н:O√всР-╧хМ:╗\╢И;уВгбу┐ю╫ц┤╙ч╚ЁT°#╡3"х Яreх*ЇиУ'}▒8к[иXЪшТ▓─з\Єг)( ╞:+╤d┬ v╘ЇЙ*Я╤Аг▒╨tt)рВ#QгЬ8q ╛0Y╢╙бL╝иcшD╙B╔└(xKМaщOзHEIеФ▐Б╞Чц:#(=╞JЪ╒y4 Ю─╨& DцжU2├Ь╧г▄8█│ЇБдэ╖БТGN3{кЎХ╪рЇ┐ЦВ─=_┼ZЩшУ¤ p OyВ▄╣╪nщ╗╬▀"Л,▓╚вєаъ*l G├&4ЦРГ╩Юб╢К╨яд.│╦┌▌eБH╕Nо╟mьr┌Гa[юСш┴'▀╕W╒R~╗:rЄdуZ╤pЙ▌ °|╢М\Ы-╦aь'┤3f ВЬЕегtЮl&л*quX6щє4dE/.ПъА@J╫7╪ ВдХСЫ=ёФ╗╓╕S╣с)о╙пSгй3w}щц╠│:$н)эgР3▓%nH┐╘О*аw╥д─c▄╥└╔ |Вgb╟4V▐4${ЄX}┘ и├ZЕ┼лйкхТ[q┌╫ЛNl_щД╚Ф╝ьJL┌╛╥@HF@╤Б+▐д┼ОЙї└@<ЄО0ю<фЎ]чoСEYd╤yP5БГAqйи-0с`F% Ы ╔vхG2ВЎ ■═▀=E ь~t8╡▌бА═┐+3█Vф│s>ё┴mкЖ:эПd╓░ЗГ╟╜оh4Ra│gЬЕ╜╬<EаЖ7W°dр:(╫T,ё8?╓─Э╟BЮ╣ Н.V¤iR Ь╪Ў╨rr\ЦI№У^Й║Ц/ж▀ЁwHRЕ-'О╨їбJїe╩t(Qi╧╖╨Йg╧а\БТщmД·сuRVХHа0%Ав╤╕-тu╦`╤Ї∙Хvпj╣RЙФд/╟ыэ[п^=^уW№▓уHo_q "cq└Э╟Ц0Р5 х╤#tЙ╞ОBN│w6=}╫∙[dСEYTUкpP чРР-T6░{q╟T┐&"Ми0╟цЪЁлyO7Н┌+▄╩х ╫ ЯЁ┌О6kQ ё╥тЬ#▐║2jЛФ╕CЩyКз _ъЫhPD└╥╫d╙│D.Йъ.╞Йфр╫|чa┼д∙Sd┼ъ╦ОnА#Xзxщ}юх2CmЛ█P╥ЎEYДзe Н╠qЭж}q═VгГ ▐хО|кЯ╚*+╙дз╬╦∙F╧є╗╦▀"Л,▓╚вєгъХ #╗+вь└└░▌ЁapЩї▀WY╦▀&,│╛┬vG░┤U#O█Лє■ч├┬К:зzl╕─p!╔VGOЯкW+зш─╔,oНй│ц 3\ЩЮ'еEEП?■8TT√вEЛ╘┘╢╟∙¤~eйЁшА}~█б╕щpR5I╕╣`┴В╧? |┌┤iАвD┼ДЙЫ`@└_aaс┌╡kЗ ╞M┘RF#Ц4Д2Ы33b#·PCуr{в^╗н[╖^|ё┼UнйюЙ┬X$╗vэz ¤ў╗wяЮ4}Ь)-Є╥K/uш╨!"\▒b┼╒W_Н╒О┘M│W2=лМ╔╬HK°]╢l┘╛}√p╘иQ└:исiU╦e ъ╨m╚Р!rIb√>·шгx бсС■ а╠СЬ╪╛t▄N▄@Ий█E┬:x┼Mv╢кЎчя:Л,▓╚"Л╬ПкДj▒EG─|a▒й░SUDХ╫жК╒°+ ╤─qY8ИD¤UQлЖг¤Oj_╨\-Z▓н"я─Р╫~й.0Аc╪)>q:пfнЗ ╞╓оw┴аQ}э.UQь╧══xъйз И╣sчю╪▒·5═╩пhzQrчg3г▓7n▄дIУ!щ▄HЕЇИ╥Ї |йx%Г█1c╞ їщ╙┐42щЎ'╢qz╠Z╓┘░aC▀╛}%ТЯlС;vь°ёу╧яАTР╥;vь╪Я■Їз═Ы7Cцg9:t(ъЩ$M6pр└_№т7▐xc▌║uYeк*У ■Bgє╔У'у&└1dВ╠!вС#Gт>yWч].л╞эЙй┌Нx№°q¤у$qK@\√ТsЇOe~┤╚ЦG╜г▓ўъ_ЙЭЁЇ╠E+╗}^ЁVф╛▒╜кЙ║ВС@ж-KЕэWn┘й"GЦС9Ф&▒╧ЬЕю╘г~@уъ▐Ъ*ж┬┼yУqї╟оЪ╔N;Кщщ2B╧Y ╪╦d7БбїбDЩЙlуzеXЄдС8КД╕╝Аg¤Р▒5ъ'│Бщ╚";╧tМ┬ВРў╠ Ц4рНзnрW└Кфd^Gф " }м╬ p#itшT╘┤iS╘QнbV1FууN5╢И8XИлk┴ГМ%HЮ27]&╤ЧэВ╣NЗkH)╟ДР╔Tхжы╒U ╦L)щ"╓╞;Л,▓╚"Л╬ЭR┴A┌ИO╢n▌┌╝yє/╛°вqу╞Мg}Д@Ь@╜ -▄о]╗={Ў@╡n▌┐я╛√.Ї▌o╝ё}┴┴И▓Еб#З▌ДГ~уЙm,r═╝сУз[╕Ягм╠SЎ@яЛПяUп┐Ї7wV▐╤┴╧ X5 Жэ■ ▐НfО.╙№В6╜√?и2T д▄#6!Ллб┌<═B╪[░`┴■¤√╢&LШ░c╟О /╝Рpd№°ё╓┤i╙yфАk╚Сц+12A╓Д 9 ┘Ш1cР╣Н;Е.Y▓dр└Б─2AЁL╛~zїъEу╨мY│ДёВ!▄мY│!CЖИ 'x└#R╞Яр▄NЬ8СuyтЙ'А GН5|°p ╦├З/]║TЗЖ╕LF>е3Б╜С#GвсQФE°ИQКИe╫wв╛Г Ъ3g3бщС;╔}ЇQА]фНХЛlq???┐{ўю(U8vь░╫Ф)Spс]H▌qЇш╤vВky1sц╠#GОаv╩▄й&ЦNфМ╢ФDНO!фж╠╡Z}dРgПp йзЮвOёE]Ї╖┐¤нAГДк \░Dв▐Tхжь╒┤╚"Л,▓ш√вTpРghQ_o█╢н^╜z╨e<яП7CB ╙5Р╜BЩ■°╟?Ж*№Ї╙Oбў7o▐№╜ДбО*G╘ДГ6хwы─^Ua3|О╞Т▒-кК╜│о  зиЕ█йpTФ╒ Y╥f▐[KOД.└@!А,R"ФЕЫxЁ╫ D┬┴дхжы╒┤╚"Л,▓ш√вTpРN T[{Ўьб&вb"бс┐▄Х}°Ёa(╙Ъ&A¤∙╧F╩ў▀ {ВГ╬ищJl8ш╖йИКтЫ▓ЗUС ЛЫ╣бr└┴╝╨╨Y?Z0hW░┬]\ЪхlX4zcsХ(╡Эp+╗сzlл]Ё)_@e█Х═^Zц╧╬2V]╕╝╦╡?9dvх╩Х╙└БiPЭ8q"@ j╬S┼шу9j╘иВВ╝~Їш╤Ж ч╤ТД√хcП=жL]NрHЫ# Cм4┼№G'` H╡IУ&Р^╞т:/[EМO─"xY╤╗Еы╚ YЗGМЙГЫрдn▌║@3▓ Ъ1cАx╕apce┌╖Ё:▓<-,,Ф&x ├3Вур е^]tД├UoдЩ5k2·╘╣e╘y КВР█┤i3`└·ЇАa@RYnж._dДE~мА+┘E╟з═Qўo╨;дЭ┘╓ pШ╘яХ╗%─ 0 1=ЄK╥rSЎj ZdСEYЇ}Q*8UhAmЇ▌MJ╞жР┴ПЙh■n9tш╨Е^░Ї╟?■кєЭw▐∙~╬,VЖ ИaМ°Э╞Щ┼*hфBыаЭ3п иFQS║JNyЛFн╝jvЧ/<╢№╙┼Yб┌╟y╗Й╩ зРЛ[ed┘є╩|х*фWFX шxБА cд1ю1╧ЯДО;ЦЯЯ╧UW▄W▒msx "гE▒т>7╬sKЩ2ї:~Сl╫о]t;АpББrTBЬ?т?┌ ■АWhT1°%╗т╕D▄_шLCф╟4▄╦╧Ьщ5BI? ЁLЛ1ю│▒Ё x▄3'aDР ЙёП╪╕|КК:г?APm█╢¤Ї╙O╤]Q╚Цk▀e(TДq│iч├M`_@I`J▄Є╔'ЩЖ(ьг`Ж^8$0╧>╩OAЩїP┴'Юx┐їъ╒Гф┴ 0%8є╚еМ?Ю9уYб╩x▒~¤·╜{ўf░ыє;Й╟хgїъю z╣i▄Xp╨"Л,▓╚вяН╬ бVа╤hlBb║Q&┬AЪЕ4\│f Юn┘▓║l╙жM▀9T&"4Од░G¤<д╬8╢╬ 41VРUСЪq├з& ·Ь'П╗ўПY√Ы╟о{│nn╗ O╙ю┬Qп5Ru#aWiP∙▄!wж+╧╙хпЁW°*T^═║4PЙхIў,╞═Gyu5k╓аC┤╟F╔YЎ∙)Т2└пJ╢оq▄╙╕qcФ╪╝ys┤%╖H2 │╨3Т│└>т3ZМ┼уШ╫zA√ўя║e╤H6m┌┤Ц-[r█^3f SКl╨|(╚FdИМъгН5Кёе▓PС└)▐╘нЮ▓Т+┼═Ы7ПЎmХAВT{ь1дЩ4iA!▐E3!7Ф.%ъїхЯтЧ├*$-7eЧ╢раEYdСE▀е_,жж░БЦ┐I.РъЛ┼┤ФA┴}°сЗ;vd╘░П?■░Ё{ГГ! Л┼п ═хc┬A╗з] enQ3Ч#r.═№zЁ3X_Ё∙б=СЪ╡r─╢─[НU-═иИиH╘ч╝иY╗П7Т╫╕жrE№A_Ж╦cцbшZ╚ВGН╤KЧаdэ┌╡_}ї╒Д фp6ИЗ~XbС =dН┌╤ЗVVъя#FрцУO> XЦУУ3}·Ї╟▓Д╟8╞D`╕Ш2e а'╨ J╟═·їы∙ф1sКKъИЇ№3╬);ё╠Y╤f╫EC3!JGqнZ╡┌╣s'┐УСUЪrSН@ ZdСEYЇ¤P*8иL0@╕wя▐ц═Ыя▐╜ЫОдо$╨д К TCoД═Ы7C~Бf*ArЛДФ═щ│╗ВfфiфтМTLвJ╘┤╖ф5╧PоР¤д=o UW WЛ·юЕє?ё╘hv╥U8ъЭЯиl┤Х║╝┐}▄Шёїы44╝П/qeKzгM;Ї·ш╤гБєh■S1л╒Ёс├sssqДj╙жMAAAИc╞М:Ь8q"▐Е─°Ю0iф╚СДe╚°2A■EEEHщє∙шЬ0╛rхJа╝A#"`Mt@BАGCЖ Щ1cd╪╖o▀W^yеg╧Ю╕╔¤miп0NбHЫn┼Їс@╤`╕Wп^ЪМИf#ЗhQФИЫ(7nЮ80??иnвфхх 4И°щ.\XXXИ║s+!0Т╡рц╪▒cQ▀┌╡kф!╝ЕВв1Т=╩ 6DY╕╨Y╖n]H░АТ"Bе/^ аЙЮ'~9`╡{Ї╤G╣kЕ ╢├╙╣sч=#Aм,ЗЪ(SЄ─▌ ЕVU▌╢╩─№B&єц═C)H >k╒кЕыi╙жщз╥е*7UЯ╢раEYdСE▀еВГ╨VP(ЇЛ╪╣sgлVн6m┌─=ZqБfpН;T[я╛√.t1ТЭb"а№ и─хfа"юD┼╘ P:№rл█А╨п╨5Бo!╞║Оф>AЁРШЁ■█▀■╢qу╞*UЙcт4╣╡qц╠ЩxеNЭ:s`o!+ \И_Ф╪йS'`P`AаFd5l╪0А5╝B╟№ (▄vя╜ў╥Ї┼@V!╖КfD\кTй25ю╞╡∙С9Л/╚╫pdDBО╥╗{╘<юWo|┤й╠}p─ь╬коyЭ7всиК 5кn╜¤√x┴rь┤ И ;РН╛║▓ЙшПZО├M.ЖM─╚ю▒─KcOB█и╪ю=e║ym╚+╠D╝zyЙ─|╤9МЪбpАЩу╬╞Л@3-[╢dАeVM,jД&r╩╤ШD4Ф║Нц╥ДF ▓DД▐Ж<)VЬ.)dF*е{╠pг Ъ$ы:4j╘($р"r"=■°у`Г┴ TВk╬╣}Цe╒ШЁЛЎ╦дЄ╓?Пr В╔╝uы╓█╖oOїаєБЇ▌У╓йYdСEЭ;U8 * A═А3&МDCYЎ,UбЮ╝c}vE╙МЄ ▓╡O╢{┬оЬ╨╧nlє·_╫┘Є╩╞.ъбjЩ√=к▄o╕╠T│g╧1|Ф XчфЙь╠,*у╕гБ╔` ╪ОЛ?DЕщиNЭщU╩и(╩ ЄЗ╠БНЁ╚║ЬАЖK╞тЬлЧоbAUТ."w√щEуц╘йSyфC$ъO▓┼[─:,ФVhеcAHYVVFф╟Й╞Ї═p─"qYЁЁ !&J╤╧╠EJ№Й─<┘Fj─X6sч╬>|x··9сbс┬Е={Ў╘┴оN─DJ·∙2+▌▌ф▄ -NГ+ЩПjqЄпj╣Lаu@╔ЖKJ═В5ЙХу\Э,▓╚"Л,▓( U78hШНxГДГ╩бBОИ╙АГ'╘╘┴kBGsгзs3l9NgH9Г┼■г┘ї▌ >¤uncўу╦2▄Oь╞zqQё)oЦ╟сtЭ**╩╦нm7│#Цnc├5!Ф2БХ▒l;уF1zF█5╜Xра╬Хщb╠cыFМA╕ З│бP4г╜╚"#_gVz╢╩4J!▒░'>·QrI╜t┤*з└IЗр^q╤Ug╞jAbr╦UQF{┴}S Ш─?Z_-%т┤ig╩1В## lJм/эЛ ╕Mу\·│бх`eФ┬ Въ| ibд "{ х_еr╧¤+,,l╘иQ*fд▌qБw!Рs vmСEYdСEкЪ└AГГ╩ QЫjРdЛьQз ╪UЩ·реэЎЄ\U^╙г2▄.R■╠охG╩UQF-╒■ОЛ№╩сU╬,¤EU╚чўy2<╞Y'A├О┼U?╔ИNИ▒С$СзTk┴Йx∙╨СЫъ@Зq +И=Мaєh6Л3,еВA+[┼" ╗┤╥╤-Ь п╚РФF,VЦЛу╩DлЇ!м┴M░zЄфI▄gфФ86тЎ╞┼нn o┤ ёOФ┬Gr^░К"ЬhHcЖь6quOПДcк╞┘n╧Э 1╬"ЫЮZфх▓"В┬╙├V&Ш╬c╡╧├ъiСEYd╤ Bк.pP┼раdiкщап╘╘ИК%Ns!Щ╞CFгAQеr╠GvєOЫ FBNЗp0fefХЧ√23│ueп+f  ╤╨FHЫРшrB(е┘└PYдD&999ВЩЁ'`▌P└│╝веНK╖╚_╓y 8AЙ╠Ц╤ЮiЧв_нКЕ╢&╧▓<-╦─Й8Т∙─Б)Фўї╒^Z.х|9f╚`4t╤хыH, ай╝╚$нА▓GSЎ&╓г¤ТзПи│paVт╒╦В╬├:и┐╖3й№╧п\Ў'^дZ en}┴:)6╡╚"Л,▓╚вдTНр ╨\╘ДГ╠5j┬;[╚И4дqf├АЙm▒╒_ЯRY*тSЎl (Ч╫H ╗Tdeym*RVZЬХЭ ЭоМ`0LЇ├┼AZщЕ╫ФЮH\%dXc"й5├92r#┴AГ╒ fвЛНСDQYr╙]4ТИuН╠Г7n°├Я\ЦхS&Б*т╓╛iеk0ъ┬x:╕ЩХХEгЧDоAthH8ЗTt? Ў'оМ#gФNМ;╚ЗкЪLZ_ё#aИЯs▒З╔Кj▄╜є z 3Dз└╗D∙W╡\К%йЭїмдБXdСEYd╤╣P╡БГ&[ДГС╪m З`╣r█Х-Ї]Юю▒L┐i FХ├8═╫А┴░▓9НУM2\Ъ ГзMЕC6шxЫ▌D}QкyВ▌?T╖№1#Oща+▒nБу[Дqиё└БРТ╥╝zё" Еx%╟╩╫Щя╦&6MFИ9oсфП;ЩЩЩ▓7СаV╚Н▐№SПв';№ц═Ы7zЇh=Б╕¤╩┬%л0Й╟Ц [JМeIб┬╢,нъ^├ЙїeЙ"У╕шАII2d╥pч┌╫bДRЁs┘ЗУ╩┐Jх▓Йsд'═ЧФ─О(8[Э├┴'YdСEYDк6p╨─АQч7pР╛$╢И▓Н_3MT┘ё╖╣&╠эЕ╕┤GНуОe┼╒P_╚ыq¤БIУЯ|Ї╤qP╚╩ ДhД;Ъ9~№°╘йSХ╢LмbkФ║.РRв4%w╕3П{Єшj ЁВБ]ШzЭ8\╚щpH `1}·t<ъ█╖пмWъы░▄/H9г ¤╜ў▐ЫЯЯп{н╞mMу▒┼╠DGЗL└eb@СlЕsbTЬзТU╞жhKс=z┤^╜zЄвО]x╬пф6tш╨3f@D<СFDп╛*КGєч╧0`кrп$7∙q█%│м)) y+mєв,=Н 4√▒R(Л╔№q╝ЕъаЗ<∙фУ╥ АП╟ОЫк▄дDQKSвE&MЪД№Sезg▒0┬╗р*╜WНEYdСE U8и*ПвуJ▒мp05UЗUДhbpш╟5═kуН┬l┌╕!ТMxb▓ўшXyyFfvЕпїЗV▐┐?░яq Ща╛╟/*Мн╧▌БАeА t┬а├Аує╤╒Фб-╧в@ │g╧.(( юСe▀├З╒MШ0 ХТу╫yiО╥╫%┴92Щ8q"г=шЛн`№3Ё5▓в╡Тgпбт║%М╦╩╚сщзЯoxD╫W▒wО?~─И╚Я №I╟"Цb]IQЩрЙЛц*╚╥ы▐╜√5╫\K╗,т┴╩╪р:5╥<╕MЫ6└╟Ї╦&█4Fтw┘▓eЫ6mZ▒b°GMЙtP╞э└c?жs7Їёэи█ !XФ╔а╙lPp;n▄8╚oЁр┴FH?}·t$&{У&MBЮD9<°О]╦VK"BeF4▄╜{7╫@СїВzш!YT№мX▒в[╖nР-дЗ╫iуF№·ып╣<н;╡Ёа╝-Z0bв`2▄Ь?~aa!WrAщ!| HJПl╓е@МА°├.╞┴5[ьa$Fї╣(ЯXn╩юl╛и;╩дЗГ|кG с!З"┤╚"Л,▓ш\иZ└A┘/h7В╔ЬW ╫m▓ИлЪ▓ЩOmt@Й─RШп┌eех99╣АmБ@x╞я╟e┌ЦМб"@3╘ё\ДО_┐~=А 0╫[Б┤ ┘╣sч2Wшuшц|╥┴┼▒c╟А>L╗Пж╒m°Ёс└R└ya\iЕd╕·)K╧DuД>Hр5f╠дШk╥д ╫▓∙.╣рKф'╟M -D╧`YЖЮсj#Z╜uы╓`H w└Шю5g╡ТJM@|р└цLгНgx рGe┬e└G╝Е^"╛8фY:ЙАZ\АА0JВ┌║u+░жkЁ╚С#∙∙∙tИСSШЙ2ХL[= bбrьa+гsKЮм ▌fЮDвЗ│ск=ПфZ0 eB2╞*$-7iП╓с ДЙLР!zЭеH' j#NK`Х]╤"Л,▓╚"Л╬J╒╥:h┬┴Ис/ОШл└ve╖ЩЦ@[D█SиbK─▒Ъ╞W> °C┘Y5┴`EE╚уu"/з╔Гu1▓╥ЬЕ┴№┬Е Б╕┼░qу╞}·Їсv.·|6╔╞A■Й╫k{Е(M"ю└Cuъ╘црстУ┴мА Й┤T╠NgFDE^x!└"Єсz(3ч╔┬╝PЪЙЛЩ╙4┼ХG60╜=╨@▄.йяGфq┬]a─▀YwЪдk┘▓%Кр)╧°4hPx%мС5PAN╕h╫о▌З~╚═ЪA9A'нЖ▄e(AU,Ї#л)┘▓ ╞gЩ3g;.^┐~}░G#х]w▌иў№є╧г╩x╫(СЁ └┤SзNи$№hгAО╔Ф ▄ёK9$ЦЫ*:аО)pуms¤:)╤╡E┼P>╔ =hСEYd╤9RuБГ▒╡сМ┴├4pP[YО!B№?дь╬╥╥▓zuєЛK*ЬNЪUYiyvvж,█╤Vз╗Pрц╚С# /{WзEёўgыщ╕чТ.┴.D─VED$П>║╗╗д;%DРїo#bб╥ ╟ї╙╣ї■fчn┘;Bф{S;;єЭ_ Сc╟ОUкT Ъj1e╩Хй.ЯHq"ВЇ.AГ┬L╙?aЦ─■h═ёу╟ЙR+╪SS#tН<%" Т°█VнZїш╤гP*sD5yД?Й") ГHТ #╛)─щ┴ыїТа6$F dDъд8T╝И /┘кОьVLКG^е╓xN ┼Gb─@Щ{ЎьIЇзР/ЬЗ┬4И╕би$ЙфB"RЪ¤СБMVо\9--m┌┤iP#°E^NдЖj╜а<$Об▌$джH└Ёй<ў└/╨nи■М3рjЯ>}РbОй:ш/"Ж█АЮBЦ▀┐CЄB _┐R╛ЧЕ╚ Л V k└▌ШцxЩ'BoV+эV№щбM╒(хj"║g▒:tш╕F№+ш *d*икtP9-_■╬BаЄгWУ=HT6УЫыNH└с╒░├└И╚ЗL╖Д─;)Wо\╖n▌T·  ГД;! _HР╚оrrr╩Ц- ДГ81└S└oА!К0uъ╘~¤·ClEuS@Ко(dзnцK,╒╜q !I-#$Й EФОU ;zЇhрпзNЭ·B$RР>╘NеYДАкvuДрТ▄╒╓АK─ЪАl─ gF)@К┌t▐╝yэ┌╡#│$`╤)йЪ*%Ец"~9д^p?┘йПPXтЎAbў@╜H▄(0Eэf╩$kиЁ6╒√ъ╛╜Wй/PaHGн*pLЖТм▌ЁZєХ1ЖСў√9УKжМ┤=┴═%t╨ (╙▐eG┤`?yяQ$┤ЮlхGЪN╖╘бCЗ╫В №√@ Є·Їщ┼Ш1и└▐nЖ;сqр╕PаtP<"0`Р$8 MAЪ ▓ ╓ujeТPєъ╒лзiT░ С й╛┤p┐jk/ОсС~°ЪЧt*UtJ▄eкTйrЁрAu?hХ,■е~B┌S╗ы ╨ўY│fСД╨,└ябF─Jx=∙╩ ф!ЛвэЕgМq> *┴Т╠2╨f$0И1─Т$╦Iв@*[─ч¤/╒KЗ:t№7б╙┴B╨n%>ЮьАз:╒к BR$в qS═╠╠ъйЭ°!YxйкЮT╦╥╥╥*Vм╪╗woТм6ЯvO<╒■Мь╣Bи┘╚Du░%{o@}бT$2ЛкнV╦Lоj▀&TНlяAfдlj╪mтXM╝j╘2wэ┌╡rх╩ЁKbИщ$aи@X╒`┌j5g╠Ш¤Х─k╘Ж╣&MWП;6wю\╡qК┘■лP#Р#M№p"ДФббА╣B3╬Ы7я┌єХХxHКЖ>Иw╥бфh╨[╡╞}{√╤eЛ:hТ9$╤("!Л5D╤У╬╝М,╡╦¤i :tш╨бC ЭВJeАuA1f╧Ю дъLьЁКь$Л HzСH%└аjp┘PОpэ╡ZъFфm└lVнZQ`│┘а╤8эHш4╤Б┬U╕ЯЁ<█ИщёnБ?бД╧С-OИiUx╙Dч;d╚YЙ╜B)╗ЩA·pг%ДЖ╨/`9PwТб_D>з5А#<ШЁ9╥МpП╦хВ_т╝rЄфI`УРЪDFН╜В44Ъ@MюБ4Ч-[дЬ╝b╫╜{w8n╓мЩъ╔л6ь╕qуRSSУУУ Б╓ю wГl█╢-ТTч║mЛx╖@KBЗ!╗кР04Р;щ─иqъ╘й╫Ю/|a№╞DЛ╠ф╟Mче9ЛfwLы╠СЮC╛AJ!╠`╟Т!}·╠ЮЎ╢*q$ЮI┌Й:tш╨qшt░(TСР0|О06Ш╫aК%МMї)&▓.эftЧдR+ХкNДW┴¤D8д·ъТА└Дойq°TRе╞|ЖєДu+"29Х═и┌R8IТ╒Ф&ЖwД ПRNЄ╕╜OНzMМ█И RЫ9╓*Й#│Цс] ХЙТ█HуР▌чИЖ)We╜E6╡√Sw╫[вЭЙВЫ▄м2oт└ёЧ┌Yэ`д$жг┘b┴о$┘шэf{ьЮryYQ╓тМy#c6░зqФ╬ї;╬№ЁIф@▓ITФFЬfыm:tш╨бупAзГEбr"яБ нSa*к╩ПlRB)█╙AУСЄ_╕p┴хr┴dO°бsц╠щ╘йУ╪╥TеbДЖк▄BХ&jэ╠р┘АДиЮЙФQ YвК БВи)лБKDёM$XД╛РЇЙ╦ЁU┌_╡~#тRR U#IьфH1T!въlAtЧк╚Ё*Y v&*╡ЕЄ└ $Л┐╘╬╨┘HTmUО╣ж╤╚╟Р!Мж?ї)УЮшpФИ*^КЕД°p╝Af┬┤╫w╢ўо┌@▒2+Р x■╝sы╨бCЗЧГN AeDв│pс┬Ўэ█л╗К┴ЇOT@╚OtйH Тм)ТЙЯLXQ═/▒!#Ti╝Ап@╗kЗ▀"B5н=ЬкЕущ╙зўю▌[ ╚З ┬їA╩─хYM▓X┤hQўю▌Б═*√цJMD4┬дT┐fд╨,тOMЄR=[╔ pJ╣¤щU^┴н╥╬KЧ.н_┐> Й4,Ўп╢3д╣d╔ТО;кE╝# П╪ ЪЇ╨╟)СJ _╗-+МGvl∙$%R╩$YBt0╧Щ┘s╫3╚N6нS~u+A:tш╨q╜╨щ`!Рb╜L╥x√э╖QБHI╒ўEд╓P iМс*№сбeDdDбOЯ>dЧ[m$Hg┬Д ГVЛбЪ╛i▌Дсq▓╗1фвЪтйlМ▄№ї╫_%ёэИ_Лъ╝м ЙЗ сF HJJъ█╖/Ь!╠I╒ ^йЙ┤jP╡0и└■о┬▒V7 йAЪ*╟╥>~)nХvЖ─П?>sцL▓┼3┘OЕ*╪Х°п╢sП=ю╛√nXxРК─9╣╤╠ +G▀∙J╦─\%╘C│{mO╚K2КЎ ═sfї▄]┘╚( t:иCЗ:о:, тHKВЎСш}DРгЦК0 эмпR╒╔┤H,m\=╒╠╥T7Ж█ AэЭк аъЯлїЬ@цD ╤РB╝ SHюt╣\┌`+dЛaU9┬=└<ЄЄЄ qЄ" A╕кuC╣ккЧT_ЙСФe═╞╩jvиpXХ6])¤[вЭЭNч▒c╟╩Ц-KЄ"╛>Px╥mо╜ЭЙ┘окVЙ8╓а-yтsNК╣Д╔o╬n╡·О┘йЫн╝├╧╣╬м╛╗_└╥AY ъtPЗ:t№?а╙┴B Lh╟т┼Л·щзх╦ЧлЮY│fA ╗tщB( ╘8A√Ўэс$4тЪ5kа╜:tш░b┼ т9╤кU+" "!Zц╧ЯThA▀╛}╒]I Э @Stя▐}╩Ф)III╨P└o ╒СиЖQYwъ╘щэ╖▀Ж√Б Кг.Щ1c╞БЦ-[Ж x$YC9Ы4i9о^╜:==ri█╢н╩█а +V2diБKuЭZиNP$b╔]$;;.A.999dSцщ╙з'&&z╜^8Жь<p иWjjjСР7ЧтЦhч#GО@F─ыZ:L|||│f═HОйЭIk┤i╙ц■√яЗЎ!╛)FУБ║@/}~┐┼]юМямФЇ╤ггЪm(улt0@╟rт2~№Ц╩85▐┐Ш╥muш╨бC╟uBзГЕ@dEЁ s9╠ё$ж R&я~¤·S!Т6h╡┴Гё"╤ЫсLЯ>}А╜ў▐{;wюДЖкQ╜zїо]╗к▐@/р╬Х+WТZлсЪсAh╙Е 6o▐<%%о Ш8qв8p╒кU╨nD"ыё╟CBdлZWHЮкZ╡jFF)3▄п ╕р║uыр╢╓н[C:vь▄И╬ЧЩxr─gO·M╚Д▓X$S╢╛%Э:tш╕NшtЁЄP%m$╓ R(TеJХ222аи─╒АД─╙>кТ9-зБ;Б^#INNюR$|1\┬■д╩qъ╛p$┬T┌╡k'ДDЖЄ╘п_┐e╦Ц▓─╘ПфH,ЎЬN'╔ш┼╗я╛╗g╧ЮФФФК+]#Є9╕У▐И▀ ╔СЬД╖pї╕АА!CЖ@:Ё, у Y═*Qв╨D╕h4┘еГь╣%ЗL╟НзFu╣Rт╖J;Cт$6aVVФдWп^╒лWын╖-ZФЮЮ5ЕD┤╠/█╬HсФ─ИФ WёQ╢Д ¤▐Цu[ИCn6{└╬j│;■d?oьГ/;сф╨╧ЮЪЛr Ш:t:иCЗ:о:,bёМК╘\ХвСє└-р qр]╜zuZZ┌┘│gЙjХиБCаВ°╒╨yyyЁqЙB@dНР8с"@AИT ╬W;pр┘√Є]╡jUлVн╚цlsц╠щ╓нЫv7B_РвУUK┬у@D╘█=5jc·Їщp tзVнZm┌┤Qc; с7ZюrеЎБдаH╨8ъф╝кУU VС╒Ph: O@"с╢"╗Bi т▀╬P6РЭpf╨ЮZ1╨┴НаР&▌vPЗ:t\7t:XPCШб{Ўьyя╜ў╢o▀ЮИpИRпAГ└иб┘║uы╢m█ц╬Э█еK╕a╔Т%йййу╟П4h№9■№▐╜{OЬ8▒GПЁ'P вT:tш╪▒c╔╞┴Р╕─ОЯ{ю9р$╨ёчЯN№'HpУyєц┴#@MАC°¤■├З├°УьфKК ╪йSззЮzъ╡╫^ЮЕДf▄╜{7Р?(dєц═б"дРЫ7o~■∙чUW▄╡k╫~є═7Л/╓∙╗Ўц"┤Ж╚ ┤*`bзn·|Нй▌*э|√э╖ўэ█lOB -_╖n▌Э;wn┌┤ ╨DвPЖ▀л┤3┤╘ыЧ_~Щ9s&6%d╝IЭ═ЇЧ8_e╓e╜;▀}Kщq═╛+ул`н~6Ры:;рУЗeЗ^Ж╖b▌│XЗ:t\'t:XъOd9┌m┘ра~¤·х╦ЧЗжY░`A█╢mЗ ╙∙М3~¤їWи#└m└N`╓/Sж ╕ ў@├A╩сp8!!!77╫l6пX▒В╘Фд LюLOO/Y▓фкUлИш╦ыїNЭ:ї╨бC─╩НD`bБ4QжI ╨·Ё,фYРXwp╛Y│fp H фY_q:ЭЁр╩Х+Q_Бsrrр╝fY■│MфHЫЗ 5Ї Ї$8 х╘ю GnZF,ъоо,V[гШ╖3╨AB╕Ui"С┼цE"╥>"ьT7J╣┤Э╒}STХ7ю~оxA@м╜S d╓▒RU+e =▐-;е¤╧ юdаГ!:рО╗╨oўC8юаЖZЗ:t№┐б╙┴вP∙MлVн}Ї╤:л/ ╔╔╔p кt╟хrA╣▌nb┴жЪ▓йЖbЁKNе3p/bKGX┤#╤uА{И=Я*HSNс°▄╣sДфй>╝└]АUhеnкO0з5jtю▄юЗК+╣й%Д┬╜$ёЬ▌╖o░"╡·W x)Y$Шбv@дH─>дhWс2"{БhеГънrK┤s╟Оя╛√nhg▓я0Ў `Ш═ 6n▄H╤n[╖pс┬╦╢3ёwY┤h╤7▀|C8:~КaЕbs╤┬F┐DПЩъ5╣=jAw╖FУ;яs║МТ9BЕ╝Ом;kabГЪ╒ща:tш╕~шt░╚|Ф"33│|∙Єo╜їLсZЖtш╨бj╒кСcu╛╫*■┤A^Р┬ЯИП∙єR═)!($ ]Tё~U9 !%HёД ьК°█к<ЖЄЕ█рёi╙жежжЦ*UК\"╘ДTъ╝ X ╣жее-^╝8##JHЬfо.║CN▓─Gд╚■%jФэц"HГЖ*└Я╛Иb▐╬└S╟О =r┘░aй`√Ўэ╫мY▌zё5!1eрx#ЧmgЄ^H7Г╧,%%ыЧ#Т┴@S>4╗■Ч╔RеgъХ6$!▐Е/№┬ь╢Щ$cLОm┘Г>иwСъ╥A:tш╨ё АN БРUитууб>дH*UВ3ЁKЪ.й╘ДЄзкt.▓∙hЁ-eQwKГK.ЧKы gАX@vE8╣╪ уB─Z─О░5▐4,░R °У8эRлЫ╝йб■о▓g1й╕·аv╦`T└rTRHn+┬/ т║qK┤│J6lX╣rх#GОРА█7nDЪЁ╫D8zеvЖWчб P$RHlк╚░вД╕0∙▄Z[8IаdCв╤MчB╔УеdгdАjЪ=#╢6Gц.и█ ъ╨бCЗО t:иCGё|a@КєND│>ўфёEYииХЧР╠∙8>3░rщjI╖╒.щмB╔Т6и uш╨бC╟uCзГ:t/└Uв2nхИ╬Ч Iв9хr!BN|SДК"Ч)О╤%Д:tш╨буzб╙A:К$хЄ^3mqЁF─+зe :JсВТЄK+g8>В ╙BО╤уъ╨бCЗОыЕNuш(^:F"|Й├jc^!&$P(Цмx╫fЕвИ└ < ЗМIзГ:tш╨бу Эъ╨Q╝t0Аx ╔vЩвE oA'╔aрИ▓l5ЩБ■1вДщ РBJ 1HF┤ 1║▓XЗ:t\7t:иCGёВаX 4cR( СF+╥МАшР.hу%ZцkB4e▒ъ╪ишУuш╨бCЗОыГNuш(^ о$*цeДШAfgТ &Q"X$d ё ТXDгЗв2▓╨:╘бCЗ╫ПbJХ $А■е4╟фW.tц_eC╛▄╔]с$╙<ытLED3╚HдГ▓тZL▒<жЙ1V╞БСD#┘зБ+┬M▄▀▌BE^┬MюnW╦ю/ХL╜∙W@VG"mV┌в■+;░м╘ыZ~uш╨QьQщ ═0Т`╞г } Ф ОeLсИ╛е╟╥╘ез.{Ж║Їю┐╗4▓f┐4#кPqог,┼л╛┼ ЪzKЪApЙ"7╔╩y·║&▄K[╗Ё;Х _╝бq I╜┤╡Pн )їО?Е╢|7wE!+▐>r┴Ў╤∙mu╒╛х√Є╡╝-n∙ ы╨ёя╟-@i д фВ 9:x)∙║ tЁ▓y]┬пг,┼л╛ A\T)┌НжГт%╥╡BТ╢тMI╪pY)3ЙIй(№╔ {╦З ╫ща :G:XDYLiхВ2НиKU╞ ▐╤цJ├ю н░|U║зс  ▄ЎП╘WЗ┌7pшН╔▒Иt¤U:x┘Є▌,]-СвВБVщр%тmЭъ╨бг╪вШ╥┴В│V№ Иm╩MогV╢qe╣аVЯ°7√1№▐iё╞═|Є%║it-tЁ┐¤_-Э-д)╛Ьh░╨m╖:t█A:■E(оt░╚Є·JPЗЫ[}─╣▓IС:иjq├л{х№┤rAЩ╖·■╟pMВ│Ыш q▌ї╒д┼E·╔Хt┼7┘¤щЄVГш_Hu*иC╟┐ ┼Ш^Л╤╡z╧н>ъ\о▓E╘vZ▄дщфТс№▓\¤MtЁЯпяBШnоэ▌еRW║аЮ╛д0W7╝I╦ХP VW{їн▐Яu]▒ >c:HP0Р\~╗мpрV─%╒╗╘и_ ц╞╫°▓R:mСКФч/зовx╘ў?Е+╥┴╦:Ї▄|WЮл╙ iбKн/]┤▄p·їgF:╘бCGёFqеГъ∙╦ёГЫрэx│q ЇHK╬n4=·╙с╛P╘╟ы(L1ляЧWф╔Ч;╛itЁYЖBх╦ОrQюu3Ф│rсГKs║dM{лwfЭъ╨ёяCёеГ>╨n╖┬Ш╬K▄цcF╬А 4├В ░4├)сe°Ш└q <╟д|ZB gр╔.Л┴%(ш▀╨r7дuQP\н)З┤Р)eh╜╤T8&Ё╦CAл┼ FвУ╤"4;╦тGQp M l6█▀Тщ?X▀1о╘ #СН(Г╤и▐)K▄wё╔ЫI▒qюT▒pJ╚ дшш▓с╪▄∙%*фO ·з$с└S╨E6╚Л╝Йсn8╝╫xЮх╕P0h▒|G&╙Н+╚M╘UФФ~E╤2*шWМ╥пв8o4\ьWТ,1Ф╛б╢┼┼ФЖ├a│┘,И▓ "▄J╫г├R╘L├|Ше9ЖFFКНE#c`YZR(#IЗ$╟<╧CВ┌"BщсънBU└h eЖ∙█b▒@M)74GЄb№┐▌fЗГp$l6Щек-Л oPця№■╓т▄№·■GаЎ H Иy ├И0С├чпЄOwЖ╝qo@щmP 4╦P╪VDЖ╬F■x╡%)D╡l ║(,CA│═&Q╕ГJ╩Кт╞JЧ/ї#.МА▀o│уя╚о┴l╬з╣╖xП╓:ЛТя:_г┘ ї(уО щТъ╨буЪPLщ 3▒p╨`╢╞─(═%$yC╗┼д0ё┘MКDQЦX╓ЕрA╓p∙╔ГфвЄ UXrЭ vcpЩйD9Eд d■Pчh_г┼rжB╩С╥hЕ :%ЙHТ░А╨`вQ╓h№Kх)Юї¤Wт╥■Oc>%R, Ga■╢ZбЙЩл┐┴-%╝┤рD╛b  ЙE}Ч¤и Ф┼М*T сgE╕И┼╠ ╕/yВ~З╒~УФ┼Ъj/сЮl2+╒T6№W╕у[V6U(!М╞p ┐xЦQ,DcQ,&╝┼kкC╟┼Т╥М░ЬОE#ЛY╞╗╕Є0▄░ эf+Щ°@РГqVB8Дв8╓N~DR╒А_`3┼НjqEzLЛ3(.Х?Ч@e q7C║@^ фОE5@▒О&z=Йчi(Ш └kGвА8ЎябГ h} }Рэ 2┘IC╬-ДBм╒*ДCXdn4\lф┬Э7Z Ж fЛrмИЬХ№0U╡Y/sБ+ Г sAR\>Ж P9╞╟ &c@l▀фb8╠X╠д0ЕP@/vI#МёX▌,ЙШr╤@y╓└ёв└17▄\X%~j▀"QЦ3bЄ eАd─▌тtP╓t┼^євqБ ┬hЮ▀пШ[[кC╟┼Х║╜HТЫ╫a▌ >Зqєе' рл/#┘┘&╗=ЬA╚╚ъ╤╣ы▄e╦С┼╓╡Y╙╣[7 зI4bВ @щЙKКъўZ╠щ`бИъА s6E┘ #╠gб@Ё╬ZПт╤ЦП"зх╞N'Т═V[■р.гг┐ Юy!у▒gЯ═┐ц]Е╖Н1в▀рБЧуп╥┴тU▀)┐яЛ¤_┬tЁ╚▐}┴pш■зЮФ╩n├н/Ё╚Д]zeкР─эЖ g!зpLE╩l■m ~°rяy╕╓bЫM ╧(|sСГ╥R╫C▀эu%─8°╟sН_Vb(▐╩|╠@\Хod К─├"}╛СH h6█Ё·Цfрж╠▀~?ЫХёP╜g юНo"`нш мё ╙┴_ўэ ЕBП<∙$╓@▀У ·U▒wuш╨Q┼ОЪ F╕АB|p яl▀▄▒oЯ╝Уg▀▌°^чЙуНMФС┘К╬_И∙KW/я1┴фP╚ ╢.+╨FQъ9║иоз"ТЄЯФ4А:#v|╘╠8wЎэ Р╒В тРи`бСDA╤`¤ O╤4+Х╥Ю╧Пxi╕Р+(у КЯ/╒PКH┐░ЄЭ╒▀~ў▌;▐UФq╩Tж(°·╡я0eщ"─╤ВТШ"nТФздВZ#D┬LPЪ*├UJRдPtAл┤\МЯ>n|╪╠:л╘╫ж╘Чеб╛nдR~тЕZOI\╓rFйш WГTHйmо┬nпRЕ╧▒+╥┌√╠┼fЧ╡═ЯЯHS╙З3ТЄ<е╣ ╦ZhдСв^╠J.иЛЄ2OЮLHH`q з▒╠Мaєm yq\▀┘ч╥g.\ИV№p8К╠F°Иа Ux1═B╞ЮЧУЇh┐RmFЛJб┬┬au<Б"╤▐=z21qъ┤щ╚Q`БP$▓еT╕й╒,F6ж▀└Т)%╛№Є╦ХяmР∙e╖т│ |Ю╥┼V юWxnбRMЩV\У ~╔7}ёЫR╬чK▀зЄКeе▄∙╥A╓ИХкв$Ю┐░~хк/Ўэ]╕cЛ╠╨ЪWVф-j▀гц╝╢7jЯХ/щoЧ▐si·┌~K╕ймй=иВcJ▒&э I▐├╟ЭЙё(▐ЙяН╔╕C*JyXFОь; яL·мЕєQЬ"▄НD░╨Ч┼уЛ4─ЩА.▄1╘╖аO╡e╓>л\-╕▒р√ХшB7|nкьЦ╓\╘@║8и%S:@~╙JR■7(ю№rсце╒ЮнKCu▄z╕ItЁЇ┘вtРбhB !E!╞ ВЗЭqq@АPV╬ЬО║н]Ж▄Юй=ЖЇ]▓q▓rКвe·F╢i9ЄГїHИ|ь∙Й{Ў ЫєМ8Яў╨▒uлW]╚╩,_▒BО'╖KП4[Й$╠`8.▀ї°ЩЇX╣╪XНЖл2■Ъ ;bЬ$S(ЖЙм+] ∙┬╚hBС0▓█#╔E4пМ30"Тp[╨H<МD ЁнhLDAёЭ4р3УyГ /гa─Д{АЄ╕=╚Пd^6}▒░╔`bСНAz\Ы_X╛u+SНМ╠R1Дr|юЦ▒*╩dEЬ3а(╖DГ Ъe Д░ЮБ╔пТФп ╠:w6╣ly═P[Ф*EЕа*CМ┼┴F8╪т═f+6оgэV2Db?ГЧЩвў╟∙│╖Ч.KєQnЖ^yЕC╕бrЄPR2ЯЩ├Х* -ПГ╘@yД#ЁBc┐┼b▓к╠╩2Ф ┘м0х2═Z°╡I┼6ОК┴k┬^Н▒`└`╖AьC╛д╛╩[ц1[ТP!Ж%).24Єцц:Р ╩╤e"L' ╡В┼+fФ╕o╕Пй QИ─"&ш$▓2eBЖoАЮП9 ╘ТU┌_тз╦ў╘ Gв k┤ЩдП#,∙BXЄ `u╨╝^▐fцЬ╬мє┘╔еRа?B:\W╞.>@3 #пYmэъ╘]║√#№" &lЕ)K▓╤└KвБ┼ў░╢]╟пZНL╩╘Б^├ &Q▓ZаwNJ\" Fqа(┘яе\╬pо█ Я'gрб└KхKт%ОU╛&Q┬эcфp9А@/хJЕpШ72М╔,#╤_ O┌]<├╫ ¤>F╨dСЧcФ┼C╘oVIg2ЇFдQ ╥■╡fK╓пGf ■ б3B~ШЎс├┬╟ь #╓Д═RЩxЦ єa'g┬-А>;ЛK.БлR6{(р▒8тpOаФO8вt @°Ит# Е4 /k╩'CJs▒╕Ч▒ хВюЗ╓А╩AўЖЦї·╙Z╝1√У]"╟1Д╬ИЪOРB^Я╫щp*╦ '┐Ёu├вИч▒нg┴7+є<Ў З▐╔B╫ВK:┘p8╜╞d6_Ф╕Уї[,╖Е~│═╬√ЬEщЩЧdQ░Х%%юи┼│К]а▓^єEС┼И▌_XЕPЕb╜Яxv·G;СL░zЗA@МYLP=+,ъ3=cZu╛zКГЄИ╕┼╤gжГ▌п7#╟цLDС(qяры╞геR EhxP)▄╬РКxєLI."zФa И5|уВX`)Й t √Я├gАы╦(яYщ╥°s3(fхXPа!ь╕_╝QЫ▌И?8I°=л ╫TPH! ┼p#═°a│╙]Жf<ї¤╚`DК╧У ╙K~в╪╨Ъ+F<Д─HД▒:СjQ╟нЖЫDO*tЁЫKш RВ╠Y═xШещЇЇt╚2zЄTBfnЯОm&lY ╟жt<~┌tOТ5ююjp┐√╫ГоЬ╚└^▌╗═VжT╩д╓Э )Щb║ ф Ь╪ у{>k=bцu~/r9;╝Ў╩░├╦▐{╩єфЭKG1!■╬{▓№ц1#лЇЁCxоеQЮ█уJHХбЛВ a б0Є[#RЇB╢Ьы╖[э■`╨~чэ╚aFBМаH╣`ФсF)(├/МЯWrВШы╬NOЗaц№∙єe╦ЦЛ┐╜j▐й╙qё.:.Ю4▀сo╛K▒┼√<▐rП╘╥#м┌УOЛИ:╛╘`сЎ-xddБе│╝n│╔ф2XС;ЬёєяVл╒G о{*╦&sD ╗ГI Э√~Я╒nsХ/Ль╓c√ЎmO pwнG0эyК3цKA ┐·чў·JЧ╚Вeяоe В"Нбe▐*s(*um╥|юъw0¤eС═q ЗГ0вЕ2r!ўDУ=тєЫю║%ШВ2v^ёЮ╧4║├ЙХлe°╒▒FK╣ЗT8=6F цхY]ё╟~■┼╩3╬ЮпPжмыЎкЮS' .┌├g┐■:.>!&R nC╬╕и?ht9=oЬ╦ пу√?╝┐b┼р∙Ї╕j o╤|ЇОн2Ёi─^4TМЖM&=;т=╛╙ЗЧNL4Wмtъ╟¤qI╔Бh╕LЕЄXё╩q1Я╧`w`эєЗ }4Uя╜Ч║Зрў}√Б9▌YэXЭ;~, │&c∙ЄхYЫBГ ╣t*┬ЕX╩Гў·Єr╬xoN╢│t╩▀~W┼Ьрм\х─/√9Ж Ю║Pэ∙:╚Мв√┐¤╢в┘▒аc┌рсCЄкзdF#╖T■ю{2YС│ bЩ0°Ё3▀▀p2уg╧dVx·i╤bЇYМ┴ы1а╝@╓omNЗ;(]є~AКЕ$FT1eуёoўв╝]ж}╣'kё▒ ЧТХт}ы▄╤┘п╛Mr┬w$:o+Зтэ▐Р╫a╖S▓Ьwт┤'#.Э;v║Lй╥ЎRеB■Ах╢ °kВеuQ° -ф╔ %┼уNХХЩЩТП_@╨wц╚93░Ь,Sею╛па:хm&ю╘7▀&█m°║itЎрA_(L╦tїcг&XdЄ┬ЩЯ~0Ш Бp░ЄгПр0Ч8К╙-▌VЗОШ┬|`6ЫYЪ╔╚╚Hp╣lNg4Z0|DЩМмЬЇ╙жкК2sц│k╓z<├e|╜s[kЙГ▐hїTrеC№jи^╩╚QЮo~╜ў╬{sнЎ╫╟НЗBЇz¤╒╓с7 Ъ,vИ@&оS╦╖,XМx∙э╛ГО¤Ї╦ь∙ цоXFЩMё╔)Uюм■`╜║ЁС√╝>G╝K─╧фувА М`\Є2ю└м╤тS,2█э═R█qU+┴КРgaБЛз*L╒e(6 _0 ╟вqqN╝╪ХЕМ▀n\┐NДp8ЬРРXяЕ╢Є├xЬ:~t╙· БJp&╘yй~╥}wfyr .╗С3Ъ`┴эП┴x╒цЕЧ▓K▒Л З╩Ейл?rь╗~┘╖ ╨▒гМ├╥▓[Gg╔ф|1XоПb═╙{Ї═╩╩ъ5b░@гэ|Ееp$2dьШX4 │╛┘ю╝,─с:▒шУ=Т╒рУd+Mqxj╧¤Ё├6JСИ''╖┌w╒k╪аm╟.ы┐№╩А╟7f╨└Г{>┘▓∙▌е╗╖Э╔╔2P╞W┐Z¤╛ЗЁ┤jf▒$ їе█╒}qщ╟╗+ЄB╠Х,vЗЦрБP╞┴▀7п[├ЗГ0qj┘ж-m2Щ╦W┌╡√й3щ╒кT:mЦ>2╘ьЙОЮЇфухЯйЭ ╟╟Х└│ЦC)fЬ┬V╖°АўЮ<▒{ужSЗЯ;zтБ√юўC╚d╢Ц*┘оd`eJВеI╝├╒яйЧFП∙■▐╧a0хЖZе╢гялДмX└Эw■ВФчoщ*гb|╨▓kgcЕ▓ШqЕ├Р ;Єч╣╜NЧУ4O└4s,cр№Y┘{6o∙`▐Т%[7бЄ ([╫ьЯ}> Ун(┼╥█¤З№№▐охЯ~:oщLп▀w╖%╣цг╡Уъ?Хх╔LNJA14ъеf#· Z¤┴√!#u╥Э╒╝U╦{k╓ВZ∙г╗═qЎл¤Яl╪┬ё╕╢nЪкIГjП╘РYю╘щSU╦W┬ Й0▀хї7цнZЕщ %!+R"├P|╨ ЕfМЩPJ6Q╛░╙b{╜ctwеlwVRRЄ╠ёўn▌=wЄЇпЎ~√╟┴├V╗ыХfпЧ~р>lў▌╥d╩9~bё╝░ КЖ┬Iё /╝Ё┬└бCVь▄Б╗З▀:wj═Єх>o еt╣зы╓+]г&ЦB'4Ъв>Oю∙s[╫мЙeх─│l╦fovя╙s╓7_JFЖvDхKгс К2О▌в8F3XУ ╧5·─o┐ўъ▐cыG╗│╜юДФфWЪ╛VюОъК~ъ№П┐|┤sWnV6М*╖▀u╟¤5kT╣ >bКвб9╙f|¤┼Ч╙&NЦEq√О╣>g2ЎЗ>уГ╟ыN╧\8{оAD@у^lЎ·m5B!┼`А╟ПХ╛ў@яn▌7ю┘ T╛в-с╛юOz▓ж LЯ>▌Мф|Ў═▌▐√У!$Z-╖┘K┤щ3╕; 3'7┘Ъ0№▒FО║ъч=9бDj76dЙЁ %r6ЪЫ╩╦]│tЛ18ЪўшS╧▄їH-wъ▄Щ х╩Мn▌╓ЯЩЩЪ╓Н│Y╖ЇQДП9ут▀zуMsЙRЁ▌e Їє║5яXlfG╝єБмt╫4Ьзu:иу├?Lэv√┘│g6╗┴`ИЖ├РebJ ╩╚ДпvЁг5╞ Є-|чc_l1Ї¤ў╠ЫёJ▓(Ф:6°╣з╟▓┘═Cяп=Ў╙oUй&еюmZ═┌╢┼В╚fB┤bЎB╙5ю╛g▀П?c5ЮlЧ.W╢¤В╣XOО ъ╫g┬вEX╝чPhKъw╤fIv∙░П30у╗Ў╜G═ЮНмррo╓║U;gХ*ИЦЕЬь▀■ёсоЭГ'L єБ$Ё┤▓wЦ\`уCjNў∙Z╓qї√[░ЛМ3^▄Вс├в▀c┌dм!в)!Э2q╥аIУє9╣ЮI'еш4bж√К%▀[O╢ЮФМY хFe~XбQБ╙}ї∙чoЎьб(X s║д╡я╙Х.cJNRT▐r┐▐wGї7╗w@еKаC'ч,^╘m╩Xdw СС"Вl5D╗Ф*єЬ─cхf8 ╥╨foМЕЕР╤Д_D8Д\.Ш/dЬ/Y"Еc├_xнDBRЧU Ё &J╖ь╤%▀~М\VЙцеg|╛y╟+Н^E;▓ШЗwы╘║K╟J╒└ъKЦ┼n@М░ЦЬ┴▀е0ь7 D╙3жvщ5d┼RФА;/:сЮ▐5нў╢wЁл─Ц╠┤║п'ФHn╜z6Ц&fG╝▄h╥з█Р▌(#┤D╖Ёщч{№ї▒гР+(╫.Ь{Wхъў<ў╓─╔╥╠nzОЫД{И▀Пь}█╡Ш·юZЯ'╟СШИmXтеЮM▀Ш╣v ц,С7Л(рGFу░^=╟LЭЙ2╝╚тD^_╖fMц|¤2P╕·2Э·╠ ╡и╤║oK8Щm°рC█АL(AФ~ ълwьш7jМbьaBnў─с├╦VкЁfП4xe▐уЗЧ╠Ш┌▐/V■2 GМz▒Qг▓5)/Н╛ l╧'█w Ю4{УЁ┬{={я?zxт{$F@Ўв53MмeОжвБа XЭё░╥ш█рх╗ю║лї°1─qъ░A:u╢┘,t\Їоi¤їБшбI╚h√╞ы╦vюB▐\яВ. а{█vеТSЬNgч┴Гё╚гxmЗ╙╙г┴╨╢ Ы▐j╒%$C■#{tk╙>╡№=ў!ОЙ°єLО╕^ї_}рЮ{[ОБ▓▓С?:b└АQя,Бё╔H╘█НЫЎX<Х4#ЛeсУM╠ЩЬ╠КЙ%QP√№лI╔оОыц"*oъї┌Пн¤ъs8иЯПЮK |є╬║п╝ВlNxу√Ў~╛q¤ЮпC,_т╔ ;>╞жJдуFJC█сГёы│┌¤GП/Щ>╗╫┤Щ ЦО■№+ +>ZC▒n╛Y┐сЪM█Ёўkw┴ ]:|DP╗OЫКU╥$ е▒╓Х.ОuО.Yй┬иFLЩВ┐_Жў.Н╧√ЁCe%`<Ц5vпSч┴╟j╟ЧJйїЇSЙw▐Щo╝ы Ь?xшы╧>{╛▀╢uЩЪЦЦ┌╗Чє╬╗╨Нwf╫буя┼?L9О╦╩╩JNL2Ы═A┐?Ф(]:ў╫Я"с▐п4Ш╛kл''g┴а╔,╠╚=[т▒Z0cС?NM>дчЇ╤0єн1╛C╧(╣4КOB)╔ны>╗тУП_ЫЬАф^F#╣c╦V з╜Нща╒1Ё┘zwяB▒^╬&O=▒щлпP$ДlV┐╧cw%кї╗иL─╢_!HчЁо=ХKФfь.щ|:мтGNЮ8f╙:dА▒ЖQЎ╓хЄ]Gф№Зe┐Я▓ШС█╙5╡¤ЇIНe╦т│0Oy═╠@%Ka╗╬╨°й╟7є96fbн8тЖ┴ЁVулvoi*ЛXБ )t░э│╧.√x2└| cм╠Q ╙o╒м╜ Ж->ВJз(/ ╡ще%╗>╚╖ ╧╩Cyrя>¤╫пТГ╩ЗеJT╪X$$╔▓I┘Го(Д7я═┌╗ў°9 ЁЛM╡,╚└їkЎ┌фЕsидx%ш4Еe М▒╫ fl▀ОмXiОds#Яwd╧Ю#Зўge┌╬sg╬9УТэ╒к!╬И`1К2сH√┌O,∙юkdVЇШaZ╛╘pї{я F√УЄxbь°dЭЕ╕╛╢CўЗYГл`|>)¤|,шwggX,&г═╥з┐╣█╢!глЫГ▒n═[╠Y▓%%@^=Z╖z{┘RlAиўЗВ~ P╜3uF`D`]╤9}·vl╫Югh_о█h1S,cиTAё┌a`:iP╗ЎЎ╩сХЬВы╬▓Q┐▀шp╞rr ё |vg╡е╛∙цтMЫDwУO╓|(╚┘нп╫yvщРL8hйZ-я╚ЙeП╣h╙√°EНmЮ{n▐ьYb$ЬЧСYоbфv2hюg ГЧ∙ШьЎuещЬА+╬7<▌ЄЩgV∙▓XQXD┤JСФ]╪ИEФ╧╦К╝ ║=ЮЬмы╘[°с.Е-┬ ╙╢У$Xe E[▌∙Ё╩~DJ°gФЪЮ╓╡ўЖхШ┤Вп╘yaцш хJХєЬў┘▐PЮ┬V\6Cj╫╘┼_|Клc2B^ИцP$╓╡┘Ыs╫п├цnШ 1aЫ╖_ЎьйXкМ├фBg╥ся▒S' }o■jБ$E┼N Ъ,А╢в╔)╞ёэ█Ю1 9бH╤nнZ═Y┐^a!t~,╠М ╠╬бС lу'j/Ы1╓Цо█лe:"3▄ргЧ╛┐KщД╪А~}'═ЫЗ╣╕/А┘b╞╝╤t╪╬░,WRyR┤bриЄa Гbр( ╪▐4ыЄ╘│є>√ П?0Ъ┴К╫fjЎlЭї{>╞_Я╤╚9┴9ь╤М┐▀ }▓▀а■╦?√yr1є│┘аЛcZ│i3╩═EЙ x╨ГUБBИz┐┘в{jзWВIж/de&V(7h°╨iл╫*^sQd▓t{·Е9[╖#Л"ЖМб╢╡k/█ 5"{─D∙бO<7vўЗ╚IcОЮBV'╢Fxp╬╫╢·C╦~·┘╙Ы╝└╚n]Gо[Г;б'№цsugОЮФT╢М√Ї9╩─└"|Є▄cж╧└623╠╪o╡ fч8RJ ╣┘>9 р╜°╝\П╖]╙ц╙GОУ"1WХк╣Зёz└ис+╖n─▀├═ю;╛_b}╣╝Ч╦qХ*aб╖R∙.ъ▐f╤И└Gв6з/Ь`═& ЄЙ╙В╧їєчyэqоО╜z,Дfb╚f╞<>╧█╗~¤щ;?─г┤-]░РQлgЮ[0kЦ чdfVмT! vd╡9▄0DЎэ╧Х-╠═╡╞'@Yз4h▄o┼2ф0 1ЖхZ&╙/4X╗{g>ЛН┴Ь─д=WoЎ╢н╪╤╟Ру°7ч:ї┼W▀~·Й ZНlLМyCБ_~;0oўGШ И2Zцїщ▀е T*х╨W_|Є┘з▌FНДZ╟¤╘)M(&l2╢Ю>╥ √╝fУuhуfcg═B┼┘QXjЎ╠3ыў~Б)R6├╞ю▌рq#C)╛ )Є╟r▌4Ъ│fцО╨┘lШ¤>?├┴ы"BO}╡U▀ЕЛРНF┘┘(оT╗Ъ/¤щk,ПO╘║] │#┴dгв╝┴a╦ееГgO╛╜bеbЕ СШ═aХ5_J █~QX╤щёu~▒┴|аЄP^п╫,8З6|yьо ╚о°YEQЯЗЮЭ╢s*Ех╚OўxЎ∙╖ў|И-▐░ї|°ЩЩ|И9H╝\Т╘зщ╙6мЗуя?·°°╫√щ▄А┴┴╓л io╬░Ны1QЎy▒ьSВvПе5o1°L█ Р-;╕Ивpю№╠∙sе`─A6ЩIМO╪▓g╫№┐┬YDр╗3 j╘t┬╝∙╚j┬о-■pл:їV~√5╩╦A╔Й-Ю{юXr└в(м°m└¤╪b,В=Z"сюm▐║│LiаГ2═DcВ3!╔цLx╡g╠╝)к┴c╡7н_g(СВ  ЭKя▄ьї∙?эW╝Ф╜|DЩЗB▓┤ъуKёЙ┘&!eр ї'B╟sЪP└Л┼ЦBь╡║╧┐+@ш'з╧,_╕°шoЯ}Єй│g╧&$%~є¤▐Щ+ЧCБє┘OМoЇ╚г[╛▀З╗7,К▓3QR"q~э▒╟╝єЮJе╦F╜╚772X╠]GП┼╚iЖп)їё:Л?¤ I ГМв■НM▐Ўz┼sЕї|¤яоAIV|?mEыЛxб╛╓МDvЄл-√/ЪЗr$/╙ФPт╡Ъ┐╖oяўs╬Д╤o╡K╢8ЬV╧є&З-▌У{>/{╩┌wФ$@єо7╤Аh_Nо┘j┬╫║KG╢RyfMО7╟;ЫїLS▄8`╪A3╗ў╠J╧|в╓c'NЬ╒╛▀R%Х▒СV╖║Q]Жёъ%Мx<Ўд─Я╢o▀ ┐пвnП╦dОE°и(е{ЄFmX_V^VF|J рG5l0Ж#)Ж`╪Їцaй*┬tЁхЗkPHЧеi┐▀_кlY╝ц·?є─фп>Е┴w└╙/MZ╣Х+С┐6х ─6|iтюўahK{░╓ьoўM─├ЬL hЫ:░w_W╒*°N,MЙЭ;°╟╢m█║ шЗеPSЧ· цmUt xjз·vы2u╔",HЗcH┬╓┘T>]PБc/─┬M`X ьK╠БK,t·xз.|░ O └єHh^┬┌й╦ YКd\7j─Ш╔SЁК8_NJLД+┐|╝ч▐Z╡С═>║GZZя..а╪рЩ╬·хЧН╗wt5<Яё Daтяє╩+╙▐▀АЕf┼ЛРfЕCз═Ь▌&╡╜╣\i, ЙП╧▄ єЖ ╥&НG╤0╢а┤G╬ЇъТ6у#мe┌ УЬ ╠щYsfз╢kЯ\к4v{OH└vтэ>~┬ЙcOpьaЫ┌д╔тн[q}╜фВL#╚lВ75e└А~i]ёлЧ),╔ащЇo┐+Uу!┼SХ▀╜ё▌Je╦WyЎвiЕвEО6▌sgXЦ═V[ю╤у├┌vЮ╖^ЯА9* KK│n╣тЗлр└└$8 Ъд:░LrШL,LЯ╨K9Cъ /-^╢ў7╝\О9t█wQfўЦЬ╝!M█М█╕╙A@Mj╒j└{+Q,$Е┬s&Mk╒ш5g╣КXu¤╨└фЭ=_ё╢Ш╟kИПW┤▐┤")Лт└БЛ╓VУнD№┴ ЪLz▓S░ЄС┐∙}т╕ёГ╓/AIN\AOxLг├╢mugu▌^х┼4ze╥';0 3Р█▀ёйn┘ЬХLB┤|■Ч_6мX▌k╩d$GztэЎЎ╘┘И│a╔T°╨o]√їЬ√∙Ї"зK╩╩др╦в·╢l5u╒JЕФ╦xэ¤9k■°ы╛■?х #`-'NЎъ┌q╞ v"Ў:v:2аC╖E░о@вт╬Ўn╨p·Ўн╪u▌a[<~\▌║u╦=Ї~<[∙~)Ї╦ЮПян] оОLы6r╚`°Рё√Ехв╬|√]╣ЗV╠9MуЗ шЦЪъ(_хyqФиsщ:uЮ┤}Л┬╬НDГБгёРИХ;mрр}A¤с┴ ПЯ=ХK╞┤╞j>╛ў╗MЫ▀я?-╝^лЎЖ/┐╞▀╕╧Ї4oяw#FНЪ k*XbГX@юё╡jЄъ╩]сЧтqгЧ▓<╞ЦЕ│Жk█╝Е :<еМWсю╖9yиB9"юЄRУyюBbУрs9cЇ║xrZ/i├аgъNX╣ ХO╞*╤ Я~шp╔√ю└┴╠бOf╗5k5╛\╝├╝├╫╨Vm╞о]Г╡"БЁ№I╙Z4~═^б"■*б│╕1█╞>P_л=tЁ░е╩э(+bxkJ·╒╟jm№Є╕╠с╚№qу;wыБьNe$╟+о{┐йTє!┼╘!*fч1╨]с∙В°[ЛЖZ7~y┼g{щ ╥ьдЗG╜(/8Eв=HrзЧ.xw^2Q╩╨}·Ї[-[м·с;еч╙Rn-q#7╡х}№рг╞,╪╔Л[╫┐[еL∙;Юy┐}°B)8z─Ў╨Г:╘q╦сЯw%с8Ое8░[н^п7>) FЬ╚ў?╝√╬╩V3зx■°}хМ=`╒ыTJТyС▓;B√~┘░nmыicє~∙u√▓╒н&OBл/rXьHРGvь:╝▀@oЮ; ┼''.Y╣┤+м╘У0;√╙■ у╞<м╘╜)▌y _i╝xхЄRw▀Щ┐C}1▄Ф 'ч°╩'%┐┌╕╤┌w╫ц─"╟ФнR3%|┬Ф^╜█╢ogu9╙326o┌╘gЇh╠╪АЛM(;DЗVm╞╠ЪAЩ nпўЎАЕr44Н╟^СJQ ,Ь<эХ·/є|кV6xHо7oш╪1ею┐ю╩:rШХiNFэZ╢Ю┐x o╡x■j▄ПЗTЦэ┌и╤Ф ВA┐╤hжY╞Лn╪╝е╟Ёс╕`X╕" пїLнюл█с--yc╤═█╖ў;ж▒-Ю=wN╠ї▌_в╒KН╓о[ыОyЫ\Yй/EOэ╒╗]ЛЛYвсXx┘кХ?■·єЄХ+Щ╥eI╚Ф ╥▓C*Фк/╠Ъ4ЄЄ╪дД/QуeшаДХ┼mЮ}vцдip╤╚┬сP\R╥мs║ПлHн eyT╧>йэ┌╞█у2/dpЛ H+Ц-S╡iт┬пЖ :~№xКeм6Ынb%nЕ▓IЭ╨>u@ясH╠чr√№Ы╢li?jT■■╝╣┘k/нє╠3v│ЙЦ─p(░~█╓NS&q ∙<в;0д]ч┤╬Эл╘пГU№ЗO┤ы▄qЁ▄╒я╗ж▐hЮ╟ШР H((КЬС#;╨┴Д╞╚Т╥F╙╕┤ЮC 9}№╕#>┴ n▄▒н Ш1H6╔9~b\╟>у&О│▄[8zрЫ_{wя>d▐ЇЄ5Ц]bїи п5jd▓:.dЬ7ж$NШ9m╩т%p> ╜7╬% 2m└у%е8,Ы(░$Ц^$6╖[яо;ўч$8Э;п¤с√╜Ц-0TнЯшш╨Ў▌ЗНf{цQh╒Ь=▀╠Щ3з╦иA╔▐#|╝'╨зYЫ╗■П╜ўА││*є╟╧y{╣¤N╔d&Н▐Люъo]uQX@AQai ДJ ! щЭZшEE@КАЇт┌`ХЦ@╩$У╠╠╜s██ыяy╬{яdр■Їє▀U? { ╟;я}я√Ю·Ья╙ў╪k┌3╫o┘Ш╩gя╛√юKц/fба╚хчЭw∙Щ╙I┼Ф_╩цn╗∙╞7╓┐3w┘Т┬Б√┴╡╢o7кu RзЮz┌эw▐'s,p┘qЭА?╕j╞МoЬ°н╬|▐мж гя▀ў█w■0cїтюГўНлuзRЫ{┴еgЬq·nЯ ,рHуўo═Щ}┼мysКЯ8ЧM^╡`┴WП>FSTЩэ_QЦxЇсisfбxLчЮz┌е\р╪^6Ып╓ъ?}Ёб3`~У(-О}эКх╟uФ3R▌m╩о╦/Э9Xk,╝¤>ЯУ2Mг7Кb Ш┬▓п"╟hTJиLj╞тNюшщ>щВ│фbvу└Ц?p еKЧЖеЯ╔^?o■й'ЬdWы@vАR▀╕Ўжў6╝?kюЬОO}2╤KT╖╠Эu┼E^(I4╕░╟n═▄т,фъЛgЮЄ▀╩╩Z╡Z╒rЩUWнЮНd6ЁьЪc█Ьpъ╩e╦єЯ:ц╙·▌ЫgЬuц╩╗n╖▀^8┘^x├YчNЫu┘{ЇОв_5|°СщЛаеЭЦ╫oZ0э№┼Лj√яМk∙7┐;я▄ цп╣j╙░Є№= ул_S3щБн[╟Mь╗d╬мХwгg @║o~─н7▄─ELkФM  шgў_╕lВrU^b■Щg_4уB╫v3╣L╣Q ёCўЯ}хЁ│З▐~oЭвъжыь╛чG¤Ф█▒рd2р*М╞сs8BщСcQЭwЎ┤юb╖(ёз]0cї┬+m?Ш╡p[╝fх▓Mяmъ*фЙSЮ3В(▀┘q■E3X8╖ЇЄ╩Ьр╕6ЬBvрIкr╤ь+HЦн ╨Uu╬!_Ъ │яZ~х6╫LхЄч,ЦuШ_╦w╓мY3┤ю¤╔╣No░ Gщ.l)╧╗юz(╠bl▌╝tiн2Т╬д\▀9oщТE^└Лт╠K/G)&5А%8ыЫ▀╝щю{P╣ЦДc3ы9VТJag8И▐кЩЧД╢╧S@З\ВкЮ╖t!;№,Ф=╙и┤i╦#?{ш¤╖╫k▓║v╤т┼═#фк╦/З╔┬D8о│█{|∙шпд'M─╖[bP\?k╢Fеjmт.╗Ю1cFb┴┘№╣ч▀╝jхцў▀ы╚eEЮ;{ёB"qшs┴ s╬Ы1Y╔╕Ц=u╓┼дР┐·┬K ╧ыfт°╔А}сЇт5-ф╣Q(ж/fQы┬Олk.ЯA╣Zэ▌m╩┤Лg░XМИЧOЭ┌╚┼╬┬┐~ўД╛]&▀vщ┬Є╨аЧ╫gпXМJ╠н╛nY √┼НgjЄYчOЧ::q╒йhc`╘M\▐cв4&D█ЫеfмЭ3╧МBI╬Щ}х▄3N█єаO8√LвжЯs╢╬╔Еc┐uВ║╦ф;ц-* ╩]∙є/┐4╓д┘3.╔╙,Z1ч2ЗПe]╗VОс`TjЙД╢}эХKищ >ж`>{┘Т╒sfЩЮ┼╩х8Г╦ЦY53Ч╬Ф╦NАсщщы¤╩W┐ZАЙbєц═╔e╥■`н(лз^4єцUK╝b·┤єж*┘┬uєФ6lЭ4i┬wс╣ю5│ц┴┬т0F,╔╕E /Э)q╝,┬■mdє╣щ3/!мП G├л/├qоМTзL┘ї╗═hZмв╞╓Е ~┘┤s` k╝ЁЭщ▄╕pбУJЭq■╣z▒;ЁAUАС)НL*mG╛╞Й╘q%ОK,h/>Ї░П¤№┌+/ Э]ў┌у╚г┐RЬ8G┌─XТ╫╬Юу╓МФд]>g∙▓U_$j╩╣sп@Тш·+/йWкК${╦Є╥+fУФ╣╠ЛImуц╟|x├█я*КtЄвеKЙпы╓Wп\%VmСу╧[╡$иT╓.\!kъf╗: ъU8Т(┴oЭ5╗╩C╡ъЮYQ5Пє?gъЇ\╠wvts╥qЩ]з▄2w■╨ЁpЬ╤]б▌╞┤м▀╕rХm█└8ax1\ODwї·ЪХл`й├{1$ьг=ў:Єшг╥У'уs-Зmсъ┘ЧЗ~4R-├>:єт ╪ц┬Н╦g^О┐Й└3mAС/\╢UF-╗╠их╢│Ш┌жcжЕБ╛_▌▄ ─O┌Ї╬;╞Пы9ЎЇя^│|iШR/\▓а\/│┼5g╧╚КJ╔1╩о5ха¤?цШ ╗L ├уVЛ`иo[╛в =╪┐98╧Z▓[╒v%iЧ┐╖Єqp0С▄utt└╢ю╨╦п¤k┬вЬ`C)^б0<< 5|Ж+ЯВ xсЕц╧ЯawЄфУO┼~ё┼ |8Hш]KW|√▄єЙп╜·ъ3зЭ╟┬║ЄHLb 0zє╩╒gЬ|{є5╫Ьq╬HvuНсPГ╞┬║o═єHС-(`Pл@нd┼╙YЙ uvI6$\(X─╫РiR0C A4╪К+П.в╚D6S╘k$═XC│a:╢>n╞йiz:▀[Ог))aАзkиЧAМEWЗ╖g╙кH@>╩хr▒з╛ LKTGЇФд BD╤P СЦ0 МСrZ╨ FXB└ЧJ╒╪┌Ик┼ Ъ0вn╓2Z] #ц{(И0╛аыFQИ'УрДa└ BцгZН╦вГ9~ХN7 $ь°ЗОшZєэA3Hї╢╖▐ю┘{o╕тМ╘ХbБМО6wз\R Їs|ынЮ}ЎИ"/Ц(╝╦╤Їй╒IGЖE2G[двёIСНС╨ў`зЬr13тdqщ║ў▄ #╖UG─ОжшаШ╤╞п╓D1Н6T*■Р▀R&ЕbШ|F╖╩MRЙи─ГC:┼sv╜мОыbвAC╞nrох╔Ъ╥29ЕI я-аAОЛжf Ь▓Щ╕К╤Ж?0НФ╣╬<Вцt+бЕцИFi[кп╟к▒(╨.Js!1(╫ДО│╡}л6╛c╛ХР╞ba╧i╦T├їB╙D╖ЮШma╩$oЁyдБю╥ЁvлARhGЙ0ишJ3╖n╤wщcНЇaЇ№zCьщаi9жЦ+ЖfГз"a√╖62Ьээ╓┴┤lн2внo╜┘╗ч>╕HFкl7╠jк#Е1НЕ┌[ofў█З}[%0╚═А<й╒ИЪf{НнНбaЇbqmаЩюHEVT ╛38Дл!/P'p_@=Ьб!%├о3zЕ─$┘GД43▓їн╖{ў┬┤neDnю#ЬраZ╥∙жР(&Б╙ ;В1╔ТИ№░Юv#нжhHФЩ╪╠Ж▓└зшЙ╟ощ─Ч╕МдЫнчдП▓SО9vEЁ)╔░\тs9Шд╥█owь│Т═vаЩv∙{+HзiЪ$Iп┐■zWW╫лп╛ЪфЖВv└Кт║.╘Ё8"├0╞П °уП/Z┤╚ceу╞НА#■∙pРЄqеN╙dUЖЬf╔1G╙ж╞д10ЬююД?Cхt▒╕#* !Й▓▓y3▒╚├▓cЪКв'йZЫОm▓дьЩ╛╤@┐ цЖ▄╘гМ,J┌ЗP╫r╢m┘:a╫]ё└Cx┴█Х2ВvЖaDyМ?  ь└SXО╫ Y`oг╨xцC0Z▄t<жЮmCПй└aЄM'>З╢Ё6╦w┬T┴ц┴гЁЦ*▓8╫╨DW.O▌╪═ьC│аbq(RЧ%~рс$Ў(P.Я·В$╥╤м╨л0фZвйЭс`▄(АБрV╦цАLGQ╦Є&j ЭAUU>╔╧СXй√8м▒ытC╨{СЙ`mб"╪ъV+2 р$Qш ▌ы?Ш╖ф╥K.&Я╪M│ЇTjЬё)▌p QТdОu╛СЇЧЭтФГ Є|19▐фАXтт└рn╘к├[│к╛y▌√w▀yч╣╬Ш|Ё'╤q▐ОqЄ╪сh[кЦJрр╬щкBПЭ7bXн#:╠dP╧+br╝жuWрI╦├▓_p╠ыИeV$дЩbqмЬ └8░Gв %╧чЫу╧ьэLWQ'I√╪FГЦ┌Ъж6╗Ж┬Л╪П`u╪h р░'2└L\| EЯDQВФD3┴P2ъ╪AЫ7Ы>-vTWY┤o╬┤╠p ^╘Hуъ╚·"1l_еlщ╤¤╖2м$╟ NLаЖobТИЎ╔╕"╢JвJmдР═у+Ё╒└R╒ 3ЙуБЫФ`Ц╤3>N∙8d▒,ЪоЭ█м[|T╨│╘ уЖA;ТИШаУ$ишУ. s#& ХY| г╓Hщ)Xьfн&PANе╝Ж!╧А <И[ЬЮыy█╢-={юКr|4E-1[:Щm╧Б?dKШH╘ <9ЦX|К@ВR╦24-8╢└ЙЙНrв╢]Л╩Т@ya4б\╠Тg└TR Я╬Q▒ Ф26g(ОЩє3Г▓А~▀─t=YЦ,▀├ ╘!ЖЫ╬░ ХWo╗·┌sf\╨ё>ЩDh╟╝3A ЙR▓▒═╒zbдkn╨x)rг<3Кcp^;╡:·T\╦ФU5!╨Шn'Б├■┼еБ∙{p ╞<ЗAлЪ╤c┴yє∙ТZ╬ =>ОT╪GО╟Ъъб&БЙ `└ыVC╓╙&╤В╪o┤Yдu╫ cк╔ ▓lМщК-УнгI.;╖I;+I╗№╜ХПГГ╔1ЧNзM╙|фСG^|ёE@БЦe┴аЁvoш"pо├Щnо│'=Ї\|уН7■|8╚R╗!√ tGfT!ю>цАЧ└s;иjТАЭ@"цp└4аВ°┐h╕>вg╙pЗ─"їb▓/├$z╫1eаb@Оy>░,. |єЩд)╓jЮўФ&с |86сEшE╦▓╜Е ∙╩к╬ёpЬЄ╬Йm6ъ-с "KC┬╚X╢$Л4╞СТ$ЕїЧ╟ZРрZL┘ ╩С4пRХ╞ў|шb\2p°г╡84/БГ@№зл╧{─KС├|X─мПИЭЕ√╦3(жЬ▓iА┘*FъЩLО┘╨─Ш&N` ,А jТЗЮ#нЛ └)@о6RRЇФG'└qИ]e!╔mъЩОд3ф╚Йo%MжCQЪ6И-╠mVJzб# ЬR╣| Эўм√хє ·п_8ЇфуФЮqLЕ─53-3▒ 9Rkрь+ИДc└)вЮ│E┼,ї|/▒╦м╓+Е▀so╗сжНo┐╙Э/ЦKЩBёфS┐3~П▌^бf╜╞╦ТвкнИГ╚J┬ ЬЮAфЖВ(2яTх▒G╓d8┘КJT─╒гZНe!Э╔$░ШаH╪V╡j╘ars╣О;БaVEь9╢&кшНk┘Ё|ESТqФeTiьXNр╗)MЗЭБ.ёa;ех1╤#╒М1МvT2─|Nrx╛т┼L╗ОЫъ╞"┬ж░}┤CШw;N╝о││8а╧╨,Ё:e∙ЧCЮ╘H06ЕЩу"ЧrAьъLpЗn)DH`|6]╢j9-k╒к-Эq°░\пЇf;=█2C?Э╩ШЦСБсJ0щч-Ц─ Юd№k╩Е:GНПN} MИ ╫RRЖЙЄ=k╕жww{Jє n├▐Q┤к▐╠Е\Hc▀D%жaМ[j ╒·qМo SDAKZ57КБа┴<╒jе L<╥!T╟ЖЕYH╔iдu(Ы# B3&Н"oц└р╧Є╙Я№┼^√эъЕч╔░БнИ╝8КмБeйА┌б│ЦГR4fс·п╚═┤╣IўCЎTБл7ъ░ё%Uе°ЖPE,Y╒-УFр lШХ|ЎX▐б+OгСуt─vкXї X╔╝╚EЕ R XWI1ЬВГф YсР%├L20"ЎB╗КpЦMЩ4ЮdQД=Зфо╟Ш7&f╫IйгB I)м@аО┌█О)╔Шч╨4lQтэB1▀ўАЗДC(v}^bi╓У¤+b6yHУV│▒Ём╦;M _Т∙=Є<╠Bшx,ї`/ЛЬмл&1uRT┴1┬O│├@т%Мюр4Тмтбe╙иж╘ИD/¤wI╥█е]■ц╩╟┴A@~∙|░а$I'Я|Є·їыGFFА▓Л┼флэ█╖П7j° W:;;л╒кв(CCCя▒?|ў▌wЯ■∙?Ш ╨с Уr┬ВЄм╨( `b№╬╢0Р▐ЁlHTыЄ AвY;A╩┼г░,DT√З└┼ )╞v╞Ў{;уи *Я─uМЫЬ│ `Ф8\╙╠ъЩD=╩f,Q FА╘t& NFБр(5▐лЪН┤ог─! Ч`*╦мiЩl@Bl О!│HП╪=г%▒еZYбGK╘pl uKF╡Ч└╡(·Аь ОЪ2>┌▄{р#xs,D$є.╫Q═M}ьЧ#аЇ1х3 ▒@╟╩9├.Jd!ЮсH,8│d6V\"ВМ`НBСЁсИМЗbУAЖКh8гp)─C]╞J!Ъ#`Їа$MмiY"╗[╗ZЪMзQS└щЖбхЁZ0 Zk╕Ц jQг╞┴╬Ви├1O}╘\F\b╥┼╗vГд╥Ж╫( i╫j╛AУ ┬K1┬-┐^ЙЛy;▓3аЩ╚Gёuф█NF╒-╙╘┤4jtЭ┤╦57q И╦╚%║╕▒QБ¤Ы%*▒Аощ_BU ┘stYI2ЎV#W┴T@\┬╠╕Б├Й░гc A <%NVH"5ф║QжeНП[яНЩ&Ч¤см╨Цx·аБё3L╛ЛYt╞ы┐aўLМЫ"КСєQ ╦о╤└╤QTDН,LRв╤─═тKЖы$цхбtG╨╦qY бж╚╛хКК╕ЮаH╢HQbF1Т└ШКд%<╞ э.╟╦Vм i╓S╪Ў╤b╣╬%ДV@%\█БZU╡h∙5ББ+ =╩є"ZїДqМB$ъЗо ╚Ё-, ЩiLh X Б╟МєбЄ╚l7ўiт6|'╩0с∙@IGQ╞▓G╔╖╦WЗ¤ЫJ╙ЦА6╤fMMgС61╩├11▀ь2ю#ш┐У╚НХFЮ╦ЙbBйАь╫G:2!L╚$0╦Gш5К№ е╩M<Ч№Cг"├▒RJК╢с`╗№╜ХПГГА╛*ХJ_╥ o┌┤iп╜Ў*Ч╦Ъж▄w▀}_~∙х╧|ц3п╝Є |Ж+щtz```╫]w}чЭw>¤щO├пю┐ ■ёу╟?Ў╪cМT╠E╠dDjэл╓A'p*╒ЎrMсDФ╪КEжe╜TR║K|╙╢▓ж╥-C2k[<@┤Є┬3░:Rющщ┘ё|Lо└вОв7╠жъj┘╬V┬═╕т&ДКYвЇАЧ1}кe{@6tЙнчZНСg.Шp°Й─╕t╟vEM_uН╨єєTт$vдE─СYnВAВх░E╡a @С)n▒■<Ь╝Сa5оe4Хg"Бx\ >Є╢яТтXFZС\├тHKщ▓уЦ═Z+{яG└AyQHTs~╘╦╡о╬"№▐%┤ь╞ТPГьШh│╪┤Ч├#═ў}YbЗ\¤пUл0┐Ь┘qР╚Nч╝]7rй|в─(▐Й2жж)\hI1vШIQxжTUUЮ ╠B─╟F╕E{q!` ЯХ╖зЄY9Хhаих╪╝$ЄЬ╨RЛ'~Е═■╞, Jт=╙ВзJj╦*О6э╨ёf/rМЬФ╝╞шЮMF5_ФЦЙfОєL3М"╛┬є:nов$∙ID|╣╧ РI`ы═ЦLхп$бН ╛'░Ё▐ЄЎ┴ёZ╤d╨░LЁ ▄к@4]═2L╤ьFKл;jD╪&чjИЄьРЛ▀УR*╟t╠A╒─@ФЪМ└Zл[К$╨м╗FзЮе-│└Ч ╫H▒00nАКP∙ПIb8█rTU∙┘аг:Sощ·CZъцШAgЮўMCDї}s┌же▓35╞NХGМJO =▒j╛-Kjй<╘Ыяа4ъдШA/Ж╕0O╓їDЛ║╩r%Э/Жо╦ЛqQК'bkЫ╞{I{l├Ф▓║Б√7T пгфяЬk.я┼F╫CMёАY═er─r4╢┬ЦuIг╤`о▀▒ф╔"я9ои╦cM6)DЮПы▀uф┤О╩S │Ш└h№>┤╢╨Х0N$┬ш{>ЗТV╝!░AWбЮыJвцFaП╚кe█╨;%н├n`:┌┤ДcФї)-Щ¤ЖcgЧС╫л╒|G▐w|Qc9П У╘▐╤╥Х( █╚dPFl▓юdb▄ хq▀╒=АЖ█═Zч°юd╣Е╔Ё╕є}ц хан 3тмЩтrЇЛftмс(Ъ─Бiйlvt╕(*и-E╙ВўюX└╪~фal╙2 4M`"Ёd╫Оы}аyш:i5Э└ыИH╕жї(u [√╖ЙЎтV Y"╧Л1рQR |╝хX*╨У ;UXв?├┼ @}╦Тa▒qВ┼К¤Г▒у╓UЪ╜RS╟╘.эЄўT>zЮаИWW╫п~їл)SжЖqйTЪ4i╥kп╜Ў┼/~а▐G▀┬ХН7 |¤ї╫с╢Г>P# ┼ббб▀■Ў╖дM"ьzp╛┌б├ x┤"╙ўЕ!$▀ўД╚ ФDэ░xаФR▄:HуХ╕▒╝]nр┴п5╔T╒4sz╢iЗ╩О6eД18`T╤B▓e░В27Ю╪y─╧vн┤вEбпlu}J5т╕─ш0F┐О =%╢дOиЁАч├A*6г ═p-рьU▀ёD]u┘U┴vy╩(Й@- f3ж0л╟╪qm8╬╥*2─о/JBО╙╪yМD┬(5┤}ё#вqЧ&а┌!R/Фv$fСIф- С╔x>·L╕%ё╢ы▄Lе╔`AORеdx}?"HTeг¤;ъu╨\ ниЖїj╩9GУмх!#\БJРчM/°СШ°УEq\╕яЛ/hй─┌▀ї"YRJ,+T3|┬aу┴n√h │CCA╨▄Ь`<6tМиж БтhBдP:D$pЭвъА$GL═R│mиfА╧ЁЭ@╘леQ*ЕGn╘д┌ЄЬ(Р9fSИj─└Ч╣-ZР()ыдэp║bpбх:]КNЫjtTyя─иmo∙M'N-;M>cykЯI%0+>bрХЫДУ4ЙаEФч▀ТgАОЮ2бК,(^/╪V#ек1НG"Wт╨D1░M╞^╞ьv└Ч%▀╥EMdH /М зИ ╙╠ыzsUєд╕RрgЦи)ex юЙБўm`фdЕMЯ дЪxНр№2┘R"═кШFЪЕ7JTБ┴╩з╠$Ъ╔лР%К%ОКШ(Ї)S%┐AБaCYГтФQХ0@║!ИЙt╡╧I@╘╬тFwуH+Sz6т;dv@ЬАmHЬMЄзг ╗.гRЙ╖XSSh.Fz└ё^УUє▄шЯ┴├╙в┤А¤╡]ORдQй!.л#.щ,З;4═,Ак█б╧─∙MЦ)М|xЪ─ёСч3¤,кoАHyь╢d╕т BуgЧ ┘МЦя╦ьf`дUчи╣ь|Кh▐з┼╥#сяc║Cv█┬ЭдщS╚у:фt╔!▒с9ш╚Х░╡aмЁ└в·З6А~р&DЮн■цЮE▄F╖DЭСp║Ы┼]ЩGщt[U▄.wе▐°h8`x)R╚<▀Ь╨7aы└V└└rРH№ОбN>ST,╕Эу║ц╬Ю│d╔/BфЁГ{я█w▀╜я┐ ■∙ ╨u█▐щ╫√╥+/╞¤─БЯ@C8cЎВчЦJ%MW№╨╦f▓(} |bЪчў╫▐ўc8,O>Ўыw?╬К│╚╖Юя╣¤юW╛q█ўя#в|╥сG▄є╩KFйA0╕yУ,Ё┼BОш╠┬з╘ч%╗╣sm ▒$Ь╦╢LY╓┬D┌чбК└tH┐bЄoЯ=фё_@уB8]ц`╟ШIRЛЭ╚у║dА,)╩X├С:╔б┤╣q│╧шъ┬и(Ш\лбёЫщ]D╗5G╬c&=Ы)7kЎ╚x5╫иVхФЖ■(ДФ#Е4F^0░#H▓щШ9%Еz ▓(г°"╧'∙]Шqв`ПeгfSI╥╥╝oвlОчъыпч║:+█╖ц?q╩]<_P3╡║YdJ╪j╣жeUm╟╤(з╤из╥Y+t^цЪ:h╠▌┴╖дqaKK├ZИT9hIщhKB9К╕fга5*▄ї/гfZI┼НAЯ №rЙС°N@wlє┤ж╣╥(@l╜¤Еє+yиYv║э├е╒6╢gН>Ёe4ц∙╔=дхЄ╥J1=dаvЦСЦ4sЁ$?█e·Бo╚Шnr╔RGД┴■_n▌ПДи∙УИ4-3Ъ-;t\єС;·Ф╪hОZАНj│Gяр[+aT~╠'Цc·8vF╞Ўzь;#ёШї}╘=;╜qФ РОс╬"c╪Ъц╪c~з▀щЖиi╡╢СР1ыЗМY┤ь:Ч@О─·Х=3эь╪▌1╢МЭй╢Цг▀╘hLcvZъcvшО√╥Dpг3=╩О■j╠╛mє&Л}√╤S3╢ ё╛№ш~\▀?4■╔їДНЙТ╡┌lR▄44КG═Rvn╒ОkqkmМ~O?8Ыд╡ътfЬАў╜]┌хяа╘Н?Ж:У2░iєж╔'?ї Жб6БЧ╬чV,╦* Юч╢пk╦ЛП?■°╥х╦ ╫ Єь│итg~∙╦▀xл╖зўеЧ^ОcДPЙI1hНоы├├Г┘|F8UQг*z.)Uо]║№▄ЛЙу▐|¤їg╠╗Н%aд4Xшъ┌Ў╬╗w_╡ц╥┘sЙ▄╕h╔╘ЫoAcч08я█'╒GЖя└\aшєт░e)Z e5оСЧ╒Є╢■оюn Бa Щ\йfдєйс▓╤SLб4 I▌║b┘i╙╬ОEЙжt7▒╫G╣#I┬╞╕hП3\ц^t╖oХ'Ї\t·i#om╕¤Й'с▓_)Зй╝PР+^мIhъ,Gф¤╫^▀хА1И рJХ7╤щ е x ;Й3BЕЭ┘YvВEu9╙Ф80нТ.A п.q^C╘ыЪЦЕz:m┼и;9!1╢Л├X\kдоe СН№k─<4у╦в║hуИ^cu╤oА╪!QD╞ю╞Н7-]&У°═╖ xэ}▀#у:И T╨еCЦ╩Э]EшмGБ-П0╫GшGяD╧KSАбй532k╔о╕QУ8б ПFёL╗n╫э║]╖ыv▌о ju╜a|▄╖Qф▓ЕШДЫ6їOЮ4ёйзЯСe,Щf├ў├TJ CА>`║┤к╟v$ётc ЪЮ8р аж_&ppыцў╞ўЎ╛№┬K?q└'р7 T$╣\.зRй8Uj4jщ╬N┤Ї ▄3√т┌G'ж3чМйєя╕∙ЎМЖat0┼)_9·╬[n%Щ№G|e┴ў~ш║╛ХC▌w╬<щДе?╕'МЬHKYh!.г-гГШ╬3ъR^!Фn■├█1╓1Н}ЧbP=@Й&=ЕГьU\┬k№░6э╥.э╥.э╥.эЄл■зр`*Ч╚▒eS▀фЙ╧>ЕpРу╕p0Э╓╖oъююtпZлщЩ4/HЙt╨umО#O?√\Тдn╤В+щрЖН]╜╜п╜Ё2<юа?A#╩"─В ╕╢-+2 С*╣VC╬дJы╓e\ы╝йg▐°├╟?їШo▐ ╥╫ шх┐^zab╢у▄│ж▐yчэ╘▓gЯ6mс▀'╣жlз1═K┐Є╒e?ўo░┴д┤kП=╤▄xд*t4и6ЖR{M"║D,gєр░ лу'яВ╢╠├C"Н▄╥ Ci╥┤жQU┬гЭ╕Гс╥"┴rЖ7m\ШWUОУлC┤п(wuXД╡┴Е ~ц═?║┐№З╫Л}мC═h/╞╩ю¤ў&M9¤░/▀ЄГТ└╖╒кHz>q!АэRЭ╧чИОк-=▀╘иТнямSEй╨╤╣eєж\1Wi╘'L┘¤#1·л4╕eKw║Иi▌9tЁл╛■╟lw▌╜пZ╩х╗ау¤╧╝0a╧)dRзmФ▐█┤aў}Ўx{▌█√э╜╖c█бm╫З*╜уz\╫5L╦ гq'Єш Z╒xSЫ╪ц▒Я√Ч√_{ `0US>цыр╝AжЙМ╘Нъp(G╧з{&`╚lлбНЗЖ_╥BGO╥─в║ЕpTmй^■Д╖]┌е]┌е]┌е]■ЛГpЁгKEZ.зЎ└ж═у'O|са№Ы▀№&Ч╦IА▄\╫ў}├0К┼тn{эY ,*a╬тХ╦Ц┘6цN°хє╧ё$~ЎАГ шЎ Ы╗{{_}ёe╤Г<не9О╞,Ъв┼їбэЪк )Н°ю╜╫▌P ¤ы~гfйт.жм{ё╖√ю╖▀&┐1¤┌Х─2╓^│ж#ЦЮyЄ╔№┬!F╣╛?0n№фmКt■m7╗JTeцg┐╕tхъkя╕╔UХFLO:ё;╗°Пhf аNфg¤u>tп╕zс@}d┘ЪыSЭЦ\w├ ╠░$╝т┤яИqh╓j╦ю╛├}▒tAф в@jUoдq▌▓Н┴╥дBч)зM[=n╣S^tчї├V╜3SШ╢▀goX{╟═k╫Ш$(Чъ Ї#"Fqix┴Ь9╞`Y4╝)╜0Ш"цvЫ№Х┐Х▀ГH╙'2╦┼7%fq╙жЕЕ╤ъK.√╒╦/▌ў°ує╬;OOы1╧M=mjz╥~,▒3єтЛ╫= лЯ>є╤b╣wL┐x¤Ў-ЛЮ°!мvP ¤╜Kf╜Ў┌+лn╛╞К▌yp¤√ы2Щ╠еWп&##+f]nЦыєц^yыї7m╬wuЬ}ё┼$Ч╟К╥иiIlw▐╫┐z═¤?&Fм-Х*]╤╓pkЙ8╓ўo╛qа▓5╕┐sF▀з?╒МЮЧ`╛Р╣BЁнМa;I█X░]┌е]┌е]┌хoжXж▄▓isK:(Яzъйшk╝╡_$@tОчМ7■{?·AГє8xэ╥e ╙ўь ╧qД> 4ГГ[7nщщы}ё┼ЧQY|р┴qDУ@3╟yЮ# l.─, vжзлЄ╗ ╩ўM9 _¤ЫЧЙд.°З╜т╤GIW]·}гОlнмЩ6u·o'оsч gЮr╙ндлHRСBR._∙╒oMъю>хоЫQ*й ╧┐xЎЕ│HW'╤ВЄ{я╗&Э¤╣╧фvЯx└┐r№┘ч▓шж№╨╢m]]]L_Т┴mчЮq·╡<╫C╟жZЪLуy╡7▐XqїъЕ╖▄Ж@╟П~zцyп╛ё╗пэъ5╙(Yv·щч^4C=ш@в╚Ш╘8Bзыo■sw¤шдwє+Х╨╡с█╗стЛз-ШCzЛD +/Ъy╥Щguя┐_╨и yЦ^,1╓ї@ha┴─!Аo]Л█u╗n╫э║]╖ыv¤╫оїzТАє├uG∙l."ёцНЫ&MЮ№ЇSOIК асЁ#■═6-М╣ц√ь╖я-ko╢C▀с>ё╪(Ю{■Ч<└┴gЮ[8}╦цЮ▐▐_zА 4ГЙАу8Тqд<,Л|OwЧe6╖O┘e2┘^"ы╢\w∙хч\┐Ё╨кoOЯq¤Mд7OЄ╠3x├fRПЦLЯv┘]╫С\v╤ЧОЭuяПИHЗДаkЯ╔$Ї/?фИ┼=BtЪu>[кЎ)З}ї{╧№ВyD{5o╬╫ПЫ Ё├$ L█ў1ЫGoМfАлSQ¤√>▀/Яa▓.гЫ`bP{ю┤│о№▐нhъ¤[3JКЁщєП8№ъЧЯ(U╢utwЧ╠:фиE?·!ЩШЄlC▓°щ▀№ў5П=Шб uєвуO\∙уЯ^┬4а▓`∙N,+╨ ╡└QЄпYШК╤Ї╙=ЇЦ'Яl╞Ж╩еK╛uтЄЯ■└щeI9■╙Я ╤S╧▓11ш9Я?d═·ЧъДдk╟еаa╙┐t°ЪЯ├$Ю fГ└~╒кh┼ш║зy╠нП=═# ГLш└7єЇ3Цо╜╤в8 4КY√.:ю╪Х?╛є╕xШcГ°┌сЕЗ╣·╢█HJ$╒эЮkУ\чyЧ═Ъ╖xaў╗yОS3Н╬ою│Y3єAЖ5cЪф%qТрп╜Ї█u╗n╫э║]╖ыvЭ╘ ыO┬AЭ┴┴-Ы&їM~·YДГpъ/yФх╪╗LЮr√Эw╝ї╟7w▌}╟wAxЄ▒╟W-[n[О@°чЯ¤%Gщ│╧<╖h■B║n`coOяЛ/┐aъO`bДГш|кк▓я╪AшеdE╝°sNЯ╢_(оє·┴{HВh¤z¤nУw};j╠╜я.└╫Э{!ў■P╡Z╔¤╙▐¤¤ЫЄ├v6Sм23я║╔ч╤5uть{я%nЕМя┬8eб0єШo-╜я√6WWuЩ╘├щ_°╥ЪGЯ$ЕОD^ЕV{Iь0#&У┤■э;№о'Cу=№5┴(м∙П╧■╙╜/¤ВдX6^╕s{увOX∙ЛЙ╩╣Ж% ┌╠CОZ ░iЧмK"┘вчqЇ╡П¤Мx&*Э#Єэ■▄]╧╛А └Sg╞╨┼░у╝DУи/IМ7ЬЦVYO йЩgє°ы°)f┌3ъ$У&Q4у░/оzцс*o*кv╤1'\w├MдР╟Р{еhї┘зЮї─]Ї╞ (еx┘╫┐╣ф▒╟ЛГpгyGh╟g~∙╪╡▀√>Iep 8 █u╘сЗ?·╥sФ │єЪ╨ИУ¤┬▌┐№С╣╪uиЪ┼V║ф╠╧║ч─ Щм║н:Pшщ)┘$е+п╗.r,.нAo,Л%*ИIS=LiУ,Й°╩X■ъЛ┐]╖ыv▌о█u╗n╫X╫э╞╟}EaN╧╟$┌┤uєф▐IO=ў┤,KжiН╫]йTП?■╕xp√Ўm√я└√я┐з╔К─гtp┼▓хЮуrФ{■ДГ╧=¤▄ВE щ╞Бї╜=}/╜·КE√юw`LБGe│чyВ╚ЙhF╤єыjШpП{▐_╝ц┼'т\r╪q╦|ИДu╥ЭG`PмЮєеCп√═╙$p/№╥╫V °Т╔8NЭ+д$тЯ{Ёо╜эv▓ў$╠ еi#╖п╣h■▄;n!i#&йGЧ~∙╪eO<ГВ:?D╜эипkU╒3П?~э╧┴└жкД1Qр·pэЎ┼ О┐p*═hZоГ╘]Єцжy│.Эў°(▀єBb¤╙+_|&LгО7╔╖ ╧gяzэ '╠a■ї3=№ц╟~БB╕b╞Ўw7ь╣ўЮheчвщаK14K╪╥╙c№ Ш`Т]Ц=э╕C>s╫Э╖лSжР·╔ч╚ЎБk/Ы}юmkкВй*·╖∙╥}O№уьX.∙э╞ЕW╬╝фЕj$ъДО ╒ЙР9чKG\ў╠SD11ЖжрЩ■ЪШцЩ╟|sэўА3▓J8Z^ўю═w▐~ё▄┘4пbВ^│P}чИ├юxтQВ_▓*╡СJ.]Ьw╓╘│N9y▄?@0,74]▀№Я┐Я°йМ═:═eмZU╦·╫нПВp╥Ю{╟&Ёh├2d ·КNїэ║]╖ыv▌о█u╗NъЖi▓╠R▄Nu╡ROgЇ|║шЖЎЁP╣{\ч╦/╜ ╫C└H║Я╞Dд└ёЮ■∙┼ █Aш╫ы╓ныяя эo?ё┌┐с═╛ ^~∙╒РrxP@(°8ж╛яє<┼ФCШ√;8к*Т@╕Ёў u▌ k╬╗iХe╖_╢фЬе╦IFКyLирl┌жэ╬eЛNY1╗n6юЬ╖ь▄елЙaСq∙▓3Bk╡∙GЯЇOЇе3O╥&ЎV\яъ%лЧ-┐ЙTKQзЗя ~╘Є╡╖Жz*р}тф╪ j╡Zо│8№Ў█:┤┬╡╓\}╒%│.є8)еЇД ─▓lm█║·Цы╛;їL╖┌ш╥ ╫Эw┘@ihё?A6GЬ s╛~ъЄ;oлwЙЩq]■6^~■Е+╛w╔g╚╚Сх[о\r·)зТBa╕4иNшЭ1▐5╫▌┤n▌{√я║kгjj=СF-8(1@О╩ы(■╞?¤є┴√я7ыКY гСю,\x╓┤╒7▌JЄjмsГ╡бЗW▌·/Я°З {юбI╩╧ц^ї┌╗o{ч╥]Ў┘?g║Ф╩фwя╠_╝фВ╒╦┼О╝ы;┘оО░^у QL,p·С_щэ7w╬<╟ў╘Отesц,\╛Ья╚4▄Ў■▌uВz}┼КE╬║Dш*4ъы▌Е▐+Wеtv╞Й'╠_4g─с▀ЫЫr┴┤єо║у6ВйZ█ЗзOЯ╬~ї╩UЩ╛Й╚cp─єlIUУЕєЧ┘║╢K╗┤K╗┤K╗┤╦ че^л}фuQUMлV*║оo▌║uЄФ)>Ё@.Чс├7s1u 'Х╩№№СG╫\{mihШ(ъoЮ@┼УO?╡р`щЭ?{{ є@Ф№ Ё╔a$З∙Э(х9ОвПq─СH8YQI_ё╒o,X{#щ╨ уЫ_┐ўЮ√JPЯфR─ёбm+П?хв9│╚УO=■Ы╖_s#╔ЙиО#:┴w┐╙5h]v√эwм^Є┌·wх\ёЪХ╫РXEUйУ╪╗ш░гwящ Ta╗QчїЇ╠+ц*╜░Б┼Ygjq▄█Q°├ыпзєY;т:зL■ю∙чg╞wУ╪&о█Ўв+ч ╢_ф┤╙ч-Э}▄▒ Я¤┘·бН=у'Яs┌w>%ўР Ьz├ hьЄ╙╬еО√^i█MП<Ап╘ИЦ]tъwЙ P]k╚тE ццЄ▌съ█Ж▓Э▌M╚СжБ №▓дА╖m_4s╓м┼ o╜jХa[█JГ╦╛/ %RлРЙQф╙M#w▀┤╢lеM¤Лo╛wэ┼╙ X о]Щ фx¤цым░сvиы╦█╘Фz╒UлRШ`>&ЖMy┌╫╛q├П▓№┬Лj ├еdхwЮлХлYнcю╘єГ┴б▌'Ў┘f▌$▐0ё∙|v╤КХT╘1ЯjГ╠?ў╠acxЄф)ХўK o┐76jдXИ5Ъ╔M?∙ф╛ю▐Kg╬DWe┬▓┘╩ю╨╡LYe:ўviЧviЧviЧv∙(^гёС╫ ├(tu╣ж)g│хн[Лу╟?їшгУ'O▐╢m█ЗoО1gЖдеSO>Ў°Х пtъЬ√╧=■D>ЯЇ▒╟,Y@я╝Ыъщ¤їK/ДФЁ╔OЕr|Ащn┼ц3B╠* в╬ТБ.;хЇKo║БиЇЇO║х╬яУЪA:2Бя вD▐╒╙gЬ┐ц"·3жO]u├Z└PЁJе+3b╘ ЪКЙ5K$лС|УрrhыцVjЄx╓У\Fф}b┴;%┼m/зg<▒ xи╗┼╠Щ4 CMx╔2+╢])vHТэ╝T┼ЬnbъТcОZ■ш╜b╞$%ДяЎ╦у'!О]ЫJ)▓}РL@ЕэЁЦMЭ]у╨╧╚s─╢H!cЖЮ└ыОcge╡╥АТh тИFM}.fIс╬>ъ╚ыQ]&ЙC░ST!╛хd▀ўeАЖЖE Я┐еD:raA╢ыуд FД№╠┴╙ ТЩ@ф;жи╚°ЁZ¤kЗ∙└є/zн`lJИв░ьд"l`в┐JC╪PПd4┬ GavМ═├йtОh"й┴ы╨ЗT]| ╦╫ b█н╫НlWС╘┤╢d!╗ЙLУo7Vф$Ё▀В╜D╗n╫э║]╖ыv¤ ў┌оZQТ.єГ╡оjеСrG╦Cf╕е╩╚;o╛U7НМЮ·Ё¤!х\О┌Оєц 8wЎхqшfxх╣ЧEQxЄЙ'ц/╛Т╓╓o╩ЇЎ╝Є┬ЛА|Ў ф?ЖА%)аyуц?Юв│Д*a°╥oТвОSsФt╠'Вйщ Ц,8НнвXP0├╗+ ЄБтЫ~БКЙ╛╥М1▄p5ь╩в'kHёy▓a▓╗╨&|ш┴+b╛yhАJ1W3aё\аt&%Ыp^дh,DБ│~л`шчСя$Ы╢]w▌5чм╜ЪффRdЛ!Ч UЛЗ╣ODlГC7eL└ Й&╪qИ&;я╬ о Y╩sv$\ RЎJ─b═╘М╥ц-│/╗№·k╫Ё}╜д╞ly!1╡═~бG8ЧШ.Ф2gdJъ"й·qЧH9cя0#HКN╨*QpXс│yRнЮsтwо╗х╥╤Б?╞<єЬe7┤T║<`uЯnD0ХЮLXJ:тZ X┬K+,╤╜JJ▌у;р╜ОGDХlq▓yEd╕7нт·pm4MДё7}ДЪ\╙Хфп╛°█u╗n╫э║]╖ыvНuн·>┼1уМTлS&хр╪┐¤╓Я№чo~ ╤┤- °б√ЮЁi═ёЭЄр╨Уў▌kz 8юЯц╫4~¤л╫,ЬO6 МЫ╨є┬╦п┌!┘ыА=╩YКxД├ВДх▒хyЖc╥I0.J)$КNLц╦a╗д ╗A║╙qв!`ТwЫAД■▄НIЁJ╒ЧEQ╒IТoеР,Л√╓3∙ЩМг╗0)√Dg▒PЖэ];Um*З`eg!▒)╛=═ak╖a/Ь6#┼K╝"?оЇo╗эБя╣nш├▓=><Ф1П[╜N┤ )├CЬ(пpоGтк╤╫Ст8▓нц|дзx;а║ЮhЁ:ЧIH9S(Ф╣Ти<9у█чd╙╣■■■vW╚╝П hП]3CЇT+ёИ░$В65j,░_D2QP О╔яPъG╚;яю╡{7 ┌RmсЬ╣(7 ге╦Ч┼▓ьЄ\┼sКуЯa5▀"< щ°!┘тzБ,ё*└?bФ╚°:╗└(╜│е1iRz╕tш╤ИЕbD &eЫ▒GO │:│╔EwОuРM ▀Г╢K╗┤K╗┤K╗┤╦_╜8╬G_зeEЭ 7╚┐ √╔o╜∙ЗT:+К╝уxvI iфF║╗├3╠мк>■рГ}┼╠ ∙ЖE┐xьчШдю¤█√·║_№їЖчM╪}╧кэxЬp│l■·╗■-У·z_·▌Ы%█═NЪ╝eдjzQqDРг8)х)сq1─Q"еjJ( ЩI)ЖуКФ#^а>v}MСу0Ф$▒f╘R▌┼эеr!SlФ+╗М╖e├√╜у:╟▒,'Х╦GК╥?\ю▀[йЦх ╥8NДY╜рxQ├єеt┌r(]┼Bup0п╔\д4eдV╒s┼-есLW╖щ╗Ф °0ф,OР%7е4,│'U░╦ївЪ*UkB>]│═|:у╟Q╔5*Ў╔╣Zй"eu█u<╦ю╠f%/[Vхrг"ф│жяїЎМ█ЁЎ╞.9Ы╧f+N-БГ0Q Тt 'Ч═┬YоуA║Р│}пn╒╒Мъ█Ж ╙bGIТxJFъ5к╔Т"F <пo№°■■~└ЗВ$єТц√БmЬ╒=╧дШ╔dМF╜+W( nЗW└├=Сп∙nЬ╥dk)▐)+Ц╙йзxО╓L#Ji╧ч▐7№"04▐:░й│oЬыЪ▒э)К"Hвa;в$╒jНоОN╫░тЫ гШ╧ ТT╖ мккЦCу ~ч н─ЕХЬ┘ └З╤ыЙp3сX╗ oiХЦМ3N╛є└ц▌╔_\э°ъcгcfяaэ М;ВQ╚сь-\"╪Ы▀■OП$кїу╓╦wt╜uZ┴Ж$nzB!ПИ├╪j╒╪Я┤Ф╔╧w╛ tА¤ xQМ"Р0 Ё┐Эо'O`Пko5█┘jО·ш=ьel.iЄ▐дU√└ьXУo Ы¤ц3у1эП╞ЎВ]bw┤жг№%Yoнq°o~╩╠*BьоКЭ╗<:Ю═v№9═√ ▓├Эm╟У┘и╖П╛Эн┬d╕ЪГЎБ▒j▌▓улd1я86╞Ф_г═П]-;=vз'D┤y7ьФ▒√и5л\єЗ4;√c·╡уё└╙КУ║г╡Qsг▒mцт¤]Q;5;∙yЄЛ╤█╞v▒╒ЖЛД√╨$ e¤ X>8E }∙Ы"цAiўўO╧q│┘м,╦├├├]]][╢l╔хrp= ├П╕Ы╞╛og▓ В╚2иe╝ё┬ЛЗ}·S=щЇ/√∙▓∙W╥uЫ▐Ы0qЧg_■э`@х╜ў[7Tq═(Ы╩╗╢ч·О╟ЩTю#аQ▄Z-ле╝00+y^@YЫ,Иsт ь▀╝q╖]v5лuMWC╪ вш┼жXЦdанz(е╨Ї #]b╝k╫uUYT┤zГ$Iq╝ FwЇe8(ЛВ*+╛m┴юMМ"Ы╗Ъ░h:ь"oб─чpo=*Т╦ъ6Їч: ^рsQX(Жл%t@!$неc?6╩╒▐bWehдX╚ХХмKЬ/P╦┤Sj^Одию││Р[М█P@Ы jъA┐К}`{IД/в╨ЄгАVЮО Ч┤tZаЬmV;;ЛДгХj=Мyg╒╥░жi╜}Э¤[Жd1╨x>Є8UK╫ Ч╫╡╟ hиЄ\O>я Чмzн╖пя¤┴mjOз∙AЄСC╘╦ ЮB╨ыИrb:╜a╦цT:Э╔ж\+ZvRфMы)╫r╥щ┤я"'╓╩╡┤ж'ebL┌╟dЯУx&ў!"°W+░BА9)rnгc4▒л╕u╦FE▄ 4m╥о╗o┘>,Jку{0)<ЙEйbоnгVПB_Sa^< EТSйФap╠гm9┼b'░7╒rЙ▄╬b╛Z7`FDYБ]Tлp3L.мLQАyцrЩЇ√я┐?▒o<▐жg╖ЦcY▄eтДЄ{Ы;s╣!│╞л2,?Nj/Кx▐K+ГхRwоS$█1 ч╞Ув▌└x╬v}X ^Lе╘Б■нЭ╣F╡чцП[Д■ z=╣|Сw ЕJ╒ ЦmC5·╝[╖n4dШкjйt6VW/WP┘j╡*┼З┴BУ▌WKз2IЁяh_xў∙>;╕┐Ю√ь 5 п√#Ж@BЁ╪▀В\qK8]HВ┬ц е╙щ ▐п  A p║ЁS╨ж¤х¤!щ■T▐═Є╩КцrёКкЪHyТйХ>zэ╒KO:▒^ф╫╜Є╥ТEєИ▌╗╖0lєЯ╛)є^gX╦эEK!l y8а─ц(Mо ┼ GU5%@╣рЪу░.▓вБ9ФpxЮ/цsЛO?уЎў▀Hо;█┘·┼W╗╜╤Шbъ╔╪О)Й^xЖ╫║бЪЖM3дe:╝└ХKUК&р╖╚Х8ОE╙lнVЕb@ХС}b-<·kW {У╪ █чSтOЁ┤EЯ9╒╚чє^ЯшртXРрZ╡J 8X!═|▒H)hpCs╧Ю▐X(╠ LUлС<СЧЛе╓╪╪R═+╣dahsгнг\оЙzФЪCR( R)5[╚PWнYЕB│В╧╡Qн╔СP@╤,PдbQXxЎzщDo┴EcpДВ╘╒EлкхёPХК ╩тёRЙОРhg▌ДFtр╧;Ry┌ыSy╩тТ▌)JUil·j╦'`З2r58и%#W8╖═cmD[хь-oQХz│@│▓рvYЖЮьэ9|TКбjХRUХ╒а7fТ"аЗС`фЁ╔R√ж▌■╪aаq╗F╡Фь,е║#~╤ЁВj╟ЪeНvЙ┴гCзп╩eРe╦╠,╦+AEYr╪Чw╗∙/┐° №N,ыM$=ЇР╬юp@8(QЦ▒їып└█ё█╢яМ╞ыЖYкФa@┬_98QХp(P*┼б[║%ЯN:уф3Щ├Н╣TR┴фРЙtjфР&аРeAo┼╨EТ╔Ў&Г> ПW?└№u>q╧╬6Зb}бt*п\▌+ ДеєXA╝┴`g"[╤С▄Хr▒9(9ЦЙД█┌;}■ вш|б@тРRИF ,О$ ]ЭЁf8t3RE╫3f ╣Ё╩╩┘№╨Hlч╖;@Мr╒▓╖еоfрoШ5╒cQ4Ж0Пd J╓ ЦsЧк▓cА1&|n╢}╫╙уn ;`TбT╒ к╣%Ц╔Ua,C&·ч]ё(&M╝Щ╒Ц5їMXЦв┼№>еT∙ьу-+─ыEПo л╡Юt▓y@kWoO<^Я╦▄n╔ O▒ ┘B,ZзщК╟/VХ▓бЫ K34KR@q┤в╓ЪЫд┐|╒Y_╫Р═eр╙2№╛@M7а&M╦с]lW{З╧+E├╦0АuL▌н пOD°Яюю^О▓=Д^╚&=№ш\Yы═8╖┤8х╗vўTK∙║h║░ш ╚*№ сЎ<АtЁе╩0\ЯЗ)wикn$жL┬╔чЛ°{Иф9VУe4Сц<~!Щ,·¤╛Z╣шX┬Tбb-╦Д┬Щ|EAp{Ip_Н"mS╓ўь╪▐kИЕr┼эб В╫ ▀██ЎЕz;┌ ▌i4АЄHM_@9╗zsО0iA┴Б╢DЦ╦U░.}о5О=|Ї╖·М╒!CЫ╢~│гбб>▌╜{р╡Ё'╦▓ К∙dЧ─УЭ;vP╚МДcЇ═╫7РkР:a┌ ЕФJ~ ╛M]]@ХЛT# ░ аИT~╡жrпщ&ЖxU9╩│j<$ЖOГ¤2Л─б├°dw╫└╞╞─ЮОЦXьлo┐|╚Б]Й^ u┴ОЭ╗m]ЛЕCхb j`█Оэ ═-#G╘▐УЁЖUO^tю╪>░uА[Т:╗{ PоъY/╞ T(?╕ЪM┘fG╨RРn▌№бэ Ц╝2 IАop└·ъЩ-┬╩є7vР╫uRФUЩ2╢tfпрЩ¤З~╖щjvMй┬√кVs ю░5▌єз э Ю6╕╓ЁiZp╕┤°╥0Ё╒▌?╝? T▐ ╦х$СЪН╓╢М▓d)╜Є╥%╟ J╨Ф╧6┐╗d╔<вm╫7 -Г╓╜єЙъ ынГ╛lOдИ\PH╙╢IВї ┼lж┼╒A/}B╢PИ╗AПJ└зВ(╘TM╙UP ╚JOO╧Б╗Ў╝▀^9u▓Лf╢╢Ф Еp╝о О╝eццє╣h4╧Ё┌4 p░l█кVх@└Я╧\.P# └kА:╖[╠х▓сp■╓этБэАj ╓ю]в┌77 Я8╪┐N╓╘ь▐╣-Х╦ж╖6┴7+┼- Ц─pвT+╒l +Рv6ЫО─C║Us√─T&═╗$▐х1 ┬╥i]Q╜бR-АG 8шє∙lL┐V?АCеу(┘~(i╛Xги╓ФШ7рEP4┤T.╤5t╚аrE-о┼╔g╥,/X/z▌й▐ЇУпAV uwвp╙ЪGЯS└ЫЦд╢|qи.ь/vў┤J╥╡╟П┘Р─дчЮО\RT( m├┐√жKIЛ∙3IЮ)ЦqЗ +ьўєY╣В╗Tx4╓4У!шООБбп█╕ }+Й╝░ў/й J8ЦА`∙t&}рр╚оo╛[1w╩дЁi"ТЮ┤buм▒Хсе|╣о4DS#Ю▓]н╘└DЙghкблр|∙┼ч╧=Ї0>г▌▌Нък+uЁЮ={А{;v?╝тVфїг╗P}# ╕I╖▐╓╞Ю╛¤ЎЦбъу╤do╕╝mO╫╧ хw╗▌лvдЦi=pxжZК╟у┤%ю e*е└╚┴▓eЕ] у№┤эи0аHt╦U╫мxq-эrБyVл╒To;Лз╦mП╟У╔ц5В:шg┐╠Х╒X╘хr╨Я}╞ВьЛеrCcsGG╟И╚х P╨У▒─ш└QАFj4ы▄╙╙8hP╬и╣|Я╫]╔ЦхDv┘╕ ё╞█ж·Ц-n┌ВEкPТ:$I▀я№V╙u їQ?√E[WЁ(xСа┤}ы╓U╖/Cх"jo┐ыг- ╟'єХb╡ьё{>▌Пчд)ЫшЫ√╟│ГрЛТX╬,╫uу╟_w═xhВPм╛жh$ы`АтKЕh$VВб╩╗A?]пjКc#Q^пr.╢ZСуu1pь@t]оNIVb u┘lй.ъ¤Їу╧ъв!d(j╡дл╡_~d*WdПЖиL.чї░Zн┌│зуйUлP[╫▓7_7,[ x╗ ╓эКДг{vяZ5s░╨ЭD,sх▓[8Ї╨d2Щ╔dX("С├В╦кZUлU ╘'┐╕kE■b.╨X.Ч}У┘п╧4EyйZf┴╙r *ФV√KГ▌гT,└┬ЦJ`└=V┴bъКp/Й h║yH╫ып@║ ч▄√┴юnу█Uэ┐л? T▐ Ых ЖЛЕH*#╤╡J:.2zuэUзЭLХ Я╝ ╬т%╖йЮ]С║ц я}к∙"Х·ж/█zъ├═╒в╩У┤j┤ф╩ж╙Mю]2ф-+▓Кa@1Eф yЯЎ╨ └Д╖9h╬шS╫╝╖ №┌▐▐чd▌"yVдt6П╞╙┘4╝f8ZS└▌╓-├D|bШаРо ═рlЖ!B:Э╠<№╛,╦t_╨Щ┐zь▀;▓я2Ц¤8╪╟Ж Eg3щ! UKЎЎ6╓E└╠їfТм_e■щ'▀ўvSВ╩G┘°8 mэ[Ёt,UW▌╖Л&к┼"ah-їuе|─▄\Ё└эцy╖╫"(к\Ц /╨їям"С╜o╓▀ь╓∙┐■T Ыc(BЧЬv┬╜я╜э*╝эЦ╝Чq╠╝Ч_╜!█б(ЦI%zът=Йd(┌аАщEДйл╢е√=R!Я]x═°∙<- Еt├ЬЄ█▀╬X╡z╚РЦою─╝1зАиiк[Ї$ H▒ф▄▀м·р#H}ўЮ]╤PxЎ Pow_░%Лвч╬ЙpєеЧвэ{╦▌ї╬Ы╣Zэь╙╬└ё/З ^Ў╥╙MKэщ>`╪╨bA■ёjФ╢наЛ─wm▐ь▌█╢╖Бkv█вшЫпPCЯЩВцM$эZ·╞║lI╨є06╥ХЕЧ_ЙВa(╬╒Л▀?eъ╠GЎ√ м╛ЁВє╬┼┴2¤▐╔sч▀qї─Ek╫─┌S&7I╒Л┴ё'ЭЇш█╢wьj═╒J┼b┘╟╣b╝ял╧>yh═2$WяЩ▓l┼К▀^▓ъу?╒кr▓╗cфЁ!m;╖57╓_s┌Ш┼╧┐TФ░рЮАп╓╫а╘>D√Л-╥f8ЁФ!lн"√▐Q┤Ы╞МY╢с¤Т\kjОVлК\оАпьц┴сб"▒H{{з╫у7а╒5╗ZУad─(╡Jssдг#ЙуАrЬ╫ыЙэЯ╫Й╟Г_|ёm0lnОя▄┘▌├чЖвЮЎ╬ шШmш>пT-√╫Мр╧┴@Wo: wїЇВo`╓dR-╠╣юЪ5O?Я.TLЪ'╓┼╕Ю╬$z┴б╝ї╝sю фQЭ╜ ▐э!ж"Я╧╪Ь+TxNP┤Z 3^ы pЭ)|1(╔ё,шбж)x ▐йBЙ>!ЯлхЄЩ╗P2 T╩сk<▌ю∙+V°C▒|EйЪ╬ЁСёb┴ШrЇh─люX5щ─УЮ∙№УBй >q╙АЦЮt *d·q╟-}se9A╔[(зЮ>·╓ў▐▌%,qи[ сВш╞е6-xпYУ$h▓-Бе═╜·Ь╓п▒>╫ф |з╜╜э┴yє Kx■УD╙Ч,]vщe╖m·╚уeо9ш?╝╢╢5IЇv┬яxГСЙ'Ь:{э+5UkиoЪ|┴╕█~p`KЁ╙O┐Єz¤ЁS3╟ЬqчжMШЮзX.├Q╙╢4├т▌b*ЭБt е дл╚2▐ЖбKВ° и№╖╫C░`╝T╒P╜вЫгiгR╔wї,╗т $╕╜№rи.╘╙Эжg▐u╫]6с·CЖтФbй╛▒сТЯ bщ·╖Юwh:_(-Ец█░б╖лm■╣>№∙Я╙┘\ NeЄР / ╕бf@a ]ЯG"it8W°бэлъ Аь╖Г6;▄й╣y1ХI¤бb╣рХ|▓\aH#╕["IФ╧- ьпп·╒аA═∙|po·ЯmтЯРn╡VбI╛╢╛Y╚M█Аўс7m╙∙й╝ .хfu╗─Ъж1"])&┬.ЄЭg┐vьВZ√ш▌u█╢}╤2ЇА═№╣&ЕФж╓╧vwЙм╧Р-╨ И╒/ъкеЕLбh∙DDS┤b╕ЁОЧЙў┤Шvа┼║О'ЁУ╜=с`p╩EM\╕0 ~z ЬпФ Г°▀4WС╦~oЮс5TобЩ4KAu├;<^Pа@▄9Ъ1uМШа╝ `╟╘-BЎ╛EaЇ╖л√╢ю▌J╝Zлoc╗M┌V)ЯЛGВnЦ▌╛mлй*ёpИ0,0╧Ф╦эП┼╗╙i╦╢лЕм_r╫ ╣бl ю√h}Sжкp▐`а╛1Х╔D|b.╒[лTLЫ[A5@яёHm╗wC┴U%╖▐p>ЫЎ√╜KЗZ:ЛF!ЧкгJ╡rСП .иPИ╚Q#RQ╡O ┴∙ООuТVKN9∙$dqO~°gYGдGъ(fЁЖEцL¤Ц▀^┬ В╓╒ЕHтЮ═Ыzл2у ┘И┼█∙Э┐"b╥с%║Ч\-+хт╨жцO7o ╗E0э$╦YYSїБCЗ%╥Щ╞╓Цt╛ZSTОw;√тцР╡k■_Й1║▌|6Э К▄M╟рE9°╪MбT^xё}■Eйкж29М2^щ█п┐ДB.OJ Ї_Ўz─R▒0є╘Sю╪░Pалл ║╙МSNYё■√xF╡: ▓ W< ╝вы Їр▐╕iЄ '.Y┐√$.>ЫJz}╥╠УOyшєO{:;З ▄▌╓9m╠шe╛чh·M╟ЬАв▒╠tр@в9┐9Й■ў▌+√x┼▓F╢┤l¤rg(w╨ПUзАГv)7gтД=въЖфё▒,ЫLt▀rсyл^~Мt}}<У═O{Ў▓ Ыъ[╗we'Э>zїлп╣б'СЪ╙t┤╗¤╛O>═d2 .бАя╞уО┐s├█<╟йК<ёЇ3СКV┐╖мn{в│╣йХз)+[ЭzтЙk╓oи9zХ&l·&-04U╓з_t■ТV7╢4o▀╙╣hЄ4Ф╚Lyц@Ё:шЎ┘b╝ъpЁк#П^║■▌P,Ф/Y*42`ў╗7¤8╪╖!▄Га└┴┤=gU┌▒Вt┼QG▄■┴GP╖┼|.ьў ЬЛtь▐╬NpGiЪ.Л$┼иЖ>pЁ0oАяMФ,█ра┌╜ооlv╡Z=ша┴сГб╤██ Xу▒g!▐-╩q4,Х╚∙}╝яOС{zzhЦнTфуО хЦO╖╡ TЕ4Фp°vЫ╒K╙O;e┼╗я╫ GЁF└гeлЦ СаПг╨їcO┐i╒*ЖwSЬлu@ЇЫн=С(Ї╧к╫э═2 ┴╚Ъ,ёТC9ЁZ╖u7чощ5x]и<ВЗs1,AAjrM╧Чёц┼PHLt$=nf╞I╟-¤П,Гw%╓Lkр░!╜5ЭKs.в╣>ЮOжЪЭ|№Йў╝ ~"Сиkn╠ e╣Z╫╪pуQG/zэu7═║9:эЇ│N┐c╙жT*XмЫv8Z╬fє╢ур√пDйЧ╘ ┌_УA№╖√ЇYГ┌┬ ·└в6√┌kчп║╨ ъ┘0╡╣7LB=╔+яyh╪╚S╧>у╬gЯPК9pн#ё║квN8щ┤Еп╜┴Є└_йШЧПеQ└sРЭЭЭw▐yчu& 4║Ї╓┼ы:^о╜шчРb._└щТФiиР%и'Ё╒4б 4еШ*/ЄmmСp>шmk_1с·G^|щ▓уOЬє·:RРBA%Я',+рС▐╡c╟NП[Lч▓+WнЮ}╦╝rнojRT}юЧNЫ7Л▓╠[.╣уЮ√└гNх ё·FНв├@r6^G╘сCтЦpок?┤}ЮйХkG┴w╩╡▓└ Кб└зЁ ┼iЦц}ЁОш│┼,<╙°F4:╪_я╡Yь/fИ$ёЄ╜$ys╣ ╝г(рI╪"╥МЎзK0ДеYЁ}э2Сiы6 n ┴s╙И■й╝ .хн╒j#(║ъЄ▒дгJО■╓УП]}·ШC╜╖юПx▒╕}╟═-C6n■s┬ж┼ 8l[ж$ч╘А╨e x╙dё4[╒-D(╟б!SЖЛдAC┬Ў°}0Ёa╕┬Рp▒ГYV(═=ц╓╫_ЗмJ~ЯFР∙╛√UЁйU╙Д1 п√ч№|ЮSйT@р5XkЪх|RЧ ТЕў!]Вдa(:}СQ▀йС┐┬Aє┐р`? Цr┘CG °ц╧▀hn°юыпWL╝╘IJfEп|сЗw/∙┼аЦ┤k"йg_¤№╤cРж#╔Зbёёє·Зк╣Ї─╤зрШБMїи╖▒╠М█n1|и*╫о║ф╖xъ%Г┐E=▌PB*ж╖c∙+пСASП√5r└│xd╦╢╦╬·-╛\$╙{хM╫Ьz╬╕╧3\╒ "d┘├╘D┴╣т╚├Р╔=╢ёу|ES▓╞ ЧДLя┌▒ЇЄл|ЇС▀_r ▓э█_z.2xXWN6 vЇ│ ┤╨y╡ZnИEM∙z╦зП▐qЗGpЧwэ╞л!ЭЭHФnхe─тРКэ=йQ?ЮH╔¤uИge·╖ЎaЎ■x: 2╥E╙Vн8єь▒K(Ўg│YКс&Я~Ўф╟ЯИ7┤Veя┘7НП=ZЎ╢w7хKe┐s╣б╔|7Нs╟[oБk!Й▐h4zщ╧■c┴kпE"QEн ,Y,ф▄в|жrEой╩Ч] Ў:j╣\ 8iЎшSozЄI╠°\ОgЄYcg<√T,Шt┬й/╜√▐9G■b╔ып╬;vЎ╧,║Їк√╓╜UиLетда╧Я╠W<dlkцqG▀╣ю Вb╔W┬╖°Tкх№Єk╟▀ ·+хb╢T(x╚бу╞■ц·╣ ъ глхS3╟ОYєю╞J╡ З║zz-\|╙╠ЫгсШ╟#В╩L°╒▒ў╝ў>Xшh(X.W'Н╗tёуOР!ПF╪>П7▌▌ы╓ЬY_║ш■в═ )C6(╞▀╤ QG7П9їоїп▓<╦▐ЭЭKf╧_ёр├0╪Ъdб{Y°L╞UG; ╒78╖'Wо >ПЙ╟пM9$=pя5цН4M┼╟XТ╘L╜ZЙH╛▀Яvъэ▀╦ЦKA`кХКЖ\]4}j▀│фхЧgNЬИчеg╓}ўW5%Нсm °GЕЧ^Кc= Р! └c],╓ЫL.╝ю:ФL▐╡yєї╟ГЖEЕ┬-ў▌э▐▄╪дx`┴хW_Нт1TХ/Ю5чЁ#ОIдR.╖Є╦░Ьн╔Н>■вГ╝яуOqDКW▒─Й6.MФ ┘·hфк#~yя╟ЯС є┼W▀p└Иdк└+Ч╔Єn╚Э¤Н╞E╟wЕ P6╛ї┤ФаЁ▒╚Jб(J^Тuс╙BА╒*K!ЮFУO>юяo4TФЙце\Y╬Х╒xC╜кХl]▒╠┴3╞Ь∙шЯ>d9╫ЮЎ=сЖЖ|1├їW_yудi°№Шсx|╛╣о╜хбЗБЖб80@а╝══н8@к рАZ¤·мЩА№а╧n7[╬ё▒ ░N ih:|┴╢L°▀й'Ьp█·╖и╛Рd┴АP▐Ьq┼U╧~ЇцжM█>Xл,░В,╔░ояvь╝s╬№ЕП?КF╗i╟┤р}Юе└Ў▒4}эё╟▀№шг MMEC~Ж ╕cGз█-Т4 ЖАdh@C|7ФЙНX`чАSл°└V└ Ў╚╩WJ8Ж└57╟█Ўьс)rцiз▐ї╟WCВ√№c~}╧ч▀&J╡─и hj╠f╥T▀┌╖жк3╧;o┌├uЁ░]эiУphЖ│yся.@▒hїY╙aФ╡Мhvчю▌╛@Рв▒Д> ю(╪┴J █A╚d ЇC█j╒┴З*qМ▀r╡ї пaФ вP╠)p▒ЯP╘Ї■Є╥`5ГщK╞I_║Vй/]hшWаНB▀|ц╛9╟в═■G╙Е┐21■╥╡*^ыЁ{}жmХЛ%╝ьH╤?Хў▀е╝Т TКUВB&eИ√ю╗\еёД_}ЯP▐[╖9М▒$+∙╝Э┘^·п П:°Рi╒t═*╔n╬┘Вїўхс░├Хe╜╗╗s╚АБЩTz╞╔з▄ё╬z╙l▒─КТbрX'Б@`єц═Ё▄┐┘ш{А║s╠1рЧ├Ы▀}ўЭртAх┴ЦўжТ@%P)г9ЬBРBфй/Ї!ъ╖{W5√q░/^┌┌уаc{>██╙Пl√ъ/╦о║╒╟Юx№qG╙╝0ю┬ЛфDў╘╟ 67вA╣PШ|■инуЎ?<2їтK|#F,╛√^*╔;N2Уn]Оr,╟0th°ё╟ I▀│~┤╪╬ЙзНЖ╘ ГЛ╧;ь╩гы^┐Ї╠SРъм°`[╪+\<╥G{Sl╣х┴gyA╝щв▀а╠Оy>8№Ф]┌@QgїМi'Эz ▓ЕЗ_╫б▌╦B^Бф╚lwч┬ыпCеълV_u┴HфW<¤ЄЕ ╬gр{HЎ▓ ъ;Ym╢ИПmv╫|еtj┴9чаЪ2ўО;[ZZЄ╡ъ-╦nлf2╖>ЄX░╛бj█┌╗т`э╠■ЭВ}│2x▌?█x▌┘╢ ХтP√Dў╓п╛5r╨ugОЩ|╦ьH└ ЭgюяпBс║Ew▀яёЗ е2CБeRчMЪАtc∙│/ХkК╚╗`x9рлфєAпg·г╜Ёb8,<*╩▄╦оXЄ╠╙╣lб╣ймTе\щw:╙нУ'?°┌mэ_ ш]x#ёДO╕єН╫╜ШЦZO:ё■/?█╢ї█Ху.Yё╠3S.╖vч╢│З {╖s╟ёё╖╛ЄКТ8IR╙е|╛М7э▀├ЁO0╢1єДcя^ў&/H=й4яaLН▐8v╨░█^zоm╧╬√я╜oён╖i5dфиЭЭ╜╚▒Ю+~wсФщ3O│└╝m;^┐_ХUDА╝╪3зOЭ6¤&ЁЭАз].┴#г═ї▀%C .Ч!+вAL9uЇгЫ6Ч ╡[. ыўzA ЙbэжыоY╝tv6Я@Й6╢$╥┼·цfь+rlн\04|┬╔c╬╕э═╖M|%M B═Тq▐7;╕7ь БOW*eСМZEb\z╡LЫ╬┤│╬Ьё╓[б·ЁЎн;F BiЦZ.ъ╒ъMЬПцЎ╟ё№└&╫■·╪╗╖|╥ЦшОЕC;vм╣yцъgЮ┘M%Т жMЭ4gю╚HЎ&$пфr╥ЕаR∙О7^WфЪф'О>mх┌┴HТФH$ц_w═├o╝ Ьуў·▀^2m∙ЁB5эцБ-]=i7CHД6щ─уV╛│╔$9┼"T├Ї√╚╥MUFОЁHWq─╠gЯ}~┌%╩╡tиЦя┌▀Й╞уQмйк NпуА▀2ъРC╦T¤тє╧cuu┘t╨ $t┐Pй·│ЯWkJ>ЫБ!@У╬╘уО^їцk╪Z(╟л°ф8къЦhеVvмcш╙╞]t╦}ўА_М▓хКnj╤x▌Я>№рЩ%╖uqз;ЕTu┌╜ўtши]╗ЎPz╦╕8Пф▌╡g7ОЦjр╔╘г▒>Wс}╨g╖ЛЗЄyеd2 э▀?°рQжahЪ6яМ╙я╪░A╫4яЦ└ЙК╟г┼ТТ.╚їё·J>эвQ9Ч ¤▀o▀vяк;W?■tQ╓КUyшИ╓▐ом└3rйц1╤╙uяН7▐╡aа^6_А╟╨\╡&[Ц-y╜╔d·Ж\U:ф`K╟щ╩╡ ╧▒∙LLi8╠ц╥PЩ┐<№╨оd4q▒r1╖шЄ╦я}ц)вжОw╤╝Ч╫sБМтX╚W-Wl╙o0Лх3┘yУnШ╜ЄNDТ┴p╘└1k╚Rк╟чшХlbс- Pw6r∙╩ХAU╖wws<╢ГРOls=ЗЎ│Tк╨╘т Бэы╧qЪa└зGsL╡\f8n█w▀q╤╡єЛxcы_╛▐єU"╫p╥Йы?¤цОIs░o▐ЭDнMи╖ХФВ3g╧r5─Mф▄r·Y╚@Хbh<┘╓┘ЙЖЮ:gО╧ч▌ч(╞╪┬ЫжMШ6}Pы`Н$ ЖE/єЦkоAХ ╛сДжq,m0У4}ыУOB┘└М-Ю1uw!EG-Mи│∙¤(Ъ>{V$\_╡pD2╢7─ ^╓ьЛ}Eш√#=Q},╪w<╓dБ╒iкS╧√ кЦЧ<■╘Е^-╣)╢м╓nЮ< ╛tы╗яЎдzb~┐╦0зw"─ +я┐OjjIБЧI~┐Ч,dЄЭ]ия░7CУ 9╫ъ╡/▓4SУлУ╧>y╜лxp╝ИE~ш▐+N¤5"∙╗>▐ЭющX°█гЭjх▒╖╔!XЧS╗цШHNzщK!тў╔9ZMЄ.єЪОGДtч3/вНш,Q(\Ф=яЇ▒П╛┤6ъЦN=■d╧}·з^Y╒]AЭрЎЫEтs6i╓%шУjеl╚┼O╝Ё"┤зНТV!{√SO`╚¤~!▐▐▐iiе▄b2Wd8ОХaуPy,░аН├╓88X╧┐BSВСnнW (┌ьйУP! ╣╛є╔зn8эМ╒я╨ЧqBн╔4a╫E#█wэf╜Тх└6ФКY└Кtа▌п9№Ч╦▀z│/┬▐т0¤Ф╙ю ьSеж│ЩА─ГєPСХЧ_ОLчс╖╫╖}╟╨a├Аb╤hOg╟1SO9yю3OЫ║ ╓╫яў╧╕т▓█▀xЕ#И ??ЄСїя\v¤япЮ4ё■┼KЧ▄{▀╠є/{x¤·6 FыgE┬бdрыП;ъюuoPЬ kA▓бP`√╢нЛw!╛РZrгоО5ы╓╗¤╤d╛╚╣же#╣@#g╩фй(У╞Wi{|g═1bШРЮЖ║║П╖|tяъ╒6М╙t∙В╖▐їР═║ЯЫєКАG@f RрЄЯv▀Ж Uцc┴ЪmА═&ukX╝n╧╖[gM╝I.Ф)г·жЫц/&╢╡╡uўОэН uАГ└7УN<∙╓╖7Ъ═╣╜╜АY╓ю;Y╝√А*КХR└у-х╥Нсm╒|q╩ЩcЧm┘ТкФ┬ЯR*╩Щьр╞┌╢п8ъ╚╟?▄\*ЧIОщ═жOЮ|є}ў°c╣RЪ?fьм'Яlnn@aY┤u·yч═~ш! P$шУO<ёБП?. 0╛-]Ыv┌)l▐ вt╙Ycч=їФуж ТC)Ж╜ЄЄ▀▀╛ё=Ч█╙ЫLq╝ЫзPА╡о<ЄЁ5я~@╣=5ГW─┼░хR!Є+8<м:ўм▒l∙`▌эїЦйVdпOЪz╤EXсgёйX▒,8╙o╜5 Б-АогЎv╘╘ДJ%ю╛i▀| >_╨4 7G+х№═гO^■╩K▒h╕Xк▌Э╬56)╩%█╤XЖЁ вVнM=ёф?№0У╦°2в0ZкФМ;║D>Э {p└Э╬7ї▐{ хЭt┴EиV├З9╧│x┐ьэO>йи╪{_Аї╣щjЯ>wЎщsp·мЩ╤Hjuъз╧╟3ш>АC;0L$╔▌╙Ыї°у8.C░╚╩gzчM╝╩╗ъ╣ч5ЫrhЦЧ|█vю╨▄дщ2C$сL;¤МeпмЕ:ЗlC╧!uэсЗгжFФJуeЬ╜v!g╟ ^пўяh▀Bб▀.▀gў╒│▐W▐╜ї<нп╝р╜L;є,аr█_QB]РюРЩsч╕X╬уєNхз)d┘°| ▀э╦RHg▐цLА├"КДO▀|╧=┤ЛО·|r2u╙)з!▌B ў╠;ыK$Э4M╛▒a╧юЭ~M╣ї╝sб┴pУЛ╚┤@X ╢ ║└▒ЧЯx\w=ё─ї\И4эХ6Юy┬aH'ю√днЬMM?m$▓м7╛KЯ)6C"yэпG!_t╥3ЯСnЛлB))╤C\r╪сИЇ╝Є┴ч██║Xп╧▌╓fЬ°+dX╧╛▒nў_╛Ю5iЛLY▓`└┴?╧ЫLE┼╦v▓R├█z▄тш╟■№ч╬╬NAp╪О╗с╕у■Ё┘gЪжВЫz╙9чм|э5╚d2ЩфYМ■╕╣\,°|╛╦О<∙╝xр3ТkИs*▌їь Йt╓Н╫ПР╟┼╨jс·О[■·█╝?дШdW"YЛуE █╚зУСpp┬пОY·╞zVpбъ■ўDдж·юЁ4L Вa[Ц)║└┴┘gЭ■└Жї╒ Ё┴╕=7Ьtъmoo"XТс╔\&p{,MЯvъш█_y╒%ЁЖc╦║ъE╚└═чЭ7чБЗв┴РЛ└kR7Ь6ц▐П>ь;ЧН╖LАWPкT√ы э█л¤╖с┘ўe~_рш■x╘3╞МЩ√▄3ТрЖЦk°єа?АПтЄ■ZU!-═1хЩЮwя_qOwЧK ╨╝[CдвйДc .АXh╥┌ь╤гW╛ >I╨А╬%@aDД├сT*%║=√уН;√B╚уУp8XЇ▐гH¤█]pиz┬&RЄ╔юОрсрm6╩С'Дq╬3/Д■D▓'НAЯ╫u мщ─#П║c╙√$IщжY,се║`$ZHt∙С╩ sтХWC╠┐ БPм.Х╦7┤┤цб■m(ї╜1▒ъ5Ф ╛╟┐╧т ПЯ╩√O)/№ ╪z├╤)ЮRФВП╢7н}ёўгOu¤ГНocь▐їe¤└б7~Rц╜hш_u$9$╥А╥i{/"в╠СЙxг┬г goЖдVни2Оё╤╘╨x∙б/zхU^u╨∙ЬiV╫q·cMў t q_╠jтяZ,fФьь°┼!Ь7Є─+Я} ▄╒J.З/єа┘┐t╡mє╚УO┌№ёЗCЫЪЛ╜╜є╧╟╫╒+ЕттХ+╜═2жхкпуhjЄa┐@К№╨;я_ЧЄЕW\БФ┌ЄзЯ╘▄┌╒╤6ёъёиTxэOЯ.мГэеЛ╧°5b°╒яmuQЎU╟EJu·▌/╘pШC╥m]q──onу╝и╕г═C╔┴░p┼СG У{p▌&ВsW∙E!W╬/╝n<╩gQ▒О╞3щ4Тef─Рл╓ю ыЎgRiЁ┐╛╛║└{▄ЙTo}S}нZr!ghSCч7[╗vўє├└ц¤ц7gгjСф_~Х.W▓╒К;┴┴Y▄Ї/┐X▄?;╚Т$T&iк~╤╡sчЎжжЦы╟]░р╤з|р╔╧єщT╧И!┌vэPu3▄2(S(Лп╚7я▓MCUфgО╜}├ЖЪRїI>═0жЭtЄЬЧ_nmm┘╡}зS*-Э2х╛чЮ'(Жb╪ЮDкVлН1"У╔rp(z╟|ЁЪ7_G>╬дВ╕T╡╪Й▄Ёє#Я√╙Ц▓нзК9ШЖ╟}туЯ}Т!LЛвФl┘6#yT╝∙╕г■`S:_м)ZCsKGGG<Ь0цф╗╓╛╚1$╪Qo 8с╥+g▌}╔Й"/8╡╥М▒з/}i-╟╗\ЬЫfЩлО:f╤лп 56╘5╘┼.:x╘┬ч_ЇxESSCб╚%┐8vї╞НЖ╚Ц4GрSїz┴w¤ё'╛Ё┘зйrIqС┘j┘чёXКцsШыO9iц]╖ 1м7SFЩr╩╖o▄dрСD╜V▒Ml┴╕ V╕E╓L╩%Вп°Z,оиUЪж ├`nёб╩╟Ю▒№гПz▓ЩЗG╖╙├Yv<ш'Ms№з?▒~╜в╚ЩBЮўz'ЯzЄЪ?} №Ъ╧дЧНєЭлcС(>╒KR]Э+ц/╕хЎхl ╟·╜╛лП(Ь~сЕ7▐╛|└А╨ДхB▒ооn√Ўэ║щ0B`ЁршЦў?{pїКgЯ}▓│c╟ h[{W╕╛кеб▒~╗зл- еz╦-Ъ╗xЙaYшЁ│└ы└х5╥L√п&░9aўу ▒Ч╩ь╛╨·Оaй▌=Э┐:ъ░r6[Iев>П]Х/=y╠╛▐╒[и1x╜&└┤$сs╙;wэxhїЪ┘K[жэЦ<Ё╦┼x|В)лмR╕ц╕г┌┤9[(╬8√╝oп╫бэYuяl╤л╩▀\їє█ўё№┐╗еу╟╦╧П¤№Sy Йх┼3eaXэ&╜4z ┼чо=F╨╒П·q░kўW н{q╨:Є/])╓цY|5Э 8?!т0ЯdЩ┼ 8sB¤ёъ╨~gDЯD╟░r*х28^Wy╘┬Ч╫В hС?Ф/Ё└▐w╡╫╛ЫВЎ║зvD╝|Ф─╓5Я$╩Е\8р╜№дУP)┐фй'¤нЖУLжnЪ25╘-╛}ЕшХ░dЯw.рk╫^>ЎLDРox_wё[╛√■и# ¤!С╤╚╝yєЪЫЫп■¤ZgЄxЯ}сyт/ №∙ВЫoFк·шKkп╝ЄJ│Шэ¤╖O?ю?Р/0эЮgъгбI'ДУ№╦Ел╚╦+/ █р╜ы┴╟╘Ж▀я.ИZ╞╦щ╣Bў╩щ3P┼╝a╔╩Xу└Вж┼ЖъNvzэ├Ж'┐■жТ╠╠?E#уч▄<ъиcЗ║╡Q!Ч_~щеHQЦ╛√/Є%╣Д/сPkЩю╬;.№rqУч╠=фРC╛▌│√╢3P ╕шю╗hAФ ├МкжеЫ╓┐┼QП(8Жm╘J╒B╬P*n╖{Ўo╖цнu╔Vl:░ЦЛ& ╣Їв▀ЬY_║щ#Y╒Ъ╓U%Є)5xpюЬY╙жM#I╥╘-00ыТ╦<■╦pХBaё╠ВЪбYКсКеJм╛~·щз▀■цЫ$I╗\мбы╗╢o_s¤╡л▀|╜\.jЦinR╙с┘dWч╩│/ШєЁ#:у 9\7мю=эK╬┐dЎSO╣Ъы`$U├эr╦ж∙ус m[3/:w┴Э+┴┘И7╢$RщЖ╞·┐|ёщЪ+/_°ь╙ЦЙoршшщ╜уъы╓|ЇЙм█0c^стГF!Ю┐щбЗdY ЖBє/╕p═╞НСИ╨╓ЦйU╩ ╬=Е"3Wн0uЭ"ие╙f▐╕xihHЛЙгnz╡6(╗фч┐╝·╢e┐>ї╪/┌;hС74= чwu.║pК√ч.[┌:dфw╗v/?a┼ыoB>╙йD╪яеH$╕╪лП:f╒ц?хJU┼DcЦ°ПТ╨<гыЪйщ}┴=ўве Gг;╖o┐ї┬ ч┐№2Н/У$я╝№▓kюZ╙╘X?xЁрO╖|╝l╩ФYлW],ХuЁ°▒g/{Ў╣p$Ї┘Ч[c╤:┐G╨Л╔)gЯ¤─╟Я╢ўдe╔ЪVW╫`ыj9ЯЙЖ∙tj╤∙ч▐ ╔Я╙╣у┬│x|цЗz P3 AVк5Лал5%Пs│mы╖<НV^w╒ф╦ёХI ╬√╩ы&▐∙▐GеZ╒v╙P щ<Л╨╩Л/[┤Ў%═┤Ю5,█ЁЎ&S+-Ь9oeYr▒ Е-╗їжЩ│$I▌┼ЧЪАМУ┤э8xг·■√·■k°й╛+И¤[Чёt]Яs╔яжн^Э╦e5ълп╛ Г╦&L║g▌[▀яшXsїХW-]рб┴▌{┌█[╠?ўВы▐qЙ|Ur▄.о&ЧцЬv╩ДGЯ8xPйД8Їя/7tъ_╘wk▄_БiЯЩы╦ю<√Nlї)ШН╥0Ъ3f)╣мR,┤ВI:у▄kю}дiш▌=]<(У*Б фz═╤GO╕ў╛╛t▒┬@КPiЖЭG ╗йЙ'№·╢Ч_е]№ФK._ёЇ3рЕ┬Шr ю}u╤owь┐╩╒Пx{э▀е╧} eшG═╧П¤№Sy Йхэ┐№╔░t┌Mi5└A√¤ЧЮ╗·┤1Вб~░a=>J╥│ч█║╓!▀Ї9CЖ е3╔"┴╤0 ▀╞AI╟ўCTX|[Зэ>√a╬>QР▄Mнк╞2┤еr╡╝t▄Еє╓оe▄в╒w╒▓╙wП╚ √sЯл╖▀╤┌7fюЭ,DшЗЪСx▓╠|&┘R_┘╤Gр-&е"╛ЕL{ю├ПxBбйW\Б╩.╗Ы°Б√п╝т Кс═╬$∙▌▓╣л-╒Р~{╩╔}7 иП╛ї╓е┐╗%У╚▒ю~с┼[ц╧═twГ;·┬ xю╤Gвp°Йз╣т╩ uYAс╓╒ў▐5ёДЯСс╨Т{Яq╔x!Ю{тС╗wv&М╚p╖╧?√WGааА╘<2 Д▄H гТмy¤Ъ;kVJeT)═=ЦП─ЁB^█.П-~Є ВУJхZ╨урN{{√ @C∙№3█■▄▌]Шv∙х╚6a<,ЁA┴┼Їtu╬Ъ0o─СhУ°$Ц иv╟╕хЪkV┐ЇrоАПRB_u|э{ !╩┐2l¤ўQїeiя|D $╣  S ъОГ▓аю╬ЎЯ4R-Ц'№цlkЪў"┴7 ▒зЄ∙|Kk3└tOoЧ$╣чЬz╩][>Б7┴▓ё.7┤N╖ж▓К√°j);ёьsQ╣║°═╖D╔Ч╠ц<^┐Б#]ьпА¤ыц}└·[ўї┤И▌gў<Уho/·1sЇу■єSy ЙхЕ■╔ F╖ Z$¤ррє┐}Ъ[W?|ў-hжзc[]╙└НЫ>/╣<╬╨_u$Зw К$РОяaEвЖq░╩АГМНwв■ qў-CЖ ╒Аa═╥L*┘{р░╚╢4MЯ4zЇ┬╡пт  @№лqЕ╨▀╕д -Z╟>№?Дбv▒\OwWsC╜*Ч,├И╜╜▌]-Z╢w╢5╢╢Л╒p(T*л╔D"рУ|нС%╫*°▓&▌DФй┐-П╞┤r,Y,ыюю.Ч╦сP`─И║н[{pH?с╚dкN╢ `P"gsР╛FЄ>Пpэ▒ЗCж·рSJЁч █4НZi╚╚Q]╘У)Мряlыж(┼/Йz╔┤LЪУВэщLыбї▀lыё╗]7oз│Qбo 4вp┤┴╥°D░Еl▌Ў вRС5Eї№щLжa`}&╬m1рЧ╠Ъ"▓┤ЧwЛE╒vxQвi╢Z├┴иЫЪы+▓▌╙УЁ ·aис!Июj╣ёI{v╒┼#┘t╞ +ЖхЎ°Щ╝[Є╨4Y╔хъвБB║x╚аy╔Д?,ЧЁїАА С`А"ё╠╚}}}=I╤╔d╘Ьу8ш'J▒╨пg]▄О]╗Y╓Л╫wtu.╒╘ф∙·/m╤X8УшНD┬╜▌=ї-MUMЛ╖Ж╖|╖c@}SeGЗЫсB═ёоTвоо!█ЫмCUMO"▌хїф;УЗ╪╘Х№├PУОeЦKєп┐ю║ Z+╦`█└ √╜Дй45╖l∙BЁx)ЧHўv┴7WV╩C7l■р╙c¤ЛDп▄ЫJВmsыў{-╦щьhЛ╟гП√ып┐нпЛU╙]Тл2M(╚ИDbfеъE▄─_ z╓гOи╚╨y╓_оTф╓X▄.╘ЁLМVД╩4INЄzўt&╜■@.УЎсPиЦе╒ MЩ▐∙уяh°A█@RЮцYЇ?Еб.+╖фЖМq2dEа)B3n<щд╦╓▄;d─HUлy╜CRЕbho└АЦ╢О╬h4Ў¤w█ЗО.Йt2]kkk1bDв╖k└А╞ООюp8▄╓еЛ[°6AU╒■ЛМa╚╗\─gЯ}Н√IтЫрCБX,┤k╟Ё·ЪЫЫ╣"ўЭ,ёB$MўУ4гЫ8▄Бн╩ДZY|уНЛz╘ж8w0\и(4A│ Сшъ`IчЎ╙V=■xйRЛ╓G│yАм/v┬ ╖ю╫CЦ─с$QlяN°}A^`w|╗u°рVнZdЁВзщ r┼*░>┴ЛЕjЩхА╤ЖXбЫ╗╢я9r$Мч╪Ъm*8Аcн\ЙЗ"j╣ #"╘PзBYЁїCsP.╖8╚Б/¤_UЧ▄;/╪╖Ї┤▀Бь√л╢6J:О EА┤vэ┌nhJ╩? e¤Ўп╙└я 2="%луkўx╕.Щ╔@¤Гц╫·В:еsYNЇе·ю>F}7оЎ_ЕГэ┼AЗ╪?вИ╜╖Rї═|ьeD├Ь@UMО╫Gk╒кR*I лХJ бp╣вфs╚ 5}┐нНуШP82юї щdбяZ╪Pр.H_eЧє=>┐╚░Ввъ┴p░н=Й╟AJ ып7А┌√╫ЛўыПЇ▄/┌?■ъ*╫+??ЎєOх¤'Ц╖oяm╪V▀ь`╬ПgЯ╣ яT?▄ЁC▌▌▒н╛iр╗Ы╛(ё{Ё░┐t$─#ЭtС°╬ Г╞√Ё▄:^л-s}│Гц■╗x8{ё═ОG┼-[╛¤┌;╙▀H╬√╬╫}ў▌═╛H69гс╠XЦ=╓NЬмС? @ А ;y qРї╛▐ї2 ╦Б ∙═╛Ё╛2 ╩Б b╔Б╜Й"[Цц&9ТмHОц>8<╗┘wuU╫}эяйjТ=NVУxфI№| №Pмооzъщч°<╫я9~ьX&┼_√ЧЁd(Iw;▌t╛4┬ЭЇс=Т▌яКOю0н ╧&uPВ0,╒┌▐╬дХе#┼+я▀ХбЦbHi&█SGЦf1ЫSЕ1 %╘╜їЭ┼TЖ0M]3ЄїJ?Є√ж.Aу╒vєJ╓5,О@Ул╞cS╬╚▌СFЁ+p╢mЙ┬Лє4AъП┤╞ть╞╜TД╗█Э0М8V(3у▒ўbУ:Iс╜Сйлs╒Щ╚sL╟╬цЄ[н'gx1ї+ФцTр.68Юq)Т╨░Чgеб╓╖ и╘Eн Зк├нf ~5(▄yi╘+ўю)щtбTВ╘дЫnз╫E╗#:Юч#╫Bh╔╝ы З¤У╟k7n╡8%=░╞LZж|яD&╫oЎ Щ7|P█╙═КТяиjщуННЦ:Ч╔╢╢█╣Bvп¤ч/и╕кyik│∙ї▀ Г ¤╩?9оч║n1Ы┘▐Zуй0 ╝Bб`8n─Є+мBF╤МB^yяpТщ╕Ъn@[b8╘Б_<э М└▒Г~7ЭVЦs-Ыз8ПгФр3Ф└єЭна Яп¤)ZВ* /№═_Т"o╞p╖єё∙гГVЛHКжХ\й┘щgЛEИYduUeИр╣ ■▀И╡;─№№_¤у?ЇЗ&┤ИКХhк┘дОдIОуLc┌о╠╨Бaэ╦_&F&┴▒▀zё┼n┐3█ШE■║в@╔ь╖ФТюўU"Иl╦=z┤▄n[щМ8 Зa@їпкА╛ГvCVXЦюмьї╡Z╨╙0мTJПm╫2Г╨k╘╦я╛√│gЮ■╕>ЙВМЬ╠СП\y∙\Се ё;┐M Z├|ы√ W╩ П4l9 #ЙFM∙у/№■ z■kЩLЖУR╒ ∙;Ею# Щ#&grC}ЬЖЧсИv│]пФш╨л}?├эЎЖsGЦ┌к.еSЩ,qэънrб─dеР▌▌эЖI░Фа(c█(╧T▀╙·*4╓+∙Тэ║╨И7<фUА2pa6Ыw╤ЖцфдДЯZG▓?Q ╩XЄ`xН-@S9ЧA#┐▓,╥4лk*№"Ц{√юцl)╧S║├~пVле3Щ═цАdЪaб°Впgd1Є\ В#╚c█)U│вАЁ!"┤╢;мЭФ ў)J*E╢бє(В╣═цдсb.Эх%k8М,GЦ3 гq&ЯDJ °еGг!/░P2[&<╖4iaАZП═╣ЮU(╚╜^зPЪО4╙pл│s═fлTо┌о7йhТ$УОМpMПs@ё├ =├Я°}ЯЬўЕв╒з¤0а$2╞┴р┬ў┐ўе▀№ └┴ХdWТїїН╞▒╫╬╝=╥сёУя╞╜ГДGЙPбK▓ЛнqФO╠Lb┐W ┌ш"╧╔вшXv╡ЬZ╗│S╚хБ░lЇpт├╙nt▀Ї╟8sэg√йср).О?#p0Щ;iЇ╔0иVф┐z■╫?є_Х╖╛▒#╥эvзд│|КП(н?ЄCПh# iЙУD╫ F▌▒╠злY╣█s° пНЗh▀В|vз┘иBю*╨T╔Ш[UU8є■√└ЕЛЁD ┌┘▌▌:ФГ▐Я|■єДхKKDk зo¤┼_d eитh╙\_╒чцєоcшГыqщT °sнK┤ф#5-sJ4ф4ыб =M▄╙Tк4Ъ┌▌▄^м7(╟W█}╔AU~╚╤.щso╣vi&gh║ыаAЦT:{х╩Х╣·'╡wZуё°°╔c╗╦pГ╥М╥lЫ╢1>:?уZ╓x╪-Wk=═u ┘ї2Ф"гNй▒6bС5OEи┤jї┌╗я■╦╥ёУИ╢е╧7ъ7n▐╔ф ├сHТХЩj▒╙ЄЬhЩcY9Юї{АХrщю┌z:[Ї)pPэv∙б5У═l#7УG│}RЙ(▌їЗ,╚8ЫN{ЖТ▐╪╧MPўuw╢ЦО>хЖфэ{┘\БцhЙc!║dОъv╨Fjc╦6-жVМk5ъUи·Ы╗эL. фФl·\,xО╪┘щd╙йBNььк'е┬┴Г├╕jЩЇ|$J`H?║cf▓╢щМ╒A^IЛ$хМF"/IЩ4v█;NиЪаy▀h╠▄█h%гф▓ИЦ╔зх,в█t╓їl74г(Ї!╡єb╞.╥╞їЖК'│Ы╚p2Гщq-6И{dнў+ОУ_° №╛O╞√FTа]LЩ╢═~Б╬ге$┐!╗Ўх│пб┴т;wo4ОэНUУУшзО]Yo2╣?╞е! ЗВЗ▓Щ╔RЙ▄С@Й░7лoкDа tД╚ ═╓О└Є╡JEiОч╥РЛю/P■u}` Aьy2(░ў╝dX3┌├┴$(Ут[ ч╕V2вQ-Ч677КЕBз█хRKs)N╥;#СфА?Л┼№╓юfо^lvЪbJё=h╨J2гШCp ╪╪ ОaucЬJ╔У▌KYV3┤|>o96U(AZЦ ┼Я=╓ ╨╩╘╒477чПBс2tУнr-/t*W╚П5═┤эlб┌эw2)Ъ БV╞║НЁ╚Т═RFЎmГЎ=R╫│╝╪эЎ╥еВ╔РЖosХх╨r]▌╠зsQE░Ю-╨ИOш0 '4y╙)J7 IТv╢ЫН∙y╟t║═▌Zе╬│┬а█a┐wp0$&╙@щдЭ¤dR┌tБб$Б╣}¤·Йу╟RJцъїы3╡:╔;;╡┌,KУcиуC┤;4BFЄ|ф├%Д╨gi╩▓Mа:h¤яьь╩CДpВ╕╗╗Ы+б2PyиЎ3щ+жхt:Э·ь№PBьPnoo╫kДЫЖЦ═@eOkpG┬-еsщРt┤ё8pБЗ°╝}э╓│'Юnu{^Je╘F░=▀~|8a.ХюїzЮЙщt▒T╛}√6Д╢╡╡ьХ╬H▌vт╩ И┴╪T2▀їrК╨oяB4╥,ДACл/В║їХBкЖы+╒Щ╨sC?Аь#2Ь1╥JХr╟╘BЖB Щ6c√I <╨дA#╦Аф▌kю.+·@еЦbh█ў)NЇГxDЮМzн╓┬\Eэu}╧й╫ы#├ьЎ╘B╣lШ6AOЦ╝эПўб%%!gХ;kksєuИyО"бy├p'MrЦeбэDБ`I╙▒ ╫.Wл╛О╟Ъ▌h{ Aзх┤6q<╧Ё╨nr #├╖L╙l4╨Д3 #ЫEU>ЄRdYА╢Р* kге╡фe+е(ЪжfR▓жк▓$Dh▀Я>е9╥╦ ╟О-ArbiЪ lHTРwy)-e`Ц╤peB╡Фя╡w%IМg╨ОШoп,■╨┐oB)*)2'є║>6M#ЧR<█];н┤┬o■╚▒+╫я╠->╡█яr╔2tFVю\┐∙ь'>┘n╖!ёA1Х╬f4c ╔-и▓K7*┼ТкН бЎ╘a&Ч╒u`вmКх√√8H$ДqsЭЬnР Ъ8|ё|4Б@DШVRhS"ъcэўcгA}&Щ┌иКи8доP╬dбДД╫NdYU╙(1 HхzОЗ ╡МfрфєpМ2▌▀MЗ ▄ыаwgУ▐eТ0|GNе<╟ВwtCа╚ВТЗn╞KТuУ(ё╨lu┌ ёJj┬w\╧є╦3╒н xn╤єЬА@;Є∙Q╕╗█9~тф;я╛▀X8b&Г╕Р┌ы.Mъжh/HПQ╘#.ХЯм╣?П,№╛?╧ўEKц9/pYЙu╠aЪ!╬№¤▀¤╤o¤Цш9+ч▀°╓ J▐\█\XЬ{ыЭ+Wn▐:ю╡[wа ╚д╥Р1&╕ДTА┌B$╟аъ6Ўq!║?({ч├щ╢уЇdфр^я!t2)ишГOЙж╝RM▌!Ь■4ЩwL'.U╚ MпYг┼г"ёXъ¤+┌IЄO▄zОЎB▀ырШЬ┌gШ '\ў╨б┬∙{б&kЛ╚x╖АoД51·╔ Э╪│C■щШЙ╚╔тЮйP╝╬~4N|DNЗ~┌a╨Cc√жд*J~┴щ▀zп/iR'┼0╞)ЦJqж№в=X@O╟└~┬ШJBLMШЪ) ёЇыLх╔¤_─зи$╗ТЗ?¤чй╜Мv▀r√╜О ╘XК╟╥вЕ<И╞╔ ╕eHL╒·╔╘~╞Щ°ЩJ╥юГчЙdт┴aсЩМ=▄ї└}╔:дў&в$ЧN┬CN]╣пщ+з╥9╡├Ё▀W=OўБ}рУ╜Р╞>Ўs╞ы{я┤ў+─▀ч с╤@L}ўр╬ёх╛▀┐Гзя╥бQ:}[Єp'2ё ?81goЇцБ|qвM¤Ъ Ь%е№ОлOЎ║Бя JЯd-БЎ▓╥ЯuШишр┬ф╗ПР├ ЗЗдЯд тГYц■8y╝∙}/─■:ы▌■ч~▀╚}_hmB;6Ч╦AЫ6i╥АаЙ┼┼JvFн▄╡╙J∙CD╖n▌|·Oяlm╨D╕Xп=}ьhКЦ/]°ц7┐I^]█i4jлл?Е√~ьc╦╞ЫИ@#ТМП*B∙J┼зЙ╟ц4 ы>Щжшy`2╫uЕПUЭь'ч ▐Т╤M╙Иxd╫╢(▀оФK7n▄8}·4а▌`0шt:ЫЫЫ╦╦╦╖╗гR1}Ў▄ ▄х╙Я■4▄@ш2YфOю ├q4єQx\╟┬┬┬┬┬┬┬┬B╥tчa░e3bГБЦ═ж4Eї┌Н ПчYЦ!C#ЯCn2]'Ё,Гcщя}я{_№тУЮ╛7▀|8reeср┌Vkv╢▓╝№f╧<є Xфф)юL@РИ╗yЮбp╫ ╓G%}lz>ЎЄi? ╢╢╢E╣wяЮя√Т$бy├{│в╤╩?Ог)2ЫRv╢7ЁГ№ф'?Y]]ЭЩЩy¤ї╫с[п╜Ў┬┴wю-..╝∙ц[pS└A░|МФгСЦ░ ЪFў╞чуEXXXXXXXXXП_║>>Ї╝ @Д)EДуfлx╖▓▓Т°IЭЭЭ█эvL╙З IH"p8°эo0╛\╚▓ь┘│g╢ZэR╣x■ьЕР■╦зNЗ╚╟1щxv&Е№еEЁРE│Ф└ЙЄЇ■oёИ-╢╪bЛ-╢╪bЛэгZclъh╞2l╙6╩е pZs╗ї╘▒г+╦л╢kЙ╝дЬ∙ЄЯ№╧ ь╧Г╚ ╒_∙╡█╖o"╟┤┼т°CА┐d░°ХW^СeyВГ[Ыхъ╠е ╦$M|·ЇпТ╚яэоя╙8╚p4<,Z"ЎЛЎ▄Н-╢╪bЛ-╢╪b√╦`5U?Ї|>W┤lCdВ o▌╕╜tт╪┘7╬∙б╟│P▄я~■ў k W■¤╛?╓М╞тЄеЖo╝ё╞Л/╛xэ┌5IТЦЧЧ│┘lИф╜╡; ЛЛo┐їЦчy╟П+╟q╚═ЄЮHmчIъ╤╝╞`aaaaaaaa¤Ые╟лГr┬╒ZНИ"└╗П=¤Їп┐О|Л·>╧╟√ю╪60├e╚л(Г╨Ь;wю∙чЯOzWVV4M[]]E8╕▒╛Vп╫Бс│SзN% КУыэ╧дСяM,,,,,,,,мПB#U=Ї<╨┌p8Ьo4р°№╣s/^┌ыv╗└оы▓, ¤~?ХJ┬Ж!╔йёx Dў▌я~╖╫ы┴╖▐{я=]╫/]║Дq ы╔╒├p╨▓мJ╡ъ∙q▄╥▒c;;;ЦхфєY└6U╟-,╠├IYЦ╟4╘t4X|ф╚С╗wя┬5жiЮ?^┼╔▄AМГXXXXXXXXOжЖГyB╝єдТJ]║xёш╤г@kТД╢Жп╒jЖa Гj╡ ╪Чl╣╬░<░▄┼Л?ў╣╧┴зp№╙Я■t4]╕яJ▓qo╜>[]╛┤┴йO> ЦB█√EhG.Ъa)БЧhЦ:╪░[l▒┼[l▒┼█╟iGCэ╨єТиh║Z(╠╪╢с:╛ r'j┌PС╙C┬5AрF! №ц{!├▓ З├Ч_~∙K_·R▓┴▌Щ3gfff&KI╓╫7ыїъЄЄjзN= Цв░{╗CRpLТ4├PВ 1П▓ :╓┐GккMэ┘}`]╫╧dR,╦Sё╧ №▐ЙK╫п▀┤mSQ╥?√┘╗'╠═╒G#}fж(КЄ▌╗╖Уe%/^№ъW┐Ъ ┐Ї╥KpЄн╖▐Ър`н^_Y^гшSзNБе) ь╛╧8жb╤`1ї$°р┴[l▒┼[l▒¤e░#U;Ї<░/Оmз3й{kыЛGVW.лгС$КMю│Я З,├╝ЇЄ╦║жЭ},├0║оє<╟EЕ▒р╬0╪╤ ╓Gе╤htшyA ├╚чє╜^я╬Э;лллОуh┘┬dЪf╡ZUUї;▀∙▄._╛Ь╔d.\╕Ё▄s╧СЫЫЫsssя╝є▄Ї─Й└Й└|├сyдi`╔У}ъ@╙. ▒░░░░░░░░Я╞уёбч-╦к╒j╛я╢%Рц║.╨!`▀б╫├e√╖ъv╗┼bё╓н[═fpЁы_ : DY.Чп^╜ Я)Кф╟є<\kЩXЮч=ж╞┬┬┬┬┬┬┬┬ЪЁ╪бчiЪНF Ш┬1а!Ь?Їz█╢SйTйT l4эv{8 Е╦Ч/? №єду8ЁхЫ7ojЪ╞▓l▓ЯЭ$Ipw8ИЎ7вbЗ>╞Ч╞┬┬┬┬┬┬┬┬┌└╪бч3Щ PY╣\^__/ЛD╠|╟z}Ж@z╔T└d╝H└я▄╣s/╝Ё∙г¤hcccmm ЮЧ╦хр3╙4УО└ДўGЗУс┴b,,,,,,,м_м·¤■С#G┌эЎюююg>є8шїzKKKЁяб╫+КА,▌nаИ` ЁеЧ^"Kе|?Б<╕8╤u]т~°{Щbaaaaaaaa=>=мx.ВT*еыz2Ь√!o(IR2┐Рв(а╛b▒╕││є Eхъ endstream endobj 183 0 obj 56 endobj 184 0 obj 131379 endobj 173 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [408.207 235.035 415.181 245.979] /Subtype /Link /A << /S /GoTo /D (figure.3) >> >> endobj 175 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [124.85 148.734 131.824 159.677] /Subtype /Link /A << /S /GoTo /D (figure.4) >> >> endobj 172 0 obj << /D [170 0 R /XYZ 97.768 692.105 null] >> endobj 166 0 obj << /D [170 0 R /XYZ 138.153 411.652 null] >> endobj 174 0 obj << /D [170 0 R /XYZ 97.768 203.528 null] >> endobj 169 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /XObject << /Im2 158 0 R /Im3 159 0 R >> /ProcSet [ /PDF /Text ] >> endobj 189 0 obj << /Length 1878 /Filter /FlateDecode >> stream x┌u┘n7Ё▌_б╖оАh╜ўj╨╖▒БAУ┌*Pаэ╡KIDЎPHn\ }g8CIЦ\4╡Ж├с▄╫жЛ■KMWe╜(╦*NЫz╤7ЛoЛ$.*СyК30▄%Л┼*┼┐■П?ЯоSц╦Шo7И█ПГX|Шn~┐YДБb┼║м╬Ф∙y}s√Р╫Л&n╩|▒▐}E]─US-╓▌_╤Г▐═F-Wв╠г№╟хк╩лш~▄Nжed;uz▄!,"ыф╪I╙┘x╣jК$ZяЩ(\╨iпИгИ┤%М█KGРь√х?ы_oD▒иAпї╩ъ:оsЖаJ_? B4ч║geЬI@ЮSГєfыHт╝L#╦╥иw%kХз`ЁTZ┼MЮ{~ю╓w?u╥Iл▄(u-╛nт, тзГ╙╙N(}╥г5Є┤`3▓╥i╗} hЕА8sУG╧f$hgФ▀ЬзQ╪Й3v▌4■░Lы╚]╛4кc5юЖj╜X▒жd^цї▌@Рз╕f┤╔єGИ╪ Їв·~ZfEЇ╝,Л(ЎМpU'р;dqАР┬¤w |·z■ЗHwthзaы05ЄдБ╝ъХўd╕<Ї ЭFg╚/·йХ=БЭ6кuУ╤A=═┐▓╖C╦,Й╛гRCЬ{╣щU╠!NO▒"═ЛДb√4═}╫кUпЦр│я╦tйiSEАП┌ ▀y╖├DO┘■╫сO╙4.ак(■ўOOЇzЛмdл{рв1'-с}─PЭv╛|╥жМж-!-h╘2A /зО'I╓+ ЩР%@ж│ ГПЙ▌│╤╬йС5AП"VRЕ╧│лF[з╔хi╔QЎ/u╖Д8╚Ўл▄)T p WУЖaJo!│U╦┤М▄DШ~Тс╤╚А2Ї'п┌=:╝¤Jx;`? В∙┴ь╤bф\Е╕╓√ !=В,╬╤3√Hз2 f`* ьR▐╝Т3 ~бЬШ╥э═4яЎt░ФтШ╩xrPэ^О┌Ц┘=hcz╚ў╡ ╤(л╞ЦO^{°Э╟Нь%а╗аЧБЪ┘)+N97Гкua╥╡{╒▌╬XaГ!│РEЭG▀ц╔g┬:№ф╨°┬Чj┬!вg,╖зГ}Эg╖D╝╫╗} SЮ"╞л_ыЁ&)ОИ°  ?йv;ьcImчёPLK ╠фЛ┤ыC═ыBcЧ`·СoБеЕд%SрьK°_гvцО┬%В╫>1╤ьA╡ *И!)e╬Ь)║H>jgП■'еЄ▓цф╦K,╥" ╞╤]зPp"sСHє╒Qv▐ф╤Я╪лгO╟■В*▀^к4╬П╙эуrUf°┤Lг/oЇв,nЪФiЯоxХqТW|╗^┬D╣[Каk>EЬ49S╛╗ЮФe,Du>УWeТDqЁ°╟oяпЩVy\&A╣SMг/╝Oo8с╬ }┬╞О.Mc"║╔cзО▒ЕсH=-Г╜╗·yА╕dq$Ї│ф|"ъ}єDИ▓XфбSъuйWt"щ┌╤Йm >╦U└{╦H3╩+╠"е╤╓7QQЬ╪ё╣ ЎBh;C9ОдРK╠ ╩р║C╡║░[awч╧#NE)M▄}u iоGюr\!\│rфЭїJ│qЛТ╢`4@&їDC+ ╖Ч[╔║aД=Ц▓°╘ф╛═АыR╛QЦш Lы▄▌ЛМA8gйА ╦CNЄqш#∙бdl║╫мxW╔"Ш╨#Kг3И╞=═cщ╪C@ aЬk·}╝╟MсЧ,LПB@[uЗ┘╤│нЩ~EЫыЕ╒╟∙mйЯ▄U< {'ГCїЕ░н<@╖гс!x┼в;mШц~РБ#u]└z┘ЖW~┌zмфЗпS┬_▒ю8kh¤ў:ё°бhbєЦYX(Л2░г¤╤*ipВ╗0│ы:!dм4`■▄K├CМ╡з╠├З▐б8эШ╧М1їм-aМ·Жў╩:F°#┼^їВрV╛eНjXkvлР^ GЙ╨└ы2▌x╩ ▄~╢W░й╢├╘Ч№┤┬бДЗ╫■╡Д|╓╬ТF╘#[#╖GЖБ╫q)ї)╜1Jтg║▓,ё╗═к+fzl√╣SБ┘╘3~{▒еP╘фь&XSpЩ ▀Ш4┤Dр╟┼>ь■╕~├"g┬ч╟┼=·6кы∙УVЁЩЪ4aч~|№№°цga▌4╟!Ў·ыВ╣фн?)PxU\Н @Qъу∙Н/ ╪╟3ШkїлЛП╕Ьс"Е■жП  ╬╚╤╢FЬ}ыS"йт▓,Xх╗╦'tЖ:ЭLgiД╨О,╩│¤Oз╧/8°bбЧКТФ ▐ф╧)@lнX┘°╦1hvf╧╝Б9╞Sq╡С╛БцНИш╣▀fСДk ╔bё#НПTKа!ЇїОзЭBї└ЧФ╩АAk№{┐~!ы╨·0Хuь~xшfs╘Фk1KК8GkДИл╞Sу┼═¤·ц?Ф╛┴╬endstream endobj 188 0 obj << /Type /Page /Contents 189 0 R /Resources 187 0 R /MediaBox [0 0 612 792] /Parent 176 0 R >> endobj 167 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./hilock-sas.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 193 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 285 724] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 194 0 R >>>> /Length 195 0 R /Filter /FlateDecode >> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЩъШ(шYШШщYXЕМ,LбJЇГ╠\Є╣БЬм ╚endstream endobj 193 0 obj << /Producer (Aladdin Ghostscript 6.0) >> endobj 194 0 obj << /Type /XObject /Name /R7 /Subtype /Image /Length 196 0 R /ColorSpace /DeviceRGB /Width 842 /Height 331 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 842 /Colors 3 >> >> stream xЬэ▌Нy╙╚·7`╣В$@**╪P{*8Ь ^╢В ,[┴Iи╢Вlи`У №ЪМ"iF3ТlНх√▐ы┌kвПЩС?~$Ы╒▀ ]=╕┐┐?;;╙╓╓╓╓╓╓╓╓>ъЎjяЮ>}Z░▀у▌зOЯцЮ яхQ╝{∙щ█i█ъ╟▄МЎ░╜┤╡╡╡╡╡╡╡╡зn╖т╟м;▐= ЁЯWпЮ ч?пЮ┐{їъ╒Ўп╗╗╗O■№эїУы ▐~■ї¤л╧я╛~¤·∙ъ·█Ў{э╥&ЕrXo╘Лпj7┌╖╦╚сm6ўgmmmmmmэТ█cо╜╦КwэQ┌giлФъ▌╞Я▐юJw>|°Ї╦я╗Ugя~╜є╛╛qnдKПwН!╢B5╢─к^╜ЧЇIїnыG2} т{╢█№ ═Ы7_ їgwz¤qДUё.┤Yd╕ЮЮ╦°|анннннн]Z√°о╜{Ў■═╗wя╢эч╧Я_╝√Яў┴т]№фl╩ФRЖИў ╨■Nk]╗о6╛z7шЫ│╡d·я█Ы╫п_ ▄∙╙ПV;╜>№ёо3╒х■╠Юkя┤╡╡╡╡╡╡зm╫п╜╦НwU└~ўоя■·ыпўя▀o·¤··&╘урH╖Уї═┘*\╠K№цl╗чЎ.!Гп╜K▄>tэ]|п╪╡w┐~∙є▀ ■ў∙∙∙vыM╝√ЄЄmwz]╢2>hkkkkkkЧ╓▐пыыыЗўg?╓Ж┌█xў█o┐їn╣m╫п╜╦ечwя...~∙хЧ═Я?■Ёс├▌ √┐ Ан╖┴sм╙xи▐хО╥є╗w▀█o_n"с╧ЯAioS_▓$s&╨╓╓╓╓╓╓╓╬mў№ю╟хQ╝р╪ЙwЛ"▐,J╝k№ь▐╟П╖┐з·╡хэ>█ "Їп░E╢| Nf7Н}╠зўяЭ╒T#юЦ╖n;kbэ╣Eж║╫╗JУят h╞╜√╓7╚и┤╖№─┘k╢ыЬ╠■vЙь╪yk,ц╛АBИw√%▐ [8`И┘яk(─Рx╫8s:р╠Z$2ю┌ї│└щЭЗ▐Є█'Iw▌ЖдsЇм╔TБx╫^XЯLcЖэ ШF{2ї├i`ї°Fyрвqлnэ╗▓╛)я┌╗╞ЫeуЄ╕Їўщ╬7┌╬╨У{^$▐uv▐■│ъ vЭ╗L~дY╬ЪF№╞Й▀x╒ ^СЕYC╘wOy йч░`cлw/]│Яxa╓ьё.^x╦ЭOntлў3I:яFx·S▌╫ї═─;N═ёn|╬h/,6▐Е&Я2ЯСХ╣H80Щ°4"KЖНХ╕┴фўu}Хx└ЙШ2▐eЭ╣;╞x7ьe$▐╜ь║■oLvуЇЄ╚O╝5rП(ў╛я8│}╡в■g¤M╖╛pXОy╕▄нsaф@BYдzдН,RuЭ7l ЩO╓4G╤Ю^яаc<╥da╩С┤┌>К╨} s* jЕj ЬёОSс1└Й8Хxp"─;АEяхQ╝{ёт┼z╜^нVЭ ┐8┐Ш{╢ЬЬїц?Xо√√√H·:??▀lєх╦Ч│││▌ЎёЎхххгxў№∙є╚ЁтЗ'▐░lwwwС╡█xw{{╗Ik)╜]__┐}√VїОвЙw,[JїnяR.е√Ёс├╗wяTя~XUВDБ─;Ц-╜zЧя6█и▐╒╠яV _pТzАт╦Цxэ▌│g╧╞╗Уо▐ 3a(╠ъъkНГц,▐░lкwхя╥Йw╨2°┌╗╬Нi╨╡w╗SlлKo╛їspЭ█Дvlм▌НТЄц>rVС)Ez^╡6юь!о▐m√`╖F╓╕Э√ж╧з╖ Ф┌З╣П┌√о╢с.uь═╙р█~kqАc2мz╖╔v█F#с н▐5.вКДТ╬ўя°Оэ Ш°f=fVб]RzSE[╡B[дчмq'ЬdЦ▐9W╔╖фПН┼;Цm└╡w╗l╖UOxCп╜KЙeбЬ┘qd<л▐ ╞─ммсЎЧ╪ц:У█;ч▌ТЁ ЭЬ`┘rлwНl╖╡Kx#кwт]z╖щ├uЦпъ▓кwС}у│ъ4xwёв╩°▌;ёюёn╠сф╓з2`╬У╞;'g8Fe|s6х*╖ФфС▓cz.3л°YёnЁ9╙▐ы╥кфq╟\┬8F╩Ьлш<╗ю▓мx'█pt╩°▌╗э█pшЫ Н╙sэw█°Wzw<л╬╙Сы╓┌u╫Яэr╙E╜├v·й┬kууЎю╗'СqWПv╬зыnJМwJwйbкw╛ЗЦ9+FKПw▓╟(ё┌╗ЫЫЫ═Цggg╗╜BэЙо╜+AЩ│b4_н`┘Rкw█УTщ2лwёSлs)sVLA╝`┘RкwЫЬvuuХ■ ц,EяX╢Фъ]ХЩЁ2кw╗Ш─╠╒;ё`ZкwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(3Wя.╬/pРРn╜∙О┘╠╒;ёО╥Иw;╒;xD╝р╪й▐э╙кООx└▒S╜█зyу▌ъс хdХ╒у?;'╢П9зМ√h}97 бzWЮ CaVW{ гщЭO;Н№▐─;ОЭъ]y─;ёF(аz╖;╖;Й╓x{нЯ░ы▄&┤ccэnФФ╖яС│КL)╥єк╡qgqїn██╕5▓╞э▄7┤{╒║q"ЭGц┐√"k│╞ннJПwЫ'╔╖э╫т e)гz╫╕т*J:3G|╟vH/# ЮUhЧФЮ╟Фп┌∙&╥s╓╕#'┘>2ч°▌Чrч&О[√S╝р╪P╜л╥bY('EvyЪoЁмz7│▓Ж█_bЫ*▐Н╣SцРR╪╔YО]1╒;ё.╜█Їс"з2╖▓кwб}у'gуЭч╬9rv╡╜62n{▀J╝`!Tя┬я╞Nn]0еЗa=чо═╫╔YО]1╒╗*'ИДVеьШu╢nЁмтd┼╗┴чLsпTЛМ;ц╞╬Ж═9>л─%Э╦kуf┼;┘АХT╜█Э,p.┤*eўР┴│ъХ╣ю·│▌Cn~иw╪NKUxm|▄▐}Sж╘┘sЮsя┘ф╚┌▐qGФяФю(V1╒╗▀%╦Ь{Цяd;╩TRїо4e╬К=є╒ О]╒╗°й╒╣Ф9+ЎO╝р╪ХQ╜ГbИw╗Щлw╗Ш─╠╒;ё`ZкwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(│Wя.pР0Эї▄А│Wя─;ОЛx@щTя Лx@щTяFYнк╡╖√╙т■аtкwг╠я6гoФУ/╖є┘щЬ╪>цЬ2юtК╣╣ @їnЖ┬моЎF╙;ЯvO╪теS╜ЫБx'▐└■╠_╜█Эн█Эbk╝[╫Oчun┌▒▒v7J╜л┴уFНЇ▄8НЩvD╜█v╕io╓╕Э√ЖvпZ7Nдє╚ЬCwPя┌мq█лRtЭJя(]╒╗╞Ыh$▓t&Т°Оэм╨╚├╞ эТ╥єШВS;▀Dz╬wф$#█Gц▄{E╓fН▀2D╝р═_╜л╥bY(EEvь};Х╣]╥┘╜Зa%екЎх▄╬│иэ╡ёq{ўMЩRg╧С9ўЮMОмэw╠U┴D(▐P║RкwS\Хmоq9 БЗЗG е+иzwxт∙f▄Ўш█═┌C,°|7Е+вzWПJUWЛзе°Оэ Ш°~;fVб]RzS╜лWр┌╒╕▐ъ]UЛ#ННу=WГR▌V=╡s╥.iunРR╜ m3x▄Ўко)▐0Ч∙лwUZ, хд╚О#┐┘0xV╜─√яzє\╓╔┘▄д8ь▄ngоК╕x,Kb└╕╣Г└МJй▐Йw¤▌╬я║жsвёоjЭЦЎ(Къ]Рx?█;zК#Нw)C89 └\Jй▐U9Ч╨ЕVеьШЮ∙╞╠*╛AV╝√∙ч╘╫▐M°gчТD^{ЧШф╟M?9Кw▓│(иz ОjX[ЕwL▄=dЁмт_Аmt .Ёгх#╛9█^█╪а▒Wя╫o█┘о■чАoWlбp▀`╫ОЬ?э▄╜ўЛ▒█хб?C▌VJw╠кФъ]БoГ┼═ъ$│┬С~ПAщАT╜+Mq│:╔╕pдёf4їоў╫уfQтмN/▐ї■.1╨VDїО$зяАцо▐Эл╩LiюъЭx0)╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜XФ╣лw8╚ЕXпчЮpцо▐Йwщ─; Бъ▌ёяАкw{┤┌D▓ ╗яАкw{4o╝{}s│∙ ═ы╫NaА═]}Ы╗l вzWЬ`(╠OHЫДЧя▓6╬▓}0эгgаMїо8т0╞№╒╗╒Cc¤kкэ║Umaч6бkwгдНС│КL)╥єк╡ёг╥╥ЎЬlїpZ╢Э╪vkл┌y█·┬Ў┌°╛)vйэЯЭQ╧9\ШJ╒╗zTк║X<-┼wl┴─1fVб]RzS╜лч╣Ў╡wН┤ 3╥sя╞ Нш╓Y╠я`*єWяк┤X╩IСG~│aЁмz7Иў38▐u╓ъЎФ╪rу]#╖9] √SJїN╝ыяvt╝kЯД═к▐EЎНярРTяВяR┬_(▒х╓RтЭУ│0ХRкwU╬%tбU);жg╛1│КoРя~■9ю┌╗╬J^теx╜√╞%^{'█└$ к▐┼┐гZ╓Vсw<л°`╞┐ №h∙аo╬VБo╚╢╫╢7шь6┤o╚.█E╛9лt*еzWр{q│Zn·Q║А T╜+Mq│ААєWяz=n%╬J╝Q╜#Йx$Ш╗zўc&СR╜╗╜╜MяЁЄЄ2зz'▐L*еz╖ЙwЫ┤Ц╥█їїї█╖oUяfУX╜█е╡╕═6═xзzpHщ╒╗БёNїрРTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяeюъ▌┼┼4╟q ╓ы╣gБ╣лwт]:ёHаzw<─; Бъ▌н6Сl┬ю─; Бъ▌Йw└сй▐' ┼; Бъ]q─;`М∙лwлЗ╞·!╓T?┌uл┌┬╬mB;6╓юFIII#gЩRдчUkуG=$╟╗═Эў░╣8зиИъ]=*U] ,ЮЦт;╢Г`bъ3л╨.)=Пп▐Йwp╩цп▐Ui▒,ФУ";О№f├рYїnя╟╔Y`МRкwт]╖тР@ї.шxуЭУ│p╩Jй▐U9Ч╨ЕVеьШЮ∙╞╠*╛AV╝√∙gN╝УэрdT╜ЛG╡ мн┬;&ю2xVё/└6:М°╤Є┤─жt'оФъ]Бaд╕Y%╟;┘NYA╒╗╥7+б H0їоў╫уfQтм─; A╒;ТИw@В╣лw0Х╣лwт└дTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`Qfо▐]Ь_Ls<╕╗┐Ы│z'▐LыЯ╗"kUяОМъ▌>нкj=ўАгz╖Oтppкwх АTя╩#▐#P╜[=┤╓╒ўF╒ 7л┌┬╬mB;6╓юFI O#gЩRдчUkу╬┬╩и▐╒гR╒Х└тi)╛c;&ж1│ эТ╥│ъ0B╒╗*-ЦЕrRd╟С9iЁмz7Иў#▐#S╜я╥╗S╜ яА#TLїо╩╣Д.┤*e╟ЇЁ4fVё ▓тЭ┤ф(йz ОjX[ЕwL▄=dЁмт_Аmt .p{\АиbкwЖШ2gURїо4e╬ *▒zwss│i▄▀▀ЯЭЭmWЕ┌∙╒╗▐_ПЫEЩ│шУR╜█┤│·Їo╬╠&еzW=Ьu╜║║J№┐sЎДмХ7а0ўўў╜╒╗мl╖∙┐ъ▌ яа4wwwС╡╗kяRо║█╢///UяNИxеIй▐m┐9Ы╥█їїїаo╬r┤─;(Mbїn╧┐{WВ╞┐Q1╗Ф_c▐╟Ь3Z╝А╥дWяЎ∙╗wЕ╚·б╗╜■*^╓┐Ь6с4Є{яа4кw5тЭx╟яфлwїЯ/nЗЫ╬√5■O╩╞ў э╛█&еє╚ЬГжп═╖╢*=▐m>qєиJ▄&╖zўЄх╦Ўf?~▄6Онz╫╬7ы└┌▐?#=ўn▄╗{hUc╬Эa.qm╓╕╡?┼;(═Аъ]#сэ▓]ud╒╗╬Z▌Ю█Tё.>чм∙▐цёЦN╬@iЖ]{╖KxїlWYїо7▐╡╧WfUяB√╞O╬╞;╧Эsфьj{md▄Ў╛ХxЕ|э▌&с5▓]╡иъ]JРJ<П▀8▒Зa=чо═╫╔Y(═isvЁulЭd]хЦ>▒┴sО╧*qIчЄ┌╕YёN╢АЁ═┘НuWZк┬k█tv┌7eJЭ=Wс9ўЮMОмэ7pDЙёNщц┤лwМЦяd;8МУп▐1ОпV@iлw777╒C<;;█о ╡UяNЛxеIй▐mпЫJў(▐▌╛╕┌├┤8ЬGёюыЛл█╧ў╒┘┘·■~uv╢╔У┌┌┌┌┌┌┌┌┌╟╒nVя╛■}?o▐`Мfїюя╧e╧╬ЎїЛ╒ї ╓х╠G[[[[[[[╗мЎ╛лw╫/╬п √J╚a:Ь|#mцє╜╤7лэЦэ═v=дt2∙мШVш^.S╩l<уF>дSЮ)├zЮ▌Б_╛ :0~─╥^╗Ў7Яy▀╦:ЯeНз╪ўЕЁьi╨P ёqKxI▀я╡w█J█n∙█ля7╟яЯюVk╖╓╖┘_Ю╜╛:▀О;ж■1ЯФc▀▐J╫Яю:╖┘оЭЁ╕▐■Ш╒ь╖Oсэ▌гw{√я█Г╧ЙП╧·│ж■8╠єhўx█oш1Щ■╪О┐VD·=G┌╖a╗Я╞6ї√ё√═°░¤╝╖sу6п?пп║▐J[╟╕[▐yЫ╘╖э█╣q_дя[7w▀°╕╣ПЯ┘_:я╗ЇўЕ╚уpOяeН╟U╗ ╚s?хy7╒▄6╖C¤╛є║1цqww┐O>ЯмЎ~лwэ╧Н%З№ RfoфФ& ИP┬gОc╤√Ё┘[d╦кї9Є└wYd─эк▄)MЄ╩РrПд┐(5nч╣Ю╣пвї?уХH╜│є0ўээ3w▄е╜╝oMЄ0ЮЎu&kш╜n3lJэgх■^ {_хz Ьўa╣╟kяR>Я╒╖┘╒Н:?пД>╟┤?F>gu▌^·ёVс·\и╢╫иI┤oЗЯл╛┐n═к│ xх╤╨П?╙4fХ╛яьўWчg╩▌у-ЇYmd=#2nу╣У8nJm ы╪{oУauОP═)▐g╩mШR╧█>_ъ╖s√6?Ёc,¤╢Jм+дўЯuэWё╫▐мq<~_c█яУь█[√∙\╪▀{YJ]░wЫ ч╓{ь)╖╒░v№╛Ыфїjяэ¤Uя:skoцн┬┴<▓░╖ч°╛│h\ЬС√i8▓6^uH№s@н"л┌С5л2╡?в┼ы(СПрY╟█.П ╖sГЇ9DЦПй▐е<к│f▀ ■╔╗¤ ЇГ/>спrcJ/щ7я░В╙>кwщ┼Ю╬9▐w╠═°^6╔▌┤┐╥]яУ╜{Ыо┐°$╛z7▐хму┌╗°╡o╗╓╞?╟Oї╣│7SG>;FЎЭъx|.йju╡x.¤┌╗╬э5╣╚ucо!╦┌╖1╧ё╫о╛▌оы4ъаё█╣ў·Х°╕э:S╩╕Нm╬ю}nи[ лe&▐ЖСчQ№║Щ╨¤{╚╟Xч▒─_{ы╧ж▄чi╩╡wЭ√╞Wc╞\kЙЯ/Jму~■{~еЬ╟╪╙{┘░·w№vИП█;ч°|z╧7Ї▐·.A√5$Є|хю[\їnфзЦ▐КQ9б─zUnї.^∙ш-БД>м$кяЪFhГ°╛КWw┌[Е+ЭKту╢чР▐є°KCB╧═цТ├^J5мИzрїVg`@ї.еЗ─■│z╬║ў'пH%▐їc █щ╧ю▐Y┼ХS╜█SyxЁ|z7╪kс0╥ybё°└ ║Ўо╖╢╫√yи╖&Qц╡wб╧ ёхбЪDи>W╒кwС╧Эё:_Ve√k_[┘{\ёы╒╩i╟п═Ё7ы┌╗Ў╥ы ╜uюм9tn3∙uTS╜цд╦╛┐8°v.є┌╗╜╛╢~╠D╞э╜│Ў ╜>ї╡wбaф╪' ╬l╓ы╠^п╜╦═єv1╒╗?ё │зъ]o╧щцN)╖чЇYХ)^╜█mРЄg╓ёvVM\Ф>bяlР╗c╩Д│*Ч)#о░Ne╪лh╒UГLYY▀╖╖Я1ужЎ╛0U1/4БSл▐эcVё√eЎъ]╩н1WЁ8шя▐эЄї╧уя·=з╬яЇ%ЮУ>Ёo n╖┐╗┌╕M:Пw╗╢q6╓╢√o▄U╫┌╞Є╞7gы█м[u╕╞ЄФq█▀Gы▌╖╠vф;\э█$Є\╪=пYl▀╫С▀6ЛЇУ√Щ▓}UP{╬#┐sй═ЗnЯ╨мz_7Я Ну:Ё╡бэ·D╟┴╢jNСяу7╓ж╫ЬB√Ж^oыs3ю°ўЪ°√Bчc5k▀╨уv@НнР▀╜kWтsO5┼·аСk√ж}nF╞э}╜К┐Wж}ш▀╜ЫQQУHQH╔░Ёq╦|y?LН :э¤▀Ь-дf6цsб╢╢╢ЎМэ_╗s°:eb-ди9╧5яe┌йэ} Ы│╥~п╜╙╓╓╓╓╓╓╓╓>p√Q╝{ўсKuVU╗·Э╢╢╢╢╢╢╢╢Ў▒╡┼╗/^м╫ы╒j╒∙ єєюo╓0╠¤¤}o·║╜╜MяЁЄЄЄQ╝{■№ydkё`Zww▒пBят▌&неЇv}}¤Ўэ[╒;А┘$Vяvi-n│M3▐й▐Rzїn`╝S╜8д┴╒╗Ч/_~№°▒╤Ыъ└╠ЖUя6┘n█h$<╒;АЩ╣Ў`Qлw■∙ч┘┘┘vс&F┌кwsJй▐m┌Y}к▐╠&▒z╖¤3^╖█╢Ы?kмzpHщ╫▐еЇ╓ё│╞кwЗфwяe╪7g3~EїрРWяR╓XїрР№ю└в╕Ў`Qлw777Йк▐╠)еz7ъgН8vт└в|Лwщgs(\▐й\ ў z┴[[ endstream endobj 195 0 obj 56 endobj 196 0 obj 8302 endobj 190 0 obj << /D [188 0 R /XYZ 97.768 692.105 null] >> endobj 185 0 obj << /D [188 0 R /XYZ 143.489 503.73 null] >> endobj 191 0 obj << /D [188 0 R /XYZ 97.768 401.16 null] >> endobj 192 0 obj << /D [188 0 R /XYZ 97.768 153.464 null] >> endobj 187 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /XObject << /Im4 167 0 R >> /ProcSet [ /PDF /Text ] >> endobj 199 0 obj << /Length 1351 /Filter /FlateDecode >> stream x┌}VKПу6 ╛чW°Ve▒ёX╢№ъ▒ш╨в@╤Э▄vўа▒Х─X?2Ц<╗∙ў%E*ПЩ┤ШADQ═╟GR2JрOFuЧEE╦║КЪa╜DIЬЧ╣╕Pс$ЙвН─_ уўЧc╔ZЩє▓z├x°c╚г▀з╒?л(№Й [▓╣2х╖эъс1лв:оЛ,┌юВ╡Jк╕Re┤m┐И╟n┐╠f╜IєZи_╫Ы,н┼_▌h6╧зM+ЬЙ0kЩЛЯ°cЪ┼uk)жСNж▌╒┤mжa╨cK╝пIТЎ&еY-╢■J│╠vЪЙю,];Ў║1|+h╓┤e#PШh·╢¤єсQхQошZЦqЭЧ Їъ╙╙╙Чзo$uА / =п╙D,╗uЪЛЭЩQ8┌d╡Мл┬)╦╕╬2/ч¤╔д─ПD¤ш▄йнDЖэ╞}oИ■╛Ц▒ЪЧ┼МН9kблф▓0 $8:ЪH╞Aия╣ЫfU,лФ=∙Ё∙├{_eзJ▐ў╒c71ё&╗╙)S╡вФб└┤╕у┬Цa┬╜edVй)cХf7!;ъц╗▐√╝%b?KT█═жq¤Йvшг_,АX8¤▄▀ёX*п╩ ╫у*то├y.b2WEЬAQ╥уЇбp7:3ыА тп>`С*Дu┌u╓uНюСQ4ШП∙╢─░╞ZКXЦ╘тoЯe╝йiq│m3wGGтTtTь═_╟LЫЎ#▓*J ╩PjЇp ЧЮO№]Н╛ь°{уЭЪи┤ВТКт}╠6AИ╥Ч▐ ЮJ─╟;му$ш╛╕╣ж╓╝ LХ┼EZ░┤ЖРYЗ▐╚иФ╥:│Yм!жя*░їьШ3╙к√■VД+─╙єш√l╕Y│J▒%╨gЦ▒53$О2Н U▄Ш1Щ_yЎ В╚Y {Э■Й╔╩!GЎhЪ ;ё║ ╓O,ъ> endobj 168 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ess-demo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 202 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 408 723] /Resources << /ProcSet [ /PDF /ImageC ] /XObject << /R7 203 0 R >>>> /Length 204 0 R /Filter /FlateDecode >> stream xЬ3╨3T0A(ЭЬ╦U╚UdШYшX(шЪШЫъEL ,а*ЇГ╠\Є╣БПh Мendstream endobj 202 0 obj << /Producer (Aladdin Ghostscript 6.0) >> endobj 203 0 obj << /Type /XObject /Name /R7 /Subtype /Image /Length 205 0 R /ColorSpace /DeviceRGB /Width 1018 /Height 574 /BitsPerComponent 8 /Filter /FlateDecode /DecodeParms << /Predictor 15 /Columns 1018 /Colors 3 >> >> stream xЬьЭ|┼╖╟gwя╜)$$@!jА╥$tд(╥С"╪hК╜ЛК TР&"Rд (дwС.═P!!РFz/╖ью√эN▓^CСЄФє{╝╕wwЎ╠╠┘}яє=│gfД╪ШdkЮMUEБI▓,Ы$A`AР╔КLУШ& 3у@8TDYeLШа2З I$ЙD"СHд{RВР+2;S]U┼ЭйА,ЖUЕ╣кL╝iу9║q fЛy┌)┼]U\U)K╒H\╘▒\╘А<оЪШтv╡Q%1M5е(6?Gn╤%c▌цяДKСёТ$║╣╣ЪLТьp0&├К 8T ▐е╗юлZg╨1экк ·Ш кВдшQБZPЎVЙ ▐Щ6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 WEцА╩@m╒ $╓0Xtшур╖`╠[P5(НцЫ▐кЛкЪ╤жНм Л╔UН╪Qьj)fI╠╠i╠с+╚▐Yyi▀╬°XИ╕Ррхэj▓╪22УY│>\/ЛКл Ч*░Ш▀ ШV┼Ь№*UЁ╜йаn&KU╗У▌Вю:ўЬ ▐С6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 gU ▀╦┌╝ ыгс8/▐|╕│"PZЎ╘╨Z╠╒Й_TUУвU─ Р[╘q[cu╜└╒rcвU╙╣4S╩дe$М?JИK,S╬=+':"Ємь░К7S▌TtГёш ЬBБ!Иї▐JВ" AЖ╒Ь√_" ╔рbЁv╪$Гwа┴█aУ ▐oЗM2x?╝6╔р ┐AA▒0·╡йA█ВкLW-7▀TA░ъCы@q│О√╣z8!j)CЖq╒TРiПsЎ"М0OUUЦ!Iв И┘┘╔єч/"╬'Ф)чЦСsY=┌╩To░╛j╩q9кЦ╟пG-Вд╚ZHБ^ Z╡в(а╖кк┌E&╦КмИо%Oц∙╬.q╤Т╝ Ц╕ш}hЁ?╝є Ц╕ш}hЁ?╝ Ц╕ш}hЁ?╝ Ц╕ш}hЁ?╝ Ц╕шhPmk╕я`zVП─L&╤EЦЩ],В╝єяPA╤Ъ┤#▄,Йv╗CЛHЇАя░пу╛ YО,ЛЛYvh┤D┼&hЯxta╥Жуy~■╜ZsE6 ┼┴╠f┘╜TnєVUємё ч/.Е'ЦЎ6gц$ЖЗ%ю╪7їынкреиYн}.Ви(Z╨F7Б╣8TU`к ШDW╗,ыmХ╤8н=w ю¤:s╝6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2x?╝6 g╒№8@[сFK╡╟б"KТ`U╠E╞к*ыцt`gВ╚Зj5KnрЄвj═VSJi#·jоЛЛл gf╣вфЙ┌ :V╜e<Э5Z■йGЦЫЇ6$╗Ъ╗ьиS╦cЇ╕■ое╥╠Ы'\┐тщm╔╠N ╦▄╛)хЫo6лкф/Ч)г°UЁЎпT┴lЦv1)!7,,╞n-оВ├a╬╔3ЛbYYqWEU╨xQH╙ц.РH$ЙD"СHўв┤Ф}-Щ┼UP═"S╦ХU[╡оцpд ЦвУydYїм~ЁxLLlL╠хVн┌┌эvУI║║░"и∙сД`W{lL┌йуQ"єё,эh┘▓Йh▓J&Ы╩мz8юч╫и7Я█-KJjЄ■╜g%╡Bн@╫▒У·╕╕&/°yЮэщe╔╚I╜p>k█╞д╔SV·°╣╖hW╞▀/Ўс65┌>╘▓┤Wk.;v°┬║5╗cв╝|MVлKtФzхК╦ХszЖ─D!и╥~╦│▐H$ЙD"СHд;Dк(kyєК╙p?лM█Є╢╜б VI)zк.@\E-ў▌f щз∙╗ўь^│ц7Ы═┴{о*,)к╢&m╣9╣╦Чэ}уїЙRї╢эkпXё╣ iГ■ ╘В┘║∙FEХ$-;╚f╡н·}╟єC' JP`uя╔╙Ю6ЩТ╬Ы/\╛юY┌+3;3№B┬он)у&,ь╓│сУЮ2ЙqrNВ╒ЪтY╩еTйrк▌═├├G2+VёиI,УЪRъ╚╤Л7!>~цмYv╗}ётЕёёЙщii.\р№ъ?Е-8уъ&╓╝6■╩┐Э▓Н┌╡ Z╛ю▌дфx┼R═┤╣╗ю▓*Л║eЗ├БУ┘ уЙЙЙs.\┤Ёа*7йS█┬д■оц─∙єЧ.ЭёЇЁ╦╩╩ П▐╛!y╩Ф5Хк)н:°;фь+▒ТУB█╖kьb╛[ы╘о\╒з|∙LЛT▐bЎй\├'-3nїк#лI9┤_╩SJ j9QИTУ└rф╚ььlQ/&ГIЩ╜u╦&_ОЮЬШЪ░t∙oл~ 3▒vm█╘_▒q`Rт┼фXkVN№еKвф]╡Ъ┐Y█W╚╚╚ИЙЙqssлQг╞Х+W6n▄Ўє№Г"k^#░т╫У/eО■∙ч|▄ў═╩╬юo¤={·Ф╜▓)╙l╔┤╔IЮYїъy?P╧GХsU$╤j╧)уюЮШ`ї*S╢G▀╢╛ТЛе№┘Уо╧<ёНГ╒RoУ)VuШ╠╠O2┌╨╗╖╩╦V5ш▀╗й ─ЯgUu╚ сИкиyj■zвТ└L*в!OR=▄}·ЧY░ЇХ~╜~╪▓9Хi╣J6╤д═LwU5Гь╡Щ┬Ъ}IdБЩU═аДpGU╜╗"YмК▌УЙvA▓л╢Є·╥в|ъ┬ж(Щ■гZ]дR6кёгIyz▌'СH$ЙD"¤K╫└¤Ш╪°тnД╘╘╘┼Лs▄ПИИ╪╡k╫З~X╣reEQ°Ё?$;$Qt°Цў№jь╖▒ 1┐нZ╣fEДI}иMЫ║+6JLИHИ╩ЙЛ┐ЁїФIййО>^зv-Dk╓м┘░aC▀╛} ┐iєО∙Wу╛Ц╠уY.3'їBDфЎ▀є&}P▀iKД╠╥еlZ&акZ▐╟ФУgХLжЬ▄ь╘Ди╨3QЮе╦7x░Ц"хTл┌╘┬В?∙Ё++/ижЄ~йХ|к)О2&Л5>)9юJЮмф··Z*Х▒Ye[Ю╦∙И(&Ш№*К■~е╒ЩШЮ*+┌74Т╚<ЦR╬/╡впПEЇh╙▐sЄ7/<╓u╬╓mлTєЎЄvu8ТIHМOKМ│√UtпPAVо.о╗#Г)▐в(ЗЗGdf∙┬▒5ШЗз$█╝%K^BBlbм╗╩\uИЧ╡╒RЕ╠Ъ╡*╗ХbТа\╝ЫХБP┴U╒rа║├-╖g&:ЙD"СH$що╒5p?6.сZwЁ|g▄ю╧Ю=√╙O?їЁЁ╨▓╙yI┼ФЦЦ╕t╔▄П>╜bїъU+.Hj█6нын▐<$)щbbTо]NЛ╕xс█oчЦЎvnшР¤√ўп]╗╢KЧ.`}OO╧ДДД╒k6,^№Wa▄П П╟хМ▄─░╚╨эЫ2┐ЩЁЧC4лZ▐╜dулT╦zд│╒кюvN╣ДЕЭOO╗ШТШЫсP══╜▄Еє9) ■╣┘ьВг╝пх╦ё]лU.·dT│╓u.┼─NЩ┤╥aw}ыЭ▐ ъWHHH-эс=n▄og╧EО¤ъЩ▓e_▀К╟■JЬ5m█┘│I*┴ёКьR+╚ЇЎGmЫ6оshwTе*еztп╒╖чўК$╛=вз▌Ю{с№Хf═ыF\М f┬╩NЭ~4к{dXnrrRpлА┐ Jёp ¤ў=3зЭиQл№√ЯЇp╪╒░3щ═ZDDFNЯ▓ыш╤8}щ"┘d╬ы╒л┼√ЇКОН м╝gg─ў3╢Д_He╠E╤p_еLЙD"СH$Ra]{t_Eю<9G╓мчмП┐iii└}X║tщ┼Лwь╪ё╙O?MЬ8╤┼┼┼░н*ц╘╘°Яч═| ╜╧уbЧпZ╡j∙Й=ЇPЫzл6NL╕9█бд├jtt·ьЯf=r╕RеJ╜zїю[,OOO_╗n╙ВЗ у~tXТgiПЇ▄ф░╦![7жMЩx@С$EuHК╖дf°U║╥яЙ└к╒▄ШъУuЁ`Hf▓┼┼╡tш∙ WKщ2хТSYщеем└LMГ+m▌¤ъБ?OЬ>С▄жCPГ&Хз}}ьў╒'G|╪+0P\┐■╧ьLKш┘┤г╟"f╬z!╫}&ЇBnЦ√Ў-g|╦╫h█бО"ф8x╝j5П╔▀<│bё┘ЧЗ~╫╜[Гы^ы█√Лб/Ўя▐╗■╓MЗЕж╡l]ы┴рК_╡777∙╦q}ц} ў■;\Ї╬ШO6vъ╪вUэБ¤Ў}▓╔уO7x√╡я¤┤я│qЗПш6yь┴╧F/╙&л▓л┘·Ї└G?°░єс┐О^МL╚╔)НFЖЕf╚*p_qЪ╤K"СH$ЙD"ш┌╣√Ьь%I▓Zн№@╦IС$p┐╔dJMM]┤h╟}Ю╗▄Я0aВллы?╞UKrrp─{гуu▄_q┴м╢kгс■а──Л Чsd5]ФДЇte╩╘Йь▐U│f═┴Г╖o▀uБ°cbb6o┘YD2Ot°%O╧▓щ╣йaСa[6fNЩxP11U╡Щ╘rКТZзv╬╗#:Z\2ЎR{vЯ▐╛эDrBeA╡╪YЮ*┌&3-єзcюВв┤nSu¤╓ЧЎl √фбU╠]l{w%ь▄qвyЛr|ЇdНje┐№b╔жН'О2нZ√╧Ъ=,фt─7УЧЮ8Ъ╪йS▀╞M¤MюYўЯмT~ЄФзЭЎ┌░┘▌╗╓√uэ░■¤G>ўт└n╜ъmZ{щ╪┴Л{ЦMЙ=░;■┴р┌Я}╒їЧЯ.э;░}ЎВac>▐Ўh╧Ъ═[╘╘╬УCZ<╓п╤█/-^4яп╤_ї{kD╗iУО|4r9S\┤¤└Д,Л%m╚рG▀ё╪Б#a&-<┌*╚■vmu UЯ$аш╕O─O"СH$ЙD*╨╡q(╧с╛`Г[ЕC??ц╔<7П√ ╦╠╠L[╝xэ▒УGZ4  ╔╦╦8p`Ы6m@№999+Vо+"Щ'·тYOO▀ЇЬМєQ[7ф~=∙░* ┌j6КЗЫ)╗~г▄QЯї2Ыr\]*/[▓чЧ┼;нЎ┌┌┬5В╢0(:┬жтЯ(КIнZм▌ЇЄи┐_ЇуС╓m┌5itр└EЗЬ╙сСў°ржu+Wк3~ь·┐■║╘@Sў╥I¤·u>bЫ╜Ж1W<БR.jЯ▐┴Uк║{z9· hyшpЄ─q+╧Еf0VZ╤ЖЎ╡9┴:ыSJЙD"СH$╔Р]_╨╕Я═TS╗╓Х╓or%6<.>!.ю╩ю▌╗]f}YLooяЎэ█{yyс8##c╤вEкк.Y▓╕┐c╟О№▒ю ╠ТФ є╝яG╝ )p ╖Uk╓,7йm█╢й╖rєР──ИДиМф╘Шх╦█▒¤р3Г<╓│╟Щ3gц╬ЭЫЮЮ>l╪░-Zдеен }єВ∙ЗD╓вfа фIП╗[А√ Б√бЮЮ╥││╬_М▄║1¤ыI√U╔E_е▐═│LLчю┬ C█╗е╜╝k═°~у┬Яў К┐вMxEф"к┌`╕─┬M,пz ╖Y?НKМ№ы╚йю]+хт■╒╪╡6Ыэ¤П·zxgД]Иh№▌7ЫЎю ¤с╟W┬#Cъ╫ 9I?~¤▐?╬ИbYжкв H√F|╥╧нФ▓|┼┌·╘xfP√╟ЫX╔┐╤ЁПЮ8uЄя┐;?┌╤$Ф■fтж∙~∙╒г?═┘wЇ╚╔3_;vAЧn-[╢мєT▀┘▐e▄Ж┐▀ч╠ЩШ├Cэ▄╛\Yў1_,ЛILm┘в¤Я{ :>Ї╡╫╛ЎF╙ Ы jєPP\мcЇиЕ'О^To╜GV}сNжнхЛ°U2xч╝6╔рhЁv╪$ГўГ┴█aУ ▐oЗM2° oPg`▀а╔$░6-╜╢l5ЄЄС╕дМР╙g▀}ч=ЗC1ъёлX~№ДёБ5srs▓2│.Zис■т%/]▄╛}√ф╔У╗wяn2ЩЬтФнyj°╣ш/╞}uх┬п╦wm\┼Д&mZ╓Y╗щХШд3IIЧо─dо]▒▌▌▌хё'║XL&Чу╟Пя┌╣лn╜║]:wILL▄░e├вyЗMЎЎ5kT u_╖╦ цў#"==╦еggЗE^╪▓)q╩ф?╤д*S╠ХR{ўu╝w┴#%]YЄыБ═#3s№dETєчч1╨▀"║:XЄCк?■d{IDц▓~▌бЫO"┬i▌жa зЪЫL┬▒cс? ┤VP╝╗vн▀г{ &ИЛ~┘єч■уВ╞·ок╩\ДtU═h╒║▐SХ,6╒иь╟6ДЬК8д{УжfAU─їль▄~тСЗЫЇъ|` ▀С▒╧<▌g¤Жm╡Гк╘йSs╬МНg╧Э4╕OУжБЪUi├║#[╖эiўHл~}^║d▀Б¤З╠.ЄЛпЇлY╦╫bv¤~цжРСКт!2/¤):X■f[тЭЎТСA· ╚dЁN▓IяГ╖├&╝ ▐ЫdЁ1(ь┘Ъ╫бн▀жН/ЖGON░┼_IZ▓dЙ(Jv╗M изgщ'Я|вti/UU╥╥╥/^М,Z№є┼Ииу╟O,_■Ы,+╬█ыкb6фUыўы▀-!-ц╖х{V,╗ ▓·┌╘¤mэЫIiчтоЬУmе┘├ld{╢─<°▌виo>╦ДЇЇ┤хыW/Z░▀"┤л]│тЧУ║║ФКX°є\!:<┌╙гlzN&pыц°)Уv+Ти(ви╕UЇ╔ш█▀зW╖FЮюе┬/Fо▀Ё╫бГЩ1╔ХКЙ)╝q╞°╖╢╡@Y3TЦг5]ХA√╪!0}у[!OQнв йJ)ХI&┴&1ЗМ▐ЛZxд ·.└*b WI[3W▓╡▌╔Їпd┼d6y*JУкbUУкZ°╞╜иK`-пИ!─P╤кЩT╦1A█╜K╒и]ЕRZ║3+,EUQ╩▌$╣8Фl╔ь░█╙rВЗ(XdЪр╩ >Vшщ√┤'ЙD"СH$╔РТПИ┌&║╢V-}Wпy¤ф╔йqщ.fWрпк2O▄WTНцЎмy╓х+Ц╗╕╕╠■q╬╤├eddKўжE│U╗:,L░edзo╪|d═к0)иu╦Ъ╦WПй╫╪f ▄n╖U-fЛh│;bумЗ'К╠┐^]▀gЯяzЁ╚jЗЬбhP╣kK{ 9Вd¤gЛ.YЦ$ зуSмьH░ИНлWєЩ°═╙&KЄ┬ЯЦQСч╜╜+ждеЗ_М▄▒9}┬─]Тш!кюyj╢┼-╩═3оr%п╒}Щ))фя╚╕KЮ6[`■.TкШ?о(кh╙╛kh╙vM┌^╖Ъ#┌%эМTРч$ы╝.kу∙Zъ┐v╗Ъ0hъкФе╟LL7%iжЁO╠cBЮfA√)х[╓RnDm╥Ё?-╤bЖВ█∙q┴'нjТ■ё┼h╣V┬EoЫMЫj-pЫ¤kА┬с>ЙD"СH$╔РEZЫ┤ SSvAeЙ*шЇд Щ4√┌╪3(╘д2O╞*B9Хe05Щ▒&шk╔и<┼жуё╒ТV═дV ку¤┼°>.оi ч═.^<]╢Lе╠мЇ3бg ╪С5a№vI(еи&scR.ST┘.Y*╗$Щ|{MEёRЩшФ╖Йz│▓ї3жВmфВя╝ШT░O-?п}╨╧Л╞Б╩TЕеk№пЄЄ№/■Yїa{╔iйС╒№╬iXj┴UVP╪иT╡'Д▀<I0 *∙ D∙н%СH$ЙD"СЄ%2}└┌кшl)iЩ7йМхZЕ╥z.╔MI╡╘С┘%U╓V╜W]T-╧▄┬;Sїu#Зд┼Аe-QF╒F╜ ╦$┘ЩВєnБ5┘Дй}%єХЕє.FДy{∙цфеЭ=zьH╬пЛB╤бе╡╚╛ т╔╞T7A╚С╠╤К═U░╫Ph╤МР▀k╞╬Aэ▓`ф3┴А`╒╞ц╡3╞y-T╨▒ЪГ╕ фЯх ┌X╗кГ~~"S~¤╖nD  М№дъФd╧┐░8Є┐'ЁшЗ @aеФn┴Ъ_@√ abbо*ц ∙Л·gРИzЙD"СH$IУиHZV║Фз А[T╠ТjЩ5╕╙ ╕kDЗ─▓Б√┌TUf╤цЬКк╢t 3iй1"Ш6ODдаW]e} ╗p еСIТPкrU╟s/55Щ▓╬[$\║эссЭgK ?╠e╗о=╒╒MR@╚,W╤BOA┤11FФKЙre╗%^ї,╒X╕┴Б$╔о·ЄDV>Фоз┘pрf:m█єI]?пhйЎ*OьМ┐Z?═_(Д╛G|c4ЄцF=A╚муРїЦЁ@BUї╡AїхВЬЭ╫ўВ╛╥Отж▌.фiv┤j╕пj│ `├E│Й3ZnСM/ ъ▒ЙD"СH$ЙдI╥pSVD ў┼,╩n&ma┘жZo>/DQ▄Б°ТР)й▄A╦▓"╪┴,0Wж-МщDD л ЬэW▒лyвфa╧s5Ы2]▌3нY╩В╫ ССЧ<=sЧЄ|}m^ВCvШLТ"╦┌╝╢Пf╫'ц:DСoBжM;Р▓■│╨(╛=ф Ч▌Фшp╚&I├}=$Rї∙╥┐┐шFTm 4AДввї_─Ы|l┌№ ╘+КВ>G[█E┘lVueTЬWУ╛щЪ└gxа=│7nRи╡КТ╢▄СP░к+o▀┬Xъ╡РDm:╣6┐Ьwгф5 ∙▒Чv/М╦┌дo}╓╣Ўpє JzE╜ Z]·wСк ,i▀tЛ· нw┌lx╒i╛ Bb№_ н*с¤╘лцWЭ¤O"СH$ЙTRqв╔╟]m·и>┘VU ушНIЯПкн=cdк╚"ш├ы)2∙m╣FY┴дV&[єl?╧[▄ПЇЇЇ╠╔╔╣pс┬┐╩ъ@VИM █╙/q\+)е▄и├¤?╞9З9╫h°OЦЩ>7┘░├'D})╛IF3nн╨ж3.╖ач╟Ж°ФэB-∙п╜.RкUкОп╦К╝С▌Р7 'Ьлc║7ЬO2з7═hТZВh╟xх q╝3ю;яbэ ·╖у)УH$ЙD"▌i╩╦╦√∙чЯпЙ√╚╠f3_┼│H·┤█эnnn°√_∙Й/T─YЬЯсГ═№'_H┬КмVBЩL&Ы═fм|Д.р'╖yuaФск Eыq┬ъ╚uеНшы√е┴K╝;╬╜fКFцццj╦Оъ╦6▌*х@мV+■ЄУ╞c5╓l║·FgD■O2ьЭWЖ▓X,ш ╔/┴|iжўЭ;ЗГ~╔Ь°НW╖Щ┐Bf¤s ║│&}М┐$▒ЙD"СH$╥=аыр>╙∙ ,ХРРЁ√я┐г4а ▄ ─OKKєёёЙЙЙщ╘йGI>И╬┘ы║8uт─ЙГ╧нZ╡j▄╕1┐─с;<<№Єх╦╒лWGEMЪ41S╝qО╢Ы6mBзx╔6m┌4j╘╚P7ЖЩ9щЄEOwю▄Y╡j╒аа ЇОб╤0^Ж▀┼kчГ╩%╠ AБ]╗vЭ;wО╫▐╣sчААchЯЫт¤B╒█╖oп]╗v`` ┌╙вE www├ИКр@XцЇгxos√лWпОЛЛу╜єЄЄъ╒лЧЗЗ g ╟╖ЁG √ййй√ўя╟#.UкФєf┼C9nOOO▀╝y3nчхс▐.]║а┘QQQ8П/O╖n▌ЁтсjVV╓Ж RRRъ╓н█▒c╟k┼ЦЕД╫ї╥еKП<Є:╔╔╔xгPЛё*r╧р*№ун[╖ц▌7вй°*E"СH$Йtщ:╕oдXЬ9sf╬Ь9 4ВУ@╧└жММ └▄▒c╟>¤ЇS^ШГc │в.\ИzAБ╗|Ё┴xАДsЇ▄╕qу_¤5h╨ 4 МDaО┼Е2a q`▌║uktt4"cш║▒.-Л╜ TрЇ╝m█╢zїъ∙√√я▌╗╖к.VР|bЁ"7b╨?g·╕2яoё▌ДЕ▒c╟ВклUлSрь=z└█МЄ<ШZ┐~=№ЙрНG|Еb...F~ Gm▐*V@ЁF>L1>╟]№C╟Ц-[BBBО=┌бC???P2┬ ▐5├QF" ?ЙЮ"т·ълпЁИ}}} Ў_+╠ръИ? №єZ╡jХ-[┼*UкД╤A`╜>с %%%ё╟ZеJЬ,╔ў uGО5jкГMЇnю▄╣h-"уAє6пY│ць┘│я┐ >w&ў┐T┬╨ВD"СH$щn╘їqЯiХ╢o▀■·ыпsфдЛcъйSз@Q`kГ8Л╔q╓т┼ЛЫ5k╞Ї\N]Ь╚E]А╣Г~ё┼0И*·їы╫о];>Ё_дA|?·шг╛}√╢j╒КЬ>}║ПП╧O<┴QПєєц╜∙цЫ├Ж k╤вP\as░";Па│ВЬ{ЮcМp_IQ┌є╨Cuэ┌╟У&M2dH╣rхx║╖╞├Ыс├З0аe╦Ц╓╬Э;#■1╞▌╤<*#╟y╬▀╢НT)▓№СqО╟єЭ:uъД ─(П9√n▒Zн▄9<√╖DDD|ў▌w#GОмPб rВf;╧▓╕Vе √1c╞╝·ълAAAм √√я┐ч═Ы7e╩╪AБ▌╗wГь│││QЄуП?о\╣rXX╪еKЧ┌╖o╧Dё╛E│ ~■ЖаIч╬Э√сЗ╞ПП0╞∙Aгj─xQ?∙фуiт*^┌N СH$ЙD║Ku▄7╞zCCCAfп╝Є +Ш? ,╦╠╠LLL}┬├├CBBpЬЗ`аl┘▓o┐¤v═Ъ5 DEE∙ы:yЄ$MкQгFгFНО;VйRе3g╬дззуЦЄх╦г !╤╤╤┴┴┴UкT╣.)в└gЯ}Июгх▀|є═р┴Г=<√,р{▀╛}nnnm┌┤ёЄЄB╨Яр~■уП?рЁ╠╒УqЭ┼╔x╨▀~√э╪▒cKЧ.═╜ЭЫЫ ;xФ▄'0ЫЦЦ╢k╫.╨0кC|ХРР0yЄdt╨жз]┴h[1Щ¤x ░Иын╖╘ём}4ю┼г─y╨< в/Ё°~т─Й~°a┼Кyъ" WW╫ы~9юуYМ=Ъ┐?xmр:TpWJJ╩бCЗH╘кUлAГ7n─гЗo8└#D\xQKR ЙD"СH$╥▌лычю3X╧Э;РYВНж╕e╦Ц┼┼┼╒йS@№▄s╧э┘│'&&Фт</F└}╨*h xЁ:Г├╨А╘▐▐▐]║t┴I└1@p╨аAН7FгЛ4nф╞№q└O Ъ6mш╣ ■и ЛЎгX╒кU┴▓у╞НC╟╕tщ╥╢m█"@E└k▄╚qЁў▀G@├а[ЁАc||<,р4╗°nв.╘В╞г^ШE╪А╢┴╒_|ё┼√я┐#p^~∙хyєцб╡/╝Ё┬Ъ5k@ч/╜ЇX( "╟y╕Ї┴№Є╦/╤░a├Жgс(\к[╖.\╫]kt▀┘9ЁфМ3└ю0ВG O"H├├х.mwы╓ Ф╠├-аpPP:8}·Їў▐{яЬ.4мzїъЭ:u*Sж╠╡▓к°─\╝И╗╬!ДЁєєуЯqЁТ└е8Гъєр*J"0╕у bДsx°╠▌ыц╪l▐╝y┼К╜{ўц_0bccOЯ> oє╠%╕ab!╝Рч╧Я?uъ┌'7i╥}╟│FяpЙчD_ЙD"СH$╥]кс>qЯ~ў▌wqpц╠Шэ╨б├С#G*Wо╠ч#ШВq╘ыяя╧Г%Ї}─╔╖▀~╒б;#FМАх  &i▐╝∙Д @ЁиЁ6р855h√·ып╧Я?Б*EЇЕрСG┘┐? ╗╣╣]╫сХ.]║i╙жИa▄▌▌b┴с°ЛУИ▓р╝Ъ╫┼}╝!?№ЁC╦Ц-y~nG/╛¤Ў[p W_}╒лW/╕х╧? DГ'▄╟+▒{ўюС#G"Т∙ып┐ЁъП3q ЁУH$ЙD║Wїphї╞o+c╕dnNЩ2е^╜z|ц(XР'о_ў╥еKaэ┌╡лё,jрИ═\╖o▀╬╫Дю ¤ў▀'8┴Я╒═q╪ jd:z╬Ъ5╦└¤╠╠Lk╛ў▐{ачя┐ ■Е^h╘и-9qтD```я▐╜╤D#щщщшEч╬Э╤M~╦╨бC7n№ып┐вz 6-~LЭ x оэ┘│'мп`а Я}Ў┘|PеJDЯ|Є ,гFЇёбЗ?~|╟ОсЬП>·иj╒к|йS@3║ЦE√k╓м DЕГ°∙т6%Яv╞}ooo└8`!M╡j╒xV_Зч╥р╣ 2Ь:u*b 7+╚█╣sчЮ={FНЕ.K8k╙жMаvр;Oц╨├'}Д1№1П4p╛Y│fh▐mД╗vэBЧQa^}▒╝m╫їЙD"СH$╥▌и А√[╢lyє═7Н%ъ ▄"м7n▄╚╔ЙП░Нyе╫╪@╓жMc╡D1└z╪░a8│yєf─╬╕▀бC `ёK@r▄я▀┐┐Б√`zў│▓▓^~∙e4╩╝°тЛ?¤Ї╙│╧>█дIУO?¤ЇсЗ>~№xэ┌╡{ЇшБ*Ц,YВ╪╓Аїh'╬ўЯ{ю9p6мэ╪▒Йи╟┼wMхЯ`?yю>╞О╦GўQ)ZИGН}√ЎюГG╤┘Єх╦Г√ °√√гоєч╧Ч+Wn╥дIh0В`.B╕о╞-ИЧо√░ НюуLjj*ОёX?рщГщс}═F,Бў"6°ё╟yв u]G"СH$ЙtЧкD qдА√[╖nх╕ПУ└х5k╓DEEў╗uы№ЛуR║.╨ЎuY ╕vп_┐>_E▒j╒к@чm█╢]╛|Щ/└вНППя╪▒#ЪЗаLЩ2П<Є(│°iй░ МлTйhШ/├;└Y╨Ў▄╣s╤┴>}·р<0ИaP/BОп┐■║}√ЎTрp'bPx┘▓e/]║Д╕h└Ёс├З LмPб└ў╨бC 4h█╢mё▌Д╟пХ+W~Ё┴yc АГ∙єчуЎRеJб GПwв┘¤·їk┘▓%'─h?\ДЯ|╫нГ"@;ёрЎ~°6pнBЩТ QГ░g═ЪЕЁ╬D∙───EЛ5l╪░tщ╥xж√ўяGxФh*╧╞Ag╤╝"/╝Ё<╞╓ю▌╗З╩#║"З{Дииsч╬шКс┴Б√oмZ╡ 6Q;╝}Ўь┘AГс*B─x╨B╨∙└Б∙[Q|wэ9r°╬╫)╨╧Ю={┬Д cЦ-[Ж╟К╪ ╟є┬U═Ы7_╗v-т%GHАЧсеЧ^Вы(wЯD"СH$╥╜кыу>З╚ЁЁp╨RП=М1╫={ЎА┼БЫр│a├ЖЭ·h╧Ю=qK│f═PЦ┐√ю;О■@ф}√ЎБАГГГпKК0ї╙O?┴?№#|┼╖/╚╚╚Ш3g║Ў╩+пl┌┤ XМ6юЫ4iЄ╦/┐╕Q░uъ╘йYYYш(-м├QQ╨╟Е "╓zын╖j╘иQТШ>√x·щз=<<р─0┘┘┘▀~√-кю├,ГЄ{рю█o┐Нvв=р{╪GМБЧ╧ЧЗR┼lP┼Gў╖·∙ЄЭш<ЖОДЖЖтЭC╜Ёъ╦/┐МЦЁ=╣Ё|@╢k╫a┌VТэНqЭ9sF╨ZX╞1b'°яL┴╜╔╔╔xd0И╫С[┼Кg╬Ьщяя гзя╛√.zэ╝Ж,ЙD"СH$╥=жыр>8 <$щт°┼w╣26Вх┘╒╞yVЁAАoqUТъ]\\°Zя|їwcO(╬И|aMЮъ├═L Й╢╞╓░\╕Э█ч╜└]єц═ ╜є╬;╝/D>Ф╖┘╪GЦўrss├Oч┌y├°dжпy]╚цC▌╬█{▒В╔мш8w▀Ч ?Б╣8FлpАЄx"h?_C╙pО9бт*╧M7╢т*╛%ЖO°ъУ╝R`7мхцц;ьЄU№∙&8ЙТ╕╩]┴ўNц[.ЁоYС▒Г_║╟И °j░flёpyе▄&яTIVцсuё}°O■░╕ЗaБ╗¤┼y4Б▄ц═Ы╟ОЛЖёЛQчiЫ-ЙD"СHўкоЯ╗╧▒М╧░4╕Нє4°О╞╢SЬЮKТ┴AЩу +Шчp╧╨фЫ^Б╞Ш╙>\№jС|f─Fc╙Yё█╖o╧╚╚x№ё╟Y┴Q└>╛ж зF~ +╪ZЛ/W╧ЙР╓0b~\Є Y╣Y^ ╟e~└└у╛·д▒З.Nхм╧ыт~ц╝ЕччєSЭў∙тqЭsЇ┬Пy ╞{╩Лё█ _]-▐$╬ы№9rwё╧╘x╚┴n,,lїъ╒╟ў ■√я╠╠L┬¤№iЭ╞|Y~Є&√eмєГ`о╚ ЖЭWР4&Ш:п)I"СH$ЙD║7tc╕Ян╦╦╦+99∙ъ┬\∙b'ч╧ЯЯ={6`~▌║uм`с■?тф-мЛo ║▀ЁX;Я*┴╗╝Цэv╗▒g╙Я  юТH$ЙD"СЬu├г√╕ $ j┐║░єш~BB┬╩Х+Q~═Ъ5|ь°╬┬}▐oБfВк кє┼№╦·/с_?os╓?pргЦ-[; ▄XяАЄ╗vэКННэ╘йSх╩ХЛ,ГЗ╖{ўn<╛i╟О¤¤¤╒ВmМI$ЙD"СHўМn ў┴ы|ъэ╔У'Л,o╠т╜rх╩ъ╒лнVы-Kцa·&п╞╬S╞ВA╬3 М<°kОСы¤Uэ┐*S4─З&╪Ш 1╒М#YчQpиYP,ТI░г?У$UpгЁБi┐ Ў/вє╤ў╜{ў╞┼┼ёна~°с№Ь5k╓K/╜dДJF╦Нe°Э#g!Ь·є╧?╙╥╥°╓WгGП █▓e И▀╣√6](=n▄8№хГ·гFНz∙хЧ}||°7Ю_DшO"СH$Йtш╞pмЯССa▒X@э╬;9У*?▄_╣r%╩пY│ц╓р╛▌nўЁЁрCрЕ6~2r╨Щ>╣╪hzV p▀ЁГ╛║'УUEЇV2╤б╚6Q╕ТСЪЩХруS╞ь&2U:Ї ┴Д aБ┬ЬY%█╙╜xЇ╤Gўя▀я╝Б└┤i╙^}ї╒"q▀╪Ь╦H√1rюб°°°Gy$44╘╪  ¤ў.]║8┴▀╦Ч/г^А~єц═сF╛Q╘С#GЖ>tшP╛oю5¤F"СH$ЙD║лtУ╕№°qN∙╕И┐pсBЭ:uАЛ|═№ИоZ╡ъVт>▀Ч╘@RcCS╛ajб▌┐о┼м dтиNзЁO┴ Q╔┼T╗-&-94<т╘ЙcOvы╓╕Z-a8┤{U3SExM╦rЎ _▒°A~Ю^┬ │┘l▄ПЙЙЙ│f═z∙хЧп╞}#Ь2╕▀╪kЦ+55╓ёLПv`-==}█╢mИЬqum▄╕ё¤ў▀пUл╓М3Щ>!8pр└иQг^zщ%??┐BёЙD"СH$щю╒Mт■╔У'З8^ю█╖я╫_}■∙чГГГ]\\°Є0╖ў╤b77╖дд$▄╚ЛБb}||*UкtЎьY^+╩└╧\/[#G▀ш╕>f/╪┘,&Xsг│3├тв9цсRк╝gйоmZW/уув▀шt▄∙+ВnЕй∙Жxrd*ўy╢МсY№|ю╣чЦ.]:}·Ї"qDО┐ч╬ЭKNNFHLўїї5ЖсЩS╢Nвp╫о]ё06l╪АгR╘xх╩ХЗzо▐║ukPP╧█Б╟FМ1o▐<╝┐¤Ў[Я>}x╒┤ЕЙD"СH$╥=аЫ─¤РРЗоэ█╖╧Ъ5 $ =z4ИФ╡╟╞╞о^╜·Vт>╧/_┤h╤;я╝cd┤╖k╫ю╙O?▌в)|m qу╞╜ї╓[╫вV┤ьСS║ ЎY╨8>╙fЛOK>uр╪1Л[╣R^═ы6lT\\J+д щ█%НЄY1Б╦-Pt3ВъРd┘dТоЛ√ЕДЎ4╕?c╞МW^yхj▄чJ:uъtЁрAЖ╫ PhА▀ВЯ:8p`╦Ц-Э;wv╛Д╪лuы╓xxZuы╓u^w ╤G▌╜{7p ё╟┐ЩuБH$ЙD"СHwФnў┴ю{ЎьЩ9s&ИЭU>╝b┼К8NHH╕┼╕ги°╪▒c╦Ч/?■№╓н[лTйЄЎ█owы╓m╠Ш1┐■·k╟ОГВВ·ЇщГ╕_Ї╓в3A╡|}БYv)95".&▄▀╡kс>ЙD"СH$╥=жЫOцILL\▒b_╞(кl╥д ╩єХyn}2▀=*""b┌┤ik╫оюўя▀az╓мY╡j╒тС╟╡Fўu╚┤▒z╞NЕEЮОН║РЫЪ\гJ╒j╘отэU│|9│ЦЦпН▌╦ZaХмК░~▀Я{╧ЗцЩ$ЩIfYР┤╧(З`└╤╜UыЗ4ra%Щм√я╞Фўёwєц═111(№Ё├^kWм└}╘ИТ8I╕O"СH$ЙtПщцWц▒█эFж╛Бй`NЮl┬ГБ[М√.║°╓иииIУ&m▄╕1888$$dЎь┘э┌╡у qЛ░Т▀a-З'"..6#эЇхЛбс*T иP▒N@ха╩~юр`┘оН K╠┴T └/Jттв╥╙мв( вEa& ЎБ√К ╦╒*TиR╓╟д╤sЙч1<ЛFўЧ╟[pzч╬Э8Ё√я┐у└9fю╖n▌З Ў■√я√√√-G╔▌╗w Є╦/ ╕zхЙD"СH$╥]к└}▄^UЪ═ц'NYЮу"АЬякЛ*╓п_kpЯG8 ?~№╤гGGО┘╛}√)Sж>|x╬Ь9Н5bzZЛ┼b)║C╗щj+эшC¤}ЫнИ┤М Ч/╟─E_МпP▐зnНЪ╡*Tїниe)▓Ec.╛┴оУ▀■SМ3┴уxш╨б@эЩ3gЄХyx$c?/╝xёт╚╚HЇя▀ БpvСєєу╔<▄║u+B nНЫ┬c°Ў█oзMЫЖУН6l╚┐,Z┤ш╦/┐l╤в┼зЯ~─ЇчM╕O"СH$Йtшp_Цe╗▌{нЄ▄xnnюЮ={ЄЄЄ°о║╖ўa·Їщ-[╢?~|╒кU╕e┬Д ┴┴┴3f╠Ш>}zп^╜Ъ5k╥m┌┤щ5┌ ▐ч¤╬╧bДA█N76-∙LxXBJ╩┘єчj╓оU╣R├к╒╩zxYЇ╜wE&:oлї/л║п ╩F╥№Т%K._╛МГ5k╓;vмwя▐ш╝e╦Цm┌┤q╞}8¤╤GЕ+ёБ┴SO=х<3р└▀~√-11╧fю▄╣Ч.]2d╪ш╥еK¤·ї9┘зееўсў╟▄╧╧Пg@АДЄЁ$Pф╫ЙD"СH$╥]к└}З├6uъ╘ .\7o╖─╟╟WйRe▌║uF∙-Шк;o▐╝╫_▌ШП█╛}√╤гGё∙ЪХ8Й`─И╫▓у╝═Ц6*п7Хщ t╩8!Jv@Fъё╨єccг.>╙│g╜ъ╡Lк*йB■▓;№■$6@ ЪщCNСs_tю▄y╫о]╞gY[╟╙Д.М9rь╪▒Fy▐йО;ю█╖eЦ.]:`└чеёa^╓ЗДДЁ.C<н ¤4И/М ╧ Ў?~№ў▀ЯЪЪ╩Ы┌┐ rх╩╜ё╞uъ╘).КD"СH$Йt╖щ╞rўП92{Ўlчtц4ь╝ЕОггг-╦·їыy╬═т>╙SЕО;╢pсBЮёВЯ╒лWя╤г┌Цх╨▄п_┐NЭ:]3#и╨о║Г№L╒7рDUd6U╡Л┬╣иШ B[7m\▐│мY╧╫TсZг√%O╬A;┴▄g╧Ю5№eЇр▐лW/╛·И╩Ф)|g▒чЮ{.88╪∙*Lс)NЯ>=**╩∙Yв│┘ ╓o╤вw=┐ЪСС1c╞ X├I╪yчЭwj╘и┴ГДщЙD"СH$щN╒Нхюкч6Ы═╣Мє1_'&99y╤вEА√╡k╫3zo ў╛юююооо`\╘Zхs[ н╝╔gп^k▌¤Tиу▄█х╩МY╡▐и░"кКIЩвН|єtбгc╡@Eе_ЭN├;ш╝╓П┤ЬGўЛ╠#т╞  8dЖ╟°]|х╘'СH$ЙD║╟t├+є┘===Бь╬eЬПy.Ihhшw▀}ЗZVмXqkТyp╔в╦рWГt9юI,<[¤ q■У╗o№ГdЭрM*╦▀pWз{E_XS╥░_╒o╘ЦяTЇТEпъ=ёH╚¤BыыєKм(Ъ7Ю╙╒щїЬ╫yЪРq#ПyЬЭ╔ЭЖРЙQt!dт┼Ь┐РH$ЙD"Сю▌юєyб ~АeHHИQ╞┘OG∙ДДД▀~√-//oэ┌╡╖,w▀┼┼┼╒╒╡P║╝╤8╙мgKВ√╠ ўЩёТjTe-КївиHфы∙p76║я<ж^И░На╨и?я▀▌ръ╧╬оw╛╦y¤члх╛*св$ЙD"СHд╗K7Ц╠╓ЯЭq▀9Х▀АЁ╕╕╕uы╓б0_ЩЗ▌к╤}777ЪQJ"СH$ЙD"пЫ▀U╫(Sфш■Х+WVнZu+w╒%▄'СH$ЙD"СJ(┬}ЙD"СH$щЮс>щ╚ШН└■=ыа╨ЇчW╧Tfkы:]]└┘ИєRE Г>ТH$ЙD"▌Н"▄'▌ёgoLЎ╜zY╧BSН∙є-4S┘╕╩ЬжєнШ ┘сЬ'е7БD"СH$йHюУnБЬЯ╜3пZ&шъ[ЬЯ▓▒^Р├срл8 WэRllY└/q·/РH$ЙD"С ▌п╕╧Ы*:%фЯVЭ хяи%Ё#би[I#·щщщxиЙЙЙ/╝ЁB╡j╒ Сzllь▄╣s▌▌▌ЗZо\╣"╖ИММЬ3gО¤CЖ AIg#№╥┤i╙╝╜╜Я■yc╤╒ ioI$ЙD"Сю▌}╕╣║║ЪLж"GО н┴M#J░k°ошЗК╩+cfХI▓╩dж*▓`ЦdСхУ ╣┬░К dA│й/╠╧╖у┬с■/A└[╦∙╪HF7╟Gм∙╖1Тэ|пё╙y;н"3[М¤╣Ш╙H╣сч▌╛ЬsхНZЬ/1з═wп▐ўЧд▌╟╟╟wю▄9**jы╓н>° /╝tщ╥░░0╛ ├┬Е ¤№№vэ┌U╣reгa|;0╧Ъ5+$$d■№∙|п4А■ып┐■╬;яxxxЁцё&сj╓мЩ┐┐?jб═АI$ЙD"СК╤▌З√h1p▀l6├║s7√w √7·Vб■ ?г╚▓иmдК№6QЛ╗Я_пjuoQЩ$8tЛ:ю+·НNмПГа'║яа IєБm├A╝┘v╗Эgк┬nц┤Е░aУЗER;s┌o╦Аfг%╬Вє№WcЛbDV6ЫН'┘;ч▀Є-У~·щзo┐¤╢g╧Ю№1░Ю7╡Wп^Ы7o6┌\нZ5ўЭk─╧ р╡x·щз∙╔ффф;v╝°тЛп╛·кЧЧ┬ЭЖ6М5jх╩Х°;d╚жяа|]╖УH$ЙD"▌З║√pv▌▄▄\\\ ╨З╗\{uv°?║║┐|]Yaв`╒\AИ╧╦ Н╝~9*Ў┬Е!=л_е║ии:юkЯ$WЇ╤}g╝X┴f╗┼A┐▒■МsмВ.йёУCЎ╒МKмр#А┴╕╝зЕ┬V0в╦xT╞НЬ╫Н1u5KыйQ╪9 0fД№у 5р╥еK]╗vMJJ┌╛}{у╞Н╣MTЗ╟#x~ ¤ў *8Пює/И(╓о]√┘gЯ= №єo┐¤6 zs■№∙:└╬;я╝├Й▀x╕'OЮDнZ╡B]xhАЯD"СH$йH▌}╕гбббGПх< <нWп▐C=ФШШ╕a├№D$6h╨А¤;сфЯnы<.и p?O╨W▓├$EgзЯНЛЙMN>}·м9┐А2e┌5nX╤г┤и▌б:$U┴┐BAR┐ЪoH-Hь7П√|NъжMЫввв╠f3Z√╚#П╘иQуЁс├зNЭт`▌иQг|Ч6o▐ЬРРА3=zЇ4GFFrчvь╪1((╚p=чrt█╢mqqq№<К=·шгБББ╝R<Жuы╓еззуз╗╗{ч╬Э╦Ч/ПfDDD╕║║тф├?\│fM9,xxxрч╬Э;ёh`┐Wп^МОО╞Н8Г╞Tп^▌ш╪╕ ╖ддда p╛1ЬoL╜={Ў,Ъ jЗYctЯЗVл╡SзNxл°УхAк√Є╦/Ч-[Vо\9┤│NЭ:▄&.?~╝e╦Цн[╖▐╕q#ЪTМ╖I$ЙD"Сюg▌}╕MЯ>}Їш╤╞р4Xy╦Ц-╗wяю┘│з═fуч'OЮ<|°Ёk%є╚Z╛>┬Н╥Q\Зк╩Тp%;#:)■№х╦'╧Ю-S║L`┼* л╓йV&\* ╘.иyвазяи=qG╤ ┴МК,ЙТ \ў!Ї╖{ўю√ЎэуnЪ;wnэ┌╡GН╡g╧╛: 0}ъ╘й>>>▌║u;qтК}№ё╟Аu└9Г■шгПАЄ╝Пш8Аи=~№x╕╘иш╡╫^k▐╝9В╨yRRОх░рщщЙ@"66F╬Я?╧╫├yє═7▀zы-▄▓}√vD/╝Ё┬№∙єё ╝ў▐{KЦ,A`└3°GМё╞o░В▄$DKЧ.EэаЁ/╛°a╗*╓Bуё░P╡1║oдууAиРЦЦЖ7Г╟ы├┬┬р №DQлV-├"еЧ^zщЄх╦у╞НCьБw▒xЗУH$ЙD"▌Я║√pvA~SжL9|°pН5Ъ4i╥░a├С#GВY┐·ълРРР3g╬╘п_─ ·g╫Hц╤qЯЙ°Х9TfXlZz|VFHd╪▀зB№||¤╩Ц мTеEPРЫ┬dёАтВ;ёrR╥Х▄,╗ (┘U4сФвНю+аV//?╧╥&╬ТКз}╛╢ 8ї▄╣s{ўюНППd?~мП╛Ар╤Рёь┘│Я|ЄIC0╞]н[╖Ўєє гSш> ■╙O?├╤╔╔╔Э:uВ[ё╫╦╦╦иы└Бx▀}ў▌лп╛ЪЮЮОИ▀┐?<№╬;я№Є╦/СССэ█╖╟-8Йha╞Мx3g╬─Crss├%T#╕ДJ;vьшыы  #r└sэ╙зП1▄ОHаKЧ.xи;vьи[╖.O*ФR qw┴]╕╘мY3╘H№$ЙD"СHEъо─}T ╘тгMSзNm▄╕1O Т~Ў┘g√Ўэ3fLп^╜МDє"М0YГwжeу╟еf\╔L√√Єх┐╬Ю*ухUй|Еъх¤Z╘rЪ!а░&LкhУЕ▀ №уP╪∙nGЕgЖxщып┐F#;wю ЇЗ╖qчwю▄╣tщ╥~¤·ё╝<п╦Ч/wы╓ ┼Ц-[nёt№BГю╖ўqF╨8Ч`│xЯУH$ЙD"▌Я║√pB┼@╒EЛ= №єП=Ў╪╩Х+╤ 4И№╔'Я╠Ш1ч┴Ъ|№╣√КЮ╗/В·Э:s4ь|В5;13│QнzMk╫ёuwпX┌S▀ю╒бИк┬vЕЩ\■m╫d2с9В╦ё2m▀╛╜^╜z№ё▀╛╤}mАgЪ5kЖ=<<Кў9ЙD"СH$╥¤й╗ўaM┴U╨ч{я╜W╢l┘№ x°ЁсО;VиPaЎь┘]║t1Ь)┌О╠╗е═о╡ КГЙ╟BCB╬ЭЛ│ I╔╔uk╢m╘╨╦d (]┌т╨ЧщФ┤Y║Км`(h x?ЭLК╫]Сч▀Ют╕bFGц╬Э;xЁ`c5!┴iН|x▌┘┐ №╤║uk├Й`w6у╟П рГтттzЇш╜a├рпєBЬ°;tш╨e╦Цё└Ау>Ш▌иQ#╛в-╕╗`зEЛш-[╢TлV ▒А1ш┐yєц(Г█ №є╧_¤Х'єЁКP╝О╓ю╪▒#((╚X&╚x °{·ЇiШю#, p^<с╠в#x]°4_■}oв ° f∙D├2ВГГГa пD O"СH$Йt▀щn┼}ОЙ┐¤Ў(╣g╧Ю╙зOЯ0a┬ц═Ы'NЬ╪╖o_╛H╝┴пEїЫwK[I╟'0Af*■Е_I┐|)>59тrдПo∙·╡ыTоPбF97UKє╫RЄ╡\}П*Б %Г√л┼Ч х▌фk╥/Z┤ш╔'Я,▓йЁ аЎ╪▒cАZр>▀{Лщ╔<▀ ¤╪▒c?·ш#<┬йSз"ьyцЩgp▐▀▀▀x$`Ї/┐№╥╦╦ы│╧>k█╢-╟}07 ъm╥дЙс%г9ю├╔ИCА√ (∙Єe╛╝&╩А┐q╝b┼ ╕┌╕ ╧!Gzz:вИzїъzИ№У┼йSз:uъфээН█╤Hб`ч^q┌ш╤гы╫пП0├l6у|jjъ?№А╖фЙ'Ю>|╕пппєkАРБ║АHАpЯD"СH$йH▌}╕╧ЧЯчxЗ[ц╠Щ│`┴Вx`╧Ю=А╤}√ЎбY╞∙╡Цcч[тrZ╧G╫╫хФэК`у33"SТ.&'№yЇиw┼ 5╦ЦkWзN%Я &j3qї█ с╝AБ°ЯЬ?р ╡j╒кf═Ъ╣╣╣ш Gaxj№°ёр`╕╗}√ЎSжLй[╖.╬╧Я?БMXXX├Ж g═Ъ╒▓eKp6 ДЖЖ═сFу▒¤ё╟QQQ(єълпжееН7wФa░sч╬(Йчфтт2b─Ю*у_|ё┼дIУрфзЯ~z╠Ш18Ыg╬Ь═гUкT┴bT│AAA|]Qс┘;hМp% ╒UкT╔╪╩ЧOxЎ┘gутт╛∙цД┤2ЙD"СH$RС║√pЯуйЫЫOБ]P)x▒zїъ_¤5H╘l6}╗f╠`t ╟J■U┌~║┌6[ wИB|VVD№Х3aз ╘пwЭ*Б&UёЛьцH_п╦j╡vщ╥,╬Їдy#Ч?GП¤┘gЯёbр▌о]╗=zФ;d├Ж @[ФфKdrШ^║tщO<Яn▌║5)) сP╪иk╪░am█╢m▐╝yЭ:u┴т└nc/Vэ ъш╨б?mпqйFНаm<Ь9{Ў,▐АН7╢h╤NF](АлMЫ6№ГЯРРЁЁ├г\Eш┼█l╖█Qё╠▒c╟°с;їтСЇQ▓^╜z╞ЖbZQLЮ<Щя(ьччўю╗явX╖n▌°d\гх╟ПFэh═╙%СH$ЙD║ЦюJ▄wwwчLПb111c╞МЩ;wnы╓н╖l┘ВHАgЄпp_¤ўY-йЗoЛлп┐╔XlbRd\T═┌5╩Ц*maВишQ┴═Нюг┘ш<яp─72n╓мY╙жM9CГz╫н[ЗN┘l╢▐╜{WйRЕщЬ}ъ╘)>M╢{ўюБББ|┐*№]╗v-╠rk(АhБ VРЫЫЛ╪∙┤г ,?∙фУ`k~5╞╞╞┬y┐~¤рj4599┘╒╒uбШ╤ЄTиP┴9щ┐c╟О)))╗wяо_┐╛▒ 0■._╛▄╪№ЛЯg·°} ■¤Нo<цA╒ы╫пG8ДcЯ^╜zсq;Пыєўьф╔У═u!2A ЛЩ╪M"СH$Йt?ыю├}▐=9∙Бz┐°т └■>ї╘SBБо╙яkЇW┤╜r╡@█:KqIpИL╓╥№e УXAк·═'єЁ░дРы9:є═hYБxH└сЮ/╦у<йЧ_5Vь1Тщє{дЫтгHп°U~╗єd_у#ЙСd╧Ч╬:tш╧? ф,К Ж тяя ▄s╧гп╞Р║Ив∙▓в╫Vт╤╦ки╩В,лВЩЩ╡@ГZСO╤╜zeЮ $чA¤"Г╗ 86└Ч хУ_Эo)╥ОaбРхлу<В^ш  ╔AЯo·kа9┐╩ тdJJJ╟Оcbb6o▐▄╝ys├Hб╪└░_(63Кё║▐Ё9╗╞╕╛аящЛ╖еEЛ*T╪▒cЗpНнH$ЙD"СHьn─}\Ъ1c╞иQго╞╙Ц-[ю▄╣╙┼┼х·№з■3U╖аЛ Ьу>*чыUmC.m╗-Ф╨п▀4ю;'═_ ▀╬чНл╬gЬЭcШ*4▄■O╖ n4╗╚b┘поСР7? ■v^Nзй№x└И╛*Vмh|┴(▓ПF Нє<ЖЬ rю+ИLьv√╠Щ3ё┌а╝Е╞зЙD"СH$R!▌Х╕┐ ■-[╢ЪЙЛуААА╫^{ ╕г▐ ▌а ╜@Ь┌Н¤[[СД ╓ннИD"СH$щ▐╨▌З√Р╔druu-ФжbdХ№¤ях№ °┬;WПш▀ёO ╞Tcу%б'N"СH$ЙTдю>▄╟%T ▄┐║'Fz╧vщцTфш>╗=3hНM╩Ш╙"?$ЙD"СHд"uWт>XЯoлTh >└;HXA8сЬ┌╬є╚Л╠A┐█Uф╝ууIСхЭ^=╟аPсkн#t]Z&и°К■_ф<й·^z%H$ЙD"▌е║+q╗╣╣¤/q╩y йр┤&o└╜v|х╛╧╠╣ЕHэ╝чЭГщ╖J╬ П▐coЙD"СHд╗QД√%▀╓hO7Х┐ўШХ'╠Я/Ь╘o╛│╞"д╞wТЫ4xG╔∙[╨=╓5ЙD"СHwгўп/рp░c╟О┐■·╦X¤│m█╢э┌╡╗-s╕3з ъ_Є/T%8ХdЕО 1$q║X%%%-[╢ O╚f│╣║║вГГЎїї╜%Б №ЦЮЮ╛tщRл╒ │>>>7oє╬Q|№ ▒wV▀{ц╞Л ЦiРP┬0QETBEP╗00▒┴СРQ∙Г (HИ"!KЗ░фR╦▓ё▐╗1є ц╬{Ч╟▓ ?чs}▄w▀▄щ;єЭ3g╬dП=:--эЦ[n┴;sм│гааааааЁ_╟ёGўйоыа√$a8С8┘╗|Є}▀╘▐╧лцР╢■╔╟▄▐u╫]CЖ ёэ°я╗я╛7▀|╙/-I2.ў-теЮяlэAсЭ└5┬г┬┴?wp╔)n┌Д╣H┼х╚УщjTзтАфFдR$GЗyчЖЙ├4т╠}^└кUл.╛°т═Ы7╦▓Ф,YrNу╞НУ╦XфЬпфJ √oip╟ў▄/╧╩╩║фТK╨єжOЯ~Є╔'УД?┘а╛з хn┬Цй√E.r:Б╞┐╣d╔Т╓н[ззз╧Щ3зLЩ2╛!╡еXAAAAAAсШр°г√И\_:╫/r8Ф Щ╠%═Т╩x :ЩSN5┘╢-M╪■∙чuы╓с┴qу╞Н?■■√яЧt_К2МOя№єн№=─G└\ўkWєC`ЪлСх6б╦╓п╠Zў√9НOлR║\d╛X╒>Х╧Q∙C\8Tтh]q4╩Ю={^~∙хX,&щ>2oYЦ<щ╓иdб└щ╤!Къ$я[ї4;;√Й'Ю@№П?■x√Ўэ┴Й%нЧRБ ,л╦яRriEJzЗ╚·?Я═√М`╘ф74jlф╚Сшў▐{я< O VЖ= ╟ ╟▌╟Oр·H█gЎТQIs▀fZrю"┬nВкJ├tЯ└ГФ▓Бф▓▓Ь/╝Ё┬Л/╛шkў}╡t2▒KVъ┘ц{HлцЩро╬√¤ўu[│6o█╝s╟ЎыZ╡>╜╞Йй╛}OB▒┐П╓'ёL∙╦!Йз╠*ДЬ;v┤h╤Я>▌O╓p'?тєu_Hоs_юVп^}щеЧ"Ё┤i╙ъ╫пOЎ_УёЧDК,▌юк╚▀Н"ы3RЁ √╖аЯy╜b┼ ░Y│f}ЇQQGAAAAAAAс(у°г√╚1▓Є├?|■∙ч>н?∙фУA░Ип й)))н[╖ОD" Ф╥ШМє╘SOэ╪▒уЄх╦ Д°е█▄9чЬs■╕Ё■jI╚╚╕>2▌Ч┬├р┴ГС╛▐zынk╓м∙ё╟СЯ╢m█тs╥дIжЗ╗я╛╗VнZЬи▌_╡j uЕ╓9ё─g,Cгр╛Фйj╫о▌╜{ўэ█╖гA╤;eg*Y▓$ъэДN8T▐ ~l▄╕9AХ}Є№є╧G6╞Му@)ю╣ч╣Xф╙¤є╬;U!╫Е╚ ▄ОdЕу╟▌'▐й║#GО∙C┴`м ф ьJ▓є╫_=''чХW^ё╡│э█╖ °уП┐·ълло║╩з√`ч]║t9╥Z├уHю╣чЮєНydiС╓W\!eМ╦/┐|єц═Л-B`da~·щ'd╡ущзЯоRе╩X9▐з╬kw)ЙRЄєКХ╗гK╫o┌║eєYНU╩╚иW╣rї╥еMЧSН┘╠еЖiyд▀3╙'║┤ ╟wЧЫTИ ЪNхf¤╨Д?^╠н[╖Вю√┌¤ф╫]w▌Ч_~YжLЩ-Z@ТAгfddа╘╙зOGx╣╩q╙M7=√ь│Рm№№ЇълпNШ0бЫ┤8в┬│h╗∙єчKН■┘gЯНф╨Ъ7oЮЫЫ+;V∙ЄхqS· №▌ю▌w▀EOя▄╣3ю@1bЄ|█m╖╔}шe╞Ц.]z╔%Ч@№ ▐ЫвуЭw▐)%@─p┴LЭ:U╥zтmt2d╚°ёуЯyцЩ╦.╗L┌>)┐ВВВВВВ┬1┴ёGў)°Sffцф╔УЧ/_■щзЯВMВS6k╓ьН7▐4h'╪hV,#Я={ЎYgЭuхХWтf╦Ц-│▓▓FП ц юxї╒WГvЯv┌iGZk╥}▀Ц¤УO>┴}╨J╚╚╔gЬ1sц╠№╒qю╣ч╢j╒j╩Ф)╚с:'Z▄bЗцF#MЬР╡''кQжЛ5ощФQ╫ Zю╒]|n├·┬кG╨}FЙqШ┼,Bўeн╩╔(ЄE]┤b┼К{я╜ў┴DЁi0у.]║а╚e╩Ф┴Г ,н┐рВ ф.[И k╓мi╤вZp╞М`╔▓г *█╢AйQЩ╜zї║ю║ыў╤╔·ўяП^Ў └ ╬├!═x}k─И Р.Д=╔╦!"кN8ю╤г:└aЮ┴, Л╠а├аGсв>╤Й!.Вш√ЫFдM.PL┤x╖n▌Lэ╙UPPPPPP8Ж8■ш>(cZZЪdiH`┘▓e`╒KЦ,╫Ь)hС├ЁП)[╓ў║Г╟-ХEЛ!┌n╕Av3Ъt╓2BgЖРs√э╖┐Є╩+╟jУ▒ВВВВВВВ9~щ╛┤УF░мм,ю/┐№dtх╩Х И═Ъ5є#│f═zщеЧ"СВЭs╬9_¤ї5╫\╙аAГС#G6l╪░ИgЮd╧ёE|∙√ZmЩ.т|ё┼╗uы╓┐▀╔П▄Р yc┬Д №q╗vэЁ╙cП=╬ ╥ Є╦/╧s иQг└_╧>√l─|0■ Ж╔Ес╜ц·├т▀╢в╩6м╦-(8┐qг*е╦V/[╛RЙi #}tjФ┼ЭїУдн╣ёOН$√ |ЇЄ╦/я╪▒гфФH4wЎь┘П=ЎЄ╓╜{ўxаf═ЪO?¤4▓iф┘gЯE╨¤AГ╜Ё┬ ╖▀~{щ╥еУS▀пa─1║\ус╘▌4┤B╤d■╥│╖n┘Щ╜sўО╞ 4мUзjй2хSRmуrРОє╤Z`ЁRc в MvЛ▓╚0╩Ц-√╦/┐аш=(]Ы6m▓e╦Ц°|ю╣ч@sГ┴ Д╨}Aз└з}█P╨╟K/╜TЪХ#X▀╛}я╗я>_K=|°pЁHДD╥_Кп╞NNшхЧ_E°o╝qЇш╤~IB█m╖AваI'Є╩Ядv┤°бЗ║ь▓╦╛¤Ў['Dbp╛7▐x_yфЁE╚Дь!ў░ТГ(ЫЩ╨ю]°╔GrМЪCЙ├ЕбОE╔O+Wо▐№√Ю▄▄=[▓;^quуЪ╒kяэб ╦╡qу╞3╧~ З├SжLiFю┴2Г┴`гFН:tшbНпТУuщ╥Ф]Ц<ьып┐~ь▒╟Ц.] Ўy░°?∙фУAГсм¤ё╟ўSФё╡╫^Х/╢▓P╘о]╗╢i╙Д■З~ЫK√GrР4╞О+m·Сл єxD╢~¤·╙√J|mK|юэ╧ХGnE Y▓n═ъ┼╦ZЭ█┤z┼▓ЛюXjЇwэ┌I Я┼фКs┤:Txя▐╜ч╠Щ╛{тЙ'т╩√Ї╙OCT;З╘TйR%` ╛xф∙чЯЗ№рMббЫ5kЖR╧Ш1C7&y╝ЬЦ/_Anю▄╣иpш *[╜8Є┐f═Ъ'Юx¤U.\s═5шеo╜їЦжqу╞ш╛ +V┤h╤e▌Wк}ЕcЛуПю#╟а√рЇR7/Uу╥а\ЪRHЭk▓С ~Z┤h()xx[╗vэЁk▒ ,┘l▌W║√эфр цd-▓┤ў]╡Ё$Фnт)ї @я+ыТТ°╣YЙ3r=З№`╞qЙ╪ЫK9╤▓J╜ў0р[╝м■еВ_ъ╚}s|Т╪╔*├рBnКЁїыrХ└п╖Э;w╛¤Ў█гGПю╪▒cП=╩Х+ч╟,w @Z°Є╦/!rtы╓---э╪ъ┼¤хob& ╥уЯМ_╖o▀■ю╗яО5ъЩgЮ╣э╢█HbйA1~ЕcВуТю#aщ\┼зbRs,5йЄ(╨п1c╞М7Nц~├Ж `№х╦Ч?чЬsN9хФчЮ{ю`С√Nцg2!_}рГ╔I}▀5$┴ }GНrбЄАm█╚│╠jё%Н;╘ўi╛╝ф┬k╛4┬╝зицz>wОlєщAрпc№A┐h╛Й╝/∙т IШ╦у&J*ЛяєcщOIюыЭ:uj├Ж -╦ъ╒лД1╘╔Ю={f╬ЬY▓d╔є╬;пVнZ ═╥'╧▒Вяu╟'·╔╝▀З▀7/^▄▓eK╚0│g╧FЎ═З▌WPPPPPP8&8■ш>ё<єГA╔2%СJжу2mзя▌╗╖дб╔.YЪ5k6}·ЇГ╤/▀пK▓·╓╫╓ 1ЦТI│псъwF"ФщДЫОKE0FЙ╔йk}Їы┌√4\НВ╪т╠\─!мz(gЮz_x╒Їl·┼┐Ь;р·У▄w=ЇЛ~Уo·M+ъНh╢X|р&уФ╗▄╨tцвмQ#аyЩЕ.(╠Я9kЖы╕-╧┐░Dj·▐Xдхе-№▓╨Acr"4╩D╒п_┌┤iХ*UЄ7iЁ─сGЩ@√йУт:g╝р▐т║5zо[╖nНO▀Р▓▌WPPPPPP8&8■ш╛4З├№рЮ%¤Z╕pсВ №0╛ХN┼Кп╝Є╩гнmEх8д└qga█%u@╥╒aФ%д^5 ЖпQ╫sШ/ЬqzЗc9▐q╕ j-▒W╠иЙТ*V!X! JX╨╥РЗ▒╡@=Л&╞ЁD!e▀LЪ▓w╦оВРБbЦМЄъB!Ї╣╦/┐Яd =╕ fєШГ-)(((((((№╥¤dхt%4IR╖mmkВГ╖З┘KIоЧУ╥ЬШмh@ жС(%aBR81╝L'6!Б?▌g<вЛ▓Е▒▒]уQB╩pv─я╠│I┬з╝p ╧з bL9вз─ИeК│B6чЖhй┼Ч'█╥rех┬_JR<  №╥}Т░99Ё╫ф-│ЗиШ┐иЫ;▒┼м¤√Ьэыtn╗zHу{D8nжя}тZs╙зYFхк─t_#оз√ FТыC╕ eJMBMK-sв9льУШTмcEC┴ЩЛА║бщсО╢ЭЯN п╧Оv─d)и(Ftc┐н╥h8ЇУ.]║Ф+W╬4═#їзy╘рo█¤╫цPAAAAAAс?Е A║Ям. ┘ф░кчoД╨ю╗╠д.╤r▓f╔Пv╛╦Г║Nгж-ГИ\q╧ДН║╒вю╜u╬lhД W╕ф╞№фhє$NL╪ЯZ№#Д┼ ЦpM╖HAА ▐░ъ╗╜;bб@D╪ЄaрГ╞e─Ї| L╙]ТQX8╛█├╓веМ╪Ц)─Tу√Y┼ ' ·▀|єM├Ж  р4bЕd№╥¤)ДO╞u№лoгфЭ K~ 1╨}╨wGs4╧┼╛ЁкI(о9c▌йтЁЮ╒Nml┴УAР9╒ш╤*▒\С╫╔ЦQЗ6б┌}га√Dsш^Г╝╜iх+/jЪ╡A!tЧ\|[╙,НХ┌У;¤ю╟мyЛ ▒mГыORI}║ э╖▀Ю|Є╔┼Lжааааааааp ▌?j ъm╩Їmycуo▀╙(ш>h▒н╗Ъgаo Э7┼╕}nАЦw╚S╒42&wЩp╡пQW'┌╤Pя√^Ёt:yИ:ў╬│4╚-LwщNЭ╛│e┘ЬX!гz*sl]ЛтBl┼д&г╕╢Й[*7g╞▌П┘?/╢0$ъ╬▌WPPPPPPP°╦Pt (┴█ЦъjДjО╢▌ пo\4ЗFД\НQ╟р─tI└fЫWн█╛v}НЪ╡R╘+╔ї'j╘?9`j─aКт┌1П▌Gыв┘l[X╔Г┌┤i#╜╚║Ьq─)о╬i6╒·o═№)Z@sЭн╙ч8й┴║чЭeзЕ#Р\DуQ╧?йУЮЧ3г√#╓O┐QсЭT 3=F\Nўї'Eў■■ш╛┐Х╙╧_▓P─Ф▀▀н+П┐-VfЁПRЄ╜я'√▌O>F╩┐Y─З╠БЫ╕╖ЙУj\gtЗоў┘░ф{a\K│ ╙ин╙'хrЄ┐D╓°/+▄╥■М╗n ╠чNиR└tД<└Еb_8╡╦ЇА│оТ3/sтС+├°╡82╥╩Х+[╢l╣qуFY┤2e╩LЭ:їМ3╬ЁKwаў¤xZTQG^сS▀═щ[Ы2┐ck═Ўy╖ЎH-]·к╖Я╧йZ6bmM╕<р╥иnзцэЩ}чгa╠├5жбРО╪╥LКDош╛ВВВВВВВ┬Ст°ж√■сY╔l█▄gЎ╛%:B:О#O>Є$?(3Э,6°╧╩√2Аяў▌ПЗ&СE№Є╕%щ g_еИ=к╘╛j°v-Ї╬я+~аЕха√Цоэ ы)О№i┴▓ўGэ╔▐UуоN╒.┐D╫°█ХOйгщ1ЭЗ\ЧЙ|j$СЯdN`u∙Ч-!ПЄ%Iв╚╖ўЦ-[zўю╜uыVЮ1cЖiЪр┘Н7Ўm{№tIB└HИу╪б\Пj┌ЫЫV~iчvDV╜╨'oс╥У╕╣Ї5нвБ K7╥,'╒!╣жЫЪЧ√├Пх ▓<▀█йлС"g(║паааааааЁзp|╙¤dBO<▓bК ╔щхпТВ╦├b}jЮ╠ЖУ╣п|─╫ю√j{ ┬ПSJ~BExp▓lРИZЕ╦ Чrw; ╛Эа√й.Нj╘2їR∙С%}·m7бQчО'wэ┤5L3H▀JНыщFTw├ОH9b ┴&Щm╦<°M%}Aт┬╢m)█$╦0З▐nыAV┌ц═Ы[╢l╣}√vIў¤vХ▓Нм $cщУ3О┤-▌хо╙Ї7▓ЦNх∙eY(ЇуВ {░'й^к┼;п▒JUєf╚qAў tEў■)▀t▒|Ў┘g>╫ФЪї6m┌Ьzъй27?№Ё├Ф)SВ┴рiзЭVгF ЦL▒IУ&-Z┤!ЦВ─ў▀ПЁ╕Гё╡AГ7▄pГпд №є╧Ч.]ъ[° ф|╥дI2nvш╨бVнZ2ЁД -Z┤пЬpЗЯ╤Ї┤+[_║ ╬·ХТю\nЫЖю▓Z9╤Я·Ў_5yBе;;Яrg╖┬╦h╝w╔УцО╜q╫ж░═сШG╗бэї+Wо\╝x▒┐^╤║uыЯ■9''╟oк█n╗нJХ*#FМ@▌╩Мс│UлVчЬsО/╞№q{√kh┐ц═Ыя▄╣╙з√иdЩ╩╕qуЦ-[VбB─М6F7JKKCu}=uъ╢мНvШъ$p}З[╟i∙3Ц^└Э%Щ?>╨3X"эЖ>пцVп║=┼ДФjЛ*║паааааааЁOс°г√И7 !эY│f=№Ё├2R╟ ·О_┴╤_zщело║ й╛ї╓[╧<є nVмX▒rх╩єч╧ЧБы╓н;tш╨│╬:KжВOРуП?■x╙жM+Vм ыфчь│╧ю▌╗ў)зЬВпа╤c╟ОЕД 5ы={ЎD┤ў▀┐LBDЕЛ/╛Д°Н7▐x ¤ў7o▐,$ bTоUi`┐~з_qНп▌7qCБФИ╜q╪╕мП?-yf╜j]n 48▌▓XГї ╫║ Є╦ч/¤%фpЛ╟q╟~2R▓!┼D█┐ ╚l)))У'On┌┤щ╒W_¤╒W_╔Е╘L▀╛}я╛√nIФsЛ3╩╕uыVФh╟ОТюKu╛\+│G╙жзз╫лW/33╡Нvi╘и╤кХ+ ss-Эh╘h╪фВПv▌~Z]╙6ї╜╗є&M[8hD╣3N;╜ч¤9JqНж2▌тОв√  О?║/й^8▐░a├вEЛРЖeY╥0Ш4i╥Ёс├Aя╝єNФ q> №єc╞М┴SMЪ4yшбЗ@╓Сo▄╔╩╩>уМ3dДР └╤/┐№ЄNЭ:ё─╔╗єц═ы╙з╧╘йS/╝ЁB√хЧ_Ю}Ў┘i╙ж╡k╫ю┌kпн_┐~0\╛|∙╫_=pр└:АyзеесY╨▀uы╓эg%╧╔Ф/з 5╕ [}п┐ў!Яюыs┬┴Т╓┬ч▐╠■b┬)tиzg╟▌<├фzШ╛^осОЯчm▐╗їїЮO-]│ЎЩчЮы┌х╘)$НЩ3gvь╪ё║ыоГxГ|т╬ю▌╗{їъIжY│fhня┐ UМ№ °уП╖▄r r^гF ▀Ўцp:╟Бt?∙W$z√э╖п\╣▓Z╡jO>∙$в}сЕР╖М%Ю{Є╔Мкх_z■╒uы7Э7шuыт│ +4▄╨ВEУяюI2J┤╘╟кY╥KЪИ0[╤}Е╟▌ЧЦшщщщТL╧Я?┐_┐~╥Ш╝▒БФуNП=ф■╜ў▐{°сЗ/║ш"РQ0~I_¤u0у╤гGГ╕у╬G}Їълп╓лWяйзЮ:¤Ї╙e╠Иm√Ўэў▀?h4H3▄Я;wюs╧=З√`╧W^y%Є3g╬\#Ё░a├C▓╧Ь#F@6HTY╡l╒┬e┐╛√╬[╫v└▀кk║$f╥╥Qg┴╙odOЬTўСО'tэ@▄ЄAW3∙oVl|вfD5ч╟)Sx№ё2х╩ўy¤ ∙ЗЄ°уПЯt╥I▓=P┐(Q├Ж QР:uъ╚"аьп╜Ўd5k╓$ЙeР?MўУ7р╡║i╙&T,ДЯьььЦ-[ю▄╣є┘gЮ╣нcGТh▌Є╩╣┐,╝`ЁС ╧Hу%═ ,]№энiеJ6·fмbЕ74NгSt_AAAAAAAс┬qIўCб╚¤╝yєЁ<Я>}:▓"Э─K3·■¤√▀u╫]╥╚■Н7▐xтЙ':uъД└#7ШЎэ█ў╔'Я╦o▀╛╜4╦┴ЭзЯ~─▌▀Х╦<╝Ї╥K/╛°т°ёуп╕т йЄфСG▐|є═чЯсСтР!C║wя▒aф╚С╛ПЪAГ-Z┤hЎь┘лWпО╫ !:1Ш┴▐}зя╡w▀яkўCМR^╓! Ю|}ыWУк=|Kї;:вхBlющ[▒Q=#бNКы~5}┌cП?Q▒|Еїы╫7k╓ь▒╟нўщ{NN╚7~·цЫoдС2∙╬;яАО>╝CЗ■eя┴!Q,▌Ч[БхЦд╔ч╗я╛+[╢ьЖ @ў╤-f╬ЬyR▌║{▌┬Л╬╗xсТх~ЁFд┘i,=ЯЖV/Я╙∙AЪСq╔ЗoЦ/ЯоЗ #∙Ъ╥ю+(((((((№S8■ш>~▌_░`┴3╧<3c╞ p╨█o┐ЙГA░∙Y│f!%Iўe°~¤·=Ї╨Cw▄q╟| ]╓рє╡╫^ы╒лш■M7▌Д┴р▀~√mp¤зЮz╩з√╥ы╬s╧=ў╩+пМ;╢m█╢r+H<юа╓ Eддд@@y^xсЕ-ZH осЇў·ып? №єj╩КYsf╬∙ь╦╧╛√vЫ;яэ┐aU┬'s┬f(зp∙Ляо ц╦rП▐rj√Ы^ЪБ █√ц Ныjжe░@,6`Ёр╛o╜▌║╒e? №3* B╚╣чЮ+щ>╥EnGНїълпЮs╬9°йf═ЪРOжNЭzын╖B0и_┐~rХ·НHТ+O╣Bт{Х?Бш7o▐<;;{┌┤iзЮzкяАH├O╗wя╞O тТюг* }5м_w,я╩VW¤4o┴ЕC·ZЯЭbЗ h─YЩ∙kЧЮБ╘╥->x-┐r9=grqе▌WPPPPPPP°зp№╤}мtш╨бў▌w_гFНzўю ^+╙▐▓eKЧ.]└>(╡√И╠╛g╧ЮТю√Ос┴╫┴ьGП}є═7#▄7Тi╙ж═╫_}э╡╫>¤Ї╙╚б\%Ш=k╓л╜_Ыё├╖¤▐ъs}ПЗТqrK#щ6Я√LЯЭ_Mо └нН:▐╝ХзвР%ї╪х╘3ynЇєa├Ю}∙ХЧ^·─у=WнZЕ▄B╥А|r┴° Й№ГpgffВp/\╕╠Е^ЩдVнZ ∙ИРи·═Ы7Г7гА ╫=Hby─wTКЎУ┌})Y%764k╓,77wЄф╔Х+W╬╩╩║Ї╥K╤иВС╫нЫы┤╝╕ї╝∙Л$▌XA╙t┤∙ ┐╜╖/Щ╤┤▀ЛсZ5mНqЧА╫+║паааааааЁсxе√├Ж ╗ў▐{O:щдыо╗╬gирпгFНТN'┴цЫ4i2g╬Ь_|ё╘SO┼FБ╫мYsў▌w╧Ъ5ыълпю╒л~B^_xсph<Вgе╤?>С╖▒c╟NЩ2D╓▓,Xfр╗я╛{■∙чСgd8;;B┬UW]хЧt ╕m█╢uы╓Х{ИСC╨¤9│┐ч┐цк╓O╜7x\4W╥¤0чcajl■fЎ·┴г╠p░■▌═жч╣Ъ^В┼^/╫ЁзQгWn]3~╪Иї[╖╢┐щцзЮxr┘▓e╚-DqdЕFСH╒Єълп"╖3g╬▄╕qу╕qуЁлoЫф│d┤╩eЧ]╢xёb4*д#D"}Ш╩╒4эА╨fxЯРмєm╖▌V▓dI╚ (&─4╙чЯ■╚#Пр┴=z▄s╧=╗wяЖ░Б┌шzG╫Ю=(Ыv╔Eнц/°M╥}├ РьmЫ▐▒y╓Uo╣к╩═╫Ъй%\pzMw8Wt_AAAAAAAс┬ёGўСуp8 к Т=}·t╨M └м╩Х+╫мY\_√ЇщєЁ├ГГЧ╦Ь▌t╙M}Ї▓*▄║uk╔ З ╥╣sg\є═7╕ ╦/┐р╙╫m╫йSчЖn╙н]╗vrЁR▒Flw▌uW┐~¤ТЛ=zЇшW^yeїъ╒▓╥]цЕ\╘C│~Ю╘Ї▒▀ 4зdX╥}Г╣жn0╞╙c▒╠ч▐■¤│)╒яыTч■о∙\+Mь^с┌ў]~∙ВхєїB█╤Сa>■Лё ёЯ|ЄЙКэШ1c┌╡k'ўГЧГs╧Ы7╫Р7РIHDЄ░-Тфs╟О ╨иIt▀?; yЖЬpЎ┘g# I:┤KZ√рвЪ8qbєц═A·╟ПП╥╒лWСрW$-Z3=}╓┤щU╘╛т╥+}c═╓∙теs╗=iЦ╢ЎZдvMнЄ╥го╥ю+(((((((№c8■ш╛$ж╚═O?¤тЫ\p¤Ж NЫ6 щБь6m┌ь╨ў= +╧╠BBя╜ўnВwь╪ў¤H└їС]y╠9э┤╙@jхй║~╔zС╩Ф)SР▀6m┌$Я╬Лауsч╬Х·ry└eнZХH╔°t┬Шp└╝юЮ╟╗Еён║р╗ЦckZj@[№─ы;╞L>╡╟нХ╗w╠1═ТФї.YЎ╨Wm]Уf╣├йvkз╬ЩЩЩ .Ф[ ,╦ТцFrЙ|¤·ї)))w▐ygН5H┬"╪│gO ■¤sssV∙Рpj╒к5b─]ие*Uк▄}ў▌╚╧аAГ▓││╙╙╥я║э╢Ї*хЖ ·p╒ць╜н╬∙╜nхАее═╧Ь╓нз]9н╔╚7i╣Ji1И.╫и╥ю+(((((((№s8■ш╛Ї╠УlЙю▀ўЇўТ·╣ў╣,Iт╛■■╘"С°ї=э$'ф╟УU▓йМ▄№*їт$a /~p 7НЁm▄ьЧ╪кFTП╪о╨vNЪ╢╢ И╘╩ХNьqk╕╤I)ФxЮy ╦ !╠X╨}ю2)B°Uфя╡┼g,Ы8qbп^╜└Й_{э5РrДЇ-R Та°▓Ш▓2╢bk^BК■i─╔ё°R╞mЭqжE(}{єк╔nnJ>█0Ё├Mу┐.▌╛┼ ╖╖+СR!фшQ╙Bо┤√  О?║Пx├с0ш╛42I╛я}Ю8'╦w┼#9╖╧J%╤╟OТЧ'WЗ/*╚РE∙▓╘н7Яzgчp@л╥)u #к1LTИ╞╝▓РДЩ о┴╝'MЪЙDpБ{ўю╜qу╞G}┤°вЛ.к\╣▓oьФЬC╫▓╧яe1e┤Eк%~T~0_╝Й╫б─ulГPnD)y}├▓ЩA█^╣eюmwЩ%╥.·аў▐*eDR9б┴XА)║паааааааЁт°г√╚q╨C>*Ig▓>Ю'╣ЩЧў¤Mл~VдuКIrщр▓И%O▓$@Y*╝УsтЛ╔jт?Пm╙а√? ║OR│G6I╠2ВЎЪ╔S з╬=б┼┼хпj2Ї╫+6мoЦц' ╓8у~╣d╞vю▄┘мY│Х+W╩м&K8'Nl┘▓eС}║2З╔╥Иo╕OыоiуdЩ'Y─К7?у┬ы╫вЪ■F╓▓жE~▀╣╛▀@^6╡·=эh╔ еЄBЦF B1Гiч{sчt}┤`Юа√ш>JJXrЄКю+(((((((№9t?!сp8|0J·я#▄%╢ В╧М ┌o├▓Eм0вщРии8Pf┬)╫╫9╙№АQ┼в╧Vй▀ `Rj;─╒Йжs]Ь╓Х(┤Ф+"С╚Ш1cvя▐э▀ФJz!m█╢ХЎ<┼ZЁ @2!HП [║Н╥6мЬщFў═▓╤И°UG╓*(╧╙МАм╕e√Ї{*X°[╨▓ №0]#nQ║П╧▓e╦NЯ>╜~¤·rы░"¤ ЗДв√G а√qB.ИмЮmЄП╓ffця╢4=кq+PL)(╙j┼Ї{ыЭR=hъ║ДЫиUРePсDЁ"жJёДЪ{йtЧ╘?yO┬? ю¤iтфГь t№ЪеєЄrwЖ о█┼╙╓╙lн№▐╝С=Ьє[f└х.[(▀g╠у/Ха{╠Ш1CjўПп╓WPPPPPPP8VPt (ь5FxИБ║╙BГмМхэbО╨╫SтW.├хН┬й)B╤НкеоS╨}▒РМX╛ўL▀рЗ▄>чяGb_ГK▌|вeEЄv╗<К╠ш┼t2ГiAF┬О╜e┼RТ│'ш╩M&╠Ц\?"тuS╙4QЦ│╧>;==▌▀wq4Кгаааааааp5Л█й+~r%▌ч ║/═{Фn_AAAAAAAся└Яг√Л/~ї╒W╖m█f█vЄI╡■∙нрў╥1 юь▄╣│AГа√■╤л I║паааааааааp╘ё'ш>∙хЧ_╞М╩ЭЫЫ К╛g╧|ю▐╜Я╕Г√фi│)))аїчЭw^╗vэдяDEўО■Ьvя▐╜;vьK╤/]║Їо]╗ЁЩУУ#пAёeД╥[zff&Ш¤╡╫^лш╛ВВВВВВВВВ┬Q┼Яг√ЦeБюзеесq├0ЁЯ╕б╖m[^#$╛n▐╝yЇш╤╦Ц-?~╝ы║°I╤}ЕгД?╜UФ,=''7}?<╔№ш>И■√я┐НF'LШрPt_AAAAAAAAAсhр╧╤¤X,▓nЪ&X╗|69IЇ3╗t─ЙЁ їSuО>■"▌╧╠╠ФК|▓?уWЧl|█╢mКю+(((((((((№-┌}~°dэ■gЯ}жш╛ВВВВВВВВВ┬1└Я;U7Ню▌╗м{ёт┼YYY ░,╦u]PtД┴EЛ-о╝ЄJ\фффАю#╝в√ GСюK╓>c╞ 0~╟q"<хФS}Ї╤кUлтz█╢m_|ёЕв√ ╟Сю/Y▓─▓,|Э:uъ╨бCqQо\9p¤3╧<Бu]╧╩╩Ъ0aВв√ ╟Сюgff:Оf╛g╧Юп┐■·лп╛║щжЫЪ7oо{@ф╗vэ7nЬв√ ╟▌Ш╟Г;KЧ.=э┤╙p\▀u]щЩGє((((((((((№НtQГ┴X,F<╧<Кю+(((((((((c№Нt_╞&Эєр·pщ■║▀╫gФH/,(X╗nmйТел╫иБ0Д╣ЪоЫ)< CсЄЬ─Ў╜+Ю╕И▀уEяФ{Чм~(I·)СPёС<9{╔╫\ф_с/Б╞█╬пI■ЭAU°r)Є■qЗ∙З╛╚#?┬1═ЛЗ·#д▀╔i╥┐ЬtМ+6╞вYК╟qдKz·°Й╚Ь'g/yР?Т┴Ў╚@Ю▒тъК╙─|└уП╦|Г═┘~ПРв▀xвGyс°╛йФлq√;╞IN┌UфmЮh}ЩЪЬCBRдDihR(5е*(─┴/(╚ t?ooЮp─∙█b? gЙ├╢ичw▀e╔t№ Н╫4▌YТщ■p║j¤╞R%╥Ь╝=┐пYУV║|╒Zu╣╙ЭВ@@sяjЄ[ С"%%╒КфРPН0Н╕°дтн╓9╤ШўЬ~╪╡Бtмтж=эрСЁ°Ё╬e0o|╘cG0wr/├ёЙA█7Ih.!Ўaч\бp@'ЁжD╟√.;Г╧x|╓СmЕ▐вY╟0╖ ╟xї╕@╝■"&╞жу?З)ЦK╙д╧в`^°Mф║OВT 5√╙ЬГдИсу(╩c0╤╟9eо7ZzАў)╘&├Э├-&╤jJ:&▀╘Ъx╗D0N╝ШМКз4юU8ўI?MTг+Й2зЖ╚!cёЬЛ4>╥К╝;b -@fqYw)╢оLп°╚s╠+zО7IЩG2i╣YL Ф]a▓0п┐poЇ╙|a─№Шд°иG7AўI№5@П ╣#■■"╕!■╝-s.rчzoAb─Оў┘пй╗┐еЛ╚еvР╩QЭ╙b▐jЛNеаЁ▀Г┤ЕсЬцрєПkЪ зh║╠]╫НE#Ы7m╬╩┌РЭ╜╜╪Ш┴╔хu$R°э╖▀Fг1Aўй!▐KJєўюY╢|∙ю╜╣├ЖПдл▀T║DКЭ┐gї║u)е*Tк]!4з▓AёtЯ│p84 z└@М;zТ┬И¤ЩQЎЮРл rhёxz\uрI$┌╛ Q№ЫЬg■OM $йYBGW╤°<р]$D6Wщ~■├Р╝└я╠@ОT╖_l:X$ыmЙ■)9K|XH%|.єz■─}Ю sT╥=├┐╗ ┼┴W0ЛoMР8ЎrЗR╗╕▄,^╫С╡╚L*ЮsйТї4.r∙АЄ}Т╨?=HA╙%═GL ,ЬJЪi╙C)╙■RцК╔бм┤╡╬у]ЕQююЫ░Т╫ ┬,╛ОяT╓<&▓Г,░ х:?pюN╬9Йw~╣,K╜■Я\║* ╣╛ўщh─яЗ╔л- Ш╨еаЁяўД{^Й°ь№`╨ = ъ╥JЗёлW╜ўю{Y│╗9гБ╘Їб4г┘█▓лUп6ёЛёA^▐h~▐тE Є <э■яы6Ц,С-╠]▒юw╜Ї %к╫qt▒ @щ>║_$z╙д║цйmУnъТ▒iёйQ(ў╣щ■tэЯъCРT─є8w╘╝Б▌M▄?ви}-Ш┐Шy э■7рщ-╜юШШф}ЦШ'└[СсТё╗j+╚Єv=╣Р' n▒ц|ЯФ╛ эГ╥¤# ьieeўМ ▀о!>JpI{ў╔Fв┼-9ЛзхЙ Й╥╤DС}Е╩нa°F ВШаfGRLMhЬдВГ&╖ё\IйЬ╞9Ьx-▌oЬЇ3└■@т9║РjsЗ╞U▀'A.мaм#ЬОR:Ёn\ЧСа╚╠SkSъ┼─K*?№ЩФ'д\Ю(B1q MS▒Сhq∙Д'Єя ▄▒ш╖RNeЙQ╜И|╚7EAс┐*%xJв╓!my─А0=╒FF~Y░d╪░aОуzq+rIт?у,`NnprП╗o╖О8xы ў■╛<3Ц╖gф░i╓┌Н%R "╣Щы7╪еNp╦V═▒Р3Whъiё╗u}¤─╛;Р\═╒X╠`О╞ёдщтОXZuК╫PПГд╚ТЇ√U K >▐Ёъ╚6g.╩x╪─╤к┤й`їsЯИ∙ ┼W8Lш ╥Я+■Чэ├5oт┼З+j┘у ш╧:wёЗп. ы,+^▒u╫╓┼"РАГ1D│ ╖x^┬■@╔XGд▌зЮ∙ Cч┼шЩёP╧PЭЦ%:н╚А'Ы ¤╓<Р╟°tЯiМyФг ·╜нQ[╟╡а┌qГGя?▓#▓╕г╗4о}╟?и< ╣5]7ф3NмШ&C▐─╗щh║WЭ║gSЕ█Iм5ар° ╓ф\У╞M4OR@┴-VЄ·{@у+√gЯК|?ш\╪К╪Z0цН &sB╠┬MЫЖ:8RЁт6аЫш<. УVo╔╩єkakШX╝пbёA№ ¤Bs▀r ╗^▀├ўT'vрф╔R№#╦6)▐М▐`Ну╜B$─uф9/4┌[Ў[яSИ▒ЄM`▐мэ╞нЁDдk╕дшЫ┬]╞MN▀▓WAсТу√.tпа╛ДKс=╡╜Ш{∙а'*x&ДnАVЩС▄В═k*Ж4ЪЯ√╤╨!t├┌M%Rєг9┐m╚КЦоЬЧ^euЎ^вщqC├├Г╝ЬАn╥ПИй└Е`╨ШЙ+F]╣GУЛощОы╚▌─Ed╬╕nhNёFЩЮ]пL(ё >1╫RL╖FPПKЪ╠╞рВЩщЁ% ┐#ЛY╙р"jЮ╨╣░bЗrЕ├З!&:M╠МЩш╝РPЕїАэА▄ko∙|┴5╕Н^ъ╨bДWЕ t╫$▀pmbsa√@ ╨Йik°КWмy┐QR ╕xC¤√╘│t4M╙▒▌+Жщ╛└╢m├4х╡p;&нФ9.В1─"ЖW*O*ёЇЩ╠ЭWЇF░═▒L╧Р=ЖоjД,цY8рмЫ█ИТКьapєlСф░╞Qb┬╚y╒йGд0rcL╡╜╜MxДz▄)очЕАq┘╚║fW╣╗┐(╙ё*ВР∙&DЮk5╟qЇ¤мЙт3 ╩о!*Hdь^PLL D ги0З9Л╣a:nЬюы┬КЫ╣║╖p+МP╣oХ╟ ║yИQШ╟Ы)╔╛▄kК╞╡▄X▒єd'Гъ╢├E├!╦▄┬P╔И╔tpф@7ЭJtQQСи&fИ]rHQП Э0╕╢0Mn[uП)_╪щСI!Рa╓ КO[,┐kЖCLUм╗"N┘├ЭЬЧ хбk╩ЧАx█M╙░m╟0─;гЙE6═]В┬мWМ╪}Ч╣жn:шзTЧтЮl#Eур¤[m█┬Лfуu1Cф╤гтo П╦*  <ЁЮ:6▀╜iыo?^qVг@$ уaГщяk│32B∙СЬ▀▓╓ ║ЯVemvзAOЗp°ъm╝№A7Vф▒А╪╒eDЩ╞)X0╕оГ╦04╦r┬с@,цxсуСc&╞pГ╣6f┼0`∙>┴у B╩г┼┬v^└)┤h╚6Scт1a[┌¤#SLцРhБъF цЩ├█T'7'й}E ├lн;BїЎ├h┤0═ct╡ 1mдФ.╥L╘│.XЗ╦╘r╩xнM├р▒Hь╨c▌╠│ ДL!2A[ iИЗ#xФkЖв╗ SHщУ ў╜I #P№fHfcxZ\x║М'R`░,;%%ЙD5Csф>'╫7ЕG +Яf├ :fк#Ў(сf║╧╝┴M╨>┐4ВїCrAЙ╠@╠Ў·ABїb{Г╜ AАRlбШ7=Єчx{^ H/жЩЪSРж╗и1б°б&2╠Ж╪Pв>Ыc▐6оф%`╟ДуныroаГ4jц╠J1Н┼8╒гT│t╙ Дз`uи(╬L╙y╘FМ╕йЫЮрij▌ Ыщ4ъSъ└L╤ ■`ю╔\ь~`┼эuC єиЫк╗'Ї3Па>┬╠Й■╛И#Е┴U!ц!СjbZ╟u╜_─Ц уЮы╨E;а5▌▄ыZРP╖u&dС┬0~1 ЎЖ5╫ро#╕8zЕюp╚ЮP ╞kAью¤л┼╤ЕОТЙxSи╫O<ЙE▌шО╚┤╕нE╤╟╕╬,ЗXш▐f╨"Жг╣─╕эЁКwЦX,Ъo'dИB╣╠─╝╠Вй╠№~фЫBЛ_йSPP°█┴0|:6┘ХХ¤█Ь+╬nИцП:Фо]╖=##е ▓sI╓я▒RХ Rлм▌VHуt pБ╫╪╒Щn. nць╧>m▐Ў·╙.jQ`1lШ▄▌╬BбPaaa H▐s└е'М8Жс╠(7бh+М╝н є┐■lсФ/ъ6i▐ъ·Q=$t,kф|аaч┘\/Wл▐НwЎ i%m┬Ауmz:\хВgє┴SitсЬi3>√ 1о╫htj█.▌-#EЖБHГЄ"C╘3|ЄA╜u&дъаb ▒г+g╙║/▐yЫю┘&╫░E╦mоЛ┬ЕР┐uSу┬▄.Хl^¤█'CЖ╒=╗щem█╗B└╢H┌▀═рд&t:╢нs'Щь{+┌ Щ&+Nх╕$=`№6k╩м1C└е█▌є`Й┌Н"FjшH╢A!xА3█КЦXС Юuи╖1╫u╠н░a/Ў╔Р!YK╫^┌оCужMЄ5БНК╒v]:ьсС╜!'╠аw▓W/Д┬QЛ╡яrwЕSЫ]м93╛пЦ┘См║ su!6Rщ0─u0HЛ╠f(╞5╧ТЗh▄ ┌∙▐И¤ЮV╕╦У]ВБrХ:t┐┐D┼j∙6$ЇА╖g╧ ▓шжeЛ>2Pwг║CCdTп{╙▌ъ%*X$Аy▌{S~Р  ;@╜ ▐ы]╢¤6чЄ│▒№зл╫m/ХОь╩╠·=R║Jnz╒╡█":S?└eГўЎтz;Кqц║░┘eвЮZ░g+╖єНp╕m╟[g╠·qы╞▀пю▄щД:з╪zJРr╙Нфl▌8ю├!Сь z0,Сve√v▀|їu╬ю№v]*Wй°/^[╩L╝?╗W/xў╛█▄╝вН ╒я}їн▓╒O▓НT▒TъZшЪЭ╢нYЄ╒Ёў°▐D3*V=▒Yл+┐№|| @┌▐╤]+}Вm5fеыdюў▀}┌є1тьж$vB¤╙юy{ШSв Ч╬┼X{╕t_8ї┤IH│~№bЁ╕╖^ПЫ%kЬ~·}oї╧╙S=Л%;{╙║ICЖЁ=9╠p]з└/╡Е╤I¤ ╬╗ЇЖ[bnZ Р:r[╝▓─┘╝z┼а{╗СЬMрЮч▐▄ї╞╗*дG╣z4╧Ю$фF╫e╬}┐ч¤M/nu╦¤Oя0RЩЩЙ9┬ДI Т║7└%╞I3(#√Д(ъЩv╗Є└фоZъ┘░╦─╗┌М0ОБlY:sЩ5#є ╞jVD,¤ВL Ю}щч┤║║╨%йtсъЖBвbЪЙ╤ BI╚И~ўэф┘├>╠[╡!ю{ўгКз^шшZ я+'qЛєДпте.Д=═│t╒╝ ={zЭщё░√ж?nг ╘ЗKXАъ)b4═╡ЎL№шНїKЧnА[JЇ╓╫]>{ю╠Иl█∙БФR)G ╪▒Є74ПжW№█╜ё╔W╬╕ЄъFeМH1Чж"w{╢|■срЬ╡л7о╠Мфnб+╒пkФкpC╫{+╘k\HMЁ~*tфLьТ#┼М6оnЙPNNЮ╜4╖2ШP╕yє╡╖5 гм╞┬шлЧ5jhюЮ═<иЙeXЫхJ^qы]eк5И ├0-─гйм`═ТEя?Ї)╪#zиХ[кFНю}ЗЧк~ЛaBIG¤Щ╠Єш╥_°TO╦бn2_║Ў╔╛3ДЧк╩taг$$R▒─kККд$оФ=Cф╟┴fz*<╔+╝╬аёbЕ:1╒║▄k1▒╜GЇ'▒Ж┬╜Ч(!NH╔ВyЫ(H|■ї╫╜∙ЪЛО&║├ь"╙{T R╠YРф&6+И} Ъg]%жBnI~o╜ХЁ О╫╔╓IВ xл`в└И╫Ц╗тYт╧їl┤Dх Й5║╧OБ╖EGєф3╤?уЄ^В~р*jz[┴╣Ш╡█ртus╜Zї6∙hёu!╩tЭиYу▐╗){Кt╔е╔ ╫│<ФЫЎy\x╢Й▐Ц&JЇ°&Х°╬ю(╫м─ 'wбИrш╝┤xпф,с)Аz╦Ж4ю▄5╤аTюв M▀=.ў╜9АИq╠╦ЦЗ ЩР═ў,Fт╗ОШь╘Ў4╚ я"-╝f№ы╛E╬гнtY~═є│ХиР╕ t aХъ╫Х▀Ш┬gЙ▄╖УHT░EС[W╚┘■█JуЩ7╒lъ} ║╧t╥ЁкTЖ!qя┬м]╢ЧЮ4▐вчы&╪▐о═[Ч|w┘╣їи╜ч├G╥Хы╖ХIOqЄwgnXЯWжъюU╫dG,,╢╜`Ч)Зf!¤Л┼└°°й √Nо█▒m█3?юїЁ)'6:гє┤Ў╔с|│╫╛ў■мwЯ8╣L7гTЭє[┤╝ц╩ўyР89в╥Ннz╝t╤ї]Y└ИY-Ц.zи╬=;HнЬжЫо#цv╝LгH{~_╜}эЪМъ'ХпY╧%╡<*fИ~иk╠wр╕жй╗Оt├О▓`9иJЧШ╘4\├qї▌Kg╧ЁЁ╬m┌їЕ╞ч]░ └AЬ8ў%ьmObЮ `LН╛▀╘Вц╜D`▓ОюmеЖ░U~ы╝√оц·¤Й╟;1╛;▌ИQ╪├s╫vцB╤╘╘█+2'lтcтэEч╞─B4█6┼■;Aцйa╩}`▓ бTС Т,╠Й)fжаГf!.J╤}4ркP7,Гж┌┬пЭgВй┼ўэyХ&6g╦iЮDEЇр·р ─q▌Аz.╫ ъNAnЎ╠й_|7Ё%L*▌√М4╩╒┤Е9▒#%G]шЬ\1 ╗S4зОi^tГ ЙaTПщ┴BnЖ0W╞ !░1-ВЩBьY7]ИxZL╖ДY─ЇRHDBТу&GПъhR┬┬ ЪтфЕдp▄=Ж╖╩rЇp|╡ЙоЗортї1LХг °*НК})┬0─TЫМ rЙ]ЪX┐╝?Ё█ёc┤╣вU██C%лE╥┬С▀W╛w'+k┌э╞ЇT┬bЪT├╩е║█эЕw*\r╗eЁ|▓a┼╪■¤2Юэю╤M омN├FY6F#Е▌▀yп┌щЧюхi)n4▓q┘'▀^√╦П4o╖`э┴@╡:╡╖l╠ri╩}п оx╥╣▒А╬═\═I▒ї╨▐Х?ь╓▐LOo~√Эiе+╫?╜ЙЦVо╨ббp╪ЙфИ╜cmц╕пm√u╢юF]Мq)е*Uй║i¤·Ф╥хy{H╕fгFCFВВ▄ЬЬ5Щ╦ЬUєзy╜R├3oэўйU▓\┬$▐01RЎ)аl─ф╘ZЁщ█У·Ўк╤иi╙Ўўhе╥ыЮuо├╥CоэС л{р~=;╦5,ё╚6Дa╡A╩Ьscч╦┌▐ыЁТОЙW#жy;╗ Ўцn■u╞КпF¤:gNУЎw^╫╜g~░Ф-╘+┬Ёу ╜[░=ЗТ4тФ'╘о░m╟мtЯПKUп╘ч▐Ў╣╦7Х ';1+╡ы╒п▐m ╧9м0lC ю╬Я·nпЯз}├tуЄ[:Х?с═ЫW&Н╜mщ┬·\vє╙}ь=иsGHВ╘ы2?┘╚╟w"E▐Ь ╢gКрСH*x]▐╥╠■ўu╢ 6LиЦ 1&T╛Tў7d╘m3R#╧@з-▄i[╓т┼┐е╞Ўцl▐ ж9-bш▐╟yвУh▄;uSОщ∙[К&╚еТ└ rя^╫гЄBxРV╟ж[МБЇФ%Зx_┼na+&Ц┌Ш▄Uз▐╦3o╫СHQ╥\]L╙▐ё 4ю-Й'.з_Юь!╬жqе|зХ▄єQiч;╖m[2зї╣'ъЎ╬с├F╤Uы╖Цt?'s├Ж╝2Ur2ко▌V`A╝ \;Pс$║А╖┴K,YК]jвo sШ╟Цg~?ь┴╗ю╕чС·╫▄░EO)сДГD█Тї█w#__<}|х:НZtшоХйRйJе є~Ъ∙╔рнлЧЬ{┼ї═nьЮQгZ.d▓<Юъ9▓еg╙P╚'ШY ь ═└аАЙQX Є│M7▌Ке┌zоЦЮGЪБСZЁC[ЬО9Ей`}В┼вБ═BСQ│t4кЛ╖Qhдb#EшўЙ^╓┌1·Еnsg═╣шб╫.╛·&Hкў4╤░x═┴Е.▌╔є|KJ╓. o,3П;45#°пш^ (<иyО╨} &(4Zк└╘■gВ%гЩ0\$сЖLSкЦд<`Ж╟└1√вЬшмРРЁ┌До┬%1╧Q╠],╚1═Мщ!=ДI╓8V▒▒PМ█<А1┌Iе┬╥7Ж╬C╡Їиxлщ┐C╚bуМуAaП ┬ю:fXW,Ч ВсР╕'ь;C!=═▀┤v┘╨╫ХмX√ю>#j{ч╤─(pИ╠VБ4Е╔┤бИ╡Ю ■▄Ш[ВЄРЫOY╘A)iB$pвРеЁ╞Жbї8аец╟Р@0"╥qGsbiBОqД∙▓Ш?└ЎI$М╪nЪЮbИ▌#n╠^SМт╘9Bsы┘U)d─BУ;ЕЦM)Сч═LхЕясh┬p─KьъъА░┐ЖШсfXЕГ║▐▒n∙┬О/╜t·ЕWX╙ш┬6▌^▓п(И 0 ЦХ┐3є│q│G|ШQг▄Щ7Ї Z└d╤Х ц,ЪЄE░\┼ж7▄~i╗.Ц,В`╕├$e╪▐Iя╛Ё═Ш╤M┌▀~ ▌7\Ч№-ыц┐╙н█╒w┴ A┴uНщ╢Н ┌4йHЧQЪс /Dб<МЄR╠Щ4▓▀GZ╗ЎЮ█·къgЭУKh0`╬∙xфО▀~5╩T╛│▀ЁТ╡O\·є┤pю.НЦpЫ6жя╬╒koz╞з√─'AБb:uМШNb╛~8■)zж°c─╫КRO┬╘ ї╨й╘=GА╚]╠AuTмWщqЦGдП*═У*"LЛ╩SG}·Бf ║╥цB ur1T#╚HHR╠¤▐╣Е"][wДP]tTъmo╖?K°WХО▓┴└є<▀мZв&EвH1шxЬ5Г╓й╖сR9 xZh▒EЧr с│ЯьоX'╨$┐ЛR1oРИ╔c√UИ╟▀C▒tQОц ╠;лЗz╒%Єjp жоз7dQ├НЪbйN*°еЬП< ╧▐{@Wq%ы┬Э╗OРОИ(r╬9чЬs╬╤фdу╞6crN ╞&чЬГ╚AdДТPЦNш▄пjyоя└]╦■=яє▐L_п╣Zp╨щ▐╜w╒WU_}eИЬ!РЯ-▓zyБКё№яft°7зsТjў╟!$РГ/╒HОKд╪ВкpЁ8вgр▌~м¤√Щф$╢░Ыy╒АаM╧о"┼M╔iT>+w╒'cюЯ>╒~ъч═║ї┐#[,K pЁс15 Z3~бАї╫╬&х1Мby╒░№х0Rщ▒№╗Й$ЖV0╣┼ЪдАБ■█├m■ЇЕ@S╫М)YК/;cяЎmYй) ╟▒║)║ZvъQ$*▓ш╘(8╞п║=Щй{╖nTs╙%╞р-╓╙dyНs╢ь;┬VдЬ╞ЙТе╚▐╫ё╢lєи>ZвIHї4с═:wСЄW┴═FгыдЪА╟н'slщCоПйг┬ДЩё·Q╠ё¤;YS3,3вPс╩╩п·`д#в╘ДE[╪╨вpОь╟i╛фчOОю°U╖PmDe╪░вQЭ· ╨░L{ТОo█h╣3]Uj╘╗xЎ┤йy╦TйYдd╘╛Э[%Бзe3▓x╣·]√~bUtwЄє[╓>ЯОn],S╛jг6эs▐+└╙ИМAШ_├··KXф╫ЮБ╪A╬ eф7ёПўю▐чS1№C|ЖliлbЭ&ХЪ╢їI.фПЩ l}Т│╦`Tз/є╟╔╙▐┐┘√л┐Uo╪v▒ъф═m%=Ш?q,■ф9kєХл ╝HлВтЩ ■─Чўc·~ЇMЕж▌hЖKvwёФЮ╝С▌b╨Ф*mЖИ┴ЕY┘wя─╛гычgfж∙aeёjН4Г╦xtm∙╠СМw└ЁсбЭFIм]╩╠ytъ╚╢ЧчЪЄшE╦ЄUо═л┼!▄╫9[ъЭ╙'Г\у hП(Н%JьD─dХ─Yп▐Z=вMxбвЭF}PвQ7Yrz╙╙o┌tjєR╞>y▐*GёК2═r,Ы*╦r┤iж▐:╛dB┐И╥╒╟-▀е:C$C┼#f╖ ▄л ╕ф┌Ў%З|UоI╖с_п╔а╨ЎK&~▌'АГP╠З ^ЙЪх╣%Ы╢lv▌{у▄ж╒ч*┌╝эшя~╨й@ТНг4╠с1БzюБх▀Ю yC╜>Г▐ўкy^─]]=~№А1S╦ўьэсь knе_З╤╠╦уБВ╧╙¤w┤bцОаsдШfXШs1╨[√ My5Т║уP1╔жNж╔9╖яч╜ ┐й╨мх╕Oчд ┴КDЗе╠WЙ&5*DB@■ ·╪ЩM+ю?м┘╛cЯuь╚сKvо┌И3╩pРь#&a`╤Р ВЩX$▓&аU uL1+Т@)XNзг?°oяЯBc2К ЎJЎ]╪┤ютЮ ╣щёНZПj▄│oPХ i(nд╛>wn╧╖▀°(s°вхБе*;EЖїxX▐┼Щ╩КЩ╜у/Eў√dСюЛЪщСьCKLY9еkZFюД∙ыєХой░6СgX5аєпП╛√°∙фХ┐JKhH╤K╤hVe∙╖7Еа ,+@Y[ТE█═ц}В╫X2жZх8╖щ с3┤╗╫═x_a╣Й}╝ю√∙Щ99S- +SSс]Жi╪юMb9хщУ5Szє6z╚▓}╬В┼TП┴╕d,СDPЮОrXЄ╦;VNЮ/Єm╕п2A °╬k╞єkСУ▄;,>═╩&┬ √l╝╦C &Нс╖щдE№й╞в╪╖]є'ЄIоё.Vу¤└╙░▀х╤E(0D:<8D v.bЎВ▀╬ю├Ў@Б`@ pWвО{F#F┐eхєDWMВy№МЯ┤C└вR┬саЙ╞ШЕ∙~вEФG┐AьпР╡ж▀=гAJeвNI~╠C√O1yL╝?кёыk╕ПSщmes?КdёY+OкL'NЇ╦Є╓ЎяБ#й1YбЩ~(М╠aC"ЯА▀Вp▀_ё oЦaу∙Щ<░&╛h ╘ ═┴У@м∙I┐Е^дЄ└Р<&√9 ЬAОс'░╒2ИQeЛ!─1Щ╫мoбV╛9ь4▐TySЎчПИ ╓УмЧеUX Л(╓Щ¤цЇжхёўo─▌╝В<{Кqц╦_0кD▄╡єE*OX╝Е +J▓ЩЩt■ро╖n>╗M _`┴{`hэж-├ n┌╜█ЛдєзН12Уy^,VжтУШ[`└B v╚ 2цzE╡ЕD6ш;кa╧БF╞л3√╖ч$─▐┐pBЧe┬lvFЦ(U╜nX╣Є ║ЎЁА╫a!>aEв┌b╛гДEЄмалjnb▄┘эыХ╘ДG.`Гъc1ыаX╝PпўАоУfe┬~╓9╟ЪМ ┌eYю╙?н┐╡mG┘║╡ \а kI╣ ╕B╞J╝┐dъPп█3k╬Є└B%▄ЫЩЎ║y╖■╧тbs23*Uп^┤МеkiёПЧ╛?╩╠}Sе]я╬C'qо4╟╙Ъя┬╔├Ъьо▐░ чКфy)7Ў·В╔ClzvєЎэ*Пx▀О╡└ь╘█╫.ж{ХrН█КaQAкAsYўeК╧Н╜┤n№ ┴8n┘╧\╛Т░ў ╜°°хo^─-╥┴╓░╟└ц}Fyxrмs▀▄>wPUеЖн═рHНA╔!░! #jЖЪz√°Ъ)Г├КV╗lЗх ╕╧ЪЬЖ^уПыАбЯ╫hє┌ОеЗ|]║Q╫┴▀оs c°$їш╞┌Уж▀░h╥ДТ5J╛ў┘jПНўшwоЬ]╜Є╬їEЪ┤Ї├"О └■"qд@├{p╒w╤Ы╫╓ы▌ m╕╬Ам╠Ї°╜s╛uзе7;╢d▌Ф,ЪЬъяк"<═ж|Мe(\х╫\зi▌Є╟╫ЬЖДLГ╟:гJ`вAчНbDРД┼▓n° ╟s╦iФMг.ь▄pxё╫Ы╢є┼┬4╬AXeЮ│1Цв├+`8Z╫Ce ║E╟╫оКи\л├иСП.юК▐{hЇВЭ┼к64M_ОЦбUE@Ц0fш╜d╚╤■┴X║3╬c▌а%L·ъ~╪ЁзаaQyJ4╦╟r9вщЁy7LЬЁ,цBнонЫўЬT┤D<╜M{*fз>:}B╤▄e╖`┬K#ГФ{!╪,e¤ф.ёЧ/Ї√|aщЎ=(╩e╙)А√`АЕ\∙╥┼К╞╒к█▐щ╠П·rмfYЩgОn╗ЎуrMfо█IЗDR4,┐&ш▓Е┘иЛ╚Ўв▓*Н@`пЪBHD╓▌П┬с8N9С ├LаHiж р}iБ@ю9╕ElцFftC5Rk▒№дexo Ц╢`HЖЧСЫЕdc╗JЖ╤y:+■Л┼╕CG}▄в░WUЙVY]6xЫB┘H╢`: ZнГыж А`@h╠Wц~ц°lН&Е"╥|╧& ╤╪сё5Н┤Д°гМн.^2сб ╒ ызыжeў╟ ─ ▒(# ┐Р'ДЭ`h хЇot,ТНgpьЙ┼ъА8╠▒█ ,ЗEJ├?Н▌Яw╖Ы>Гa|Ё░))╙aЙоЪш╔bb┌ШW ╕wVеЙq25T[Ж ═Л╗р █¤L#$ Б╤fxЩВ№vЭФ-Q═%-d-Я├╥|╔oю▀h]╖,зenZ╖С~ЎьUpаSqч▄yЩp?7(2>!=у∙л+ЗvИжчw!═л█оRН:с╪С█$гn╧b╬мЫ6нIЫ╓g╠rєA-УW┼:uя╒+╖-№╢JЫnC>■![p┴cKT╬┌&─Я>▐ўГП+uынRтїш╙kЧ<┐r^Pс╩5j4jвк╘¤+Чш░ВнЗН /Q^дд╧n\I|xЛе=ПoЬr¤v╣NГ╧° Е]╒Iщw.ЮL{s√ьСфG╩╘n╘kш8┼аЎoЬєш╓э▓їZйTпNЫ╬|HД)┘,Mр]*ЮЯц}zч╪■╓cж6э?Nцx'Р{oaССєy╬я█уIzEл^MрIФEТп╨b¤Ц┬╩ЦУ▒DЪ}■└ю▄╫Й6╙$╒▀/л°LVхU╢(Vйо╩АєиЖ6├│к/'юц№уx├█мuk[@0ЬgС│╝яЩу's│<╙ц/ПмP█+ж┐|▓lD;Юg┌wъd│;}л╨╢,п~хЁvJ╦Щ╣S╖╧╨>У>╠с4dR aтїоw]┤Ъ▒|Єшфыw'╠Щ┘мХ╠Ил@mI╞╦Ш╙{▐$╓i┌Ъs╕оЭ:ьєdМX╢зDЕкЎўг╒х)╙УЭ~~█жK█7ЩФ^╗a}Ght═сj╤йGh╛HУ╢∙Ш]╒╣М°У┐м╛╕чЮcл7ъ`:Ь>╧9┼vэ█ЕЎ┴&@ISбxД√ -ф<О^√▐@1╚5f∙пBDY*п╟аt @бТЫyt═▄ы√╢Е╓j╨XсГ▄Ц╓╢uK╔& A9┤ ╝ФDс< Ыjмд[G╓MY║·иЕ[═а0┴Tp>иOї'р>Лн─ЖюЧi╥}└▀V∙DС1}фг2╣r┤{ўЦOyO╢*╓hж┘D▌Т│Ю<ИЛ╛TаhЩЖг&Цы▄; ИЫ╠Г√&└¤9╤?нy'▄GЬОLd_╠╧?ю\<п╒Їi zОдм`НєТvCp│ФM7╥Ю┼^<╝П╤e IrXхє7╘ЬT╣f▌и║ </иЮД√wоЯ:f3 ┐!MYШщєq\∙MЛVн▐Э╥9Aоэ^┐oсзUЫ╡■∙Тt!Де|Xб┼bлК2Ь└·╙шУG\─░lЛQS ╫иvpщЧ7╢?o[┴* р╔ry/`w^QюE_И╗uCўЙLlЛЇАGcMIj╪бKP▒т2+8dї╓бГ/тЄжМYc&ПL а└╬╫ы▐O-юР╜FН{~ўz _o╥Ыв$ьe╘LLЇpЪAy9▌╦░NFу▄В▌Т7Mщwщl┐/№ю╗E^еCatVG98╓ОрCў╙╛s{7▌║▐ЫФR│√аЎ#зQ╬ Ё╡jfъ┘Г╗╡Мd▐╠│6~iЛtB╘ь3$░`NSЇЬ╠S{vы┘вaЁDнКt$CXI)╝╪кw)в0п:8UOzyu┘Їq╝"7ь█╗fЗv7╬^<┐i╡в°&┐>м|=C┤гNН╪ЦыMьу У{I6z╪╥=ОВ┼ь:┬}@T╪─L┴.С Уv╨╩л{ЧЦL^  █p▀жййO]Жїs%`1`1Г m╓▒/:y═Їд┐9▒oЫщ╬ Tl█╒Y╝'А(ЕJ4щ╘E`L3юФ7чvmвTў?|#╝¤хj╫l▐┬р}Щю──3ўhZ6Ь┘єж_4Jg─л╫l╨╠+ё2gд┼╟Э?░GT}─╨├wj яe┼R5ыVо_Я4╫Щ ╧Я<╪╖Г│■ёь√h▒r├це+U58■ёуШ█1ч╧┌pь╤Я Я7P0Wк█дu▒ Х29ЖгЇЗW/╞^╜,*ЄФ0Ъ└VdЎж ╘o▌&╝d)Еe Ц}x·hЄ═K■¤єўy&╕,Вгy√обСQ&/ъкzх╠С─╟╖y]fhЙ$щQ в ╞цj▐╢│X╕DЦ╝ц╜p`O╞ЛчвжУ!┴xMNUXэ i▐й╖Ь_elФб▀┘╡,ю╪ r╕╪xZаi█.╢а|4рo╒sЎрЎм╫╧0L59?a?╞И╬░╚f║x┬ЄA(kfж^8╕WIO [є`У╤X ЕС°РВ-{ вl┴╚┼MП┐|`│Ьы┴XE3№c&,<ЄЦ#_D╦^ГL╔╦щNI<{`зх╔┴Ж?Хзu└ў█(▐╤╝O?="Я├2╜п╬ь▌My▌$╢ё╖#зД╢┤ь╙╧ ┴╛╙╟╧N▄/P*нCДHЪs¤5ЖтГwьa ═ц(%ю~Ї╤М&│┐ЙЫaT└BМA┘]Бї╗ЎвВ#$╦HxpўъЙc`▓р,У∙w┤┐╔[e),вA╟.\P~8ЙЧ╬▀╛═h^Бё╫[Xрг"┼9X╛l╤═ЫTжМм▄@?Ўр╛╧Ує21'$╥у*РФТu те-3╟RF╞[nY(7шГAc▐╙░√Й╖ЄZдQ╨?сюЩхc'┬сi5ы#Щu :ПЩЪqjЄ╡+v▄o▌eш╟є▓Е xAХ╡Ў¤I╧OЯю3ыУr=√ч░|!S>╣l┴┴ї+#*╒ь0|j╔:M4К▒S╩▒╡ Оo▄4·╦╣хЪ6єINПв8╧Ъ@q╟W}z▌· З Ь∙╡{L¤яТV)=@аX_╓¤╦gўn▐(J▌√ АГzdє·,E8∙Г№хkъмVB)Б1uГ╖}7уюБ═]╞┐_Ё╘\ЬсГЬ%╞фyИeя№Iя%?╝Min╘ ┤H;1Н:─Ф% ■|v┼&-iI╨3У╬ЬФЄрI┬ScI■Ве░Ў*vЪ0│yў Аt?▐°{!Ё √п=;э╪жЕЧў№dчмж-Z ╬`╒тxF╤х╠ЙS╣9╛j-;u6▐^┤lъЛ°E;Kй~є╞ЖMтB#ъ╢яжH7яa2Ты╢я═ЖБў╝|Ё├╨Об.▒jєю║M╠╘▓u;╩рОЬ╝РCsuZ╡ хTп]╔∙z─└Ї°з$fa░1Ш╥0ПNKb┴в3/-х═Q╬э▀zщ°о╢C╞╘h╥╩bОж╙_'·їз{╗╣КЦ{o╔V╘-╔J╣┤c├еE;W╜S'KУm┼ЭХsщш 10╕╓р▒M√ЇWтя/Ъ>^є*Э╞Oo┌е╦б▌;╬|¤йгxх╓гж4o▄(∙·┘┐MЯ^║┌ИП┐>┤█Эл╫uэ╙▓K/Л╖CМK·єЫЗ6.Oy·║Y╧ ║u╧тС--влзLц9$░" DЖ╣■╪/M рЫ╖hЮ+╪K╖i_вp▒Зwbcn?,Sбf┼ ^╨0ЄU▐■% ╣■°%ищ╦╞O╕uт╝∙a═Z+tА ЦХU╦f╜║│b·Рь°╟`|(pjЦЗч┘бЛўпROg┴рыШq15lШ╬|syчO╟woQsУq°`▐^╗C╖v¤F ╩АQ▓,.P╧╓Sуl▀╜o?ЭЭН┘Юеl|нV-{%ДХq[N]╥м ю[Д8jЩdВ|5╛#[W]┌╖Н╥U$Э2Т╪▒G╧┌▌F╨!Еsh╔─Iц*VViAгщфЫ╟╫NшW░t╒QЛ~1ВB9K&r%▄Wц!ЮБ╤h¤·ЎеЗ|Y╢IП┴[щE╕/█Ё╓╕╣в▌НY1ї=w╬S ┼°9R√4 Eэ0xT╔=╥9ЧH▓я~2мЦ╦ЇZї▌╣═ыъї°ОV]KPpxШє╙ъ}KgwЬ6е^яў#─ф╜Ш╜┤X╬┤ЦqєЇСЯ? Р2}ФщEЕ°чF `[┘q°я┤iю+Зў■:√K ╦з1 д╓О@Жk3irл╛ ╓Б:Ь{cўК=є?й╤вэа/V┐СB%3╫a)8К └5╟z5#Hv.Ы{qу╥╓={┤ЫЄй█&юЪє┴═эg-▐X╡╢"╚XbVUзiмЮ7ч▐╛╜─rd■о┐▀wФш?ўЗRїeЫФKўо№tъгs'╤╬ы ▒╥,ЖУ"O│Е&-█╚╘(e╦M▀>vтУШы=Ц╬.╤иЫ%╙А3Р█jкМкp:+к ФшА/bфlЦЧ,}╙д>qЧ╧ї¤r■[p▄+3Ж╬▄PЭЦri╧Ў╙ыV{ТУЛ6j1h┌G\DqН╩p┐~╛ь¤╔▐gўи▀зс╚ЇM° cЦяИк\ЗH¤╢╟Рa╧)Ъ/·╘▒cЯMа╠╖▓E┤лу─O:Їъу╓!n√х╚тЕ°█(p4>|│┴cы=¤гцЭ{д[ФГз╢нY╜q "УЁ0P/NDЦ'О°т╦╩НЪ╚А╧Yv█в/юьXЛ▀b∙┼<┌ KёсS┐_RвJ]Э╡$]№╒G▒'ўPЦП8w,rP(q╚Q∙f═]^бТ&rТц^0sr№х H√ЄcКЇ▓v.┤р┤9Л"╦TЄЬб╔kgt~yўF▐w¤Эш┬Hb╤Jg/+\Z№м║┐Я<"√ёm╩РЙВАОGюЯ╡Е.їё┬rX)8ўj╩╦EяONЄя?п╫З?0ТлPйЦoГєcB3х╬т│УRЄю═·;ЭЮ-RЎы═{╝┤╚░ьЫзgOAy╥)▌ЭўН╕С8К╖SВєУu┐Ё┼╩╗h3■╞ХЕ3&▄'o▄ЄПУ&пUАh№│uД"Е┘f^?7ц$JєP║Па}Ф?┴W╧█щ░ВSоН*├Щ┌═У¤rехbУа┐M└?ЗКчВ##з-┌HфшУ;▌╖р{rX╚YF┴У╘█╪Ё2х&╬Y(ДЕMpl▌К#ыWSЖ7яM∙┐С)S ╩W`╚РБнЫ╒амЬ ыю┐ p▀є"17ма╟Х?сUJцєч╤G3o%>!Мк╤дR═ЪТРЁQЛщc·╦█╟WNЬ╤╕CзцЯ|оRБvН╒Uц└l▄_╛oс7ZwЎ╤╝\!Ц▌╩\7cr▄щs}>№вTя┴Щ,й·╬,¤■─цMz ъ8сл>ФцyзЦ{n▌7'6n·ххЫ╢╩х ─▀╪D▒ №╒╔uK+w┘·╫>V"D0ЛЇ<`_?л╔vJ╗wщ№╛W9xZ`щ╠\oЗC╦╖iЧ╔┌LЛЧр 4т0ЕЗЁЙ▌∙э┤{√╫t=╡╓РЩ▓(ЙШ╫fL-═sv O╩3Zї╨ЬЭA√Ti╬╟╪j╖юRиxмЦ╔Yя╠Jy┴Р$ГцИгЩШикVпQёКUu^╥═╝y@ёВЧуKx:{Tw:ў5ДТ╚wГ0BR╩KЎV╓ в?eСЪН<╣9GV╬╛zЇеx(ЦцБ╡[wr`┴5╖╢ЗT8gе=?░тЫШг{█n°╨Р║-┌9Є Б∙+5jnП,д╥vNSD5у─оM╛мTЬёHд╔р 8\.Ю m╪╛╜= ╚ЭЮ│l·Ш@┴Ь╛lk╢░╪Ф5ЗсK│tbG[■тcЧ■╠Еr'=_1iиЄт!─О*х└бЯЖПE:ФхФ и╨`ЄВ╒╘ы╕я?Ш╠Z╠gk╖!aзО<∙┼{е┌Ў<{ХжйY╖╬-?,вLЕ╛Уж-Я968бЙ▀н`"╦{P0╟т├о┐╣sъ└Ц/цХиRo┌вEйлrXр$*ЬяPцб8F╟bдщy{hэ┬зYКvзdУ╞е╦Wїbй╩╡JWнб│ЬВ∙/Оzл╦х?╫Я║_ЄКI#^▐К;ўЗЁVme┌щ─N Eгух▌╙╗Sы4o╧┌ГоЭ>,{2╟═▀QдRЩГГlЄ `J═`^7╘Ї╘УЗўЩ9iВюхT▀Х3'▌ЩU:ўl1b▓#вnЫц▒ы^wFъ╤гG O2лЫж█s√фq]є╒n▀б┼░ tx ьk'▄¤▀├¤▒╦сWТё█qtGж%╤Jvт╙3w ┐d&%<>МcНъ}&┤ш5Д╔БИИэМ┤n┘4ЖN║yb═Д■ўo╒ГBY╩ЗdY3Зt▒HВOз┤█Ч\Ёe∙&]З|╣RЦxВБ╒ї\┴в┘╝{{┘ФQBРVвuW┴Mе▀{№р╓хЁ %Ы\нEЕ &·╞иЖОaпAЫюC+gЯ┌▓б^Я┴я╚юЫЬ┴VPl^╜√ЗO:LЩ╨pрtЯ╞RnьGDa0ИZФ┤П.█═#ЯGЄ - ьда░ОК╡Цк▐Hг8I╧}¤°╞╡│G"Й$Z╞ КЗў═░6Пк\KзDvR╛╜{ё▐∙Wk╤бяWыR─|v+;Dq_;}юYB|НFНє-■8ц╓ЙЧз^;Yж\╣╚Жmw<э╒│K'О)^<▓pT╡fэ"╩T═a ┌рЮ3/╪ц╬J╖~#^cоФp#рЗz]G╕Єe E╦I?yhПЪУ╩#┐з?^/║r╒ф█Їj /ъГ°.¤┼хЯVЮ┌╖Щ╪fmz !║}°g-'╗f╖-OТ┬Єc*Ь╕T╞╥RbcЬ╘█!qCЦэЧ ЧLП┬щ(джв aр╛Ьxя╥╥Йг├є~ю├йyў°ъйГвцAв IШ!=ZїЪмM+Tзs7:8▄╕;ю∙хГ╗X·9Ф└|E┤яn┌э:Mз=Н╗ql/gх─/)ф,)4я,╒░}OJtЄ4уKO9│w эIхHюЯ ]╞ф╛a:Ў╒я╪╒ЛЬ0╩ЫТra╧╧Фю¤Зow^кzнц-4ЮЗг$┐>`'еж+╟рhАм┬╪КVк]нA Ф╘╡ЇWqчПьLь RGbTРР<┤│lїUj╓C. e$<{rы°Ўн▒q2├Wn╪4кRч 2ёwn?8w2Pёb-О{Б▓W├№и▐дmT╣╩Ф)└v}xэ▄├чxвJЙ52вHGqH▒AЛ╢∙ЛХR ▐ЕгЙw/√ўO▐╘rщ4╙┤CW┴R:я` э·щ¤)ПоЙЖ[хЬ╪√_ АЬM{H╙╢▌ >Д╚J╨<чn╧Lx╩гV* сМЪ╤YБq╢h▀Y ╒Y▐╥НЫ╢д%%Рk¤nm-дН█їрГ#1Ur.┌ъ{ &Q{О╞Ц kk╧WмY√ож=╙╠I╝xd╖'#Щб$K╪╖:├ Aaн║Ўdm░Jv┬Е#█}9Д█и╠oЪMЁ╠╢╨ЁF╜Жkв ю╟ЫЄ2z V┌ЭБ▀ФNzq4ОS\-{ bВ"ЬЫТт╧╪iйTvGиiъGЫ"#╢ь┘╫ ╬[┴ўъ∙йГ╗эФП╙<■|<╕0ДСж╬цk╨▒/DA╕йзwо▀├ш ▄;щА&НбHубэ.WУЎ}9gд@i/▌╣zю╕`╔К┬~▐?M~н34▓a█Ф+?lщg╖/▄╜rЮ╫rE▓▒uЪ╙РтЕ▄Im+[0▓uгjЬЮ√є┌ Ї╙gпBЭ▓'√.сюч|∙:╦Й─EJ{л%╚oY╚nЖИP╤TЮ|▓ёЄц╔╒У╞4ь╥зё'▀ы&д)8m vЩчvн?╕Ї√Є-█НШїM&ы2э6%}╦GcOЯъ7э╙▓=Ff┘ьN├w|ї▄шU│v╨eц▄$6Э╦sfщGЗ╖lю¤їв M;xзepТiТоm¤╥OsПоЩW╛єР■3fл╝ЛИ░А7Б╒єк█tЯMў▄╜rс╨п[ ┘╟a3╫iЁ╨" хЄАЙYЫf9,╩зщК─█,m╟чSn▄▐n┬┤C'╥МM╘Q┌▌?ч Ь+I[к%р╗&кg╚FexeХ!взDg╥RW1∙╧`НАВєД"dц┬b█6ц┐+е№'/p▓▐дg▀ я'(╣ї╘gГ#R-╔'╪▌чА`RS`╖й&▌╢╟Аа"ерaЇФ╗Ўl7б╨ЄxnЮЪLN!M█(0╩╒m н╩кцSЦN┬[м┘Сh┘MAВГjєfч>0o\╧└B%╞CЩЮЬ░юГ Z┬├·їЫhAe░ъf)В@№тЁЧ╤Td┘&m║:RЯ=e #J╙Wmt*y`√╓│s╞n╓cрьu╦%]=ЄуМ╤вJЇ5q¤ЗSm!╙нS"Jy%ЗaВy╘┬фФ'gп·j^T╡Ж┐ЯяСDХA┬°AЮцYZWСJЙ№a┐XE│╓|Lkф╛М=░s╗┼┌`├?┐q*#.6DСЪ╡;Yмf├ Kр8k№S0┐sS№х*╨  Чр{│|╩╨W7nП■amXЛо┼╕/╬7АЧЄ"f┼ФA>Y■р√5╬┬e▄э═Jj┌б█У╪╪М╠мJ╡З-k(2уIП>}Ш°z═;0R жd╜Yз▌pa╫&wn╞╨ЕлК╘lеSїц∙╜ ╟Fи▌в╜ц а Щ╬I9╣i═Х╜{TК3oa■ ,-Аbrt┌оYВўQЇК е`╫{KюЧєwеZ8Ей▌╣ЩЩ╫Пn╔Ч┐z├╓Аh9Ц╒╙_X3чЎЙ╜BHйqs║КЧаhA└эX5&SпЯ\=╛oС╥UG/┌кДД░┤ Hp╧╗Z╞ З u6░уф╞Ў┼{|Vйiз!_нЄКv$ЎЪв╞2 kBАс{rw┴ФСeлэїэrN╡'^╗}h├Єз╖OVh╒r╪ЧK2Ш0╬r3рЖX B%{Єi9W~wl+╢ъЎ° юsHCBщЦeT,Ё┼■p лv╙з╓я3┘0C╞k1D %~TЙ(у╚╙╬°[$QН5√█)СJлБ-её?Т┴#~йy#Ъf Fд) РиЩ7vн╪╣ш╙╩M█°j═1╪f·В╡┤еЯ}№№┬хЎ╠l▄й¤цEЛюm┘@Q╣ШРу ЖQx-]┤7Уo╨кНkUc ╖зй,8l╥вН|┼ZфqЙu▌Р5Лh@ oтp:╥CЛ╜нvЇцмLq /╚H9SkвDц;M╛F╞ЬРTаT╩ФС╗nJtЮ=ЕtVЁъ═!АAЩ8Ё)JSф5}ТnUКUJ╨xА4а╬Ъ■о▄ъ?┬эЪ№&S┬Q*, .&Ўг√х"Yд╤sТb░Ш∙2ue|А╚&ДIв)#"b$GрптИ░цяui■~aє+G+╪QКщ└b]u╨жn"5О!═'╦+D^╖X┴b┴Э (юоа_ж▒є{√ Щ(е─тH└f ]А_ wOЖ■ўёЁМ┴|Д0е Жbr┘ТИи╗A╕√вl!WД┬▒╨КbЩА(0йьСD9C"рВB9╪─З/:╥'°√cТJ)l зiКЭБ/їB|тг№┬Y&щ=р5┬яH╞╙╝JОR╚╚ЛМД#Г#H'▒A√Е╨Й°НйsHКЗ@╢╞■╓(L·,╪У3x ЗД▓∙tкGХ·Иж├йh╡x└:CсРP$p╩{¤D$ЯJЪe9 MЗиs<╬TДЗ24T>Ж(ЛcмATJES╤i▐GЛ рZ┌┤г╩ь╕╬▀ шВс9╒0Vф1CП═├p3Ъ┐}Щ╘DЪ4╩qxn`╜ЖH·aL╘['╙(¤╜RЪ─Ю─Дф{╫█╘о(hю-ы~дЯ─cлоЦ'─Y8├UшY▓W─9 АЕ■((Ее}syх─▐ї;їj:kЙ╔ZБZ@n╪┴В|ш╫-ЩZ║d╖┴гj┤ьЪ"│obc~Э;3¤ё╜Б│╛-▀~Ш[░S┘З╓╬Н^╜╕^Ч■=?ЬУh9ИЕЫў??╕y├ЁoЧЦo╥!Ыv└v┴<┬ gшєX>╖J╫■C?Шэ1-Б╘`/╙"з·┬Y∙╔╡є╗6mЁfхЎ=vї■Н+ A0єу░RХPИS3%0Xлpj8Э╛√ЛO.8▄l┌╠┌├FИЪНWLФе·╛L┌Ёе╜>▓f╔г чzЇш▌░sw%8┐ЫTн╙кO░╘ы╤╙╙2ъ4l.╨╝Є═s╟ш{╡ЖuСS╥RО¤▓EK~sёМ&pчн кPGцьTn·╜Г┐q┘╦╒яаp)Щ╧O ║ЩКO╕їЪъrО]║(_┴z╘[mйDАЄЛУ╔ёp°ШЬьь%УЖ0rZПiЯФn╨ "N┴Pн╠╘├[6\┌║╞5}┘+_сЇьм#[╓╟█╒o°И2╙(│кГ!ч)#'х <VиvЭ·B▄▌oжО41k╙пВлЁщ▌╗O~ ^┘ц▌■m xяФШ╙+з -Uz№м/n┌r¤▐├vCGWk╫Щr8 ╧Аwы°Ц╡7o?n╪oxЛю¤tV4¤нЕ9Y1╬j╛ьткFЦоК┌ФЯН╩�fN┬│W╧ЖЖЖЦн▐Иu\?Ў╦лШKёwо%=▐ичРn>═Р┬с К╓_'є╨ 3▄ ёsZЎ▓╔¤_▀И;яза=)▐ T│╦%sЖЁц▐тё¤╝>m№Ь╡ыЩЦ*Y╣Ь╧╗р¤ёёўb·<пTє■р|▄П..Э5J3Ф&}G5ь:ИuєЪў▐й}√W╧╦╩Nё¤ки·]e┘РяЭ\0c,├ИGNп╪ж╖╚╥jЄ═#{нX++╠фЦЖUоaPNЦ╔q│Ёь╩ГшеSJAоё С╠C√╟╨в╤j%=}▓|p│└BQэF╠м╓▓;DЮr┌єkЗ7 eя,5q┴бHaГэ:┌t/П-WЩWNп▀зHй*гЦlХCB9╘ Е0@░▐╒CЄю 1$Vаоo_╢wсЗЫ╢Ї╒ЯўC!Эs ║Тw╬ФСля¤╖е▓╩ъЇн}Ыў╠ЭQаhd█Q│J╢ш)2КG│d╓ Д╫┤0-k ╩y'┘P┐w?А√!╗█8&3WT#1│т▐╕s┴▄fSж6ю?┘Єа ·]я╛╠╝J6I%ckаЖн ╧╚┌ї}?n_°yеЦmЖ|▒,УТLЯK{│туЮ╗┘∙гъtэp °┘ЧвuQ╦bР╡дц$▌╣ ъUTг╢m╟~р*QБG5¤┐|ao/ЛKФ▄╙;6Ю▀╢Q~УXн}Я6╜ЖХоф├╠╞╜У╗ў,№Z7╪╔▀пО([м▒КєП╡P#{■╠ёOо_щ∙ёЧО╩┤▌ф Ё▒aуiп/щ·щG╫н+VмШ+<У╜\e*╕Y└ї*╦В P$uНшчўг■└ms~yS,IcРC:ССt~ч╞3ЗvUйVаХ╩Ё6I4╜Щдй╤╝yщb╜N=Z Юи╪CЁ┼3и╢ъЙ╜ї├╘╤bаk╠№╒╬beY├5<2╝:╬─\c·ь<єр╬эХ3╞ч}┴j3┤X.Г╜+АуЖr░╔н╖сЇ ╜╫┐╡┼■╧ї/~i8MХ2SЮe▄╗╪оF9Nuo╪░ЎЯў┴Ї╝·єТ{╫.wЮ5╗HЕJ╪╞л╨<єi╠ЙнлюЯ╪Ь/┤j═zЁЗЙПу_>╜Wеmє·F:J╘фuцїщg╫╬ЛП╜^║j¤ук╖я'&3.f█▀ж%<╛_╢v│югз,S∙Їё# ўп1ў)*%Ўю│;W┬JФ.]н╢a┘ ╩╤f└`GБ№&OЭ▀┐+√с▌GWв3_пXе¤рaЁ,'╫╬~№°IСJї┬╦╓m╥sPpсТ jXВЩ{уЁ╓ ?о)Z╕dГ╤уlлёЖ$┤ё╟Ё Й ╡┐--'юц┬Yу9зjНъ6GАFС▓║Б\ц[7я╚^sЁ7 ЛWйЯї·∙тСэ^иT╖Ю(p8▒Ерф╗rхЖ┬:з═[R║Д│Yёэa╖ёUъ╖U ╔э■зх▄╛cЖЕ√цы┼ы[яВ√┐M▀а┴в|n╧├3╗нЩ╦║╦Uо┬аLК.чznЯ?╧x3дР5║Ўk5p┤`wzS╧Ьdx3╦╫оН│эИЪ╟2йI╔q╖cЬ┼+НШёс╒ныо█oИB│Су█ўrjяюsжнXзя{э╗uy√╠№icьТгy╖>k╒Ю э7ЖтлQпfюСkM'╜I~r ~╔F═▀√фk7*▒J&Ср╠yxy∙╘бК█▌tЁ{ЖMё░.ыeжЖ}T л=╣tt¤╠Q╬@йFЭ·/╤А5YЎёг╟/Я╛j┌oXў│,╤дЖ} ╖v┤)?9╗ў╚Є╣AK╖;+▓lY└Р*hf=9╣a▐эГ┐м╘╕=N╙:g·DC╝uёTfzъшoi╓[¤№╓К╔├М╘d>0дb▌FВ╙ ╤▄═є'M_nэо¤ъШ"ЕЧMU╛st▐┤aк█-ЕмT╜б=╨ЦуN╜їКiH ╗i╪g╕R@д(Ю╬Ў▓┌р╒√╤K&┤╣&-·Щ+P┌?ГУБнгй├╛zto¤Иц║a8"КVо╙ШсyOfj╠хS6З│A▀щ╡:uбCC,JUЪ╜Yc&▀<╣n|┐╚╥╒F,∙E e)Щ╞!Ьх?■Ц-E<└¤г ?.█дэапV∙Д@ ╢-╤GЖА▀Lxu|эКЫ╟ўЖ еъ┤╬_л) цЧ/яЭ y∙ГуЗЭО╚*u┌+┘кg┐\╬жТЙRў┘;W p}╦╞║=·їGр>5:юs&gъ▐▄Мч╗┐·$╚fk:bTp╣zжц`Xэп╖!¤▄з╚tЁW/┐:s #юъЛ█Ч├Л*VлЕЧuЄЦG2▌о\OK╚щ·╤╒;wg ЫCчeь^n№╡S╬yzыЄлД─▓ █┤;=(к╝IЛo+Я№┘ЛFОц╠р▐Ksшю;чOь▀┤.э┘╜RХ+G)fРJф╜+╤ж╧]з╫шЪ]ЖК√фон╛─'v=ч▐┼3ioRJWпЪ?кВЫ и▌upDЙ ═лЮмKЫ╛╣░o╗юєTпY=$4\eDЯ┼╤ЬД╔ZЫл▌А┤#Lсl╔╤bу[ЭЭ ухз№38q┬:└¤╘─д├kч┼Ю·U∙ъїЫ╪ Фj╓gч╥5∙┬╓Хzт¤╦╧y|Z├▐CЫwэ}`ч/┤юE▒ЄЇдЗчO╥ВX╛I+╩╩Ъ┤MРкЎсMJ8є╦f^ХEЁGiй╫/Э╡9д*u2О ЕС╪а|-╗ї  SQ эЯy¤╦\ ╓√?╫┐°ї┐юYJ+ўю∙yїЯ1│f╟Ю╣Tа┼╦╦▒ФдfrЩ зwm9║yV$XО╥╪.#G╒ю╪E +тх ї─Є9╤[V`бD,╫ж█РщБЕ║}rы3░CЕ╢ ·°Ы║НЫп\2 юс]д ╠$═╥ T╗┴Ш└q VEVм─│╩кп╛x~Ў,э#S0[єс├eЦО■ё;J│D бcg╧/R╜v╧qЖмdо¤r╓├╙'zOШ^з╧Р ╬IЫЬ└№╖Є┼Л╓╙jZR▄-яЫДm+╦╔)╪ЗD╘Тh╤╓sЇ╕е*Ж+oДf┐z║xX{╥Иb╣[@4МфРzОЭR╝|xё╥║hx.ы∙¤╣C╗a5Pw #Qт)U О4jвT╕H`йТЖ=фэ▄ТХ7■-п юJUQmФ/∙щэ╗╫╬▌┤Цt╒p∙ ы╨н╫ЦХє5ЭrFUўэо╨╓╘╥Я╟╜╝╜mёЪхh^0сп-:▓dЩ╤c╟║э┴║(.Э5IOKвx{T¤цS┐°·°┴=√чN▒╬Вї[╬№Є+И·┐?Щ2╠ИхG|╖0#%┴ЧЇьЧsФ╠llXбД┬5ъt:\rЕЕК╥y;ТХI7|╓Гшu│╞·▓│Z╫vрx`28▐┴gBd$X╛ЬД█ч7|<ЮR│РЕЕ,x йj╟▐ [v░Gф+TH│Ld¤№╕√ ╓╬В2Ы/}эМQOn\■∙╫[t╩eBL╙┴╝╝ш\IЛзL]гmgгtйд┬ +6т╦╣еwV(&9■┴ъж:х▄о╜╗я█│=3+ хЫmОяMк╥мг█)[ТЭ╓│юЯ]ЄсД@зг}╫ю{~▐цNГъW▀▒Sл╡шьС┬T╔╞иъf√Xгё·¤шEУ┌]ойЛ7rС┼u╢B╞V(kУ√hї{= ╠▀оs╟╡лVQ `_&0┴бзи╙:╟т°АU├бlВс/Lk ╖N.Я<░@ЩЪ#¤jЖr┤П╠EIА?╛Z: ╗N╝╛}∙▒Хk╥f°Ч╦U▐Б|SnxS╦x№`╔┤ITV2ЕCy5z ъ=qж ё@vBЇ▐эG╖■J╔f┴jН&}√╜*8 ,Йь┤rvмЮeыж:=·ў7╦╦ыюy{д╨j┬¤╦ &Мь1vRг╛C2-╤д%ЎпCщ ў¤D)░;~▐│n лepж╟biХqаС╖|МKN╩█O√иnЗЮ╩чa▀бf_█ў╙╬Е▀╙Фj╤┼┌╟╬]Uн╢ █х/╖J▒8E's4═Вqd(Zvg╛~ёєВO_▄Л┴[k)Hв═╒o№╘ТM:∙lб6▌├ф╛YЄсФдЗwH┐&6Ec]Ж▒QФ╜яь┼ъ4БўхNO√i\п╘╫ё`ЪЙr7Ki °L$ f@■ВЯ.[O╣┬▐о╤ь=ЦЇ4№┴█ЎK╒Щ■.h№З░7м╪╗ў|,у}mич,Rq┬w╦В"Лцde,Э>2ў┘ юДf#в╩ ?aю╟3PаВ└ИЇX*'}j^▓ _╢╢P╤"╔qПOCсИЖЕнп─)├╖ЄbD╤ ▀.)VVGёЬmЧ·чоkЛ¤Яы_№·▀ ўiU7▓▌^6▒▀рq├кvШ-`Y'р╔,@Ыб°2R│▐╝Q} C32kЖО )ф3Ухy░(╔ПsSтН╓QК(V8J3 9;-¤┼Ckz *╝Xygp╛Фqzv2k(4Ор-ук▓ЦВШ▀ФЬ%лPо╨@ZIЎTM~@2╬╣4P,╩CYю╘╝aЙШc Х*m8БЗX"Luп№ь├{gOw~ ├┌Э·*МУeЬ│Ї/═х!}м(жуЇ]}╦ТБёКЙd6ЁQ%J▒6╗╞АУ`═ЫЁ4ЖAё,KЫЁ'╧ИBёвe>>АУ5)Э╬M═ИЛ,]EIW╥НMz╧ЛФ*з┌2├┌їw б¤пыў╙ q├1рjХ┤Чпb├0M╓Ш/4_■Фgwр¤щRHdщ ggР ihю╘7Йe ├ ╟{5#0($dAQt╚┘╣п╖EKBP■"еJж$╜РУт╜╩Q,RLєц╝x№@`^ pХк%1эI}єЇ. СЇW╪ГВГ├┬y╔ g╙Х4OЖhШМЬЫЇ°.k╚┴∙ 8є╙hФV╞∙зHPрYОS2У3у жb`г,БV╝Ц-0_TH┴('ГdЮЎ;╟\■щў∙яь<`╒╖ъ¤q WП╛ўёЗе[ЎLч"y╞жъ┘ Oю▓jЛвm╒ЧыS<>░Чи▌O +j8╗хY\%J:в╚ыЮг■ш¤▄g▒э═╥▌╛gёYт"Zх Цйм!/╪x√Р╤└ЩjH┬Ц\ z{WвUХХXЁ╙dP N▐AщU╪@BXT)З╙сsg%╞╟2╪цБВ│H┐ЗнГЬcMзC -QYХB`єє╓ Kу н-Ўоё №NHK{Сs╛Cэ мТ√╧╠ю`Дs▄g╓|ў°╞щFc>(▀вЗ╚|&╟У!g° 2b√┼eЧ з▒r ═B√└ж┌┴╬░В c▐▓|1╢Z,я┴▒wмHi6SжMSЗ}0МPА╤4Оsd1в╠ёк&ZЖИВ├жжГЕd░NО;уp▄┤Ж┌aмеЪg╖йЪч╨ъХ1╗w╫n█▓F╧>оВе)НчD^5Ў_╗ЄH4LC▌ДPV╦24└кrМйл╛A╥ЧЖzlМ─sЦснiАfE°;a№є╝qшЦД}T2mи╪7cСБ▀8щCЁб ╦ЄВа╔╠█╢╠z╖┘є╥╪gзT9iR,*p[ФЭЄ╨ДвбO∙З>ТёpЩЛОsф`ёсХ┴o1tС6xVEY\S2,╔g·8╔тI╛LГ┐ЖЛ5$ь╞y╔╟╪t┼┤у╕┘аPmZcpфг@ЇTМ╝╤у,йCа& lJ╤ЇB м└юасИ°DдК╤ -Б√yОТ= >╛d1ЦаgЫМ▌`ь*╢[│DЬ┴$Cy■zлю┐╡є°╬╙Lъ╜╗~Шеk╣-'~Q┤n┴ч╙┴zpи~nш2 PуJр ч"Єдq╠└┘NЖГ6_▐╝}`╒J=ўeЄуш|L]▓Ч9╩усaЛr№Ж√и3 ▌ФnяY┐ў√ЩВ#$мTЭB+ў1╔═╗зJ▓Ж*"я╚РYc`√ВY├ЎHam╪tпсцзкЫ`7Uє&%юЩ7;-Ў^NfrЭzОy▀├┴эcл.сЛCЬwя╝/yЧ╪}╞╫Aб%сшdЫЩ6╞∙╧Е√╠р╝╝ЬN*ХTЮR]ЮЦgр╕(ЯDsк!hHE\i╫,░Б2лO3░6x╦щB╢$,P№╒Д]╛8# 5╖¤├u╚р! ╛_тxZ╫`ў┬▌j`*iО6eСV]╖s<ьLЬ╔─Ш▓ЗMo:Пж┘ Т┐рhy╥WЛК▀Dт e5ьлH╝╟]Н═К┤О3ЙИу■ ╡DlЗї??Н▀┼ж╞╚c┴D¤{Г╝х┤ё║'ГS┬0АвUВm╙┼├▌ч└■┤░КВDQ<5:g╬ЕЭЛ:╓А░ `b/%>Зм# {ЭQ"╩b4>@бE╗б  Б√ ╣■s¤ r¤oД√Ш}┴╛`GЇO╦ОмЩ╙h·7╡╗ 4▄ZєPВЎ▓IX HЎ└Цj▌d┴╖r(нlj4╩▒I28gVc~Ы>L3мf  xХsЪ8pP├Щ5(о╧sDT┴бршз)U╖▄(i8│╞ ├╧Xз▓а┴╙Йр*Л)4ес╕= ?C*╛·ь╒▒У▌жOй╥зЧn┘%Щб9Sб Ў'Q■П\8vч:Ke13П║╕:П c(6еы~e ┌пW└ФH ЪЙ¤,  Д?с└фk■┘A ├ъЮfЪ&Щ╨█аЄ┴,╦шк ■ъ&╬?8╬oфш ·Y.tLг╘·9ЬF▄бк║(b3╖_rер?К 7╤ла■-№K|Е├ %VчuVSТQvgЖcE ')*╕Д╫5 РnЬ ╔P~сЛМK╖H╧" Нb9X├зщ║╩т`HЮТECБP╔▄Ка ИxрЫD~fT№╟шБ \t"Bj▓ є■oэ<Р├a╥C_;kф╙g┌|╢иJл■ А И╒КЖНMAи kOI╚йр`Г}А c┴ы├РХ│a6T╟┴Ш ▓Ёёрьy╦_┤БuTX╔а9xпжР\╖8~v╕"▒╩yYЭЎBф╠d╗Y╪ТЬЫз╓╠%╗s)╓)D ═ўaQх▄▒/kш▒гh8rВJьр│bш╧■Фtd[kм[КS=П╬Ю хєп(#Н2SВ+4√├nЗ-Дг=╣(B├I╞╦жiкЦр║Є╦Єг?╠Bim!вP╡3ч,╠сT╙└(┼ЙSgiХ╟БИЬ$]┼m/└MБqРсюq\ ├║.Z╞Ы╪G╦'П╡PZWй9``яў>r3Бd┤К╩"]НС9ЎїЭ╞н╤йu√Щ▀Y>ЗC░d>"ё?Юl■Яч-ю╛└тНёи#Т▓МE&┘┌цah6*НТэ▓D /Ў╬╬╞ъ у╧sяьИР┤Р$┤Р╜Р,-ЦХЎнhУе╒╥ВJ~ЇK■JHQС%Z╚Ю%Д▓%YЫ▒/ГЩ╣ў> ўє|ч╧▄╣3sяЕ╬чUу▐чЮчЬя∙Юя9чє=kljМu8╓8#═HЇ╙▓█mGмэ▀┘gьuг▒G=╟?√U6Ь╓6рЬM)лmI=_F ╞/р9fа1├╛Ф╫ыЙєсрu8Wд8╫Ш:зХ`У┐°о╬Ел╧╤ п╟kЯ(bўСж│╥▐6gи▄> ┌уь'rюkў;оG─^Э¤┼╬┘∙Ў╨НsжH ▐>Б&Жzo┴═Ё─R ╥Пж│╧8М▒║░щ╛чИяНННєM0╥|╕ЧFС √№(+╞<@U XЙ>31=&╒яlф& .┤с4aNуo9рч┤z╘х╡▌╧У{┬g─·}Юt3╬S,И═И▒opNз▓зъ-{А╟╛├у╨·Xч╨}и╕Уf─┼∙}ЎZЬ/▌Ьax3|ЦЩюг9єВNж{¤Ўaб■┌№t■┌╖бA_╙c2ьЛнбпDl▀╒}t╟К%Юm)%+_dVк@Ё"щfЖu4чЕ0[Угm╞ ЯsгhЬ/>╞o▀0╥нXFрHМ│cЦv▐9╬╔Юwй}R╫╤└OвчhzjRl╝'═JЄ$°|╬Х╪6/О▒ХeЯ<х5b╠ 3ы╖?&Гn╚ыў°} №фП╔.зм┌Ч╚┐╥┐╥ытT┴┼эKxЬ^╬╛╦▌в┤7┬╞є0├╧r▐дo;jз░iy╜╬┼ф╤╣в┌>Т╩go▀MППє╟eШЗ-√6фD║е╦Юў╟$f°э█╞у▄{╗▒oп7Т<ЎЩзДIўA =ё╢9;├sЗa8%=я"ё{b╙╝I╬b{Є╟^╦e─█Vi│I√шRY║'6р╘k╗?9я┬╛o<8qiцP·aэ═<бЭGБs└┤Зл╜Еbb╢-Ъqx Ўд╦$ЭW╣╘С]Р╔├▐╪ЇШxЯ▀>]у╖ZV|с {╨в╧ЁQиGэ┼ЎМ ^Oё─Ш2шO7т¤&4 И}t▒7Ц_)Pl<═Ўw=▒╛_L▄~YМ'╔gJ╖От┌zжzУ +ЎМ}Ы╖,Ю~─└;NЁx*╓иk*юЛ+ ╣ЙўШ$┐q╚ЎC═8Я▌h┘Ф▀>А╟fQqUш╛mг╨}▀Q _╔м№5╞╖;.Ў`Fёrч_╤┌4╝цСC6!─°▓ЧENаЙЄ╟ёoZqpїШmj№YE╬,^▒j╡╘ШDЯsiU|└М╖пмї5э 1╝▐МtуР?vFОOЄ¤╓{щ╢] ╝°й√6.ЭЯРЮJkp╞∙ЬUйЎaгРe_'сє:╖▓CёbЎя:┤ш╟Шє╬Nм╥(!ЭкЦЮЮpР╪┬НюGgB╬¤щ╥Ж╪g╙┘з<87┼°(Ю° √Ў √$J√Zy3╛Р╧┬ ?ЬшMЄЩ GЗт╜Зт╝Е╙^ц}вЖe%╞┼d>Фр5╥ьсгиЎ8Э╨╓)к╚OhЛm6#o(N4 BЗ  NPЧmзmbLю*3L:sС║╟Yl№▀~═9юV╬phж3Jle6┬ЖiиYзiVB▓HmЗ╢5:Ч╔√Ь▀╠Бj╙ зt╦wJоKqAфЙю╩з▄тх│,юt╞╞E Тщ╠бн`к┤ЯЩ╜@цЎ)╣╔┘Q░!░*y+єk╕N%\ [WшЄм╠ ·,бэ+йI╠мёШЩ XЩNеУ7;░cfИ!ЫДГ_я┼брN^┼*─0Ф *ЭLыС,QЬС╓бЩыlG╬M" jFщBъб╢4 ─Д eЗ)╙╣,Х╧╬░╕╟Y ЕМ├:6+Svю37Вцс╔42U└Vf┴9эБ$"f` еt╞jMY▀,F`kl─!МqЖT3у7dh╫у╢ #hБ╩rх^ОАsыЦєУ╜╧└q еa ╪7№ШО7n8зj;ЫеРf''2Ь╞╓9▐n╙─tНА:[Z╓чIЖэrх╗г Щp│м`#│Є╔q╥╚у▒Эс╠∙ЩU╞╓П│╟&р╖OБ╢╟ЖЭjuмщ╚ЖиM╚ЛкMVp  ▒"s Xf╒Ь├tЦТ█¤Цk'илyё?лpJ═:╓~√╫У┘┤fY xIй╪б╗ iyФ═╪s╠jfЇXь╬▌╔┴v█- З^?╠аCfуik|НcНЫqмё4ГЭhf╦Цi`╢YfN5X╬Є%iЩm╕=uьЎ╫ж╗w░ Чuйо┘╚\Br╩fБ┤УQшЁ╖╪╤FюЇяaД№√O8НкАNЮ^╧╚YЗ╟╒nЗo▒-╦чМ1█ЛЗ═Рa/Хqjk $+brв}a +3ОЮЁnЇ▀ПL>Э▌╩гС0╟H {_ьq"╟╚ЭKv├Д╧бАО_Тha SПQIШгДiEе├1б┴ ╡├КУGЗ9!▌FЕаHЛ}2I^ Тy┴Gm5╠▒А╝sd@фИ┌╚гСЁi▒├JxB[Ыh#?Й·ыh (ZZrBQPM\Xф╘щ;Ч╙┌╖t√|y╥}√n?П╫█░├ Х╖╫еЖг√Ц3╝@╦╣b╦у╡Чp√2|1ёЕь3╒Rw╟JiVпЖ7у╚G#FШЫ■°нh▒3I_╡vг╧╪g·ЭIFп}│[FЎ╪╜oLllМ│▄┬╠{Т┤@Ц"9; РУУХД9Y[БРХи$╠йА■~┌нйD%aNСИiEл├1б┴ ╡├КУGЗ9б@zФУ┐цДУGЄСфДFU5<бMY┤И╩╚гТЁi▒sК№Д╢6зY¤Пш0*Tс ┬9╒▌NЇш╤гБ╝╬\Ж╗╟╟┼ЫЩЪМ┤┤┤Г:╦Y┬ъ╨ю╗bо]╗f┘▓e▌║u?l/}НM43Gb|йiGR oфGцж═ыКЬQЇ`ъс▀ у╠b%╦Хлрє[▒1▒_║╫F,Я╧ЧШШgЪqф▓ЖЖЖЖЖЖЖЖЖ╞щgпЯ=°Ёс<Cўь{{╣'п=pр@RRТ╟╞ЧpVЩ2┤┐k╫оw▀}ўў▀ z╥D{Н╜п▀8ЪzhхЄeS 9╩▄ЁчЖ3╬8уHjъ╞▀/Q┤x╣ .p╧qNe;┴h°утуcccэхDyПю─бфQю} °¤ЎtЙ╜Y╚4] ▓5bЯPk¤б|Ит^Щ_ sИ─0О▌B"+Щэ└ЦЬZaf&УзфY"81x╝▐А▀gн)[▓ьж8V@Щvc_Х`┌Ц&K╕вTФc╓Цх$*Яэ╕О}p ┼ ^├k╚2O╦9м"`z╝Ўc'Ш=upЮ╚BP{uм│4ХS╬Ў╔K~┐/&66Si╬ъRgJ╦ым)╡%q2!kцОн╫ц>ЯО~flRClc г%{╗п─Є╪█+d╟Й3?gЖ9╦┤р╖фfЪР╞-w╞Ь╔╣pТЖ√6┤╔Ў ьо%}ОV Ao?ЛС[▓E$S├╬Ў╙su╝р%<Оh▓ДSнВVч,╠╢О7ЫVцi0RkЭcye У=уЬi▒б╦9гФ╝р!█.2 Щ╟U -g▀л┌ЬQIц╨С@6#ш"ТфДОYЖEФFm/y│Uф╥щч,ItСЯ8;МбC├*аъ шжЬЁqч<Йa╖жБ├ЗRн╝╬\ж%K*Фд6╟ж=zp Б"EЛж$зД5 П}иЧЭюЖ ЖОGёхW_┘╔▓У<|ш╨╩_VьOM>ЄcsуЫ╬(Zф0t├ЖтgЮyсeЕ1^{IO8a Й ▒Ў.▐,;Идє╖ЩV8фяДХ┘╠З▒╣Аs·fL╠╔╜4┘Б=уcfvjЮ`ПюьlО┬RE┬юьКАчX:Оm8╟px°O╢зfI=тDm т\оИЗi:,E8╖│┴╤╠МP▄█ёdюJбp╝Ў╩3;╤А}ФРIцaвNF№~+У{╪&nЯь) ▓=щё%Ў1Ю╟6Шр┐╪qxВ═MA╨╘рFG3╫ЪЫ╣'┘ nmчЫув№─Rї└╔▒┌шъ07зvXС,╞│k┤@ ╕-=уEА|2jtFFzЖ╧weЭ+4ияш═╠t!lзв └╓н}+РС ▀u╘h'╜dщ╥єчєї╥K/╗сЖыО?їH─├ДPИ╧чўf-юрцЮИФ`eОЮЖvИ╛щXh№3Рсп┐R0Є├ЗScь█iнBЕТ┌╡k[вDЙPкБ@ц\MцN4<#N┼СJсQ╦IЭ ЕaкЄї∙▒▒vАУД7KмїЦ|ч╙Eўer╘vЛ■яZCCC#wDGўГ+Є╙╥╥рБПwх╩U9╙}Ыq¤ї╫_у╟Пў∙2╛№Є чf ?IJ=Є╦КUЗжО1╥▄№√Ц┬EЛжN▌р╨¤2х.pN╢│тьi▌0'е╨╒$&&м[╖n╓мY^я▒╬╞у¤j╒о╕·ъл▌ТЯ╚Н5с!єфє╟gн]╗N=┐тК+К=c■№∙7▌tSйRеЄ%I┤hвК─P█YЬQo{№юп┐v4k╓,9yч┤iSk╘и┴HjЦ╚ЕL▀xcЛ3fTйr∙ў▀wцЩ┼═,N╨▒Ё░├¤√ўП;Ў╝є╬o▐╝i\\l>№"бЇ┴ййй╚╝xётw▐ь╕ЮЮ /,ўшгПЮ}vйVнZ╟┼┼ Щ8pр└М╙╫п_?h╨;╗vэКЙЙнTйR▀╛}n╕с>;Ї▌╓╔╛}√&MЪ┤yєЦБ:tQы╘йї┌kп5irнifОъ9▐mЄ┤i╙■°c╙█o┐ЭЪzШ╟ 6l█╢M╒к╒о╝ЄJ╕С й4Фя ┘ЇЇtr▒zїп?■°гzёНхx╛zїъVп^ЭЇя▀яеЧ^╬╚Ё▌}ў]#G~.╛ЮЛ'╤я╛√n▌║╡:f6xA╡j╒╛ък+э9CON4▌╡Ж─▓ЩЭ>}:нЙ<Ф"цo╜zїлVнRАbG3dаБv░i╙ж))╔▓oйtщ╥№eЧ]·╖ ^┬у@Цйaq┬qw┐°тЛ╩Х+╫н{ХsьZ>}-idИ099хЫoжQaeЖНЪТФФЇ├3i1ъ╓нkп█╠Jжє!yBZTA▐.№i═Ъ▀╥╙3h(ьй┐L;╖Ьs*Мц═ЫХ)SжА&Яв┌АX 1чyБЇAВhН╝@z╔В[Biф'П$╣Д 'єЬ,:М╒8ЗEnuЦVЛf62║Ядш■С#ЗП9J;╝b┼/┘;╦╜MЗ&Aўw|■╣Mўщ ьы&эыg<╨¤Х┐м<╝ ╨G 7┬№cуg-z°░3║цЩ\pБ}╝Ёц╨L:d╤3f ╘ ╖Г╬F╞ЄE╕Л/╛xЁр┴uъ╘сбЇQ═їd}к│)▀▌▌ьф╙O?}ын╖6l╪А Ё<\С╦/┐╝HС"Л-Ъ={vН5ь╙LИЬjv╪¤╨╩\╧z,МЇ╕ЄWБд▓/1и0┴cV│L1KЎА╖╧gOP▓W┐8├∙J├в 4√ ╢╫еKr╩ЛД∙Є╦/+TиЁ─ORй7же`чЖ■╨CёQ┼Ё°╧╛4ИjBr╦Ч/╟9∙ълпn╗э╢П?■XФйМJ╒)├86c ^┤ФЧ х║н.Р─w▄Б6$ quВQ p═5╫D26МХв[ иUлVєц═#u╟U╦4М Pх█╢m█╕qcg2!FL╫tн,WЩS╟ЭбнюvP-;w╖Ў!╞>Я┤0Т─Ю={(eждд╝ў▐{■сЗ.╜ЇR^╒bIH═>╣ Kф"Тj┘ьecAЭлМ`нw╫ЇР┐кв)итVепRWId.а ╛Єpєц═їъ╒╗ї╓[i▀B╘вZЫHъйdК▓ ■у╞НS╩пRе ╞L#┘йS'lUеZУЦ=;RшF╓fP▌}Ў┴sЩХ▐$*wЙЛ0bиyJо^щ┌╡+╨╛▄ы┼░%QьSj▀мY│0r%ПС╡▌SэА▓4F$q+V╜%ЦаJP5╘Т/eT┘UaО444NcDLўM╪Чj7О╡╖ъ╥мн\╣R║cZбфффЕ 6j╘╓д┌о]╗╞ПO°пь╡√╥╕йЗн°хzЁС ўц№;|°0─ыLЗюо0м(┤╚╝№Ў█oўы╫я·ыпї╒Wеу\╜z5,нTйRP╜Ыo╛9ыzП9вROHHИъ]ш╤s╧=7b─4√╪cПЙ$(E@┐ИЎ√я┐п]╗╢ъь¤╬В~zЄх .їQ╘ ┬-╜?3╧5Сq/АЎTNyN`Щ<Ё└Ц-[▐yчЭ&MЪМ$FН┼C2x╫]wё:Щ┼h╓м┘9чЬє┴рpJй╝╗┼_"uщнПёЙЫю#╞╡╫^█зOкn dЪбb_¤╡в√Дф!.╟Эw▐ЙxRdК▄И)к5 R▓фH╪EжШ┤$Xy╓,┬мY│цщзЯ╞┘#▌[n╣EО=з О╬З+о╕"╧Ь╖U°Ч.]J┘ёў═7▀ДEЙэ 8SyсЕЮ}Ў┘чP<E)G!╙нР3#sЎ└_╕pa╠Cёi■RЙПд╝0NїоP:*Ца| йV█╢m├ё rgt 2 /ї╫эu╥M╩еr)ЎЙ╬ Ў#UUф$9#╚Y #Б╔ТЛя┴_┬ єЛq q*╧\ЪiL$│HBк~IS├Л"Ы╪Й╖¤├┼_¤uqХДT#Hmє4r─╞B■єЯ №Ў█o]tEЙЗL№P a├ЖСAlцгП>ТVN╞&D╤ВIYИЦ°@ы-+qдeпIT-*U╠°╨бCЙЬЎ&кИ╝╦ цю▌╗╙D<°рГў▌w▀╚С#1ь6m┌<■°уTI2▌╟/R┌є;P├1Ц3╥!R╣═CJVцюDУ"ЮPyщбф│╗4╒g╔пШz╚pПЖЖ╞┐╟IўЧ-[&Э┬Ж Lы ╧Бт учз┐■·k┬Д Bў╒═ь/▌ ┐|╨}K&э1c╞tщ╥хЖnШ9■|вХ^I "ЇOЫ7oц!l■З╢yB▒ з!╬ыо╗О└ №i√ЎэBwК+a╜фТKBvB╙╡Р/"$╦фО'gЯ}vп^╜Ж ▓n▌:╪ <°╥K/%цло║ Е@4_~∙eLЗ╝)RДТ:ў▄sе╖#G╝`┴║I^Ф╖дў"┌╥еK├\╤dЮЭ▒tф░.ФГ=№°уПх╦Ч7ЛВ└╚╔`Е f╬ЬY▓d╔їы╫єU(~┼К%ЇЙР#\и*rbм─брРAh┴Р╞╙░aC╕O/^▄▓eK" №є╧е╨EE~°!╩╟ы;vмtчB2Оn║█└?бЪ¤Ё├╪-■╣├Н┴Т▌'Q╕vK╗ў▐{с╟bo/╛°"Ч]E╦W84╣╞А▐иM╖▐zлР╬>ВVBт╟┬╔б>BА$6L йи∙HЛиyцT *SYиьШ4ЕЕ% mв╤ h%╦┐╕ИTa2о <ї╘S╝.ЎCлД▒с┐ ├Ябr!═ЩЁж╒мYS2Л[°╠3╧ ╣bНvХ*Ў""╤ ) ┴в"_зOЯО▀%YP■╣╨tъ A#h8l╡DЙX|Wy&(Н0T╖╬Э;┐·ъл{ўю┼`0Wъ`йRеИКкD∙B╗16┬PЪ4т╒лWзdй_X&╤ReИ╓Ю,u┤ЗЙ╛Ў┌k╥xв┌~%утKSyQj!№d"ЖfКDхP6C*Ъ ╝шUлV!O┘▓e╜оЭH5j╘Рё~╤yЮB╡║уО;h(╚дЩ&┬p╝Дб8xr√э╖c▐jVd∙Єх╧=ўЬМbЁ?Б╫ёHёЫo╛┴уХR@єШ5В&N^GKhUНйгъE,~bE 4╫"OЫT┼*г√п╝Є ═VMЫЙ;MыЗ√MSFуCЬjоХWР gF∙е8ч╕R/─╬1rФ╧ЛHв<╧q!┌╢mK╔Є -$OPХЯ╝`█єgЯ}FgЭuV▀╛}+Wом┌jMў544Муж√┤╪┤K4■4╬лWп&╙бCЗ╗я╛ЫFШпtФ_~∙eA╥}~Т@сd═║┤Ю°┤Й┤Ж0b5Я╣:·ўяO▀╔╚═иQг"╤Н╓н[╙ў<ю·ы╬=х╞Нщ╤&═Ї╙O?╜rх╩+Vь▐╜█p·~д-Sж Jh▀╛==·╛}√Ъ7oЫA╦Ч]v▌-}┐DXйR%╕2}▌s╜zїр2^K╨╡_s═5РЫя╛√Nш>=}Щк[╖.2 ;i╥дO>∙ДюЗТV ╔ж├Ж┌"$,Р┬Уч0]z╟кUлЖ(Ушй░KГй#'4ZF╬Р┘xN║─I╓p]шbС┐pс┬ЇЕtН┬H0■щзЯМрhиу─ВиаСМЛ │╟┬И╞& rLgХ╬¤ў▀Пи0{▓ГH9#Хi╙ж╤Aк╤╓9sц4j╘║O0r─ЛнZ╡т_╧9ч5@И3А╜б(d#]▓ _─юсLjд╗З)b█(t▀─№ЩЦ;ПЄКZАФ#N#┬@Ы(w╩Е BбcДТ/шдГ,^╝8J▐Ca┴\Ы4i"МЯLQ'!ш8Pу═▄Е^їд4╒ЪБ▄%~!#6Xt_ ВCИх@ўk╒кIfE6rЗЕP╣X¤Jйя╕X0'ТаВ?╒КvА╧Vp╣╞Геuщ╥]AФ┼╚%ГФ,Ап ESsMдВm@=ё╖й2pMXХ╪ ФЁ]ВСиUTXBb ю┼<'ёЯ)мФФb3Ьёoj ╒╧A╪9┼A61Zj(u|щ╥етq!$vu▐yчQжШ4═Сc& ёc╧x╢R┐d■IhЧy.Г═№d}b ▐э╫пн.ЎIC єЖ,т~Р║T=Zц√ю╗JУ+5И`ф┬pн#RmmЮШ|VsA╣RK.pМa╠нZHqя▄╣БёmЁyИЗРJD3ES)zгёD9TF\x?в~№ё╟|Рvє└╖ArlX┌%мЧЖkD0· f╧Ю=╘1■^|ё┼$ЗИHj+Ч,H#∙Ъ LN┤'│|фЫдhZ┼е!кa├Ж╤ИTjБ%EOыAх┼Яз Р мЛиP┐b6x╘)╗Y│f$З)вj║пббa7▌зб Аr╨+▓9де╜ё╞iФhС╛°тЛж√0*╥9r$Э7Э.дAЪEzwЪ┬╟{ о#ёф▐dg-/ 7пtъ╘ ╢∙Лn@ 'OЮ У╛э╢█B╞┬╒Wчk╫о▌╘йSщЗшdЧ|Н1т│╧>{Ў┘gщe 6wю▄Gydэ┌╡┤■/╛°"Э┤мlБ╨Э╨╟tы╓ jB╟5с+]8aаtиoБ`░└ю▌╗МЮu■№∙ n╞о]╗о╕т :x То▒Z╡j$╖h╤"┤JзИMЁ║м╨B!╪ў▀OЯф╬▓An`*ЁГЧ^z ╛b8уж─CЩRFCg╠п╝U╗vэЯ■╩Ef )лЬ╔ХL2HзОY<Ї╨Ctф╝Лї╚╤ЄBаЦE╡╓└Н0 2E/8`└╪·─G║Ў┌kщ╢!gР▐еЧЕZёк5╓XЎ-╖▄B ╨kХ(DDИ ╞П▀╗wo╝PЬЕ#Zw л╕╕(Cj┴мY│`x╪ЖA╔R╨Р(аPh=╠Х<╓йSЗЄТт| √}√Ў%┐B1╩╦д d┘ TПО;1qтD|╦╟nEB▄Q*ЦГk*ыCp1(\╣X▒bСч┼вF∙Їщ╙ё Е0СКВю#│щ,гЗюPdd Wkжёc)>h^┤,╢бZa╪,╩ЕРT1*┴.\╚OкЁ`4C0ъT█юНбzтQPю╕мю╣, !iяЁ !sЄPWx'nJM▐йвЕ&КЗ└+─Ж╞`Н№К JY╨Юї7ХR╩╘тЧБ^Дзd!ЧdДH°Й║├ЩЬд┌ТЙЦ+WОZ/╬│м┬$f╠e" Ю MЩвц6l╪РДdтBМя╛√nмВ6ЗVz▐╝y╨J┌-╬│сbУ4уxїС/Wгe├\▒ ╠ХwХ═ШY79а:Z0<╩A кб°H╪$gПв!RсеТ0╪═ їВОА$Iю╚/z& X:фЧъ ЄSю8∙0uq─f┬╢6j=┴иe╘n1╘ЛЖЖ;wюМЛECКJk╘и![Хn╜▌=ў▄C╧Ве 9е(1?щh$1`>УA5║П├LўЙy╨╪R·(Я~ЧчфИ6 ╔▒CtE]├ЄiчСНrW▐жж√FAм▌чНOHУRкTй▓e╦╥"№b7▌зiB/`№еo■▀ ■G╟м2F╡N.Вd┤┼░УHVДt■Н┤┐a╖▓ е{ж╣ЗX└?Д+╦PЭ?-Y▓ф¤ў▀зOв█А▄└r`fРд│╧>[·TOп ╜а3Г▀OЫ6нg╧Юp;Yu#╓├B(/╩^Вo ·l╙ж чЗ~xчЭwЄdЇш╤╪ ╢$k╖дfmp@╠hw"B/Ъ№R╞М#╝\ rCJMFu`n$tЯ╞УЖ.cЗ╘_Имхмh'Q╪╓н[▒aъ ┘'~F╣У)Y╩╒зOЯбCЗ"34▒LЩ2ДЗS╩(Б╪и#fpW+TZЖ JУU(ВЬш╛hТhv.╡@┌№оп┐■Ъ*Cxbг S7aР╨5Им,@т]√юТ/┐даЖ"0$├├ЯзДdCўйз<|уН7ияTd╛в"╬СЁ e.ЕzJУ┬Л╪'Я)wМУЖ╟█АL├ЖсйТS╚=ХФ·╦Ф═ HBCMuЖ╢"m└╡X-FR+╛r/Pи9╣C ┤ИзЮлYYi:Ь+┘╗э▌╗ЧR&╦кaG ┤?~ъйза╤тБSСo║щ&Y╧╣G3Ї╘A║уО;▓Пю╦╡pH▐дIУш]шлd┤Ux-▌<мЕFЯn ^B√■╙O?}√э╖ 64Г%Й ▓BЦбh;vD╤pntH0hзГбт9¤7]Вьёї8G╤7o▐╡┐Ё┬ (#~$$cNBцд╙ХEЁx┘щ>▒╤Q┴рЛnaўю▌P $Б9з@┌ АЮХ ╥ AтelШ &A`ШфF2ЕлC?НУ+"д"·j├nTCу▓╢√хЧ_&P7║∙вEЛвmEФСS!#(НюVХ╕Ыю;З]оFT ╝√T╛GX║ПРш╥░j╒*╚%xсЕТ#qG═р╓╧№ЩЦВХї СЬ2║ё╞й▓Ii▒ЗG}:В])▓▌[┼B° cxын╖╘Ц oЁ°&йH>j╘и[o╜╒ИршЙR8n▄8■╢l┘ЫЗ░NЬ8Е@ў╤[Ts5С╨}╠ Ыд)РYйkj_м╘2j5Е4@╚AзXбьг^а:вВ2Є╩║uы░МGцs▄mЬ\Ф%ЛИ╘├░t▀pИE╔╩1ьPt+╤JХБRХ0ьнZ╡j8ШЯФгк╣Ш%dn╬Ь9еKЧЦMЛ/&╘┬O▓ЭН┘!пP^°Ё]╡ъF9К"?п оС!Pпк PLЇI-╞┤ф@*Щ╙CH°%оEH кv?# ё╟СЩVЕ▌WХK}аt0\r-╓▌зR?ё─H"сб√╬ЫМ,оcmd╗∙╗я╛ )7ГG▄╚В1 I5yфСGTЗХ\жeФ{#!√ўя▀лW/й_ТоZ З¤л#к╘!Kк ╙┬а^<(~B╝х╦Ч╙r╥>Л#>!]$Я╢W еQ.3f╠Р%mw▀}7■->$Н JK+У▒Ъюkhh╕q№[uхЙ{С╝j╙И╓}2O╙}^ю╥е Н╗s░┐o ■¤ 8p н-▄┼° ┴dУл EBД╔╔╔DH_+╟V(`e=╧a╟ОРC#шї═мчu"v@o]кT)5wсJУч╨щфш╠ш#Q !E├#╕)▄ЕЗrBЛхЬн%"  N)─╚v▐h.Р\Ш╬~АЗ~°╙O?ечCQ▓L_ЖZE*ДДР;│╛}√╩╜H2LNб└╖P | й(,4L_├Р6 ym▀╛╜Z╗/вBЫp╒(х*Uк@jeUо{x;╗a[┴cїоє╠жх:rQ-╓Е╪ш▒╒╣RfЁ╪>81F'ЖЪ┴╡ц╕+ЁяП?■F"kTPмЧUv}╡ЎАx°щЬs╬╔eрSAьR(kў)Ю└;ё╛h Ж vя╜ў║aN%л╓NаT╜pсB Fm/цW┘% Эj█╢-╓H╜гXё*Tиа,AХ;!А,гfёх╖ю▌╗7┤Т╝SХаГ▓n║ПyРnП=dв└▌╞Iqcx/jхЙьб╜Гoс@*╖J\VlЫъFХ?ым│ФЄБ*Im▌╕q#ЖД╒беЪ5kЎ/ ╪д╓урЁ#6вЦ-[%РюТ%KИЯЦД.║ш"╥е]┐~=ТєО\╖n▌ЁФhЛd}О*i ё╝ШФФД?LДe╩ФA5b нD]XФМ+Y&ПxG;vDэкVкГeTQцYUб√$НsB+GХС╙lх' ?Кtс▓4#x_╨}и}0- LZ0L Уж╒EE▓P╣U"█{я╜Зmа█╬Э;╦OЮр1гЄБЦ ╦С╧╣╣;┐bt=Ш"y┴╢M╫∙ШгrН;Ц║ █╕eфB+Qa║┤*CЖ ┴┘ж и4╤r&ТOЮ<Е@ўi╟d▓ЧтF- й▀s╧=tФ╜sчNфзuю9йb╣О√╘╨╨°Ч#tЯ6G╬~\╣rев╟ю╢QZ3Ю╙■╨е╩╕Ю"┤╟Eў g%7$ьУO>б3А╛╨1╚+Л-в=е╜гєж_ DvЬ┤Тt*╚ ╡%Є╚_tГюAЛLУM7ЖHв_Ъl:зеKЧЄБЮ Н@┐шZш┤j╘ибц┴a3<бїз ╕ь▓╦PЦМю╙%└ц+Wо,┴╞Н╫┐╘їцЫoЦ/_ЮlBЭщ р ф└єЦ-[╥╖╔╕╡:X·п┐■"щ0d'Аt{т ▓Ё╝e╦HyJJ ▌'Б╒ъще>№Ё├W_}E┴Рd6N╫█o┐MЯJ_ЕBўyл~¤·чЇ Є%fwA ИОЇL╥-нY│юЕЄQQс┬ЕЕ^р?╚┴|ў▀?~KЮ·mя█╖П.РЮЗч▄s╧Езку/╘H'ь|¤ї╫╔8╜i╣rхxИ{їъ┼зo╛∙fBв╪ў▀мd╔Тsц╠СїTЛ/Ж·╙7г<┘З вМЁ ф■дFЇ├N7ёРВаайQ0u╩╦г╣╜й"CidSv╦j%F)ж╗ю║Л,л│b╘ш>_!╙>ЦIждЫ╬┬0Ь╧╡k╫тЁрЫEHўЙЎГ/!'єИ■б╘╧<є E ┴╚дPюьP╣ЧTД-ZPиб╘,)D|* $л╗°тЛ Гw╤п_?°(╧йютж%Ъ={6ТИ╜Ь│╝h(р┘─Ci.X░АZ)√H"╫CЗЕn>¤Ї╙HлдВ╨#? щ╥е ▐й:OЎ╧? ─рWмrжx│| *МКW(┌SIЩ╤9EАоyф<Б▀~√ ∙Б#дЬЛ╥zрFМч(S╤B!№е╛Уn┼К▒ZQ─@E8Б┤E№ю▐╜;6щ╓3~)Д└rХuUр║PIe└[ш>╤╥:I═Хт r┌╪█o┐Э╞rbj.╬- я┌╡л╪|ЮB▌В[╝xqdгйФГMe¤=╬ JЦpiю(Z╤ЖР`ФЙф╪*ТK╓(GzZкАLRй1r)ёUлVбmjўуП?о@рг+╝╣и1BЧ[yz▓ iмМрВй°?№ЁГЬ¤тЛ/╥иRаС$k┤Д┤╥┤ф┤єxьp}rК&е^є.▌ЦF╦ГEQ)z:0ф$┬CўЙчбЗвй─╒┘│g┐╩Nб╖┘hhhЬЎ╚▌з}г;█ш@Б;69ёМжo┬Д jИЁxGўi┬Ё3ш╬щSщущМ!═┤zpG:zDD╕)м"к╞О╛ЗжЦдщ╠Є╜UЧ▄NЭ:їХW^∙∙чЯi|ei/Ч-[FГДx╔Ё^╙жM╤$/│╔АfЭ.№йзЮв["│A9РДМ@╬d╠R╝щ║шcМрЩШ╚ +нUл¤4▌9Эd]zG)iТ▐┤iЬЖ2аc+]║┤╨)z)4)гAPv:К╟tОжЖ$Q:╖▐z+2╦с?&ИБщ°!╡G√Ўэe│z№°ёЁд──D║$!Є#F╚ЦP┘1LMIСьЗ▄╤й╙╙╦V╬uы╓AўKХ*EЯ-╦Hy╛·ълДД▓\╡j╒▄Хoп=В|@&°Jз.b[┴SI ╩╟WЖRвL$J╧ Ij╨аЄ╦▓iЩ;BZ▄╕ ~JГУQ╩|%░P:X2Э:6Н*n╗э6тwП,Т/Y0у╢mи ╬╤b'°№'кU.`┼Кx┐╩зLIЭЄro>БF@5 RЁHLлSзN$!У?╪╒фЕ^└PQ┴0]ЮQ*ыa,g█1╥┬║p;=С─ЙH2ЇI}$]4LЬИJqУt╟Оq▐ пP╠\▓,ЎIЛCБтбdьV╝>╔вCh▒░:l╡QгFT l╟L]╚Р*Ў╧г}└У7Г▄б|^З┐╬Э;Wv╣Ьw▐y╩у┌░a┬cN:tpп/з]├MBШ▒c╟┬║М%{ьgэkбЙЦ▄С║дKх┬У 8╟уМa4jЄ БЙiф№YLK&Еp/ЙGО╧з>┬Gqк┐ ■{▄┤БуD 4ГшРЎї&%%Iгюу=" Х So▌║5▒QpюRгBбХ╪Iр/С ЄHССYRд2RR┤!MйQGdc║L╓a!иСMцЕЄ4ZФГbIО"@r%~▐е h▒FjДxщHHc~╬9ч╚B2╙9Мъ╣tщRУХ<╦Ч/';╚F[Бy`$R─|P;Uдg"9╠ЮЖФЖW╣Ї)TgЬЇЁЁ├G╕¤@А]MЯ>(A О&Ч/[╢м{■НюiЇш╤uы╓ХZ&╢КmуЭт╚a╞иypлш╬h]х°|TDЭ┼ б]в├8Q2R╛иK6[S·╒Цп$AпLr╧>√,M┴ёLSkhhЬN╚▌╪w╞пь╫пЯЬ[ЭSx∙@лEkF╙JпQ0г√╥├$ш╒DЪ3!g4О0ьG}tёт┼Дщ╙зП┼9ш°i%СЮnТ╒╗ ч╘\С▐╜{├E┴УL°@[╧r.R%ГжcГХR▄Їёc╟О¤ып┐xЭn в ╫W╬fG:uб8Т(ФёИ9┬Г\dССь╪▒├═їХC╤Qг√ТКМёУe╥нRе Bо%їкLQь5КЕ@%E CЦхL+╕вWhЗ0П╦/┐═и╡+┬VйHDBОJЗОЎ8)@<▓fN цQ░`Ўь┘P∙U$!Ш=e$%aЦ°Н*з▓лDн` СлаМЬ▐╕┴+1їTek─-ГдТтЩєвCх═ЕФи╤}ZмZ─{цХ╢m█кIМ@p[Лщм>"№Ўэ█╒Є}▐Vg╬xВ;)ЙY&FИлРЕ°jqО╝K╣уB╕з21EМДZ└g▄ь_.ПS█y╬Ўw╠)11╒Х)S&▄C<╚F║▓▐йxётx░=╡=Z╢ът╠°сЗ╨\┌Fd└╤%╖▀╣0ЗAО╗е┌ЄЬЬb└D^кT)rAф╨qjYЙ%°ХDЬ4Шю▌╞┬2хV к0ЮМУ4> QA▓э┌1K\tвХ√д┼nх ╒╢р╔уоо-(юю Bъй(─r╢SSГ0▄w╖$) /┬їeДBтY▒bЕ▄3екАИJб╫мY╙П№D°/╛°B╢PKaAўхje0f JЦ╧й╓]Qа╩эQ╛up▐╝yjЙA╟6$-КХт^╗vн o9ЫCИПСТвЭдтр╩КЖ∙К╥│RХЙ┐З╗B╙НAb'╛Ьjp444■х╚▀ш>э=`RRR└u[д═▄╜{7 ▓yP-m╨}:!╕jБf└u4бщ┌LUc'-мDТя9Pе═╡кL╣spЭеш╣4В├ъ2║/Л5ы╫п/╠I-кvoЬеЫф/}▐K/╜DЯ▌п_?9K^НjKК! СЯ╘`┐ъъr╔Эщ:^F4!OРЄ╘зOЩбЖКйьВ{Uf╒`Ю▓ ┬wе rai╩РdNЬCх╘▄еч ▐hгД √в\ьVС√л√jЕР▌qJxъ╞;я╝Рq╙|█Ы[Б!гЫn▓яJ4Г+B╝ w╓╘вчhчb╪*rU╨╣РХ╗▌║Л ЧЕ@*ZYW#mЕ;Ык╛+ktч╘ 2уО╩p╣d9U╖С╗┼Уxмро_q╘∙лZ0M┴-┴+├ГфЙю▌5f╓#/Нм7╙оJъ╢pеIеX5▀к,AMўЕdGНВлwН`нw╫хи,Dи8PСлЖ(дЭ уn7Фyg╧а!PТл┼3╤Ю¤хV╡╗хWУ{!:├-ПхЪ8uЧСКV¤фОSх╫Эо╩О;┼и╝444NWфГюЫ╬╘:dЭ'Р■ьБUOg8k_ЗJ`┘k?▌з]Жы╦аФЫЫ║B╢\ghD╗.B}╬w+й─бъл╗Ei╒[J┼VpЭ╔[o╜5l╪░]╗v╔╣?№░┌╪*ZBПo╝ё─Г>ю▄╣│EЛеKЧ&0╝▀╚zъKXЩ▌|1Ok░\kR╖o▀>h╨ dРH0&рsўю▌|Ё┴Т%Kс(Q╪╠*Yў}╗%╠УO(ъfd╜Є3Ч\Ы┴Ы▄O┬╛╠ЙС═ЁBЄлтT┌[▒b┼¤ў▀▀╡k╫О;╩с▀╣g-'╕═^Юdwt▌╬Ю[`#Ы■ ▌yХД╣╢J╤нЦЬJ╩ЭпР,ч.Швн*wr!┘tЫ┤;┬░MКСCБf2╗Д╩ Rпx\И Н{ь▒╟иЄgЭuV╙жM╦Х+ўфУOк ц/ ▒pўCw╓T№9Yжz╫¤UЕ q┼UШT[Фgї ╤O╪╧J #ЬMfwn ЧЗрО╨═ЫCв5▓∙ъХhН<'сCМMаЬ=#ы0ANно╗hBК>{ra_7rоY *фГю╬╔JOСf+x─j■дК n ╟═PC№Iў╔!ў1yВgЬ╗Iк\еrAШ<Ї/+░\╟Г┘N√ ╕о r╧ЎDUXnO╪ ▐l`╣N_ qП┼nYп░НЎL[ПыРx╙u╠Л╥Ш@| ўaJТЬ╚тЙ╗е╠UПykhhhhhфЙSПюОПП7В}z╡j╒"ё╡╘>Є` ┐■·лщЬ▐·ї╫_WмXq╓мYEЛ¤{ш╛┌1uъ╘╢m█вУ~°AN─ч∙Ўэ█1н═Ы7c═T^|ё┼Ё╤Ъ5k▐w▀}Ж├Y 5'?~Ї}╙жM▀}ўЭдRгFН>°аJХ*J0ЄN═ЕSEg╧Ю э■фУOЄ7║╧_▐]░`>yQл╝pе▐ ¤лп╛Z╪?┴Гв цЫoPа єгРЧ_~∙ЖnPЙК t¤ї╫у9LЮё┬БрFЖ╬╛a├ЖЁK~Z╝x1Я╙╥╥dхLя▐╜Я■y5rьЮў╖\wаXохїюЕ(2╝Ъ}НБСu╤ЕRP╚К∙i╬Ь9╨Э&MЪ╘кU╦M\Tr_ШХї╞5╩л■оЩ ўКў┘y64·клоВk*m$&&Bўyшq▌Е!▄b├╥о╗ю║-[╢Ё╣xётх+о╕"ТHР_єPj09(й╩#4bКєЁў╠╧╚а√║uыЮ~·iиgЯ>}┌╖o/Т$''ўя▀ф╚СIII>° цКHKЦ,7n\┘▓eЯ{ю╣ №ч?Rт╦Ц-#ёёёг┬'L├~щеЧ┌╡kзКlс┬Е┘%Jtщ╥E.(Ш1cЮ ЛХЭk╫о┼z'NЬX╛|∙╬Э; ч+BФ Й┬╒* Hr7d╚РG}7ь╢█nУы╪ЁжHЭиpШ┼Д°L╞▌Лdа√гGП6Є╡[Аn┐¤Ў▒c╟т>5h╨@Ц▌У(┤Юь├°╧=ў\Y╒жMьР┤кVн*пCш1 ЇF6E6ёэЙ 7█└ЙR6ж╫єhhhhhhфВSПює╙╩Х+_¤uфU▒bE 9┘╢m█иQг&LШ░|∙rX< bдШ╖Ы╦ `I┬═°Н qW█┴═┴j▒ЗвуF╓╡щ! ЭХFD!╦BV0лЩ еDўёЪjє▒zвJ┼Иx┴Тш¤уП?жфРч╚С#Ё╫={Ў| ¤ў∙г√Ж│ZГwэ┌5`└А╧? ╝qу╞_¤5╥FEў%√░╧1c╞l▌║Uo┌┤ ┘*Uк<ым│■2'║%▓М■нЬв▀~√ З Q╗uыЎфУOB·yИ┐Ў┌kу╟ПЗаOЭ:Х_╖o▀■╞oLЩ2еk╫о8Tв}я╜ўzЇшQ╣rхW^y╓K0▄-(5Y{цЩgЖo@q`лo╛∙f═Ъ5eHЫ°й0;v,Sж╠Л/╛x╟w╚р:С8Ё╟ДьЎъ╒+Є┤│g╧&╤╜{ўЄЦ,рAс°0DОWГЗC╥X ╛▐й╪╪вEЛ(M~┼л1ЄEў∙√хЧ_т;QЙ_lьзЯ~"]9Ао^╜B┐чoЫ6mф9|Oр■√я/Qв|и~¤·jЭЇК+pTЬuы╓m╘иС╝╤цЫo╛Y╢lЩ,YоRе |В°'MЪ$Y║ыо╗╬9ч!▄┬╣с[єц═ !Р▌:uъИ▓╚эЪ5kФWYф'ў(,щкї╨P" ,╟Т└Нj╫о-▄> &Ы /иZ"√Рї╓н[├Р▄+Єs/BБxд╤o▐╝9T тХя╤}├Y╞є╬;я@jЛ-К/ё╨C%''GNў│╧║ЁFИ╩Ч/л+Uк╘▀FўQЛ▄kо╣fц╠Щjo(╞з╟JqНJЧ.н№C|Г{ю╣з^╜z<ч╔т┼Л╗\╣rиTn>& yщ█╖/■~)с)т∙єчуN`БXЮГDЕ╞^}їUЁ<Ё▀ ■I`Ў6!yWОТ=*={Ў|ў▌w_p`d;Ж5'ру]P:╝ы ^В&╔н_┐~─Иў▐{пr&EсCЗ┼o┴х└Н|╤¤РЭ┴RЁ"рёBў1`2╒┤iS┤НЧ~╙M7I*А\МZЎ┴ ЫкJ№┼ЄqЦ>∙фУ:HxMў544444r┴йGўЙ711╩;vьXШ¤ 7▄╦,\╕░с╨¤БBЫ ╨еKсОPFhй,_╛\ ГК+┬G  G╜{ўЖcе9рa╦Ц-▀|єMИZ||¤ЇS#[Х─к1{▒vўswKб&─@mЕг╬Ц|o▄$ъ n9пуJСS┘iгVпс&╜Ї╥KBў╒Z;Юуl?∙фУEК!Аl╨t_CCCCC#Ьzt▀rо┘{ўюЕж╝№Є╦╖▀~;МJFaб┐Э;wЖж└$xB┬0u┬└Ю{ЎьйDДx╜ ■√PЯ╗я╛NЯЬЬ I:tш ■ў?dHJJBDh a*гFНВФ@¤Йy°Ёс>° ЙЄ5!!╜@Шрj╧? v+в=╚ыo┐¤vi╥дь╦┤╘R.9jjО1Тw▐yQ ╢d╔ТFН]|ё┼ЁxмHЦЎЁ├у╝ oЮ3g╣лQгЇKSeyЕ─cZCЖ qпQ┴c─╙а:aэ$КeтхЄ ▒┐■·kмKнSщ╩T@зNЭxWш>^(С╗O▓з°&OЮ[m▌б√8i═Ы7╟"w╨}х╣щ╛"юRС░Б_¤╡KЧ.╕С№┼8QЛ\0є∙чЯ?Ї╨CfЁЦ╖╬▒оо]╗цэ╖▀╞ёДqМ╒%╟CўЯzъ)|<┘ФтV#aИ▀/дЇСЬj╚bC*╘°ёу/╣ф#Hўi&F&($9Mў544444 з▌Ч╤}╚┤`ўю▌Dх╜√ю╗я╜ў^ШP┼Кa`POY╙,М9тууC2)аVph=ЕU╗vэЁа#▓рX▌И$YВ╡р?|Ў┘g┬< ▀░╥ЇЇЇf═Ъ╜°тЛ▓шBv┘J°'Я|ЄЭw▐сзР┼^пЧ)SF┼vt┐zїъVўR%7▌7\C√+Vмш▐╜√С#G*WоМ93o╣мS ╓мYгЦёич| pщ╥е∙АЭрbNDОcм▓Цo║┐a├╥UЮнzNZЧ^z)Iаї\.╠iч╬Эфєаpk╒кeщ>ЖДу-H ╥t_CCCCCг@pъ╤}тMJJТє+eЯыЭw▐ a}сЕZ┤h[0`АРfB8 ╒║ukxТсbB"+,║yТЗ╨}ш┼<Ё▐{я ЙСqt╡╡Qа╨єЩ╝┴ц∙Мvx ╧┴}╪С<·шгCЗ┼Cxю╣чДJ╥╨╕ц═Ы╧Ъ5k┌┤i▓L\▐Т}·ЇБю╦кeГ╞Нг/h─╚ ▐?·°уПC▌Р∙ЩgЮ1"8Ь─}в(Яўя▀п╓ю╫н[╫r▌▐кД$0,ъЖвф╩зР█aa╖ ,0ВГ╩VЁ╬╫"EК№Ё├UкTQNИшSю]Т╪,╫╝ю┬%Шl╒Ею ¤ў┼ЛjыЦ DyауФ t*й4аш■╢m█║vэJ╛┌╢mЛ[x■∙чcДъ·*─[║t).O >зlo└mуEмt─ИДДю▀p├ °Яэ█╖ў▌w╒Є}Yv ¤ўc0b ╝ ╫шбЗ(}╝И &\t╤EFЁ╘&3xOнЫхЗшG┘,дX▒b$г╠Ж=c╞ (uзNЭ▄~Вм▌ЗюлУy╘╕╗*))ОРT6м╛*╙R┬аРЮ={╬Ь9╖Р0╕╩|ж&Rs╤М╝И▒╜ц`°ЁсиNeYтl╒кbгO╩Ko╒╒╨╨╨╨╨╚з▌Ч╤¤──Dб╗wя■°уП√Ўэ{▐yч┴ ╞МSйR%9╣Ьф>гIУ&╔КnZ╡ВкЄ░i╙жЖCбрpЁr°п╕Pч`┬Sa╪pA8YЗ gЙ┬жMЫxoГЪ<ї╘SF╓s6{ь1╪▄▌M╩%цEЛ┴Q═█o┐ бWlеРЭ:uъ ╞9чЬГ▓р@ .Д▀╚НкТt╪░a8ТhЮCрjЩЗФУ╨¤5k╓└_I╦╠v═_wь╪Б╪фСъ▀┐?Кu'DАЯ■ёмрIЪ╪R3┌h┘▓%ф╥-i=ё─Д/[╢,lX6│f?нIЦ-[ЖB╩Х+▌ЧЙ%∙Й╗SЙ╚GО∙Я №зУ╥╧║uыV№@LЇн╖▐кX▒ви┬rm}Fud f,ЁъQь■┘gЯ-_╛<е|ё┼єdя▐╜├╠j╘иё═7▀`є$с~ї╒Wы╫пП/ √Дpє .%юБl+Wє0╩_2"8zЯZЖфя┐ >╘Щ┤$Ж▒c╟R^фЛT(╣eBвхv█╜{wь\о┘"!╣╩:Bf?{Ўl;вOн─kэ╤г╟Ю={Ё3лWпNZ╦Ч/з",Y▓·.'ъ╩\ФZ╡jб╖RеJ┴э┼╘▄q╟8?Д╟KqO#hhhhhhhd╟йMўE2╪ЎM7▌YБ=╠Ь9У_e`^╚+t╬ ЫQ7°┴├√УУУс40<ьтО00l╚ЬМG╓н[╖Wп^jTТ'pг>°аrх╩чЮ{оЬ█├_^\╜z5tM8=>DMh┘║uыp9ИЁ┬ /тИу╤╝ys!j╫]w▌мY│j╓м)#┴▓&ZМ={Ў─АCC╚> №sФїБЎ┴∙x>=pр└m█╢A З.ЗКц╔┬о]╗Ю{ю╣Н7в%\И#GОР:╝Ь╘!ЪrРи\╛}√v<Н 6PЎx(╨╜jHж>ДnТ\ъЖ╠ 6DB╪н█eТ+и╚ИЬ░ щйf є╨Cm▐╝ЗБ└в`иBеЬ╨╤}▄Ы ■ў┐ФoЧ.]zўюнСS╛6wю\╛^u╒Uq%9ь╩╒T<┴▓╟П╧╗Фxм▐¤ї╫_;wюМo&aф╥84 ч]aЁи√З├q┼ы├Д(zЇYдHВaf(С─░osа╞╔S-─ЩТТ╥п_?─ге\╓п_П╢GП-лh з6с0уЎА2Erк├хЧ_╬WЄH¤КJЯэ┌╡г┌Уe'^ёop@-а╛Р5IоПcМZhd`э┌╡T╥УSg╫╛№Є╦°-ў▌wпPпїн║╣у╘ж√┬JзOЯ▐║uk>_}ї╒╙жMГН /Ба╢0√)SжРШККЧк]╗6Bє№є╧┐ё╞BЮ╠р5[k┌┤щ─Й╒"MБjИ"/cНpтЗ~°╥K/Х╡m█╢ЭЛ╖`D<у!bУЕ╖▐zKЎЁДIжTйRj╥Оs▐"'О (▓kп╜6*Хт▒Р┴9sц(╜NSВ╗Л чЯ╛ЬЧрWS ,Щъ╘й▐^о╡ЪpГбVт|~Ў┘gнZ╡Т]7╤n╤╨╨╨╨╨°Wс╘ж√ТБффф┘│gєЩ╫a$юpД`╔к╕╡;?W^ye╣rхМр└3йKHux9aJЧ.нv╟кu&P[бz┬їЕПBцДМЄф╟Д╠AёЕийZф!e╪[]Д`;vь6├+╕ Ч\rЙ$J$sч╬%6x$?5n▄°ь│╧&╬%KЦм_┐^┬╘п__2х^Дв. ёЎя▀пЦ╟и5<їъ╒SL%√ЖWQN(ЬдЛ/┬╢Uю(QИ6!й`+шнh╤вnй╚>Jжьр╙bOюНЮh■█o┐E6╡@TZдHb├Hмy┬:ТРоЬї╘иQ#╪н╪?С/$з,┴{ЧнрVь°°°%J╚ьКЧЖR├дMg▀*ДUvК[┴ЄЩ`єц═гdyHЙ_v┘eзД┘╛};ЖБНй╔%ё╡ф3БqНФ╗ХчjЦ@Ё чн[╖Bмх+Й╩МНЫ▄уп^╜Z╢X(╖Щпф█Л\ЯbЛ-┬├$*#╕ТНи ё2cа╢dNщ/]║S$┴эAu*уVp[[┤hБЗя╛UW/ц╤╨╨╨╨╨╚з6▌╖\ЛзЕЪД╝e╣6\║╔вzQ}9`─2$OЁ ╒ьЩ4]╗r▌4T╚УДt╟6░╝пJiG}P■ГFmXt{Оy+UД▄Лдв ┘p)БХlnй┬╞пЖ╜▌{j▌Б%!yЎУd Зє┘╪ЫЪl╔^F ф┘╝yєo╝Б▒vы╓э╤G┼╥T╥!в║ЯДш╙Ц╡√'їо╥Пт¤ЖCВCte╕ ╞¤P┼Хчг" yyЎЪb .D┬S4▓ю7▓vЎВV&$╒─-Й°co┐¤ЎаAГ┌╡k╫гG╝\Y∙╣T BЬ┌t▀╚JSМpчУ(FХ}dZхMщ";o╦ЕLи1╤Рxr╥ж;~w`с4КщЖpJ3╥=0oD├№rRЕ█o ╔~HШьяЖV╛DHAи!$8─╦о(├U'Ъ╪╔СASжLi╒кUГ f╠Шс><>ЧьЗeъ!?хd~ъkXO5Dе u┤С═mpзШ=П9Uл<с.ё░yы]gяоЮ№m▄╕ёЬ9s╛■·ыц═ЫЛIД дббббббВSЫюЗеY!CЙ*К═Aю2РйЖ╥╒W#/╥o║╬ ╛═a╪Є▄UoWх$Cю,▄ w0╖TюДЄЇXrJ╚=Выцy!м=wъь.Оc╩щХВЕ╕╪сД ╩Ц-{є═7 П [^j┌'$ЫкЇC6│FL┌]т9▒єиTб"t[мо─│╫#ВЮ;▄йdЯЧ╚^ЪaM╚╚Zнx>n▄╕ффф╓н[Ч+W.┬ЕL rЬ&t▀═fBс8qNЬ;, ╚>╬Э╗▓▓gЖУ╙Oю°нрв+╕╝┴ЭA+╕o!ЄC╟▌к╚Й\fП*dJ!┬Дr Ьз&├&зTЎХД{ЩУlсP#╟a-─-^Ў╪r8ьzN1Э═╔g╚.UЎЪнфs$ТXо;М│╫eў:(3xэ└ё╚жбббббёo└iBў54444444444▓C╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙ЪюkhhhhhhhhhЬ╢╨t_CCCCCCCCCу┤Еж√з-4▌╫╨╨╨╨╨╨╨╨╨8mбщ╛ЖЖЖЖЖЖЖЖЖ╞i Mў5444444444N[h║пбббббббббq┌B╙} Н╙з▌$яsкP╤QБЛкв )╚▄╒IT|а ЙDЮДD(aBbRR№Є╓qdKCCCCCCCCуxqJ╥¤╪╪╪ДД├┼MOZйtT░SКB╟%┌={ЎЁдpс┬ФР╫ыНV<Й╟чєё.ёь█╖П┐%JФр9OФф|fЯСС▒ ~>N┴-Z╘у@┬`6544444444в┼йGўСXє.╥|JМю )?rТ¤Э;wB╗I"==╜Wп^KЧ.>|x├Ж гНЗ┐Ф\rr▓Мыэ3╧ЙX 1I1Fь╤Г■╕x#&╔k╞Ъ~KШеe√ПссПх|2Н┐▀ ░\ :й█┬╪вз∙2|~|llм╫kЖЖ╬ВиД▐▒c╟<░n▌:├Q¤жMЫ ¤SзN╜ю║ыв"▄2`Г┐¤Ў█ЙfП ▒yєц"EК╠Ш1гzїъЖ╦┼"$an╛∙ц}╘ш>%8`└Ало║J╞°г╔ЗЖЖЖЖЖЖЖЖFуг√Цс╧Ё.ЪqюЎя3fНY_╜цyUo)(iдё^oМсП1╛├(ЁЪщЮtпa─qyк@-LЧtХЇТa!┴p_╞──фйS╦ЁЩ╕V└┤<Жщ ┐eд√¤╧пnZ°╦╥ЦНЫ\PмxЇ╪ЭЕсЎ╢г1хЗv╖o▀~э┌╡░sфD┐>ЯВ▌╧%╦Жk5ФРu╔у╢m█о┐■zH?^ ёP╥┼К√■√ялVн▓FЯы╫п_╢l┘AГХ,YТ'ю╥еKBB┬Р!Cj╒кi444444444NN1║0G═#%╠ТЫfьЪЇю▓┬F∙вg*}Ез╤=че6<Е№3═2тc ч6Щ╬0<Цс╔Гю#(,9==]1`ТЖ╓єDeмpс┬▓ё4я*(!`бW├ █7}ЖЩ°Lcї·НЛ~Y~0-ХЇюj╤к|ё│<▌╖ ╦AхСє}H∙║uы╨▓сФM╫о]Ч/_▌o╥дIXi╔2е.┘ILLФ№ЄYV█зееЙч└├э█╖█╛}√▓╙}p╫]w-\╕РRм^╜║ьа╝[╖n╜b┼Кj╒к╜ ■√2!аббббббббёOсг√дРю5-#ЎP╠БН■┐~Є╧№b}|╠┼K%лЬv}чЛ|┼НЇBv╚8╦К d╪М┘Ыз  4~№xСШ'-[╢мUл╓K/╜$YBТ╛}√6j╘H>чбQ[D╦И1Иы░АА/Y√█кїыN=phхК\^╜|свIЖ-ХcXж│)╗╞ O├√о)И#GО\w▌u ,Ш6mZ╙жM├▐│g$~у╞НДЗФWо\ЩМлуt╘)?|ЖФФФьtwИ°УУУg╬ЬY▓dIЩ!┴ёX┤hQч╬Э╖m█╞+W^yeфY╨╨╨╨╨╨╨╨╨(pЬrtnя5=ЕУ╝FFЪя``ўЪ└оЯ┐╣гDВu╞∙╛KЪ╛ф╓│№ Ж/&р3¤▒Жgф▒№A{Ўь9d╚Р┤┤4$Ж▀{я╜Р√╗я╛[нGЯ0aBлVн"▌G+├c╧2╠[╣z▌┐<Ь║▀▐кU/╗вrе3Т ХО/\═М@Мq╚k°И?\< ╬B╕╛М═гыып┐~■№∙SзNЕОЗ▌ }ч'╩ >>~╞Мuы╓Ел┐jв6▀░a├▌╗wgз√№z═5╫`°еKЧV┼П/Aфk╫о¤ю╗яИ9тLhhhhhhhhh+▐{╚Єэёя╗ eйoч4s┘─┼+dx/I╛┤uщЛХ3ЄX╦c╚"u9Вж ■Р╫Ю={Vо\╣GПЙЙЙc╞М)SжМЬ7Я╦ш╛dЮ_ч.\╕&u▀╞┐Тжj╘╛▓Bщ╥ч)rNB\Jё;;p=╬ЩAsЯї├ф5№щ5ТВ┘│Wс╟xm4м\╣їХuфф√и╬╖ЙДюf╤вEiiiR═Ъ5Q╗╚rL~юt4n▄x╧Ю=2║пЇ├Mў54444444NЬbt▀^═cY1ЙFl|B└И│╚g▒1~#pфрЪ°┘г <╕║╪╬═{о║ём╥W√ЛUH(rQс╝╓Є╪г√"1ЙBR Ї═7▀Ф(Qвpс┬}·Ї╣·ълх─Х▒Ь"С╢ю╪╛+#}┴ъUk╢¤UтЬє %╞╒йT▒fЩ2ё■г▒Б├k·<Ж°Ў╬>кb¤√s╢d7!!╣йРvi╥Л4щ╜wщ RС"д ╥HУ&yAz√√бў╥█ бЛР╕ й^4lvўЬў╖ч1╟ХЦАН┼чw╜{7gч╠<є╠мў√╠>gF╥#NСдшД°╘╟Пн~╙й ф▓┌ў┘▓Е√№ыEоxО▓В√Bxн╫╧ы]ж╕_▒bE╠┬}э"у>Л┼b▒X,╓ы#├}┤`WЇn&У╗┘ащТMПНЙW─ЙofЛU. ':wщЁBН=КШ<Є-:б╫ sfЙ0┤|n│┘Ё ╨9r$║ ┤▌╢m[┐~¤·ўяOЩё┌Ь╧Lн!zжOQ■╞¤╕D┘vЇ?Чc─Ж·e3Х~+oСЁ№6IgТAH&YBOl6╗╬дУu┐ю╙П║eE▌%Sz5┐ц╧X▌з4┤3tEў┐ю├04ДБь╨б├ш╤гi#N┴╕╧b▒X,Лї:╔┼p_▌y▀тf2ЫL┘D║.∙К¤┬╖ф;┘оЭM0Ы■;аи.аДAмОЗa7u┼{№Ьx^юt0┌qЯЦъAс▀}ў╜JХ*ZЎ┐│х Єп╛·ъ╬Э;&Уi╨аA╣sчж╟|Э#Y╒╜{ў╨¤╕╕8Bo┐¤╢v@>2Н╦Ч/GD╝g╧ЮРР┌▀3""b═Ъ5Я|Є ┬А╨╨╨ЧъЛ┼b▒X,ыПХЛс>P┌кKў┤·■xEweяг╘;Ў╦/ч╩яW▒V>)╠Юлв╗bК┘. Ыа/hC╦ Ж┬─Ь={Ў┬Е EЛ>|xЮЫ╧ыВ╒j=rфHjjкЦЦCП CеJХ з]Dщ ╞уш╤гBрxх╩Х}||┤s╡иFшЁс├(F]Fт╡Z╡jT^d<▒А Джa■4ЩLХ*U┬Аf)ёЙ┼b▒X,Лї'╦┼pЯшdЫ╤d4╕ЫэОХtЭЪ∙оЧ╣╩╝V~┘f_'9О╖U╖╣ [ШХ__Х кЧшКм╛ъTY,Л┼b▒Xм?AоЖ√КвЧm:│З╬▌ЭЄlМ°Gz∙╖0-й (▓·ья]; ]RDЄл|/e╪╟╕╧b▒X,Л┼·єхb╕я╪ИSш╨░З╔а╗ЮЭSЖ>e╦ ХаїdOfЗъ■Йв5}┼ё┐j╥ОК√v╟╧pддwЬ!аЦуДЛ┼b▒X,╓Я#─}Eg6=LzбXU^╓9╥u$==#+$:║╓ё╨.%╧ ю─°WWюЛ_p_▌wSVЧїuк]:*Ї╖■№└b▒X,Л┼zГхb╕Oбawww╟ц7#╦│X,Л┼b▒Xп╜ўY,Л┼b▒Xм7VМ√,Л┼b▒X,╓+╫├}╚`0ў5╦\Е√╔NчmьY╧Уц+L#Э*бNVэpzп9Sє']S╚yn╨)tёЙЖш=UH5ЁЙ,Л┼b▒▐ ╣юу#У*5hW▒єїС═f╙N:г+ы╕о,T╟jз+кPМю@Пщиs 'шDa╝вnD<╔├─b▒X,ы═РKт╛╤h4Ы═┌ЯOЬ√┌Jsaх▀k╠k.ZЙПННЭ2e |5l╪0:╒│ aрMTT╘дIУЄч╧?|°pч∙@ьN▄ы╓нqу╞QxP╕pсбCЗъU9╖ХТТ2a┬ooo╘Cы·и─ 7tЫ┼b▒X,ыПЦыс╛╒jЕ)&УЙ╓kA~о▓jNv=aє▀m╦ы.Z╤┐xёb╙жMБЄ;vь╚Ы7/оc▓~∙хЧ111¤╕╕╕▌╗wЧ-[Ўр┴ГZr▌ 'cFMЯ>5l█╢НцF@@@Я>}М╔г╞аDGG7j╘с─о]╗ў]"zd▒X,Л┼╩К\ ў╟╢√?{╩AIWФKЗгє╝Х#o═lКЗb╒█Ї:гNд %MR▓ ┘ашДм╖KB╓ЙL╪Z╦wN ╫rB─o╙╗│ЄЬА]Ж1:╟Щ╛О▌Ў╒efI{,BD 7юЗ█▀Ч-R╘/{v╟С[ъо№zmу}зQpь╙ 2└й┼<┌08GA┤р-Ь "pBрс№СЎ нСS╢Мцк $н▒Ў)e┬╨{Z;w╛HНj:∙D┤AG╔╪╪╪qу╞э▀┐╚Р!э┌╡єЇЇ─з╔╔╔uъ╘╣pсeц`ТХ+Wnя▐╜^^^┐8▀nз╢ ╘лWУ╖гз╕x√ЎэUлV 4и ■ГAJ╠╜o╛∙f┴В№рГ╨A╠l╞}Л┼b▒XoЖ\ўeл▐ъЭю│/uя╫С▐Ж╧ГOS┘ws*┘mnЮ:YgSЬТ^еl;`[╥gВ√ H┤о┴k6U╘C║∙··ЪLж'¤|╢p╛▌QDЦдvE№d╖[ьЎыwb■sч√GПТ╙╥┌╒й■/Х╒├╖t┐╜=├х/ё{|¤ЁсCJАБ`-8>55╒b▒P k6ЫQ !!Б║рууГaHOOз4w0%╩k╣ь°ХP<х├а▐kшЯШШИ&ЁS┴██с 7>Eг╕N-т Fо&LЗЕЪ%hў┬`К"┤]╗vнzїъ░4ПYA╜Г'OЮДх°3**ъ│╧>+Sж╠Б0dЪ7Ё╠°Ї╙Owя▐ Иo▄╕1pъ╘й╓н[├р6m┌LЬ85ЛМ бE╒кU+TиАxА&.g[▒X,Л┼z3фb╕т│ш ┘$сau│▌WюЭ▓·┐;К╒dV ▄ж=r╔сB■ _╕┘ЕAJ:╜Р╝_▄7 у╩Х+Йhё┌╣sчС#G┬▄┴Гkл╫а╞·їыg)еN░┴zI╓ЙdЛх'┘~·╩х╦7о "{ю<╣▀)R"▄▌╙├ё├Гca_F!ь╧Ё8|(eusШ╕╕╕NЭ:БП R╫п_8tш╨'NPИЖЦ-[mA║у╞НЫ;wю╒лWщ▒╘▒c╟╢j╒КV╡i?╘y ■¤рUи3├дIУК/:G[рц3g╬└?╡5k╓─╟╟г№▌╗w1vШ._|ёE═Ъ5╤ю┘│gCBBЖиB▄п_┐Y│f┼──аf°FI- B▒CЗa,Єх╦╖zїj▄NqMAЪ^╟О├]e╦Ц▌┐┐Ж√T6╫о]]АyyЄфб+p╦Ўэ██╖o_иP!╝A/┤ц0MЫ5kЦ3g╬Е т·Л7Жb▒X,Л┼r!╣юГМm║47)╗з┘SN·Я┼O╤JЄM√╢пo°Z№╙═ ╦W?√█md┼ш)╔▒znЩ,╙ўч╠ЩЫ<==aIЧ.]FН╡uы╓╛}√┬юдд$??┐+V╘н[ЧP°┼ ╪ёг╒■│PN\╕xу╬mё8эч┼К╝є╓[Т╤Ш▌Ь-в┤п<▓е?ТmЎ_Wё]╨ў╥╝ YMё╫╢k╫╕ЯШШєр╓Н7ю▄╣эссБ.аk їFН5n▄°№∙є(уяяo2Щ@╒T╞Ё)q3╞вk╫оАц┤┤4m8шI wwў┼ЛWиP╢6o▐№ф╔Уh4Wо\SзNЭ>}:ЁЪЦъqМR╟E8│0НА Х$''├е>─p╙aaa6l@ бїq┬╠╬х╦ЧЧ,YТRА┤Я(0;rфхэ╖▀>xЁаєъ>>ЕC $$$Ь;w3J╔╠├- АsрэШЗp#▐бCЗ3fЁFЬ,Л┼b▒▐╣ю├`╜Тжsє1Ш▌e4#ь╗,~ОQ]ТvмИ4┌▌D╢GZ╝їяЪ▐Ў Э╗0fЦФ4;vькUлЪ6m┌┐ ррр9rджж▐╜{w╟О'NЬ;wnУ&M`ЫЦц■┤h¤o╥мщ╔:щ╚ЕЛ▀╟▄OЧ╗┼R╢X╤yЄ°╕¤М&E6T ├SКUз█td╧▌─dЫм╧ЁЪ▐jM╫ы имjБВ5К╔JА!╘╡Ё╪╪X`}ч╬Эгвв▀╕{"""*VмИ╫CЗН3, ▐┼kLL {Ўь┘∙ЄхгЯ5║uыЖЛKЦ,йSзn<}·t█╢m}||└╛pИP' Ft└А╟ПЗпАщ╤hddd╟О1|аyzКz╓мYаyа3вЕuы╓┴кя╛√B °З~ШТТТ7o^АhqЖоFнG.\иQгЪ▐╖oЁ┤> ж:Щг╒}L>╘.2йSзNб┌№∙єу иs║о xў▌w)qт>Л┼b▒Xм7F.Ж√Т"╙MR6Ыф![ёЧ0ыe┼$¤,)91р╤qw╟уSЫ·Д{( ■oЙБъ╖L\@Йя#FМqЛ┼b▒XмВ\ ўЕвУмЮFЛ╤#═.Iё╥[ :╗Р╦)7▐0ч▓ю~БЇЯVmV├├=Pg╩i╚ўнV+┌КИИШ4iR▀╛}GО ╕·ўя▀╠:f╠Шс├З з ▌Я╔ВФ^ВПТУSy ┘37ю WчсХ═lмPдP┘\ ЎTlFaP$!ы%Р_шlТИ}Ф·╪j╙g<м+╕ля}═fus╔ммюУmp+X622r▐╝yрu:Й ЯТa"Z▌?qт"эdЖ╙зO├╚╖▐z н#°╤ъМ√,Л┼b▒▐P╣юK▓b4╣▌▌┴а╔к?у.H█■▀яЗц ╞'о\┤eЎь╣Е>╚n╙╔Ої╔№Мz~ы(..nЇш╤а╪!CЖtя▐}╒кU№qЭ:u.\фu▐жє,H∙<°яГ╘Уe∙швn■p╙╧╦ФM╪▐)ZшэB┼eб3╜;ВЫcЧNYчYЬ▓Нb~╟╧ОЯ╚╩є┴Ду)))@gЁЇ╢m█кTй"Ь╬ ╙6эг1x└ш%Jh9H 6▄╗wя·їы[┤hq ■¤К+вQ─<∙Єх╙~╓@▒┤┤40ё┘│g7o▐М7╕Иц╓ЮЮЮш╨╨Pgч О"ЮFqєцMР7·╞Н(ю▀ўуууa3цZ/[╢м6шпМ√d'жкEгm┌┤Y╛|9m9ЪЮЮlауштКdшF╞}Л┼b▒Xoд\ў╟КЫфf4║ЛЯE╥∙ЯПм╕о< z°р▒й°ыwор■o┼ы▀zAKО\СЕ▌ыa(х╠LЬ81""вKЧ.а№бCЗЖЗЗ╧Ъ5лPбB┤wdц╛╠0QVьКу┴Cbъгф╟?Э╣v¤фХ x°√xe╧VйpQO╔Вр/Yy■√Т╚2s╥Y│ййй`▄ии(-рuzдU█BЮЖчю▌╗(УЬЬ|Ёр┴┬Е ╙╓їас&MЪм)ЩwБцсБb┼К═Ш1#Wо\╕"╘_0·ЎэЛБ7nmДПЪ###*`╖n▌К╪Аb'4кmшi▒XZ╖n ╩?}·4o└ёШL0╕ЯШШH\О?+Wом═░єч╧уz@@└Ю={i√ эЙ[б╬HtMЧ.]СтzТШв#Lзc╟Оїщ╙5аШP'·╒лW1╕ш┼╝yє*Tиа═1▓сJ¤·їэl╪░A╕┬йm,Л┼b▒XYСЛс╛,╔Пuщ╛" Ў░х╠ж╓8¤¤ws к▐.Яфoё╧чоШЕ═hУЇ▓6+:╟╙╝ЩqЫv>Ttt4И╟О>>>@CР▀║uы2]╤J@}╗░+Т╨K:ЭEQт~NKxЬvЎ╞╡╚K ∙W6╧P┐┌х╩Е∙∙ў%ФE═Y▐pєyJHH8p |X╗vmXRлV-`7j╞ЯЧ/_._╛№┬Е `Рй0f√Ўэ0мzїъєч╧ўўўзи bкр:┬ФБ=^^^ddpp0┬3___Сq░юёу╟{їъХ3gN:№ б┼їы╫QБ ·Y╒┬xXЕe`!ЬР∙vл,Л┼b▒X."├}╗NN╒[ВФаы ўhыь ╬Упj╟@{└O■┼▄ЇvГдЧУ▌&╥`з^ш╘4ГР2YШ'╗нV+ oЄф╔Я■9о╘иQр[┤hQ▓$ы╕пn─iщГ∙%бУ%ёУм╪їRК┼ТШФtє╓ныССZ╡ ╥ Д#Ф╜є{Т}·┘)Rdъ╘йhQС▒ДП└Ў ■)Sж╠┌╡k_v─Y,Л┼b▒^g╣ю╦BI7╪╜O[ЬИ┐Цьшы]└(╗[м·Я▄ДПу∙WёX8N╕nў Y\▌зt╝Б1У&MВYэ█╖╟лЦ╞єR╕пnйi9ъ∙ыдt\Х─ППе&%Еч4НТ├8EzймЭч■R╙1└┴ЇМ,ь┬м╔Щ(v°Ёa┌гx └їёё┴{Р¤├ЗЕ║╘]╛|y 8▐`t1Bg╧Ю┼hБ┌Q3ЁаьыылЕ╟ОKJJ"p┼b▒╨ё[*h▀RФ9}·4UО TеJ┤~ЄфI╘l6Ы·╕ ╥dВйT ╕|∙2т4╖wя▐░░0mzбМvi╚pЕЄЄQ╡j╒┤№2299`vб0тРrх╩бЇ{Оє&KlЁ╠[▒b9Рў▌g▒X,Лїf╚┼pМf┤[Н&╜╬├$л3*4;6║Qо╨sоКўё┘У╢╤ж:О█╖o3f xъ╘й%KЦд'YAУЩ·ёW/dц*йЫV╥^У┌║cуXтHубЖ╛b┼ н┤O ^7n3Э%╤C╜зNЭ2ЩLe╦Цъп=/ї{Л┼b▒X,╓ы,├}YHП%S6г▐╦$ ┘в^0(:Г═▒╠/;ЁЩ0Z▌ГS@FCж╕ЯЪЪ ГhKJ╝жззГ№└|ююю┤5╗x┘mЯ─}сЬ╓є╦╧╩│2{Xв( ╙АE█° ╟}m├Я'ZЩнWY,Л┼b▒^_╣ю;@^6╕╣▄= К#щ3 ўyВ┼b▒X,Л┼zуфr╕/Yчf2║╗╘нnД║╜Н║╦╕╧b▒X,Л┼b¤V.И√Ку╨Vww7х╫U}ч─░X,Л┼b▒XO╦їp▀fsь░n2╣╔Єпe╘ToW: Х╝#T╧BЇ'щOJR▒┤Mш ╪╓╡|нN%C┤∙щ+oАу|ЪШV ╗щ╗оhXzЮД\─П░X,Л┼z5╣юу▓╤h2▌╗n*j2┐, :┌рF;цЙN╝▓X,f│ЩеЄЇЇд7┘┴оtрэG$Ь@ iЭ&їяm6Б╛ЧЧЧЎ юя┤5аZ╠г╤7К?a│╬┐^Z╫мV+zЗW|Gр1Г┴ХbZЛ┼b▒XпГ\ў┴?┘<╝▄▄МОmx╘+z╜░╦vZ√д╡[╝щ╫п▀Щ3g┤е¤!CЖ4o▐ЬVм МM'Яg Э┼Kп"cЩ№iЭ*D╗uы "Gsт┘│gRып6pЪ┴x╜~¤zя▐╜ГВВf╬ЬI╒║║и_}8эуП?.^╝°№∙є┴·.4╔Y,Л┼b╜&r=▄▐╗═ЫM╤ы$╜A▌z_.Ф┴!лBЫ6mzр└Z─EAл`╗┐°HW-√6рLй%█№■╩i√|`k═Ъ5OЬ8Бc▒XЄц═╗o▀╛╨╨P┤Є╩;▄╙lг\Ч╙зO7h╨3g█╢m┴┴┴o└ъ>X│f═W_}r%Ў%и╒u> J├D"`№∙▄$°_nqр╛м╛еC╛$ль8LпC─Ро{OЮyРЪє0.=▌╥вFЭЄ ╫ ┼.╔ b'└╛bК┴Q^з╚О═O┼ЁмЇrд{∙Єe╣ЧЧ╫┴ГCCCE╘╥з╬╜&OJNzв░╚°щр▄╣suы╓┼┤AсчччьUgn╓ИZ╤ЬЬ)7г-ъ╠╓ЖX{ь°eGЬЪ╓Т╕Ь├к▀∙GП#GО╘лWпpс┬ЗЎЇЇ№[Юфf▒X,Лх║r1▄wь╜i3xШМщIЎЧ·яE▌б ╗рЩн@A ь∙ХТэГхЙЯ▄,▓░ЩД▐$Ы@зRf$|є═7░П╨═▌▌╜j╒кЕ Ъ={╢╢.┬kгFН║uы>|°ц═ЫOЯ>НV·Ўэ╣ ~ \╛|∙gо1╦Ї03ВZ╪╖gЬ°л╜HTь√.ЭNHIzЁCМ█c{х╥я°ф Є3╣#Ю░ы$АЁi┐S╔Б√°GV╨7─ИщS/┘╙зqЯBМ><МЩ╨зOЯqу╞!т╩Х+WЧ.]╛№ЄK·(?rфH▄е-┤╙╨Ь={╢zїъ∙єч▀╜{7%ю'$$аЖ╗wяUWлVm╨аAШp ╨єц═Л┌|||2,К, Ь┬BэWтЄ&Ю=CЧ.]в▀c┬#\Y║t)чМк0¤рн\\зNЭєч╧├ ╝╫&''г|Е bccя▌╗'╘Яъ╒лЗР#$$фщЪэ*юы4▄W█С"█ПF■чЗу┐ПП▒Y╥Фнlt/юцn2aьlB╓Ki:Б F Л╫╒─їЭ^(&Z╒З╗t/GЬOу>uгф=qтfB╣rх8Аы▐▐▐`▄у╟ПcЎ└'ШmMЫ6Э>}zО9 :З_┐~(П)Ф╟з─т°│a├ЖУhFт··їы═ 4╨ЄаJФ(БP сAVRq└·hSyт─ЙИ=ъ╫пПё┬u ═мY│К-К`,ыN@╨єш╖╝/^№уП?▀SБ.tь╪q╔Т%Z∙°°x|Oжи·Ё├E╞6Jo└# ,Л┼b▒■╣ю ;n7¤М▓"tV┘hSlЇ▒з╥}o╪ЎЧВ├ГCКъJ╘ё (лж4╟Є│╬=SЬ9s$ X▀▓eK╒кU┴О9sцЬ6m┌В ЪлкRе ь=zЇ╤гG[┤h╤╕qcРhс┬Еo▐╝y·Їщc╟О-[╢ ╫DР╬╛╨▓Я╖√L▄ъ││7n9r$р▐№Ї╙O (0■№sч╬бЙ6m┌СБ└°У'Oц═Ыў5л С╘╡y╕+MRТ-ЦK╫п▌I·1:&╞Ъ■sхw╩·eє(ЪГ)YFE'dщa┌╧▀]ЙLI├@~ГьH╙W╙d░╛(SмXN7IzY▐|^2x╬2dЬМ zОЙЙЩ:u*оc ·їыjгфю▌╗сvZSЗ?1ДК+Ж█}}})<├Ї┌┤iВ1DG▓RеJ!ЛЛЛ█╗w/╞ ╨-ф▀┐Uн]╗6--  ╞+X░ ^с∙Ъ5k┬км;°╛c╟Оk╫оa╕1[FНU╛|∙#F`юбкў▀?■№Х+Wv╛1В:Д╕Ed№$┬╕╧b▒X,++r1▄G VIШ▄Ї┘Lz|╩:сH╓╖)r║юоO№wщ▒╟¤чp|Pбc┴┤╝ї▓╜U)Ы╚,ЩG;ёъЎэ█Ащ={Ў┤o▀>wю▄└¤9r╠Ь93<<Ь▓╜###▀╖n▌3f hЫЦе7o▐░П╢Е╤▀─{FW╤oooЇёeqЯVў┴╟Wо\цVмX%█┤i│i╙жe╦Цuш╨"╪ю?ou▀*Y#И]v$Є╦vYе?~`∙∙└щ╤) v╜p7ъ╜S╣аH6!ЩL╩ЄWtт▒"#L1:vт~кqк┐шEТ┐йcц╗=бчхю ўk╫оЭФФtётE°тЬРРр>^гггБщЁчБ^М√┌■дЁ▐═Ы7Ы4iВ┐№ЄK pM`╝╤АfeMШЗ1┼▄║uы└ЕХ+W■тЛ/`╥В ЁчЁс├;vь├▄▌▌╔0А>о№ё╟@=░c¤·ї'OЮььSн$ъД·Їщє╔'Я8я8ЙW┤иЭ╖╒╖o▀н[╖О3жSзNФ·L&╙Э;wZ╡juу╞Н╒лW7l╪╨`0 A└'Nь╒лЧ┘l9r$p █o┐нPбaвє╧┌АHNуы╪▄HQRзе<~╝ ─ё ж■цХt╞*Х*цї╔цgЄ╚&`Б·╚Б$ьТЪ▄УQЫЇd╜/vэ/ЙR)))Шd0╕П(DЛ╪╕OбСпп/^Їm█╢E╔├З#pюг┐ЁЁ7▀|SдHL#─`└¤UлV|QЮ№Жb-[╢D ╕ИзmЪ"x└ш ш▐╜;└╡m▄╕1,,ья=м аЯЬЬМ/@я▐╜a╔▄╣s *4b─И═Ы7ўPхщщЙ∙ц\┴ &!жBPЭ*~TЧ┼b▒X,Vхj╕/┘dcвЧ=ьц>╦╤5wu?f│XТЄєоё^~иШ№%┼MСL▓в▓╛дш╒](3q Э2e ░tШРР└UеKЧ╞ы╜{ўАЮsц╠й^╜:mъ7a┬ДMЫ6с=z>Ы1cЖєv√┌Nэ Є%KЦр#P╕\seo|╧Э;GЇ╪MKKCC WЄ#Ёоg╧Юx▌╖oЬУ'OЮ+V╝є╬;а█;v"╞h╫овСi╙жХ+Wё@6Л+═v┼nТMТт ў┐ЯmЄ╤sg┐ПЙuў0{)Ц┌+ ═cT╘cКи■{e:ж╛|°сЗзOЯV╘є ю▐╜Л+╣rх"dЗ{щЩЗП>·╝ ╫бГ╦Ц-C`P╗vmL╕Є╓лW3дX▒bШ4┼Лз╡yTИщЕСкQг╞т┼ЛQЫє#╤(░a├Жn▌║∙√√?xЁ5м]╗э╛ь6∙мNЭ:╒╡kW|ы0С`I∙Єх1╩ИFр;Ж∙▀дIL0н■|m#NbЙ%·ЇщгY Шж[йУу╟ПЯ>}:╜}√Ў_|ё(У╢Аtv+J4hх╩Х°s╚Р!Гvюm╓м┘╔У'╡]фiwЄЖ┌┤i╙╚╚H║ИгRеJ@├э█╖уойSзvю▄\8sц╠9r└╦∙єчё3┴┌H╔Кг!Ы╨╔О4)ёзЯ[m╟N|w n¤5Кх╔пЧ%rЭєъ■+И&AЫ6m*[╢,·rэ┌5°│єс█o┐E%0U0C@ЁEКб╜ч!ДL╒кUC▀:фэээ▄}┤~ц╠Щ дддTмXqщ╥е HOOwьBЇўщ╪▒cн[╖Ж▒-Z│hЇш╤tzzД!■Є╦/╡ЄGОй_┐~с┬Её_Bх╖│X,Л┼b╜XоЖ√ ╘═дШьПхф╕Я│yЪ}B ▓^СН6IT▓9╬╓ее}EзжєdюВШШШДД┤М╢X,└wXrўю]@9┴wXXШ╢╧#^o▌║5qтD─¤·їю╙Z╛sЕ6▄╗w/11Wsц╠йїИЄ╦╤_8┬y╔_иЫў╙┌?╩ЕQ├C╧nВh▌▌▌aр%├├├A╖и?66╫A╠&У)k[4*▓=]з╫╔КР╟YYЁш;9ї╟ е фч¤/O7У╬ош╘Ў┐2ю╓GGG'%%iДкС:eх╬ЭЦ▀╛}Ы╝Б╔А+`▀ии(бюQS░`AFD╞ЯфФ─шаЖЛ/шЁl▌║544╘∙ў ┤ЮЪЪ:g╬ЬИИФ┘╕q#ЫЁў&єаЫWо\AЧЕ:Ё-┬X├Eф╪ПщЗ∙жХ▀╣s'┬Г2e╩ ╠г/!│>Л┼b▒Xмм╦хp_'Y=═nК╤Cvь╚у8Ї╒dХ vG┬Й]▓^PК╩·┐╪■{№у-╒Г5╤%р&^Ч.]:uъ╘j╒кН9╪нЭu·{[·Лд8VЎЕЇK ■/О╥iй;:з\хЧU■╫Q4с0ig╥JХ*-Y▓ДЮл╞ДгМ:t@╕ш/Z┤ш+В√╖╙Й╬╗pсBзNЭ`ЎвEЛJХ*їўж!▒X,Л┼rE╣юл&Ы▌ nюnB▒ Э▐ю╪к╟▒8нVЭуUТ└пъ║╛║цАк/tf╥дI{Ўь!_DGG╟╞╞ЖДДф╩Хы▌w▀э▀┐┐╢▌╛k╚▒aПЎ■╫W8¤ё╪_ Zсж▀I└─Н5 █╛}╗ЯЯ_BBF$&&Яb^▌╝y╙d2)RдX▒b│g╧╓л·╗═╧D─·░ Ёс├Н7~чЭw╥xzz╛■Б Л┼b▒Xм╫M.З√╒tУ╤▌▌ЬM]╟w`к,┘ea╫бQEч8?V]СVЗ¤]yч╬ВЫ┌╖o┐vэZ╩!╩д─ЫЮ={"│r`╙kдLЖ√u]╧wе<╤`&EFFН╞%Jрїю▌╗uы╓╜}√6аь╝пZ╡ъ╬Э;═fєы?R┌w)55ї╥еK°Ваk.6╟X,Л┼b╜r5▄W$Yq3╣▄▌їКЪ╚ЯБо┤L╞u}▀■√vХ╤DЙ:ч╧ЯOHHpю!Э╠\иPбЧ▌|¤o╓oўхЫl>#ЗGєюk&эмbZзЗ%(п===¤ь┘│ЛЕ╫ Г╒j $h~¤Wў╡s╓┤/}г^╦Y,Л┼b╜nr=▄╫█ЇF│╤шaФ+∙ Tї9Sх)оЧ^[R}е╝▐p╧b▒X,Л┼z5╣ю ╜, &У╤├$л┘<ОчJ)= ЫЁ░X,Л┼b▒X (╣ю;>▒╗╣Щ▄▄▌Х_═ХuО├v)нЩyЯ┼b▒X,Л┼·UоЗ√V┘тсюa2eS rdk aЧY/ўEF┌7 эp/^╝╙╤ЯlМvиЦfх┘┐Ъ=╬УМr┘]bcMЛ┼b▒Xм┐KоЗ√B/ЫНюF╜IАZ!щ√VЭдo`▄'ё[н╓°°xЛ┼тэээчч'╘Q№[,┴T╕ >ьбgg CXX=A√▓дNСЭМЖ∙Ч#Gб╬6WzNЪ┼b▒X,ы/Фыс╛═ЦюiЎv3╕ Y8p▀р╪ЗGЦм└H╞}mRЙ7╜zї┌│g╧ф╔У█┤iє╖цH╜RчA╦Ц-/_╛ т╟√ЁЁЁUлVЕДД╨|z)Rз-P╙╥╥Ъ7oО┘▓b┼ г╤HС├Я╒Л┼b▒X,WЦ╦с╛cI▀мўРь║┤GщFГ▐Ь▌MС╔джё│2Ж┴f│┼╟╟wщ╥хт┼Л_}їр°obЪPУ&M` мКЛЛ╦Я? ╛}√rц╠ Sы/U!Е1└¤║uытЎMЫ6ЄЎФ,Л┼b▒X╧УЛс>Z░ ╜П▐#цpт╛UgЛ(Y▒MР╒Wш¤бWн│+ъI[┬▒ГПЇУz╒#S╨ЄЁ╙^а,sчЄЎЎ╓ntкзrn tNnБ┴ЇЖnдv│▓*OхQЄю▌╗Ш╫п_я┌╡+М9pр@HHu┘┘еZЄ╒п▌оyLО;v┤m█╢EЛЛ/6ЩLЬ╛╧b▒X,ЛїL╣юс╙Дф'y╞ьI╪ёUдЧ╚г╦.rЦuп╙1P╬&tЮОtЮt┘b0╩t▓од╙ ]&л┌ДШxMKKГб╬}афrwwwr>E╪_а<■$*Е<==╔fgФG?╙╙╙╡ qЧ╤hдЄ(FUYнV┤░гBФ'/гPм┘l&?┬▌(гЕ┤ЮНАmZhс▄╝йSзи─▀кU+ жaYHж┬lxЮАЮ"\AC0C;╛╩╦╦ п╔╔╔░ЗЄяa0КщU╜╪╖OшЄх╦╡j╒BЕ ╒ц yГ C+0Й╬╧ЄўўG╗(А╔62┼"##KЦ,YбBЕ¤√ўу╬▌g▒X,Л┼zж\ ўЕ" К┴h╘╦iЖ ┼╚1ч╥ЎнОЄ┤s°yzч╫╫ь■ЦтЯnё№╤& nКЧ┴цXЁЧ▓Р-[▓Л/ЖA┐iMQ║vэ┌гGтщ╧>√lўю▌╕╪н[7ёЄх╦i┴╗AГ#FМАГDF&:jГ[g╠Ш▒}√vн6`wп^╜P ╠КQ ╝ах▐DDD▄╝ytонj>╝EЛxУФФ4d╚.ю╥~ИАzЎь┘йSз'░ЫBЛ┼ВцО?╛l┘2╝бФw╘єсЗ▐╗wПт x{╩Ф)єч╧┐xё"Еи|╠Ш1;wюзШ┬=├ны+e┌фRLB╓[%I╓Iїa▐ Жв9Ш▓Д╣╬оYz{{o╪░б\╣r╕·D1Ф╟+0ФЄavч╬ЭЗ цссA№ R?vь╪Э;wRRR┤ Q,Wо\¤√ўo┘▓%°╛a├ЖЗF+аj╝ВкБ░KЧ.Е│А┐FгсG√Ўэё~ш╨блWпЖ┐( Есzр8Xt▐▒c╟'ЄЄqKя▐╜╫н[7rфHЁ=hШ▓eтттj╫о кF╘Аон_┐~№°ё0ЯўQ╧╝yє╨_КR`°#чяя▀мY│KЧ.!КАхЮЮЮk╫оEРє▓)4╧\▌GЕШВя╛√.}:╠└▄5h╨ XО°Э┼l╨ЮЭ╒ └ыЛў yў╡gЭQ?>BзХ(QAEХ*UВВВА■шK||<╚├▒o▀>ДФ╝t°Ёa8нLЩ2шу>Л┼b▒X,╓3хК╕пШ ЮЮnz№с└}%]Т▄Еl°9*¤╨╥╦?^єIyh/U7,gГO!скR& '┤┘╦Єх╦┴▓0ц·їыFгСTеX╖m█жс~ўю▌aЇ_|1`└Jvў7n╝k╫.Д э█╖w╞_P√Т%KPЬZ║tiтужMЫю╪▒aFы╓нqeш╨б@ФЩ8q"9ЮA№pх╩Х3g╬└q╬;┴╝му>н╛╙Oш,№ь│╧▄▌▌╤e4┌йS'z6╖▀╕qгa├Жx│wя▐╝yє┬╨?@s└Н0Аp▐9Зb ╘№В╜53┼¤ФФФ .а╝╓лW/00pўю▌(ЙH CРФФДўY,Л┼b▒▓.├}╟n;▓═`Єt3ЫД░KvЫЇ╪Ф|Y>▓ъБ∙Юч╒ЫwrW╔QдСgО"Fs░д╙?ЦtFI2gъа∙М3└╕АoА/1>║xёbDDИ$JVїь┘╚▄ъ\┤h╤Р!C:▄'.?wю\ ■¤1│f═║vэ┌Їщ╙╦Х+7j╘и|∙Єjсгqу╞нX▒"99Л/.2щч╧Я┐sч╬WX▌╟{╘Жb╙жMшМўїїЭ3gN╤вEЙрQЎм_┐MWкT ЭET·ПКК;v,№у|F/!>е■╙S/Xр1юГ▌Б√ССС╕~щ╥%Ё}pp0ЬЯ#GОшшh┬}Р=у>Л┼b▒X,V╓хb╕/ aСt┘Д╗∙▒╬/']■▀┘╤Ў╘└┤ЯЇц№╔╡█╛e ▒e√╖A╓;╬█uX+╦z]&ЫEвнБ╬Ь9є▌w▀yC ЛOЭ:▐╜uы╓В ▐{я=│┘Пы╓н╓>▄██╖г3(z╟Г╚M&╙╒лW√їыЛbрQнб]╗vMЫ6нUлV#GОЄТГ╨z▀╛}Wо\ j╟Н█╖o3f╠'Я|BЬЪЪZ┐~}Д╕еe╦ЦЇ@*=X╝tщR8╝>zЇhч▒бф■.]║Аїg╧Ю▌жMOOOZ╘╟+║З&NЮ< Г;vьИnв/FгпBВВВиХ{ўюб╫111ИCo=zёLЛ-0Xг╙( ╖ац└└@DM4ВЪ1xMHHАЧp╦їы╫-аЖх╦Чч╠ЩУЎ┼]ЇьD█╢m1лрД:.\и]╗6МA$а┐ ~Э:uемZ╡кJХ* ЪR}Ї┬А5k╓р╩ЛGЩ┼b▒X,ыЯ)├}EJ╖ъя■K║╡MьXm╢¤+{Р%gQk═Nyн┬ш)Д┴ёпвГ-Y═у╔tя╕`╥дI cj╘2╤═кАб@seнZ╡└╓аOШ Чa$о 0NUo┘▓еrх╩B▌CpЯФФФЦЦж5Дnв nF;╖О ┴{ЎьIOO ь│╧$└│rў{Їш╙Т6e╬°√√?|°Я"║7m┌T█ЛУЖdМ╕т№∙є0q%╗═p8м┼Хрр`Д.&L╪┐?э┴ПVц╧Я▀╝ys2ь┌╡kxЯШШ *ДШдHС"┌$P2Иs#КЭя▌╗%Э{ЗЄ98@╖╨VEhъЛппяжMЫBBB┌╡k╖o▀>\х├НСССИФ`g╔Т%1uPоcЖДЗЗп_┐a TлVн@БИj9d6╚,Л┼b▒X P╣юK┬цждЪф╨Зя▌°}сby*╖╬о°(Тў#г═╦Q┬( Э]=W╫рXр╧ю├P╕рлп╛·цЫoDF╞ T╜zu└1└яg╠ШБў`qtГl√фУOzЎьi│┘╨╜ИИ╝y/^╝╕TйR(АюX,Цщ╙зo▐╝Ykиm█╢}·ЇAи@gci^ГЖ║sчN╝ыS РЦ~єр┴▄uх╩┌ЦXП╢i▄║u ╞а└Ф)S6lиUHOїШнГшБ√╘ bА╓н[cHhy#║pс┬i╙жEEEYнVъ╫ф╔УiЗM┤▀╣sчc╟О┴Юн[╖Ц/_}|b╝ёКИиk╫о111бббЛ-╩Ч/ЯVЖVў?№Ё├SзNQЭЇ*2ЮН╞И/[╢,wю▄;v╝zї*>*Vм╪Єх╦1>·ш#МПPcД?cccс║еKЧ,Xy√э╖a╥бCЗ╨_>UЧ┼b▒X,ыЩr5▄Wt·╟f│Ъny$ы=Д!╗dwУмТЁРЕ"╦ТГїe!щб╧"ю}жжж┬┌╬ТР╤hЇЇЇqВJЪ ш %▒°°°РGp%))Й(<00РPЫш?11╤∙T]А>zJ═iЛё┌XtЮ. ╨I║pо╚H─G╗ФвCП╥тНЯЯЭфЕ╛╛╛h╦∙д-J▌щ╓н█ъ╒л╟ПП7^^^4< xъ2н╗√√√гуd$%▀гf:ЯвЙ╜{ў"░Aў┴▄∙єч'л4┐Сп`,дм}МрeЁК╣В!з&┤ |иу╕NГ╡>дcГ╤╩Тв+0uвfE;(ПOўь┘Г╨еQгF+Wод├П3gЛ┼b▒Xмв\ ў╤ВMR╠F773■Р╘ ╚Ттыx▀qI╡ўўёЧx╣s_]_ДЄp № ОММ\░`░╪ya■┼ў"Ў░X,3Д+ ╕{ўюдIУ╩Ч/Я;wю'NЁ¤ыEётУ║uытu├Ж ┤*у>Л┼b▒X,╓3хb╕/KЄc├╧h8Ы▐K/ЇzE/)┐╛вЧ╜√eA [ Б╕O∙¤pр╟╝{ўю)Sж╨╙/8╦∙ЎО;Ю,6йzвМ╞>-ш ┌ж,Z┤h╦Ц-f│]Bы═Ы7я╘йu°╧DАИ H:e╩Ф3g╬|·щзх╩Х√S[╠К╚█d╬5j╘иP ┴Kc╟О═Ы7/№F°■t%DЁ╘:╟Е╤S\!■╓6╥bўмl4ФQЭxНММ№№є╧+Tи0`└╪ЁўЮ&ЎЗЛbEчБ╨ОhpЮ'-[░`┴╢m█0'█╡kЗп└3qЯZЬ5k╓с├ЗщF╘▀кUлў▀ЯwMe▒X,ыпФыс>>^╕╗╗o▀╛}╥дI╬.\xю▄╣°Ї_▌А╥■ю ┬╡k╫в■ффф╘╘╘^╜zh^lЁяС^╗uыvш╨б3f4m┌T╝л√Д▌`ЇЛ/FDDDEEi?╣P╬╒К+╩Ф)єВ┼x*М 1h╨ ▄NWК)2sцLП;wюЇя▀?11СК∙°°╠Щ3'wю▄┌П┐┐┤VН·П?О╚н^╜z_}ї╒ЫwLя╩Х+┴шZ╝д]з jф╚С 6╠┤ZнG ├Ж Ы?>■┼Б╟Мє╝СЕ╕yєf№ЙhхЗКyЄц¤r┬b▒X,╓ы,╫├}╘ ╙o┘▓х│╧>├Н╤╤╤а аа ///4д█)CC№vmX│їЩ╠с|QKZpNPБ│@╖x3e╩Фi╙жїь┘sЎь┘┤8J Я┌j▒ЎзsmФ╡вYEf╨ лє┌кЦ╗в-КS=p>┬H╕9N√Н╡╬╡=╤Езы╧КшmPщ їО╝AйMxэ┌╡Ц-[┬3▀~√mHHИ^ ┐╖╖7en<╧сJa~ Т┘╢m■╠У'OбBЕЦ/_n2Щn▌║╒зOЯ╪╪╪Ы7oтгw▐y╫╡ё╒FS)r╕ЦGдЭ└хЬ днs;╞+╩ ~Cг4╤Я░VVнQКv┤O╘м нЪky/Oф;9╖B!еsBС│ч╡дй'ъY╦;┬t>|╕ппo╬Ь9╤M╕_╕·ю▌╗°6.]║┤c╟ОO╠═N·╔┼y&X,ДgЛ-7n▄И#4ЗkЎhЭE[фЦQгF═Ы7Е╟Пяl░Ц}GхЭ+╤ьq■"░X,Л┼zY╣ю4Ы═f╪Н66m┌╘╜{ўК+8Ё¤ў▀2d╚Ш1c4■{°ЁaBBкw"▄3!6·зDm(>>>))IkИ@&j=Ч2▓Ц:hи_┐~_~∙%╒ItВ╪}Тp бЖUфn|&Ж7╡LХ{ўюс Lйя■кш@g╡Tx·"ЬVў╡Еvp√Ўm4нН.aZЇЇЇ╠:ёвбЮШШкНZ╧Х+Чу─╡!\Ў¤аъ├?─l ЕЕЕ їёМ#оd┌"YШЮЮЮШШВ°1ъц═Ы{ЇшQнZ╡UлVuэ┌u╫о]╦Ц-├G┌ўcБя5Б^├*ztVkиwя▐KЦ,┴╫m└А#I}╨В,╫zф9а$╛)И╧ё┼╤оk╜>xЁ %%E√4GО>>>"уi>;Щ┼b▒XмWУыс╛╢║П2╕k┼К}√ЎнTй╥╪▒c6l╪▓e╦9sцаBbгщ╙з╧Ь9%Ы4iRдH-∙p3j╘(╘#2╓┼сР╨╥еKЭ√я|Ї╤GЯ~·)=,2хi▄' D∙╬Э;>|шCl7qт─NЭ:═TEPf┌░aCёт┼QlЗvQ╧С#GїF╬B╜zїуt@{ш╘х╦Ч ^ёкj▐╝∙ыЭ°▒ hй ■Wп^╒огJ·o╫о]╓i РЛ┴C▀я▄╣C]C└Ц(Q,K;#!АcQ,99╞А╤iеs},Z┤hVVd╔-h▒V╜zїЄф╔│vэZ9Е ьў▐{Ї╣f═Ъ2e╩Г┬дО;Вйrf╬мY│╨(<У┌╖oы╓-Ш]зNЭ╣sчj1XШ▓Аь╖▐zk╞Мd║┘╢m[╝RДГ)┤pс┬'Ю !ўЮ|x╖n▌`эЦ-[┌┤iГБ√Ў█o1╡Ё'└E░y▐╝y°f┬∙╕гщЛ/╛h╓м■дx_:ШК╔Ж╪▀z╕n▌║h╙Г╛YY┴}·▌Dёe┘╗wп╚X┌я╨бв╠ш,│>Л┼b▒Xп,╫├}|▄─T·╔'ЯА5A- h╒к▐/Z┤oИf╧Ю ЖHHHА╖┤Gё╤чЯО$АF[_¤5 kьEш└Ї═Ы7WмX╤9/шi▄'▄A¤6m┌Д╗╝╜╜╤п╤гG#┤@BХ├╝░░0x√э╖Q╕KЧ.╟П╫|G■Е╡@рbФA═рЮ3g╬ї╟ pч╩Х+Бk╬+╨╕=55@щ╝юЛў 0x╖g╧ЮYOЗ└аА>Б╢h├мхвр @╛ц їw P# Оугрр`·С┴╫╫И└ +-gёў19@Ў╣sчж%єc╟О!^Aо^╜:<<╜FwДА A█TZБ[р█╥еKaс∙──D╪ПWлV-╝╟-(v─]0╕|∙Єы╓нC|╨G¤ш/z _╡n▌ =1ўЁz┌╗wяы╫пk┐Ь╡#╛┬,Bga*B▓-Z▄╛}pМЖдМНЖ`3вт`ъя╣sчорvчVP8E"FЁ7n▀╖o_ўю▌5╤АRt cА┌ZЖXжN^░`B>|MHl▄╕йVнBа=z8ps╕QгF┤fв&8╜@¤p&м┬ы7▀|gТ1°║ў}TQZрЗ1Ш)ъCє┌?ўщ╟ШБ╬J┘n┬щ▀ 0│=+O│X,Л┼zж\ў▌Tс И ╪TбBЕїы╫{zzю┘│l=■|Ё1╤FRR(▄ HЦБ∙Ш@?АФнR~XЕ═Z^ м Н;v╟Оuъ╘╤rжЯ╖║O▐_:D5h╨ D└VЖЪ┴Л`8paDDDп^╜ИеPэ╤гGQU╒кUa│┘ зАз╞PV4к╜ >pя╗vэzф╚Ё(HrzЬU!и_┐■▌╗wa0b \ D┐Ёч■¤√сБ╢m█f%╡Ж·rъ╘)<Э:u*т┬8!Г>tш h▄╕1pч╬4 |─И└r *┴{┤юЬ√ё}ц═Ы ё=Bщ+З ФB@°═7▀ wGЯЙ√ЇCВX°_@Ц╦)└аaRRRд!ШЗгЮ╚^c▒X,ЛХE╣ю├bЁ+╕5Ўэ█7>>ИР7o^┌рх╬Э;9sц№тЛ/┌╖oO┘└ў┴Г°сЗKЦ,╤╢Я°x.2╢0G╔ии(═qИ @6░ИГТИ┤е¤у>¤VРЪЪ ╓'иеtЛєч╧├▒aaaу╟Псe:╚6Х| .мx l┌┤)lЖы4h@cёGс╛PAЎ─Й└\ ;▒KЧ.@g°$((И№Пiў╤Gэ╪▒гPбB└Mб.x├╢╙зO#кA▒╜{ўЖЖЖRmД√┼К├фУ{DЧ╢Mзfэєpen▀╛ K╬Ь9ВF¤№№╚с0sрЙ╒}№щяя°ЁсААкс ▄?~№xХ*U╩Ц-╗m█6-$ъx┼╖СV╕Puш╨ШЛ т'Ыi%с(Г`ьО x&юSO╤;z┬╕sч╬'ш"тUлИ╢n▌кс~ ■¤!■∙чрx╩┌вРв$bЇ1╙╒}zдe╦ЦЁ$к┬╘╥╢7е▌?╤S╝)Qв┼EМ√,Л┼b╜В\ўё рЁ@!'`Жа*ДжИ"h!<+iZЇ░5·Лxжk╫оИш╢l┘B;,ЙМP=В├┴▀ШУp#]Зg<уЫМ8с=ШОЪ?>zJ?Э╤пUЩ0эGОЙ╚ ╛└▄╨ЎЦ═у[0l╪0╝б^╨ БУ1┬a░0uщQ`┌∙┼0+VмАO ,и<чшЛ┼b▒X/Цыс>└─9~№x└▒ЯЯ_╛|∙╩Ч/°F∙ы╫пRп]╗Пzh■ &А╔Ё@6]╝x╝u ■¤╨╨╨yєцБ╧■?{яXE╡э ╧IБ▄ ╣$ЇЄзЧАHPдKХ▐С▐{G║tдД*~Їж<╜К" R╒?╜№Р╬#╘▄ўо1дЬ▀'gyЎГТМbт·^яa2│gэ╡╫^{╧w═ьwс~iЖ}Д▄╛}╓╒А┴є╚eч╬ЭB▓╣ДдGИ╪ю.3фЎы╫пўю▌√ь┘│ cСЪ╪э╬/$Єє╧?G>Рвa5#k┤Э4iRxxx▀╛}!юеЬ;w█(PА╩Р─$Гysщ▐╜{Д┴┴┴\5╣\╗v тkя▄╣│g. ф└}Q#■№┬nЕ"sк╗Еу╩в°Gъ╦У _╛|Єв ;e╩т┤C^╖;v ╦PR,│wя^{е┴╝СO-Шo╫тбdMA▄e╣K╝ГyДsя╪▒Г[ю▀┐х╩t├UЁIx┐DGd╟ы2e╩$3%фc■#█Ьсx4ДЄх╦├╦Й|ю▐╜╦I┐МЮтШ┌бQPeDh° ▒ ╟ЄёНц -╔\ЄєєЫ={6┼Чя$┤G∙4ДVxHВГaУГ╛·ъл║8ПBбP(/ЖдGў ╒9r$ьDVЎи]╗6yp■Ыo╛й\╣▓0c.╚kE!.Н7^▒bwэ█╖OфA┌Єх╦б╦ш0zЇhHШ╜ ИВтCYР&я5█╢m╗rхJcQ└дЗ9 8P6С:uъ┤l┘2и$aЄхuпхц·фs=pрАЩ%)г2 Еи1"=L ■zЇшQ3┼,Ю#g╞П?tшPдСЕ┐ ■{│FРTWлTйТ'O3▌╙f NIЙиBК)гисВЕ В4╦6ap;b-HЮY`GL═╒¤√ўCЧ┼ЮCЖА¤ї╫╨k<мX▒b[╖nХн╗0┼├ЗYGЩУД▌╗wзжp)№gўю▌Ё~ ~ф{ОЩМQжLЩ={ЎШ▒1─B$#[I)ф(┌gЯ}Ж(q_6из┘fЛ║├▓@> ШФ!PgLЗrч╬НЮ°│LС[pT╪┐х▒sъ╘)Щ°kЦу─OpKв;JДX,Ё ╗0d╚ЩС,▀yИZ╖nMЕ╩rе╬a%хТ%K║vэ*№[D╤p╨╩x5Оif╢аPT┴Ъ5k╕Л_"м╜tщR.╡i╙Ж╗prX╡jU"j"1YnиyєцDцfЬиr,RкT)╦╒вЙСшpfNJ+РСh8фЕtщ`ЕBбP(^ IПю[о┼.п\╣"пS╗oРЕAО?юх^ь<■№Bц8У#GО p■с├З▀}ўЭх"ЧPУLЩ2б(╣#╙Ю)м ╬}т─ О!vБББч╧Я ХuM Е#Є'ФЪ,ь#┬/\╕0l╪0JЕт└╝Ы4ф╬ГoLИd???,@bЇеKЧ,WтЇФa*╥ЁP╥╛7p╬Ь9ё"│ЙмxЩКJ@╚/▒Д╠<6є:т5мфr√Ўm|╥N╛ql▄├╠═Р1`шl┘fк╤NICu╨И╡d╗1╞h▄"+eБ╚@2QЮJ|ЁрБ]╕б√д'kYи╘°3эЛж-▒еX ∙V╢IЦ┴? r'ЕBбP(VRд√B╦ьPxЙ¤O3й╤P{J3 ╒,╘єлyЩiЭЎ3┐┼о$п╫F╣┬DeМ5%мTйR╧Ю=єх╦gЯЧiL█%▌~╡P&Н∙╙Мч6E°╒ё═Ў╗~╒д┐КўюW2)┬BX╧Dvньv{▒┴<╧Ц¤W╡Кs^Tr╕gl█-╟8ц╒╡Щcm>M─╔▌|Q∙╒В╪е┘?╣ШП Ўк┤Ы╚.№Y3╞)rЬк╖╩s#?ы`r !ДСlr4ЩJS2Чт4{2╙4Мnq▄їYє>kУ▐╠┘}╓р ЕBбP(Д$Iў╔Xж■u RZм┘╕qуГ +вЬЬўuбo▀╛гGП~┘j* ЕBбP(■^P║Я8РQ Zш╨!Q╠╝u╕VIя┘│ч╦VSбP( ЕBёўВ╥¤─БЕЄр┴┌nЖ@╚╚^╢Ъ ЕBбP(К┐Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘Bщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓E╥г√hЬ*U*ЄFz╞хээ═НдсW╥Р@бP( ЕBё╖EТд√~~~сссўю▌Г▄єзЬ'?B╦Їщ╙ ╫6P( ЕBбP(■VHТtUVнZ5vьX2 H┐▄┬еЖ NШ0Бx@╬╦k■▀g"ЕBбP( Е"й"щ╤}Дr q={Ў|ЄфIъ╘йГВВд$OЯ>НКК?~|Л-╥дI▌╫╖√ ЕBбP(К┐3Т▌Gc(>J/\╕pф╚С+VЬ={╢д?{Ўl╫о]}||жOЯ▐мY3СЙ№ЖЕЕЩ°∙∙∙··RюПL д`╦IФ.]:RЄ'У/╟▄╦ЯсссQЁ'E0бЕ╙╘x°Ё!ЄНцйRе"Щф┼Н<РФ■■■O]рw! ї$кЩсШ╪Ж4)Rд└▓2?дMЫ▒Тй├ЕGПЩLIАЄ$ц<ТН&$└№"КH@2 т¤тtБвП(╔/u╟/ЕТ/*ЄuЕЄb.SРч W( ЕBбP$:Т▌ц '^╢lYч╬Э6l╕n▌:aУH;vь╠Щ3ч═Ыя9PRx∙Ўэ█зLЩbД┤h╤вSзNФ═╥а├кUл+╣╦/q┬Т%K▐|єMф6l█╢m$&_╕2)ЕЛ┐ў▐{CЖ Б4ЗЫr~ъ╘йТ^@ВVР{ Gv=zЇ8qтЙ╤∙╚С#√Ўэ#/(rЗРу╖▄Ї{QК~¤·Э>}Ъ4bьЛzЎьIAd 2бр ╕pсВ▒╒И#кVнК4Щ▄,ч?~L.Ч.]BЩ -ZT""╥─ы1ФЛ─ш┘╖o▀╚▄Й9r}бOЧ.]иP H0ьЄх╦Л)"сН╥}ЕBбP(К?IПю#V ХДЪ╖o▀к+┼е┘╒лWa ўю▌Ы5kЦР`Nо\╣r╞МdЎш╤#г"┴ї╟НWлV-99{Ўl┬ГТ▌чТм╗┐|∙Є:Р ю+Ї╣T╗vэ └їe╤Ю╡k╫О1тЎэ█AAA╣sч6*r═▓f═ 9&р╠ш╤г'MЪФ1cFТaN<ШB^║tйpс┬щ╥еУ3▌║u[╝x1D:Ю-[6▒ФЧУлVнZ╜zuёт┼Й78&M╧Ю=3e╩d4┐sч\ўю▌Я|Є фШ3UкT9xЁрД Z╖nЭ%KГ┬h2`└АП>·H▐т╫иQулп╛ВыKБTо\VН└╝yєвsXXXЯ>}>¤ЇS$╦g@\з№°1ti 6Ф╕sQKz─Тя█¤8о│o▀╛vэ┌╜ї╓[sц╠ D7Йю▌╗;vь├?l╥дIЪ4i<иP( ЕBбHt$y║_╡j╒РРrВЧ├│=z▌п_┐╛$Ж7├у╙жM │Ч10Ў"y{{>╝QгFXN╝h╤"Иx┤ fжlГ ·їыЗbBў╗vэ║tщRи3t▄╛НT╗yєц_|ёE┘▓eы╒л╖sчN╩╓┤iSBУcDD:#э╨бCDЦЛю∙хЧы╓нГИЫ" ▌я▀┐ ╘йSEУЛ/О9Є┬Е ╨qQO┌┤i╙▒cGJўЁс├ *\╣rZЯ"E SL Б8р$ёAЕ╘ tЯ3f323├8A/рQА┌┼╘╦Ц-{¤ї╫1>ьЯ╥Дl╪░!■№·F_бP( Етх"╔╙}ш&]°+D│f═ЪЁ┌ю▌╗├яI╣f═ЪQгF-Z]░`A│'ЪЭ9s=р╟ЄZ¤·їыwю▄╔Ф)Sю▄╣╣║k╫оЙ'а╒Ўэ█схТu╖n▌Ц,Y┬яр┴Г│e╦&'CCCЙVмX▒qу╞b┼КuРжwя▐$╦Ш1г╤№╓н[єц═├─┴┴┴ЦЛю!а?ВKcш╛╠-F7T┼XEКIУ& E ╪ Ь╕у┴  t┐o▀╛√ўяч╥{я╜З=Ннi._╛,▀░ЙdБ╣╬Ю=KнРMф╝,ру▒чXbL*▓VнZ8╟▐╜{OЯ>=h╨ ╠2g╬╠HL"["( ЕBбP(^Т▌ЗкBO!тsч╬ЕС┐є╬;у╟ПOЫ6-┤Z▄░a├k╫оїы╫пQгFЁ╬└└└РРЭ:uЖjTD9ИЄ┴Г/^,├ў╟Н7a┬ДЦ-[vю▄Y^{г┤М▌▀╜{w╒кUE+ЙЕ RЄЎэ█lРЖ0c╧Ю=▄>f╠И╛ "j▌║ї·їыGОI╛FsВБщ╙з╧Ю=╗GПdqс┬Е╢m█Ю:uКRp Р ╕Л╚с¤ў▀Зю-P=─0'OЮД╩Ч,Y9OЯ>їїїе╘─$№┬░╤ Ўэ█$уЧ, .l2Eф`К&Ь■■¤√╡k╫■■√я¤№№dь><Щкф╥еK╪ДJФ╔ссс█╢m{ї╒We%╙Д T( ЕBбP$.Т▌Чй║лVнъ█╖oDDДхZfзl┘▓Ы7oцЦх╦Ч8Р H╦ЗCЭ }Z╡j┼]╪ю{р└Б;wюPHУ#┼DZ ■¤Ы6mКцїъ╒#Н,█П!d<1 ┌r¤-ZщЗ@Wо\∙╪▒cвЫхвDР╙│gOB▒)║]╝xСАA╠b╣g▀■╙JJ$,k└!sя▐╜o╜їЦl2Р╨╖√2ш█o┐н[╖.'Л+╢f═мбKё( ЕBбP№РЇш>зJХjы╓ну╞НуX╢╩Вю╧Ы7OV┘?~№О;8юъBdd$∙m▀╛=$$─.gь╪▒╨\ )RР$o╣╟т╦┌С░№╔У'╦вї▓╝Lўю▌/^<|°pи6б)IV│fMb ТЙ(Їб└pю9sцPlУcу╞Н╤;╩+Ў╬Э;C╕IL)╚еFНZ,[╢╠r═▓%fАFsТ╗О=Ъ:uj╩┬y╤д_┐~\хдl│┼%lHжDч╧Я7UВp┬ДУ#╩■\>$N tЯт╝Ў┌k▓▌XВЖ┌Ы¤╢о^╜┌о]╗#GО>tХ(QBф$ttРBбP( Е"╤СЇш╛lX 7 Уїd╚┌Ъ&M╤АЄ└z9Fcи░(M▓╟П█┘'|]▐@ ╨  ╫'wоB▀Йd┌о╝╠ю╥е ,ЯИвGПД┬зQ═┼LЄЪ\$ ╙,Бац▓yЦдD H╚U╣К4tр.ЄОYd√^∙.!sЛec]КCy)Э┘r╦hОX√~)7вдФФ4H{ЄфЙS6╛╡Jўe╘▀╡kOц╠Щ╫н[Ч+W. М ЕBбP(КЧЕдGў╤f,├Z╠к2ввPyй,№U▐@╦╢PЦН}Ъ?EВсшfК▄h/┐мm?`└АН7Є█йSз└└@Y▒GВ#┘ДvїьfТє&е╤аЄТo MA$#{Aф╪ш'S9i╣c╗Жv╔ж┌ЮяFUR▐║uЛzх°Ўэ█╜zї"~Ш>}zйRе ¤D) ШХ■ ЕBбP(/IПюsЙМх]°ЯЎЄXFє6l╤вEaaa▓?n╫о]с¤▓ЦехWN ж▓\╤│g╧;vPjМ╩APPPЦ,Y╓мYSа@Й.Їэ╛BбP( ┼╦Е╥¤°!├x88pрзЯ~*п╖a ▌║uуМ∙ШЁ7YtRv4г╘▌╗wЗю╦З╦=╚*00p▌║uyєцХъS║пP( ЕBёrбt?~F&ян∙Е┌Ii║GUЕ}(╤═Ы7й53ш▀ Є╔Ъ5лппп +·;╪DбP( Етп е√AHн╝┬Чr╩▒Щ!Ё7с╡fтБ0{Щ0`f╚ ~╠ БЧн▓Bё 8-зГьtyж├эИЙv¤с√Ю═┐опUgМ├uц%ылx.ЬR]▒╒ъ┤bb╗(╫)/╦█с№∙В№▀r──&u№-:jЕBбИе√ ЕтязЛzё\Ю_/gМЧ3╥Кс╨█▓|,/GьyHбэхМ▓мФJў тpЪЭЦ#┌їЧЛ╓[>╨}З╙ЦNщ╛Bб°Cщ╛Bб°Бn╩їv▀M ]Ї>┌їы╦ ]i,+╩{=х╧яОU№№╘q▐/╬8O╟╧Я┤6 ┼▀Jў ┼▀▒t▀·∙= ╧ Y▒40╞√\Ёч╙%ИqD╟■└юЭо°╠r╫й╖Лт{┘j╪й╡йP(■╛P║пxA╚┤]│йхЎ┘w,╞ьЧ°НИИ╕~¤║}Ыooo*=EК&ёs`▓ў0rD∙є╧_"╔╛IВ¤LЬ}!L▓▀я╖f╥И=wsU▓0S╠ ▓╦F┘нdf}╚%{q╠<ЩDЩ!уМ▒в╜bвмhgьАЗОу"Лq%┌эe9╝-o/■НrX)_CдН\║t╔L Єїї═Щ3зЧ ╢*6╚ДieЎ═Iд╓М╦I╫ЯP3SА3п ┼▀Jў/ьO-ЖЕЕ СчqкTйЄч╧Я&MY╜╘<їЕP╦;wюь▌╗ў¤√ўНЬААА={ЎФ(Q┬Є`ябп=rф┘q╫╠Ч/▀╣sчpМрр`N■qе■-нL░┴я╙зOOЯ> iC╧╠Щ3г╛ Г)TиРХHф[ныъ╒л├НЄц═kЎM│\-Ў╩Х+╪Щ?│d╔Т;wю▀]╩─З┘ЬAВC╩В┬СССЬDa╬▄╕qГЪ J┤u]cgtF +ц┐/▐╗ЇяШЭ0}'\╨Ы ,GLдуИIa∙дМЄ)Рб`яWмФ>>▌╟y▐xу М#~Uа@Z Х°rYй<*.^╝HonBV* RОo╙ъ-[ЬЩP7ЛOЮШчЇщ╙╡j╒ └!▓d╔bфpЙg╣Tw╝ФпВ^╝x▒Y│fwю▄Б q;юuєцM~qИС]°Яє)ГV▒wя▐╛}√>zЇИАЗт@·1j7n▄xэ┌╡(яэ┬я╧Qy╨аA╫о]├р╒лW╟░ЬдuP ╜zївuб╪ш╤г╗vэ·√s№# Фю╩Х+╨╗={Ўd╦Ц ^Л=я▀┐я▐=.-\╕░uы╓VвэZMм°╙їЁk3╢╬:Ё┐КЎН╬Ї╧МiSD┼8г╝c,ogx╘O ¤°▀СбС3║L+У¤u?╟?■№╤│Aяш,WЧ┴Uфp D [╖nq/7b╜ь┘│Ыv/ч3#│ЙЕ╨e |РУt SзNЕЇ/^╝╕]╗vЄЙФШ╥╔ЯC┌(/╡F2Ф╠Ы7/Я┼ Иё ┐№у∙+G<■ё_єZО═ J▒з>>+╥╟Кў  h├╠п╬ЮШ╓mbеLe^ёц┴═─Сд8x▐E╖ЖzТЛq&MЪ4╞ ═№  ╕є╥н┼┘░П&SеJLJ ДЗШюN>pсе╕ХТ#G .c╨ЩЬФ∙0жS╞Un▄╕!o╟I ОM3h>▐╛T2¤ю╗яъ╘йS╝xё╒лWЛЁ 2с5j╘апG>С2╝ ¤ё(ЪнТ[╚ZвЇ89Тx╘иQ'Nь▀┐ Ф)S─D╪Ё╚С#t) 7+\╕0═КЄ╥Б─ZЙ№КqжООp8ЮZ╬ 8│)ф?'╛Ъ-8д┼,┐И4OR w┤├█╟J▒x√╝▌▀ljY│q╗╖:┐тH'Кб*Q─╗я╛╗}√vе√ Е"┘Cщ╛тБ¤б╚%JФАєэ▐╜ЫЗ║>Q╒Еa├Ж╔tCX┌╝yєК)b╣'% к╦I┴IЄфIt#ЬАдVкT ╛В╢ы╓нЫ6mZ▌║u'OЮ,НДУШю┬Е Гжpж}√Ў╚З╗sKУ&Mf═Ъї|;Ш9╩╦Ц-ы╘йУ░mr\║t)╤┬ThfЬЬ4iё Дшя█╖o№°ёr/W9.[╢,mPAх,XА■b°TТь░╒ gх.LНёI╨бC.┼6cИ¤╨{z8¤╤L╛Д)ю▌╗w°Ёс}√Ў%fР1QX~┼КhH╛hBvНє<~№╕Tф$qЩ0P_dъЇrD▐Н╕╓v∙р╨▀_┌vRБ└╫оЖ=ЇЙО╠тШ"e╩Пw,=z∙╗Б═z╛Щ╛$╡/▌Зщт3tИЦлQ`╠┘│gуQ0o▒м ▒3їN8Кїиt√|Vм ЛЕ┘╦MЙЙnФ0oу╞НbНsч╬5l╪РКЖo┘▓M╕rПЙvэ┌Е√╔╟1Ъ БЛC·EНx√R3цкb┼К4лO>∙DnбP(А'тв'МV°░4vb■П>·И░▀╢\Б. г ¤|ТН┌M>Xст╥4mF╘ў▀Oл─nDЁ╜ў▐╦Ш1cP`Р#╥КJуЁОК╢Ў▌╪3t═АyК╧m╢╪ё╘ё├O?дє═фЫ~├ЧkvЭ°╧║o╫iXкI*ЗЯ╖°[Ч.]0]=X╝nгP(IJў/Оk╫оёрOЧ.▌gЯ}╖├c┌╒■№є╧▀xу q xЎС#GаТ░єb║j╒к╝yєzЮг╨¤-Z8pА\f╬Ь)Д▒Є%Б'7gю▄╣ 8xЁрып┐╬пхЄргGП╢m█Ўт┼ЛEЛE7H╔∙єчёNиE$АЄРE╢l┘`║wя▐н\╣2JтЩ╓oS"y│K┘╧Ь9╙кU+<:╡pсBШ+|E^ыжJХКЄ╩'Вo┐¤╢i╙ж┬д%\A┌*╤zЇш1qт─xM!1Mи[╖n!vB[╪lШ╨UСO+7n<ЙФ╦Ч/ЗOзtA$╚8(.┴5ы╒л'е[╜z5VЕ`бКЩў¤№Bё▒9гFНЪ?>┌R4x╢iэ№╢k╫Ош┬М╬z>─tь╪·ИbCЗEy)*ГСшzф╜x│f═и`╧╚ЧщJш┐╨688жп/┼.ияtжpF▌¤ёz╗ГяF▐╫░{PЪм╦ўm╛}хЗQнЗ╔Z4,2№_С У9╒?╙DеЎJс/▌'J$Ъ┼С░@vа│ШЭ38<┴ЧрФЩШС╕ўvnжвТМ╗0/Юi┘F┬№▌Q█╖oЗ=BHgИ√╡i╙╥╧-Ь$_NтW╒кUCI╝СъжеHMaO"mу╝'п╖Е%╙]U╥м6m┌$╜4ЕZ│fM┐~¤╩Х+G│B°┘│gihЬ'"·%1A╕T%ХE├∙ SэВ>Tw╗О9ТV`&ь╝wяTп^╜hзДФ-Ъ╖HЫ.m ШиШ▐)v¤░╜▀ъЮE Х№а·Шыб?,■╧y╜kЎк\ыIф├ЗQRdHяУОшM╝Отп]╗╢OЯ>╘oё Е"ICщ╛т!cyKХ*┼SЬ╟╝ GСEю TыО;╩Ф)#│xёГя╛√.Blбф╫╟╪╣'3t Дs\┐~╜e╦Ц°Р В ┴o,X S8OЕ╓├ц!гBў-╫А]h7ц╦Чo▀╛}P╒SзN5n▄°с├З▄╕rх╩CЗёрЗц╓мYsъ╘йРrт И;бЙЯ│"* уG╜п┐■║wя▐Wп^┼,Т╛NЭ:c╟О┼╔E7x╞о]╗рj5rБ╣b4l2c╞ Ъ9rюпёхwщ╥еЭ;wоQгFы╓нб\]|Ё└дIУ╛№ЄKx╪Д Ж BsЭтЇ╥/BPoЁр┴З&GДHXBуДи╤й2tУ╔╨Л/Ж╤Ж▒ ┌b1n\▒b╖@Шф?╥╢n▌JvЫ7o.QвД *Ю├ф╤▀╕qг┐┐?ЎC╜ ■√ФH^Ў[оЧшН5║yє&СЄх}?С Э:№ё╟иБ'─c7╦∙╘эы┤B }л▌КA■√|!▀W,G╩╦?ЖжКJ9╡▌┤r9╩е┤R─X1▐╨ёh/ЗwКxщ>ьєлп╛┬╘ь┤i╙К/N[└ЖРo╕)▒hHHHїъ╒╤Нcм╩яГ(╡|▄а╜б;сУп╛·к╠Б╔╧y╗O┘хлBО9`ЎfЭ▄2А4·RЩшВ{ф╧ЯЇш╤$У╔╡шFжH^┐~}С"E√Z>~y╜Л=r№WX°ЭЙН╞╜Чп5юxЪ╥∙ПTи╧╧┘ёKАБGб<9╞S╟ ЕBС─бt_ёВ└■p/ИWPPРМШ╖\О╤Б└╚wю▄ ▌7KC┬Юс.3f№ь│╧ьЛч$иy╞[.ў"└Р0ЬБ9сLп┐■:D0o▐╝B4CCC+WоМGAGДМВc╟Обi╕JД╦СЖ█бя╝є╬║uы┌╢m√Ў█osс>~№8W (sB╬sє╕Ш╟╧l ╬G.0~ь o╟Сs9rдLBхjєц═H.rWXXDЄ эЖ╣z2Р┌r╡^ш~╫о]4h∙F`▀╛} Б░єь┘│сs .D,Ц7n6бнЗ9ЬбщQГдЗ·╚K_Ф∙Ї╙Oч╠Щ#у╦IЩу$-╣vэ┌Rбq_П=FМБ@▒0!╢-WоЬ'├┴═Pr2BУAГQYЄ'9┬П╗wяN\A╫ГV─3░^╩ qФYhЛС╣ ЦЙ┬╨═°g X╬gt*зu ╟█╨¤sO╬цOёш■═иG^сОР╬s╩e+Я*╩█╦с▐Ц╔КжоМРБёгaо\╣Ё%:1·Ghўў▀OрE2AЕФ}YГHq qЗчU-Z╘юcДг▄ бЗ%?╗27>O╗ук╕Я╠c┴°x╥▓e╦ЖUс╨┤8???BkЙ1h t┴\┬╬х╦Ч_╡jХ|вЙ╟t.Ч╗rх -И┌б #НАРQ╪║uыт0"GКp·Їi┬ RЎь┘У°p3tцСАrl0╨ 5h╤╨¤1c╞Xюn!╬CE╠E▀rы╓нEЛн[╖>cжь _б╠Нk╫я╫│╧о╢Ї√┤?t?╖у╒'▐бa?▐_wLГB═,/╟SпиQ╛^▓O▓<Уh88░╥}ЕBСьбt_ёВР╖ьЮ▄2ШG╞п├└d0╧_|!Гyджа√UлVЕs╚ZЩ╞]TЙЄv_ШЇу╟Пх▐єч╧├>я▀┐_╢lY(/·X." ы║o╣╜є─ЙЁЫ№∙є∙хЧi╙ж╜vэ,ЯKzNr/╝╝NЭ:Ы7o&ё╤гGлUлFl└UЩ°[.g╚7┤Oц░ттт├╚ с╕SзNУ&MТ@еf═Ъ%KЦДееIУЖВИлOЩ2eш╨б#щ╛`┘▓eDН7^│fНL_ЖЧ├ябM¤√ўG╘╘йS @╓pP!ЛсИхх9 ъ├?Д╥&ч╬Э╗a├ЖЗ╩,R)W╕ Ы6mВjЛ мдD&9▄√+╔ ZИц[o╜х ▌Ч╖√▄Л╬dAO!УЮ,XЯгЩCЧы╒лЗbя╛√ю╔У'■цЫo╩LbaкЮX;7i╥$~╗╣є№W° ш■эИ█cъwMЯ&█╩╜Я▄∙сцР╓гKg+эх╗ї.?^∙ж╝uж-╝ў▐{ш╣e╦Ц"EК\║tйe╦ЦР]тъZ<фь┘│╪█BФеФОЯб{е]<█╗Qш╛y╗▌ЧЕч-╖┐ ▌╧Ъ5+7Zюй┤/^─еёmN'╨ ░'═h4I╞п╠╙%р№фУOd\╝┼┤\tХhk┤i° ▐Л&ж╙ЦЙ┤ўт┼ЛИ╥$э{,H;▌чк─КРя╤гG[╧мэ#yс$·шгёу╟ўь┘s╞МЮМм,_╛Ь@Цi├█╢m[╣r%'3f╠И(H3Dр└Бєч╧'Ци^╜:1╖ бq╥ ГГГйЪY│fб$╡}√ЎЦ;╛В╠┴зйPт╤ сЄ┼А╨BH$ч%^"Ф*Sж╠sЪ░╜2кo▀╛З▌ЪSш>╩аRєц═й╛Н7R 3╗Ф"╠р ╪╓║o╣зъ■╫╙ыm■╧а{ ║м▌дВБ┼╗уИzЪ9mюTЦ_jД─D╙ЗEy{y{░ъ╛t|xя╪▒c╬Ь9▒сД иh"┤їєєЛvбEЛTНРI╧╫nhБЎB╚еgщ>■№ь╪}╦Mў9│ЧМ╩:|°06ЇўўЧёuЁЄFН┴Т╔С╢ ─хH|ўю]ЬБ&,·у│[мє╦`┼╠Щ3═╘ bH№M&╫Jbшт);▒БихО4Ью]xЭ┐\ф сD┤ЭQгFAўЯэ█х├╣▌╔')№│Iг& Щ┴/гoКФ  И╪{s╧╨╒ой║═[С╤?№ыJ╢фNяХ.┌':╥ызTQйн/Cў╔о[╖.t_╛'( E2Ж╥}┼Лу▄╣so╜ї{HМ╝ Д▌B▌ :sч╬нUлDG\'г╩y╕ТШзl·Їщ╣ЭzЇїїM╨╪}*]жЮ={т.S!LЕ .)R?│╙}x╧▐╜{х═"фйwя▐ч╧Я/X░ сь!D&┤Б═Ы7Ч,Y╩[нZ╡ъжMЫp0ш~х╩Х  [(,oФ╦хвввф б,G╓%Д;v,╩┤j╒ цj╣XЄб╢╨&H╬╧╔%KЦpL2°"7zЄvЯ4dД╠AГaHХЁз█╖o├8 ?иlF] СO№iДb 8",кqу╞Д0{И5┘│gЧ& чо{ўюQ╠Х"E Z+a№М_╚Х(_ 8CJl[▒bEOкU╞dг*ОБСєф╔ёк]╗6ч/^L╪Г;бs│f═╨ф╠Щ3╘2YC4й,Y/h┌┤iШNtk╪░a№єГЭ0yШf°ХЁ ▌Ц{Їя░Еm&xеШ╙схчУ┬╦;╡#╞с;ф'╩щЁЙЇЄЄdУ-ё.~Й~!╕ЇnD)ДC╘╬╓н[Л-j^l┐ё╞xя╟ ├Ц1·7n▄6lё$┼б]╝∙цЫ▓{ГH■ю╗я08■МJУс┌Ф╪Vш>#нO"╪pп^╜╛ ■{И>╥ х^b╖:uъ >\ТЙХp~ъОВ┐y╕ЗNN-╘мY¤╫о]+Ф]&RЫBвbКyщ╥%Ф/[╢,Nh╣!и-+еz=│G2╖PГ─u=zЇ└!e<ЮD╕б╘╔У'ёIl{ы╓-ЫШ=yЕЕЕ!^О4┬Y╒■■¤√░НЛ/Bюх^g├/╤ЎUЕ╔6оo┐¤6TїЛ/╛АФуД-Z┤АS=zюО┬-И+╨Ў╖▐ю╦°JД[├╝eБЧ р┴ Rп^=H?%╛Е)ИЕ8Р/( GЧ1╨JсЙccj╪$a, Xа@HШLа$nAи$F╚Т%╦И#dJБF3█РI ║sч S└╢m█Тr╥дIЁK +сН,╡Д▌╨У!┐|∙ЄУ'OF$ЫП[и\д┴ЄсЪГC╓KЧ.э╔ cёш>╖У>wю▄dJОХ&LШ╙Х╪ЖП:"Ш┴╝b╔╗. ?l╘иСGt▀∙ЇF°ї█f°┐г}г2 3├+╛п№є╟Ўп╫/WЖ╝йЭ ░"^▐зЧ3╩эcy{╛═Э╪W_}╒╡k╫TйRсУ▓·кL┼!Д┴Ы доЕ&eГМPвD BЧBЕ 5m┌T╢N├╪Б° ╧С[2f╠H╪ЖХ() oзЎe∙Qы╔F&НЧFDO]о\9ЬЯz╖ў╤╪У\им-[╢xЄ)Uс╟'NЬ@╛,Вї'ЮФ ЬФN ▄╣s}·Ї┴=?hщдФFG ¤[я╤▒-┌╜c╟Z%%ёЩbR""\S╧Ъ5ЛЄ╩╥ЩTН3╥rжp■╦∙яу7N╬■╧├.жNЯ*¤?╙g {еrЙкНJ7√З3НЧхх┤Ь&#)щ▐╜{qWфм^╜Ъ╚┴├*V(К$ е√КЎя╨б├щ╙зy╥Ы3╘риQгx|Bб)ft2Б)-ЫЧpХ─єч╧ўdнt∙P'╞ЗZ╖n 7ЕтРEЎь┘сЕP%│ФЗх·°┴}Їшв Ьщ¤ў▀7n|┬4d╚ИД╪rНFX╛|9¤ЇS┘ ╔T)93qтDy┼╗pс┬RеJy2v_(яА╛■·k8тў▀р└╣ }╟М2C│lE╤}╚╕<Ё°ёуk\ }№ J:ншШ╚█?▌Щ▒q╓=╜a¤ДRX▐пDеэ╤░g■,R╞дЄq╞kзWL┤#┌█ЄI╨о║╫п_зPp·4b"[1И┤ВSзN╔"<2n^жRРЮФ°nC╒╢5o▐ЬТ╩№o√D ╦╡U╢┼█х═7┴*═╫▓#^еъбЄ°╥и8∙ьi╞еэs╩ILS%SZлЗГyЁX№/Тq;№▄╩Б%┌Щ№т;[Ll`сx·╒ЕCkwн√╤ў╟Я|~К▒b^∙1eїR5ХkцыLххМ▌<┴щpZ?>К¤wу╞Нt Х*U┌╡kЧ'Л╞* EТЖ╥}┼ ┬РWS 2ыФє┬f,w= p╕V√Ц@╚БРА=kНУ╔░s rДКX┘╓ь╞*ч═]ЦЫ1╦╜вЫI`8Цмчcv╤▓ЮЩAh .DG╘zg▐#╞╔T┌Жс╙b@╬└дGО Э ЙAI7╠r%Тг(i8t\D┘ХЙ3E╥ns,E╕сИЖ╜I╛▓Ч░9o " ╪Ф|~m ёХмНЗp╗iг╢yЛ,7r,│Иp6lш┘·ё╬з^С?YСV4╨╟тп fяэcеLi∙Z▒*─▓├G┤WB▐ю ПS┼ж7┤lНER▀s║ц╬╩z┘ W╝╤NЧНL╣Wф8▄Уwю&/уx&Н╜Fb▄<ЫzМ╧n1R8Х▌█э$C┌─R.бцr╒ь╨№,дBWп^M<Ё╞o7РЫRXюxOЄ2·─V7v─81Oни╦∙╘КМ&░^V UЩ2┌╫GЦ▐tp6:VМ3VNhh(Q╙Ь9s:vьH^║лоBбHЎP║п°╜РК0cс╛BS,7?6tP╬█∙eBє▓~∙ь╖Y3z╪щ^Ц^8УЭё ▒┌dxЙтtп▒# │/є[░'0┼▓С-г╝╜,@ЎZ╣rх▓e╦кWп>sцL│@чo┴ь╔зЭ-[#z6k╗Ic_S%N╤Lщ$YЬТ┌г╗щ<йY├GM.ЎZ░▄cr7EР╧Я? °ёc╠╡i╙жёу╟ўы╫O╓╗|>Ь1VМЧ3╩хэЁК]l╙щвА^╤QОHo╦╟█ ┐ўК╜/╫м┐ў╡GПq b┘*E<─╓/╪AY┐МНMтЬ4А=░╖И8СЮ]█чЇ╖ЎФЎ?эm9N5┘│3w┘{ГgaBИ╔У'├°{їъ5c╞ УXL─/ ╠Зw√Н5ОCЇЫ│k¤╘╪б;^╬╪ EСг+^Г■[─TЦ3:╢д2-╕~¤·6lpx░чАBбP$u(▌W(^&ИО╓п_▀╡k╫╚╚H!▀m┌┤Y╝xё╦╓ы/ ∙ц╨гGш¤v╦Ц-█ю▌╗ .ь┴╜о╫ї╬_№чЇq┬°╜,╫G з;Л=╥ц╧А|б?'шЭ;wn│f═▐<√юч·ч$BsXу╚c╚Nр]█'8╣╗ХBl\║m█6т├*UкМ7╬·хТа ЕBС,бt_бxЩаю▄╣є├?4г5ъ╓н√[CЬ╪ ╞F╖"яТ╙жM╗d╔цБ╨K┼ўОёу&Во^фч╛D{ФЧ3И+""В╕ЧГ.─ч╧OЗeЮ>юRХ▒▀i▄П │Жgx№°··╩@Jў E▓З╥}Ете┴мDЙ ╦`hY_RVчT№дs Чё¤B1Z╝л╞╬╓┤"cчn╞x[об:╨■HЗху┤╝ЭnВшpНHй╠Я3т╚>Ї 9█\№/Ьц_зхИv¤уК▌\єн~сяЁТZо/;26╧мjЖР) E2Ж╥}Етe┬МЮ╖OP■с9ь¤Ойгc∙╝╙[nИЖ ёЗ╙бt %┬Ll░;┐G▌╗є▀т╗╚╜╙╡цжC╞e╔·Ы╫Ш~╫ ы*ТЧчєL Е"ICщ╛BбP( ЕBСlбt_бP( ЕBбH╢P║пP( ЕBбP$[(▌W№Б░ят)KЄ?zЇЯ3[╠&tР║╠gХE╕CCC9уууГРААїЬн| ьЛ╙[юe┬╤э■¤√~~~i╥д▒п╘a▀3Лdс.pМп╞h╓8чўс├ЗR:вПьа$╔╕КТ┤│8║╔И줤¤ ╟6k┤GDDH╓№I#вщЩ¤┼<й з"Н[h╣┤dЪd┌┤iуьтdvXУ6П▌░Ж╜▒~╣─■У'OH/+! ї╠.i╥бР@vдКгvУў╦n╧.iOЕFFF···вАьп,Wkгх80ДЕЕ=}·Фє╪ ╫5М ЩХj0е&ke.{Q[6євШ}с|дq┘wе0Ы ЗЇf/SkV╜▒r(ВИE%К`╣'ЯШЦпYтьЁг fў╜TйRQнvЫ╚Ьl:┌Wум╩/ pLq9▒'IМ╦Y╢Ж,2ёFК {Т8((H6w╙gКBбHЦP║п°!Ob|E╢█╝rх╩аAГЁд┼Лg╔Тх┼т<╕vэZзNЭДy╧Ь93sц╠Ц{▄ч OE%ё~aзNЭъ▀┐╡j╒BBBь▄WИСРN9rd╚Р!Н53fМ]ж┘ХbЮ9P∙ ф╔УGzXЬЦV F╢\ J" їrх╩e╖С▀Я\└zxп╔в`┴Вєч╧G╦Г└Ы╗d3,°Ї╫_НЗ#Д°чЭw▐?~<5e╕rЬэoЯcy ═p╧Ю=У'OЦ`П▀жMЫО9╥r╡S|C║¤3g╬╨ЪЖ┌░aC╦Бї2|°p╚кMXGBmQПK─Б8@CрX╩N^uъ╘бшвЬ Е"YBщ╛тД Ю╕д▓x_╝x1_╛|░:ИЛРЫ=_ё*иOч╬Эa╠ЄvЯ6■P╛|yО9<ё єк√╝}√6т╨Д 4╪╕qгЭюУ ╩√$╞@2╠у·їы№9o▐<{1E&╩р┘}√ЎE=ШЧЁmшTнZ╡р▓ц └╤гG+Wо╠-Р<#ДK]║tБВxЄБ"б@▒ 6@бр║Р╠u┘▓eШNИжЗ№МR@╦░ТхтЧD5ўю▌├М│f═▓oPJbА╧>√L▐│bj й;vl┼╕JП}\╛|╣d┴ЩААLЙЗтЫ7╙*T8~№╕0c╙▌p@ш╒╗woO(жчMшЭиk xўю]бП(Ь7o▐┘│gЧ*U гЩM^Я/JтЗ .PвGП?H ├╔аа ┌┬Їщ╙_{э5д ┘*OМA░qу╞ Sj~╙зO┐uы╓№∙є╙Ф0DЎ╦/┐Ф╧ R5TкTЙ╢Р3gN }%╥╪╡kж#╛zїjjРАЬЭ;wжKЧ╬ЄАюУ6╠э=zЇае`rDaZ_э┌╡╔Q╘Ёд"$RтW"m°4]Ў╜n▌║їЬ9s(╤бCЗа°Kг├еKЧ8OKСпf[оFНep9Ъ│П \"=е√шгПИ╧╤S╩HC└БyьсРR;сссHгFН"КРfлP(╔ Jў Д╗ 0ВKeсj0И╚▐╜{∙Х` At╩9ш╪▒#Пчi╙жY.┬t·ЇiАВ NШ0бtщ╥ё>░Еiб&┴/╬ ╛|∙r▌║u!▓q╕/чaУenфЧ?;uъ┤pсBУ@╞q \дIУ&─я╝є№Ю6CICBB^}їU8ьJЬЎЁс├UкT)Pа└К+d─ВhЕ <╟∙_7o▐D Иj.┼Я?■┌╡kсФP+xd╝BМ▌ИI╢m█&яJб┬Ф ╢lмСK├З?pрАp2А :Ф{эеЫАRг[ц╠Щ $Б.X░цJИВMиe║Иъ╒л9rD╬█╗(ЭьTР(пfЭюE!щ╢ИKёЬmЇш╤Y│fх$j┤o▀жH▄Є▐{я┘Зт|°╔°¤u!╗УЄ╗я╛ГбТKбBЕ╕Д▌Ё!╕┘▓eУ▒(╘Q4;l╪0);})╟ч╬Э+Y▓ф║uы2d╚ ▀h2uъ╘бэи#═rПВ#BЎ╨n╚Б=у╧дZ╡jГЦ╓═┬-ВF84Є%ZєdlШШх╠Щ3°$╛┴╜-[╢DO╣Дaе-`Ь!CЖа< є╠8■№▄╣sqSM║єШбСbьЖIюKЦ,сГЮЇ DтlдЬ2eJ╣rхИ$┼9Й╡>¤ЇS+ДмН7Ў└G Е"Й!I╥}???ИРG 9e╠Ш.┼Г┴lЫ┬Я<д=См°s└гоq∙№є╧a-V┬G_└╢+Vмxёт┼o┐¤║,'!┘<щ!RpЧ╧>√ Zц╣@у╡SHL╜zїxЁ?G+№╥uАt╞"Ё@╜,Y▓|ё┼Р!"p6a L╥ї╒WфUдHдA_`Q╕1ЮП╙К┤DQ@░ё┴&-Z┤цD╙%╙O>∙д ■ўя▀_╛|∙√я┐Я╨║║Жdh}╧Ю=Ею кТ┴Й7H K6i─n\нY│&─Ъ@ -/щ1$r№°ёЛ/n█╢-╔`r5j╘°·ыпwэ┌ЕmCCCE╠Ш={v√°ї▀щFp3▄[э█╖/OЮ<2д>""J╜j╒*z└Э;wVиP!▐qPЄ║▌ИEQrўю▌ttЄБВМш"▀}ў]bN<░DЙxЭс╥еKс╕┼Ку$Є╤┴>─И4tйшЎ°ёcЬК╗дьДм╘)FF>:cNR╤─uP|B╨;v─й>│Ё╝'ь_%LMЭ:5=-ёб╪Ь┴ЛNЬ8Б|ZЯ╚ёp>6\┐~='\Я{б°ФOвТ▌Uq╦█o┐Н#╤═\йjД  ╧Ь9│TйR~Я={ЦВя┘│/%J▒╫Ф∙T┼1╩0@"I┌H╝Ъ+ EТCТд√\Z▒b╧y▌╚o∙ЄхGМQлV-∙р╬Щi╙жїэ█Wb■еЁ╤}y gВ.@`9Ю L,║/nyь╪1Ш+■a┬ЩБ┌кUл?№0wю▄ ¤тс ьt▀(LF 4╪╛}√ъ╒л[╢lЩPЩ┐Яю[ю/┤\8╠М░M╞Ц▄╝y║ПbKBўIY╢lY▀╕qур┘Р39I(5h╨ *=├д_е√Ц█[шd`╜P^╘иZ╡к'1ЖРuм$▀FЁз{■1ь_В.B─┬Е ╦ШЯ╫^{═▀▀ЯЁжyєцx5ФЭ?_}їUл вўДб┬ХQl·Їщ┬\п]╗╞Idв_жЯтБР`·ы╞Н7l╪╨щЪяыччG,a6Чїd╘o╤}.m▌║╔t┬─l в√GПе!а ╖i╙╔Є┴!Wо\твжBЯCў%YSЎ╦Ч/*TИ╨╕шjИ%hYMЫ6╡l_Я╚¤╤гGч╬Э#%ny№°qЪЦ─у╒\бP(ТТ▌ч╔╟SБ0ДЮ'┘еKЧ╕лEЛ<-xЁЯ└w╫мY¤6l№Пєt +Wоф╞e╦Ц┘▀юC41Ъ╠{FБ7n╚И,в}║O&{В▀z╗/▐BgЕ&╘Єц═Ыk╫оэббd▄┐╝▒ К▀╡kW╕■Ыo╛)sp!╕4У%Jр▐Э;w&цблEHЖ и╗ *Pvь#3\бь\#SЬРЕё"ys/tЯ~";d╚L─╜Dsц╠!|r║g╗╛╪█}▒]Й╧Э;G8 ╖У ОЬД╘т║0~╚╝9╤Э6▌╖▄MМ▓@zh8═Ы7Ohж┐Яю ¤ц █[╛|9ї+@ЙФ8└ f0q~П=.\╕0n▄8xкх▓фМ3>■°у╗wя~Є╔' 4°Cє─╕ЧМ$▀w▐yчш╤г;wю$8ёDЪщНЙш!╟2uо%-X░ад╟=а√▓йМЖПИИРюq■№∙°?*a|ZюJGl╔8Й ┐Х+WN:@LZ▓d╔█╖o√∙∙.\▒Ї┐wв&|╕xёт─ЦЮL╘~▌╟я╜ў╢вїyNўЙ╥OЮAЇр┴Гъ╒л├├О;╦JM.░ЬкUлтHЦ@B`╓О4gЮu-бqp/иЇW╓Ь1║Щё┴"gы╓нp,H9,╙░╖ўТ▐ўъCDбП?ц$─Ф_h}│f═Vо\)╖╚╪ы)R╚Мs╦E}&NЬ8a┬Д:@щЭюOЩ2e╚Р!░Д[ю0∙Eл═Ы7Ы7ш╞DЎ╡etЬжdL ▌1bЇ ГШeRМe #ДoMЯ>ЭРRelу▐yА╗акгGПж·фЇо╢j╒*ш>M[Т╤K╚тПШNH^xx82ч╬ЭKн5l╪0▒ьFu ъЄх╦2Vнdб╤Н║Гї╤э▐╜ЫГ8ФT|&╬ЁibvJКЗ\┐~}╨аAФЕЖ0m┌4╕╛YnИРжHС"■■■╡k╫&Юб╗#ьщ▐╜;9╥=R_$ЖЮ@r┤h╤bъ╘й1оїу▒U№▌w▀╤4╢m█&Уzс╗еJХв╧%¤дIУ$"%ЁУ╜$3─¤∙@∙╙зOS/шsш╨!Щ█-%┌╛}{▌║u Б0Фйq)О1И╫3ЛёУ9ФСє╪ЩJфA@фЙТ─oЭ:uЪ3gО╜ё:\K▄эрr4@╙т$┴┌╡k╣{RL}4╧y'*KЙ/]║t№°ёBЄшЇГГГ YyО┼Я3IQ■Ф╖√╘Є■¤√Ею{2h╪╕KН5а╨nD!Y╓yФ▒√AAA{ўю╡┐▌jH │лЪIБ√Ўэ#Рh╨а┴·їыэ>cчпzDH]┤hСY%▌L╗Фe╢е╝║ЖIП3*ПЗs╦тГ1ю╒╨эLhЄф╔├ЗЗ╒┴{=FЕ 8&5─Є^ю¤Ж(/Ц\╛|╣ЭхШВ8▌Ёrяue7Л@H<ЇK╘ЦrЙ╤$╜H#╪ k ▌7Ч_3¤юЦ{▒╒╝yє№№№.\X│fMсўf(╦=■Д?{їъEJш>їТ(#1╠╫hw╡j╒8└>o╜ї¤ЭT4Х =ЕjCў _Я▌Ф-п5╗\Iи░k╫о┴Г├AKФ(1k╓,ЬVv╬2[Рo╤вEЛ+╢e╦ЦМ3J1 Хб╘x;m'_╛|шА єч┴Гщ?Е╝Т┼ёу╟ GЁч9rpЮ∙═7▀╠Я? Ж dсWТq╔шl!шфю╔rвb2~ ┌kпIыцOЇ─С0╤_|!юpo]g|gfW ┌▒dЮ■°c┘пХЁyИЧ╠GGЕУAp!Фb■№∙ЙNў!═c╟О}ЇшЄaK┬,я▀┐▀вEЛ╦Ч/├╘eIУ■ёу╟wю▄с :H?√║┌╝Ш7QКмТn╝ШBм═1t; 6М╓j▐╚Ъ▒1╢ M EO8оGПDЄ╘Э╙5╜Бxe|}}═Лp·rЗ╧н[╖оY│fЙb+3hЗъГIц═ЫЧpв`┴В▓Ж{ ¤ўЙ<щ┐╩Ч/o╠┬╒Ы7oтНЇМ─ЬЎ N╫╛H&0`АьЗЕA *фt/O$Х┬яХ+WpE:▒еKЧ┬√e+и╧? ╝}√ЎКh!88Ш▐│b┼КtмДY▓d╩╦Я╨w"7Й{щKNOMЫ.]:В"y▀O╖╔]н[╖ж\4Ь 2xтoИвЛжрзNЭj▐╝∙Т%Kф.дaЗ╤гG7l╪p┴В┬з ╧д╚ФЕ?e,MЬDИB[зk│╢"EКPЎ{ўюQї─РЬз°╥╛╠уАЇю.Л╔Ox ╛═UУq $└Ча√Я~·)Нл ■Ц╦▒я▐╜ЛmeЖПР~╝И^ `(▌W(╔IПю╦`$BG:─├>OЮzЇ(,Р4х╩Х#2t║Ц%▒s╚П┘p:E▄ўхFhР╝Й╟ЕЁO╚1ЙсDХ0вJ]НзЩ)#o╣(,)бкР~ ЗАpп=|°0$зХс@dБV╦Ц-уOZE9rdв╙}ЪНm╥дIo╝ёlI',j┼ЯиGЫ▓JY╝x1эHцЄ╩ШК8tk╚FдФ╒╩GНEiwЖ1У юО═Й (c╫о]√їыGu@╢d├бА┤eи├дэ╪▒Г°Х`ihKg ;sц rd;*!y3g╬\╗v-Ўч╫├ErтЕ─`▓b=*:├√q╕2кЖЗЗ4шр┴ГфXлV-ТЩРХ М`┬3д▐roс [m╥д ■Э┼J─е2╣V╥`y√.╗├"КШЦФtПx╗,;C┘ h Ёл.]║└┌▀yч\ЛВ╦║√4Д█╖oЧ.]-лСї╬Э;[╡jUгF B>RЮ?╛wя▐Pс*UкP)hы╔bP╚Сi'Э;wц 4АaC─GМч┐╙╡m═▌<Иrq z№ ЫРЛМ√B╡П╢2LО╢CЯПйЛАА4╩NNpH^╒кU├ 'p@ЬЖ#с∙┤nдB|°сЗDї44у╒T(╟╬┤}"є▀яB ЕBёWC╥г√Є╠╪╝y3Э>wё╪г7ч╣ -h┌┤)╧┼└└@╬М=ZViHtцдЁцm7╤я╛√?А№ё'L╥у┘░aГ,qш╣@h┴C█╢mх╡╜╝╞[`W°Уl-d├н▀zы-оVиPa╫о]тv╫Bnsя▐=n ▀В@pcЩ2e L&хХ+W %$г$├c!·HлX▒"|ЧЩС"АЇ$·Є фEcБ█Aж╔Z г╥┤i╙кWп.╙:MbТ┴/IпZ┐~╜(i╖┴╠╔rE8p,t╞&$аU┌W.ЗT┴5╔СvКЕIГHя─Pц tЁЛ/╛н ·(CJ"CX)$ўbш▓T╖ЩN ─СЄбz╘]в╟ЎdtЄф╔!CЖ\║t╔К^о═t!ж░j╗;╤ГUкTщц═Ы8!,╢PбB╞Ю╥9╓йSZ╔╜3f4CwШ║МЛўJЁIx)~┼R┤hQ┬Ыb┼К╤┐I+ $аY'ИA ─К Бъ#Щ~№°qа░pтBч[╢l┘yєцх╚СГryb7з{Т !╥а▐eЭМ▐б}╤·ьщq~тZMЮ7ЛTHёOЯ>MGН┌2_?▒\  .;W╚Ь=╔Ф╓╟cВ║ж╝}√Ў┼┴,╫єЙцF№Oєс└,JbЮ[Ь$а┼┬ЦЛю╦aЄзЧ#A ▐.■жP(╔ IПю#Чз▌жMЫd/IЄр9┴├ЖоЯЗЯ╝Eу$Wy&щ█¤Чс:P▐я┐ ▐ Ф╖\.┬Sy╒кUfAеЙю█╖П·╞I Бqf═Ъ5╬Z{GПх╬ф~цуВ] 1╝є┌╡kЦmм9YФ*Uj═Ъ5┬Д8sїъ╒Ц-[Bў═$W9Q^░`Бaэg╧Юm╓мЩмЬH Им|РьДУФ@h ^Ц██I W╬ЪшыюKб╚n╔Т%2ССLбYpJ╕iъ╘йуШЕf▄╕qдй[╖.▄╤zfу╒С#GbOє╩▀Ёoи\═╠░Дп╙Є┼bЄЭD║Ж╔У'╖h╤B▐╨У 5а√Ц√e?5Лщ dT║У:т╞БB·EИх╫Gvд%zcЧ╨J*ФP[MЭ:588ТMGd┘цuр$Ў╖√▓iЪхz9└Ш┤зmц╖╔И╨wх╩ХEКС?щ1я▐╜ЛУ╨П┴АIЩ)S&┘@JV╥Ф╜и8АщфБ?[╢lsц╠)\╕░}MRСvф╚LF╨╤шh2№3╞k 3┬MЎ<ЦюЧУUкT┴0Е─0ж╚N╫Ь`╝Ъ@%Ic¤╥Л$k~1,жы▀┐┐4ГPSЦfТК&BЖюKи/нC№ЩJ!Р0cyвl┘▓6O#ТI ДВ▌╗wЗыуKвТ╠╟Э1cЎ▒З[гGПжюxдщBЬ Е"Y"щ╤}╦5ЫЫс^Цы∙AJ╬▐╝y╙ ╢ц┘#р/ЄxцА':`9)\Yж\C╨e╓╡ЗИqoмЖF(&grч╬-2эoйЭої^p0╦╡╥оej/А|▀║uЛd╞╣% ┴|╬ЁxX┬Э;wHf╛╚╦HZЕ m7яMС&dЪdPl`Я`ЖYK╛ЖЦр┤bЬD $eт┌ВHБы w┤Плц*S┌mSЖЖ╟Й}|°ЁбМЬ6#щх╗ еЦН{-╫╟r┤l3kЕиA^═kTю║}√6=АЩ=ЙмaтoLGJЪ|1 ╒*c`,ЯPHCq(пмт┬╔9r╚√u╗│Yо╪?╟`ЩheоЪI╞жШIц^■Dмl┬ ЖТ!dЇiRY^о¤зф└┤r$^5┴П tФ!√qт^y Нї$/╤0╞╢щ╕З.':#К|%Ц┼Е╠─YУ2┌В4╗м_NЫзТzд9PRКГL ╠Щ3Л┘е{чa#3IьЎф6эKЮ7(FMЩH└ht╕'√rЙ т▒d║&Ш+W.,зB Е"┘ щ╤}║iиy +ТylЄ·╨сЖykh=єVRёg┬╛т╕yтZ┐м▀Q[єК╤i[S╧Ь▒~╔∙ЬюIРЦ╦#c~mQaf┴Ps╒╛╢жх~Ak|╔3HJ√└w/█БNўцйf\Щy╫k)k╖L Nў┬AЎ║╚ЯvцgJmюu<│╚Хh_╞╟╒ШhКi7Ф=~p┌жэ ╞nrЛ№i╢й2e1,є▓Ы1ЧYd╞hkj3О▌┐ЬИlle╫═^уqМ,е3TМ{йY╗Сх}╢P|{Рfм$aГ]╕▌>"┴·e;К7R▓ ┤ыcBb{▒╖Ц{║vЬ 2QР `╢хк╕*СpЬ┼ОМoШ[╠w9c22╖─i┬E╪Х▒╦╘чЕBбHЦHztЯKd, Ц'·╙]бP( ЕBбHNP║пP( ЕBбP$[(▌W( ЕBбP(Т-Фю+ ЕBбP(╔Jў ЕBбP(Кd е√ ЕBбP( E▓Е╥}ЕBбP( Е"┘"I╥¤TйRЩэfьЫS:▌╗¤ъъ╫Йzя▐╜└└└мY│>'Ё0╦i▀┐Я[0JО9■И¤┐"##п^╜·ЇщS╦╜аuю▄╣й│D╧(A0kcг╪х╦Чe vОeГ4─ЗьЛs╟+╨,▀qётEйqdR▐|∙Єy(─ОиииKЧ.╔ЮY╞СP╔▀▀?Wо\╧ъoV=e;єц═k_╖Ы▀ЁЁЁ+WоXо=ВВВ(жY_ЬЎv¤·uСlVdAJ▄щПb┼),ню╬Э;b╞Їщ╙g╬Ь∙ЕЫЙёэЗ╩■MV┌пжр°?)9HЫ6mЎь┘эrh√TиYs▌▄Ш1c╞LЩ2Y┐\С¤╞НЇ>"У╓d╢ы╥р_бP(К_E╥г√Цk╦w╚ #╬FЇ┬`аq╢┬ID╚Ў4ф;uъ╘щ╙зwэ┌ї├?4[╗?Ы^ЎЛсъМ3╕Е3у╟Пo▀╛}тn I┴?~▄аAГsч╬q,Ыьм^╜║b┼КЙ╛╧hВА▓П╒бCЗ┌╢m&q'!Ъ!!!o┐¤╢ьd)5o}╔╢м°╠┘│g{Їш┴1╞ч▐№∙є╧Ь9│DЙf7+AМ╘▓eK┘а╫юKеKЧ▐┤iУ┘CЧРаY│fe│┴E└╬я╛√.Nl▀W ╧№Є╦/xўю]╬7j╘иWп^4x╝Р√У'O6l╪r╧-▓├Ч╕1Цщ╘йюЇGьїC╛┤є[╖nэ▀┐ФpЕВП=:MЪ4RЁ╣К°<7тxєц═√°уП9╞,X Lд$fБыЇ╤G+Vм└hн[╖Ю8qв╣Киў▀▀╛}ў╬╗╫f╔X╙Н1┬r╙}ъЭУ}√Ў┼Ж"ш┘│з─╧╧я4 ЕBб°█"щ╤}4&cи╪Р!CД$ ЧаIУ&У&MЄєє3o·ЭXЛL(l~▒УМ~ХвЩЇєч╧ЗZ=|°b╘еKЧ─╒JX|·╠Щ3иA ╛{ўn╚h"цЄRИ>нZ╡·цЫo▓e╦&>─yLС3g╬i╙жUиP (QA╝йkКF-Я>}:UкTby╬└&Л/>wю▄b┼К Чїx]═Ъ5п\╣В2ЎНrKХ*7хМlSJВJХ*ady√. ~XеJ2ХW■Є═ср┴ГЁQ─RXсмxєц═ ЎРCIА(ю%G├Й\|r╬Ь9KЧ.%jнWпnЬаLe8MАшz╤вEЁoЪ^у╞Н╫п_/ d ПЇ3#GО▄╕qг4■о]╗biJhBJш■╛}√╨д~¤·╞Ш\ЄўўзOРбV7o▐Dyт:∙Мc╣ЪЎ░a├■{╫&E▒u╗:╬╠fXТСи `─ &PQ╠9TDPPQ1*╔ЇP@QQT└╤fT▓фЬvaу─╒ йо▌f6Лря·ъ|╕╬╬VW▌║Х╬╜}л f-жt'$>░J°wац╤}фЛu=ЛMЬ8ё▐{яэ╓нЦ▒xёb0 0lЁЖkп╜╓Пьчс╘`├~Ю╚ї┴#~   1╕ЯR*Нm└Ч╡j╒ЄwГ6A_\q Ъ°▐─ў╡├Щ╚КЯ▀аDPлбCЗNШ0бo▀╛ЬБ╟Ё$юpEЙ№дЕB(╫П▓╪▒cчЇ~╚zу╤∙\T╬РаkЁ╫∙єч∙хЧ╔┴<~|9o?├фw и wЩs╒э╜√ь \рю▌╗/_╛№╡╫^;ї╘Sб44ЄЗ5r╟w$Й╧? ╝]╗v╥╛_AT<╬╒5i╥ДыUЮ>}:Шш5X#╛▀w ╫п_▀╡kWш№Ыo╛Б╬╣█6Г/О"╨╡`;с{$C╕ъаФшЫ°∙█o┐!7я╝єN█╢mС ·┬ /Аёг╤╟ОЛзP0WЇ░о|иЄБ╤Є╨CёЧAыХж╤Г>xцЩgв√Afn3Гю>-╛~сЕVЛюCH( ЎМXШЧш├иуUW]у═O├╟4cц┼_ДСЖ_16o┐¤vЯюKЮ▐а4(v┌┤iш*А\>Hy?─ФqуН7" *╥гGю▌`E@4:└9чЬ#╝√Qєш>wйвl╨╟[n╣х№є╧ў▌wy─21b╪?,Ё~╬├"f═Ъ▓┼∙ЗфE-#к─┘-ТБdрё7▀|єХW^су!▄7 Є╦/Яr╩)<`ЬцН7▐рAHГ|Ж V.шЬ√ЄQ╔чЮ{nЎь┘╚╜■·ыёсСG▀║∙цЫё8 ТеKЧтK&╘ВУKюЕL└╠sГбf╝`┴╛зУЗСр┴█n╗ ╔PЕdвlЪцщзЯ■├?|Ў┘g`Q╔Rqфхх┴╥╕√ю╗Wп^═█ЙчЖ`N0к L┌°u ¤ў┴╞P}юс▀╡¤щзЯЪ5k6c╞М6m┌ps╡'LPI<[в ■иNЗPP▓У~п@ўГ`h¤G}=Д╖°ё╟?zЇhNЛ%Ou╚№м│╬┬п0*@X╣~`╜А╚r{Пw╢?■° ДЭ1?№pnК [░╥╦.╗ ╜K*√║Й╖h.иpЯ>}FО SБЗиэ{ЎO>∙$:*К@ят6ПзG╙└@┬P║ю║ыкы▌G▌С-4v╫]wA швW\qЕя▌чUCY03└їС cГ?√їыЗЮця║╞╠Г/Wо\∙╔'ЯЁшЭ^╜z┴0А]m`wъ╘ │М╪╙N;═▀Н*└цЗAўQ·БUЪААААА└┐5ЫюГ\xсЕ Ь~-[╢ мtыжЫnтЇq╩Ф)аn▒X е·▐ёTр+▄#Иdацаїр╩xЬS╛═┌ъ▄╣3╧ Ь ЎАaРyВ│Є`ыdiQ Ш·w▀}╟П+сzБ·аЕ]╗vБ╨├╥@AW^y%Ш h ║├}╞рЕу╞НCб╚сЙ'Ю@╜P╩аAГ>№ЁCdЛ─Rй╙╣A]рR`№╔еWEў9╡┌╝y3g╞РДsqn?а:╚ЖЧф@yIy▌WнZ*Ж╓i▐╝╣/ ·їы╤ю`Яh4(O┐яМ9├■KЖ╪р¤иQлVн&OЮ|┬ 'TЛ+п]╗Ўь│╧▐╢m П;vЁVFЮP╪'g№°U8уМ3`┤l┘rы╓н°zЖъ.╣фXkiii╝^Л/ю╤гМРO<UCяь▒╟аЎ╦/┐╝"▌Ч╝▐К|├ 7 2)еГ│х┤▌ў_b@┌П>·zГ╒в√ш0шл╚ ▌Д{ц╠ЩацW]uh7O└7йc\├(Ею╣чt<ЇmЇjШ╗Ью√SцБn!UAA$ф;б╤єaKр/╠н▀ Э╙}~┴Ф є:ДA%чиИЪMўA_В┴ ?КщQ ╪├?▄│gOф └╠xlqзNЭР╪╧dЎь┘ (Ь+єШ Р!Ё6POЁPН·їыГ>■Є╦/╧? <¤q╟╟╡FQQ╛w╣уО;`KФ█$░d╔|┐qу╞с├ЗЯzъй▄їОё8.~Вю#(&(рП?■8c╞ ╠УБ)О1тЕ^8p ИчЪP"DZ╕p!o*Gуdю▄╣ ИР<╣Ї=xўёs├Ж чЭw╘Вз5jД|┌┤i]бюKЧ.}шбЗ@jў1М~_└cWЦ/_║Еtш╨БaДКа╕P(ВqвеjЮ ГlбШ[╨·rk╪░сдIУ`Ш∙╞├╛н╦ Єаю ўи5▓EА▀wы╓mъ╘й\64┘В>├г╔╤pр╨░└°aRJ^а┬F╧ся10l╨a╨╔+їюCxШsX■■єX2 х0КFНХь▌wKПEш 9tь╪С┐yАо╨├y(TЗ&ЖUVОюKЮ2a`L╜є╬;D\o ╘<║╧╥ ax°цЫoо]╗6╪m"С@v▀~√-╕ь╪▒cЫ6m╩ЭхП<Є╚╚С#9yх╬l? Ўs╙M7с├╗я╛Л─+Wоф мД┘╢k╫╝Я CТ щ┤Юo╕фЄ#╛°т PиK/╜ФяDфхB0╨Nў0Шя╛√юн╖▐ытЩаtd ╧╜√Ь¤ў┐ ═══┼ўр═╝t?ц)З╩5ю┐С8ым│╛ ■√П>·╓ ╠╫g^^°┘Їщ╙╤$|├x█G#UЎwЭ(║╧х╣Ё┬ ч═Ы╦ <╘┬я▄╣╢ьЇ!-└╫ЁЮ3фo╩$р▄P╫чЯ▐╕qcЇ?Ш╟M:┴Эзчq,╛cШЁ7o°nя∙єчгiN:щ$ф╔пHN╞є─│0с└їСЦХпanЮA╔шР╚░m█╢h;0╫Л/╛jG╖Lю█° C& : Й┐оЁкЛtM0qтD■ ╫(ЄЗ~X.ШЗЯv╩й│O╩∙Яx7эFєбУГИг^HЙ╬ЖLN8сМ╩Ц-[ЄШиЯ~· Эv╤ї╫_╧╗"Fx∙ЩgЮЙqЗСЮ\bЄ х▀?·шг0▌б:ШдЁ╘т┼ЛQ:*?иЗ+tc Гm!ш╛ААААА@E╘<║я{ўёpЯ>}@%yь■▓e╦Ёып┐■·╩+п\{э╡<░a/▐╛}{<&Ч,+П║щ┌╡+gп{@2|┐m█6Ё0~╢р│╧> ╠Жфё$ф Ц :2`└А1c╞°a Ьvы╓ 4q╩Ф)W\qчЬ╟LЪ4 ┼=ў▄s■AЬ`К ╗o╛∙цхЧ_ю3P0√╗ю║ЛFГы▀v█mлVн√LMME╬rЦ,Y▓i╙жQгFБQ∙F▀ФМl┴┤>■°c|ЁYч▓HЎ ┌ ╡гжP;и~┬░┴ЧаГЗr╚>2я}яP"eddЁЮБЯ6lАС=Г+u╘Qх╚tUр[u╦ЕДкб▒`фа#A]иВ ╜╟ўє╧~э╕}%Хr_й╘№Є╦/a7s╠1h~ЙЧ-╣PЇеY│f]yхХ░6A|УsNvЯsпa├Жш*w▀}w╣О═щ~зNЭю╝є╬ГJў╤K!T4zЇhX ■ftШжЯ~·)Ж╥ 7▄Pю▀JtУn▒АYИю{ПЁ╨2о:┐╧аCвыЄ[├└Єa╤СRpА'╞(ш╫п~ї╧яў;░▀ЩС╞ Гo╝УTЧ.].\-aШг#ё^НФ░Ф`├╝¤Ў█Ш °gБj▌чб, ao╝ёшiП=f╬Ь╔ ╫?э┤╙ЄTзN$█Лm╫оиГядЧJ "ИясЗ╬пэД[╢lйWп^╦Ц-С╕ЄSO=UPPАdЯ|Є╔ЩgЮ╔Ях `HАФг $гe/Е╜фТKP[░pСььl~═ц═ЫA▀_~∙хqу╞БюsUВОГЮNЯ>¤тЛ/цDgу╞Нў▀? <Щб) e}Ї╤р4°╔ Z▒b╕#ДНуДЙ▀┘КG~■∙g№Т_hH^и8╚}╟О╤~°АВР?МTх^zще0ШЗл < E╝Ў┌khйЇ╕t0iш╞ ╕2И5?VhпB`┤╘UЁИy=°Эw▐Б╢AЇ┴╘┴н¤╥Qй_~∙╜▌└-╜иБ┐uБЛ/╞ЧGy$·7п8Б┼Z бщГ┴ Д\░`ziы╓н¤ЛК╤│'LШУя▄s╧E2┐°/srrrPы?№ л╒OЎСє│g╧Ж9З╓DG¤ы п ╨jгЦ0Fч▄ы╫п┐цЪkа╛Й┼O =`,ЁЛБk╒кєА╟∙ч5Бмєё╠#e╫о]╦Ч/╟PВmМ■яош▐№Е  6lT$?~|ўю▌╣B╨@╨0tыЯЖД/1^аРi╙жБюўю▌К║я╛√╨? бmn╟J▐╢╘ 9LЮ<╣sч╬тdБКиyt_Є╬D▀▒cX╘3╧uъ╘Ю={┬║рzl╓мш&■¤·ыпє╙o║uы║ж┬/╜ыо╗Р'?#м2@■УO>Щ[У&Mz√э╖Q─W\1zЇh╘ЇМ3╬@╜@╚└║@[9хz№ё╟?√ь3д┐∙цЫё8И4╝!ё%кП_Я~·i╛хщЫ6m М?┴Ь∙F-`{ C░И║й╨$(ц╫╥aN<6ГpCИ═п)АГ G<щдУ└ча:i▀▐'@лP)jeЄо└°An( LФ█o╝Ї∙єчє╖7gЭu╓Ь9s№Ш╛A┌@nшОшH№V,<ЕБ┼ХВ╢В╝вЧг8░a|@Л°ЩC иz,и< хэВQkД{▓┐∙ц$АnayвУ@├╚Б┐gЁk·█o┐]p┴°╓cп^╜■║┬л─Ш5k:9TНс└}ъше0l`За ╔√Ы∙╓МБpї╒WOЩ2%y;╫┴+В|`А┴┐ ■√░c╤Яa╨6n▄ШзфЫ╦yeA▀╤ш х(гk╨а╖╨h░ 0Ц¤╫,ш0р·|?ZтaБQx Й'Ю╚лА╤Нo╨Щ!нtо'°аF╥}0T0Х■¤√є╙E░╞ГГФу░ъ┴ГєєGМ0c╞Мёу╟чццВФ$╫ь┼ 6 ldтЙ'Ю└╬9з╧╚╚h▐╝9xs╟ОёзЫn║ЙЯ3╚o$х╬`~8&>pg??{Я┴WнZUPP└Kфw?БЕBб╣sч╢o▀ПА╛LЯ> └o@Жр7арHЖ|^|ё┼Л.║UрЇП├чжr╬╔╔┴п╚бsч╬]║tAqЬ?A6ЮТgЛ&Lр╤`] O<%ЧЬ'@5! ■BрЮ╠├Ес7mqч║rъйз┬▄B]Ў¤e║М(ДgтЧВЪ┬$уДЮУЕ ■√яA"ёMзNЭ@╨}R╦▌╥ш{h2h{х╩Х▄НяС3М▒╦/┐|ь╪▒░пЁlr2┐\дD┐╜■·ы∙J╝╟■ё╟0,єЄЄxVuы╓m╥д ¤Р!C*eвЛ/F╫Е-|PQ╕╦Ьsх 6Ё░оььlPsЯ░ЕТщ>CУ░аP)~╢&Ф├c╪№4╨зБIГn├{╛Зс]∙▒R~z╪└0!°yпxэ▐зO~Фєє╧?п_┐]┌▀Ф└LВ▌uын╖·√.04 ╗sЧъE2дсё{Вю TDMе√Я|Є╔иQг°пр'Ьp-I$а_}Ї*fЦЙ┐ЄтA·¤Г8╣1"╚oV"▐ХC0!Т╗!├Й'Ю°фУOЄ│YxЄёCЩУлНЯрхW]u'+▒X e=√ь│а&▄ :ТЩЩЙRа╟Ч^zйEЛТчsб∙ё╟9╫D╩[n╣┌Щ2e ~}шбЗzЇшюxў▌wГGr9╣f┴Р@┘бYФЕ·vш╨$ЪЇїю╖.  лЖog╡Є┼╞#hH0╢УN:Й[;хИ▌_╖aРсК+└╔°Yи▄┐* ;Кo╥н╚ўР!МЬ{ю╣g┘▓e╔▀CЯ Ъ0ЦТ-╫;мУoМF}чFАM░m█6h$Ш?Е╟s rуw9б│бu@4СЬЙ¤╠A╙┴Ю∙└р,v∙Єх╝Ъ▄╝ю║ыzїъЕя╤═*н╬Я■ лЪG[T║╧э.|Ш9sцSO=┼#pzўю}уН7вЪ╡\щo╝ё┐зu─@єwю·Ёп░АбВС┼?# ·!j-Х};─_LЫ6Нk ╧▐{я╜={Ўфц╘ЕoаБo┐¤Ц┐ У<Л▓їэ█г╧П╚│░░н┐pсB■ о_┐~_|q └Г{Ю4■gQєш>Єхw▄т{{,∙▄s╠й6*ЖdСч║╞╙√ЩЁийt-DД"╕├2╣|w,WФ█ь+%С╘АйЇД{HВBAк╕#т'─#=ЄЇ╧Зс╘╨╧2s3┐<Ш╗чСF* МсnN4~rЧ?┴Oд┴Я№ ┬№нв<░ц<^Єфхм<>╩Y■ ▄ЧJП╨сдЯ▀Цъ Ж/╤▄n╥Б6√R.ў■rў╣▀C8█Fn■vd■=┐√ї%▐■fыяя їI?ё.YK▐-╩"y█ xЙ▄ЩНrУcZЁКх┐r╒ёю╟╣5rУF>╝ФJ╧°╛аа└Чэр┴-=Є╥╛xЬ╩╙д{Ф╣╙Э_ ┘PG╣Яб▀ЕР√ЭН3o{4O╠{>║лп(Н▒╔√$я╪╨dущ╣┬╤ Q║@oe№ф ╩;J■mк▀ №ЫPєш>о└пВтD╩  Х╥\ 8╬8Р╩║ф¤▌Здtwа├#ХzC9√wУ йКO°~tЯИp/&)=╗│R5∙ЄЯ■)У╛╪╛$Ьў''ЎУJ Я╝&є▌ф═г~EТЙ2?╛╥ЄCW|!H\Dr╤~Л°6)EE╔ўР!ч▀х╝°╝▒№J∙щ¤r}Р▓G%o▒MжЄ■ў■█Тr:ёП¤Iю6Ь╣r│3╣╫U╒ЯУO┐9иЮi_Z┐В>╧Ў;U╣╤С№k┼*°▐} Yр╕еX%'N╢?¤╛│?∙@ЮфУM╢╙№СтЗQIчz2Бj▌╟ЯP0wЁgg■YьХЦшDБAў╦°╘+UD9╟за√5ВюK~pH╣иЫКх&╟╥№єQщ>їш~(ЙюєВўУЕг&|WттЄ!X иx>ЙААААААААА└?5Оюу/╢бБ@J)█w%┬П╫TЎПё>|▐╝yMЫ6хn■rЕбМЕ >ё─■╡г┬╗/ PSPуш╛фRY7Ї`P▀э▌ K╬}щцЫon╒к╒р┴Г+╜┬ ╣рВ ·їыw■∙ч я╛АААААААА@═BНг√$▄0┤@PХ\G"2г∙оьЙ╕Я*╕э╢█Z╖n=`└Аrt▀?ЁЬs╬AЪЛ.║И(┐АААААААА@MAНг√р°╗╩GUЩ;▀сЗ ╔DV8їп>n┐¤Ў├;ь╬;я,w'ПэБ$▌║u╗ї╓[{Їш!Х╜+T@@@@@@@@@рОFў],'БtЕёЛыRY╒╖\╔╥д╩▌▄v█m-Z┤4hРT6.▀?ич▄s╧э╫п▀Е^(юёиYиyt▀Т=│0Пn\╖+33¤░цiкКдAўТPуш╛Л\UТ■Ўы┐▀}╟3]║t6╝G0╙j╒║О╩д█Я`Aў■ниqtЯ║─RH╞gп}vЇ;╗vY;r7ЭtZ╗с#zgе%Z4п ┬Пч8ё▀╟{╕▌°╖вЖ╤}№Еj!█╤ К▄яцо|ъйiС░СЯя╨.√СG·╥Xn╨0НH&▓РЙJИ▓W┬/ш╛АААААААА└┐5Ню╗▓mkбU╒)u▌xВD├d▐7Ы9┼JДЄ 6_vU╟^}╧l▄╕VzЖ.┬■эMВю №[Q╙ш>s┌╗Ъжък&╒uЙKeъH╗rэ_mр■qС"b█цm¤п╣░чЩ┘JvЦбя╛АААААААА└ *j▌w r- 2t9CrdтEъK─r ═-╓- ╧yk∙є▐j╫·░М┌;{ў;у║k╧╪ыЭXВю №[Q├ш>┐f╦0t]╙eIбHч(ОMrv─_Ъ{я░▒ё░к(r┐█оь~Aы╠l╣VЦб я╛АААААААА└ *j▌we╫5МАмhХдДIКєея ╗х╤Сп┼гF$╛є╥+Оя{ы┘ дзеi─ ▄Ч▌°_EMг√LрD РСУk._Ц√є╧^}u╢nd5l╪шЁV┴Б/╬к-╒кmHТ═b|ИтI╛╛/ш╛АААААААА└┐5Мю╗ТKЙм╔i3▐X|g g5nz№I═ПюX╖▀эчjr╔%[√p╘~║/ ЁoE═г√Т&7m■7ы_}хгSO=й▀э╟╣* 45вЙ[uТQуш>╡I,hdкrPв╠СяPW╒]Ч─U)@д¤стВю №[Qуш╛k╗ёPJЪкшD" ╙6 ═um"╣*╤%с▌HB г√LbЧшЖ hа■е╤;Jї#Ўwг ■═Ъ5}Y╫4эП?■и*╜OўAЇ▌°└~єь▄╣╙▓м+VTХЮ╙¤▄▄▄┘│g ║/ Ё А¤єюo┘▓eц╠Щ╦Ц-ПW┼qРsN╤ё▀└╨4 ▀ ёъ╒лk╫о=k╓,Ю@╨}Б┐ √AўAш·щз╤гG╫кUkч╬ЭEEE`ьЕЕЕ№s(▌WU╒╢mР~0∙.]║Їъ╒╦0 ф ш╛ААААААААА└▀Д¤ ц)((╤K╧╦╦л]╗Ўо]╗Тжжжr┐iЪБ@`х╩Хx░sч╬─Га√ЎПюу╨zPn№кк*ўхГт√ЯyЖ╚Ь■Н7▐X░`┴╠Щ3ё╜а√ЎГюу'╚9Ю╩╚╚└╧КЙ9Wч[uЧ/_>~№x0√Y│f я╛ААААААААА└▀К¤╗U|=Пу├Т%KкJ╧є╠╔╔Щ9s&┐UW╨}Б┐√w2O,K$КвTzю~▓w█╢mа√H?{ЎlдЧ─AЬ■╩н║Ъж-Y▓Д?ы▓щs}╬╞sss▀{я=╨}№─ў┬╗/ Ёўa Вy8▌ыkw╧╔╔A>╢ms =>dgg╫п_?СHь▄╣╙ц╫l №н°Лt╔Т%+Wо|ю╣ч6m┌ф8wъзжж^{э╡▌╗wc▀╛}╗а√ ?°ы▐}░№еKЧВёГ╖є=zЇш▌╗7╥#█;v╝ў▐{{в√k╓Ч╥¤╒kjytЯxЙв╫gєРпф3■d0╛o$}' P \ъF#╤}б√бФ Л╝ў~M─усв░жk .Т╪=╗Ў▓е╦╞Н╖~├·#Оh3t╚╨FН┬ D▐╢m█я┐║ ▐яГ┐ГЯS╫НД├ -*▌═г√iщщ1ю▌╧╠jZЖюWтр/е√║а√{ЖGўc√Mў-ZL)U%Н._╛№├9sо╕Є╩V-[╩КB▌'█╖oч▐¤ў>xп ▌_╠ш■фW_%ы╫оK╧HПDvєА├#Qe*U"з√Б@Яд¤ц9╢┬╧Sd°┐Рс┴╚Sd°╠Ё`ф)2№_╚Ё`ф)2№_╚Ё`ф)2мй║. яc0OиL0Oq1 ц∙¤П?└ї∙ЩЫЦi╞Й╘╘T$`ЗєФе√я┐ Б┬╬ю){2╧kпТMkX0O$]│vMЖGў]┬cўa[╕л┬bў =°K▒√bTЙ  !МxўeYГ▓к└Мp(╡M│░а└└┌УЄ█Э ┐@╫▓м№№№щ╙зу├sц8ў╟¤┼ БЇOЭ№*┘╕v7▌╧и║(%h╛.╔КM№ь№м╟1 = H]№ОН─(н─НЮ╠▒=║oЁгu(u┬сш╬▄Э;vь╪┤iSrVхЮ3З├_|ёE,Ыєсl П╩2■ Гю/МЗзL.Н▌{t?╜╢GўeB%WУ4т╚╗│.═Ь║╘╨ї`@;Ё╩°БэЙ∙О$vУщd╕╗ ╝м╚┴Ао╚Ь─╗Ы╖nЫ:uъ▓e╦Т)╛o3Fў╜37%WU╒uы╓╒л[ўГў▀▒]Ч▓═║n,Y╝xQ┤░Шyў╫о[Ч┴╝√СХk╫▓2ы59╘Сeф*НVv22P%алl;oЩ║TVЕд┐Сд:RR·╜╦ ║;/╫KЪtЁ'aчБ_C% ╜_+'bСMRЄ#I"V╘sХI\& +ТФИ╩╛!%бZ╝F┤4т&эp ~▌▌╩JЎv9SIё╛uЁwЩыа iЎЄЄgяр∙R┐"╗EuУ╦tK[╔%╘{КWг╝T▓╫эhй·I┘;Є 0ФЇ*RжЯт╦ТЩ╔-╫5i∙▐Э4∙▒┬ФЁM╝Б╠gLЎХ[╥ГIЄщ├дt╢СJз ╖DЬТl)╞-єН╣$sЮЯ7v▄▌b╚%ЙЙTv▄ Ц▌юсяП╣ЄЙ]/!√П║%ХрЄPo╢Ч+N ╚@q$г▐ТРм├=╬|√М ЗИN7I№╩╘щJ▓ЯОT1эW╖╚Т╦%eч├ф╬яО╘ыf№ .)MV╢ yН╞.║/эф╗Л*э]Х*°-■╪Ёg}O╕▌Э╩#lvЧ▌Тb▌фб└P∙х<╒ьB╗uZ·ёЗvТ╛¤L╦О#яУпX╪ЄхЪає│FР¤|▌▌ыЪА└▀╠╛Мю╗R$Ъ(╗х╡Єї└╨5Eёf╟■щ╫?∙░вк.▌Эx7ї'|╠вЫ╦ДRYQО>Ў╪Жc;u][#ТЙм\╢4^T<ї╒W╔кїjееШсвеы7Е│▒4+0еСGвJQИd)╢─ЦJvHЩ1└ТEн BJ■М╡╚е%ЮD,╙!Q╪╘╙гу-├╚Qvd╟Vи═Оr*kОв┌:ШеЕUKж0A4╟CfГZё╣v╥миHX▐X╤ОLdUfЛu╪/╘н╕8╨2лA▓¤таО╚▀ЦeKУmHы║&`K▓U)Aй*╣║╦Ў>'╚U9к#C`O"[E▓ё╝уи▐dюzмА2ЪякоWЙf+Щaв(R~Кdk4`I╘ёe┘- Ска╥n╔У;PеСa █┤!E4╫VйцJ║хИ┼гVФ┌╝)бdЫ(Цм╪h*9┴ЪМвВьр`Ь╨╘EcvBЙТ}=├DРd╧┬NDSт╢йш─бОБ┘╞┴аd,Э0:Л№1┘0ТH XТZъmeд╓╢═╥ЁЩY╩ьЦuФ(├P ─йКЬUЪА<ЮПУx,╕W█З┘&йБаФ▌S░7Ё:#Ьш╛g:aNў▐г(TgЗ╤┘жФйФтD▓LYГEдQ╦ЯUў:OV╒╔=G{╔т2╧Йф-'їЇDbd╘K╚ЦШ▐{Їу╣▀<▀Ющ(RB6`Я\╨}Ы║ЖED╢°!╢fy&SпBdЛєИбвшУ(EЎzу╛J^)└}=Н■ж(Фиь╓2╓нcX╬є┬бгВH█DEЯw0м` █6Ц fw┬"Б╒м└М▒+С├u¤N┴7юM▐oJ╟ВG.ШяI.ёт3+ИvФ-ў23╦Yм▒л"%e╢Сн*▓lBпй 2F:9`гOs m%╟0$X¤╪Ц└g,р4▒й■ъМэcпSў┴Ы▒лB9╔} +Хд║Kj5рЦ╝Ш)-й╩╡f▀Ч┐}*v $OЮ▒лш╪Uщк║ТZbKV k╟┌Э╦~<чШ#ЇDdZy║_╗I~Vг╡;Кu[aдUйд>ОдЦZя▐л╞▌╤8ЙКв{N}╫хЎА+╗е▄Z▒MU╙ccUsU┼3▄дT)&kв0Ц╧Фы░yФ═v вQННх║WeЛyTЬ╩ж╪JxОуY■fРЩ4С|Mp)к╥╖╦Єe└dИi╧vмxжB *Ed5JиEи&+!ИК)\uяфRы+Ы╕\╨уР │─aЮ┼( ▄a П╡╕╚'Р┤c┤8Л╡а[а╚киmQ=N+H╕зIе╘хIф$у╛ИЕГ9(D2'rиl╣╢жa▌Р║гЦ─?Ч┐нЎhЗю-№ШКM*█Оl█ XjмT,X&WE╡иf╪vЖdВП─ХАЩ05Нї╣╠ У$EWКj;ўў<Є∙*╗╟╣ЙФM_й╡WЩe╕б* ЩФqяKе tа|E╔Тя╔UT^┬ф*T╤Экпк\■┬bP*бR сzd№]Ы(`aкЖ є█U=╞т░Щ #╧r0│m╪Я ╚~\ТmMgГТquЭ1x┤▐] 4 ;ЪчВХЎf+мH║╜ьш▓N(Ъ)ГКiьЕ#s%ЄЧУ%7С0?Д╦{╤,p#jйNLsLTO╔И+)ж ДAў┴9Р╥г√Т)%Ўj0юлm╖g╦лУўБ8ЦеbъQ1}Ш╡овEM╪%ЪмЬY╩╠ёйГ╔▐мт∙hp}*;ЮЦЩрi║ы─TUшAOФd▌▓║ К╞fEд▒1╤Vд√хЪ╣Т6,s▌К[=╖тАGR╧Ў·й╛ч┬·#ОЖf%R╘ ╕Тб╣ Y▓-Y┼?Х╜))}vпєd■r╠ўШ╪из}ЗнUXУ╪─┴№╔Яpx√/`лЖ%є╔Ф-lP5ойm┼░n(шж┴▐kыр╙.)Єт╩XУвЯ╩КЖ╡┬б╘ 1ЗT░Y╒УЕwrЙP╣aлЪ╩*sВzжм╦lKм+ЭтEВ▒Wы°чЦ╠ве№ZU,LэКG Вz0n2У╩a/ч#дёЦАRI╩°l▌╩$$ьXР2Є▓▓у'*ЫX┤4 Ц ёб*╔Q*╟a╜KоNйтu?цLLгNL╥#Ж ╤(╠JЙ╬Мs╟D}Вs▒M[M лi6╡Вr╝В$╥?{╞оЁ¤▐gь*Лм<гк е╩ЦTRЦ:эЯs┐╠°wzўi╔#╒rг'I[юeD)#х╪3╩щ0∙┴¤ж%е∙Бяa $yЫ╖/Юw▐ёm╡X╕▌ч▐¤mEAIЧ%bWf&R,Ок+с_ХД0 нНй╞Ы@Ф╥Pf √:▓vyaQ╕■aнЇЇ┌qПщ2ОK@тЙЦ(╩▀╕ЪЪС:Н%Щuєй■о;{є▀╗┼Кг┌Л┤!к7)1o╜"┼&rд`Ц╢%ГЕ╩bPЇ╤!*(ЫтZР═ТYhРтЪa-И╣Kз1*Ыж !t═,МН| qbt╞e▐}У Iv+Ц·К╪;R┼єXГ╚8ё№▄Э[╓"sXZJF╜C[Ъ.ж"▌+С9zурЛnВЁм▌$║%╠JKцY&0}0▀Зєwю▄╝ES$3С╚к▀$н~#p ┬т4m╛Gлв╬л5█Ф ц∙[;[sй┬╦вмООAЬ№Э█Є╖oмSп~иn│8 (ыГГnc╒{ЫQЭь+нЫ┘{m╧Лd╫V░aIe┐│╫,ЮМ5Ячg┬М*{oЧYJЎv┼Очь╪╦╦kP┐ЙЮ▌0ъ@D┤и┌Кni)q┬▐8б╖;Кcя▄╛-RP +rJ¤C╥j╒6╤└Ъ┴^{якnЭj░O╫ыЎь% 5Он0Г╔ТI╨Т╙Xь2 GГ┼{СХИ' r╢мS1ы│¤Z├цэуJЖГ>╬HsЕлLа├▐=═─[a╪╥ьСwOл╢╟*╪Л,ХЦкTт╤▓ 6Т╝╫■VQx╟Ж5V╟dq╗╡ж6iПї|ъ╕мQ4ш_2у╣kзЩ╗╨ЕN@о╙▓VгЖXжўод2║нDЄОw┐ЪиЦw┐bz йГg▐ ╜√е╧rь┴∙їПЁю[╤ЙЫ╪╢║pїВ│┌╖м╠╗я╤¤╡█Л b ╩]ёе!жЫ9<╧/V╫Da^■Ў═CKm╘JVu~ь┐яцQ]уn│ХRуЧr╔lвtцO√ё[╙/| QgЮЗeLuьh╬цт]█ьА╔V4█╚Hпkш·╬╝но╙т ┴`уFjV╢K5Lе є▓0▀sN╚<К╧eoо┘э`rЙЩ╪Md:эХЧ╠Ъy╩eWЮ{]Jv╫И┐нєo)єя,рYan!╘ `╒зXх)^Ё╩Иa■Xxэ¤O╢=∙╘ц┼P-T╨ЛrБ▌A G# o┌ ┘ёЙў ▐╢|┘ХCG4ы▄╒█3AAЕС3─ЕФжд+z"-oыф┴ўм_│жўєc╙П<▐P╙╦╘┘▓,ИQ┼ ─¤Д╖!М$│p├┌▒CЗщЪ1р▒Qr├Cd▌РM╟С%v│/▐╝^ чГ╛l╧ъ═ЪK╘;┤55╥ожЫиБmkf\eС╣Л~{щю┘-Оь¤╚╪╘┤TEU,╟Є╕╪√b┬?¤═иty╔>╔КЙлШ╚■║БU]T.I╡s9ИТWO┬!Йыъ╘дl°1кMШ[└─N╠╚Лў▄╝qїЪ▐П<╒┤▌ёqU┼Ьбц+┼Д▌╢v╥Ё╗уС┬Б#E╧ kiJ▄JУ@й`√З╫/1▄XsЕahv▄┴QA░╤╦еД ╓╬LйУ╖5∙3?║}¤Я!7к╤░╠N╦nX╕c&Д┌M█ШБZ/\d(Zq▒╡~нa╞-░ъPjFГж[╖чж9E╡57╡L╪ Лt-■TЙZPЫР$ц─╒м╪Т∙_┐∙°ГDЖйг5h┘цЮ'Ю5хаEФ`└Ифця▄a9p~Э░╚;УbЖ╥%#╘°░6qSХ5╞╥\цbТ¤у╖_╬z№^"БPТgv┐ъоGЛ╘ ╠▐Юkbw°еWIУ_rНK╡.RфУ'З7щ╣RйЧ4∙O~b┐h?╜у8■Я╪lщ-@╛0%∙P╦гУ▐ю4Рi&Ь9ыЭщє^Я╥▒ы∙ЧўRмжzЫlь!+^t╙╛w╣╩;╣%│$`ЯlєШeЖ╖m┤ vцф2%┘Тй╡жbybK│├вдrvm▐H"Е!jЕ$g╩ЛУ6мXu┼=┘щЬДRdк9&Z▄&F=Ы┌й▓HG╖м}щ╔С[W.ACЮ7ьЩОgЮЫРмЮ,|Я9М╝║Tc*л6uSe╟Нь╠▀▒┴┤Л(ъВ_Nk\√Рp^Nq$Q╗y{WO!С]┼Ы■,^╖rъK╤BXйuы]╒яNгNУ║M[R#ЛG╤Svш▀~-XЮ├├щ=ъцсШ┼yс-жхэУLWrRRj5kБЩ UH*г╘ZКa2Є^Bг`╢l4яt▐Mў?v(Kef9єO╔vм`√жgўuwнUpа┤#╧╜Єъ█ЗYzpд-#∙?~╞о▓╠jоz╒ZRМnл┬AХ╝Zгр ╥╢o╓IH╗6m_<п[╟#лЇюЧ╨}Ў╬░вшом░yУ6█лJуЛШ√╞у5>тЁЫG╜,iA>ь¤9▌Лhg~50~╢┬bд: 7Q№┘╕┐} ¤┼w=p°i]░ЮзJЎG╙^■яМйТХ╟^э)i╟Эqn╗vэзMC═<вкжТzёРбmO9]╤╥ИE╪>&лJОчPё└WП▓3о)╦О*ГО[│fL_0g╓╔чў8єЄ>Ьюsё°Z┬▄5╦Ч╝9k╖ а$ШAcjШ[7a8Сc_°щз]oь╫∙вKн╘ ЧGcя.dkФж 3кTl%Т ▄Р;6-\p¤ccЪu>ПY2#+(▌▓┘Yиl├│Ь╚╠█9сЦ█╓н^╙wтsuO<ЕРНк╢eёy3i ╦ш∙Дэy░Aэ╖о^:·ю╗▓~╧шgН╞MH ш░0LмfШЁ═чя╕е`эr▌6CО┬L┬Ў&ъ4ьqы└├О?═╘╙DзVВ(╢#3Y╖№1╥р[▓[}█У/дgfYФЪXРtЭЦnJоd√Ў┴FхБнnх/┬▄*╢РJ6в\T%IuqЁ$поД@Wea╦▓-│=п░м▓cH╓Ўu+^1 1пyр▒&NМ┬Ў&Ф╪а¤·вmжО}2VШ╫ыо{ъ╢8в╚U╙ЙFbV┬0К╢н{■╢ФxБэ┌ОкЖ╠Fг ╗Цo° f▌№──┤#П╖иt┴D┴Вo>~ЄТ(В%j╨м√%W~■юФШeїёljєc]U ┘y$С╖тЫyяОЧт╥ДKSы╫яz┘еo╜=CK╒·?№Tа^3к▓У ,PeGеUЎЦЦ0ц═тдQхT7■ыgя╧xф>M'й Z╘iyd▀!╣FЪуВ╣Ъy[7<7т>g╙2ЁX"л╢m)*иЫ╒╢C√Лoj┌!FG╓0╒шкLСх ~°zьГЙВMЕ╗rOъqїх├Ю▌й╫╞|;JЦ*q{Ч╝и@╩лlффИBl█Ўз/ц.(еяОw╟{rn■пxД'│Щ▒L )nНФ2~0UЗЄ л╘╓1Щ▒п>∙pю&▐╢¤%¤яХ┤░Щ╟╪█о ┬чЭ|╢пивУ'T╢ЕJI└vНxdтГўnY┤@vbОf┘Ds╡Ї.7ї;л╟%{└6╘вG╞Єr&=2b╫Кек╣╢Y┤+"iЧНxЄ╪о=czк╦^░$0Y9ТЧГЪkе8С@tч #ЖоШ E└НcQ╣`ффу╗ЎH(Ж╖wV.y{├т╓*ЫTл3Щ·└р├:┤ы¤▄;TХ·╫=Щy0█hл:l┌uu╞ЫcЛ∙яЫ#ю╛мW▀#╗]СHлkK$▌Нї╞K▀╛■К╗k│╠╘k┌·ф3:tш0cтXЪ╖▒╕╕8╘╕y╧╗З┤:ё веI6;(╞!Цчщ)YdТ╖B(,т╓; ┴╡┘{╘H1Н╟ЖA╙ыФ цсk ўы√K _Ь\)aш║cъок;ТТt█║ЧG>┤aїЯW╜яш.▌# ╧.Ыщ@|-bBОАфцo^oX╤FЩ╞Шп■у╟╛гЮл╫ЎфвтpFэzz(ERГlR│н°цжп2& ▓qх╩█_ЧR┐С#j▌жКPU5┘┘v@°2VеВ╡+їа-┘ЕO ╛#иЗ?3L(F┤╠ЗРА!)─НO╥█/є ╔Iл▌К┼яKN4═/g╡:тв[·╖<ц$S╔"v"@Ь╝▄┘О:╗╓?u╟uїk7шщ╔E╤(V╛ь╞НM░ьu╢л■-с╝eQ╣╜|р╥<Р юаJ^▌╔┐\│┼╞и$YУ,╒О║с]У{`█В∙╜ю╣ И╬чЕН,S JОdч░аu▌е9;0Ж╥k╒К│И}Ў╬vH<аF╢о{u`ят5╦И!з68Dб![Х]т╚▒h"7З*┴╗'M1О<Ц╩йZ┴ЦН┐╠}s▄╙С№ЬPнZJ(═┤bЖ╗╓лйwMШ!╓╤Т╒4+g¤Чo╜■ьx7юf╒йч7П╚ж╔╦ 6m:ЁщЙб&G$Иж▒└BЗ╤}╔█][ X2Д╥Й┬е_╧yыб╗o─НПL╦!гVCK`$щ4V╕}¤+П?\Ї╦чj03%╗б-i*▒╠т▄DaNєS╧ь9pxJЭЖZZvВ*жiT╔  v╬ р╡9o╝xь╣=п╝o\╛V D?HЛ┘N▀╥∙РMЫКRт}/їгяS%}q7 ?}я wй°L╜▄Гr╬~юмёН|└4И╧╛чШ╗  Е╣xlfз1┐┬уг┼_╜6ю█ў▀:Ўт>ч▀2Иъ║╖?Ab[7л,QI┼┬▀№*u╘XёkO=╝m∙я╤Эha(√9╜▐щ╫▀z╥╣Ш╨!СИщ]Ъ№Їу╣л╦Й"ЭШE9[тЦtэГO▌╡gСЪК]Х,╞uЙК%UwнаФ╪╣z╔лгМэ┌═▀Nй{╔C/{Ў∙QY├╩"°йwмq*9Pйj╔лHgыN|┼╝o>Ш0оh├┌ь┌╡$▌АI╩^И█Ev┴vWVяЯ№╤╢b:х╤┴R╬кF╟t║■╓БFZQ╘┬Э9oL│u∙я)┘╡пцНzЗ╢рMV╞?U└дw°Ж` їдкY┐l┴█гЖ╙╚ошОэ╚<=╗n0╗┴╒ўП╚j┘╞tCД╪╢b╔qуn┴ОTЪ°сєП?Ш°Dы3zЇzdb▒ЮNe╠ Еmй ░] +y{6-№t╞ы_╬x╖├yЧ\;°бh гЪbVб╚А╬ZSн~u░┼>Шt  т@-СUчь═пmUа√ы7╓fqЦ╥¤C╓lиwBж\▒H┘бЖв`х5▌HС╡kє·sз?;Є░З]g┘цо├F}т╔▓┬▐┼√Aк:8иZ(╪╕iЄCГЩR╫ :┐■№ш5х╩^¤?№ЁыВД▄w°╚║З*a}МЗs Ш?n`ЯцMЫЬє╘╦F0ФFуEЫVOЫЁ№╬5k2Ы╡ъ▀├БV%╦╤═╪ш{Зжющз9yЇЁьCZ\▄wшЫSзkYu√ ╗/╜▐!c№ь-Пъ■═БЙ{x X╒▒UНл┐y>Pп/Юф╒ХЁпK┬JtШПVхё'║╓в╣╧╣cыт%Г╟LlxЇiEzF▄╒─Хг┼с╝эМ░ ТTQ╡╘┌┘r `{З`║F(м-VPЇ▌зУ╛/нvZп√$ї┌Gвы╢╜u▌Ффx~RZ√cВvj╬є^ypp<{єЎош╖ЩV?ТЧ√ю│#r■№9ШС}█ш╫ї6зF]9╛i╤ф▌1│╤qз]z█$hD╖n|{╘и╚Ж z├ЦЮЮФ┌днг┴Й╦,▐@e.йТ├L$╢╤_eмNrCV╤Я_═~¤┴╗┌▌╢╫°╖Кх╘идKЖ.Qв:ЙАY┐ш╟╫ЗЎn█й√Е╜ЪR║A■№щєЩ/<ХИ$ЪЮzn GЕхадз▓( █ ░ ~u▐█/~8■╤г/╝°╩{Ю.╥╥u╤┬ zюЎ6╘╡э╝▄аС┴мL-Ш▓ЫФя┼\'еБ┌lЦJ─уy╣9НXЙДЮЪСЩЩUTXРИEA╦1ЯжedЕ╥╥-З╞"СD╕Р┌Й`jFZVm╟ХTE)╠╦НEК!l05=%#╣ЖЛКтЕ∙▓LВ┴@0┌Щ╗У╤E╬╚╚V┤TSQ-ЩmS$G1у!Y∙v╩ШП_╙о╟5Чy4жjкk{цЛ╩╧@.э║дt│VщidR┘mq■+e:aIь╛m┼v_─wmRc╣SF?╛сз∙WЎxxчnJЎбvJfLeЫОd&█%╬█ъ&Єu┘╘▌╪╦O>╝х╖┼╫╒бы┼a=¤@qТwVзюЪК▐╡eїыЮ▀Є█В[Ж▌їх╠щkЦ.╣ф╛1╧╣ о`(в5∙щ4ТwQe]H┌]╟Т x&Ц─├№Mjьg С┐■╫яP\d█╓ьц-оpЗ\яРx(M┘▒уг1#╫¤ёГмз ЩЇ^^В╝8ш╞C.yЄхь&ЗS =Y╥╤т5Л_>╚М\7■═ЖнО`[Z\┐з0╙╓┐)з╠╬8╖фт╚тЙ&│єо┤▀[ФГТнDwEє╓,■ёлў╞>█║}╗.]╧?юец╟Яq├#╡┤Zаёжм░@Й╪ni{юьw>{l@Ы╙Aў'jL╖кФЁоЫР╪╣╥▐╞▐Z42ч╡Й_┐·ЯЎчў╝юо√гЪ┴;Гп="Х▌|╣╗∙K═тўяrIЎЯў═┐qKЎxФк{w $╣°┘кХЗЪХ3╢╦юйў█▀-=.Ф$ЕЕ╕╗├>я█─-СЗФT▒кє╖№LH┘B╔ю┤╗F╛g║дЎююЗK┌╢д▓о╗;╧▓ЁUr╘2u№ I*╣╔─/═пN▓╝ЇД Ч\юЮ#ьy)╔√Цhi╦&╖Nщу╔┬w7+∙┘▌╬и8P╬МГ║}кZ8 ▐}╫[\Уm0ХЙ┬н?}1s▄уZvгkюЦ┘╝}▒─ЇЦъD 7мxёБ;э┬Э╢л╚$ожg▄°шЛй═П С8qlЎ~@6MТ║ыП_&▀}}Zz╩рЙo╚)╡Ч,Y(┘С╓З5ЪїцЫЕ┼╤Ю╜·d5jъJБэ чНxcf▌╠ nш█оы%F6жё╚Же▀╛∙кd║ч▀xй▀╞{╬Яє_╝▒KvГц▄<┤їЩ="FА8ёв5╦╛xc*5╥/ъ╙_й╒@╓╒Й▓K8╝wХ╛╜╒FO@aSLL╙СeЯ╧z{°░V╟┘ў╣wКс░`$oUr5 ╖мЮ|s╖╓g]y╔ЭПЕ╒Аn[ЎЦ%s▀ эмў╢ы8Ё┘W┬┴,ЗэхuМ─░▄╚вi/0сЙ╢u┐j°S╢Ы▐JX Т╖_Y╨XёъEю╜╙)Оt╝кяЩ7Ўєw1╔Хx|ТШE╦(о═шнKЭўэЬ1ПкёЖ╧ьp·╡╖▄■Ў╦6/_@ь╕гД?щм│пюЫ╒┤ї▄Пч№wтCZ╪Ї°│оz`╝йЖ` ╝6jшЖ>EГЯ█√╬Уz\'Є'яN_ЇЄs`Ч═█╡м▀р╨yЯ№ЧнcєдюЧЭ╓¤Ж└!═ ┘╓i╔ Цk▒=пKц═¤ъ┼з▓3┤Лю}╞n~TРFB╢э╥GКiкB-*│#▀╪LN╔O┼;"┬цз_▓█\TЭ:ФE╔SЗ^Ф▌K┬Оh'▓╩nnaЫ,╒HPШSVЖU8■▐█╫╬√ЇТF▌¤j╔JE╢┼rЭ&шм45@Тbх+jкуLpїкЯ╛╗·бgОъrQФyа%╚─╬иє6Ьдю·єеn]╜lUvЫ╙n4dцШсЫ}{щ}/s^Oo▐6s7ITQ тФeГe"СH0#И╜EaVНiZ3q]╪; ╦V@Л┘▌60Чm╗ЕКyяJ+~Э0иO<o▀∙ь.╫▌l|дгЖ$╟ISуЕЫЦ}■Ў;∙E▌zg▄2?yщ∙C▓╙O╕}ибg!pьD■т ~ЄсДgH4┌ч∙┘н[█║╞z;bO5%╫aqA№тvF?█RSЦu╣а╞оmб▓W╝M╟╓UЗG5┘▒-╙С УTвеXё№m Ш1эЗщ│Э╨ю▄>Ч╝╪ ЮЖ╡ZЬwя¤┘'Юв3бw+Вc#├o>z │╟┤ъ|┴-#╞G╒,F ИMeЗэак.ГЇk6Э ┌│Я╛2жэW^7lФItъэ■gA╢░─й═Оъd[Ф╦є`.]Т├╢йТCUЫнq9ю*Xeя└AWёS%║,бяЁ,А·▒╫1№p,ш║╩╬Ab┘*╡ьxPв!ЙD%═н°&Н░Т<·I┘E╢Р┘ЕЦw=ОюP░adлzВ▌УCь┌ ╢/ЬЛO┘▌;└╔▒ГфдhМ8╡ UГ|Р╠f█/╤`ьг╥yоB╦жКfX;a\┼\х╪*;ЮЫK└N4f1▄zВbь└юvd7жЁг№╝cУв{ётlo║wX+U╠╣ ╒{OЗjгє1WжK¤еZHц╩▐▐v╓Ш^┘YпЪF5o│;;RНэ|B╣rЎО g]Ш╜e1`▄ф:▄vb╙█'IQdВ▓г┴┘^I╦1╪t╚╓╟╗mДU▓а┼Xм#8lрgxW]░\°{╚ЇO5ж+Ч┼╩─;╢Д╒Aб▐ ьeGI*─;бQё╬Не,╩Ы═K~№b╦╞uрр▓wя-╣УU3<щЇ3╒м·Xц тж[╧▌;pїw▀\Ў╨г╬┐F╢RбПиaт уf"аQ)C╡у0л Х@И:п╝rэП ╜|─Шг╬╛(жз▓█hВ])C╘x,▓ЄЫЯ┐╠ЎЭwы3,╗сaУЖ▄ узч¤╧}■EQ5д:$▌╢хp▐ў▀~П╔IP~M█s.e╫#vМЖє~Яўе═Sь(z╛т░sн╜CКЇИлЭrnO=л▐╬┼?О▄;гn╜╗G?п4hСCиl НZ #)▒0МBжмЗ[П╟К╡,SЧ,зH/╩¤э╜w╛xу?f"пc╖s;їz*P╖.Мё╪Ц Лч~ePд0о╩X)╪оI 7Шy№щчhщ┘2Йю▄┤z╔O▀├Т]Л1*Щ╜кXv0QjшШ│╧3╙ы$└ мЁ▓П_ЩїЁuk╡=бў-uПo√═─6|∙Yэ├Ы|сU7╘lХ2*фj╢н╗Ў╖╛7чёБmOя╓gф°"=У▌рщв}9e7cHЕжмj╢4 ╡1╛2║}ПлоЎDВ▌Ч'{╟ь2RkH4RШ ╦Чл╢YоУCu)З╡>Єф└|e╦б╣╣ ╛№< -╣8Ф▌┼У╡z-[╖:Ў8У9бЭh╬О▀┐∙:D-╨╧┘ ы└╦╢hр╨Ў╟5l▀!J╪m9ы╓o·ё ╡┬yтQIn}▄ MZnzж└Ц5+■№х√,уК═Ўе0**Гy╟\їИу:6jqДeajмYЇ╦║% В─╘);чРМeл ┬о34quъЖ_чхм\А|∙╒%БvDК╔Ї─╬gg╓kТ`ч■╩ °n╫·?┘╜:ьa╫;OА∙mй8∙Ї│BЩї-J╥ў╫o?/╪║. Y╠дd▒Ч6Ин)rи╓▒зЭее╫╡Y "]5ў¤№Ьm■Б(╝ЪаBб`JЗ│╗┌╡,Xfl╔ЧЯI╣█Pщ8Ъg┴т3Ф╚╚:∙Ї.ж^Яl┘ї╦▄Oэт\ЎZ FОчb=\6HjЭ╬║АъйОм╙шО_┐ЩeEуЪw┼к7Ц) ╪4ФЦ╒╢[П░┴"$х№]K> $ПЖ5яlZfЗ║─ HЖ╔sЄ9=hz▌Аы─wm щыOU'м╣qЩЕ┤│лб╝╕ХАнжЭtN)н6г√;╓╧√цsf┴3┴иw1ЮL╪EF4Li╫ї<;3 еЪ╫н№nо#Щq═;ўЖyъa3╩zJш╕3║Kб:║Ы╪║jё╩▀─ЄБ!г╕%w╞;l├║од¤_{язEС╝ПOO|├&rNВIF╠ 0!ТA@Q─|wErРЬDA9EQ0 FРd"╔ ╗я╛aRw лz▐]Ў]ТЬw┐ wъуэ-√╬█╙=▌S¤Tu╒Sе/╗с6, :°╧▀W ║aЭЖ6ёJ^аyдкN┴ЦКХ/i▄┌Ї5ЯОUu╖я)Х╢0ШgWмt╒▄┤ЄКн]╣z■╙{яЙ·]╓u{оuЧю`сВ-t┐о°hъєГ7╕°с│c*(0]lю╪ТЦЮ╟C═:S/6@╠0svо·hЄаю7tь{эАзуr└└<;╔6м░_1a№КйC▌█∙╬п╕Ri|Y╒╚WcЮ lцМЎ#╞╓╝щ.5N2id▐╚Ч~xwA∙:]s╧&╫▐мOфм√ЄЛп╝┌cфШ*Н35Н:,╙d$ Eд▄Хc╞}1g·Х╡┐йчKат цp,tЖТн║╣a)╝т╜y╦цПк╨а~│Nё╝ьх╙'G'Ъ=╨п▐ ═─гuйиОЛ}Ъk╛¤xз_╛√ р■Х╖╖╖╘4.╚F▒╪З p▀Mcёї╦,Э1ц╚╬н╕CэТw▄t Гщ5.tф ┬`ааАГюС?\╕|Єk▀N.╣Цj╥Ў▐ЫюэТVб.Xк^╘■qbЬRр.,║ ╦┘╙╛} ╤a,╞Y║┬НЭ║4╜╜=I/oл(DЭ╨╚цGu╣Ы╕QМP▒┬СDm]O╗╝yЫkdUмжЁ°тdя\>c─╫ чАС╙ЫQ╛┬Э]z_╥╝MTIзzXЁ╨y╡╒|ёхьЕЛ┌ №2qй90a└{╖мя:nq═ЛЫаKGСХ h═Оы╘Й▄9r└}▒гёVрвЫ@Г▀у╚Т █^№Ч5г√▄m'"оЦ!СтiщUНЩBk╫ЛшF└V╙,┘╘Фt7█ї█┬йу╓п№=ЙАў╫╚,u}П~▀╓RЗ╥uC╡Uj¤╣f┴°╫■№цc╞?hjV╡VЭ{7n~ЫУ^┌fШоk╚Цo>╪)k}UлNTU╥dч█╣у▐Ю0:TеЄнўї╕╢Y;W╓┼1шсЭ▀нnєЇ╨K[┤▒eW▓Ащ*1W╜3·г▒├o°_Ч▄╫З╚QАaжЬ!ГJu═РЯ>rшя╠Хx6 ┘Ё ▓Ю*A)Xк█╦#k_rCBd┘& │╧╞Х╦%fW8R+%еХь?lx┼zНуRHУI║¤╘г[╛Z┘ц∙Ч▄╤Y▒├а*▌Р2╒Й╟ ├╤J*╠ФИUВfўя░¤█UmЮ╤шЦVжАл┴з▀"[GwО№Pd√ж'_Uе╤-ЫLz╢▀ЎU╦:>7·в█[fл║тЁ,╟╡wn¤▄аг█╓I,я╪ыб╚^MлюУЦUj╪╘а▒ьЭ┐╜1и/▀┐E┬jо╚╟╞g ╘╙│·M|лbэЖо¤j№еХнЁ╪И мьyЦЖ╣┬A√h ╓ГЮЦЮ╚═Px6Ч┴,Q\ЮБe▌dSID═▀/}oхФ╔Тi5╝∙·>hThj╔░ту|їщ▄┴%'*к\0жРчS╤%%мTи▐√Х7╩╫мЧf¤щ╙g {IrуsУyЗJВf╘и╤яї╤JежjшТ╣v╤╘_Rя╥V▌▐Xc9?|?бo╧rФэ;rЬЬQЩb]d╤и·ЧK~ЁJ┐ o╝їБЧFчЩ░p J ─БЪ-kк▒Д√▀╠xcщфс╡ьpяSCMАЖ"G┼b╩Э═┐мє▒√I▐┴╣мWoq╖gЯЕ7 ╛│kэ┌IП ФЄОв{1·╢╤╟м/n▌·╛■П:║Иwєъog ,Щq,¤энQ#.!═]Z╙╬=яъ┘7 O╥╛]╢l┘sўvв_Хk═}╢EЫО ЕєO═ bфЙцI▄╬П7QР@X ▌єш7╡l}@JиЄ╗S╟¤8{ ╬4И╟ оdиТE$%нє+o╘╜оЩ%4R =т╣╡єFёВмd╪И,eЦэ9td═ЛЫ║jРYц╘б╧o |СфF$ъ$Ca ▄T#%╜Єj┼·╫Gд!╔єьc;V}"!WШЕъHЁ!IZX*Qe└Ё ej^dС0╖у3z7▀╡qНдiP~lЬjzХ║╜ЖН ╘мcJ ╧═Ю·x┐гk╛ХдШд║L╤KWпїф░1fЕ+`)чэ▌<ёщ~9█╓ГU%Иа!░╪ММ* ?K╬(ЖР┤oэ╕■эsўэЧ╝уR~8*╒J╫╕╕▀М╣▒мRЬё╚o▀|д?№з$чК°ЕY5д`┌3УцёЪЧЗШ╜}▌wSЯzTКРxLТ ╚Ф Мш╬м╪ь╠ЇjА┴Т╗j■ИзJvЯ╞▒єmxI3╒▓UzНЫиU█pьнЯ~Ї╬єOIЇидZ╔}а ДV║jХ├цЁЄ ╥ы╦┼o/∙▓─"╚▒УйКYlr╕Dн*[#@╠3^\:c ^├▄cсЧ,SbсмJЩўu╛√оЫоХms╥мdєЇю█╤▄MўKUЙдW▄w(■чп[?Э?CvПЮ░ л╓┐■оЖ╫▄╟bФRИ█┐}■ёЬg╗░~¤оcцхщiж J?б8 M R╗ФE<ЕDФаУ╪єэ╟u┐кmЯЫЮ№чK*AВ─u-├LgЙ╧╞Н[9c─Eю╗ыёWЪОЙ;Jtї╪ч┐Ъ5лу+├k5┐ЫXJИх╜;~шo╜}╙=nь▐▀V│бaЪ╖~┘√sЗ№ысc+7i p▀жr╪U2╡┤─К├┐Ы5 р■5}^Е.D1lc*│(хF║Ы╪╕dЄт9│+5╛:rшOы╚╛;:ї╝и┘=Q) sм╟u@╣0╨ШЦ╣фй.╛¤╛їа\~[;K#*fЁбLzrтш╪╟║go∙∙╝:дЧ*╖e├o▒Ь▄цП?ymл{,ы ╔╡╣Х▒єkПў=┤є╖Н. ┌╞_7Gs▌_xх╝Ы┌;$Щ▄vnЙ8 fe ▓·╡'ХнЬF . ш·wл╫Д3╦Ї~}bрВЖ░уrEУЭDtыЪС┤ ХjЧ▄H qy;╓|ЫaZ=╨зЎэЭє▓*hВ"Э║ў╫зїяjш№№&Mт9G╢н_ЧU╡v┐бce*;J└+7V(`╘_╬F0ЬРз,╬e)Us■|sЁC;╫ ╨yт▓┌Н/1эДж!E"QhПKXУ;╛oыф╟:╕╣√zЯ╕°fЛ1М╪хT█вz|╙i ъ┐ъ╒╖XR|√кuБ@┼~├Gлuы╪б@(A3mrTу!╨*Оyd╧О∙│жfваЬ°ЦяW┴v╒к{▀Лo╝[)] ыБS0!╟Ўя[:s║П╖ОфьX│)MO╗╣ў#▀tЫRкВ┼▒@)ў╣╪yК3%▄? ▓·ОЩg{p_0Фh░k╪fю▐ЭjзfДj╘нл·Юн[Ў ЄKХкUZїжt╙█VЙж╪О&Ыот╞A!;tу╠с>U╠ uL$vP═Ние(F@ТжyN8/yў$│#р╛*тЖ√и*Qvd√кП'=╒'Рй▐▌ ┼·═яC}┴,@╔░%м1║Ў¤ЙsЗ=Sє┌Vў┐<┘Utви%╠CS_░q┼КЫ√ ╛бэШkkGV╧│dЄЫMюlє└c╧GНR1*eъ|L┐╗V╓ё┘╫/o┘)╫┼№`]78lЎ,ялwF}:vDл>/7ю╨KRвTvr:VCч└°К/▐№╙*Щ'ИЁюуQ@н2м@ьиcvксЫ┌▀W╛юEX·├Q╓.[░∙█O ╥▀ Bю╣a4k█╣┬∙ т\Гi\▒шн╜ы┐4▄(ЕoaN╣─╒цК╩l╒╛CЙ╩╡\┘P▌°╟єfя▌╝ ·е1ЖI:0`_ЄюєПЭ_┐^╫ёяEї <СqвЁ*D╡ицO%╜√ФЧ╘Хї ~g╓s}nъЇh╙╛O8F║Ц'ЮNи▒4ЪX1i╥gS▐╕°╛╬ў<9─▓РЎKRbл╞┐Є┘дI=ЗОкt├m ЕUЭ3схuя╠╗▓k╖ц▌│H)░:╥▄╝нЯ╝3у∙A&L/▌ЁGГШdТP м]∙╞ЁogO╗кG╗z┐ #╨(sH└<КЬ_&╒5С-¤№∙√╙▐:x n╤xНzUoyа{Vн╦)т;фX╨*$Ж╠чЎkўыПkяЁ╠╒wu┤ФдwЮm3.ф╖ЦNЫ╜c╙=ўwоr^Эw▀zw╟╓-Ч╡ju┴еM)╫╕Ц =Rh Б╖чL═s#╖whUеRЕy3цfo?╨║u╟ТНЪ╕чхИAYюОmя╝7╦╚╥█┤oн3i┴┤w`C╝у┴J╡jвzивq+╢їз╫╕гz═ъ╜G╝'зg▄╖sёФ1Ы┐°4-│dЯ╫╞e╘n╗д#6S"v-Э4вLЩ╠ЎЭ╗ф=2ц,9╜─]Э╗ЕJU└т@$?ёц?1_■╧Haя╛LЩ┘?цСNЗw¤▐u▄тjї0E╞▓2&Д├▐╔-`4nr)╥L)Fфш╛& ┘Є╔ЖЦ∙╚░╖їWG4ЙF╢°~ez╕LЭЖ╫─$НиR| ╓┼г_¤улz┘Ъ¤^ЫY╡╢Л$Ж-CЁIК·>┼┴¤оc0Ш╟уу╟╥┐.VХКэ▀5║KєЖ╖╡m√ш╙p╙═k┐ hЄИCk╛к╨шК■o╬П:.ЗtмDХpяк Z╘╗O╒DЪ╖ФPT 3дYs4МP╒сGPЧ╝ИЁS0КъHК(└a╗U@З$r■№сє ГzUkP╖ўИЩ9с*Ац1ъБ┘░ Д`6╓╫·&┐єъ╙5п╗│╫Р╔&eоfФfG▐|■СН_|╤╝ ?оi√@╠e:√f·Ё%&6jvW╖gЖ■ &X(2cSы░√√хЭ^xгЎ нY Лz▒ФТjиЎЧsG}4цї;{┐▄°▐З=я╛%зШ)ГI@dсG┴╚CЖ4;ИиD∙М-ЧU=сЄ0p0╦╓ *йlEd╩б═╔└ф3I EЗ▒ n@Ыэ?м╛oЁЁЖ7╖2ЩаАkъz(√рБ7√╡Пl█(·6ДjУE5f║r╡Юг╞Чi┌4!+X╤Mh№╤pHZ┴ PQmFArОС╚Шu Ы/ВЦd╥г, ╜гУЯQ\Д а▒°жяF>ЄА ╡ю╒┐ёэ│I&`GХbф░Ф╚█╛ц{3л~YS╣Ty@┌J4чыg}6e║сЁЛo╛╣∙#}ьR%╦АAгTЧв 07.S ж╧7o└:цD╚$╙o╔!2МА/б2KfС┬N √мCeЛle√7╦зъВ╬l4╩рnРA█ТmДJ╫k·рKг╙╩TКаT5┼▒C╘Zїяў?2р№[<°т╚╝` Sч`jиоЛvО.┼Дї╚W╧∙╔─auZwъ°°ЛодАєW1fЬ┴лмa85-j▌*МdY$о╚╙Q▓т║╬╨╝Bt╞t░iШТp┴м1=G8╦3`╠Ш.Г╜х┌ШG┬N@╡E╓H Ф╟Fи!1═б╢кЛ▓▌╟┼╜*ой╔JBRуЁ╚TMgNШ╞├╘r9кфН'Z▄aКС&r#в2х└TЇП(в*Щюb0╝╓И"+жL░02╠ЛЕcф┌▒ =я╬0·А iaбрЙ Ниоeъe╜Lf"МХК·вКdщRBeг┴ц%Jzo 9─▓э╕кf└ЫGёЕ#т8у{ \Щ .СM0Х4xсX█r┬>,ы╟3Н╒Hш&v0ц ЙЫЙ1╫ ыаPME╦o* "rСўК┼вE╒6┼Жf1 eГ█kc╗╝xX■u═Де цЗ╧┌=вк°Q)╚єb└╩Б╟+БIыGrЭа 3яQЭ%Ус1ЯXЁ#LЗ{qE│еtxCX╤╤VУ╚[д╝J╣.UjI0■dМщ49╔CGa#ЯЙ╦EX$а5Ш(╝ОGL_m┘"∙C:Щ шб8&о5 Ш°;╓Ыу^3к;j╞│ <°█╧-.о6нЩ╙ОП▌ПФм-Qeч■ИОl─Vх┬ ┬√M╞YW╣КУццЖя╧~о▀∙ ъЇ5█R3 ╫├Т│gыo{ЎэнXлn╔К╒)Юwaь>м╔u╢|╡tцрЮ═:t╗кў█H8а№╣i╪Щ2¤ў╚С_LYг∙══юяU╖╓%╨ыC╤}ЛЖ┐ЇыGЯ▀ўпб╡ooз1M╢╬Я<ЇЗ╣o_▀еыm╜Я╚eЩТ0b┘;>y{╞ЛO;;╜┴uквоУ┼aЩЦЦ°b╘╪х╙'_╫нуm▌ ЙЪ▌╨▓AбЗ3иiзKЦ#9√■°сУ▒/┘╣ЇЎО=]3▓p╬Дм║їюю>░R╡:qЗ╦║Бй¤Ъj█Й4UЪїd╫ї_н╛уёчпl┘┴╩П▌З DZfщ T;7$ГrУТТ5XЧёаy:l.0ГДшОCq+РАС╙Р╠Б╣ш?8∙{╢Ж9╓°Дн╧Ж ╤%░╞╕ ┐ъ▓ Ж┴▓эAnхm∙qh╖╗кVл╘g▄9лЬх$b{╢Нь▀K╢Єюю╤╜╤--ф@)KMП3MAUХЗЪGс╬Ш0e╪,5#КяРVИ└№╛№9╗П╚╤╜ыv`╦┌^гц╘jx╣н#╡J,╚]@Ўомхэ█3о_';rx└ЁБ┌Wш*ЦВp0T╫tХ┤╝Mk&<╥с■ИбRч%╕mДе╚Б?З?18rЁh╧W_н╓и▒Cї]ы┐Ы·XЯМЄе[ўшU√▓ыX╕┤Щ│oўъ% ╞╝ияЙ1є╡║ЧG;╝uїЇО-╦U┐░mязл^q]" Kц┴ ╦ц}8a43╩5U+[UЙ`r%3ь╚Й┴┴Rёp Б▒є,9Р,╫ъ:rу▓ь]Ы't┐╡юэў┤ьў\BO1є╖O╠yn@∙єj╢щўьyНпНл!╪ШU,╟ш|7E0└}Г┌ @√x ═▐╢■gъЁТUкWмuЮыв╗ёtт 1├JЬWx Йщ╠▄¤э▓{Uo╘╕▀Ё)fzeєє@ cрР╞8ьi`Rl№`╥╗C╒╝║y┐бУ)│E╦■х╗∙у^▐╛~уЭ_║мe')ФNь╚╖│_ p№д+ok█i╨┐ЎГцСI'>▒▀=█Z╤щЕQunncia,\ш╪Кмы4ё═╗П}нE W bў])Нp ~;OH╘E╫#▓╘QД,.VsЧD%╕┘уY│MhT╟ЭУЙ,р╦%:Ш╩б╚░╟$v¤■Ў╨gv ▓╞╚╩h█є╤&7╢╢фtCIёC;╓}3эї╤CG√LЯ[жF -vЇлў▀■l■┤ZХлЧ.]╡cЯGг%JGQчЗt0зcкТе) SU,U'Ы░ЭлxДнтMm ?├╕iБgXР`ю7,. л>sтёЛ█ex▓┴ ╨N4ч╟yУ? нr╣ОIъНc╥│$E,);;зc┐5]nФм╡исZЩД._8ў¤7Юй{]│╛/П╬E"n lЗBзKё ╔│0Ы ╓Ш┼ok╨▓CзБ/q%hP╙Гq╘*zТ)аwЧ9╬┬T]к█А╞4Х:, НS+ПШ░бj║┬╨┴ Г╞∙\п*ЪюHаЛ,┤PИ+╕n╗▓ +╠└└kNa┐Хl═2ГаХИRtЧ─%╟С|ХЛzB0пЁтр`"╒эU.╬v ╝3┌ ▄VWРУмй"ЮиH╔u░о7Sём╚ХР:ЦаюRЇ"s·а╩аЫBeaо6 FтЗЎ▄Ё▌] /LЛ╟fNЯR└╠У╗~╫о╝2╒ОfV╪╝;;,Ю╙h>3OjC3ьF ьsUv▄0НmX╡hц?йP╜№Э}Гм╙@╨╢>]·■·U_^▌эбV▌z╟$\vоHЪQ]ч╨Жo▐у╣Єл╡№мФY6D├`l╞u'H═▀Ч,Y1eшЯ9√к^qM╗Vў┴ Wo·aї[s*Ц=я╬ч^╠hpy└Vт{6}0q╚╓х╦/╜йE│╛ї*&d═9┤kэ▄1Я╧Юxk▀чы▐╒5#Ь▒wчV∙╨S╩╡usу;я ▒Є╦Ъ═п┐▒EgXGqНTи▀DХ ╪ю╛ k%;╛pцШ=ыV\▌╛╦ э{)Й╚ЗУG¤Ї┼ъєп╣∙Ж6j6╝╥VCВ,▀ кь╧?6╠ЄД═х;z=v■7Щ*zY4FeЇЫxЖ╜╪ ┤р`E(ж pж17Ж[КвqLи╟j;░┌М░Ы░ ╠мж╚d$KЦДUttж№З╩╨bZ70Г= ╘ДГQ└`:Л"╚ К╓ЬЁ:Нц▄╤sp┌MT7█vI╒║Н╥3Ї[_ ╤вЗ?ЩY2у╬ЗЮ.ЫUуаЪыy┴▄гЛGL╩╦е=GПO┐№ =в┘Ё╒шGР▄HЩъ5юь┌G*]╒▌╖{ё°╫rN∙Kпь4рЙмЄU╥ь▐№√Фо7┬ОQё№&ww╪ ЗЎю№x┌$)н|хНэ√?нЧлъ└6П^BЖoM╤aў╗МEя>OТл0fЩ2╡╫п■bщ+}*]~u╙╢Э╒Тe/мUs√ўл▀~эХьэЫ╦Tн╤~рєyсТ╒ъ╓╙TВ╔d<_█Р:UWx`RW,║їч╫{?рFЄоь┌яЦ¤O╟╡яЙ8~LЙфф·}¤бЯ┐°ў╠ eлЬOЯ'j@а U*fЦлФGB▓▓(┬¤MЛ▀Ь7Їё╩ оl╤╡┐Мйo┌╥)oьY НкН[v╜∙■G╘╠Rё╚Б/f∙~сТ ^╒к╧У┴Л/Е▌ьшЪя┐Ў─▐mЫош╪√ълЩе:&MщКЪ│s√КYc~√ц╙█╜ZщЦ╢A шbщ█m╦┤.8GЕ├Mм* "NСH└ ,tzR[└С┌*є№Г°O╘xагў ╢&-▓є╜╤п■эЧ╦|и\УA7ФмDt√ТQп┼]еы╚й7&,qx├'Bч.ЩЄ╠ЮMыЪ╡}аЎ╡╖`Бjч╫.Yв┤ XH╓├<ВQZЦ╥╒]┐o`GЎ╝?e╘О_7\█еoє.│┤╩XlР#╝ВИл╨$VуВ░┘#MюOТ╧~╚УsГX_ ╞Ep&╦Е}╪рp│Г[g╝2Ё└╞o╙2│┌>°HF┘Ъ▓vОюЪ3fH$╟*WлA╖!гфРЎ╙╥w =qx┘м╠Ў={лe*╞]╒РГоijAАўдTн╦┤RетlsDwё9R░маАй$Р#GИ#ыИ▐\ЛЪ▓* ЧкИЧ$█╨`▒0Ь▀╢╢пY5 _¤ъ╒иtK╟Зh∙:ej╘O╫ї°бm√╢о=┤э╖╣╙&щщ]╢RЭ╞█vяWьШaц¤·¤W+▐Ы\н■енюяK╒4f+=╜J╜·&╪ё╪ю-?ЪЁ,╢¤У╖┐^2┐╓57▄rOOЮвf(щ%к╫╣╨█@>p╪╚дs╙с)ЪкГ╧╬С3└ЎО╣кжф╚┐Эц*ОBmLЯuЎT1ЁUр$и┼иEuД╜*UОk(f$.3о╙Дж╔▓b█H№s<╙еД[q╕+╣ ]бВfRУ┤L A3┼:HoNyA/г╟Г┬╠rGУё`ЕЙs.ЮёPX ь■Ъl ╟╡Б(DКf┴╒!ъШ`║Тp,└├оb╪T к╔,ьМ░'╣b`Y╫╓d,x.И0ЪГгЕCе|_╧чЗЖКL):p╜C№гЫ pХйq┴тТ ╟тsAuйШoэJ5╘Фbс√pm░╧i ЬrПLDcЧАцx?y├tВ╣`>д╘q░УЮ┬U╝Zг.аn zQ░"+┼ЩЧ╣╟{#°л0`dЧШ{УЪAУyс@╔SД#▓lЕC╩fLN"╘`(u╨ВїJ┬c]Й)╨и  !5№а ╛ї0▄пщ ╟┴,$L5ч*<dvFТ╪UЎї°KmЧсЩк"╦╘2░-ъPgуЪ│Х▌╪бЭЗ¤бeуzбx╬╘ЩУ╚Ўm╗│2┬ёxю·Э╗bе*чdT▄y8кБхфъ8╤'оLрFkХк:!i▓√╦w╦╛9,{╟&╔21єIмё╥Х+З╦Vlr√ЭЧ▐ЖiI ▒>Ш)▓┴▄ТRьўo>ЭЁ╘аv |▒ю ═╜Ф/А z╠N7г┐Є╓█oMЛь▄)ЛcoЦ╠*U║╟/ЧitmTТ│И2ї╒l·`.2╦Є╒Э╛н╟@░ЎV▓ш╜WЮ"nМ+Щ╛>▒aУKF╜Ї┬╓╧>ФФ╕DL╔bЁ╚й6Ш*Б╜УЦ∙Ёkгk╓╣8D╚kПї▀Ў▌╫Д$╕dJZ°╬G▐╡cї№╖$╟┼▄жМ╥▀Ш^║vг8╤B║rт├Яш╖ы√П:?їBу█┌Eф░#x▓СK?XУТи ЙчЩ ш 6[Э╕6╛!Ё7Мr─уdд╦B\$КЖ%С@ #│dxurEШ╧ ,Юу1╝∙\є^Y2бг*╠Ив█x№ў╫▄°╦▌;▐·3ьRТ(y~¤Б#▀TCЩё├√цО▓їзпйХРJ╒ш3llе┌ AУz+¤XЎ ╙3`хЙ *╬&┘1R┌┐[К▐Ї$╧КH╥iЮB№пх!дьє Z'S╩iMР`4s=.L e4НYj╬юСГ▌╜}G▀WGW╕°J;РеRЪў╟║QПў╢▓7ГХН*╩╡╨CгзгF"░Ш3║┐>╛qГz■yЁхю╚y{94лАнРTSТclh╦Zа╠#г'f╓oв┴▌k╛9ЁaА4х╩Ф▐▒{Пд░ГzаBул┌ xlГЙ─Yaорi q╞д╠П ЩдвmсшЁW к°ЕQc╔HIдСdьP╛╩Є╨Хк{vЫТbbєБхД№д┬║ж!7a┌uh├╖╖6о░гSg╜Ivo┘ХЩО&юяNФмЬЧ^qыБ\L■EИк]·xю!й.Ц8!│ █№є╖KжMРь<\j у·╗;6╝╢ЩФ^╥┴@IОДм"ЛNgVИ'~∙сЫщП=| 3╧5l╒>Ыj╘╤ь┴ЫШ╣?п°|╒{я┬╞Sa)ъ%н█]wў}Ц пОЭйKя═Ю·╦ЧЯj░Lиu╤-эоo█-└k╛\ЎщВ╣╠6A▄╫│OНzM▐Ъ2q╟Oл4ЮР╣-╓кJ╧g"зUj╫w@╒:╡AM╠5z Ж╜в▌┌╢]ю╤#лЧ}$S└ъо╬ь2реP╡║yD ╦,╙ММyrрЦяЦ▀√╠╦Mюшp▐? K6┬╓Й║ь▄╨╠ЯQр>?╪gV+X╠ЦlхM·b▐оmкИ░╦мz~√■ГхТ`!&Ўюx╠kС¤;IfйN¤/YхSMgАL╨шw─┘т_э╚╣УФ╧░╕gE╬ф№с\<Ёs&g4╠ )9¤Ю├лха╢ёкъВ}ъ─t+Є┌уПь▀┤бяыгл7╜щРлКЪў╟·EуЗЫ9√1dжИ╪с╥н·>q┴y5bЗЎO|хE╦CWnQ╦│JВeY ╕Fц¤П=UоZ-╪O╢o┌°▐° Х╦Х║є╓цo╧ЪЛ%ЖnФ.╫бw PЩjr(╙tI╬╛]є^zвzНj7╖h1}╩jYаv╦Uнzo╫юV┼:D .П}!i║└▀!7╛сУEє^|▓v╜┌='╛ХC1╨ЮFHжnШ;Gv№ёЎ°Qюс]V\I┐рКk█uщeшз?┤щы┼o│R▓F▌О}jЩеlЇ│Р7?Я3j∙─W▐▐ж├а9jivеRАвЗ Р║┘┐{╓╨!фшСK█▄╫ЁОv╔^ЭЬu??vl6fn№юы%3зиШЧ РА  &э▌╪с■╞7┤Hha╟eg │╙ЎуЧЯ}·▐Пhjdн]зN┐m▄╕ёзЯ▄╪╛╙e74[╢|∙┌EoJУїRU_q╧C=sgПqЁ╫5ам,5|SЧЮїЫ▐ш -дщЫY#ЦN|уВ;юы№╠P$#┴╕rЖ5эет:кEи9р═Й═5${є:┘Н╗вRЄ │Т╒┌ў\│J%'Цє╓°Q{╖lRЁL╫~NQФQ ╢ь╤зVу+-Yw▒t0`yо╕ ┼О╬¤zЎО?$+*+К├НЮй\я▓SИвБэеp╙╓S╧J╩ЮЯP6ирп╢.═╢o¤c■фёfЎ><`LHеpЙК╖wы]Ўв&Цд·m├{#^╤▌8ВКc╡╜Д!P5│DлБ├╩Tк*Й Еb╬ФЯ#\EУ`1╞эЭ;zШ╡wЫьZ\ T║фъVїsd}╫ц_Пж┼П(X(W-]йтm[┐3gv"'Т,;Ж■OXьо( дХмYя■■O1=Р╗ч╖╣╞;√°ТSa,ЙЇk╞]Eн╥ш╥О╜·:jИJЁ╣&Ато.dqzOJе·К█Ш■ў5№м├ FOд Юс9░*4╨├√w┘Ё}Л&йN▐┤ЩУ╚■?vd ▄╧[┐kw╝D╒╝ЇJ[DЕЛкpёЗ|ў'╛О8'B7▒б?ЪоR3Цg+i┬╢┬,u%Ь'Ън*niу╠5dр╓п?7яЕ┴═[╖nxGkнtu╩4фС%ш.Л╦!'OЗ╫▀Оc╥пв[F╚A-°.hV╟Mф)╘T▒а7їОQBчЦ?*┴5-√F ═Х▓╕eЖ└x░cКD▒╥┬}YS╨!LI╖i$иp█╤ёАcЪ▒l╔╚Ъ.QЧ╪ЦїVL[%ZиМЙ ╠tЦG╖ :¤Я╧FLўю▐Гъ\╒▄Cї/l┬IЦ*пИЬ▄ЛL ¤<Iz╨O√·√НЕбЎ░5:qеxnР╗▄r5R"╩d╡dщhK$nьDА┌Дхи┴4У(┌`Ршh</Ўш ЬЗяЯ▌3<9▄?}я■iкЙ ЇиO▓TNs╗·Ыче@NВ░A┴rЛзУ )mьаь▓шСЩг_█║Єу╓╜·╓kqw"│lВР07╡D.╓Ыс'HВ─ЭЕ▓└& B▒(БW^ЦEю,с.z▐U#тr#лмЕЇuА_9П╟┴└└ю┌ EUd h,Je-н┤┼╟qB║"9f┬─fБАi 6=q■j<Нр▄є╝ЮЄби"└╙┴8жЙ5/Ш¤ЄS╡╧?я╬з^Мщiы\°кыО ╩╠╔╦KЗ~)║ ╠HgКAtbбЖ=*%■─╠%0МtNe╟▓i"Ц╪■╦·╧▀[ё■╠╖▐u╧3#есKhN  ▌yyiX Fcс4─EтНN╥slвa ╚SГЁ·{▐}╨╠╠К╔╢lШqH-иoq└╡бФ`+pMr$'a╟r╥с▀ОeСТ╚ъГ'а ┤ОЛ■╨АM▌t~Д├уU╥M╒р!LИА ▌╬уX*QЦ╙2` ╚CbGуЗў}9{┌O╦?┐дїГ═╗Їa╚fэ buЕЬАK ─i3Fд└а Ш╪xvР'╕УИъYмH1╩Дц┴ ц8AUvb Х$Ж>;Ъщ(6,jЧ▌╚bТо(ЧIЦКJШXЎ''о"╟╢Pd┘тD╧░╒ #▀O┘bjdje[╕I1№8 8j@2Э ц╡─РLErР№lN╫Е`ъо└╘27√`║к║L-@л░└eмъГеЦ╕оah№жbеф¤КU)T╟ 7Гz╡Д$WЗ->r$Г8╘ц─(;"+╦┬к┌TK─x%СqЯPЩ╥Byy`╖+в▄1ц┬bЬЖмRGQТбfЦ┤0_╒$Цй┘о!2ёh╛└уЪ╞-.9к 9j░ТФt-нI╬_^hjN_cЯкЮєj6чv/(nд┼О:╗■┐√ ╧AЫ6╤░N┬¤яnmROs"3fL${7o╧╠ ч%выwюIФиIп pЯ+Ыr┴ х3єр╬фКRaЫОё▀ЦКiцЙ`nУm.╗╚ТA юйы╩*g+X|╫ЙTЎ┘Ш╫Ц/Z╪■Щы7╜YQ╥0ьHж."pYhОЧёxЫъ:|[┴нO%ЖД?Xт YУAЭ#╬╓Г▓а~bоГ`ьx╛├lт&░╪╕)ВyЖpSa╫dzBЦй&щЬ]УєСyOЩwътЙГЛ lВК█u,ьysp┐н?|╫nЁsНn╣;бg║xPD∙Ф;-╕JIЦ?=PyFjqmb ╟R;xЖсАь&Жкc╚ЦЕ╟"Л╣Мg▀.╒TЎ'IЫ.Г¤Pа%<╧;│sЙ3шсЩЛЬк┴sр▌'^,т╣У┐6ф╘╛""ЭФ:ё╠х▄═KAГrкSLjКA╡т?L┘"оiИЩёhПэ╗Ў>lЫGп║л}√'_>lФ┤,│┤ГXg O┐ёМ^╜З┼8Е^И т<┼dR)─EQ@<┴G╓gМSP4 й╫EР,&-`|ЕюрбЛOGў>╓аХ4 0f^JжОм~^Q▄sёbциОб╣AУc╒QМ┴О╛Чд|ўЛєкЄ.B░гш Лж +{7F╤ЮЁv(*,cП░ .{ж`XГr ЛКuР$░w■}К╗хIE╞─╥ ЪЇ▓{D┴XDГ Ц"Ж3З╣Ъо╣ам ┼:D░╙`Щ()"╛йЙМdГ]хz ОЙ╨qm ∙а\C┼w├З>"Q$@`JЖ'Й0 h╧<═S·│╥К';╒,╥р_їL ЇЎi6xZыЁ █<]9╛┴sр▌ я=╞┐┌аMt¤└╬ь ▀▐zI├╩ЭpчЎЭЩ!Їюя▄cЦмЮк┤ї`@.s)(-*K$щoуЙ╫МЙ3\жzхУС 4Ц╟╬o╙аtСБHEэм]8чє%я▀╘эс╦оmA)╣2f╝f║╘бжлIШ√вк▄MаWSГbLЬзEp"чЁWYд$л ЫВ╦Ъ8FА▐┼@Пr3╧Ёа╧"0ШK┴mv╨L :ЦЗ1Р^51ы~c┌cки┴█╜╠ГШгБRqeєш№Спo^є├нП╕ЁЪ[r└Ъ╤u6uF%жcxдЬ"п░рФкЖxья╟mEgЪЙTpjZ╕С╙а╧;╓Kпy╡хE╠│°А╛ √>│tЮ║Й╛╧v;НйЖMсIk"0═лФю kA.┌xсоЬYСр┬_,▄`ъKО]Jnг┬╧ъ╕O ўП─й\з1фтg?U#Rq╦Жд║▒╘╔9НОЯ¤r:ї╨PN╠У▀ Feb(иВE4╤┌╟ 4╨╗[·╥S[7яшЁша┌Ч]EXЖ@ъE{Оь ш┐$╔:ЪX╠╤ Ї─№K╣Y,┼√=║░╙є╘├,оччd├"R┘╔ё╧Ё╪хш│;х>~ь{Е<ГЕ-ЭЁ<╔▒I>хS&∙_O ЦQ─▓Еy1╧Зc*╡j[ЦмЗа╗v┌Ї]Л&╡ю╧Щ6Сl▐╡;33ЛG6ь▄meUЙеU┌▓?В>зМ│`<Юз╩KИ.н'╘а` тЮ╡КqrH╝┼AПф]─=?РЮ8ЬП%╦Kr@╞d bг┘═╥m╔гuP▌a└РсК:;"╫│$HЄ?.и*ПcTL-├8Q┴ыm:∙oЖ╚'"БИъФГjqD(%▄OR%=4"ёE°nЙ╚1A'А,@-├їXB╪>|DMXJ║*gЦЙA3╠ JоNб м*ХТ_я°╣/4Э$ї▀╜dЧУ╖SHpЖЄWFъ╞ ▌цX├Е/F╧F■вЄ▄Jо"&▌∙.ь▓АПh2I║июЩ┐йИЇtс]\┼╨ъДEHдв=<!йzЫЄВ■,ppКУ─В╖ь°Йxц№$П¤xuxq╪∙, зюyёЗ)З_h╚╟ є°хDЛ^:┐╕5IдS,╔╙[╪Е%х"?╢H╧Р{¤wИ╟У3Июk9╢7KdХйА|▀Lу1дЄ.╝[tFф╞╗╔|│$*ТE-Yд┌г┴s∙'{ОЬR▓┤9fNyўз\╔F╣H#├/RТт░┬ыw╩┘M9)шЛ╞@[rCf4v╘М24Т`▓м╙KФvРB0 Є┤!.╤-п4Лт)$╙╙dбe$УЗuЬ(г Ъ├0ЧЗ3JиБ,*Б гс╒▓╔DЮаП тАUЛI╧їz^уvк1цMw{VЩф╒╙F╥QЩЙ/пz=╠П`ьу∙o#їФ9^пК@Pя▄╟√╙;]L(╠?└╘.ф_gA┴▒ >Mф╨[╖ = ыR╕Шe ╓▀√O┼3Xфн+А√╟'┼{lq╛XЦОJ▓`Ё$иKe )т_Б1n╛RU╝ЬT╕ ЩDю│xь,╔l┬j1оY^lаT╩T ыЬ╠D▓'┤Л╕};C^╤$о [Еъ╕иЦР ╢zО*IФ╫ФKrr[ЇЄK ╘И$B~HЄbqБ░╕pё╚╔ЛУйbMж№СЭ5┌/┤┤NCcзЮ═┬z▓XНЭTQ┼ъэs╡G╫╞q=OюMзц ;р╣┘░КyЖЕ■╬КYаз╕╤╔zХjmЯ╨лd crЎў~ p+DЬ▀"єfбkRЇF╞ЄVXны:ЦУu7{╧■ ▀6┐┤оfE▐Ъ:Йl┘╛зDVZ"Ю│qы╢ИЦ╡+.╚▒РУ 7▓в ПG=√H╝эI╫Ж▐уя*├XI┼Sюf┐SYЬЮх{#Йфm║▄d▒1@500G▓U╫Fо╤а╟Д└ДЎЎ:|│└iW╪U!F,мёL╕pвр ( zZ▄{░в└Гp]с>це┬XvYDсxДкHe&rй╨Y╞Uк$dТP╤Q#YВPI╡IШ+║Э░Йцjdoв1 mТв┤ф)Iбў*е-Nд╘P5╡pС;NNlфtlЇcЧ[╚Н╠Q ║XDЎ:╙DБ# 3Yф√kв╥Д7┬ш$Ю ▓╨мР┬п╧'8M^┐В/жlP*д─К&║VЛ>C╙П╒╟.╠ ВOЎ╨ПєРS└}Юя ┼╣P╧S_Rt°∙ЎCб?ЗK -'Щ╫╚q╖(2фт№Cз╣ЬКЇ░xяiJюйBIr╧/EВТ╦MЄ^OT&@'ЖЁQ!"М╞├ё╕Кє┘ uEЇ∙▐ХcO@─▒$╤в]ё №╖ВGРyvЧTDОB\)Ш<┘qС(│ш)(╙Щ-C┼M Ш*CгA┬сZзhLbЮ#SЦDэЫ╚л═У║╖ └ C0dт"yЬ,JВbcV°dв░╤ Еqq+тH< ЪР▀├Cе╚╛меZу=чВю╜рZ*/XMB╦z  X!АkP╔тc*Я╙фоYK▌ Fyz▄╗ТВ$┴═![├зНїt$У╩Ц╨▄╕ЭЛ'лD6ШЙМ▄$,═pp;t6 оSрА?НЕ-гI)м)юo#╞|И╦░?╢фR╤l`qХ─▀Z▒йЁў>Цє@pэ╗e┴EФ С \Ф$EyЫ^С%Д▌Ju░ЙйнEЖ/*FZ╤дЮ┬7GpЩT1╜UOТ*┤nсвшзНЫфШ╙3 .Rъ`гуAў0ЦI╕█\▒ K╕wcy MЎlpТ▀E▒╦xp▐л#E─Уд°Оt▄#ЬёlРВЭСєфщК83sAёX┬A тuл┤IАb▓|кЮЯRн+∙ЪЎ╕═¤xНЭ▄=П>2I ўё)░УвИ3g╜GЦz.:_дЗЕ№)w└╙┘ЇП┐iКсў ya├Вp)хлrъб╗_s)EГ╟_-┬/СAЗЭF6W╥▒ODИ$)Її╙°ЪдкКe┘J Hй#хКэ▌▄т╩FкЫ3u ┘ї╟ЮR%2тёгЫ■°=ЗЎ╟╕C дlц6╥╤WВ ж╜UFRжВGбI |¤Р6╬у3вe'╦ОмЙ│K&ж;∙╓QYv╤╜@L ╕Ё)uT╨╩Ю╧ ]╦еpи└=t&щ$yт╞Е╗ИЛWЭPс<ЄFК>?с7a"Ю'╜Б,уtагТ├t4Вg╞ш╩"$i■╗вX ╕Aу\╡1H2(Юж║иПЙ┴4╒┼:&ш ▌`╘╥x\Ж1▄'Ъrкубум╪╘/ '╔#ЇУ5~╩Ю`DС┴кёR1╨г#О,Gщ,>НЕ}мцQс═├5sв"└п╖9с┘Laх| 0 ▀=лКпЇ!∙Р├╗УйКН┐Ж├[wo╞9OЮQу╤Нx╬йTO}2|Ьw┐`Р"Ч@╨w{┴┴╞ГEОёRШ╞f╕┬ЮФ▒ , mК┤МIz▓~ьж _рz/┌ЩФdП лЁКЩ0Н╦6УX?bТEJ╜нrKд!╘ёp З╫PЎxQЮgАbе_пGДЛЪ▓°▐1▓ЬD}`▒б@0╜ON╡ПЯО╞>ХзўNCc╖1╙УчDc■╩┘э╕Ыю∙)З)╙єs▓aЭЁ ПЩ╟∙■╬рF'яU Гф°O=пНe█зфjSEUт?с▄BПч0Miy╕о╗{ўю-[╢┤m╙╞Q k$2d;Н╕─О╧Ъ:Эl▀╢#33#Лn┘╢5лDй*╒j╢1Ж,йя╜бы┴АюеьЬd┤▐АyкOПЩK∙ єеjф$╖8S)Uq╖+|╙.(шg┴з'я∙ ╛HqЯJ∙╫ЬфS_|∙OH╩╫PТТїЪУ╛ir▓+ тнеУк{^|╢═_▒o ;╩К╢yТ7ёD}Х AaфРRн╛Єь▐kТъўЪ:;M^АExб▀IсOy∙ьвrСп№E)№ф JГ'▀ O°(хz√Л8сF╝Ёа─? 6╟в¤)*┼q╩ЬEOО√=┐['ь╘дH╟╬bнж\ ┼_|9З┬8ПEзt╥оЗГр:С░О= Е G Йf╓В┼ХПKэ╚╤#У'M▐Ї╦ж┼Л▀O& pП╞6м_ЧЧЧ7c:└¤э█322тё°╓н[KФ(QнZ5пнтN░| └¤`Ё╕яЛ/╛°тЛ/╛°тЛ/╛Ь М▒X,vzp?\АоcB233srr о)И ЄВ√)еЁ√п┐■:yЄфH$▓d╔Тdї=╬г╤ш·їыюOўс╛/╛°тЛ/╛°тЛ/╛№чфьр~"САo ▀░aCс╦<4я║окк^╣т¤√ў/Z┤Р¤З~ш╡у├}_|ё┼_|ё┼_|∙Ыфьр>рu╙4E╘^pM$┘▓eKЭ:u╥╥╥°ряы>▄ў┼_|ё┼_|ё┼Ч┐I╬ю╓pи{├Ж ▓ЗFVо\╣`┴В.]║\u╒UЖaPJ=я■┬Е с·EЛy▐З√╛°тЛ/╛°тЛ/╛°Є7╔_Д√? №3№QU╒;vМ7╬▓м▓e╦Ўю▌;++╦З√╛°тЛ/╛°тЛ/╛°Є_Ц┐ў╫н[░▄u]EQа)° Жсеъ·p▀_|ё┼_|ё┼_■ЫЄс■┌╡k▄├?U,9═m█Жz╕▀З√╛°тЛ/╛°тЛ/╛°Є_Ц│N╒Н┘╢m└z└·оыzn~M╙3П/╛°тЛ/╛°тЛ/╛№нrv▒√ЦedWP{╤Л ╝√p¤▐╜{▀ }╕~┴Вкк·┴<╛°тЛ/╛°тЛ/╛°Єў╔Y{ўм{╝√·╟╤4 Б╓<а^8Шр>▄b╔Т%╛w▀_|ё┼_|ё┼_■V∙ыUuсП┐■?№н┴eЧ\r аq┐╠Ц/╛°тЛ/╛°тЛ/╛№Чх/┬¤ 6x░~я▐╜'N\╗vэН7▐╪гGЁ>▄ў┼_|ё┼_|ё┼Ч ▓№E╕°~:ОгкъЮ={>№Ё├6m┌hWхlр~VV└}/╧ЪH┘ю√тЛ/╛°тЛ/╛°т╦)┼C╦зў` Ё╕°чЖ ─█╢э1lФ╫їbўс/Зzя╜ўрпкюiеъzI┬)┌0,р6Жax▌:╟O┼_|ё┼_|ё┼_■!p└╖З╤O"А▒CбРчЮЗп|▀┐?@Ї═Ы7n╨√е╓C│999╦Ц-Г+?°рГb╕#╪ йс~╒кU╜&рf)╗щ║$ю√тЛ/╛°тЛ/╛°тK1┬ЕvдЭ╥Н^XюГAю?xЁ └ў╡k╫■bс#З{Яn█╢-==}╤вEрр■║uырчЙp~йPбВы║^■o╩C°H╙4А√з<ТЁ┼_|ё┼_|ё┼Ч │┬є┼▓мSzў{└Ў|ЎЁsх╩ХГ ╘]°Ъ┬╨┐└С╧Д\w▌u├Ж k┴;OH$Ы7oN┬}@∙еKЧОD"Ё'╕ ╨я6)╜ўС-T\:п/╛°тЛ/╛°тЛ/╛№ыФ┐=х┼Й╢p▒ы║╓╜аЭ┬╫№RЁw┤ЖOOOяБy°г%dц╠Щў ├╚╬╬▐│g╧)O|ё┼_|ё┼_|ё┼Ч }▄├№∙є╔ш╤гшя┌╡╦; °ow╠_|ё┼_|ё┼_|∙лтЭ*╚  k┼ endstream endobj 204 0 obj 55 endobj 205 0 obj 179765 endobj 200 0 obj << /D [198 0 R /XYZ 97.768 692.105 null] >> endobj 186 0 obj << /D [198 0 R /XYZ 137.394 432.779 null] >> endobj 201 0 obj << /D [198 0 R /XYZ 97.768 204.68 null] >> endobj 197 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /XObject << /Im5 168 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 2473 /Filter /FlateDecode >> stream x┌Э╦Т█6ЄюпШ#U5bHЁ}┤;Ы▌uykf|ZчС╨k>┤щЙЄїщ(JгФлrh▌Н~7ц▌╙ЫЯ>жё]Vyrў┤┐лК░╚╦╗<+BХdwO═ГO║╖╟╣╒УэЯ7█$╩▌78(ВЫ8hм_(В╧╗ Щzr╝ыkФEП<▄ы╬╢'─сц╖з■Ї1)╧$UФЕiT▐EDэу&╬ВaфsнюЯg¤lг╖=ГзГс┴#├ўЫ8 И─&╧В{к(°Ё(─ПуА8┐█╞уИ═-▓r╖їф╖qVЙ"&z▌UVA=t╟╓Lv╥кКВa╧Ё▌02;3nА▐ЦH6w'7Щn█ШпQдzГТтЕ¤▄╫И╨]hЇд├═6U%єО░Zў╝лЩ╗#Гx?АЬF▓▀ёnFШёу╜"╣PBB]м═<ЮlaЇ┘Їf╘УiPM╝bБщ~x▓╞NO░╬╙╔ с▀'Юс[уюпPПж┤?p0Э▀ЬE╟┴9╗ЕёБ¤╝mUZЖэie+kєД[%*╠"╛╒?L{Deз┴G█}Xь&Hщс/╠.О╥0╩┼ъ╪Xр─Х▒5А▀■4C=wжЯ└@:Г,vCc╬$Еяьоb9+т0Н бЎ╨lщ└+ЮТ"╠│Jv▒ч╦┴╓с─ц&a═ їЧСяLЎЬ─I'∙Е·$(Х╟^Q<┘гЯсрAц▐2QПyтэЙfйh╢Бщ98 G[ ╢Ї┬aЬ@,ЖxYoсkЩи▓ у(■СL╥(TЛL.╒C`,└Б▐┘╓N'╧ЧCХсХ,╛[│Qp баЇб ьО╠ЩЬйЮ'├л5лFж█Щж1▓ЩQщQ)╞%0Cy[u▐ц(ори╙}oF^╓Оa▒p╒r░┬╘АD OЎу╨y╞С╫Г/\ЮcШПЭ Р"▄0П╡МЩE5IС┐N ╝Т,9БХ ╬уГ}>┤Ё╟оЕ╢Ж┬+аX+а 0Тy╫Y!┴╥─QcG0мЎjпц╧8ў╜╖ц╦(╞a1%/нН#├L1·┼БЫL╔Qё├╢Н▓┘BXБаqц?Лy╥В3ЖшЯeb^ ▐ls|Б▀Шez2ЄP▐Е8√╨#л·О?║Э╧╤ЧXV0h╠#Ё№№L.AК|:XxЪА╞ж╔_boЇ4ПЖxCКйf?╖▓Бщ&Бщ▌<.▐'qX$щЕ╪жГЦ0-АQ#ьв╜╖├╤Gї┘▒Вa° !|жD"Ь√Ж╕+2Фi¤╡LЛ,м╥ъo╚ЇF─▀╞Х Х*/ √XЖdEi9о@фї╕Й╦Т ╬єрHn'{DWD└╙жR┴0┤юV&╚Є0/RссC╗Ыlн[╞}╘ї7оAИ╥(m?ЩЮ"ВI80bЙ╕ЕSкаq╫xuп[йA<kнЭЗ8o╔▐╘рОж╢║╡Р┌r2Ж╬o▐╦Ю59<н1Щы╤вхe XЮс%└ЛkФgvq┴г8K)pmГЭ.и f╗a47\╪ь╤ю0╒20Т(╛@tVЖgётL╫└0Г6 ╣О* ╝╗╙фOгг╨a∙ю4DA<ъёьN7-БЛV■В}бTЕ<^,еН\e|═лмdQЛ6╢дZ╘E║╪$YАЦK"L=є▒╬qОЄрЄНLЙ╡░┤3Шs_Мщy~A\j▒т╩h`e╤цk-Н`х╠H&ЙЛО{F┤╚\e9─ўZЄ=L4Я`;иs`░2@Э╫3иAУsРФА*╬Е Щи╞┌[и ю╒▌а▓ЯGи# п╚uxlyЮДЇГРn^╕Ё>eqV;T'┴;}2╬r ^Р┐КSт╠ёгЭ%Qн`яP_~yd(Тд║^Я{▐└9╓|)CL·x╫к╕8_BZ@▄╗╤шЖzПТ"ПяЦ╔HХк8*иj}х[М╞A┤(еk°▓├└wФ░ТХвT%>╟8┤z╝AТоoАЭчВ╒├ j┤bJF╪x▒t1=Ё╟Ыш¤н·╞~C"x┴╪K4i[¤▄шj╝░КY░·■є╧Ы4 ▐Є▀└я>г√╜╜g░Ф█╕└х╢АЩ;А┌юu.g╩5Тю \x*Q╝ЬП╧ImЁ}ohэm┐╘╫`╘Г┼ йЄ\{БбGw╟▓ЪъЛ\▄+╟╛Ш+E7Ц"э▐Мжп%╬█▐яУMTр╚(kЙ&∙┌у`eЭ2▀ф▒хїН№!tВr)s+*Ъ1PэЭ▓ч*T▐*К╜░ УVк`С Q*╕МR╤╡)ЖG╛I╟х S =wK╙aШЯы╩7ЬОXER|╞9Е█│Xnw╘┤ и┌s-╡Ї╩RDIG╝╙д╒√P¤хё▄rSyA┌J╙;сG0╔╓юO$5,.■ЕЗ═й╙GЮ lўА k$44╟[ЕPZЕ╩╫bД╥ЁiР.дь─╥█ ┴╔ZVhАЧХR╢nнРKL■╛lB╜уўт╢ яж&ЗЛ$цnЬ∙ ╠ўЩ%^┤ЙDр╔д▌7┘р╙B"i! а╫#A93СвBB╨Q╗╔╚xGм@▌▐/И╔#с█┌▐я2ЬmoпM5F╨╕┬┬Л│V}рi┴╧▄▐ х▌рдЙ╥╧ тчQ▐~░█8ўd;SыЩ0╨Й╧у╣▌ГD0:Ж│Еa█u:╩╔(°кTb{ИЪ¤Е5╖'XHС "_х¤"║ /╥1R|)^97vмчО╤ВК__Qк7шZг╟Ю*6hvц└w╡а\╚у ┬┌"░юЖЦС╩с3И%╗▀Ь═i^ШЬЛ;XЩ{+_N╒'ZЄr ЖR\Бн+╙▄ zN╡╝ъ╜╛t'╘Щи4Т╪Ы╞в╝╤*ТRyZLул╩VAЧP7;м╕да}кз"шxЦ}Цeuж═яxpэeX╗ьdkIщЩ│az┘ыt\╧гєСнc│╟Г╢%^w╚\-╨{б╝ОRдtФ║ё┼╨;n┤8n$О°░╕ЇкчWнuАХ(Ё├р∙~шБ{ ОШBа┘¤тф╤%Х▀OKGЩдeЁI╫pn╟k№ОГ╧G2 ZРGz_╜╒xкЪїBI└¤UHS▌ЕvB▀╖¤8&LёЙh¤°Л+ЭчО_╡ї┌ / +ЙЧg║L¤├ MЬэ╕f╤╜fw~ZOве╟┼}Ї _эПIЪЖq╟Т}у┼╛ ызї¤┼!,▓Hёы▐HE*,Л WЕe─ ЩИщеї═Зз7╫Є╗Gendstream endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 612 792] /Parent 176 0 R >> endobj 209 0 obj << /D [207 0 R /XYZ 97.768 692.105 null] >> endobj 210 0 obj << /D [207 0 R /XYZ 97.768 667.198 null] >> endobj 211 0 obj << /D [207 0 R /XYZ 97.768 604.643 null] >> endobj 212 0 obj << /D [207 0 R /XYZ 97.768 482.476 null] >> endobj 213 0 obj << /D [207 0 R /XYZ 97.768 271.034 null] >> endobj 214 0 obj << /D [207 0 R /XYZ 97.768 148.479 null] >> endobj 206 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 217 0 obj << /Length 2056 /Filter /FlateDecode >> stream x┌uXYП█F~ўп╨#X4oКП╬z▓Ёb└lАlZTk╘E2_MЭ~лллыюкj¤Ї№с╙╧щvUЕUСоЮлк ╦b╗*Є2L╥|ї╝ =иMovоq╙√zWI`╞╤Н╙HЛ4xs╙Q╨Н╓ё6x▒Ы▒6Нd;Яьр░ъ╤нур47fr]л╠(дo╢iо1u╖W6{;║ЧVw█╜ ';Nо}QеъбХ#LоЗ < kн6qVi┬╢╝оу<░├(тУ< ║Г|╟ JБ!ы╩Ию0╜ну(0╨y░ВьM¤зy▒cH╝?¤Ь┼л8л<'╫ARЪЗY%Т╥0Б6Q_█╔жЮ1{еeЎ ;мл- ;аЩ▓╜ ╕&YXф[ц·|д│`ъ┌z░f┤ьЛ*ш╗^8F┤═VE$ \┐ўM7Шйtso&#╟LkЪwDSЁF┐ П!║╔Л5{ё`;]╦▌йЧШW┴?¤кМОЮу╔ь╜сМuЫ╤a'%╣F КDХ%шB┘В╥@░▄ УaЕ ╩м[ыЧS'▀ыш╤sDjКф&═╩рщ█7┘ШG;ъ┘у`н█╗щu░├┬┘Ї¤╨Щ·ъKCR6ф╨ bиsЪ[ИХL%Ф▄Ш%хР\ЧYwЯ`ЧЩР&aЙ╬кuZЫЛ4В-I№у,┤kдTЬEaЩg`HМ~!gлT9?═$ЬA@. @27p╙╕V1╤_ФZQfP`Ш[9oФ╡i¤!°╥┴Kф╗НWш╥ЕЁоZїЛї8╓O'Sы╓ОТiЖ}Д╓Y|─^ллЙJЇЯ╖ ▐ЫaяYўє$ W╙═╙Вд ┐рР∙ v░{7╪z▓zТЄэJЮи╖шЦы┐╔Ч█TK к`O,Уm╨vК╨аT>(╒]Pкла└\┼ЮцQyьгк4@ХИьmПър█ъ! 97гТГ▓╡k▐ШsNё╞Э;G.C╫г.YЙD л,╗*rл-║]ЁJ═%М!`■G!ЖВyїmФ▌/_Ю°ФG_▐[sr╡РС Внзяї╤┤/$▒``╥╘╒]#Ф\-Kyu{НК▓С^Ё.Фzп7>/ьH╡iТЩd7"7rЦ4яВ`9°Ў╪XвNИ╖гл┘s█р0╖їЩR`Н,┼XмG;hKУ╘B┌ъCРЙAVwэ4░Х╣/ц─мЮ|м┤z/Уrв┘╟ёХджBiN┐" 'jВ╩DЩg·iццЙ╡░┼`G┤шQ{яЪB ИЄрyЭтjЩvм╫{:I^Вv╩ж?оє┼У=KJt╜уt╠^╞╫ыеEГ9\▀J╤N╔_ьЇ└duKLЛ^▓F8╫ЎГ5l.j·3№█e+JЛеаМ▓╥Л_°т а╡О─c б5К └гюQ=╙bVdR╠>]уЦbFвЦtg╛▌ зC┘Ъ~Ш┌\;hМXrЪVЪb WBмwКgп#оY?═П8Ххc,С&И╔╤╘Aр╒ї#ДзY|═ЛЦ╩└л║Ў$% Hn╝└aгїЬ╧┐lГВ0K╟▌Q!╒7╕H╦f╢ 8k┌YПVїм$╥Dи>ЪqRVУчI░Г▓нN╖ДE▒юn╧ХA╓Э  eоЯП№С{л╝а$╧PгдС г=О░\∙ ГRНqТЕke╫╚rg&йG┘н╗щж&й╬га№Пл)j<5 ц╛JГ╦э№ЭI▌┘FЄш3 r∙в&ЮФ~АБy%═/iЩЗ┼╢╨∙┼"╞9╕Pшn▐Iв░И%'оy┴~рOл"М╥ъъК■╞Z№√N0.CRЦ╩ш+Є%!UЛ¤√~╚J┬кКХЎ▐Z>░рЮOц[?л С8QЪ;}╟асЁ░ Bc~с╟ \ц0оояяiH ╧"├35ЕrлЕ╔╢гЇЬ▓°J; Лb░Н∙ю√[йнгЇнГ ■ЪQфZBК┌═r+Х)e№╨╜ ц$ыЭ╥i┬╙ щ│╙W▌г║─ъ`X░ьtт╟л├:цгPnЯ╬√щe▒╤Ч┼оущЕ^Tы{уЗ■Їв╪c┴fГъ|┐ }Э2);Ф╙╡A|b9Ф^ЫOj°&pЧхh╔w▓ацyъ&+░┌$√═0Бc\U*Щ╦o∙рЭЫ]▒∙№ИQЗQщщhн*╗│Н╘┐( шЯ∙еЙM Zyщт┬{│Фy╓°Б;┌i┼_xYVa|sЙO┤щЭT┴╩?╔кєА╙hnф╒ЕiгAп■ФRY╟ ┌ТЧ1НKэ ╖%,gv<ОХZ# ╛┤q░╪ёQ▀пm▌╠{Э РюMє├щiЛЩєпYс┼Xщ%╓k/ !├╕ф№GБЁx╡fe┴ГПo>,Д;╙)Й;▄РЇ╦U% vP4ЪJ╗f╤!WЯ▀xЎXmГп▄№MЁ[ MЕЯ%ТK" ;у;┌эI`.T°Т:4{{╓шТпOБmт5 U▒ ╡Ьь∙o хБч╡;GIШvЄ▌ Л╝╣`ълgZeб╞╛1ягмфe*0╝█е:`u║У@KЪ■╡u▀ Є╞+q╫╩;F║8>▐JА▄жGj╘▄жБyЁШ╩x▄аячЮ ╒сУxH▐ cгЬN%с╢╠WЫ▓ уB■@DЁ░їсщ∙├▀mФ'endstream endobj 216 0 obj << /Type /Page /Contents 217 0 R /Resources 215 0 R /MediaBox [0 0 612 792] /Parent 176 0 R >> endobj 218 0 obj << /D [216 0 R /XYZ 97.768 692.105 null] >> endobj 22 0 obj << /D [216 0 R /XYZ 97.768 622.575 null] >> endobj 219 0 obj << /D [216 0 R /XYZ 97.768 526.561 null] >> endobj 215 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 222 0 obj << /Length 2370 /Filter /FlateDecode >> stream x┌НYKУ█╕╛√W╠Ск▓╕|?*'п=NЬJj]╓╕r╪ьв 1ZРЬY¤√Ї )ij|h╝║▌_ws~}zў╦ч$|(¤2ЛЮЎeючYёРе╣┼щ├╙юwяK;hлк┴м┬└{╞╜ZЗeсm░)╜╜jL}^¤ёЇ╧_>╟┼ьи╚/╥°!аC7▐┤я,os╗ё@╒мB!R?и┴ЇГйT═{j╒Fu╨¤{╛%I ╕%├[┬4Є├<Уk ▄є√цП[fт▄╧╥BV╜ч{м>╒к╥=_2Aм(JР▒4Ё╓Ї√u:)ў╦╩J?╬▌A Zн│╨√┐l╗╣4,№(═eэ╟оiT╗ыq┘├:╬?ОвЗu╟нx1эо[Eйў▓Z╟└j [т ;▀░Й╜┐ ┬у┘Ж,ї|р8Ор╣xRэvf0ЭМЖО[;╢-<д╫о╬▐p#╧AoБcзzЭl·║ў 1^ФЧ.RZF6Оя║МйЬ╞`╘ж╘{Їd▄Э!9rрь╧Q╖Ф·с╝rнХ╜М╦╪cЯвє0Г┼═(@@иУHЄ┬√╞│'lФ╪cР┴├"ьЩЦw(ЮXLm┴8яH8*fАf╧╞vmCFЕDО╞╨1=╖ъP╣2┐Ў$щЛ╜Эо╒∙j7цЕwш┌о┴D IР.╘╡n╩bЄ lgP6┘АHS¤[AкюДj8_EЩУъ-┴фї╞р,╓T╢ы┴ЎzПЦёeY└ФДдA№zэGбу·%sїюDЎ"ЁУдXф┤ю∙[·qЦ╧c{ЩQFQfоJtu5╚T]OQИf8W╓[ЕЖw%#? ~¤Ў█╟[в─O2№╢ч;ЗD~FoЯ1╔ыTGсеtо@№ ┼┤kЗ▒Щ└╬9▐╚к`ВP@ЮЁ?HжbД,Шf╖▄Эо^д▒Qz¤jpн▄ИkJл|Iр2ЇъО Jьv2зД▌tГf`ўi\╕┐р у2~█&╓nх▄Ў]ь*'(шy╕=sk5├дДкЕ█Э▓;Щx├└уh▌80·╩Irc▀Йd╚░шQBtщ}н°LЖЄСZцтцХ╘ O■RзБЯ╤O╒wДКQBVАЭИУ╚л Бj$NяАЗ,&▒X╙└Л9Аd9J ┘фEb ]r}XH╡hdМеЖэъЪU Дfьe╔VOЬ╡╙t'\*Jв И3GиI|Fє'Ч┴╫╒м░Тч╠┤ТYЮyд╔9■Qe8S"}.Й ─Pzаъїxтqл]╞ |■`И╘вё Н└hЇъ9ElЬйcR-Н\дЛn╝ HжCД░C)K╩АB▓╦CэН%i, ╪Н∙ГB%╨ю ЯR┘Ъ ks:╕tю¤░с─Дэj█Ш¤°цйl.╓▒и] └кVю_d─Р╦ю°|Ш°eТ▄╓Ёw= IбW.s╒R ьlЕ еЇ ═@╓╕B#√▀╪NШ;ие╘╡qX▐╝Р>Щ■DБ╖№[╡РИZР^бЭ"A¤ЁPк╒Ш▓q╣@tXВХк─b╙xJ╫$йB[&╨.)t^▄рN^rnМ╞KщqКu;i%Н]Ї>S╔Lp╙═9g"i}╟Ъ@я, м:щkтн_B]╠ы■*9ъ·$Ж┼┐n.ЙF·%TТiд~R▓э╟~╝ZЗDР_╒PЙ╤}6╡╪єW╩кPWс\ц╢'B╬╥ЬNtч└>: ·В$!Кйъ+f▀MA15Cuvp╥Рu=ч┐TЪ\ZрКлoЮ╕Зw4Z╡¤\╚ Оp2~7└∙╔ovЪёяpШдпцкZV░d░ч┼N~[:Я╠KzсvзЕ╒ы^j╔ЛЙ╦7 №┌QПюc┬░+ЖYe\-/ rьЬsLЯХygч0√┬с▄7oo|{╙:╕з/бЄ* "┐╚┬є▄3■╖Fс╘╗╟зw ╣Уа▌endstream endobj 221 0 obj << /Type /Page /Contents 222 0 R /Resources 220 0 R /MediaBox [0 0 612 792] /Parent 176 0 R >> endobj 223 0 obj << /D [221 0 R /XYZ 97.768 692.105 null] >> endobj 224 0 obj << /D [221 0 R /XYZ 97.768 667.198 null] >> endobj 225 0 obj << /D [221 0 R /XYZ 97.768 425.315 null] >> endobj 26 0 obj << /D [221 0 R /XYZ 97.768 249.35 null] >> endobj 226 0 obj << /D [221 0 R /XYZ 97.768 135.403 null] >> endobj 220 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 229 0 obj << /Length 2557 /Filter /FlateDecode >> stream x┌ХYKУ█╕╛√W╠СSeqIВ╧г╜▒УMХ╦╧VЫ=@$бLС zvЄы╙/P╘РЎn3l╝▌Н~|А▐?╜∙щcЮ>4qSкЗзуCS┼UY?ФEgкxx:№╜╫╛=?юФ*в/П╗"Й▐╤а│"К·чOU}cQ&q^6 -~╡ЩX▀4Н4о├uъб9r╗=╢5H'╤qР╬ы8┤╞9█Яx@ўa╥ыюх┐s\╥::╜ SяП Gю,К,yфя╝и<Я2аШ1ЙI@У%С0у8Д╕ЗZ}?Ж?вў╥ьJ-┬&@mЖIХ╞IY¤0Jъ╕.╖В5и р┐╖Ьe+"ВУqы+*K<^d"{╣e┘_╚E\!└%[р▐/ТеЦтpяB'qZ▄Gqoе╞a№rM╠К2┌CХ╠ъdх u¤═║kз_x┼'и·'p¤ёlPFOR+К9Й,w@Ч$b╕╣8═╒X ┐aЄ╓╢╙√Nж▒oBg╫ёЫЮйoЦа╟3┼nЦп5╧Г?├dЎX :ы<пА╞═ йQ$тЙMn$3 JVЮа╚╨3b├¤╢╝3лХ╠@A6▄ ╝й<Ь Р.оцGu/ }Л╙фА?╙ц╬иЯ{2fйауAХ┘╥яKЄ√4Ъ:о░ЛcТ0 мшН9Р╗Хт┬╨чж¤┼zю╙шn╒┌ы╣├Aгшy}(░%╧2a|╕У, цq┘▄з№UНS!US┘╚BT[3┘]2\H№pЎьJ0qП╤0ёHОИG╥0Q╤┐╪aСiЛКсl√░Щ(@i}└╨ Яи╦ ┌.їe╣7Oя┼QА<УPЗQ=∙rУm%┌бk║ПBюнLї╖ИЖ╓Е▓ ░:KvH╦╚p╧▐РР√NЄxQE└я 6О╕vўvЭ°▐нg╝ЦШ╤,'mm╒HЗщ┘┬8╦а▓hR▒5Ў╧▀╦u╜ю¤F8│·{╙ъЙP/\f_QI╛NG∙}:jцЛ'╖F╘@=b╚Ъ#4wў№{#wшєф┐╜Г█ ;Ў AСяйk,Gok┼№\╝|qNЁК+1Д<6gI╜╟№ы▀┐l=1Ч1XUоaпr├╤╦m%J ўтєъ5ўт╕уУ)╜K&зe?Я5y=РЯЖ▐╦╥ЯA∙Б{ёхчГ[y~║B(ї─┴Oще╓Жзbмя Д┬/╦, ▌;П╛ъ=╛ ╬░ТC\25д╠Ёu№х╘ А4fМй┬]и▀ЖЯ+~,wFа2┐iхXG°+╚їEV┘Л┘!╞Ъ.CТ lуDКЕ╒є∙~т6О^╜zх=И╣фPЎ'°ьчЦ─ЛжцX▒z?]: ╖Впзэз╙мLbU,▐>▐├┌н╟П:╬╙zёtЪдbN ф16a@]╖█84к╩ТХ X8щ╟Ц╗д>m▀╛б}ч┴&█&KЧ8╨qO╬ЯЁFG ╥шг╤┤U╩кеї`ю№аЪЙW├°╡г▌є═/х░╧FA|d%╘Aj▓XОлZ-же╚Сz╞*▌┴3·}ж║SЕ╝А7{s,╚S*Ў/ЯVХ╩хWPырШУ№JT-QбEOвpл╗iН╜xЪУrК▓Н№°p7DJ└╔╟uE9kт║оIЙTс╨ЫOo■ь∙>тendstream endobj 228 0 obj << /Type /Page /Contents 229 0 R /Resources 227 0 R /MediaBox [0 0 612 792] /Parent 232 0 R >> endobj 230 0 obj << /D [228 0 R /XYZ 97.768 692.105 null] >> endobj 231 0 obj << /D [228 0 R /XYZ 97.768 194.402 null] >> endobj 227 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 235 0 obj << /Length 2320 /Filter /FlateDecode >> stream x┌ЕXKУ█╕╛√W╠═TU─% ёU9═fg╝ыdЬФ5оJU6ИД$╪|(щ╔№√Ї д4Т│h4А~~▌╨╧╧я~zT┼]ЦЩ║{▐▀ХyШg┼]Ццaв╥╗ч·_Бюъ╒:)єащ8(В▀г(iМ[┼A╕Zo╥$╪Ъкяъ?н╓**ГЗэЦ┘к┴ш╪hєh┌S│Lў¤ Їгю╬k[╣═_"▄C▀^░чA█╫ж╣цt╜ч╙#П43¤╝Кгр╦Зэъ▀╧яв╗uЬЗеJH┴Эл#pхIp·╩8╟УJw8ИГЭaBmЁк╬╘<▌╜ЄWє╟┘ю╨'ЄБ:Нй< ЮПv@√$y.Ўс╦Vq|╖╡q'═▓Є5аIx ]5╪╙╚cQ76M┐J╥рE┬;╬UдшИ╞┘Б3#╬.ВЩ╖ Oz╨н═рBvъгэрО╫UЦи╞ж ╛с^Г ╝·S 3ЩоRрШEЖЧ╝с`йц%/ ╟П╡РzЫ3▀т║'║i╫┌╤o║╓єLн4Ъ╒Вб╕7─=?=nт%юсХДi$╚Ц2 ╢№┘ы╓В·y╚цєд╔╙0*s8ўJ°Go▌ ФD╬Bёte;Zo-$sJ,Ч│└Y<яўЧR╤I$═▌&}@{еOS╠QAfBЄрFЮXGЎ[Л W╤Т)Ўёё╟T∙ ИЬЗ$I▀НжУI>°j■╠▐╞I┤ЄnХD┴┤╟А▌Ы'kГУя°гЫIП╢я0Ё└┐Р9rvm¤!*└╚В Г╞,-Д╥Є┌Е Q─ОмЕb╝▐V,╔Гnjw=Тм╨$4╧vЖЖ7тЫ·╧@W ├АAР─└╞ИB[Щ░я' j$╜ЄЧ═ Nэц╙gЩужf:А▄а;╞╩RE>╛NGшМSyB╙ыzэ·iиД╨В╝ж:ъ╬║ЦR= ^ОЦV▀╡тмЕ[▓0Ем▀пS{bYё┬ЮЙhСAmўFШs9$vb╞ЫXВf╝б_▌╫╜_┼`(┴iыа╓:√HъХПхЯцКE"h5▓}╢1Ч;ХcL'З╢▐T▓▒ЪСiKрBв╚ё}▀╚L√:╓ўp` x▒H0ШнФFKО{DЛ7б┌diА┤Т╬█м╓qE┴п╓Н¤Ё╩Ы╔QЁХjq j░=)┬d│YPMе)РJ3qЗmF&ўZ]9l ▒!Mm9hq#╢ п┌Юъ!У?├H53lG(<нЦє_ё№eЪ9ЮtuПI6зБ)ПшL-BТц}4s┴<┌lJJr╜аМ╦2Gз>д SПpГЦ▒ц MO:св╖*Т╤кHx@ТlАр8@]m═Ё~т╦ih0ф╓'PЦ╦*nr#(сF[YJ0▄qшoеШ█"^щ─Y0jGи tr8ТОB8▒╠p╣.z#щ┼ОшХ8г·Б;s С╕И├,JдЁ¤}╡Ш  █Вg╞8┬=Н?]Ш╩├Dч═╪╬╔Е6 9[Л АёC_Oх-═Щ).Л K\ЬўОI▐dkоmI\Жhf╧aЮм∙СЛмб▄м╥вS·@ўА¤е╩а┘MUж▒dXdы▀тSKэХ3▄─РЙ╤┬%|m┬дМCU─l┬ф&L ┘╦ Я (╖H╔╞ Дt├QР┘Y_ДПЖя╒Q}└NIW▀DШ5V║=ЪI_┼эXЮт::╥пd#оH┴¤ы<|a■тh▀√,45!вW Иs.╫│я4╕▒┬Жд[AQ·nЗ╛kQa╒w МKа.A|цРЦ'╙-%/гF№лй╕ЗIцжЭ╙╨ў9ГХ" U╠▓а╓d┘╣││╔)Tиx-О╪°7t|5Ъ:эMвВ_· +rьB╔fЕo}БЎP3сп║╞┌H╕ИєЧбч$╧Гэ┌'УTXаAТФLб0 вS╢Lа+Tмp╛Y╙я?оV┼IXй▌▀(2┐Pм▐и!Рx1и╩╝■╒H╖YС√├з/в╞J(с нxЬФ √uM[B~╪q$г┬XЮЛIЁД.Яг №6Щы┌ыЮ┤RЇ^M° "vт]ц,Е ъЯ│∙<м4oю■EcX`═зщ╢%╠─aлkg?A}2╖J¤Ed┴╡ZpсЩ\J╜СK%БвЮ/ХZ7ЬsQ╟)М*╪╚yчR┘Kй╬Ы#Л╬:ЛГОuф√LиXЩVЪ}`b─Q╦уєЖr№иA@ёХf?5П1ЮpПэ{`я 0°╪AлЮї[╕ХG·8№Ё ╢с▒Аa4Ї2fБТD┬|A- yLИK░>хю╨7щ8Ц▐·╝*аiЩ■Ч╛ &▄gt╒╘UфPЮВ╣оєЯГ√№A√╡▀9yb▄▓Z├╓еevКхE\╩_3є{┘0┐ШO\:¤;▀┘КЗ■ly░Ї-/qhЯ┤3гэХ;{┤/BЁЄЎ^Ач:|IK/%&╨з/СOбGС└_0їцЗqЁЎjYJLШ╞е ю├П!?ў°▄│<счsи3Згvж╥нсёj(Г0чЖ{И▐Fж[:п°Г*РА@ше P▐e╔═*РЕIю█w╛■s╚В¤&ЖПж┬│°сч▄П▄╓хPЙJuСHsЄЛй? ║~°&3╞=СЧ▒;√┐qЦЁЫ '▌,Rasн<╛;╛ ЬoW╛?Bт"=3|зжеAє кеcR╥ББpYbрЪ:юцдеg┼·ЗБ╓┬ °З─╞7AкD╧_ье¤ аЗ┴Є?I@_▓VсЯН4╜eЁR[у7кRкP9>чАН_t╚°Є·п╞ю╝¤^В&*ПС?+fam ║ХЗr%aСГЖ* │ШЯзёЧ▐=<┐√ ? ▓endstream endobj 234 0 obj << /Type /Page /Contents 235 0 R /Resources 233 0 R /MediaBox [0 0 612 792] /Parent 232 0 R >> endobj 236 0 obj << /D [234 0 R /XYZ 97.768 692.105 null] >> endobj 237 0 obj << /D [234 0 R /XYZ 97.768 586.71 null] >> endobj 30 0 obj << /D [234 0 R /XYZ 97.768 463.422 null] >> endobj 233 0 obj << /Font << /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 240 0 obj << /Length 2106 /Filter /FlateDecode >> stream x┌═X▌У█6ў_с╖УзЧФH}ЇЮ6╖█6ЭЇ╥Л7s╣i√аH▄╡&▓ф╩r╢█┐■~ (;iп√p│3k A~Аджjк"#ROУ$┘┤\N~Э№ЇЛЬV9¤~"EЬg╙G╨Rи<Я.'▒IE?7У∙ф_хUЕгоpльх▌фъЫ8Ы&"OїЇю~ктHD)&:V╙╗ъзр?3%e`Л~Ў╦▌ўУ█╗н┬нmF нУg│nзю─╛(JDТ%╙D'Bжй│o.╗╩╬┬Hц* ц╫■∙╪XгDbhg$d}┘XХ*╪c╬л▓XдЇЁe-:qv^K╟F─IЧwFЭ╣╪БлHb-T9ЧUЮх│ър╙,1БP│0жзЯеС▀■єВadp╗,╩ї ж▀╡їoЮЬ_═┐┬:EВбR"ЗЯм7Ч╨$sУйЪйрВ╢ы9╢кЗ║}╕мYX=Ы┼ёБ▐°пъMF╜·@п╛иўъ¤Ч╘ЗйL═южа╒ыA|?▐┼P..┴+Rь╩У?mю╒[68Q▒▄]╘eГ/+;kў╣В4)к&Q=b*ТєеДxH╠_╘О6Е&╔▒є<еZа№ж&QBs9║x┐W╢°8╥C1╘ыбe┴█∙№│┴Bъ╪<Ы;uз~H)$Ё╓ш\ш─ьё7°fe√В*┌;є┤ьЮ(Н█ о+*ўо-│iK~оЗзЛ▐i#tЪ aяЮQ▒╫─й02Л-=(6#фЯ(6о/щ(w Rx┘{╘ыz╜"▐q ╒эА╗@|g┴К╤ЮGБь╚0EpE╢о■=╙tX╒╤9Пk65Л│8ШeЫ╡ul╪╣░╜¤;я;┌Є5PR┴r╔y єS еg¤/&^¤PФ▒т(;BXън|│┤╡ЗЩ КE1Ь1 ╒аNM╦Я╧4╖фц═F}═Ы^bо ▐}╗o▒7;} ▀^Ъ╣tЮвдЄчЪ╣Ў╘НEРЛ<Йyц╩Dд═E"r╔с║Ыe2(>4Ц V▐▄яw] ─╠внШ╕nK╗рx╫{$ью}(чsw!┌ К0EY╓┤vg°й.КВ√оgвЖТ3╡FГ▀,д│▄ 9│╪ьгбР&Шн╞GК}▒Ўъ7¤АФЎG@┐╦Х╛└О┴V[v╟lL▌-║%ы@щnЦН█ўЇ╖Щ1Б╫ь ЬI:√┼6ёp'qь╝|ьыa░-┼YPЇ▌╞┘ ╫ХPzi╡g-нi╓Sў]SY┐┌█╩█ъЗо╖LХЛв}░^┴гev╕&^∙Зq z│Zu¤р█ЗyО- МS_Ь▓)pР/ЛU╤cщж)·Жr3╨{w=пiпK2ьM╨╩TдhB╥щyЕЪЙшё ╟э┌mBкн№┌∙Й.╝─йЧ▐═bЇкЩ╬AЭъrч┌п>ёВСы°└-╩R▄CМ #EуЬ┴г╗Цо H?ю└ы┌н┤LQщ3┼сг╝тбмUQ~,°nЁ4:9j│UbS[}╓эjуеЬ┘√┬n3РФЭ└ДВ"bxDс╩MЁбsfх ╬▓╠*╗хZ┬жn-Л╕В■▐%^щ╣|(щpшъxл╛Cqп1& щЁ╓цГх┤nЪК╡▌░;i╙"{┤╓|>│vQКХЄQ"кк+"">В8И█╕иЎ╦aу╨Х]Cцe; ╕,*~и[╓─mФ8П █2ї▓п O╛нW╛╨╜v┘╡ыг╥и╚[╩Эz┬Q╧▓у╬I╠4╕yjЛe]ЄК░ocSЩO▌шццЦЫ ЙGYьcJ█ └√╬╓Аp* ╨A88яHшSНN╝╣ї┬О╨L╛~к+{╞ЧssIH═╬ ╞фб`c╪╣w Ащ▀i+ш╫А╧б6эб=t <йўH&├╕пу╫ЇЄ╝єrZєЙ√╛1╓╝9+А│ЮЧа▌а▐╧/╗vш $┤╕1ть╧ЎЪ╘ИDp  └тэ9╗ZsИ╟╠▒>╜┬}ov┴└+ g╡ёю└Ц5щtДkїнВд41ь╦═ \мжъ°=д▀9ч7Гs┬ыєCC┤S╠5O╪&╙ре- ╫╗h выЙ▐юцЩ║╜╪╤"ФA▒$Кor╝5б╒а╥>╒}╫№СA╤8P(к▐▐є╕К╒┼Ц(╔GыW∙╞■ёС╤Ўє#пЇГ?ф╢ш╦┼╓ д└╣ +эjаHцz7у°щHПGА┼ГЮя Nd▌Xz╣бКТЙ╧<ТЦJ╣▌c°╞▒вn╦▐Ё══M┌е╡уп╖гх.еEу╖Ц`╧▓■▌├ ╗6 ╔ЪТу▐}wA;D▀I }сТ┐Р+3╛F■p╒"aendstream endobj 239 0 obj << /Type /Page /Contents 240 0 R /Resources 238 0 R /MediaBox [0 0 612 792] /Parent 232 0 R /Annots [ 243 0 R ] >> endobj 243 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [257.029 247.447 264.003 258.391] /Subtype /Link /A << /S /GoTo /D (table.1) >> >> endobj 241 0 obj << /D [239 0 R /XYZ 97.768 692.105 null] >> endobj 242 0 obj << /D [239 0 R /XYZ 263.462 497.838 null] >> endobj 34 0 obj << /D [239 0 R /XYZ 97.768 232.753 null] >> endobj 238 0 obj << /Font << /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 1887 /Filter /FlateDecode >> stream x┌еXKs█8╛чW°┤KUEIdOК'Ў╠d\ж'┘й╔` ЦXжHёd~¤tгA=,fў░НюпЯ╨█√WЛ+Х]fuq xaRЦ&┘EвS&Х╛╕_¤ХїкЬI}+WГнfsЩЁhх║▓u3uЇ¤╪┤4)ы▐╡П3┴#[8ZъАм ^╣@jыM [╙ф ╡ЙАЯО■ь]╜rБдoЛa╖k┌Ю╚Ъ~у┬m]o√▓ы╦┬╦{Хн╫Г]Я▌╡▓╜Э¤ч■цВ_╠E╩МТ^5[█ъ{W"╡ц╤╬OxЦ!хт*"f*N8KжНЁчю▄#И ▓╚╒▄х╔ПQjЩ1╟D]█zIT┤d8╞╤[W┬Ш>║x<@┘Гу▐ З╕Я)╡■юo(┘шI7Мl∙╤B2pИЛ$fВПРчзiоmVо ЧХAФ№й╠0e╘ сnшG`3cd└Bj┼bМФ#4ю╨bEН8tЭлк ХR═47 ╦ЙР jдL╜▀Z"┐Їs┘э▐╠ц ╟╪г▌ы║'&лбш╦жЮИ6[иЇа&Ut╒:G<єц▒ў(╪6м\б$═PCЎЖпCZ╒G%ШEы└ё▒Щ<,*,ГлП=h▒░╒nc┘║X╙о0.j4ПЕ╠┴╠░oЪJ╞9ыm╦╓M°=t,F┐цСгл╣UIBЗш7f482╚LF╔ S░т:z╞uuНЙ ?/┴°8Л╔Гq)╖5ф┐нz▀qeў@┼d=щ╕ЪёD!Ч╗]U║p·╬aюsл4r]З&єW\╫E5м╚·@v┘lwC┐ ▄KЄс┐fV Цс">╪ZCф▌Аzкdг╘0!╘ЙНB ЄЕ№√I фM▌,Ч├zш·3\╧╙╣VЬЙоЕ+зо5ЬКGВыуI)╬╡НSтр╪ч~ QП√Ы№t▒x~~▐√bЗЄ┘нO>I┐c╜HЦ╗cд6¤╢Ъ@]1#^8$ч"ЁБкЪ╜(;T╝Жjм[ЄцP░д▄;╤з№:d┘f╗mB║├Мp.┌X╦╙Мw█B)/}wч>┌к:I2кмRж╥°4пэ█а╠Д* █Хгў├а╡п?Y2 IЄЭ│Oу|╠▄d/ ┐╓Оv^6Ю░ЇU╩Фf[шХВK┬╫оm╓н▌vскыЪЦBТ┴wЩ(X╙╓хU;МT+╕шQWs╒B8╢аHгбУВ`.6пQ4╩ vnч╛╔&Уф4w╬a╨v─йy─1жrО ╬хCW√Tэ┌┌{>V0д 23Kp╖ivDф╙ь╝╝┌Є╦х╨╗└с╕Т┴ВH╟>zФ9д╤Wо∙╗№Т A╖ДЕЙX2Ъ┼·иHр╤√ЇУо╪╘П#┐╒ЇкЁMV█Х=A╠Щ└`Ь_┴▒HB╬┤V8Д█o╩93╡т"·╔╬Jж╨йч9╤а╟шВ╧}tс╝ЗуcАyы·e╢- CчЯ_┬WZLy╟a'┬г ╣-є ФХ ╛jPe╗a=┬,└ °щє│,х Pk╩ ░╕BZЪ░J'▐рCв$&п╥ЧП╪ЕвЖттxЛB@┬XZhЄh№O─▓гox ╗└№╙╤S[╓NAОУXЮзЇєвw╫tw yicЯ,MйN╙}oИЛ@П ъLНy,Ж~р н/iЯ┬ЇEП.р░вGЧg║tоHабаЮ`вМ(5uЇ┌М▐fh} ┬ГШ▓pд┤aчc╠└Щ¤[0─LH\зП╜C?2юНY ЬlЄїсksE·Н42вD> endobj 251 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [488.573 451.841 514.476 462.71] /Subtype/Link/A<> >> endobj 252 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 434.431 397.146 444.752] /Subtype/Link/A<> >> endobj 253 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [273.38 364.693 514.476 375.014] /Subtype/Link/A<> >> endobj 254 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 346.889 132.638 357.081] /Subtype/Link/A<> >> endobj 256 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [428.797 258.566 514.476 269.41] /Subtype/Link/A<> >> endobj 257 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 241.285 305.988 251.477] /Subtype/Link/A<> >> endobj 259 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [416.842 214.63 514.476 225.574] /Subtype/Link/A<> >> endobj 260 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 196.698 234.257 207.641] /Subtype/Link/A<> >> endobj 247 0 obj << /D [245 0 R /XYZ 97.768 692.105 null] >> endobj 38 0 obj << /D [245 0 R /XYZ 97.768 637.146 null] >> endobj 248 0 obj << /D [245 0 R /XYZ 97.768 586.2 null] >> endobj 113 0 obj << /D [245 0 R /XYZ 72.862 586.401 null] >> endobj 115 0 obj << /D [245 0 R /XYZ 72.862 542.565 null] >> endobj 114 0 obj << /D [245 0 R /XYZ 72.862 498.73 null] >> endobj 139 0 obj << /D [245 0 R /XYZ 72.862 472.827 null] >> endobj 122 0 obj << /D [245 0 R /XYZ 72.862 428.991 null] >> endobj 126 0 obj << /D [245 0 R /XYZ 72.862 385.156 null] >> endobj 140 0 obj << /D [245 0 R /XYZ 72.862 341.32 null] >> endobj 255 0 obj << /D [245 0 R /XYZ 72.862 315.417 null] >> endobj 258 0 obj << /D [245 0 R /XYZ 72.862 235.716 null] >> endobj 117 0 obj << /D [245 0 R /XYZ 72.862 173.948 null] >> endobj 116 0 obj << /D [245 0 R /XYZ 72.862 130.112 null] >> endobj 244 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F61 250 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 263 0 obj << /Length 1785 /Filter /FlateDecode >> stream x┌}W█Т█6 }╧W°й#═╘┤HК║ьLжу\Ы4ЫtV▐дЭж┤╠╡┘Х%Н.qЎя РФ,╫J_l^@аЫgл7Е8V═у└sр}Ър #ТдсE╜A▌╘Д╢│дє┼OЩ▒ДО┌·rПе n9w│╨┬нЭФQ! Wz┌GэДm+KMп¤фFю╚mn5Е,┴╧/ц}Ў┴w,з·dSFP·Ыn{|>э<[;├ХlЄГэ~l┴ЪD▀f2Л╝▌ьgltр∙pa;є JЯ√┌ ЫБ PCЦk√бЙwбШР▒;┐[░хJAe▐╖v╤РZqpчYh╛\Э╒┘╙ИГ╥▌Б╥ёД│hъьXф▀Щ╓█Ў+└ЙА@ыЩЬ╡▄лБ"Xh>9'SUуW.Y╚ЇхшЮzci°Ї#Ї°;\UГ╠i&╚БЎ╒╡S°}оf}Ў)d zBЦPл]DCNу ╦&46N╨ўЮ╜▐<√¤D╘endstream endobj 262 0 obj << /Type /Page /Contents 263 0 R /Resources 261 0 R /MediaBox [0 0 612 792] /Parent 232 0 R /Annots [ 265 0 R 266 0 R 267 0 R 269 0 R 270 0 R 271 0 R 272 0 R ] >> endobj 265 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [446.73 654.182 514.476 665.051] /Subtype/Link/A<> >> endobj 266 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 636.772 324.418 647.093] /Subtype/Link/A<> >> endobj 267 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [328.641 610.247 480.571 621.19] /Subtype/Link/A<> >> endobj 269 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [255.447 548.478 514.476 559.422] /Subtype/Link/A<> >> endobj 270 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 532.578 288.055 541.3] /Subtype/Link/A<> >> endobj 271 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [185.304 486.81 486.176 497.679] /Subtype/Link/A<> >> endobj 272 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [236.477 347.233 363.999 358.177] /Subtype/Link/A<> >> endobj 264 0 obj << /D [262 0 R /XYZ 97.768 692.105 null] >> endobj 124 0 obj << /D [262 0 R /XYZ 72.862 675.168 null] >> endobj 118 0 obj << /D [262 0 R /XYZ 72.862 631.333 null] >> endobj 268 0 obj << /D [262 0 R /XYZ 72.862 605.43 null] >> endobj 112 0 obj << /D [262 0 R /XYZ 72.862 525.729 null] >> endobj 119 0 obj << /D [262 0 R /XYZ 72.862 463.96 null] >> endobj 120 0 obj << /D [262 0 R /XYZ 72.862 438.057 null] >> endobj 125 0 obj << /D [262 0 R /XYZ 72.862 412.154 null] >> endobj 127 0 obj << /D [262 0 R /XYZ 72.862 368.319 null] >> endobj 121 0 obj << /D [262 0 R /XYZ 72.862 342.416 null] >> endobj 123 0 obj << /D [262 0 R /XYZ 72.862 298.58 null] >> endobj 261 0 obj << /Font << /F38 52 0 R /F61 250 0 R /F45 63 0 R /F13 84 0 R >> /ProcSet [ /PDF /Text ] >> endobj 275 0 obj << /Length 1111 /Filter /FlateDecode >> stream x┌╡V╧oы6 ╛ўп╚╤jEЄп╪┘хuC╢a╪с5x└░юа╪J"╠╢┤╥╚p│Z3ГзшNe▐)Я LД№gitV{:СK·Л╖∙Т┬Уsуv╜╢цр╬rRlп ЮЭ%b;A(Ё@╡єПQlнм]_8╩*а1= q╚xэт ╪IPО╩╤цд║СЄУХлльЭ/gэNP5Ё2п▐чЫЧСUШe╝PI/uG{╚─ХГBTми((ы╠P'q╡Бц?y{ жD─Ф;}c═щ┌'Б%ZTo>еuJ╣E╙Knq▀zЄPV;3Ўjp╖┴GQB┴┐ўёдЖ&Tъ<-nщєвш└s7√а`ё▐I=и6\╝╨*╨эЧ▐╠б/№ЁїБ╤ю│Ю|НcУx╒Ў5h°ъ╗Їе:┬eн4Oщ╠гдеu;Z5=йiыm%%>}DЭ ▐l╫OrZKФе╫';sДцpёў╝■-╨∙╠L└╧║ы▐╟╥Пn ─┴L!сVZфЁ9╞7ж t>i╚┤▀ъе╟4═>ИG═YQф!ў2`┐ж¤ЖХEдреЬQ╗Ц  я$┼,▐у МxchЕB╕ ╔Т■,e'0wmл√o╞E╘B0M3#╖е√x:Ё?пЧp▄ диРЦ╧#tiLU╞ Asё╜ПЗ Жудар]°Р╨╫IУЖG:(>ЄВ1╓j7ш`/и╔О▌ТV╩╣IБиLa╝·╥\╨^fри!▌b─MжЭўК╙O▄╠FQРB╙╓M$ЁQяЖ═>HQя╛┬■г╥{хз∙QM╖tОh%┬¤╛a`.Є2$┼D]?╨uЭК&╩"·)р┐t╕¤╚> endobj 278 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [151.92 589.973 464.747 600.916] /Subtype/Link/A<> >> endobj 279 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [215.357 572.04 415.108 582.984] /Subtype/Link/A<> >> endobj 281 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [416.701 467.806 471.459 478.819] /Subtype /Link /A << /S /GoTo /D (cite.RMHHS:2001) >> >> endobj 282 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [474.953 467.806 496.87 478.819] /Subtype /Link /A << /S /GoTo /D (cite.RMHHS:2001) >> >> endobj 283 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [342.897 449.873 384.541 460.817] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:dsc:2001) >> >> endobj 284 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [388.038 449.873 414.379 460.817] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:dsc:2001) >> >> endobj 285 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [268.085 431.94 309.729 442.884] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:philasugi:2001) >> >> endobj 286 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [313.109 431.94 340.008 442.884] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:philasugi:2001) >> >> endobj 276 0 obj << /D [274 0 R /XYZ 97.768 692.105 null] >> endobj 42 0 obj << /D [274 0 R /XYZ 97.768 667.198 null] >> endobj 277 0 obj << /D [274 0 R /XYZ 97.768 644.005 null] >> endobj 280 0 obj << /D [274 0 R /XYZ 97.768 487.511 null] >> endobj 273 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 287 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro 129/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 250 0 obj << /Type /Font /Subtype /Type1 /Encoding 287 0 R /BaseFont /Times-Italic >> endobj 288 0 obj << /Type /Encoding /Differences [ 0 /minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft 129/.notdef 161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus 171/.notdef 173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade 197/.notdef] >> endobj 83 0 obj << /Length1 775 /Length2 650 /Length3 532 /Length 1210 /Filter /FlateDecode >> stream x┌SU ╓uL╔OJu╦╧+╤5╘3┤RpЎ О4W0╘3рRUu.JM,╔╠╧sI,I╡R0┤┤4Tp,MW04U00╖22┤25тRUp╬/и,╩L╧(Q╨p╓)2Wp╠M-╩LN╠SЁM,╔H═ЪСЬШгЬЯЬЩZRйзрШУг╥QмФZЬZTЦЪв╟ehиРТЩ\вРФЪЮЩ╟еrРg^Z╛В9D8е┤&UЦZT tФВ╨СЪ @'жфчхT*дджqщ√хэJ║ДОB7▄н4'╟/1d<(Р0дs3s*б Єs JKRЛ|єSRЛЄ╨ХЖзB▄цЫЪТYЪЛ.ыYТШУЩьШЧЮУкаkhвg`l С╚,v╦мHM ╚,I╬PHK╠)NЛзцеа;z`Зш{xЗDiCb,РШЩWRYРк`АP ц"°└0*╩мPИ6╨300*B+═.╫╝ф№Ф╠╝t#S3Е─вв─J.аQFжж ╒Ж Щy)й й@ыыххЧ╡(CжV!-┐И йЖ╞ ·╔ЩE╔9й╔а8+╔ra·╞╔)┐вZШЄt-M  НLН╠-МjQЖцeЦжz║(ШXB<Ь\ZTФЪWNE└РВё╙2БбЫЪZСЪ╠uєZ~▓uK╓Їmm+ы\_X┼к╧∙є─┌Ч7┘DьиЫЭЩRl:/P1╜d╔лЕП╢Ў╧╛(сХl=U╕hЛdп_O▄ЧE┬k╢v-X1б┴t┐▐Н`ё╩цоi╝ ┤╒_y. Ы1зїС┤╒■в╟│:Хun~Qо?┴3/хЕS╘т}▀я]у╥ Ъде$e~s√]F1ё╩╗╧/z╩эO]┘3 ╤╞є╜EQТЮ¤^ ЯYь^╢Q╣э°gэ┼╫ЇI\▌фўLш╨!~ч│╓y?hKDgъVля;о╔ў■╬O¤йw_d▄уцf|№f╟чgВ√╕■81╟·`╢йОЙєъ№┤╕5q╣ныХъ-█a╖ъ▓KЇж_jС╗ХV^,Хu■ ўъПМY│uU~5╝Шg!'╛Ї╔┤фm,ж╫ч░м?н╛▐╨└їZ╪Ч─╔О3жw╠║#huьєєВл╖=xсб─жп╘d'z░я┘SA =┘ёПНєLчй{╡щ] МsзПk+$оh┤>█f▓зs│╪║Ы6F╞∙вЯШ█з ╩Z╝═ю є╛#_x╧qk╔tN┌╙Я┤┐u╙╟&│+Х╤b╗6▄щфьR√=-─%<Фы╔T│╡-gZ№Oи╝}·Jд╚╓╟пy│О▌MПт┤nо╢r┌c╘єэ╙▀Л√_х▀ЩuЁ·бM&ЧЭОTэ цy,ЄЕє 7O~╓╓гF-ьлдм8LoИк(╬ Р╓Yь▀<Э┘╠┼p╔L#юOТЧкuЯфzn@!р5`X, ЛJЄsЛ▓╣┐ЦЩmendstream endobj 84 0 obj << /Type /Font /Subtype /Type1 /Encoding 288 0 R /FirstChar 13 /LastChar 13 /Widths 289 0 R /BaseFont /HKTXQR+CMSY7 /FontDescriptor 82 0 R >> endobj 82 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /HKTXQR+CMSY7 /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [-15 -951 1252 782] /Flags 4 /CharSet (/circlecopyrt) /FontFile 83 0 R >> endobj 289 0 obj [1139 ] endobj 63 0 obj << /Type /Font /Subtype /Type1 /Encoding 287 0 R /BaseFont /Courier >> endobj 59 0 obj << /Length1 773 /Length2 733 /Length3 532 /Length 1295 /Filter /FlateDecode >> stream x┌эRkPSG╡:╘наhб╤О Fеy\BААRУИyИ OйП╦╜╕Р▄ 77Р╚ЁPФA4*╥КПИZ┴_еU$:VEиEЛX:Х╩иАZЛпjUAqzuёg√л╙▌?√э9{Ўь∙Ц╧Л╘ 8ХgS$#DDH PЕkу¤"Тp°| QЖа╚Y("Ч#@aJИ H№}Р@й/ЗTTЪЕ&ТТ0E5╒AЄ д %A8╩$CлБбzае02Pшї@у8ahДt─E8Б1 &$Gь0д&uЁ╪╞Miпб HYS` kr*`-тй╖ъ8тК╜ ▓N■ SГ┼gЫЇ·╘рРwДЇМ╜хoeH31Рсir05x З8a2 F╒ к'0ЩдЗ@И°К$R┘@gfИG Ц tи▐√ў!Й╢┬ж╫oDб╤Жxt╡ЛD ТЙ▓дA yCюпС75ЫMШAВD$С ,СЭпWЛ▌BbNРI└GцPЪF- +х#УБ,$═ЪY├bI1ь└&У t═q4U ─иСMК0ж▓=IvАЬwгTRц,б/╩}"їС ┐ь╖y╤$СnВъY@&СHРБчb&ЪЖ$╙ З╪Ь^╫:В═B3─8н-┤2еЇhAeN╚юЯЎ9ЙGЇ4╝╙:№tЬ=gБgkee xIL∙▌]7к╫╒╣е6╗╧├В╛tеП|lНX╗╕ы+╫╒E;ў─m╚УЭ]╓║YЄЛ6}°╩[pW]Ч│┘╢ъ╞Д└SЇ═нл=?mэЄ╠mUЖ▀V.▄}▓╗нeф╪iЪН╙<╕■н{З_{я#7╦╡╬K/'ЁFфЧ%h┌kЦ.╩кИmФ╡иЯ▌ГЄ3]|ППТ_▒*S╝вВ╗4e┬Тb~їxfEЄ║ !g╝─єz├цn/¤|hqц╝ЇюўIПФ/╤p├fк╬L ╬xШрS\йИ ┤Я]│qМKЬ ~X╔■Eх═Й3▄╨Ф╙эЯ QUВм█╝tя╬├╥UЭх.Л╫K╙zЦ█_ХM╥1$kэa╔|пK┼uТ╣┘эn╢√ў5qї9б>┌ї_U╜oь╣д>Ч^╡─Ц/uо╜Yq╦}VcС╔√h1Э1ytє°я√вЭ╡M╤∙LPdUOM¤s┐╢nї╒VЄф╢зё??pJoК:TПyЕ:п█_╢щGўяф|[элZч9/bvп*l┬Ф#╓gЄ ЖєD╫пЦ й╦?┼Їэ┼Еїб%# Л.lН╓ёХщЮ .Л╞Э▀▀)H∙f╦ е-,иNръТтЄЇС>/д"прп╙Ф╓█1├:зzЯы▐х┐Ш=Е-ЛN4▀█<ж~ц═DMNўg ╘я°Б?Єо╢фщ√J╝█о╡█<║<╖xи_zЯ╪тu'АB═▓Jу▄T╫Ё╔╣╟kbyе▄╤l{еhb╨4кZs>>оъH┤╢6wД;П┘|эзшхфОЩl}ЮЬ╪╪╪VxюYm■ЪжЬ51;Oм]2l╚хqЦКr√ьGб└Юk╔муFuDъ ╥{чЖоф╓╪Mh8xKnqzxтX╩o╒┘ыEgж╔||э╔\Э▓<└ўJ┬╪щ╜3Eб╗╚#gЦ=Ю╕йDфTcыY Ы LЧ|6r·Ю>░║ТkХ№├┴∙_р?!Ащ!J3ФеS9R┼╧endstream endobj 60 0 obj << /Type /Font /Subtype /Type1 /Encoding 288 0 R /FirstChar 3 /LastChar 3 /Widths 290 0 R /BaseFont /NLNRSE+CMSY6 /FontDescriptor 58 0 R >> endobj 58 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /NLNRSE+CMSY6 /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [-4 -948 1329 786] /Flags 4 /CharSet (/asteriskmath) /FontFile 59 0 R >> endobj 290 0 obj [639 ] endobj 57 0 obj << /Type /Font /Subtype /Type1 /Encoding 287 0 R /BaseFont /Times-Bold >> endobj 54 0 obj << /Length1 774 /Length2 713 /Length3 532 /Length 1270 /Filter /FlateDecode >> stream x┌эRkPW-:╩РX┼gм┤riQL▓Ы╕ДDPyeD"КАПeў&,$╗a│┴д R╤─Х╢VQ╞VЛЦbк(Г(╘╟И+bqКZ╤·вн:X"вvuЬт╧ЎWзў■╣▀=чЮ{ю∙о┐O╝VF2iP═╨ЬХа*л] P "ЁўП`!╬Q ЙsPPеa=@1А(T2Щ хI В1┘XJЯ╬БАИ╔.ТД!K8 bq.y 7-CPР│I@Ш┴\'╠ Ъ!Ы IЙEIHГzКH]Ж4┤ОК■m╥bz eC╓╠Ы╝╔╔А╖H2┤┴HиHу■.╚;∙7L W[ Ж8▄шТwЕЇМ)Гэ/c4Y8╚ВXЖД,=Р║Ў{ЛЕ$e1D5nаИ0ZoА@МNУ rма╠j╩ ╔xК#╥Б7Шa▀>д╔БV°Ї·МHгв┤яkЎw╡Л╟)ЪЫg3AА╝"ў╒шлЪ╧Ием С ╩∙∙r╡h└]Q4┴Рн2,р,Л█/%├0░MB+АV▐░TB3Ё╔ф├ \MХ)nцУв╠Щ|O╥]арї╟ДЗ3╓хb9─J^EГ1аP(s■NLдй, ╘D AР`┤ ╜ДЕe!═ї}">иЧ╡От├Е╨ A[ CL_Э▒∙рG▀фFэlк"їx╥╕ўnЫ{CRMn)Eцh▒▓╣>zn╫╜/oTo8.╩╝0>ЖШ■┘hЎ└[ыу╓-ю·jteї┌хI┼yX╜ф▓Vd╦_√∙Ы╧▀╗з9Ю5 Лmknxйъ┘ОнЕ~S█║№V6+#яД'я<┌}╡E8jJ┬ж)╛m{▄█▌╞Йlэ╖/їz∙xфЧе$\;╙.╟4x║}\~╬;яq{[│oe╒1∙╗╗aС3щэs▓│╧ЬA▓б5A?╗ПYЎXГП╝ЮxJу9h▀#Ў&mWЗKч5ХDЫ∙√=╜"gЯ#Щzц╥CsяQ║╜Ж█ыЯzщVГ3mМrц┘%й`[H`u╘bўЙQ¤PЭм╛█╪ ╞z╙С▄^·╨Ю·╟╫n┬∙є*Е╫пЗVU┴│jС▒▌Т╣uycЙВZgHОR╛йо╬wY╓╣│Ыщ─-0^1▀?-*¤▐tL8zц─ЕеєЛи╬є ┼CDГЩGCi}Ыв.yЫ░░0f#QwFбоbЇЪU4юnvkэюжn*xLчcqёС¤╩u▄╧\И}д>pб`й╔1!`фИВ╙я{#Uлf пШАЩU}~СпO;Цq░╫q°╨рIыZO■xgЖЫ╛|faхщжOD'ЪD╖═║╘C=╢f_┤╤ЩdNIМУ┤М┌╘╝Eу}╤√├`j#м1х?╔k╝ЦъН╚ХoЯСЇт╬O&w%яh^,█°AЎ!─║щь╣Ўл▀їp{Яn5иТЗ9_m╡╫aZgду√5бз├Т;D1│}=║-x╒╔Э╗─EЄо╒tM|Ў2aын}╢┼{vЄБяf№jцюАы╝э4ZЩ╪∙|Й╜c╟VтeК,*0╟∙в╡зл(|╦йANЭb╬OЭ_яqдъД∙ЗCЁ┐└BА0@Ьх#╬f ■╦Ь╛┼endstream endobj 55 0 obj << /Type /Font /Subtype /Type1 /Encoding 288 0 R /FirstChar 3 /LastChar 3 /Widths 291 0 R /BaseFont /EESKIW+CMSY8 /FontDescriptor 53 0 R >> endobj 53 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /EESKIW+CMSY8 /ItalicAngle -14 /StemV 89 /XHeight 431 /FontBBox [-30 -955 1185 779] /Flags 4 /CharSet (/asteriskmath) /FontFile 54 0 R >> endobj 291 0 obj [531 ] endobj 52 0 obj << /Type /Font /Subtype /Type1 /Encoding 287 0 R /BaseFont /Times-Roman >> endobj 69 0 obj << /Type /Pages /Count 6 /Parent 292 0 R /Kids [46 0 R 71 0 R 129 0 R 142 0 R 151 0 R 161 0 R] >> endobj 176 0 obj << /Type /Pages /Count 6 /Parent 292 0 R /Kids [170 0 R 188 0 R 198 0 R 207 0 R 216 0 R 221 0 R] >> endobj 232 0 obj << /Type /Pages /Count 6 /Parent 292 0 R /Kids [228 0 R 234 0 R 239 0 R 245 0 R 262 0 R 274 0 R] >> endobj 292 0 obj << /Type /Pages /Count 18 /Kids [69 0 R 176 0 R 232 0 R] >> endobj 293 0 obj << /Type /Outlines /First 7 0 R /Last 43 0 R /Count 7 >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 293 0 R /Prev 39 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 293 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 293 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 293 0 R /Prev 15 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 15 0 R /Prev 23 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 293 0 R /Prev 11 0 R /Next 31 0 R /First 19 0 R /Last 27 0 R /Count -3 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 293 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 293 0 R /Next 11 0 R >> endobj 294 0 obj << /Names [(Doc-Start) 50 0 R (cite.BUGS) 124 0 R (cite.BecRCW88) 113 0 R (cite.ChaJ98) 115 0 R (cite.ChaJH92) 114 0 R (cite.Cook:Weisberg:1999) 122 0 R (cite.DTLang:2000) 125 0 R (cite.ESS) 112 0 R (cite.GNU-Emacs) 126 0 R (cite.PGraham:1996) 140 0 R (cite.R) 118 0 R (cite.RChassell1999) 139 0 R (cite.RMHHS:2001) 268 0 R (cite.SAS:8) 119 0 R (cite.Splus) 116 0 R (cite.Stata:7.0) 120 0 R (cite.Tier90) 121 0 R (cite.XEmacs) 127 0 R (cite.heiberger:dsc:2001) 255 0 R (cite.heiberger:philasugi:2001) 258 0 R (cite.ihak:gent:1996) 117 0 R (cite.youn:fald:mcfa:1992) 123 0 R (figure.1) 148 0 R (figure.2) 166 0 R (figure.3) 185 0 R (figure.4) 186 0 R (page.1) 49 0 R (page.10) 209 0 R (page.11) 218 0 R (page.12) 223 0 R (page.13) 230 0 R (page.14) 236 0 R (page.15) 241 0 R (page.16) 247 0 R (page.17) 264 0 R (page.18) 276 0 R (page.2) 73 0 R (page.3) 131 0 R (page.4) 144 0 R (page.5) 153 0 R (page.6) 163 0 R (page.7) 172 0 R (page.8) 190 0 R (page.9) 200 0 R (section*.1) 132 0 R (section*.10) 201 0 R (section*.11) 210 0 R (section*.12) 211 0 R (section*.13) 212 0 R (section*.14) 213 0 R (section*.15) 214 0 R (section*.16) 219 0 R (section*.17) 224 0 R (section*.18) 225 0 R (section*.19) 226 0 R (section*.2) 133 0 R (section*.20) 231 0 R (section*.21) 237 0 R (section*.22) 248 0 R (section*.23) 277 0 R (section*.24) 280 0 R (section*.3) 134 0 R (section*.4) 145 0 R (section*.5) 146 0 R (section*.6) 164 0 R (section*.7) 174 0 R (section*.8) 191 0 R (section*.9) 192 0 R (section.1) 6 0 R (section.2) 10 0 R (section.3) 14 0 R (section.4) 30 0 R (section.5) 34 0 R (section.7.1) 38 0 R (section.A) 42 0 R (subsection.3.1) 18 0 R (subsection.3.2) 22 0 R (subsection.3.3) 26 0 R (table.1) 242 0 R] /Limits [(Doc-Start) (table.1)] >> endobj 295 0 obj << /Kids [294 0 R] >> endobj 296 0 obj << /Dests 295 0 R >> endobj 297 0 obj << /Type /Catalog /Pages 292 0 R /Outlines 293 0 R /Names 296 0 R /PageMode /UseOutlines /URI<> /ViewerPreferences<<>> /OpenAction 45 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) >> endobj 298 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.10b)/Keywords() /CreationDate (D:20031110164000) >> endobj xref 0 299 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000051 00000 f 0000000009 00000 n 0000013240 00000 n 0000523750 00000 n 0000000054 00000 n 0000000084 00000 n 0000013298 00000 n 0000523664 00000 n 0000000129 00000 n 0000000153 00000 n 0000035029 00000 n 0000523539 00000 n 0000000199 00000 n 0000000235 00000 n 0000038257 00000 n 0000523465 00000 n 0000000286 00000 n 0000000330 00000 n 0000489764 00000 n 0000523378 00000 n 0000000381 00000 n 0000000423 00000 n 0000492725 00000 n 0000523304 00000 n 0000000474 00000 n 0000000515 00000 n 0000498539 00000 n 0000523216 00000 n 0000000561 00000 n 0000000594 00000 n 0000501273 00000 n 0000523128 00000 n 0000000640 00000 n 0000000669 00000 n 0000505172 00000 n 0000523040 00000 n 0000000717 00000 n 0000000746 00000 n 0000513065 00000 n 0000522965 00000 n 0000000792 00000 n 0000000850 00000 n 0000003449 00000 n 0000004772 00000 n 0000000900 00000 n 0000004654 00000 n 0000004713 00000 n 0000000056 00000 f 0000522375 00000 n 0000522143 00000 n 0000520599 00000 n 0000521987 00000 n 0000000062 00000 f 0000520509 00000 n 0000520278 00000 n 0000518709 00000 n 0000520122 00000 n 0000003611 00000 n 0000000249 00000 f 0000518622 00000 n 0000003788 00000 n 0000003957 00000 n 0000004125 00000 n 0000004296 00000 n 0000004476 00000 n 0000522466 00000 n 0000013357 00000 n 0000007378 00000 n 0000004890 00000 n 0000013181 00000 n 0000007755 00000 n 0000007905 00000 n 0000008055 00000 n 0000008210 00000 n 0000008365 00000 n 0000008519 00000 n 0000008673 00000 n 0000008826 00000 n 0000518389 00000 n 0000516903 00000 n 0000518231 00000 n 0000008979 00000 n 0000009131 00000 n 0000009280 00000 n 0000009431 00000 n 0000009591 00000 n 0000009751 00000 n 0000009898 00000 n 0000010045 00000 n 0000010196 00000 n 0000010347 00000 n 0000010499 00000 n 0000010654 00000 n 0000010810 00000 n 0000010963 00000 n 0000011116 00000 n 0000011281 00000 n 0000011446 00000 n 0000011611 00000 n 0000011778 00000 n 0000011945 00000 n 0000012097 00000 n 0000012249 00000 n 0000012406 00000 n 0000012564 00000 n 0000012720 00000 n 0000012876 00000 n 0000013028 00000 n 0000509723 00000 n 0000505291 00000 n 0000505413 00000 n 0000505352 00000 n 0000505899 00000 n 0000505838 00000 n 0000509602 00000 n 0000509784 00000 n 0000509844 00000 n 0000510027 00000 n 0000505534 00000 n 0000510088 00000 n 0000509541 00000 n 0000509905 00000 n 0000505595 00000 n 0000509966 00000 n 0000017025 00000 n 0000015985 00000 n 0000013451 00000 n 0000016781 00000 n 0000016842 00000 n 0000016903 00000 n 0000016964 00000 n 0000016140 00000 n 0000016301 00000 n 0000016462 00000 n 0000016622 00000 n 0000505473 00000 n 0000505656 00000 n 0000020337 00000 n 0000019872 00000 n 0000017108 00000 n 0000020154 00000 n 0000020215 00000 n 0000020276 00000 n 0000020003 00000 n 0000034967 00000 n 0000022223 00000 n 0000035089 00000 n 0000022112 00000 n 0000020432 00000 n 0000034906 00000 n 0000022585 00000 n 0000022644 00000 n 0000034863 00000 n 0000034883 00000 n 0000040180 00000 n 0000157860 00000 n 0000038378 00000 n 0000037914 00000 n 0000035212 00000 n 0000038196 00000 n 0000038317 00000 n 0000038045 00000 n 0000290309 00000 n 0000292638 00000 n 0000303553 00000 n 0000290432 00000 n 0000040040 00000 n 0000038473 00000 n 0000290248 00000 n 0000289947 00000 n 0000290371 00000 n 0000290098 00000 n 0000522580 00000 n 0000040541 00000 n 0000040600 00000 n 0000157816 00000 n 0000157836 00000 n 0000158225 00000 n 0000158284 00000 n 0000289903 00000 n 0000289923 00000 n 0000301705 00000 n 0000484084 00000 n 0000301887 00000 n 0000292526 00000 n 0000290568 00000 n 0000301644 00000 n 0000301766 00000 n 0000301826 00000 n 0000293001 00000 n 0000293060 00000 n 0000301602 00000 n 0000301622 00000 n 0000484206 00000 n 0000303441 00000 n 0000302010 00000 n 0000484023 00000 n 0000484146 00000 n 0000303913 00000 n 0000303972 00000 n 0000483979 00000 n 0000483999 00000 n 0000487360 00000 n 0000486882 00000 n 0000484329 00000 n 0000486994 00000 n 0000487055 00000 n 0000487116 00000 n 0000487177 00000 n 0000487238 00000 n 0000487299 00000 n 0000489885 00000 n 0000489591 00000 n 0000487455 00000 n 0000489703 00000 n 0000489824 00000 n 0000492845 00000 n 0000492430 00000 n 0000489980 00000 n 0000492542 00000 n 0000492603 00000 n 0000492664 00000 n 0000492784 00000 n 0000495811 00000 n 0000495577 00000 n 0000492940 00000 n 0000495689 00000 n 0000495750 00000 n 0000522697 00000 n 0000498599 00000 n 0000498306 00000 n 0000495906 00000 n 0000498418 00000 n 0000498479 00000 n 0000501333 00000 n 0000500868 00000 n 0000498682 00000 n 0000501150 00000 n 0000501211 00000 n 0000501000 00000 n 0000505960 00000 n 0000503383 00000 n 0000501416 00000 n 0000505111 00000 n 0000505232 00000 n 0000000000 00000 f 0000515153 00000 n 0000503571 00000 n 0000503770 00000 n 0000503970 00000 n 0000504161 00000 n 0000505716 00000 n 0000504353 00000 n 0000504547 00000 n 0000505777 00000 n 0000504742 00000 n 0000504926 00000 n 0000510148 00000 n 0000507933 00000 n 0000506068 00000 n 0000509480 00000 n 0000508113 00000 n 0000508307 00000 n 0000508502 00000 n 0000509663 00000 n 0000508674 00000 n 0000508895 00000 n 0000509114 00000 n 0000509311 00000 n 0000513247 00000 n 0000511447 00000 n 0000510256 00000 n 0000513004 00000 n 0000513125 00000 n 0000511635 00000 n 0000511834 00000 n 0000513186 00000 n 0000512015 00000 n 0000512173 00000 n 0000512330 00000 n 0000512496 00000 n 0000512662 00000 n 0000512833 00000 n 0000513342 00000 n 0000515246 00000 n 0000518597 00000 n 0000520485 00000 n 0000522351 00000 n 0000522814 00000 n 0000522891 00000 n 0000523822 00000 n 0000525581 00000 n 0000525620 00000 n 0000525658 00000 n 0000525884 00000 n trailer << /Size 299 /Root 297 0 R /Info 298 0 R >> startxref 526039 %%EOF ess/doc/rgui-doc.txt0000664000175000017500000000511312423756516012756 0ustar eddedd;;; Documentation for ess-r-gui.el --- Support for running Rgui on ;;; Windows as an inferior Emacs process ;; Copyright (C) 2008 A.J. Rossini, Richard M. Heiberger, Martin ;; Maechler, Kurt Hornik, Rodney Sparapani, and Stephen Eglen. ;; Original Author: Richard M. Heiberger ;; Created: 10 Mar 2008 ;; Maintainers: ESS-core This is preliminary documentation for the preliminary release of M-x Rgui, a new ESS function that allows access to the Rgui Console on Windows from an emacs R-mode buffer. Here are the steps. 1. Update your R package 'tcltk2' to 1.0-6 or newer {E.g. inside R: install.packages("tcltk2") # or update.packages(check.built=TRUE) } 2. Start Rgui from an icon and enter these three lines into the R Console library(tcltk2) ## >= 1.0-6 .ess.command <- function() source("c:/temp/ess-tempfile.R", echo=TRUE) tclFun(.ess.command) 3. Set the environment variable R_HOME in emacs, for example with (setenv "R_HOME" "c:/progra~1/R/R-2.6.1") 4. Make sure you have a directory named c:/TEMP 5. Then, load ess-r-gui.el into emacs and type M-x Rgui This will create a new MSDOS command buffer named "*R*" which will allow communication with the Rgui Console. Most ESS keys work. I have tested these C-c C-n works for complete commands. multi-line commands will get a syntax error. C-c C-c works for lines surrounded by a blank line at top and bottom. C-c C-r works for a highlighted region. C-c C-v works for help The technology is similar (not identical) to the technology I used in connecting to the S-Plus Gui on Windows. In Rgui I send the higlighted lines to a file and then use the execdde.exe from tcltk2 to source() the lines. The source() function suppresses intermediate blank lines and trailing comments. When the seven lines below are sourced, only lines 1,2,4,5,6 are echoed. Lines 3 and 7 are not echoed. This means that well-commented user source code will not have complete comments in the output transcript in the Console. ## comment 1 123 ## comment 4 456 ## comment 7 Possible improvements 1. Duncan suggested I write my own ess.source to echo all lines. That is another project for another day. 2. Currently M-x Rgui connects to an existing Rgui that has loaded the tcltk2 package. It should be easy to detect whether such a process is running and start one if not. 3. I would like single line of a multi-line command to be sent over with a series of C-c C-n, as works for other R and S-Plus interfaces. It can't be done as long as the R source() command is used. ess/doc/help-s.texi0000664000175000017500000003411012506744203012556 0ustar eddedd@c @comment node-name, next, previous, up @c @node ESS for S @c @chapter Overview of ESS features for the S family @node ESS(S)--Editing files, iESS(S)--Inferior ESS processes, ESS for S, ESS for S @comment node-name, next, previous, up -- don't use @ESS .. @section ESS[S]--Editing files @ESS{[S]} is the mode for editing S language files. This mode handles: @itemize @minus @item proper indenting, generated by both [Tab] and [Return]. @item color and font choices based on syntax. @item ability to send the contents of an entire buffer, a highlighted region, an S function, or a single line to an inferior S process, if one is currently running. @item ability to switch between processes which would be the target of the buffer (for the above). @item The ability to request help from an S process for variables and functions, and to have the results sent into a separate buffer. @item completion of object names and file names. @end itemize @ESS{[S]} mode should be automatically turned on when loading a file with the suffices found in ess-site (*.R, *.S, *.s, etc). Alternatively, type @kbd{M-x R-mode} to put the current buffer into R mode. However, one will have to start up an inferior process to take advantage of the interactive features. @node iESS(S)--Inferior ESS processes, ESS-help--assistance with viewing help, ESS(S)--Editing files, ESS for S @comment node-name, next, previous, up @section iESS[S]--Inferior ESS processes iESS (inferior ESS) is the mode for interfacing with active statistical processes (programs). This mode handles: @itemize @minus @item proper indenting, generated by both [Tab] and [Return]. @item color and font highlighting based on syntax. @item ability to resubmit the contents of a multi-line command to the executing process with a single keystroke [RET]. @item The ability to request help from the current process for variables and functions, and to have the results sent into a separate buffer. @item completion of object names and file names. @item interactive history mechanism. @item transcript recording and editing. @end itemize To start up iESS mode, use: @example M-x S+3 M-x S4 M-x S+5 M-x S+6 M-x R @end example (for S-PLUS 3.x, S4, S+5, S+6 or S+7, and R, respectively. This assumes that you have access to each). Usually the site will have defined one of these programs (by default S+6) to the simpler name: M-x S @cindex command line arguments In the (rare) case that you wish to pass command line arguments to the starting S+6 process, set the variable @code{inferior-Splus-args}. Note that R has some extremely useful command line arguments. For example, @code{--vanilla} will ensure R starts up without loading in any init files. To enter a command line argument, call R using a "prefix argument", by C-u M-x R and when ESS prompts for "Starting Args ? ", enter (for example): @code{--vanilla} Then that R process will be started up using @code{R --vanilla}. If you wish to always call R with certain arguments, set the variable @code{inferior-R-args} accordingly. @comment Menubar access to other versions of R and Sqpe If you have other versions of R or S-Plus available on the system, ESS is also able to start those versions. How this exactly works depend on which OS you are using, as described in the following paragraphs. The general principle, regardless of OS, is that ESS searches the paths listed in the variable @code{exec-path} for R binaries. If ESS cannot find your R binaries, on Unix you can change the unix environment variable @code{PATH}, as this variable is used to set @code{exec-path}. R on Unix systems: If you have "R-1.8.1" on your @code{exec-path}, it can be started using @kbd{M-x R-1.8.1}. By default, ESS will find versions of R beginning "R-1" or "R-2". If your versions of R are called other names, consider renaming them with a symbolic link or change the variable @code{ess-r-versions}. To see which functions have been created for starting different versions of R, type @kbd{M-x R-} and then hit [Tab]. These other versions of R can also be started from the "ESS->Start Process->Other" menu. R on Windows systems: If you have "rw1081" on your @code{exec-path}, it can be started using @kbd{M-x rw1081}. By default, ESS will find versions of R located in directories parallel to the version of R in your @code{PATH}. If your versions of R are called other names, you will need to change the variable @code{ess-rterm-versions}. To see which functions have been created for starting different versions of R, type @kbd{M-x rw} and then hit [Tab]. These other versions of R can also be started from the "ESS->Start Process->Other" menu. Once ESS has found these extra versions of R, it will then create a new function, called @kbd{M-x R-newest}, which will call the newest version of R that it found. (ESS examines the date in the first line of information from @code{R --version} to determine which is newest.) S on Unix systems: If you have "Splus7" on your @code{exec-path}, it can be started using @kbd{M-x Splus7}. By default, ESS will find all executables beginning "Splus" on your path. If your versions of S are called other names, consider renaming them with a symbolic link or change the variable @code{ess-s-versions}. To see which functions have been created for starting different versions of Splus, type @kbd{M-x Splus} and then hit [Tab]. These other versions of Splus can also be started from the "ESS->Start Process->Other" menu. A second mechanism is also available for running other versions of Splus. The variable @code{ess-s-versions-list} is a list of lists; each sublist should be of the form: (DEFUN-NAME PATH ARGS). DEFUN-NAME is the name of the new emacs function you wish to create to start the new S process; PATH is the full path to the version of S you want to run; ARGS is an optional string of command-line arguments to pass to the S process. Here is an example setting: @example (setq ess-s-versions-list '( ("Splus64" "/usr/local/bin/Splus64") ("Splus64-j" "/usr/local/bin/Splus64" "-j"))) @end example which will then allow you to do @kbd{M-x Splus64-j} to start Splus64 with the corresponding command line arguments. If you change the value of either @code{ess-s-versions} or @code{ess-s-versions-list}, you should put them in your .emacs before ess-site is loaded, since the new emacs functions are created when ESS is loaded. Sqpe (S-Plus running inside an emacs buffer) on Windows systems: If you have an older version of S-Plus (S-Plus 6.1 for example) on your system, ir can be started inside an emacs buffer with @kbd{M-x splus61}. By default, ESS will find versions of S-Plus located in the installation directories that Insightful uses by default. If your versions of S-Plus are anywhere else, you will need to change the variable @code{ess-SHOME-versions}. To see which functions have been created for starting different versions of S-Plus, type @kbd{M-x spl} and then hit [Tab]. These other versions of S-Plus can also be started from the "ESS->Start Process->Other" menu. @node ESS-help--assistance with viewing help, Philosophies for using ESS(S), iESS(S)--Inferior ESS processes, ESS for S @comment node-name, next, previous, up @section ESS-help--assistance with viewing help ESS has built-in facilities for viewing help files from S. @xref{Help}. @node Philosophies for using ESS(S), Scenarios for use (possibilities--based on actual usage), ESS-help--assistance with viewing help, ESS for S @section Philosophies for using ESS[S] The first is preferred, and configured for. The second one can be retrieved again, by changing emacs variables. 1: (preferred by the current group of developers): The source code is real. The objects are realizations of the source code. Source for EVERY user modified object is placed in a particular directory or directories, for later editing and retrieval. 2: (older version): S objects are real. Source code is a temporary realization of the objects. Dumped buffers should not be saved. _We_strongly_discourage_this_approach_. However, if you insist, add the following lines to your .emacs file: @example (setq ess-keep-dump-files 'nil) (setq ess-delete-dump-files t) (setq ess-mode-silently-save nil) @end example The second saves a small amount of disk space. The first allows for better portability as well as external version control for code. @node Scenarios for use (possibilities--based on actual usage), Customization Examples and Solutions to Problems, Philosophies for using ESS(S), ESS for S @section Scenarios for use (possibilities--based on actual usage) We present some basic suggestions for using ESS to interact with S. These are just a subset of approaches, many better approaches are possible. Contributions of examples of how you work with ESS are appreciated (especially since it helps us determine priorities on future enhancements)! (comments as to what should be happening are prefixed by "##"). @display 1: ## Data Analysis Example (source code is real) ## Load the file you want to work with C-x C-f myfile.s ## Edit as appropriate, and then start up S-PLUS 3.x M-x S+3 ## A new buffer *S+3:1* will appear. Splus will have been started ## in this buffer. The buffer is in iESS [S+3:1] mode. ## Split the screen and go back to the file editing buffer. C-x 2 C-x b myfile.s ## Send regions, lines, or the entire file contents to S-PLUS. For regions, ## highlight a region with keystrokes or mouse and then send with: C-c C-r ## Re-edit myfile.s as necessary to correct any difficulties. Add ## new commands here. Send them to S by region with C-c C-r, or ## one line at a time with C-c C-n. ## Save the revised myfile.s with C-x C-s. ## Save the entire *S+3:1* interaction buffer with C-c C-s. You ## will be prompted for a file name. The recommended name is ## myfile.St. With the *.St suffix, the file will come up in ESS ## Transcript mode the next time it is accessed from Emacs. 2: ## Program revision example (source code is real) ## Start up S-PLUS 3.x in a process buffer (this will be *S+3:1*) M-x S+3 ## Load the file you want to work with C-x C-f myfile.s ## edit program, functions, and code in myfile.s, and send revised ## functions to S when ready with C-c C-f ## or highlighted regions with C-c C-r ## or individual lines with C-c C-n ## or load the entire buffer with C-c C-l ## save the revised myfile.s when you have finished C-c C-s 3: ## Program revision example (S object is real) ## Start up S-PLUS 3.x in a process buffer (this will be *S+3:1*) M-x S+3 ## Dump an existing S object my.function into a buffer to work with C-c C-d my.function ## a new buffer named yourloginname.my.function.S will be created with ## an editable copy of the object. The buffer is associated with the ## pathname /tmp/yourloginname.my.function.S and will amlost certainly not ## exist after you log off. ## enter program, functions, and code into work buffer, and send ## entire contents to S-PLUS when ready C-c C-b ## Go to *S+3:1* buffer, which is the process buffer, and examine ## the results. C-c C-y ## The sequence C-c C-y is a shortcut for: C-x b *S+3:1* ## Return to the work buffer (may/may not be prefixed) C-x C-b yourloginname.my.function.S ## Fix the function that didn't work, and resubmit by placing the ## cursor somewhere in the function and C-c C-f ## Or you could've selected a region (using the mouse, or keyboard ## via setting point/mark) and C-c C-r ## Or you could step through, line by line, using C-c C-n ## Or just send a single line (without moving to the next) using C-c C-j ## To fix that error in syntax for the "rchisq" command, get help ## by C-c C-v rchisq 4: Data Analysis (S object is real) ## Start up S-PLUS 3.x, in a process buffer (this will be *S+3:1*) M-x S+3 ## Work in the process buffer. When you find an object that needs ## to be changed (this could be a data frame, or a variable, or a ## function), dump it to a buffer: C-c C-d my.cool.function ## Edit the function as appropriate, and dump back in to the ## process buffer C-c C-b ## Return to the S-PLUS process buffer C-c C-y ## Continue working. ## When you need help, use C-c C-v rchisq ## instead of entering: help("rchisq") @end display @node Customization Examples and Solutions to Problems, , Scenarios for use (possibilities--based on actual usage), ESS for S @section Customization Examples and Solutions to Problems 1. Suppose that you are primarily an SPLUS 3.4 user, occasionally using S version 4, and sick and tired of the buffer-name *S+3* we've stuck you with. Simply edit the "ess-dialect" alist entry in the ess-sp3-d.el and ess-s4-d.el files to be "S" instead of "S4" and "S+3". This will ensure that all the inferior process buffer names are "*S*". 2. Suppose that you WANT to have the first buffer name indexed by ":1", in the same manner as your S-PLUS processes 2,3,4, and 5 (for you heavy simulation people). Then add after your (require 'ess-site) or (load "ess-site") command in your .emacs file, the line: @example (setq ess-plain-first-buffername nil) @end example 3. Fontlocking sometimes fails to behave nicely upon errors. When Splus dumps, a mis-matched " (double-quote) can result in the wrong font-lock face being used for the remainder of the buffer. Solution: add a " at the end of the "Dumped..." statement, to revert the font-lock face back to normal. 4. When you change directory within a *R* or *S* session using the setwd() command, emacs does not recognise that you have changed the current directory. Solution: Use @kbd{M-x ess-change-directory}. This will prompt you for the directory to change to. It will then change directory within the *S* buffer, and also update the emacs variable @code{default-directory}. Alternatively, if you have already executed setwd(), press @kbd{M-RET} within the *S* buffer so that Emacs can update @code{default-directory}. ess/doc/font-incor-s.jpg0000664000175000017500000010635312423756516013534 0ustar eddedd ╪ рJFIF`` ■Software: Microsoft Office █C    #%$""!&+7/&)4)!"0A149;>>>%.DIC; █C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; └Z" ─ ─W !1AQUУ"Sa2TqБСТд▓╤╥╙#35BrtЁ4RВб$bГ┬сCVu▒┴6EdsФХ│┤%7вё ─ ─1!QRб╤1"AaЁсqБСB▒┴3ё ▌( ┌ ?┘╣]╩ыЗ'юPа█эJ╕╗1*╨╙@jЇRТv╥в}ё>╠T)кх╝XЙТч"-л ╝█К▀╡)AP∙л^■┌uЛНе╓\SkJ\┬РpGв▀]WZU&"╙|Qy╛m*!mмфхzr~2╓╜│ЗЧКтШЫэў┐╠ЄШf√╠-чkЧ{k▄╠■M9╬д╝аВ~vъ?Ю┘=╩П?ЧZн█Цў нХ█Tз<▒е8JТ╪. j '9I█N2F _r▐шьKВ+7лМe;╔°╣Д╚!ЗA(нZ╞фdcI╬√эь┴сшЪcS╙?Щff~╥Щч╢Orг╞Oх╙╧lЮхGМЯ╦нЮ'мЧqўЩТCr-Vш\ы:y▐s П╕8t(Ё9ы┌кнрZяв║\┘ai╝▐$█t╔ЦШб1uЮy╘Х╬ ФМ'pS▒▄╓bЮoj>?3√ё╣їsV∙эУ▄иёУ∙tє█'╣Qу'Єъ╪│╣╚ Л0ф┐k<д1W%м░у═%ТSЬщ9╘HЇ│YмЧk┬┬сNE╞╟wЯ|aJ╣│oJRуКF.з╨ЇВё╛uS╛O]╙TQ╖ўФ╝│yэУ▄иёУ∙tє█'╣Qу'Єщ╔{k╚╖7e═Н с╙Ж▀6s,д∙ZV ┌┬G2Y-ЕР VNTЫqфВд ╙R.P[Й&ЕOa∙йuN/Эd╕М)HFаа{NsББ4xl∙bОЄ╖Юl~{dў*a∙П║╙▒-▓mnХ║\ мГ┼Duёе╒и▒ i*Й%ўЭTЎ9ф╗6Ц╒хJ┘$-ZЗ╚O╢√#З┌Ї|█я<ь^yЮ{dў*▌8#~$╫Л%┬('█f╕dNў/щ/O╕Ф░йo2├JpмДв4Х(ч ╞kмрЁё є√°/<╧=▓{Х2.Ю{dў*N^noGSщ▒┴p6ыи╦ТсR╚_┐)$чVRМgЕ10xl:ж2|~ebfT■{dў*{dў*L╥ъ>{dў*L╥ъ>{dў*ы%уmf}╛'ш[bR ЦъЦез Ї╙├@эу[О&bКhШЙ╖╟╧Т█╣╕TwYёЫ№Udl┐┌)Еф%█ЗТє\╧1х├FМcNЭx╞6┼tпэ&tжЯu eФзBЪiejYuфДМХъJ<8Z╟Р╘╢√ ╓Еp8 В6 Г╕ фwb╜3¤K~iП▀Є╬Hr%rWЧ z3ыbJЭИФ":╠┤хФах!'V└с_%ЄSЦў!У%-йk@vRеЭK#*╪ию{Mu{╝┼█ь╙ж┤Фй╚╤▄u!\ JIЎmQа▄│ щrnp%░В │АпЁ√їdЬзo┐^E=╦ж?╔Тэ╗7ЎМ╘Чф╢э┴╚╙╧8Щр)═# ╘uяБ░═xНa■╨a>√ёLцТ╜oн╣йJЭVч*!{Э╧╙[┴хchvJ╩Iiй i KкIЄpUВ3шЧО╪╩╜{v:Юс_Lпф╔Gjфў.ьлt└Куi}%/4зZ[o ЕбDеC 3КЮрyQ▌g╞oёWT╣ЄВ4HS╒└╣Шuh m\┌╓ДТRМ(МАr0{%G╝┴Х)QЪu|рZ█ЇЪZRе$РдеDв0vЁ=ЖЮчН╩;∙2CР√БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2CК{БхGuЯ┐┼Op<ию│у7°л╡╥ЮчН╩;∙2C ╤╤╜└Єг║╧М▀тз╕TwYёЫ№U┌щ_O▄ё╣G,dЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗў╩Оы>3КЮрyQ▌g╞oёWkе=╧ФwЄdЗ6ПЧqьь} шQ╥а|6╜yY^UХрю╨WиMЄъ█п╚9;mЛ╬c_2█H╒О┬ўт~zшЇп%X╘╒T╒4Eч√∙j╬nYх╥эМ[^фЇу0уО!%╡·KZЦNыущСё|╡т4.Y├РЩ╣/jeфgKН▓╥TЬМо┬kе╥│йGDwЄ[ЄцVhЬ╜▒БЕhcU┼╘║ёZ╨pRV@Ю├╙?0л/■╥qОЙЛО╧Cё╓√J╒X╘╒7Ъ#┐Т╬}g╡rжW.a▐пVЇ2Ц╨д-mн8B└╪(Ю*┼sK╧э╔ ╠╣ЎН~Мп╬wЯ█У ЩsэчЙЙЮ█Z▀■С╥╫як■}СUhВv~yPW:├Mщў║с╬}║ ╥╢!й3_чSлJ[╞°¤┌╬▌оЦlу°НsWи¤3Bbcii╖NK▄a╘┤№Wy╓К╨TМФ) H┬╧7╟┼UТ-7$;Ўar╫p2_p┤yд'SC ╒Ь`${ю'<6оЛ╨╨}Q·fЭ ╒жhОxОM)иJЭqз_╦{"I╤▀`J╓7╬┌w╪ч┬y2щn#.╠BЫАЦ┌М╤ЫKн,Ея║Иe##s╖gFшh>и¤3NЖГъП╙4 Ы╬╔}цж╦╥Г к╔Gш╨ПDч▀zПвB╚)"о+fшh>и¤3NЖГъП╙4U╓єLG#<╙N┼ЭєeiV[Z0@#№yу╒QСc}Б╚єCrч├Л-фaхЗдgbЬф─▀║к?L╫Х┌н═д)─Brз▄Ь╟мР(9їпУJ╖7 &Ps╔ЯC┐л╞н1D|q█ЖпЇЎ╓|Пn#m╢┌в╢S!╡╡%┼ебдVrеl М Тpv╟Jшh>и¤3NЖГъП╙4TK{╤юRe*HSopm(╥IэWQ a А6Vвъ∙╪╢V$";╬▓█╬cCk VN9;╓fэVч[KНа- IR\$(╤m1╗Rr]┌<эx ░ыZ1╟ZЫ9╧│Ы ZлС╔еKm╚ПJD\}╘% с╨зГБYQ$9╒у╤╗╣┴╧Cшh>и¤3NЖГъП╙4G>UКTЙ╚Я*sbJж╥РФ╢ЄSАвпK/УУС░йЎиN@Жu╘╕BЙ┤бй)Ть$уА└ ╦ба·гЇ═FLkBо А▒!(+╥B└)╔ ;|ЮоЛ3Ё ╥▄кж╤l╕█ээ└vlr╙1Г-╕╠rЗвTе░ьу[╝ЛlэЕШ╬/+B0ВIЇФЮ<r{5Чба·гЇ═ 4VmУPй2Ц╚ЦЄm*iН-ДайC)$УТ╡╕█┴▐д[`╣ 2√иqщ.єо╤бщJH$Р0Б╓w╧┼[ЧCAїGщЪt4T~Ща╓jлбG∙/:Э^]хzЇёЎЮ?х╧╦ьнх6лr╘┤еEJАpЭ'ря╢─Ц╜t4T~ЩацпЄ=╖U4!QP$жAK▐J ┴NЕйy▌#Y└3╟9эЦЩ┴ф.cНбШєд╚aдг╙╩╓шJ╘A.Ас╪s╨·к?L╓сZЭЦЇD!EцTтNбАмрВv<╩-жTнЫба·гЇ═:к?L╤═+d6лpp6P╘ Вy├Т2qЯh∙┼zшh>и¤3Aм╥╢nЖГъП╙5х╗U╣╓╥уh B└RTЧ Б4▌+fшh>и¤3NЖГъП╙4═+fшh>и¤3NЖГъП╙4═+fшh>и¤3^Sj╖-KJPPtи ╥p√lA∙h5║V═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fЭ ╒жh5ЪV═╨╨}Q·fгtdOV~Са ╙▄йWRаCПЮцФp ,я╕·╒; р╬x┐ЇаЛ_Ья?╖' 2ч┌5·С.я{cFЦa▒Lз9!KSЪЙ=y╥>j№ёy¤╣?∙Ч>╤а¤U√ьПсoь╘ЕеKi─ е!A ,аУГ√├qёїTx ▀d fж│·╤B6i╢8syЖ░╦Е╩pи\\PTДРоГВGSШ'кЧИs╛Kц┘qZЮИФщ╕╣╣чФм` ОЯKOюHVъ─Hё▒╠2ЖЁ┌ZSМ!9╥ЯИdуузТGчy▐e∙╬wVЭїщ╤лу╙╖┼\Єmg╖╒}yн√{є}МХ"+HX!I@ edИю~>║є*DH═╠yЦЫ*└S╩ ь▀пНgп*BV0┤Е┬3];яyRrrD╣)Ф╚цр┤$)╖@S^ЖфРrУ▒▀┘PmS19;)╦лП=q╥█▄ы∙J Bв@NpX@╚╬╟rs┤%ж╥Ki\@i═7ш■Н>П╜█Еc/├╛м^н╛Х▐Муя*хu\ Huim┐)цТФ ' ╚┬Й9▄С╒Бї╒┤У<ыГьBLV╘╘Е╝YSюnн[Аq╢uО6╝SMмхmеG┤М╫╒!+ZBЗaлХ5cЧясEqХ r*lй-ЗР╦кi╨оiGI<╥╢╞ АI╞█Ьcкз[О▓йM\▄ЮгФ-|°R3▒ўйЇA╞8№ъ┴IJУе@zИпЙBP0ДДО└1Kn╠т^ЩИП╗]ф∙П8▐ЮФ╢$Б╞▓Q√╕NHVp7:╖Я*ыnoФё5▄"зЫЛ% ╘ЄFХkgc╛╟c╖░╒Х▓▐Лd"%e▐a░┌\Z@QH╪А8╔Y╦ ТIiЮ$дR)Ы-XФMs6█uG(цEК"нwЎф0BНРзPJsщ :╕Ё▐д\f%╚l;B|Н╫t┐%ХчЫo ╔ = ФУ╘ ;c"┴M6│Х╢Х╥3_Bа$Ўcj╢Ч8о""-ЁеМЇ╬╗"%╥Lф1kTv▐2; 9▄ъ╪ э└уUРюЛjєoAЦ┌─ЧФ█╦M─╚I╦j i╥ВTМcмМ╓┌Ж╨▐t!)╧ W└╦Iр┌∙┘#НL▓▄b╙╜тўkQ╖█оЧ*с%ежRV╙kШ╜NзЪo}9╩ўp9╞:▒Yя╥д╖pC+)j4Ч4╞ s$Vр1БСЬУ╛6┐-бJ RT87R▒Ед(vЪe┌╞╡ъКж.д%╣dИфЗТФ8ёDй и· XPV Аj$``МvWb{гЮ╘i╩ФП$`ан═gnч ;иxфрЬu`lSзNЬc█ё-б')BF6Urю╬дZb▀>nїZtщд╜,жцT░уИ╘┼└б╘Ав P┴БшО╥'5╕╫ОeнZ╣┤j╬sдg4к.ШXСD▐bъ┤HихYRц?Х╞y%╧+SH ╘╓@GО3╒RnЪj╩╤МЄ╦nи4Ч╘ё@└╬JЬ рТ║╩Жр╒▓РХМ-!C░М╨б% AOf6ж_Х╘┌Ы¤Ъ╒ТHЯ2}▒rV ┤ы|╘х║вJЦRц╟К╞├~▓Edф╖Р╟╖█┘L╫W0┼BМй _4аРT 2t`Мn8uт╢╢ДЬе ╪uP6Дий(HQт@▄╘Кl╒X╤7ИЛD╡9ЧЛsdнkeЙM:а├nNRРг·УпPь╔╔ @▌▐jг▐цsWu╟ц╤ й╛t╢Vёmj╥мБДq├*Мр╓╥[BФд$иp$n+сi╡Ki$ё$qжYц▒НMущ¤┘оос3а░├Б▐js╤д8^╥жЪJ╓WВA└@*╞pмф{сЮ═%OGЪ╙ЄZ1@)u╣Ет▐B╡e▄Й#=CM^hHiWО4 б))JxА65r╦3ЛL─┼Ъ╡к`f''e9uqчо:[{Э)_шTH ╬ 9╪юN}─b▀n║\ лДЦЦЩI[Mоbї:Юi╜Їч+▄└чъ┼l╝╙~Пш╙ш√▌╕W╥┌ае!%CБ#qS+SН3╖╧Ы Tе+o1JRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRГ ╘ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(жT: ?┘╩■∙╙\т'яё∙H╗╗╫Ї:З░Чcy9╨8%>Ц╪╔┴ЎЬч';▌■═Ё─d╩\Де▓в/н░N▄tСЮ}зуЮт-ўчэ█9▀┼ь ╧ЗюЖ?э╬S-э;_Яя?╖' 2ч┌5·N'рY \\И.H %┼<ЄЬ$%G╥;{х|  №┘y¤╣?∙Ч>╤а¤U√ьПсoь╘╓Z*я▓?Е┐│SY¤hаУJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRГ ╒ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: r T╤° пы■в/ы·ь Nмz2е■йпЧ·■┐ъ"Ё■┐о╧Їъ╞└Ў\б№k·■╢Цo?╖' 2ч┌5·Щ ┘r┐╔Ў┐пыa∙fє√rє.}гA·к?ў┘┬▀┘йм■┤T( ▀d fеН{єE!x:u │Н│Aт█$JT╡·TЧ┬T█р┘╨ГБВv┴у&лц\ц╗uz# Me,6Хjiж╘WйKЇПCoЧ=U.KФyТ}╪кnK╝т┬аAJ?юПїпF$ф▐]Ш█▒∙ЧP█e B╡диё╬3щЯЇпTM╒3┤эс┌2─╩{iRJV▓╡Qj=╗WкR╝о*╦D╫ю.╬ТTT╚\xш╞ г% QЎЧ╟fУ─Ъ.kяrНц╘hтDТFъ╓TЦ╥=ЮГДї·)ъ&╝┘b┐o\шN6yС)╔ ;■4║втБЎЕйc°tїУEE~?*ц█.12*c╝G¤ТЫR╓┘°П8р>╨О╙AЄс╩-╬║З1lGNйP╪цЩ╘I$В@N └?>╒ыxСkх<&0№ШЄб>бЖВФ\B┌┬Б█ЛК╬N=╫╞ж∙╚YД▄S╨ПЦt╩uХ)Їj╔9╙Дф$mЭ uяVєmwзюЁnqцCi╚░▄eMйХ╕╖┘Vw╚Hц┴▀ажд╟2#7NВФ╕УьЇ█#п╥WPYУ╫82 ╠D╕ЖaR·M▐m_эIQ╬├>ЙGf06╚л┼~G* ч-▒*г▓O¤кЬRс°З6╪╥╛┴AєФ▓еD┤├Шy╔qШi ╥}╢╘pv╬jr╙!ЫjТЗ ╥P╔e м8n~JпхC/╜fOУGrB┌Щт╙`)(Р┌╒МС╛ФУVМ╕^a╖Kklн!Z0дфp>┌ |й |╦u%┤ДДЭ!<5+т'?5cT╒*dT!.!-@ыF╦rW┘╞ж<╥el╕2ЗRбь#Qе╕є [эФ░ца4nбддч█Г╒╡Fвb~YU1┤╕RR▓ДЬ)└=Ю┬k╠х║╥q╖4АъдрAKH ╘╘wm)SОhK%(йEi%@У╛:╛z╧5Й2P╥┌JР┐I$ЬеA]╛┴E┌Ё√:Zв6Е%Х╣йiOв6P╛▌л3.ЧPTZ[{у ╞ы.┐!┼ 8ХВРtх* ∙ ф-зє╔JЦЭ)- iЎя╫ўQ6░▄─-─а╢т╬ез[goРЄV&. yў[1^Б╖вУ╛■▀Ъ░╖lqX|s-/8Bд ё>┌Рc╚C╬йЗФ╝аеjNH:Bvърn┐K▄п(*`G! ║9╥F} ~}З╦XR╠ўэ mr╠ikH%ф6ТPsЬ`фp┌зV Т Hл}1▐РSП╤▓Z▓q░$|uY╛╓Cф▄╫ю\Ш╡OТазхBeчJ@'nн═Y╒W%т┐ТvxТ[-╛─qКTЦ╥∙┼Z╤╛┘┘um;vВЗвХ!R Hт╬╞з╘u@Ж╡*# RОI-ВIйюW&нн4е╢ы╬<ч6╦,д╕м2@┘)Q▄Ёв3╩>Й:-Чz*[SМ)РuТЭ$А5Б{WоP[d▌a5?Т uЪ+B╙дэ▒E' їcо▒rz╚їг╩ КОД╜д"еIi$g*┬Й:О@>─жГ╧&9@¤·┘C╓╔QT№D>зФЖФT┬Nвq╛┘f╕rБЛsоЗa╠[╙кDФ69жF5I РВp╧╡b▓Zю╢╢a█╫.2нЁZK-4Cо%)╥ЭdЬp┴8q┘T╖╬B╚╝&р╥ЮД|░;жSмйOгVH╬Ь'!#lщпz Кя~Зdv"fбЁЙn)┤8█EiJВJ░@▀pУМ└Ёк√п*d@╢│)╗$¤NKiВЗF@SНдЭЧ─ЕРЯh▀д]н╖yл┤?D&▀Вщ}▐q╡Фнeе╖БГР?Hг┐`Ў╘лХ╜√ХЭ▄u┤IB┘|-):9╓╓Ч▄tХ uчГ< кЬ┬Э\91VЭО├}Й█Їи╦Ъ√▄гE╣Е╡8С$С║╡Х%┤Пgас=~КzЙм╓цюiчrС┼+О┘JRw▄ТI╧n6┌Оип╟х@Ь█e╞&ELwИ ▓SjZ█?ч┌┌h0ОT┼шIwU┬Ъ┌!║YqЕ6ЮwP `'V■°`q=Y╚╬[Е┼°Й╢╬╥жу<єl╚e─НiчHJ▀╝(gRО°L┬с^∙aИn>bhD╔-нЕб<┘╥┘ЇА╔▌$ЎЪ╟]]^в┐p\M╢yУ)╣╗■┤ат@ЎХе°uuБA.ф&Ыs¤д iNжCЮїJДл░`Ю ╖п╢щ╠▌-Сnїs2┘C═ъ:T╕5ЄфЇж-╧╣А№аЬ2┌╜щY┘:╗УТ{3_-VЇZmнн-Knt0Х+КВR ЎэA.кд▐ Пкй▒.P%+p│Y╟щИ▀ld╡к╔ЦА╖№╢ж$─П|Я╒╗╛pтG╛Яh╘H▐В{<шa░∙AwHч  *╞°л5Кtцmё∙╫u(йA ╢БХ╕г┴)d¤фрk+<шa╛|а╗дsЕДХc|gл5]╩ ╪M4ъP\Ош}Юpe┬Jpб╓RЗ╦С╕в▌ЫЧўBОЬ╣iс╢F┘╞°╪чY╚8ЗlхTгq_j<╢в╠JK^kCkRЖBsЬГ─n0H╪ЬМ°▓Y╤╔Ўж╠}╕lыBJ─6TФj99%D·GoШnjлТV█Д■I╪╪Э% v#╣═є*mюqн$!Y█ ZzА'H▄фф-фЄк4d╚t@╕?:ЦЕHeР┤ Фй иЭ@зЗfї&я5√s░dЕRB1┐щB=б┬Б┘Е(ёй%ЄJt╔▓Zни[онHЦ█ LЖТTtФРн:╥1ГО#&оoQ_╕. &█<╔Ф▄З▌ ZPq {J╥Б№:║└аЧrM╣■ОR┤зS!╧zе ┬U╪0O█╫█tцnЦ╚╖·╣Щlбцї *МО▄∙rzSч▄В└~PNm^ЇмьЭ]Й╔╔=ЩпЦлz-6ИV╓Це╖:JХ┼A) √vаЧJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRБJRГ ╫ь╘е(жT: r T╫╦¤_їпы· дйкkх■┐п·И┐╫ї¤╨■╦Х■O╡¤[╦7Я█У Щsэ¤L ь╣_ф√_╫ї░№│y¤╣?∙Ч>╤а¤U√ьПсoь╘╓Z*я▓?Е┐│SY¤hаУJRГ╦О!ж╘уЛJАTе(р$$ЪлsФQ"Єsз'Г9iO%SВдМze#:xГ╖Udхо|Щ║[ущчеCyЦї JA'у5]╩'фчaDrZжAXО╓АV┤МГяT ▀м`╨K│^д]_q*Н ╢ЬХ▒9/рУ░ │╛■╩Ь.vЄЦT'F"A)dєй¤!N√я╢╒К╥╢an│lrUдб╓R┌ХБ╟И▀ :бф|╠Щ)z└№I Х"G<√) ╥_ZЫфрщRvЮ╩ ЭRу"R"*CIР▒й-А╡ ўЙр~jIЧa╔rОВtЕ:░РOfO┼Z=╞╦wч2зf║ьЩ uЗу┼iA л-Оu^Т pФїр$╝V┴tel^|╛DnQU,╢╦H ,,)EJ╥v┬БH╧W6;h-╝╛┬╪¤w1·┴·╧Ё│НdDЖ\y╞PєjuмsИJБR3╕╚ъ═iЦ╗jЭф2Q Pь{╙ТK!E!йъRТУ╓н)╗ Ф╙w+Хц°уд┌╠√SMEФт@)qсй@Ф Й uБЬїPlь╦Н%╟[bCNнУе─бaE}И8Ъ▒ЫЭ╝8Ц╠ш┴jp┤╬з%cN3─dm╟qZнК█=Ы╠"┤LdE Kа╞iж╘ЭcZwX╒дО╞z▒Xg[r-\f╚ ЦKZД5єI╘с,!░дэЗеgcВ щ&\hMЗ%╚j: ╥ъ┬A=Щ?cщ;~ж╙х╤▓щ lsйЇ╔А7▀e$№г╢к'ЛТ.ТmТ'Ez"n0l)qЧХ)DдЬz@д╒═О┌Оїк3ЎIaZЫ╢╔П$╬Нх(%─БТ╛:ВJ√╗Ў`64╦М╣KИЩ *Bе4 ╥6▄О#И∙ы ╖вы▄Ж╦О║┌▌YfРЬ ЯiQ╝(■щиЮМчя╧2&цB╙й8[lЖРz╟гщx)jB╛з¤ЫЦп)▌У>▐╥=ELн╥░}╕y$░┘A`nvЁЧФgF9 xєй¤'V√o╢їОE╤ия┴╟ЪвД>ЕРвЭH╧▒@nС√╒л]aHТїёц,╥ш|╥■PГ╣;m╖┤ ЬНкц°д╩╖┌с2╩ЪvT╚о6╩УВ┌q/P0Ц╚ь╔Hыа╛п.8ЖЫSО-(BRФгАР8Тk╒bТ╤~+меa─ЕЕc#┴╪№FВ3w╗Kо%╢юР╓╡РФе2JЙр═╜┌ZqM╣tЖЕаФй*РАRGFj╢7&ф▒)зХsma╡ЕИ з89╞@╚°┼$ЄnKЄЭy76╨YPIА╩▒УЬdМЯМ╨_6тm.6┤н IRNBБрAиЧkм;%╡√ДўТ╙,бK9 `ДГ─р Св─VЩR┬╦h * ╬3Б░°ЕTЄ╩*цЄBыиКЦ√▒mЦ╥РеkRJRFx`Ю=Щаўf╜H║╛тU*m9+br_┴'`@g}¤Х8\эх,иNМDВR╔чS·B0Эў▀mлеl:┬▌f╪ф лICме╡+О┐■uC╚°1Щ2RїБ°Т*DОyЎRд╛╡6╔┴╥дь;=Ф:е╞DдDTЖУ!cRZ+jю└№╘У.4&├Тф5щ ua Ю╠ЯК┤{НЦю%╬eN═u┘2ы╟К╥ВAV[ъ╜$с)ы└H=xнВш╩╪╝∙|И▄вк:YmЦРXXRКХдэЕСЮоlv╨[y|/Е▒·юcїГїЯр■/g╚Й ╕єМбц╘ыXчХдgqС╒Ъ╙-v╒;╚dв<б╪ўз$ЦBКCS╘е%'нZR;v)жюW+═ё╞!I╡ЩЎжЪЛ)─АRт ├RА;(@ы9ъа┘┘ЧKО╢─ЖЭ['KЙB┬К√8p?5c7;xq-Щ╤В╘сh'ЭNJ╞2ЬgИ╚█От╡[╢{7ШEhШ╚КЧAМ╙Mй:╞┤ю▒лI3Мїb░╬╢8фZ╕═С ,Ц╡kцУй┬XCaH9█%J╬╟ ╥L╕╨ЫKР╘tд)╒ДВ{2~*╟╥v¤Mз╦гe╥╪чSщТo╛╩I∙GmTN $]$█$NКЇD6▄`╪Rу/*RЙI8ЇБH'лЫ╡ыTgьТ&┬╡7mУIЭ╩PKЙ%|tФўwь└liЧrЧ2TД Jh,дm╣Gє╓n E╓=╣ Чu╡║▓═!8>╥вxQ¤╙P9=?╧▀Юd"M╠ЕзRp╢╪ їПG╥ ЁR╘:Е}O√7-^S╗&}╜д0zКЩ[е`√pЄH`+▓В┴7;zтоZgFTt*t:ТДЭ╢'8G╧Xф]О№@\yк(CшP) )╘М√Ўщ╜ZЇлV.пrmЖZ█ЛЙЪЄш╨щQОZ╥▀<у╕ўвн9DД╣▌ma :Ї°╩m  C.е╒Я` lПМдu╨X▄ж}╣∙бЕ╛N╡б°дnм▓Hx╟]Hm─:┌\miZТдЬЕ└ГX.Щ╢█▀Ы#W4┬ ╘2еcи▓x╓HУ░^╢rf╫oСзЮЛ Ц\╥r5%МPYT7n nє┌[%R#╝°^v╡6Т1эчG═S*ЦW■▄Z Ё┘Я■H┤оw█"вBЫ.╚aММK`№Еy∙*eRЄпЎC°Ф mк║аRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФа ╨ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: r T╫╦Qпы· дйкkхи┐╫ї¤╨■╦Х■O╡_Цo?╖' 2ч┌5·Щ ┘r┐╔ЎлЄ═чЎф ц\√FГїTя▓?Е┐│SY¤hиQ ╛╚■■═MgївВM)Jj╕┐╬фшВ-┼╢├х╥░[$Ь№ъ5╖╫>■╒?ўW№o∙+▌¤>Кkтiжи╝o RЇp╘┼X▒√▒╔ОV▀nw╪Qц)┐&Т\6VФ╖╦К▀Т╦/▓├О║∙!┤uл'цhоg╔▌╣shBTИhц└р2┴R▒■r╝√s[╗^Я.%s╗є6╓|Я=Z▄wЭ╙ёшg?kзї*(гЬСhШ╛▀▐[тйж+М▒mУСuВх╒v┤╛<▒ єКhдГз╤╔>∙<;jeksnvЎ∙qn╫:2y╗|─//$iW9c╛╟c╖░╘~S\.╝7 )qШ~NK═╠LbуЪИRu(~ш╥q╫п┘_5фl6█\DuG╖╞LvФ▓сJsВг─№╡.┤ыХ╥sЬМГ5ыК ╠7чЩq% HlУ╘аPJИm╢┬д76U▓с|╢┬Рх╔°vцх╟aўu╕зU╧Мё┴╨▐▌Z╜┤MyJ╨╡))ZTPtиЭ'р№ДЦ┤╒╛Бz░╡ФТeyl▓й-├Оp¤┴и гпЗU|╢CЕk╜^ЬЩ|Ъ╔jzJХ·фИьЬФё^рзoЁукГl3тЛР╖АФжKсмФOg╩+ ╬╦m╝б(╕─DФа(мЬ`у#n▄ з╜┤ЩЬ╢┤D┼RнЄ╩Г+ qC\raёЁэмъBTRTРJNRHрqМПРЯЮй9<╫Ф[.\т╓Й▄%ечpр├кBzИi-у╪TЁ/е╞9║+╦$╖1врЇ╔К╡ръW8ФрцГuиЄф3РыjQч╩JйCZ╥ЯЫ$ьън.|╣ Gхu┴╗ЇМ┘▐Zт│╧ (WУ╢цХЙ%┬R{элОU\О─ M]№Э─╦ЛД"@J]i╟█JКЗя'Nн■: ЙkCi╘╡е РЬиуrp╩Hъ╡ОX░═╬╔S3ЮK-╬КJу=Д∙KZФH█╤Ьї`ЪФЩa╪юB яЮ[ -у*K╝·X:N #иi'}эbУ%ШqЧ"CБ╢ЫRПWї┘Z}Ю\ОЭВ╥зJ 8╡х┐/D░тГk└VPР2s└и$vU▀(=)Ц6Ч╝w.CЮ▐Э-:┤g■*[#┌╒bУ%Шlф8i$╡p Ўnx╒юKС╣GmT9n=)hptX|! ·CЮN▐▄√)╔╘├Ы╔7лС╣░°pJ\З5ge╢{F█№}tbН%ЩСС";Б╞ЬJЗ_ї┘P92ЇЩХ┤=1KTЧ ▓зЛГ +(YЎч5ЗУ■М╦уH┌;w#╠БяFжЪZё Nэ&ВъХйMБy\щ j=╠╢зTRQvJFv┬tь=ЭUЪх ьчТs \Uж2╛jцЦЁнЄ▐СэW]╝xЦ╛N[ЭцnPвъёЬjjїJ ╤ьКBV0┤Е ГВ3╕9чпTеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеФеб╘╩ЗAО_ъЪ∙j-KЧОa╡ДВI<8П¤qP∙╓zд7є ^╩п■╦Х■O╡_Цo?╖' 2ч┌5·d]Тх┌┌╨*TFг╕з3▒╓ерИ#¤}Х∙Ъє√rє.}гA·к?ў┘┬▀┘йм■┤T( ▀d fж│·╤A&Фе╡оWЄ]■R∙3%╢|Я^uВsлOgЁ╓╦JыЕЛ^ q]0▌═fзхж╪╣:╒uГ)∙╠<▄0рJRВЕ╢{2в~S[S░ЩzlyК?-(RN2Хй'┤ФЯН"дU9ZхЄ┴Q╘ен╨╨·P╦[╩q9?┬ЦИ№├╪*уc╫ПVj■WмI╜Iл┤█\ZЬr▀kQ%JS)$Ю╙╡f~4yH ╔a╖РB\@P╖zеv;Lr·═%rн╥Л▐Щ┬╩W$у8╪є╫Лў*l╕ж┌╦С█РKы\Р╜ *J@╥ $Флт╟┤W5█Рт╝┬v3.4МimMВФр``um^У:d*JXl<▒Е85(v╟и|╒E+ФплУQo6шa╥ьжШ[(аЭONУ├▀Вv#z╩▌ї°=&Л╥Bн▒5┼╞╘дЦХ╬mГ╛б═+чЬЬu╗У3fNDЕ2щy!╕иdЧ НJ)▌^ЛЛ╪ЎцнЬЗч╨√▒Щq╘cKКl'#лzдzы~Лq╢GС [╕╩цБKк%ФЖ╓с эVАF┘┘Xl▓╣L¤▐ш▄Е█╘╠yшm`х ,2в╖√─я╓OU╞и╤╒!2T├eф %┬Бй#░=gчгг┼An3 ▓ВrR┌A=╗V┐wЄ╓╣imU╡╢╘√ЎщIYy┬.0A q╞еН¤.╩╢│\s╖ 6тuЗNF╢▄Sj#╪J ├A ╥ы╠Bf<╣2Z+ФRзF}дН:▒█д$bGeAe┴А╡,8U═МХМс\8юwЎ╒eХr&1s╣%@╔zSь4З ╨┌YZЪBvъ%gп+=В▒DхйQ91/Шe-▐Т9фъ9mJОзЖЮ╤ш┐hа╕0!ш1!єЧG6?HsЬлmў▀zЁ¤╛┌аГ"R┌ Нз╤└H╚э;mPIхт7NH0тЦGT]W8нO6C╕HъVХc}▓G╢м9J√ё╪Ж▒3ёМш╚y.Хз█JЬmФиъ▀░PZв4vу∙2m,РG6pxМpып-├К╦ aи╠╢╥єй┤╢UСГС╫╡SЄ║M┌%╛3Ц╡░НS#6сtл>УэдОгиГь;TЇ?sЛjУ"lvdIi+[l├'ЇА'!#WяСєPHb(л.FИ├+#M╢Hь╪Rt&n1Ёt(е@дсIRHRTQ Пhн~╙╩iУю▒сы╖>З ЛЛakIm!$ЁXЙVЮгVбZ▄ш█pRРЛМ└├кI┴╨Ц╓ъЗ∙ГZ▒FВ═QгкBdйЖ╦╚KЕRG`#X З(╣,е╧╤ ┘i╫q╩╡6ЭЛk┬╕+8V─zш/j<L█в&3шIRЙQ╩Фее(Ю▓TI>╙X,w]мыТ█ оdVЯRrVРмЮгrykoдн┼JZ-╙ )G'BЫCйхш─К КVе7ХRг╬Р┬f┌RuH─╜и`у|'°л5╦ФТ!∙&Йv─s╤РщчRЎфчtр{▐╠яA▓нq m─Еб@Е%C О├^Н* qШmФТЦ╨ э┌╡ЩWWю<Ч.кDuєЧ▒ЦиЪ┬Kk}дн'P%+P█и╘╦Dvн▄ж╣[вЕ7т╛ЦК╩АZ╓·Tw$ю@∙(-р┬f▌1ШBJФJОTе(Х)DїТвIЎЪСT№ЮZ█щ+qRЦЛt┬├JQ╔╨ж╨ъG∙C║▒"о(#═Д═┴Д▓°% yзЖ=&╓Хз ЇСR*ЯХ [vЦЕ)$▄`Мдуc)аG╩ qA▀ Ыe║4└Ж"▓Ж[ 9:R?йO╔н▐E╪▄qJZ╒nОTеТKi╔&о(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(? ╙ь╘е(е(е(жT: ?┘╩■∙╙Zїl7?┘╩■∙╙Zї;?э╬S-э;_Яя?╖' 2ч┌5·╧√sФ▀╦A√N╫ч√╧э╔ ╠╣ЎНъи ▀d fж│·╤Pг }С№-¤ЪЪ╧ыEЪRФ RФ Ах╜b°═╔Ее9d▒%■╤ ъA°╥вм{W▓з╒jч<я(QncHmИ■Q)DoЕТЦ╥>2Ч =Z¤ъ▓9.╘ЫЧHн═┤гCр%e%I2Ф№┬ж▄-,╧q▀К·Юz2Ї,зОТpr3┐ Ї╓∙I=╛щ5─H ┌ЭSrАdъNХZtм+=ХЎу╩v╦ЛVўЪТ╣┤зYCLХєБ$уЙБ#│z╬OFЫjf▄╣2╨█O!■qс┼-*╓ $oщс_С6X┬ё*цзqr╪LwYq@┤PЬрi╟√╩·F╜жь├ЦоСa╖▀lТ█MХ8еI╙╟)P Ом┴o╕!ЧГ=+УpBв┤░тZ╦п$zE#мч$uoAK╟9█▌║S╤%Fj╦uQ1/%)--╛mpўщ99┘w▐ъW'гIЦьБ&[A Р╦.щC─$'*╬щJS▒Xy5╩>Я╖DРиг-°и}J[$5Т!*k█tЩЄIKZ[╬2BR ;|Bл▌╗╗f▒GЫzi┼<▓РЄ"╢\ )gdэ╘ ╒╫▒ыаУn╖о▀"hB╥b╛ё}ж·█R╖p|EY_╞╡{*|СА╘ИNвD└-юЕ─oЮЇ%:1яJN0zА▐м╗0¤цMй ┐╧Fm.8▓┘ с\Wxэь5О╦9щl╔b^У. ЕGxд`(р) ─ЕбDuGUw╣- °╫xюJШ[╝+TС╬ЁЇBHN█Рё_n<Ыjш█ ┐q╕% ЖЁx JmAIY█ujч╪*цлч▌╙o}-3фe:╡GО\H▄эС╫╡╒┌Yz╒╤Є}ЇВqyp(+ZUЬqJА#nбXЫ▒2Ш3"╣.cцcEзuь╕AI╞5Ъtт<З╩·:уОwЫц╝Х\ч чO°z│█Y ]╙p}M3ус:╡HО[I▄mУ╫╜(╢ШЦ╘ЧзMШ╢ SIТшRPвТЭ@7╥еЙF│]эыЯв┬╥▄ип%°ю+АP╪ГьRJР}К5>к_х$Ў√д╫ 7juM╩Уй8JTHi╥░мЎPAх9╫Щэ╞╨ДЩ(S▓Лщг)!└╟tйH?юйX▀urbLЫsёс┐фя║Э {н╝ьT=аdПhу╩v╦ЛVўЪТ╣┤зYCLХєБ$уЙБ#│z╬Ы│Z║EЖ▀}░JKm6TрPVХ'Oе@В:░h$┼М╠(М─М╪iЖKmб<Р0╠*-в▐╕▌/н.JФЄЯРтxА─д%╪СXmў#ТЁgеrnTVЦKYuрдПHдuЬфОны&╣G╙ЎшТTe┐йKdЖ▓@$%GП╗E▌*Т_+-Ё─Зjbг╟+Jф7JkRI!CЙ╘ q■-к╬|╓-╢щ3фТЦ"┤╖Ь dДдv°Е╔ЁY╕─TgїhQJВТpд)* JБэ Пhм6ыK6чx>№Ч▐ J▐Р╜K)NJSЬ БRП∙НFM▌█t{cWvЬЄ╦В├d0┘Sm8w╨T:А█'ОТjS7f╝╔╡!╖∙ш═е╟[!╝+А рO╜ЖГхв▐╕▌/н.JФЄЯРтxА─д%╪СSъ╢╦9щl╔b^У. ЕGxд`(р) ─ЕбDuGU9ц╣B╗s·Ko╟ЄИк| Д╕Уё6Aы╓Gю╨Aх╞╓ыb▐ї╬ФпТёе(е(е(е(е(е(е(е(е(е(е(е(е(е(е(? ╘ь╘е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(е(жT: ?┘╩■∙╙Zїl7?┘╩■∙╙Zї;?э╬S-э;_Яя?╖' 2ч┌5·╧√sФ▀╦A√N╫ч√╧э╔ ╠╣ЎНъи ▀d fж│·╤Pг }С№-¤ЪЪ╧ыEЪRФ RФ йTwгrл╦R┌ЬbtD╟q@~йM)kG╚ауЩ=E)╜V╘а╓/<Ю║╦П|ЗLV╪╜%E╟ +mEФ╡А─╪▀9О█ ╬T Ы╝г╖\Ь11с:├щJХл[Е╡Э▒АZOвjцФ╚7█eЭl$[▄Ф╣п┐║╓q┼8FqЬЕ/м▄ШБs╡Yв█n"У;L4╕ъQ+ NТTр8{jцФv;u▐╫╡╟bYK(Z5]JSе:БOQ8'qО╝╒dЮL]$╠РшX[п-M╩eчТу@иФи6=░0w┘Ddё5╖╥В▐▐Ы╡Ъu╡n╙2;МБТР┤Фч-W═Mця╔Ф6├1тM|JnFJP88psЬ1ГЯe^RВЪ╙jХj╣╦mо`ZЭ [(╘е:Ч0Й'И8э$c█Бю├фжtщ йЧ.2╠ОiC Ch╧a(m*#ииОк╢елч╪н╫7╥№╢V╖ЭехгlУ┴$│Vалў9kЄ"цц9▐wOФ9ЭX╞sл<:│К╔┼n╢>зт2┤8дш%O-{d $u ░е╡Л╧'о▓у▀!└У╢/IQq╟ВК█Qe-`▒67╬Fг╢├;=()Хця(э╫' @╠xN░·Rеj╓сmDзl`У╟иЪ├lГ}╢Y╓┬E╜╔KЪ√√нa░ЗSДg╚Rёё ┐е7& \эVh╢█БИд├О╙ .:ФJ┬SдХ8┌ёc╖]эqс[\v!БФ▓ЕгQu╘е:SиДїВwы═^RГPУ╔ЛдЩТ uхй╣L╝Є\hХ╟аV√(МЮ&╢;╜╜7k4ыj▄-жdw+%!i)╬>ZЩJ fїtИоJБ|Zн▓Юhм%)+So╢A╘Б√┌VS█╖mXrmЕ"╥ЩПкM└∙[ъI╚╘░0Рz┬RАz┬лjPT╪c╝Ф╬Э!╡2х╞YС═(`б!mь% еDu╒D╟zO*╝╡Mй╢ ─Tv╘GыTъР╡№Й ╖Г╓Tб√╡mJ_╩ Дrтю√П4┌QI┬╓QTbРы▄ПЮз e√╫■№ї╝╗юИ├Л№#Ь?&Ю╛▌╕╥e╩,а·╚)eoЬ$ЯA8╧╦щ ║ЧЖ▓U{Y.Ххn!▒Хн)2гК·PA▄UЧ┌RФ RФ RФ ╓ь╘еGLшлЪ╕IРГ% ╘жБЇА█||гчв─L№$RФве(м2e1 :фIu,▓Н╘╡Ь╒_dHn3a╟ +BwRВG·СE┤╦-)J!JTt╬К╣лДЩ2PЭJhH ╖╟╩>z,D╧┬E)J!JRБJRБJRБJRБJRБJW└BА ВрК┤м,JbIt0ъ\ц\-╣дчJЗ}╗К═EШ╖╔JRИRФаR░∙SWфЬъ|а╖╬syЇ┤ч╟fk5╓)JПtYэй╚ТЄн*(9┴└8∙И∙шZmtКRФBФеФм2e1 :фIu,▓Н╘╡Ь╒EИ╛╨═JRИRФаRФаRФаR╛wV&%1$║u.s.▄╥sеCИ>▌┼╥═JRИRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФа ╫ь╘е(е(е(е(е(жT: ?┘╩■∙╙Zїl7?┘╩■∙╙Zї;?э╬S-э;_Яя?╖' 2ч┌5·╧√sФ▀╦A√N╫ч√╧э╔ ╠╣ЎНъи ▀d fд,,┤рo^▓Еiц╚ ╬0N┘°Ўиё ╛╚■■═MgївД4█#s║j)ЯзT┬IuТ4∙JrO│╖┤√▌йznq╜╠╥Щф!Бе╓q¤сE8ЎЗмqV╒╣FЕHО┌[)i ▓Э)∙5ЮЖD┐╧Ц╥чy¤DЯгЫ╒ЇvоY6╡▐яSє[ЎўVЖЫ~ш║6╥a4жС+JЖ╜KЁХ╤фО█Оё$:№xМ)F3M▌n2АZJ╙Г┼!Js`F1БА+`С<╢├rc┤·╚KИ Ўр╫╟`─~:#╜Чo[`е8╒йе╞1bё3№![▄qЫ╝╗rх9%-0╙╔SдВе8╪ ╜їuЪ┤м)ЛU%1┌KыSб)CmЙу╘>j╩9┴с╞╡9W1T▐еюё*;Sg╟\Р▄]a╝-д╢TНИRTuЯL╢21О╙╡ВГ└КО╗t_SюBО╖VSКi%DВ ╟f▀gB╙im┤%@)H└pTИШЦлоЪйИИ°C║╛ы-░Ж╓ZKяЬ╘дВs┘Т@H╧ZЗE°єм\\╕)╕он╕Л╥Vт╞?y#З?xё┌н╓Д:┌Ыq ZRT2АrтА=╕5щцТ╥Щ}д:┌╕бi пБедКщЛmё√▌wТс}ыКфиН%) K`э╕РqэуЎ ─Ззк*┌mЎDSзIH╩SРw%@ВG╛N╟┌▀S-EР╠╒2S%ДФ%I╥тVъsС├Ё┼Ov G▌чЮК╦Оi(╓╢┴:NA=[Э╜ж▒╗j╖?гЮБ╬m!╓╩NФОm░ЎVr╦╢е;mЁПy}╘─g╔Я╙╬;дєkJV▒еG*ЇsСУЮао║Пh\Ч▄Щ∙RBГh╨ХєemГп╙╓ЬдТs╢6╥6▀&╔Vш+МШ╩ЕL х-ТRУ╛рcgчпн├j,gВ╙1udН АРмq c=_5[Mю╠WLQЦЩ╥Wi╡▄ ╔SdJ б╞0Э'V╚dМиЮК╢┌╞C═S┬╦иЗ$Hlu▒YнЖmqoKNHiФ▓d%аЕ-)xЮuїVE┘эn╕з╢─Z╓IRФ┬I$ё$тдD┘║лг<╠|nЕxЦёФИСХ )чц┌ !>ТЎ╟внАьс╫ <∙R∙?ьЩNД─}┬·Ry╓PсI╘@9!)╒шё▄#Є`─Щз╩в▓■Мщч[ ╙Ю8╧┼Qх└РжЦЛlЦ`JФт╙(йGў╕Н¤з9д─▐щN%Кl╟nS╥о&∙Kж.▓╦ ЬiЇvR°g▀>LїМY╓qУ SзK-е▒д`` l2{;MgнCНs;5Y╥чз╩▐L╫╨Д)┴╧0╢Ц╙iВy▓uХ$ ╟°Б└#j╢ШуП▄№НRЬД╥Yе╞╚ uDР@*a '?╞8cy=nЄП(Є▄Ўн|ч2ЭZ│Ьч╬zы,И▒х╢Уз╨B\@P╖│Ц]зЩ╡бO=╟тrnюыwe<ыZ█u! ┤RАRУ─p э╘xmR┤╦ЛLс-╦Гшee, ╢еРH'qMЇВЁ Q╔┬A-9сФЁълE█а╕Э+Е@6┬ЪIЇ╚OАq^╫;С╝Щq┌S═)зА╟ ░)igRЫD[у╩Ю┼qy█ДшO╕щ█i╧╙╕┌╓ ╡чtmМ%>▌╧hй6Ч[U╞ЁтIT─р  @╒LE║ i╥ИQ╥ e╝%дП@ЬФЁрI'хЫU║3йyИЪq<ЖRТ:╕БV"Jлвff"╫k╫╗─иэMЯrCquЖЁ╢Т┘R6!IQ╓}0F╪╚╞;MЬЄ√╫°СY╕╕├/┼ukKzI%*oII#cщ▌З║░]║ пйў!G[л)┼4Тв┴у│oК╜1ыo&+!╞Sб╡Ж╞PЮиnvйЦWVЛEгтъЖо2╡░9№kЪьW%mЦ╨Х╕Фиїj:R3├+UХE°єм\\╕)╕он╕Л╥Vт╞?y#З?xё┌мЪГИыО╠V[e╠ыm АХd`фp;R4Рїy,VX╫Н\╙a:▒├8°ъ┌Rq)▐╨д╡╧Юй▒╣╬q╞egZЭyвРtХ╪A'p9╪ё█x╫ч▄~┴xРЇїE[M╛╚Кtщ)JrфиA╚ў╔╪у}Си1Р╣ ┼e╖Ь╬╖╪ VNNO╜Гўyчв▓уЪJ5н░NУРFOVчoiйЦmfгШо*│0 АA╚<к╛Q╛ьKRd3,┼Sr┬NХ8ФлPАrтА=╕5r╩F%11▓Ц\щ╬rz4Я(LI^V╙JRJTУЧГg#$cТ╪эЭл°pы;:s╓Xо)ieўSn%зP╜:ЎA$д+╤МЬб╞н▌Г°шОЇV\e╝hmmВФр``pQ╪1ОИяEe╞[╞Ж╓╪)N╡b╥яФZ"▀ x3&┤═╔D╚ТЇxщ[1]╨е~GжМВTAъ oУт╫>zж╞ч9╟ХЭjuцКA╥T aЬm└чc╟mя#┼П▓▄hэ0ВrR┌A=╕ёи1Р╣ ┼e╖Ь╬╖╪ VNNO╜2╩╬-3}╛Zфщs╙хo&kшBрчШ[Ki┤ВA<┘:╩Ту№@р╡mUвн▐QхAЮ╒пЬцSлVsЬу9╧]Kл0╞%qTDD ^%*4Dев░єы ╖гNsВгВв:Rн╧^8Ё0,▀zх: ╦u^N█KўZ┴Q^wF╪┬S╖╧hлзШfKJeЎРыjтЕд(╛╝3$e%LEeе%:Ca$'9╞▌Y▀┤ШЫ▄КщК&ЩН╒TJШ┘qы├оd╝Ф!JJRF│ПKdОqиТn╖@№╣e╘он iO4ЦКRv* :╜$яЮмНО7╪#█а─p╣vF Ыi)$vd ЇьП╚DЗв▓у═уCЛl'#И▐жY│жн9жm│=)J█╠RФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаRФаT:ЩPш0\ g+°чMk╒kГr╕EО╒╛рШ^√Ь&?;иdcўЖ7■╗h}╦ЄГ■ЁзхА?┼єfC┼ЯЎч)┐ЦГЎЭп╧ўЯ█У Щsэ¤ g╢ЫtлЄd\─┘лb':Р╟7═зSЪ:╚$ф№▐╨kє╒чЎф ц\√FГїTя▓?Е┐│Rя0╙ПБ═бJ╦К╥САNчи{jmЙПЧV [┴?├R╕DJ┴/г█ZК*Ш┌ЬZ)ЫL├V╡^&√Эz▄вьЩ.+NJ┬╥╥Їxєdе#ўЖчЧ√┬ЧvШ├П[КЖгiTТCПъOг─е)  }oLN╢ъч%х╢╔FJqщйEnп№ъ╥q╒зn4u0Ъй.╬JВЮmjFЮ(lДg╪с+╧╔┬╣шт[сэїЬ6{▐6№■|>?"Zп6чбб9&еCЯ!ЭФ╤ с┐╛P''Pъс"Mс╓l╙хж: ЫzU╧2еРЬе!g ╞рдВ6ыу|bЪЫ|╔═╠щ7┘uЦФ█eеиВгВI╥∙p╬Їy╖нR-цj╥Щ)!чAуЩ┘DТ1Т6с░╪c╙─▀gQ├╬[╠~╧Д°ПOy╥йО╔Oв ║Ь┌╙О<z╛L6ЗVы╖ЇfЩ}В]цЬ+J╧4┘ ╔ўJGкЁ╠им┼qХ]ЮuK╬^Эh╚╞╪Hq▄П сKr@╜Jt║╜n!┬Н+VРЬЬ  U]:Ў┌Y╓┴╡_T=╬╜Kb╦ДXM┐"] *wJ╓жЄБМ`FфО█>f99╗Ї├I[яBx8┘}AдФйгЮZФ ╬улЕeш╡13!EР╘Ф)$бц╥┴ZЗ┐#:└фБ╟cУЫЗАх╒ЫБЮ┤нЦФ╨lаЕNv╧зпўG╖9╙─Я┤║kрS1T}■ Нп║<√н┼vЦ$┬iФ/╦эnЕ lД·')$(dррч┌о"*ZЪ&cl╢цнГ.М|d °╒K-[╖9W]J▐/ЗSн +╫СА╦Ї╖f╒"ШquХ▄ЭТ╡р╝б░└ │╒ЯШcQЗЙ}тXп-йШ∙Z╒Cw+Ы╥ц▓═╜Х"№┌Х╧р╕ ▒дc▀a[ГБЬnw─╛ХГЁД╒b╦ўKг╧╔У ╖ф%CЫy:_@m(ъ╔O╜;Н' фlЬ:■╤)ЗЛГ╛jг¤о║Й3т6╩и│!кKNфЕlQ▒Ip=╗V^$зУrоf3\№^{S\с╥yей*┬▒Э┬IRI╢=╠Цfкуа╢┌ущPqФрВ1шзлўE`нI│I╡&р°П!K$ХВдЕТTРH;Ю9;Эъiтrj1°m╖ПЮ█  _╣╗╬-pЩa6З╩їui╟pOV╒ ъ[Ёб▄%BmИТ╥╨IK║ЦЕ9АЬМcР6$ю2°╩╠°╨в╕ чfмeCЬ( ;{╤АС╒╫█╞л,-DНkАЙ▓Ю О╥КыЙ[hq#Ж2NрР dl00╙─┐─СНБЦff?▀Є│[aоUGRрчс╛з\QI)S $рlO╫^n╖цнЄ╙ .EC№╪u^Tў6РТH8$ТAр:╖╞┘Мє1ЭхЭ;1$-( -с Qдe=ё▀jУ-█|Ч═╧\WА╥]`Ае'ОУРA▀ЖF°тr╙─▐╨kр^3U╖4ыtцnP[Ц╞t9С┐QВ26;Г╕╪їTЪк/└6х┬Єў0тХ=пЇЩVrаzОI;l:Ж6м▒зAНитYp4АА╖йJ└╞Iы5и├пУХX╪;┌иXRбЇмД&Э+с лз_&5░·б2Хе`№!4щX?M4ыфkaїBe*J┴°Bi╥░~Ъi╫╚╓├ъД╩T>ХГЁД╙е`№!4╙пСнЗ╒ Фи}+с зJ┴°Biз_#[к)P·V┬NХГЁД╙N╛F╢T&RбЇмД&Э+с жЭ|Нl>и ╤ь╘и}+с зJ┴°BkzuЄr╓├ъД╩T>ХГЁД╙е`№!4╙пСнЗ╒ Фи}+с зJ┴°Biз_#[к)P·V┬NХГЁД╙N╛F╢T&RбЇмД&Э+с жЭ|Нl>иLеCщX?M:V┬M:∙╪}PЩJЗ╥░~ЪtмД&ЪuЄ5░·б2Хе`№!4щX?M4ыфkaїBe*J┴°Bi╥░~Ъi╫╚╓├ъД╩T>ХГЁД╙е`№!4╙пСнЗ╒ Фи}+с зJ┴°Biз_#[к)P·V┬NХГЁД╙N╛F╢T&RбЇмД&Э+с жЭ|Нl>иLеCщX?M:V┬M:∙╪}PЩJЗ╥░~ЪtмД&ЪuЄ5░·б2Хе`№!4щX?M4ыфkaїBe*J┴°Bi╥░~Ъi╫╚╓├ъД╩T>ХГЁД╙е`№!4╙пСнЗ╒ Фи}+с зJ┴°Biз_#[к)P·V┬NХГЁД╙N╛F╢T&RбЇмД&Э+с жЭ|Нl>иLеCщX?M:V┬M:∙╪}PЩJЗ╥░~ЪtмД&ЪuЄ5░·б2Хе`№!4щX?M4ыфkaїBe*J┴°Bi╥░~Ъi╫╚╓├ъД╩T>ХГЁД╙е`№!4╙пСнЗ╒ Фи}+с зJ┴°Biз_#[к)P·V┬NХГЁД╙N╛F╢T&RбЇмД&Э+с жЭ|Нl>иLеCщX?M:V┬M:∙╪}PЩJЗ╥░~ЪtмД&ЪuЄ5░·б2Хе`№!4щX?M4ыфkaїBe*J┴°Bi╥░~Ъi╫╚╓├ъД╩ЗNХГЁД╘/Лы╤є╙N╛F╢T>▄ g+°чMsИ|а┐╚х"эX╩┬ЭУхгЫ<ЯG|рр{qГН╦ФwЫЖ╙Vш&zЬ╚^ЧР╪lў─g8ъЎ╓╣╥7┐√╝┐■▒П┼M:∙╪}PЧg¤╣╩oха¤зkє¤чЎф ц\√F╗хЛ╩С2ї*сC3ZК█ йф,ма╕UяIъP ZрwЯ█У Щsэ╠─╟╦t╒MQxЫ┐I▐ф▒ /?%ф2╥9нKZА)└▀укИЧ{lўKPч╟РрNвЦЬ vэёК╗╣РsWЎ*Ghпг├▀N'Й╢н_┐e{\а│<ъjщn-A)J^I*'А╫╞▄\kєСЦ╡-╣Н█╔╬Е#J=АВВы╓{*╟#┤T;ФU╩i╡░д&DwC╠Х▓2=БI*Npqл8╚┌nу{ЩrГn╤х│Н╬gG:░ЭXуМ№b╝"яmrцв|uFmZVЁphI█b~Qє╘╠О╤LО╤WvvCЙw╢╧t╡|yъ)i└вn▀йФ╚э╚эcЄM╛╧ ╥█к╢сzf ╓`╢╦▓ж<Т░├%9JииАv▄юxUЦGhкK╧&у▌.,\RXLЦPZWФ0m╞ў8)$`Вr ёОbл█g┴г-■з╢∙DЗт╔qИЭУe!зG:▐─ГВм(6╥Ns╖^<┘╣N═∙т ┬ТжФ╔:9┤йH ╙я▓H╬р╓8╢pc╦ч├К№ХMЫzPЖ╥GвРмУТNTHЎWЮNЄi▐N)L╞╕!pЧеKaLoм %J ╒╢в2A░cНb3▐Ш├┤█№|еIх ═b<╕O▓▄Й"3OХ6дйg:vJКА8ы* ╛ZGЙtv▄лl┼╝╘Цуe%╝)nQМлБЯg^*фOУо-bKЄЦ▐\@з\:К░ъї╜╚▄Ё;▒&G#╠Ы╙╖7.#SУу╦K82sлм(oьс┘&qИ┬√╧¤▓╖╦8OЇaП[┬шЕк9BSяСЭH#9М√▌єЬEМгWvх0Оz$иъ-<╥┬CмТ6WX Н┴▄╙▌▓╦░╧фь6^Т√vя)YФ─м6ИP╒ХjW┌бYЭВ&╔D╓╫rЬ┤й┘+g╨┬vJBЖN▄s╓IсJ*оg▌╝Х╙DF▀╗°GфЬ┘s║вdХ╚1.oGmk Btу8vїUrп╖'∙y;/ZЭ[ёЇi¤j┌A*VJsАеi╪■слK%ТmЭ∙*U╔З┌Ч)╔/ F)V╡НЇЭg uД9─{─ РеИ╤а,йи├ЬV╟ЖKЫdфь▀pijЄ┴ЗЪo╔┤╒MєФPь*МЙ!J\е(6ТБшМТTв:╕ЭєSbKУв╝╘▐iЖ╡є╠s`є┘Oе┼8;э╞в^нO]WDШ╔iХ)KbLD╛ЗIВA▀БыоХ^█9S▐3|$█. ╕▓ыЛЕ"!m╥▐З╥V1щ  wт;*eUrv╚▀'эЖ$)р][Ыф%>ї ТBG╞w╔ыл\О╤VЫ█tк╫█ре2;E2;EVJS#┤S#┤P)LО╤LО╤AGuШ[║)Й'а2BШцBuHYR┬ТТнDММ·]yЭЛ╗гТёn╬DzKоFi╒3Фва3дgА╬xЁ&\i2ЭL─╡з!!┼qр╜^И;уВMИыЦ┼D╖JM╜└ЦЭCIPl6 ;pЎV-7Щt╜6И/▄БeЭ1РТфxю:АбСФдСЯf╒П)Еzfч?)╣ЭtЧ┬2ВЕ64дly├ЬчАсSж┼j| ▌Q ╚iM,дрАаA╟╧QгAТ'жdщН>уM-ж├,ЦА )*╬TмЯA8сН°їY╜╥&,АLш╥"╢nоH╕нMйшiцВ Аq@i VТOС╣82n."єYQШiшю:KмРPдёзИs¤=╗cЙk╗EJnё╘ йqхИd8ёeEdn8l6`cэт╞╗дЎ$є░КihKRбє├*)%^°oш>^▌│i│wж (F pnu╝9╠╬нцд┘ *Cщ`-'8йiQАs╡Lф▌╥e┘╣r$єIh:Я'BBТ┌ЫKЙ╘rrн.$p ёйZГЧ(я%l&1ЬМbЦ2Хщ╚╬pаСМp╧n┘ Bz$╣я;%╖S-ЁъRЦЇЦЁРМgQ╬╚Of∙э┘U╥fЩзўЪu)С┌)С┌+гСJdvКdvК 5▄жОH╔╜4т9╒░╣Ме─e(oРТщ;ЯHЬmБ^нх╬ШвЙё'┬BVЗО╔FЗFВСЭgP)Qс├Mйў92¤М╕Ц[TV▐)╓ 8┬N2=-у╥умЁрMjухrз0тy╡$╢─r╨ZОПI^Ъ▓@F░╫?кЁэ3Mе▐g9pцС╥╨ )+hР@WвqЮ╜П═╒н┘█║ кх&e├ЪL√|°йiJqш▐КР╝зJJu▒мч;√1╛xj}∙ёЬФы═y p'ЇeKt0╪BxчЕ{Нo}╙.\╘╚S--жp╓ВвТJ╬HR╜юG╖█─4HU·|зc-ЖФ╦,╢ей'Ь(SдР8XуГьй┌ы6▐╦:Г|РьK╞K ╨ы1]ZМщPI №тзdvКГ{Оф╦ ┬+)╫в║┌Р2вТ╔Ў╓зсК~bфй╦fzKкС4EBЬY:9┼$nOюНЗ■]┤Лt%И╬E~2ЦЕ8╧:чрзУ▓А;Ё╪у╠╓╝XдE ┴rSJiA╘е┬Аr╔V ╞q┐X°и`╔U┌$х╠hЖ#нЧ Смидй@ъЇwBp0zў▀i╜ЎkkoЄ°╒хзB╣ЗS╒│,щц▄'aНЄ;@lСЯ/▐▌╔ш [eHyд!╠г@JРнC9*nТ0p{Схл:Ы ┼T┤к▌HS1∙╝-:(y▌) c`}фЭєФAТЫ┤╣╚Ш╨╟C(l▓NВТвХл╥▌j╚└ъ▄cyїKыЧИ■I°╔\ХK@qЖСАегъЇИFч@т@м▒х"у╬in0р╦n ╡▓╝pыq`ю VM4╗M╛+╬F~E╜оiз^М┘N┴lЮ─зpA╚ь╚й╢°"╙╘╢ЖV▓KЕ╕меФУМa)╬┘└▄Ю=``MW▄Шж█7^v┌LЗФЄ█У!оq`аЗЦСЬ8$uWиr)░^_8Z╨єJ╟╫иЯhR■]╥ем№Zv5bЎВmy$▐эP▀Sn1Yu╘Е║ФССС╖─Ez~яmК╙.╚Яж▀NжФ╖ n;xПЮжdvКdvК╗│▓%╖rЖ╡┌зGY ╥ЭJN─В^▐║┼aУ.eЦ,╔о┤╖%4ЗАi▓АРдГзrsНў JЩ$<╢Ш╧6╙зVт5дo╛└МээкИ6I▒Е▒зюL=█Оm(МPеaе62нgйDЁъй7╝5┤│еsZх#L╜,8├ёЯZZKa)NХ┤┌I┬╘ ╚mЕ`║╦u7UGTйм4Ж┤∙ ъ╩КЦ▒бXJq░╧е╟e~▌trшЩ═▄тгЪCН╢ЕCR░Ей's╬ Я@o╖^▌ЩхAТgкdН0уН%з╠Ч *)╞Ь{їgПW VwXШ┘сЛ╠f-Pd]&EОЇЦ│·TД)ZAVУЭ╞OQ=UЭ{kР╫5ук3j╥╖ГГBN█ЄПЮ▓┬К╘с▓в[О╥ZAQ╔┬F~j╧С┌+qv'*K╜╢{еиsу╚p'QKN;v°┼WЙW╣╢оУ╖*!▒╬╟Иыd(ВЬзRїc< ╞v╧яUцGhкжэ│г4ШРюM3 ░┌ }N╢О└╜X╪l Iр3Эє&%иШx╕Зu╟х▐Ж╥Ц╕сп╤aH%K*╒А:▒╢sYD[М╪░Ч"s░^ ┤╖(9pДїи+`B╕q╧л╦╓√Й╣╜2=╞2B└JЇRсi8H!cbFN┘;gА─╛bOE∙7Ц ╡s<лЫ╫зЇЁу╛8T╢Є^-B╡Lц-▓&╬╕─/Т├ЄJRy╜Т Е(У╓ЪЧяmЮщj°Є ╘R╙БD▌╛1Yу0╠HнFa! 2А█i╬tд ┐░V\О╤ZИШff%^╫(,╧:ЖЪ║D[ЛPJRЧТJЙрїФ╖IрKj╥Й-├vBЭP╚i)ЙG goEG}87yвкo╓(ў╕ЛoDD>┤№бш┴╒еzr ЬГЭ╗+5f╢═S4цЛеMЗ"[н)ЫЛёBUй,емЬ`х@р о┐eA╖╜,YgJГй%┼─~^Р@ QHай*P#ўHл─┌№ХЧ█a╨╧6ЗZh╢н8(╬0рg┘Y#0╠HнFa! 2А█i╬tд ┐░U╢щ}мкфэ╤SЫq╡нч░вжЭZ╩6╪╕Б═йZ╡{╙├▄Ф╫(,╧:ЖЪ║D[ЛPJRЧТJЙрїцб0юП═ЄН\юм 8Q╘н^Ъ│щщ╞░╥ЬНъ╦#┤RЬ╓ZжЫьГ&ўjЖ·ШУqК╦и╞д-╘дММН╛"+╙ў{lVЩvD°э6·u4е╕X█q█─|ї3#┤S#┤U▌ЭР╤w╢╣ sQ>:г6н+x84$э▒?(∙щяmЮщj°Є ╘R╙БD▌╛1S2;E2;E76W╡╩ 3╬бжоСт╘ФефТвx╜zУ{╡C}LI╕┼e╘cRъRFFF▀;#┤S#┤SsщфЖ¤▐█ж]С>;M╛ЭM)n6▄vё=w╢╣ sQ>:г6н+x84$э▒?(∙ъfGhжGhжц╚q.Ў┘юЦб╧П!└ЭE-8@э█уНоPYЮu 5tИ╖аФе/$Х└ ъ├#┤S#┤Ssg ╙╪$▐эP▀Sn1Yu╘Е║ФССС╖─Ez~яmК╙.╚Яж▀NжФ╖ n;xПЮжdvКdvК√;╛╚h╗█\Ж╣иЯQЫVХ╝v╪ЯФ|ЇЙw╢╧t╡|yъ)i└вn▀йЩвЩвЫЫ+┌хЩчP╙WHЛqj JRЄIQ<▐╜I╜┌б╛ж$▄b▓ъ1й u)###oИКЭС┌)С┌)╣ЇЄC~яmК╙.╚Яж▀NжФ╖ n;xПЮИ╗█\Ж╣иЯQЫVХ╝v╪ЯФ|ї3#┤S#┤Ssd8Ч{lўKPч╟РрNвЦЬ vэёК╞╫(,╧:ЖЪ║D[ЛPJRЧТJЙрїaС┌)С┌)╣▓ Ы▌къbM╞+.гР╖RТ226°ИпO▌э▒Ze┘у┤█щ╘╥Црcm╟oє╘╠О╤LО╤M═Р╤w╢╣ sQ>:г6н+x84$э▒?(∙щяmЮщj°Є ╘R╙БD▌╛1S2;E2;E76W╡╩ 3╬бжоСт╘ФефТвx╜zУ{╡C}LI╕┼e╘cRъRFFF▀;#┤S#┤SsщфЖ¤▐█ж]С>;M╛ЭM)n6▄vё=w╢╣ sQ>:г6н+x84$э▒?(∙ъfGhжGhжц╩╓оЎ┘єв╡|y КZp(Бб[эёКс7Я█У Щsэ¤ёS Ъ~┬ыєїчЎф ц\√F╛|√╛з m=╣┐RyYs^ЄШ═=е-щчПGл5Щл=м╕╢─?ЁўW╚ ▀d fж│·╤^{╦╒hcш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔hAш[Ou├ЁўSбm=╫└O▌SйK╔h ╘ы iю╕~~ъt-з║с° √кu*▐R╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юзB┌{оАЯ║зRЧТ╨Г╨╢ЮыЗр'юи╜kю╪Ю~ъ╕иT╝ЦЕ|█e▒ИЬъmР╔JI┴e8>Р_P╖:▐х╔╪"─┬T╥∙╒CPiYъ рH█чЎ^rЖ╤o║BeW▀q┬ФФ5%╞rIH▀A∙}╜╡и╖eфЄюN├6+к┌─Х\▌цЧЮаuч;МmПh╩ЄZ-Иe█ў(У0А─h|╩P╪╜JwQДїЮ╝╩рЯ█У Щsэя|ЯЙ█ФмBem2Ш╨HKПн╙Т╖│щ(У еpK╧э╔ ╠╣ЎНEvч?╡▐L5-╒1)┼еA#*О╜Ё1С^У¤│XаCчo■tе┐=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP ╒╣є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]tє┘bї W])@є┘bї W]<ЎX╜╒╫JP<ЎX╜╒╫O=Ц/_їu╥Ф=Ц/_їu╙╧eЛ╫¤]tе╧eЛ╫¤]uЛ╧''¤y щ╫JPW▐┤√сЦЪ╣Ё┘$∙#ч3П}й*сОмqы█■ыy? {o╛?.ФаЫhхч&-*Ъ╛ЧЭ1╔╔i.K9 6TSН)O°╧╫)╣╝▄Лм╖┌Vж▄}kI╞2 Йе ┘ess/doc/ess-intro-graphs.tex0000664000175000017500000015146412423756516014446 0ustar eddedd\documentclass{article} \newif\ifMM\MMtrue \MMfalse \newif\ifdraft % During writing: a draft: %\drafttrue % FINAL: \draftfalse \ifMM\drafttrue\fi \ifdraft %% generate tableofcontents down to the \paragraph \setcounter{tocdepth}{5} \fi %1. introduction % a) a statistician's needs % b) statistical analysis packages supported by ESS %2. emacs % a) buffers % b) key sequences % c) modes % 1) font-lock % 2) shell/comint % 3) ange-ftp/EFS/tramp % 4) vc/pcl-cvs %3. ESS % a) interactive % 1) S family % 2) SAS % b) batch % 1) SAS % 2) BUGS % 3) S family %4. ESS as an open-source project % a) origins % 1)S-mode % 2)SAS-mode % b) unification % 1)ESS-mode % 2)Emacs/XEmacs % 3)Unix/Windows/Mac %5. conclusion % a) summary % b) what's next for ESS % ESS internet resources % a) home page % b) ess-help % c) anonymous cvs % References % \ifdraft \addtolength{\topmargin}{-1cm} \addtolength{\textheight}{+1cm} \else%FINAL: \renewcommand{\baselinestretch}{1.5} \fi \addtolength{\oddsidemargin}{-0.5in} \addtolength{\textheight}{0.2in} \addtolength{\textwidth}{1in} \ifMM\addtolength{\textheight}{2cm}\fi %%% \usepackage[authoryear,round]{natbib} %or (if you have an unshiny latex installation) %\newcommand{\citep}[1]{{\{\sf#1\}}} %%% \usepackage{alltt} %% Postscript fonts \usepackage{times} \usepackage{graphicx} %\DeclareGraphicsExtensions{.jpg,.pdf,.png,.mps,.ps} \DeclareGraphicsRule{.ps}{eps}{.ps.bb}{} \DeclareGraphicsRule{.ps.Z}{eps}{.ps.bb}{'/bin/zcat -c #1} %\graphicspath{{jcgs/}} %\usepackage{psfig} \ifx\pdfoutput\undefined %% Stuff wout hyperref \def\url#1{\stexttt{#1}} % To help fit in lines ?AJR: stextsf? \else %% Stuff with hyperref \usepackage{hyperref} %%\hypersetup{backref,colorlinks=true,pagebackref=true,hyperindex=true} \hypersetup{backref,colorlinks=false,pagebackref=true,hyperindex=true} \fi %%---End of package requiring ---------- Own Definitions ------------- \newcommand*{\regstrd}{$^{\mbox{\scriptsize{\textregistered}}}$} \newcommand*{\tm}{$^{\mbox{\scriptsize\sc tm}}$} \newcommand*{\SAS}{\textsc{SAS}} \newcommand*{\Splus}{\textsc{S-Plus}} \newcommand*{\XLispStat}{\textsc{XLispStat}} \newcommand*{\Stata}{\textsc{Stata}} \newcommand*{\Rgui}{\textsc{Rgui}} \newcommand*{\Perl}{\textsc{Perl}} \newcommand*{\Fortran}{\textsc{Fortran}} \newcommand*{\Scmt}[1]{\hbox{\qquad {\footnotesize \#\#} \textsl{#1}}} \newtheorem{defn}{Definition}[section] \newtheorem{ex}{Example}[section] \newcommand{\stexttt}[1]{{\small\texttt{#1}}} \newcommand{\ssf}[1]{{\small\sf{#1}}} \newcommand{\elcode}[1]{\\{\stexttt{\hspace*{2em} #1}}\\} \newcommand{\file}[1]{`\stexttt{#1}'} \newcommand{\US}{{\char'137}} % \tt _ \newcommand{\marpar}[1]{\marginpar{\raggedright#1}} \newenvironment{Salltt}{\small\begin{alltt}}{\end{alltt}} \newcommand{\emptyfig}{ \hspace*{42pt}\rule{324pt}{.25pt}\\ \hspace*{42pt}\rule{.25pt}{10pc} \rule{316pt}{.25pt} \rule{.25pt}{10pc}} \newcommand{\ESSfig}[1]{\centering{#1}} %% Use \begin{Comment} .. \end{Comment} for internal comments \ifdraft \newenvironment{Comment}{\begin{quote}\small\itshape }{\end{quote}} % \else %% this requires \usepackage{verbatim} \let\Comment=\comment \let\endComment=\endcomment \fi %%--------------------------------------------------------------- Start Text \title{Emacs Speaks Statistics (ESS): A multi-platform, multi-package intelligent environment for statistical analysis} %%For blinded submission: %\author{anonymous} %%For regular review: \author{A.J. Rossini \and Richard M. Heiberger \and Rodney A. Sparapani \and Martin M{\"a}chler \and Kurt Hornik \footnote{% %% A.J. Rossini is Research Assistant Professor in the Department of Biostatistics, University of Washington and Joint Assistant Member at the Fred Hutchinson Cancer Research Center, Seattle, WA, USA \url{mailto: rossini@u.washington.edu}; %% Richard M. Heiberger is Professor in the Department of Statistics at Temple University, Philadelphia, PA, USA \url{mailto: rmh@temple.edu}; %% Rodney A. Sparapani is Senior Biostatistician in the Center for Patient Care and Outcomes Research at the Medical College of Wisconsin, Milwaukee, WI, USA \url{mailto: rsparapa@mcw.edu}; %% Martin M{\"a}chler is Senior Scientist and Lecturer in the Seminar for Statistics, ETH Zurich, Zurich, Switzerland \url{mailto: maechler@stat.math.ethz.ch}; %% Kurt Hornik is Professor in the Institut f{\"u}r Statistik, Wirtschaftsuniversit{\"a}t Wien and the Institut f{\"u}r Wahrscheinlichkeitstheorie und Statistik, Technische Universit{\"a}t Wien, Vienna, Austria \url{mailto: Kurt.Hornik@R-project.org}}} %%\date{\today} \date{$ $Date: 2003/10/22 17:34:04 $ $\tiny Revision: 1.255$ $} \begin{document} %% To cite everything %%\nocite{*} \ifdraft \setcounter{page}{0} %%\newpage \tableofcontents \fi \maketitle \ifdraft{}%% large line skip -- not for draft \else%FINAL: \renewcommand{\baselinestretch}{1.5} %%- \baselineskip=2pc \fi \begin{abstract} Computer programming is an important component of statistics research and data analysis. This skill is necessary for using sophisticated statistical packages as well as for writing custom software for data analysis. Emacs Speaks Statistics (ESS) provides an intelligent and consistent interface between the user and software. ESS interfaces with SAS, S-PLUS, R, and other statistics packages under the Unix, Microsoft Windows, and Apple Mac operating systems. ESS extends the Emacs text editor and uses its many features to streamline the creation and use of statistical software. ESS understands the syntax for each data analysis language it works with and provides consistent display and editing features across packages. ESS assists in the interactive or batch execution by the statistics packages of statements written in their languages. Some statistics packages can be run as a subprocess of Emacs, allowing the user to work directly from the editor and thereby retain a consistent and constant look-and-feel. We discuss how ESS works and how it increases statistical programming efficiency. \end{abstract} \noindent Keywords: Data Analysis, Programming, S, \SAS, \Splus, R, \XLispStat, \Stata, BUGS, Open Source Software, Cross-platform User Interface. \section{Introduction} \label{sec:introduction} Most statistical research activities, particularly data analysis and communication, involve some form of computing. The computer user interface is thus placed in the central role of facilitating statistical tasks. While presentation of character and graphical information is the most visual component of a user interface, perhaps a more critical component is how the computer interprets user input. A familiar, well-understood set of input behaviors can provide large gains in efficiency. This paper introduces Emacs Speaks Statistics (ESS) \citep{ESS}, a software package which provides a common interface to a variety of statistical packages on the most common computing platforms. ESS is an interface to statistical packages that provides tools which facilitate both statistical software development and data analysis. ESS provides assistance with both writing and evaluation of analysis code for both interactive and batch statistical packages. ESS currently supports the S family of languages (including S \citep{BecRCW88,ChaJH92,ChaJ98}, \Splus\regstrd\ \citep{Splus}, and R \citep{ihak:gent:1996,R}; \SAS\regstrd\ \citep{SAS:8}; \Stata\ \citep{Stata:7.0}; \XLispStat\ \citep{Tier90} and its extensions Arc \citep{Cook:Weisberg:1999} and ViSta \citep{youn:fald:mcfa:1992}; BUGS \citep{BUGS}; and Omegahat \citep{DTLang:2000}. ESS can be extended to accommodate most statistical packages which provide either an interactive command-line or process batch files for instructions. We start by describing the Emacs text editor, the underlying platform on which ESS is built. Next, we discuss how ESS enhances a statistician's daily activities by presenting its features and showing how it facilitates statistical computing. We conclude with a short history of the development of ESS. % and conclude with future extensions and related work. \section{Emacs} \label{sec:emacs} Emacs is a mature, powerful, and extensible text editing system which is freely available, under the GNU General Public License (GPL), for a large number of platforms, including most Unix\regstrd distributions, Microsoft Windows\regstrd\ and Apple Mac\tm\ OS. There are two open-source implementations of Emacs: GNU Emacs \citep{GNU-Emacs} and XEmacs \citep{XEmacs}. Emacs shares many features with word processors, and some characteristics with operating systems, including many facilities which go beyond ordinary text editing. More important to our goals, Emacs can control and interact with other programs. \paragraph{Keyboard and Mouse Input.} When Emacs was originally written, character-based terminals were the most advanced method of computer access. Common Emacs commands were mapped to key sequences, creating keyboard shortcuts for convenience. Over the last decade, Emacs has been extended to use graphical windowing systems, such as X11\tm, Microsoft Windows, and Apple Mac OS, which allow additional forms of input, for example using a mouse, and which encourage multiple applications to share a single display. Presently, Emacs is more often used with a GUI, with commands bound to mouse actions, but having commands also associated with key sequences is an important ergonomic and time-saving feature. Emacs menus and toolbars on the display screen allow mouse access to frequently used actions and provide a graphical alternative when the user does not know or can not recall a key sequence; these are also subject to user-customization. \paragraph{Buffers give Emacs control.} Emacs buffers are the interface between the user and computer. They can be considered to be a collection of scratch pads that both the user and computer can read, write, and respond to. The user can simultaneously edit many files and control numerous programs by opening multiple buffers. With disk files, the working copy of the opened file is placed in an Emacs buffer where it can be viewed and edited either by the user or automatically by Emacs or another program under the control of Emacs. Emacs can save a backup of the contents to disk at specified intervals. Emacs presents buffer contents in ways which optimize reading and navigation activities. One example of program control is the embedding of the interactive operating system command line interpreter, called a shell, within Emacs. Variations on this theme are used to control programs such as statistical packages which take input from and provide output to the command-line. The resulting buffers provide a copy of the entire transcript of the interaction, which can be edited and searched while the program executes. \paragraph{Major and Minor Modes.} Emacs capabilities are extended by loading %% AJR: If we remove ``or byte-compiled'' we need to remove ``text'', %% since it is wrong. %% text %% or byte-compiled files containing commands and functions written in Emacs Lisp (elisp) \citep{RChassell1999}, which is a dialect of Lisp \citep{PGraham:1996}. Emacs commands can be called interactively by pressing a key sequence mapped to the command or by name. %% AJR: this is actually true for M-x long-command-not-bound-to-keys, %% but I'm not telling anyone this! % Rodney: I don't understand what the problem is with telling them. The most important extensions to Emacs take the form of modes, which provide specific enhancements to the editing behavior. Major modes provide a customized environment consisting of mapped key sequences and associated commands for performing tasks such as file editing, reading mail, or browsing disk directories. Only one major mode can be active for a given buffer at any time. Major modes also can be written to intelligently control other programs such as statistics packages. Major modes for file editing are often determined by the file type or extension, i.e. the characters at the end of the file name that follow a period like \stexttt{txt}, \stexttt{s}, or \stexttt{sas}. Examples of this kind of major mode are \stexttt{ESS[S]} and \stexttt{ESS[SAS]}. Major modes understand a file's syntax and grammar and therefore provide intelligent actions such as automatic indentation; navigation in units of characters, words, lines, sentences, paragraphs, function definitions, and pages; syntax-based fontification and colorization; and reformatting based on programmed conventions. Minor modes provide complementary services that that are applicable across major modes. Many minor modes can be active at once. For example, \stexttt{font-lock-mode} allows Emacs to highlight, with fonts or colors, the syntax of a programming language whose characteristics are described within a major mode like \stexttt{ESS[S]}. The \stexttt{overwrite-mode} determines whether typed characters replace the existing text or are inserted at the cursor. Minor modes can emulate the key sequences used by another editor such as \stexttt{vi}. In addition, they can be used to perform version control operations and many other operations which are nearly identical across file types. \paragraph{Network Support.} Emacs allows transparent access to remote files over a network. This means that the user views, edits, and saves files on a remote machine exactly as if they were on the local machine. Mechanisms for both open (\stexttt{ange-ftp} and \stexttt{EFS} use ftp) and secure (\stexttt{tramp} uses scp or ssh) access are available. Emacs can also monitor and control remote processes running in a shell buffer. \paragraph{Editing Extensions.} Most programming and documentation tasks consist of editing text. These tasks can be enhanced by contextual highlighting and recognition of special reserved words appropriate to the programming language in use. In addition, Emacs also supports folding, outlining, tags, and bookmarks, all of which assist with maneuvering around a file. Emacs shares many features with word processing programs and cooperates with markup-language document preparation systems such as \LaTeX, \textsc{html}, or \textsc{xml}. Tracking changes to a text file made by multiple users, potentially in different locations, is the job of source-code control programs. Emacs interacts with standard source-code control programs such as CVS, RCS, and SCCS through minor modes such as \stexttt{vc-mode}. These source-code control systems facilitate documenting and tracking edits and changes to a file. More importantly, they allow for branching and merging of versions so that material present in an older version of the file can be recovered and inserted into a newer version in a fairly easy manner. Comparison of files, two or three drafts of a paper for example, is simplified by \stexttt{ediff}. An example is shown in Figure \ref{f.ediff}. The lines that are similar are highlighted in the two buffers, one for each file, and the specific words that mismatch are highlighted in a contrasting color. \stexttt{ediff} has many tools for working with the differences in files and in entire directories. When combined with the patch utility or a source-code control system, it provides the user with the ability to insert, delete or modify only the differing portions of text files. \begin{figure}[tbp] \ESSfig{\includegraphics[angle=270,width=\textwidth]{ediff-sas}} %\url{http://software.biostat.washington.edu/ess/doc/figures/ediff-sas.gif} \caption{Ediff of two versions of a file.} \label{f.ediff} \end{figure} % Rodney: You can't just mention complex functionality like etags and % speedbar. We would need to introduce these packages. Since they % aren't critical to ESS at this time, let's ignore them. Emacs has many other important features. Emacs provides file-manager capabilities, such as \stexttt{dired} (discussed in Major and Minor Modes above) and \stexttt{speedbar}, both of which interface to the computer's directory structure. Emacs stores the complete history of commands issued in an editing session, allowing a flexible and fairly complete undo capability. More importantly, for modes which control processes, the process input history is stored for recall as well as for later editing for printing or re-use. Emacs also includes web browsers, mail/newsgroup readers, and spell checking. In addition to being an extremely powerful editor, Emacs also includes capabilities usually found in an operating system. Thus, it provides a strong foundation for constructing an integrated development environment focused on the needs of statisticians. Emacs' power, flexibility, portability, and extensibility make it a solid platform on which to construct a statistical analysis user interface. \section{ESS extends Emacs} \label{sec:ess-extends-emacs} Statistical programming is the writing of computer programs for data analysis and processing. These programs might be written in a computer language that requires a compiler, such as \Fortran\ or C. But, more likely, they are written in a statistical analysis language that only requires an interpreter such as R, \SAS, \Stata, or \XLispStat. General purpose languages such as \Fortran, C/C++, Java, and PERL have integrated development environments which facilitate writing and debugging code. ESS extends Emacs to provide an integrated development environment for statistical languages. It offers a single interface for a variety of statistical computing tasks including interactive data analysis and statistical programming. ESS is able to provide a functional and extensible interface which is uniform and consistent across multiple statistical packages. This is done by adding shortcuts and features for accelerated editing of files as well as by interacting with the particular statistical packages to provide, for example, control of input/output, assistance with evaluation, and specialized parsing of help files. ESS supports the S family (S, \Splus, and R) interactively. \SAS\ and BUGS are also well supported for batch processing. \Stata\ and \XLispStat\ (including ARC and ViSta) are supported through highlighting and process-interfacing. \subsection{Features and capabilities} \label{sec:ESS:features} \paragraph{Syntactic highlighting and indentation of source code.} The programmers task is eased when language constructs (such as reserved words, function calls, strings, and comments) are visually identifiable and when lines of code are automatically indented to a depth appropriate to their context (e.g., if--then clauses, loops). ESS provides both of these to the programmer by including a description of the syntax of each supported statistical language in the form used by \stexttt{font-lock-mode}. Figure \ref{f.font} shows an example of font-locking a complicated S statement. The top panel shows an \stexttt{if} statement with a long expression in the condition and a multi-line consequence. The keyword \stexttt{if} is shown in purple, the string \stexttt{"deltat"} in RosyBrown. The comments are in red. Everything else is in the standard font. The consequence is indented and the continuations of the consequence are further indented. The matching parentheses are shown in green. The cursor is indicated by a solid box. In the bottom panel, we replaced the matching parenthesis with an unbalanced bracket. Emacs immediately marks that with the paren-mismatch font, bright purple in this example. On a black and white terminal we would use bold, underline, italic, and reverse-video, rather than colors, to distinguish the fonts. % Figure \ref{f.font} shows a black-and-white example of font-locking a % complicated S statement. The top panel shows an \stexttt{if} % statement with a long expression in the condition and a multi-line % consequence. The keyword \stexttt{if} is shown in an underlined font, % the string \stexttt{"deltat"} in an italic underlined font. The % comments are in an italic font. Everything else is in the standard % font. The consequence is indented and the continuations of the % consequence are further indented. The matching parentheses are marked % by a bold foreground and a shaded background. The cursor is indicated % by a solid box. In the bottom panel we replaced the matching % parenthesis with an unbalanced bracket. Emacs immediately marks that % with the paren-mismatch font, bright purple on % a color terminal. The font selection and the indentation depth are automatically supplied by Emacs as the lines are typed. The user has several options for mapping of colors or fonts to each of the syntactic types. We selected % black-and-white font-mapping for display here. On a color terminal % we might use purple for the keywords, red for comments, green for matching parens, and inverse-video purple for mismatched parens. Emacs makes default choices of colors and ESS provides several other optional schemes. \begin{figure}[tbp]%h \ESSfig{% \includegraphics[angle=270,width=\textwidth]{font-cor-s} \includegraphics[angle=270,width=\textwidth]{font-incor-s}% } %\url{http://software.biostat.washington.edu/ess/doc/figures/font-cor-s.jpg} %\url{http://software.biostat.washington.edu/ess/doc/figures/font-incor-s.jpg} \caption{We illustrate here with fonts and colors appropriate for a color display. On a black and white terminal we would use bold, underline, italic, and reverse-video. On a color terminal we would use a selection of colors.} \label{f.font} \end{figure} Since S syntax is similar to that of C, ESS uses the Emacs tools for reformatting S code to match particular styles. Common C format styles, as well as locally customized styles, are defined by specifying the indentation level for nested statements, location of open-braces (at the end or at the beginning of a line), indentation offsets for if-then-else constructs, and similar characteristics. Syntax highlighting can be used to help enforce coding standards. Figure \ref{f.hilock} illustrates a standard for \SAS\ programming that says all \stexttt{PROC} statements must use the \stexttt{DATA=datasetname} option. \begin{figure}[tbp] \ESSfig{\includegraphics[angle=270,width=\textwidth]{hilock-sas}} %\url{http://software.biostat.washington.edu/ess/doc/figures/hilock-sas.gif} \caption{Enforce coding standards. The standard here is that all \stexttt{PROC} statements must use the \stexttt{DATA=datasetname} option. Lines that satisfy the standard turn green, lines that don't turn red. Ambiguous ones turn yellow.} \label{f.hilock} \end{figure} \paragraph{Process interaction.} Emacs has historically referred to processes under its control as ``inferior'', accounting for the name inferior ESS (\stexttt{iESS}) to denote the mode for interfacing with the statistical package. Figure \ref{f.ess-demo} shows the S language program \stexttt{ess-demo.s} in the top buffer in \stexttt{ESS[S]} mode and the executing R process in the bottom buffer \stexttt{*R*}. The \stexttt{iESS} major mode of the \stexttt{*R*} buffer is crafted for command-line editing. This mode remembers and uses the command history, allowing for the recall and searching of previously entered commands. Filename completion for local directories is also available. \begin{figure}[tb] \ESSfig{\includegraphics[angle=270,width=\textwidth]{ess-demo}} %\url{http://software.biostat.washington.edu/ess/doc/figures/ess-demo.jpg} \caption{Line-by-line execution of a command file. The cursor is placed on a line in the \stexttt{ESS[S]} buffer and then with a single key sequence the line is sent to the \stexttt{*R*} buffer for execution. The output of the package goes directly to the editable \stexttt{*R*} buffer.} \label{f.ess-demo} \end{figure} \paragraph{Source-level Debugging.} ESS facilitates the editing of source code files, sets of commands written for a statistical analysis package, and allows the user to load and error-check small sections of source code into the package. This is done through several mechanisms. First, the presence of unbalanced parentheses or mismatched/unterminated quotes is immediately evident with syntactic highlighting of the source code. Second, functions are provided for simple and consistent execution of user-specified or natural units of the code (function definitions in S or \XLispStat, \stexttt{PROC \dots\ RUN;} sections in \SAS). An error-free evaluation lets the user execute the next section of code; if errors arise, the user edits the current unit and re-evaluates. Once the code is verified, an entire buffer, or file, of code can be sent to the package as a unit. This file can also be used as a batch file for routine analysis at a later time. Finally, output from the statistics package is normally captured directly by Emacs and placed into a buffer from where it can be edited and searched. Particular forms of output such as requests for help pages and log-file output can be diverted into special buffers with modes crafted to facilitate reading. These modes include tools for automatically placing the cursor on the first \stexttt{ERROR}, for example in \SAS\ and S. \paragraph{Interactive transcripts.} A transcript records all commands entered by the analyst and the corresponding text-based responses such as tables and comments generated by the statistics package during an interactive statistical analysis session. Once a transcript file is generated, for example by saving an \stexttt{iESS} buffer, \stexttt{transcript-mode} assists with reuse of part or all of the entered commands. ESS understands the transcript's syntax, especially the potential prompt patterns used during the interactive analysis. ESS provides tools to facilitate editing and re-evaluating the commands directly from the saved transcript. This is useful both for demonstration of techniques and for reconstruction and auditing of data analyses. Special ESS functions can ``clean'' S language transcripts by isolating all input lines and placing them in a new S language source file. Transcript cleaning facilitates the use of an exploratory interactive analysis session to construct functions and batch files for routine analysis of similar data sets. \paragraph{Remote access to statistics packages.} ESS provides transparent facilities for editing files and running programs which might reside on numerous remote machines during the same session. The remote machine could be a different platform than the local machine. \paragraph{Manipulating and Editing Objects (S family).} For languages in the S family, ESS provides object-name completion of both user- and system-defined functions and data. ESS can dump and save objects (user- and system-generated) into formatted text files, and reload them (possibly after editing). \paragraph{Help File Editing (R).} ESS provides an R documentation mode (\stexttt{Rd-mode}) which assists in writing help files for R functions, objects, and other topics worth documenting. \stexttt{Rd-mode} provides the ability to view and execute code embedded in the help file in the same manner as ESS handles code from any S language source file. It provides syntax highlighting and the ability to submit code directly to a running ESS process, either R or \Splus, for evaluation and debugging. This latter feature is useful for ensuring that code developed using R runs under \Splus. \paragraph{Cooperation across Multiple Tools.} Statistical packages are intended for either general statistical analyses or for specialized forms of statistical analyses. The specialized statistical packages can be far more efficient for their intended activities, but this is balanced by their inability to perform a wide range of general statistical functions. Tightly coupled inter-operability between general and specialized packages rarely exists, but such a facility is often desired. For example, a general purpose package such as R does not perform Bayesian analyses as easily as BUGS does. On the other hand, BUGS lacks breadth in the range of analyses and results it can generate. For this reason, BUGS is often distributed with R packages, like the diagnostic packages CODA and BOA, which assist with importing and analyzing the results in R. Another point of contention is the difference in the interfaces between general packages and specialized packages. ESS helps by providing a single point of contact to both tools, though the typical interfaces (interactive for R, batch for BUGS) are different. %\item[Rodney:] I can't speak for everyone, but the BUGS users I know are % .. lots deleted by AJR %will make sense. Besides, the most pressing need for me is to get %ESS-elsewhere to work with ESS[BUGS] rather than creating inferior-BUGS. %\item[Rich:] How does making ``ESS-elsewhere work with ESS[BUGS]'' differ %from ``creating inferior-BUGS''? My question is predicated on the assumption %that ESS-elsewhere is a (generalized) minor-mode that makes the location %of the program irrelevant. %See my ESS-elsewhere quibble below. %\item[Rodney:] It's the whole batch BUGS vs. interactive BUGS thing. Batch %BUGS with ESS-elsewhere; interactive BUGS with inferior-BUGS which does not %and will never exist. If you want to call ``inferior-ESS'' ``ESS-elsewhere'' %why do you need two different names? ``inferior-ESS'' is a terrible name %so the change would be fine with me, but you can't have it both ways? Is %this why you keep saying that ESS-elsewhere works for SAS? See %response to quibble below. %\item[Rich:] %\stexttt{iESS[SAS]} was designed to mimic as well as possible \stexttt{iESS[S]}. %I need to read doc/README.SAS to make sure all of its options are represented %here. --- Not yet done. %\end{description} %\end{Comment} \paragraph{Simplifying Keymap Differences.} Simple conflicts between interfaces are exemplified by different key sequences for editing tasks such as cut, copy, paste, beginning of line, end of line, etc. These may be the most aggravating because our fingers are typing ``instinctively'', but differences in interfaces circumvent this learned behavior. ESS solves this problem by providing a uniform interface to keyboard actions across the variety of statistical packages that might be used. That is, the same key sequences are used for cursor movement, evaluation, and basic tasks such as loading files for editing. \paragraph{Concurrent Use of Multiple Machines and Operating Systems.} It can be useful to have multiple statistical processes running simultaneously, either on a single machine or a variety of machines. This capability assists with large-scale numerical simulations as well as code design and testing across multiple versions of statistical software packages. \subsection{Interactive Processing.} \label{sec:interactive} The increased popularity of exploratory data analysis as well as the advent of simple GUIs has made interactive data analysis an important component to statistical practices. ESS uses three different approaches for communicating with statistical packages. \paragraph{Inter-Process Communication.} Packages that use the command-line interface are run as an inferior process in an Emacs buffer, with the standard input and output of the package redirected to the buffer. Packages that do not use the command-line interface must be run as an independent process, possibly with limited cooperation. ESS can use the Windows DDE (Dynamic Data Exchange) protocol to provide one-way communication directly to packages which function as a DDE server. ESS can control the actions of the package, but it can not capture the results directly. Transcripts must be physically copied to an Emacs buffer to get the transcript editing features. Statistical packages that use neither the standard input/standard output protocol nor DDE can not be directly controlled by Emacs. But, ESS can still provide an editing environment for these statistical languages. The user must either manually cut and paste the edited code into the package or save the edited files and run them in a batch environment. The Microsoft Windows versions of \SAS, \Stata, and \XLispStat\ are in this category. One useful extension in ESS is relaxation of the requirement that the statistics program be available on the local machine. ESS provides both transparent editing of files and execution of statistics packages on a remote machine with \stexttt{iESS[S]} or \stexttt{iESS[SAS]} (see below). All the editing and interaction features described for the local machine work equally well on the remote machine. The interaction, including all the unique features of working with ESS, appears to the user as if the program were running on the local %rmh: The interaction ... appears .... machine. If the X11 Windowing system is running on the local machine, it is even possible to bring up visual displays and graphics from remote Unix systems onto a local Microsoft Windows or Apple Mac display. \paragraph{Interactive S family} ESS for S family statistical languages, \stexttt{iESS[S]}, replaces the \Splus\ Commands window or the R GUI window. In addition to running the S family language process, \stexttt{iESS[S]} mode provides the same editing features, including syntactic highlighting and string-search, as the editing mode \stexttt{ESS[S]}. It also provides an interactive history mechanism; transcript recording and editing; and the ability to re-submit the contents of a multi-line command to the executing process with a single keystroke. \stexttt{iESS[S]} is used with S, \Splus, and R on Unix and with Sqpe and R on Windows. The \Splus\ GUI on Windows can be a DDE server. There are two advantages to using even this limited communication with the \Splus\ GUI through ESS. First, through \stexttt{ESS[S]} mode the user gets the full editing capabilities of Emacs. Second, S language commands % rmh: S, not \Splus, in both places. The {\it language} is S. % The previous session could be R or ATT S. It is not restricted to \Splus. are sent from the editing mode \stexttt{ESS[S]} buffer and from transcript buffers from previous S sessions directly to the GUI Commands window with the same Emacs key sequences as are used with ESS on Unix. Hence the user can work in a powerful editing environment and is protected from the delay and ergonomic challenges of using the mouse for copy and paste operations across windows. \paragraph{Interactive \SAS.} \stexttt{iESS[SAS]} is a mode that allows text-based \stexttt{PROC} by \stexttt{PROC} interaction with an inferior buffer running an interactive \SAS\ session on either the local or a remote computer. \stexttt{iESS[SAS]} mode works by redirecting standard input and output from \SAS\ to ESS. Currently, the \stexttt{iESS[SAS]} mode can run on any computer, but the \SAS\ process it is controlling must be running on a Unix machine. This process is very efficient for dial-up network connections to a remote computer with \SAS\ installed. The resulting interface is similar to the SAS character terminal interface, but with Emacs key sequences. %Rodney: What is this paragraph about? I'm going to comment it out %because I don't recognize what it is supposed to be. Maybe somebody %can fix it later. % % rmh: Round umpteen. Yes, this is redundant with the third paragraph % of interprocess communication. I still want it here. Try this rephrasing. % \stexttt{ESS[SAS]} mode can be used in conjunction with the \SAS\ Display Manager to allow simultaneous access to Emacs for editing \SAS\ language code and to the \SAS\ mouse-based interfaces to the graphical routines and help system. %%%%% AJR: WHY IS THIS SUBSTANTIALLY DIFFERENT THAN BATCH? I KNOW ITS %%%%% SLIGHTLY DIFFERENT, BUT SUBSTANTIALLY? %%%%% rmh: this is a form of interaction, not batch. I restored the %%%%% first paragraph with some expansion. %\paragraph{\SAS---Interactive cooperation with the \SAS\ Display Manager.} %ESS users who write data analysis code in \stexttt{ESS[SAS]} mode in Emacs %often need to work with the \SAS\ Display Manager's %mouse-based interface to the graphical %routines, the help system, and other non-text-based features. %%The authors of ESS prefer the Emacs environment for %%the text-file interaction with \SAS, that is with editing and %%managing input command files and output listing and log files, %%even on computer systems which run %%the \SAS\ Display Manager environment. %In this situation, the user %designs the command file in \stexttt{ESS[SAS]} mode and highlights %regions to be forwarded to \SAS\ for processing. %% %% Rodney: I don't see this as a feature of either ESS or emacs. And, %% what the authors prefer is certainly not germane. %% %% %% rmh: This is my preferred mode for interacting with SAS. I tried another %% rephrasing. It {\it is} a feature of ESS. ESS is able to provide ESS[SAS] %% mode for the text processing (.sas .lst. log files) and simultaneously %% let the user have interactive graphical access. %%This can be done by either: %%\begin{enumerate} %%\item copying and pasting the marked regions to the \SAS\ Editor window %% and then pressing the \stexttt{RUN} button. Highlighted sections of %% the \SAS\ Listing window are brought back to Emacs to be read in the %% \stexttt{ESSlst} mode editing environment. %%\item submitting the marked region for Batch File Processing (see the %% next section) but using the mapped key sequences to append to the log %% and listing files instead of replacing them. %%\end{enumerate} \subsection{Batch File Processing.} \label{sec:batch-file} Batch file processing with statistical analysis packages is a better choice than interactive processing when the execution times are longer than the user is willing to wait as well as for regularly updated statistical reports and figures. ESS provides a means to shorten the debugging cycle for writing code intended for batch evaluation by containing the whole process, both writing and evaluation, within Emacs. \paragraph{Batch \SAS.} \label{sec:sas-batch} \SAS\ is a popular choice for processing and analyzing large amounts of data. However, interactive \SAS\ is rarely used in these situations due to the length of time involved. Instead, a file containing \SAS\ commands is created and \SAS\ executes these commands in the background, or batch, while the user moves on to other activities. ESS facilitates \SAS\ batch with \stexttt{ESS[SAS]}, the mode for files with the \stexttt{sas} extension. ESS defines \SAS\ syntax so that \stexttt{font-lock-mode} can highlight statements, procedures, functions, macros, datasets, comments and character string literals in \SAS\ programs. Optionally, the same language features are highlighted in the \SAS\ log with the addition of log notes, warnings and error messages. For files with the \stexttt{sas} extension, ESS binds the function keys in \stexttt{ESS[SAS]} mode to match the definitions used by \SAS\ Display Manager. These definitions are optionally available in all modes. They are particularly useful when viewing \SAS\ log and listing files (with extensions of \stexttt{log} and \stexttt{lst} respectively). Only one function key press is needed to submit a \SAS\ batch process. Other function keys open the \SAS\ program, the \SAS\ log and the \SAS\ listing buffers. When accessed in this manner, the \SAS\ log and \SAS\ listing buffers are automatically updated since they may have been appended or over-written by the \SAS\ batch process. In addition, the \SAS\ log is searched for error messages and the error messages, if any, are sequentially displayed with consecutive key presses. Another function key opens a \SAS\ permanent dataset for editing or viewing. An option is provided so that the tab and return keys operate in typewriter fashion like they do in \SAS\ Display Manager. This option also defines a key to move the cursor to a previous tab-stop and delete any characters between its present position and the tab-stop. This is a \SAS\ Display Manager feature that is not typically available in Emacs. The \SAS\ batch process runs on the computer where the \SAS\ program resides. This is important because any \SAS\ permanent datasets referenced in a \SAS\ program only exist on the computer running \SAS. If the \SAS\ program resides on a remote computer, then the log and listing are also accessed remotely. The net result is that running \SAS\ batch on remote computers is nearly transparent to the ESS user. %\begin{Comment} %Rich's version: %\end{Comment} %The \SAS\ batch process can run on the same computer on which the %emacs session is running or it can run on a remote computer. For %remote jobs, files are transparently saved (with ftp or scp or kermit) %and the batch process is transparently submitted through a telnet or %ssh connection. %\begin{Comment} %Rich: I have some terminology quibbles here with how the term %``ESS-elsewhere'' is used with SAS BATCH. I think of S-elsewhere or %ESS-elsewhere as a trick to make a \stexttt{telnet-mode} buffer think %it is \stexttt{iESS-mode} buffer. %I don't think of file saving, editing, and retrieval as an example %of ESS-elsewhere. Neither is submission of the remote job; %that is just an ordinary shell command in an ordinary shell buffer. %M-x SAS probably is an example of ESS-elsewhere, but I %designed it before I thought of the ESS-elsewhere concept. %The initial idea behind S-elsewhere was to run an interactive S or S-Plus %session on a remote computer in telnet (or equivalent) buffer. The trick %was to make the \stexttt{telnet-mode} buffer accept C-c C-n and %related commands from the \stexttt{S-mode} buffers. Hence I had to %make the \stexttt{telnet-mode} buffer think it is \stexttt{iESS-mode} %buffer. The ``elsewhere'' part of the name is entirely related to a %different start up procedure. Once the connection is made, there is %{\em no} difference visible to the user. The buffer shows itself to %be an ordinary \stexttt{iESS} buffer. Tony generalized S-elsewhere %to ESS-elsewhere to allow other languages than S to be used %interactively. %I have been using ESS for SAS remote BATCH for years, ever since you %and I started working on this together. We initially defined %ess-sas-submit-method to encapsulate the location of the sas process. %Except for a few lines of elisp to get the connection started, the user %behavior has been identical whether the SAS process is on the same or %different machine. Since we are not interactively talking to the SAS %process in an inferior-ESS buffer I don't see this as ESS-elsewhere. %Rodney: Remote submissions of SAS batch jobs never worked. I only got %it to work a couple of weeks ago. The problem was with the cd command. %You need to ignore the beginning and end of the expanded buffer name %that are the ange-ftp/EFS/tramp stubs which tell Emacs what the remote %username and hostname are. I find the batch usage of ESS-elsewhere %entirely consistent with the interactive behavior. OTOH, I don't find %the terminology particularly illuminating. I think ESS-remote or %ESS-net would be more meaningful. %\end{Comment} \paragraph{Batch BUGS.} BUGS software performs Markov Chain Monte Carlo integration. There is an interactive capability, but it is not often used since the analyses can be very time-consuming. Most BUGS programs are executed as batch processes. ESS facilitates BUGS batch with \stexttt{ESS[BUGS]}, the mode for files with the \stexttt{bug} extension. ESS provides 4 features. First, BUGS syntax is described to allow for proper fontification of statements, distributions, functions, commands and comments in BUGS model files, command files and log files. Second, ESS creates templates for the command file from the model file so that a BUGS batch process can be defined by a single file. Third, ESS provides a BUGS batch script that allows ESS to set BUGS batch parameters. Finally, key sequences are defined to create a command file and submit a BUGS batch process. \paragraph{Batch S family.} ESS provides 2 facilities for batch processing of S family language files. The first is to execute the contents of a file using buffer-evaluation. This differs from interactive processing only by the number of commands being evaluated; errors can be found by examining the resulting transcript. The second is the load-source mechanism, which provides a means of jumping to errors in the source file, but doesn't display the evaluated commands in the transcript. These mechanisms provide different tools for debugging the source files. \section{History of ESS} \label{sec:ESS:history} ESS is built on Emacs, the editing system for which Richard Stallman won a MacArthur Foundation Fellowship in 1990. Emacs has a long history of being a programmer's editor. Many statisticians got their first taste of the power of Emacs with \Fortran\ mode which was introduced in 1986. As statisticians' preferences changed from generalist compiled languages such as \Fortran\ to specialist statistical analysis packages like S and \SAS, Emacs modes soon followed. The ESS environment is built on the open-source projects of many contributors, dating back over 10 years. Doug Bates and Ed Kademan wrote S-mode in 1989 to edit S and \Splus\ files in GNU Emacs. Frank Ritter and Mike Meyer added features, creating version 2. Meyer and David Smith made further contributions, creating version 3. For version 4, David Smith provided significant enhancements to allow for powerful process interaction. John Sall wrote GNU Emacs macros for \SAS\ source code around 1990. Tom Cook added functions to submit jobs, review listing and log files, and produce basic views of a dataset, thus creating a SAS-mode which was distributed in 1994. In 1994, A.J. Rossini extended S-mode to support XEmacs. Together with extensions written by Martin M{\"a}chler, this became version 4.7 and supported S, \Splus, and R. In 1995, Rossini extended SAS-mode to work with XEmacs. In 1997, Rossini merged S-mode and SAS-mode into a single Emacs package for statistical programming; the product of this marriage was called ESS version 5. Richard M. Heiberger designed the inferior mode for interactive \SAS\ and SAS-mode was further integrated into ESS. Thomas Lumley's Stata mode, written around 1996, was also folded into ESS. More changes were made to support additional statistical languages, particularly \XLispStat. ESS initially worked only with Unix statistics packages that used standard-input and standard-output for both the command-line interface and batch processing. ESS could not communicate with statistical packages that did not use this protocol. This changed in 1998 when Brian Ripley demonstrated use of the Windows Dynamic Data Exchange (DDE) protocol with ESS. Heiberger then used DDE to provide interactive interfaces for Windows versions of \Splus. In 1999, Rodney A. Sparapani and Heiberger implemented \SAS\ batch for ESS, which relies on files rather than standard-input/standard-output, on Unix, Windows and Mac. In 2001, Sparapani added BUGS batch file processing to ESS for Unix and Windows. This history is summarized in Table \ref{tab:timeline}. \begin{table}[tbp] \centering {\scriptsize \begin{tabular}{c ll c ll} \hline Year \\ \hline & \multicolumn{2}{c}{S-mode} && \multicolumn{2}{c}{SAS-mode} \\ \cline{2-3} \cline{5-6} 1989 & v.1 & (GNU Emacs, Unix, S/S+) && \\ 1990 & & && & (GNU Emacs, Unix, SAS editing) \\ 1991 & v.2 & (GNU Emacs, Unix, S/S+) && \\ 1993 & v.3 & (GNU Emacs, Unix, S/S+) && \\ 1994 & v.4 & (GNU Emacs/XEmacs, Unix, S/S+) && v.1 & (GNU Emacs, Unix, SAS batch) \\ 1995 & v.4.7 & (GNU Emacs/XEmacs, Unix, S/S+/R) && v.2 & (GNU Emacs/XEmacs, Unix, SAS batch) \\ \cline{2-6}\\[-3.5ex] \cline{2-6} & \multicolumn{5}{c}{Emacs Speaks Statistics (ESS)} \\ \cline{2-6} &\multicolumn{2}{c}{Emacs, Operating Systems} &&\multicolumn{2}{c}{Additional Functionality}\\ \cline{2-3} \cline{5-6} 1997 & v.5.0 & (GNU Emacs/XEmacs, Unix) &&& Stata, XLispStat, SAS interactive \\ 1998 & v.5.1.1 & (GNU Emacs/XEmacs, Unix/Windows) &&& S+elsewhere; Windows: S+/R\\ 1999 & v.5.1.10 & (GNU Emacs/XEmacs, Unix/Windows/Mac) &&& SAS batch; Omegahat \\ 2001 & v.5.1.19 & (GNU Emacs/XEmacs, Unix/Windows/Mac) &&& Unix/DOS: BUGS batch; Mac: R \\ %% 2002 & v.5.1.20 & (Emacs/XEmacs, Unix/Windows/Mac) &&& Unix/DOS: BUGS batch, Mac: R \\ %% 2002 & v.5.2 & (Emacs/XEmacs, Unix/Windows/Mac) &&& ? \\ \hline \end{tabular} } \caption{History and Ancestors of ESS} \label{tab:timeline} \end{table} %\section{Future Work} %%%There are two active areas of extensions for user environments. One %%%is to enhance the capabilities of the IDE for statistical practice; %%%this includes implementing such common IDE features as object %%%browsers, tool-tips, and interfacing cleaning. The other is to target %%%appropriate potentially useful programming methodologies for transfer %%%to statistical practice. %%% %%%Literate Programming methodologies \citep{Knuth:1992,NRamsey:1994} are %%%a natural fit for statistical practice. We refer to the application %%%to statistical analysis as Literate Statistical Practice %%%\citep{rossini:dsc:2001}. The tools used are Noweb %%%\citep{NRamsey:1994} and either \LaTeX, \textsc{html}, or \textsc{xml} %%%for documenting and explaining the analysis. This approach to %%%programming encourages the use of a literary documentation style to %%%explain the programming code for the data analysis. The program can %%%then be extracted from the documentation text for realizing the %%%statistical analysis. %%future enhancement perhaps %%ESS provides the same ESS-elsewhere support for BUGS batch %%that it does for \SAS\ batch (see above). %Important extensions which should be implemented in future %versions include class browsers, analysis templates, tool-tips, and %similar features. Class browsers can be thought of as a tree or %outline for presenting datasets, variables and functions in the %context of what they represent; this allows for rapid and appropriate %inspection. Analysis templates would allow statistics centers and %groups to provide standardized templates for initiating an analysis. %Additional statistical packages can easily be added to ESS. %%While most IDE features have been developed for object-oriented %%languages, the above also can apply to non-object oriented %%programming. %ESS is one of the first Rapid Application Development (RAD) %environments intended for statisticians. It provides \section{Conclusion} \label{sec:concl} ESS provides an enhanced, powerful interface for efficient interactive data analysis and statistical programming. It allows the user complete control over the communications among the files in which the analysis is specified, the statistical process doing the computation, and the output. Because all are within the same programming environment, and therefore are accessed with the same editing and searching concepts and the same key sequences, user efficiency is increased. It is completely customizable to satisfy individual desires for interface styles and can be extended to support other statistical languages and data analysis packages. %\begin{Comment} %Rich: see my discussion of ESS-elsewhere terminology. %What is the behavior for remote SAS that is new for 2002? %Rodney: SAS batch now works and Kermit was added as a method of transfer. %\end{Comment} %ESS-elsewhere provides interactive and batch processing %with \SAS\ running on a remote machine that is accessed over a %network. This provides a powerful development environment for \SAS. %%This %%includes support for syntax highlighting and template-based source file %%generation that provides the capability of specifying all the necessary %%parameters for a BUGS batch run in a single file. \bibliographystyle{plainnat} \pdfbookmark[1]{References}{section.7} %\addcontentsline {toc}{section}{\numberline {}References} \bibliography{ess-intro-graphs} \clearpage \appendix \section{Appendix: ESS Resources on the Internet} %\addcontentsline {toc}{section}{\numberline {}ESS Resources on the Internet} \label{sec:access} \paragraph{Latest Version.} ESS is constantly in flux. New versions of statistical packages, Emacs and operating systems require new releases of ESS to support them. The latest stable version of ESS can be found on the web at \url{http://software.biostat.washington.edu/statsoft/ess/}. To get help with problems, send e-mail to \url{mailto: ess-help@stat.math.ethz.ch}. The latest development, hence unstable, version can be obtained by anonymous CVS. First type: \stexttt{cvs -d :pserver:anoncvs@software.biostat.washington.edu:/var/anoncvs login} You will be prompted for a password which is ``\stexttt{anoncvs}''. Then type: \stexttt{cvs -d :pserver:anoncvs@software.biostat.washington.edu:/var/anoncvs co ess} \paragraph{Additional documentation.} An expanded version of the present paper is in \citep{RMHHS:2001}. A general introduction and usage instructions can be found in \citep{heiberger:dsc:2001}; in addition, one which is more focused on \SAS\ can be found in \citep{heiberger:philasugi:2001}. The documentation that comes with ESS provides details of its implementation as well as examples of its use. \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: ess/doc/inst_svn.texi0000664000175000017500000000337612423756516013253 0ustar eddedd @c There no longer is an anonymous CVS repository for ESS, due to lack of @c interest, little demand, and problems with security. @c text below modified from R-admin.texi (thanks to Kurt for the tip). The latest development version of ESS is available via @uref{https://svn.R-project.org/ESS/}, the ESS Subversion repository. If you have a Subversion client (see @uref{http://subversion.tigris.org/}), you can download the sources using: @smallexample % svn checkout https://svn.r-project.org/ESS/trunk @var{path} @end smallexample @noindent which will put the ESS files into directory @var{path}. Later, within that directory, `svn update' will bring that directory up to date. Windows-based tools such as TortoiseSVN are also available for downloading the files. Alternatively, you can browse the sources with a web browser at: @uref{https://svn.r-project.org/ESS/trunk, ESS SVN site}. However, please use a subversion client instead to minimize the load when retrieving. If you remove other versions of ESS from your emacs load-path, you can then use the development version by adding the following to .emacs: @example (load "/path/to/ess-svn/lisp/ess-site.el") @end example Note that https is required, and that the SSL certificate for the Subversion server of the R project is @smallexample Certificate information: - General name: r-project.org - Serial number: 04:9D:4F:0D:53:03:DB - Valid: from 03/10/2014 to 03/10/2016 - Issuer: Starfield Secure Certificate Authority - G2 http://certs.starfieldtech.com/repository/ - SHA1-Fingerprint: F5:15:96:DB:F1:2F:35:1B:96:06:C3:A4:2A:E2:80:78:76:4C:A4:30 - MD5-Fingerprint: D8:7D:4F:8F:ED:92:65:EE:EE:A5:73:2D:BB:F6:35:E6 @end smallexample @noindent @c The above *is* trusted. The R-Project paid for it. ess/doc/mailing.texi0000664000175000017500000000120112423756516013011 0ustar eddedd There is a mailing list for discussions and announcements relating to ESS. Join the list by sending an e-mail with "subscribe ess-help" (or "help") in the body to @email{ess-help-request@@stat.math.ethz.ch}; contributions to the list may be mailed to @email{ess-help@@stat.math.ethz.ch}. Rest assured, this is a fairly low-volume mailing list. The purposes of the mailing list include @itemize @item helping users of ESS to get along with it. @item discussing aspects of using ESS on Emacs and XEmacs. @item suggestions for improvements. @item announcements of new releases of ESS. @item posting small patches to ESS. @end itemize ess/doc/newfeat.texi0000664000175000017500000011776412601651046013036 0ustar eddedd@comment @itemize @w{} @comment @item Changes and New Features in 15.09: @itemize @bullet @item @ESS{[R]}: The indentation logic has been refactored. It should be faster, more consistent and more flexible. There are three types of indentation settings, those starting with @code{ess-offset-} give the actual offsets, those starting with @code{ess-indent-} are control (commonly Boolean) variables, and those starting with @code{ess-align-} are vertical alignment overrides which inhibit default offsets in specific situations. See @code{ess-style-alist} for detailed description of the new indentation system and provided default indentation styles. @item @ESS{[R]}: Deprecation of old indentation settings. As a consequence of the indentation re-factoring @code{ess-brace-imaginary-offset}, @code{ess-expression-offset} and all delimiter-specific offsets are deprecated. The settings for indentation of continued statements have been replaced by @code{ess-offset-continuations}. It can be set to either @code{cascade} or @code{straight} (the default). @code{ess-arg-function-offset} has been replaced by @code{ess-indent-from-lhs} and has been generalised to assignements. This setting now works with both statement blocks and expressions and only takes effect for offsets set to @code{prev-call} and @code{open-delim} in order to produce a consistent indentation. @item @ESS{}: A test framework has been set up. @item @ESS{[R]}: A new RStudio style is provided to mimic as closely as possible R files indented via RStudio. To reproduce the setup of some of the RStudio users, the RStudio- style with @code{ess-offset-arguments} set to @code{prev-line} is also provided. In addition, the new RRR+ style is equivalent to RRR except it indents blocks in function calls relatively to the opening delimiter. This style does not try to save horizontal space and produces more indentation. @item @ESS{[R]}: Roxygen fields will now be indented on paragraph refilling in order to make the documentation more readable. You can also refill commented lines in the @code{examples} field without squashing the surrounding code in the comments. @item @ESS{[R]}: ESS can now format your code! This is controlled through the settings @code{ess-fill-calls} and @code{ess-fill-continuations}. When activated, @code{(fill-paragraph)} formats your calls and your formulas/continuations while making sure they don't go past @code{fill-column}. Repeated refills cycle through different styles (see the docstrings for more details). By default, the refilled region blinks. Set @code{ess-blink-filling} to nil to prevent this. @item @ESS{[R]}: Fix occasional missing error location fontification in inferior buffers. @item @ESS{[R]}: ess-developer now correctly assigned the environment of new functions to the package namespace. @item @ESS{[Julia]}: ?[topic] now works in the *julia* buffer. Note that support for editing Julia code now depends on @file{julia-mode.el} from the Julia project. If you install ESS from the official tarball/zip file, @file{julia-mode.el} is already included. Otherwise, if you install ESS by running @code{make}, then the latest version of @file{julia-mode.el} is downloaded (and so you need an active internet connection to install) during the installation process. Alternatively, if you run ESS without running @code{make}, then ensure that you have the @code{julia-mode.el}, which you can get easily from MELPA for example. @item @iESS{}: For naming inferior processes, ESS can use @code{projectile}'s project root and it does so when @code{ess-gen-proc-buffer-name-function} is set to @code{ess-gen-proc-buffer-name:projectile-or-simple} as by default, or to another value beginning with @code{ess-gen-proc-buffer-name:projectile-*}. @end itemize Changes and New Features in 15.03-1: @itemize @bullet @item @ESS{[R]}: An indentation bug has been fixed (github issue 163) @item @ESS{[R]}: On windows, if `ess-prefer-higher-bit' is non-nil (the default), then R-newest will try to run a 64 bit (rather than 32 bit) version of R. @end itemize Changes and New Features in 15.03: @itemize @bullet @item @ESS{[R]}: Full native support for `company-mode`. @item @ESS{[R]}: More efficient caching algorithm for R completion. @item @ESS{}: New offset variable `ess-close-paren-offset` to control the indentation of the closing parentheses. @item @ESS{[R]}: Ask for CRAN mirror only once per emacs session. @item @ESS{[R]}: Detect @code{library} and @code{require} calls for better completion caching. @item Buffer display is now customizable (@code{ess-show-buffer-action}). @item Use @code{y-or-n-p} instead of @code{yes-or-no-p} throughout. @item More support for ODS in ess-sas-graph-view. @item Makefiles are now both UNIX and GNU friendly. @item @ESS{[R]}: Simplify directory lookup in @code{ess-developer} (#137). @item Make closed paren indentation consistent @end itemize Bug Fixes in 15.03: @itemize @bullet @item Fix open brace indentation bug (#27 in ess/R-ESS-bugs.R). @item Fix git version lookup @item Don't check directory modtime in R dialect. @item Declare all ess macros for edebug. @item Add @code{ess-smart-comma} to eldoc message functions. @item Inform users when retrieving RDA aliases. @item Line ending in '~' is also a continuation line. @item Filing roxy paragraphs works as expected now. @item In @code{ess-developer-add-package}, remove incorrect `wait` argument from @code{ess-get-words-from-vector} call. @item Fix #96, #117, #120, #125, #134, #137. @item Fix ess-quit-r. Call base::q() even if it is masked. @item Fix `ess-show-buffer` to always display the buffer in another window. @item Makefile: Fix cd bug for directories with spaces in them @item @code{ess-kill-buffer-and-go} modified to not restart R @end itemize Changes / Selected Bug Fixes in 14.09: @itemize @bullet @item @ESS{[Julia]}: Executable is changed to @code{julia}. @item @ESS{[Julia]}: Completion and help system was adjusted to Julia v.0.3.0. Julia v.0.2.x is no more supported. @item @ESS{[R]}: Running R with @code{gdb} debugger now works as expected @item @iESS{}: Inferior ESS buffers are now derived from @code{comint-mode} @item @ESS{[R]}: @code{ess-execute-screen-options} uses correct screen width in terminal sessions @item @ESS{}: @code{ess-build-tags-for-directory} works when no TAGS file name was provided @item @ESS{}: @code{ess-offset-statement-continued} is now respected everywhere except inside of the @code{if} test condition. @item @ESS{}: New variable @code{ess-offset-statement-first-continued} for indentation of the first line in multiline statements. @item @ESS{R}: Starting @kbd{,} in multiline statements indentation is now ignored to achieve a more pleasant alignment. @item @ESS{R}: Improved behavior of @kbd{RET} in roxygen blocks. @item @ESS{[R]}: command cleaning with @kbd{C-u C-u C-y} was broken with lines containing " + " @item @ESS{[R]}: fixed "empty watch window bug" @item @ESS{[R]}: don't ask for help location on ac-quick-help (request of github #81) @item @ESS{[R]}: "importClassesFrom" and "importMethodsFrom" were added to the list of two-parameter roxygen commands @item @ESS{[R]}: fix vignetes display and hyperlinks (were broken in 13.09-1) @item @ESS{[Julia]}: recognize function names ending with ! @item @ESS{[Julia]}: fix indentation of "for" comprehension syntax within brackets. @end itemize Changes / Selected Bug Fixes in 13.09-1: @itemize @bullet @item ess-remote and TRAMP: R support code is now downloaded in binary form instead of being injected from local machine. The R code is stored in @code{~/.config/ESSR/} directory on the remote machine @item TRAMP: PAGER environment variable is now correctly set to @code{inferior-ess-pager} @item retrieval of help topics on remote machines is fixed @item org-babel: source references of R code executed from org files correctly point to source references in original org files (version 8.2.1 or higher of org-mode is required for this feature) @item @code{ess-execute} is now bound to @kbd{C-c C-e C-e} in @code{ess-extra-map}. @item completion works again in @code{ess-execute} @item @ESS{[R]}: @code{head} and @code{tail} methods were replaced by @code{htsummary} in @code{ess-R-describe-object-at-point-commands} @item @ESS{[roxygen]}: evaluation commands now work in roxygen blocks. Leading comments are automatically removed before the evaluation @item @ESS{[transcript]}: 'Clean Region' now works with multiline statements; @code{ess-transcript-clean-region} etc. correctly treat multiline statements, i.e., no longer forgets the lines typically preceded by '+' @item @ESS{[SAS]}: Three features/fixes with special thanks to Matthew Fidler @uref{https://github.com/emacs-ess/ESS/pulls/mlf176f2, https://github.com/emacs-ess/ESS/pulls/mlf176f2}. Turn on SAS log mode when appropriate. Indent comments and CARDS statement more appropriately. @item @ESS{[SAS]}: @code{ess-sas-edit-keys-toggle} default returns to @code{nil} @item @ESS{[R]}: support for @code{prettify-symbols-mode}: contribution from Rudiger Sonderfeld @uref{https://github.com/emacs-ess/ESS/pull/65} @item @ESS{[SWV]}: knitr now evaluates in the current frame @item @ESS{[developer]}: ess-developer doesn't kill open DESCRIPTION files anymore @item @ESS{[roxygen]}: @code{ess-roxy-preview-HTML} is now on @kbd{C-c C-o C-w} and @code{ess-roxy-preview-text} is now on @code{C-c C-o C-t} @item @ESS{}: installation with @code{make install} was simplified and should work out of the box on most *nix systems @item @ESS{} installation instructions simplified @item fixed font-lock bug introduced in 13.09 that was causing very slow process output @end itemize Changes/New Features in 13.09: @itemize @bullet @item font-lock in process buffers doesn't "spill" over prompts. Missing closing string delimiters should not cause wrong fontification of the following command input. @item @ESS{[julia]}: full features M-TAB completion and auto-complete support, which now works for modules, structures and data types. @item @ESS{[julia]}: a much better eldoc showing arguments of methods and data type constructors @item ESS-developer: @itemize @minus @item ESS-developer work-flow pattern has been streamlined: ESS-developer is now automatically activated on per-file basis if the file is part of a developed package @code{ess-developer-packages}. The old behavior (activation on per-process basis) is still available on @code{M-x ess-developer} in a process buffer. @item integration with @code{devtools} package. New command @code{ess-developer-load-package} calls @code{load_all} on the package containing current file. @code{ess-developer-add-package} now offers IDO menu completions with available loading methods, currently @code{library}, and @code{load_all}. Loading command can be customized with @code{ess-developer-load-on-add-commands}. @end itemize @item @kbd{TAB} now indents region if region is active (a contribution of Matthew Fidler in pull #41) @item @code{M-x ess-version} now reports full loading path and recognizes git and ELPA versions. @item warning and error keyword are now highlighted with @code{font-lock-warning-face} as they should be, (for quite some time these keywords have been hijacked by compilation mode fontification). @item eldoc: Eldoc now recognizes multiple processes. If current process is busy, or current buffer is not associated with a process, eldoc picks its completions from the first available free process. @item org-babel: evaluation is now org-friendly @item help: new help buffers now try to reuse ess-help buffers. This behavior is controlled by @code{ess-help-reuse-window} custom variable. @item help: ?foo pops IDO menu on multiple help files (so far it worked only for @kbd{C-c C-v}) @item remote evaluation is considerably faster now on slow connections @item @ESS{[R]} tracebug R source references regular expressions are (mostly) language agnostic. @item @code{ess-function-call-face} inherits from @code{font-lock-function-name-face} rather than @code{font-lock-builtin-face}. @item @code{ess-inject-source} now accepts @code{function-and-buffer} option. @item Documentation: The ``New Features'' section (and @file{NEWS}) now represent recent changes: within the last year or so. All changes can be found in the new @uref{news.html, news.html} (or @file{NEWS} and @file{ONEWS}). @item @ESS{[R]} @code{ess-rep-regexp} should no longer inf.loop (rarely!), and hence @code{M-x ess-fix-miscellaneous} should neither. @end itemize Changes/New Features in 13.05: @itemize @bullet @item @ESS{[gretl]}: Support for @code{gretl} (both editing and sub-process interaction). A contribution of Ahmadou Dicko. @item @ESS{}: process output display is 4-10 times faster due to new caching and only occasional emacs re-display (for the moment this functionality is available only when @code{ess-tracebug} is active). @item @ESS{}: @kbd{C-c `} is now bound to @code{ess-show-traceback} and @kbd{C-c ~} is bound to @code{ess-show-call-stack}. @item @ESS{[R]}: ESS stores function in 'ESSR' environment to avoid kludging users' global environment and accidental deletion. @item @ESS{[R]}: new variable @code{ess-swv-processing-command} to control weaving and tangling. @item @ESS{[R]}: @code{ess-default-style} has been changed (from @code{DEFAULT}) to @code{RRR}. Use something like @code{(setq ess-default-style 'DEFAULT)} or @code{(setq ess-indent-level 2)} in your @file{~/.emacs} equivalent @emph{before} loading ESS, if you do not like this new ``incompatible'' default style. @item @ESS{[julia]}: ESS stores its functions in 'ESS' module. @item @ESS{[julia]}: Eldoc is now supported in julia modes @item @ESS{[julia]}: Adjusted error reference detection and interactive help to julia internal changes @item @ESS{[R]}: @code{ess-use-tracebug}'s default has been changed to @code{t}. Set it to nil if you want to keep the previous behavior. @item @ESS{[tracebug]}: Electric debug keys have been removed [breaking change] The functionality was replaced with @code{ess-debug-minor-mode} and @code{ess-debug-minor-mode-map}. @item @ESS{[tracebug]}: @code{ess-tracebug-map} is an alias to @code{ess-dev-map} @kbd{C-c C-t}. @item @ESS{[tracebug]}: @code{ess-bp-toggle-state} (@kbd{C-c C-t o}) can now be used during the debug session to toggle breakpoints on the fly (suggestion by Ross Boylan). @item @ESS{[tracebug]}: @code{ess-debug-flag-for-debugging} and @code{ess-debug-unflag-for-debugging} work correctly from the debugging contexts. These commands also recognize non-exported functions for the packages listed in @code{ess-developer-packages} (@kbd{C-c C-t C-a}). @item @ESS{[R]}: Eldoc (activated by @code{ess-use-eldoc}) has become more sophisticated, and hence also more intruding in the interface between the Statistics softare, e.g., @R{}, and the user. Note that you can turn off ElDoc, by placing @code{(setq ess-use-eldoc nil)} in your @file{~/.emacs} file, prior to loading ESS, @item @ESS{[SAS]}: long over-looked @code{SAS-mode-hook} appears! @item @ESS{[SAS]}: @code{ess-sas-edit-keys-toggle} now defaults to @code{t} since @code{sas-indent-line} is still broken, i.e. @kbd{TAB} is now bound to @code{ess-sas-tab-to-tab-stop} by default @end itemize Changes/Bug Fixes in 12.09-2: @itemize @bullet @item @ESS{}: new @code{ess-switch-to-end-of-proc-buffer} variable that controls whether @kbd{C-c C-z} switches to the end of process buffer. The default is @code{t}. You can use prefix argument to @kbd{C-c C-z} to toggle this variable. @item @ESS{}: fix in @code{ess-eval-linewise} that was causing emacs to hang during R debugging with @code{ess-eval-visibly} equal to @code{t}. @item @ESS{}: fix in @code{ess-eval-linewise} that was causing emacs to recenter the prompt in visible window @item @ESS{[tracebug]}: A better handling of ``Selection'' prompts and debug related singlekey commands. @item @ESS{}: fix a bug in @code{ess-switch-process} that was causing @code{*new*} selection to fail. @item @ESS{[R]}: Solve missing @code{ess-local-process-name} bug in R-dired. @item @ESS{[SWV]}: @code{ess-swv-PDF} doesn't ask for a command to run if there is only one command in @code{ess-swv-pdflatex-commands}. @item @ESS{[SWV]}: @code{ess-swv-weave} gained an universal argument to allow for an interactive choice between available weavers (sweave, knitr). @item @ESS{}: @code{ess-eval-*-and-step} functions go to next empty line at eob, instead of staying at the last line. @end itemize Changes/New Features in 12.09-1: @itemize @bullet @item @ESS{} @emph{Breaking Changes in Keys}: @itemize @minus @item New keymaps: @code{ess-doc-map} bound to @kbd{C-c C-d}; @code{ess-extra-map} bound to @kbd{C-c C-e}; @code{ess-dump-object-into-edit-buffer} was moved on @kbd{C-c C-e C-d} @item roxygen map was moved on @kbd{C-c C-o} and @kbd{ess-roxy-update-entry} now resides on @kbd{C-c C-o C-o} @item ess-handy-commands is not bound anymore @item @code{ess-dev-map} (including @code{ess-tracebug} and @code{ess-developer}) moved on @kbd{C-c C-t} @item @code{C-c C-y} is deprecated in favor of @code{C-c C-z C-z} @end itemize @item @ESS{[R]} new command @code{ess-describe-object-at-point} bound to @kbd{C-c C-d C-e} (repeat @kbd{C-e} or @kbd{e} to cycle). It was inspired by Erik Iverson's @code{ess-R-object-tooltip}. Customize @code{ess-describe-at-point-method} to use tooltip instead of an electric buffer. @item @ESS{}: New command @code{ess-build-tags-for-directory} bound to @kbd{C-c C-e C-t} for building dialect specific tag tables. After building tags use @kbd{M-.} to navigate to function and objects definitions. By default @kbd{C-c C-e C-t} builds tags based on imenu regular expressions and also include other common languages @code{.c, .o, .cpp} etc. But it relies on external @code{find} and @code{etags} commands. If @code{ess-build-tags-command} is defined (for @code{R}), the inferior process is asked to build tags instead. @item @ESS{}: @code{ess-switch-process} offers @code{*new*} alternative to start a new process instead of switching to one of the currently running processes. @item @ESS{}: Switching between processes (@kbd{C-c C-s}) uses buffer names instead of the internal process names. Use @code{M-x rename-buffer} command to conveniently rename your process buffers. @item @ESS{}: Process buffers can be automatically named on process creation according to user specified scheme. Default schemes are *proc*, *proc:dir* and *proc:abbr-long-dir* where @code{proc} stands for the internal process name and @code{dir} stands for the directory where the process was started in. The default is *proc*. For customization see @code{ess-gen-proc-buffer-name-function}. @item @ESS{}: @code{ess-eval-visibly-p} is deprecated in favor of @code{ess-eval-visibly}. @item @ESS{}: New evaluation pattern @code{nowait}. In addition to old @code{nil} and @code{t} values, @code{ess-eval-visibly} accepts @code{nowait} for a visible evaluation with no waiting for the process. See @code{ess-eval-visibly} for details on evaluation patterns. @item @ESS{}: New ``Process'' menu entry with process related commands and configuration @item @iESS{}: Process buffer is now automatically shown on errors @item @ESS{}: New @code{ess-switch-to-inferior-or-script-buffer} command bound to @kbd{C-c C-z} in both script and process buffers. If invoked form process buffer it switches to the most recent buffer of the same dialect. It is a single key command. @item @ESS{R-help}: On multiple help pages with the same name, @kbd{C-c C-v} now asks for user resolution directly in emacs. @item @ESS{[R]} ess-roxy: new variable @code{ess-roxy-re} for fontification of cases where the number of leading @kbd{#} differs from @code{ess-roxy-str}. @item @ESS{[R]} Eldoc was considerably enhanced. It now finds hidden default S3 methods and displays non-default methods' arguments after trailing ||. @item @ESS{[R]}: New @code{ess-display-demos} command bound to @kbd{C-c C-d o} and @kbd{C-c C-d C-o} @item @ESS{}: New @code{ess-help-web-search} command bound to @kbd{C-c C-d w} and @kbd{C-c C-d C-w} to facilitate interactive search of web resources. Implemented for @code{R}, @code{Stata} and @code{Julia}. See also @code{ess-help-web-search-command}. @item @ESS{}: ess-pdf-viewer-pref accepts now command line arguments @item @ESS{[Rnw]}: Add knitr support. Customize @code{ess-swv-processor} for the default processor. @item @ESS{[Rnw]}: More thorough renaming of remaining @code{noweb-*} to @code{ess-noweb-*}. @item @ESS{[Rnw]} new commands @code{ess-eval-chunk-and-step} and @code{ess-eval-chunk} bound to @kbd{M-n C-c} and @kbd{M-n C-M-x} to mirror standard ess commands in C-c map. @item @ESS{[R]} Auto-completion: new variable @code{ess-ac-R-argument-suffix} to customize the insertion of trailing "=". Defaults to `` = ``. @item @ESS{[Julia]}: Added index, apropos and web-search to julia. @item @ESS{} help: More evaluation commands were added to ess-help mode (@kbd{C-c C-c}, @kbd{C-M-x} etc) @end itemize Bug Fixes in 12.09-1: @itemize @bullet @item @iESS{help}: Multiple help pages with the same name are properly handled on @kbd{C-c C-v} @item @iESS{remote}: Evaluation with ESS remote no longer freezes emacs. @item @iESS{}: @code{comint-previous-prompt} @kbd{C-c C-p} no longer stops on secondary prompt ``+''. @item @iESS{[R]}, @iESS{(Sqpe) [S]} on Windows: The @code{options("editor")} is now initialized to @code{emacsclient} instead of the previous @code{gnuclient}. The user may need to add the line @code{(server-start)} to the emacs initialization file. @code{emacsclient} has been included with emacs since GNU Emacs 22.1. @item @ESS{[Rnw]} Fixed ``connection to R'' bug (in 12.09 only). @item @ESS{[Rnw]} Explicit @code{ess-swv-stangle} and @code{ess-swv-sweave} functions. @item @ESS{[Rnw]} Fixed completion and smart underscore problems cause by unmatched ``\''' @item @ESS{[R]} is more careful with the @code{R} code injection. It now happens only once at the start of the session. @item @ESS{[R]}: Fixed auto-scrolling the comint buffer on evaluation. @item @ESS{[Julia]}: Solve several indentation and word navigation problems. @item @ESS{[Julia]}: Help system works again. @end itemize Changes/New Features in 12.09: @itemize @bullet @item @b{Due to XEmacs lacking some features that ESS requires, ESS support of XEmacs ends with ESS 12.04-4. This decision will be re-visited in the future as XEmacs continues to sync with GNU Emacs.} @item @ESS{[R]}: On Windows, there is now a new customizable variable (currently called @code{ess-directory-containing-R}) to tell ESS where to look for the @file{Rterm.exe} executables. The name of the variable and the values it can take are both in beta and subject to change. Prior to this variable, ESS searched only in the default installation directory. Setting this variable now tells ESS how to find @file{Rterm.exe} executables when they are installed somewhere else. @item @ESS{[julia]}: @emph{new} mode for editing julia code (@file{*.jl}). Start with @code{M-x julia}. Full interaction interface, imenu and basic error referencing are available. @item @ESS{[R]} noweb: @code{noweb-mode} and @code{noweb-font-lock-mode} have been renamed to @code{ess-noweb-mode} and @code{ess-noweb-font-lock-mode} to avoid conflicts with the ``real'' @code{noweb-mode}. @item @ESS{[R]} noweb: The long standing font-lock bug has been solved in @code{ess-noweb} interface. @item @ESS{}: Basic evaluation keys are now bound to @code{ess-eval-region-*-} functions: @itemize @minus @item @kbd{C-M-x} is bound to @code{ess-eval-region-or-function-or-paragraph} @item @kbd{C-c C-c} is bound to @code{ess-eval-region-or-function-or-paragraph-and-step} @item @kbd{C-RET} is bound to @code{ess-eval-region-or-line-and-step} @end itemize Each of these functions first evaluates the region whenever the region is active. @item @ESS{}: @kbd{C-M-a}/@kbd{C-M-e} now step to beginning/end of paragraph if no function has been detected. @item @ESS{}: @code{ess-eval-*-and-step} family of functions are now smarter, and don't step to end of buffer or end of chunk code (@code{@@}) when at the end of the code. @item @ESS{}: @code{ess-handy-commands} function is bound to @kbd{C-c h} @item @ESS{}: ESS is now @emph{blinking} the evaluated region. Set @code{ess-blink-region} to nil to deactivate; @code{ess-blink-delay} gives the duration of the blink. Evaluated region is ``blinked'' in @code{highlight} face. @item @ESS{[R-help]} New key @kbd{a} for ``apropos()'' in help buffers. Also available through @kbd{C-c h}. @item @ESS{[R-help]} All R commands of type foo?bar and foo??bar are recognized and redirected into appropriate *ESS-help* buffers. @item @ESS{[R]}: New customization interface for @emph{font-lock}. ESS font-lock operates with predefined keywords. Default keywords are listed in @code{ess-R-font-lock-keywords} and @code{inferior-R-font-lock-keywords}, which see. The user can easily customize those by adding new keywords. These variables can also be interactively accessed and saved through @kbd{ESS/Font-lock} submenu. Several new fontification keywords have been added. Most notably the keywords for highlighting of function calls, numbers and operators. @item @ESS{[R]}: auto-complete is now activated by default whenever auto-complete package is detected. Set @code{ess-use-auto-complete} to nil to deactivate. @item @ESS{[R]}: R AC sources are no longer auto-starting at 0 characters but at the default @code{ac-auto-start} characters. @item @ESS{} no longer redefines default ac-sources, but only appends @code{ac-source-filename} to it. @item @ESS{}: @code{ac-source-R} now concatenates `` = `` to function arguments. @item @ESS{}: Menus for ESS and iESS have been reorganized and enriched with @emph{Tracebug} and @emph{Developer} submenus. @item @ESS{[R]}: @code{ess-developer} and @code{ess-tracebug} commands are available by default in @code{ess-dev-map} which is bound to @kbd{C-c d} in ESS and iESS maps. @item @ESS{[R]}: @code{eldoc} truncates long lines whenever @code{eldoc-echo-area-use-multiline-p} is non-nil (the default). Set this variable to t if you insist on multiline eldoc. See also @code{ess-eldoc-abbreviation-style}. @item @ESS{[R]}: completion code pre-caches arguments of heavy generics such as @code{plot} and @code{print} to eliminated the undesirable delay on first request. @item @iESS{}: Prompts in inferior buffers are now highlighted uniformly with @code{comint-highlight-prompt} face. @item @ESS{[R]}: R process no longer wait for the completion of input in inferior buffer. Thus, long running commands like @code{Sys.sleep(5)} no longer stall emacs. @item @ESS{}: [R, S, Stata, Julia] have specialized @code{ess-X-post-run-hook}s, which are run at the end of subprocess initialization. @item @ESS{[Stata]}: All interactive evaluation commands work as expected. On-line comments are removed before the evaluation and multiline comments are skipped on @kbd{C-c C-c} and other interactive commands. @item @ESS{} no longer auto-connects to a subprocess with a different dialect than the current buffer's one. @item @ESS{}: @code{ess-arg-function-offset-new-line} is now a list for all the ESS indentation styles, which results in the following indentation after an open ``('': @verbatim a <- some.function(other.function( arg1, arg2) @end verbatim @item @ESS{[SAS]}: Improved MS RTF support for GNU Emacs; try @code{ess-sas-rtf-portrait} and @code{ess-sas-rtf-landscape}. @end itemize Changes/Bug Fixes in 12.04-3: @itemize @bullet @item @ESS{}: basic support for package.el compatibility @item @ESS{[R]}: correct indentation of & and | continuation lines @item @code{M-x ess-version} shows the svn revision even after @code{make install} @item @ESS{[SAS]}: improved XEmacs support @item @iESS{[R]}: better finding of previous prompt @item @ESS{[Stata]}: adjusted prompt for mata mode @item @ESS{[R]}: resolved name clashes with cl.el @item @ESS{[R]}: removed dependence on obsolete package assoc @item New @code{make} target @code{lisp}, to build the lisp-only part, i.e., not building the docs. @end itemize Changes/New Features in 12.04-1: @itemize @bullet @item @iESS{[Stata]}: New interactive help invocation. @item @iESS{[Stata]}: New custom variable @code{inferior-STA-start-file}. @item @iESS{[Stata]}: @code{inferior-STA-program-name} is now ``stata'' and can be customized. @item @ESS{[Stata]} New sections in stata help files Syntax(@kbd{s-S}), Remarks(@kbd{r}), Title(@kbd{t}). @end itemize Bug Fixes in 12.04-1: @itemize @bullet @item @ESS{[R]}: Better @code{ess-tracebug} error handling. @item @ESS{[R]}: Corrected @code{ess-eldoc} help string filtering and improved argument caching. @item @ESS{[R]}: Indentation of non-block if/else/for/while lines fixed. @item @code{M-x ess-version} should work better. @item @ESS{}: Filename completion now again works inside strings. @item @iESS{[Stata]}: Fixed prompt detection issue. @item @ESS{[Rd]}: R is autostarted also from here, when needed. @end itemize Changes/New Features in 12.04: @itemize @bullet @item @ESS{}: Reverting new behavior of 12.03, @kbd{TAB} in @code{ess-mode} no longer completes by default. If you want smart @kbd{TAB} completion in R and S scripts, similarly to @iESS{} behavior, set the variable @code{ess-tab-complete-in-script} to @code{t}. Also see @code{ess-first-tab-never-complete} for how to customize where first @kbd{TAB} is allowed to complete. @item @ESS{}: completion is consistently bound to @kbd{M-TAB} (aka @kbd{M-C-i}) in both Emacs23 and Emacs24. @item @ESS{}: The variable @code{ess-arg-function-offset-new-line} introduced in @ESS{(12.03)} now accepts a list with the first element a number to indicate that the offset should be computed from the indent of the previous line. For example setting it to '(2) results in: @verbatim a <- some.function( arg1, arg2) @end verbatim @end itemize Changes/New Features in 12.03: @itemize @bullet @item @ESS{} indentation: new offset variable @code{ess-arg-function-offset-new-line} controlling for the indentation of lines immediately following open '('. This is useful to shift backwards function arguments after a long function call expression: @verbatim a <- some.function( arg1, arg2) @end verbatim instead of the old @verbatim a <- some.function( arg1, arg2) @end verbatim If '(' is not followed by new line the behavior is unchanged: @verbatim a <- some.function(arg1, arg2) @end verbatim This variable should be set as part of indentation style lists, or in ess-mode hook. @item @ESS{[R]}: @kbd{C-c .} sets (indentation) style. @item @ESS{}: In ESS buffers @code{yank}(@kbd{C-y}) command accepts double argument @kbd{C-u C-u} to paste commands only. It deletes any lines not beginning with a prompt, and then removes the prompt from those lines that remain. Useful to paste code from emails, documentation, inferior ESS buffers or transcript files. @item Documentation: ESS user manual has been rearranged and completed with several new chapters and sections to reflect newly added features (``Completion'', ``Developing with ESS'', ``ESS tracebug'', ``ESS developer'', ``ESS ElDoc'', ``IDO Completion'' and ``Evaluating Code'') @item RefCard: Reference card was updated to include new features. @item Eldoc: Eldoc was rewritten and is activated by default. See @code{ess-use-eldoc}, @code{ess-eldoc-show-on-symbol}, @code{ess-eldoc-abbreviation-style} variables for how to change the default behavior. @emph{Note:} @code{skeleton-pair-insert-maybe} prohibits eldoc display, on @kbd{(} insertion. @item @ESS{[R]}: Eldoc shows arguments of a generic function whenever found. @item @ESS{}: @kbd{TAB} in @code{ess-mode} now indents and completes, if there is nothing to indent. Set @code{ess-first-tab-never-completes-p} to @code{t} to make @kbd{TAB} never complete on first invocation. Completion mechanism is similar to the completion in the @code{inferior-ess-mode} -- a filename expansion is tried, if not found ESS completes the symbol by querying the process. @item @ESS{} for emacs version 24 or higher: ESS is fully compatible with the emacs 24 completion scheme, i.e. all the completion is done by @code{completion-at-point}. Also in accordance with emacs conventions, ESS doesn't bind @kbd{M-TAB} for emacs 24 or higher. @kbd{M-TAB} calls the default @code{complete-symbol}. @item @ESS{[R]}: Out of the box integration with @code{Auto Completion} mode @uref{http://cx4a.org/software/auto-complete,http://cx4a.org/software/auto-complete} . Three AC sources @code{ac-source-R-args}, @code{ac-source-R-objects} and @code{ac-source-R} are provided. The last one combines the previous two and makes them play nicely together. Set @code{ess-use-auto-complete} to @code{t} to start using it. Refer to documentation string of @code{ac-use-auto-complete} for further information. @item @ESS{[R]}: New unified and fast argument completion system, comprised of @code{ess-funname.start}, @code{ess-function-arguments}, @code{ess-get-object-at-point}. Eldoc and auto-completion integration are using this system. @item @ESS{}: @code{ess-switch-to-end-of-ESS}(@kbd{C-c C-z}), and @code{ess-switch-to-ESS}(@kbd{C-c C-y}): Automatically start the process whenever needed. @item @ESS{[R]}: @code{roxy} knows about previewing text version of the documentation. Bound to @kbd{C-c C-e t}. @item @ESS{[R]}: Solved the ``nil filename'' bug in roxygen support. @item @ESS{[R]}: @code{ess-tracebug} is now part of @ESS{}: New Features: @itemize @minus @item Source injection: Tracebug now can inject source references on the fly during code evaluation, i.e. you don't have to source your file, but just evaluate your code in normal fashion. Variable @code{ess-tracebug-inject-source-p} controls this behavior - if t, always inject source reference, if @code{'function}, inject only for functions (this is the default), if @code{nil}, never inject. During the source injection the value of @code{ess-eval-visibly} is ignored. @item Org-mode support: Visual debugger is now aware of the temporary org source editing buffer (@kbd{C-c '}) and jumps through this buffers if still alive, or in original org buffer otherwise. @item New keys in watch mode: @kbd{?} and @kbd{d} @item Two new hooks: ess-tracebug-enter-hook and ess-tracebug-exit-hook @end itemize @item @ESS{[R]}: New package @code{ess-developer} to evaluate @code{R} code directly in the package environment and namespace. It can be toggled on and off with @kbd{C-c d t}. When @code{ess-developer} is on all ESS evaluation commands are redefined to evaluate code in appropriate environments. Add package names to the list of your development packages with @kbd{C-d a}, and remove with @kbd{C-d r}. Source the current file with @kbd{C-d s}.Evaluation function which depend on @code{`ess-eval-region'} ask for the package to source the code into, @code{ess-eval-function} and alternatives search for the function name in the development packages' environment and namespace and insert the definition accordingly. See the documentation section ``Developing with ESS/ESS developer'' for more details. @item @ESS{[R]} help system: New Features: @itemize @minus @item @kbd{q} quits window instead of calling @code{ess-switch-to-end-of-ESS}. This is consistent with emacs behavior help and other special buffers (@emph{breaking change}). @item @kbd{k} kills window without asking for the name (pointed by Sam Steingold) @item Help map inherits from @code{special-mode-map} as sugested by Sam Steingold. @item Package index: new function @code{ess-display-index} bound to @kbd{i} in help mode map. @item Package vignettes: new function @code{ess-display-vignettes} bound to @kbd{v} in help mode map. @item Display help in HTML browser: new function @code{ess-display-help-in-browser} bound to @kbd{w} in help mode map. It depends on @code{R}'s @code{browser} option. @item New custom variable @code{ess-help-pop-to-buffer}: if non-nil @ESS{} help buffers are given focus on display. The default is @code{t} (@emph{breaking change}). @item New menu entries for the above functions. @item Bogus help buffers are no longer generated by default, i.e. buffers of the form ``No documentation for 'foo' in specified packages and libraries: you could try '??foo' ''. @code{ess-help-kill-bogus-buffers} now defaults to @code{t}. Beware, there may be instances where the default is unsatisfactory such as debugging and/or during R development. Thanks to Ross Boylan for making the suggestion, Sam Steingold for reminding us of this variable and Martin Maechler for the warning. @end itemize @item @ESS{} now uses @code{IDO} completing read functionality for all the interactive requests. It uses ido completion mechanism whenever available, and falls back on classical completing-read otherwise. You can set @code{ess-use-ido} to nil if you don't want the IDO completion. See the documentation string of @code{ess-use-ido} for more information about @code{IDO} and @ESS{} configuration. @item @ESS{[S]}: ``@kbd{,}`` is bound to ess-smart-comma: If comma is invoked at the process marker of an ESS inferior buffer, request and execute a command from @code{`ess-handy-commands'} list. If @code{ess-R-smart-operators} is t @code{`ess-smart-comma} also inserts `` `` after comma. @item @ESS{[S]}, notably @code{R}: Variable @code{`ess-handy-commands'} stores an alist of useful commands which are called by @code{ess-smart-comma} in the inferior buffer. Currently containing: @table @asis @item change-directory @code{ess-change-directory} @item help-index @code{ess-display-index} @item help-object @code{ess-display-help-on-object} @item vignettes @code{ess-display-vignettes} @item objects[ls] @code{ess-execute-objects} @item search @code{ess-execute-search} @item set-width @code{ess-execute-screen-options} @item install.packages @code{ess-install.packages} @item library @code{ess-library} @item setRepos @code{ess-setRepositories} @item sos @code{ess-sos} @end table Handy commands: @code{ess-library}, @code{ess-install.packages}, etc - ask for item with completion and execute the correspond command. @code{ess-sos} is a interface to @code{findFn} function in package @code{sos}. If package @code{sos} is not found, ask user for interactive install. @item @ESS{}: New dynamic mode line indicator: Process status is automatically reflected in all mode-lines of associated with the process buffers. Particularly useful for displaying debug status of @code{ess-tracebug} and developer status of @code{ess-developer} in all associated buffers. @item @ESS{}: New @code{ess-completing-read} mechanism: @ESS{} uses @code{ido} completions whenever possible. Variable @code{ess-use-ido} controls whether to use ido completion or not. Active by default. @item @ESS{} now supports comint fields for output and input detection. This feature is not used by default, but might be useful in the future. @item @ESS{[S]}: New custom variable @code{inferior-ess-S-prompt} to customize prompt detection regular expression in the inferior ESS buffers. You can customize this variable to enhance comint navigation (@code{comint-previous-prompt} and @code{comint-next-prompt}) the inferior buffers. @item @ESS{[R]}: Internal @code{R} completion retrieval (@code{ess-R-complete-object-name}) was rewritten and is faster now. @item @ESS{} is using process plist to store process specific variables, as opposed to buffer local variables as it was using before. The use of buffer local variables to store process variables is discouraged. @item @ESS{}: new functions to manipulate process plists: @code{ess-process-get} and @code{ess-process-set}. @item @ESS{}: Internal process waiting mechanism was completely rewritten. ESS no more relies on prompt regular expressions for the prompt detection. The only requirement on the primary process prompt is to end in @code{> }. This could be overwritten by setting @code{inferor-ess-primary-prompt}. @item @ESS{[S]}, notably @code{R}: Saved command history: @var{ess-history-file} now accepts @code{t} (default), @code{nil}, or a file name. By setting it to @code{nil} no command line history is saved anymore. @var{ess-history-directory} now allows to have the history all saved in one ``central'' file. @item @ESS{[R]}: more Roxygen improvements. @item @ESS{[R]}: @kbd{C-c .} to set (indentation) style. @item @ESS{[R]}: Functions with non-standard names (for example 'aaa-bbb:cc') are properly handled by font-lock and evaluation routines. @item @ESS{[R]}:Several regexp bugs (described in etc/R-ESS-bugs.el) were fixed in @code{ess-get-words-from-vector} and @code{ess-command}. @end itemize @comment @end itemize ess/doc/onews.texi0000664000175000017500000000005712423756516012534 0ustar eddedd @include ess-defs.texi @include onewfeat.texi ess/doc/authors.texi0000664000175000017500000000236712423756516013074 0ustar eddedd@c ---- KEEP this synchronized with the @author entries in @c ./ess.texi @c ~~~~~~~~~~ @itemize @bullet @item @c @uref{http://www.google.com/,A.J. Rossini} @uref{mailto:blindglobe@@gmail.com, A.J. Rossini} @c -------- @item @c @uref{http://www.sbm.temple.edu/departments/statistics/,Richard M. Heiberger} @uref{mailto:rmh@@temple.edu, Richard M. Heiberger} @c -------- @item @c @uref{http://www.ci.tuwien.ac.at/~hornik,Kurt Hornik} @uref{mailto:Kurt.Hornik@@R-project.org, Kurt Hornik} @c -------- @item @c @uref{http://stat.ethz.ch/people/maechler/,Martin Maechler} @uref{mailto:maechler@@stat.math.ethz.ch, Martin Maechler} @c -------- @item @c @uref{http://www.mcw.edu/pcor/rsparapa,Rodney A. Sparapani} @uref{mailto:rsparapa@@mcw.edu, Rodney A. Sparapani} @c -------- @item @c @uref{http://www.damtp.cam.ac.uk/user/eglen,Stephen Eglen} @uref{mailto:stephen@@gnu.org, Stephen Eglen} @c -------- @item @c @uref{http://www.ucs.mun.ca/~sluque,Sebastian P. Luque} @uref{mailto:spluque@@gmail.com, Sebastian P. Luque} @c -------- @item @c @uref{http://www.google.com,Henning Redestig} @uref{mailto:henning.red@@googlemail.com, Henning Redestig} @c -------- @item @c @uref{http://www.google.com/, Vitalie Spinu} @uref{mailto:spinuvit@@gmail.com, Vitalie Spinu} @end itemize ess/doc/readme.texi0000664000175000017500000001071412423756516012637 0ustar eddedd\input texinfo @c -*-texinfo-*- @comment %**start of header @setfilename readme.info @settitle ESS - Emacs Speaks Statistics @comment %**end of header @include ess-defs.texi @node General Information @comment node-name, next, previous, up @chapter General Information: README @cindex README This is the README file for the distribution of ESS version @include ../VERSION ESS is a GNU Emacs and XEmacs mode for interactive statistical programming and data analysis. Languages supported: the S family (S, S-PLUS and R), SAS, BUGS/JAGS and Stata. ESS grew out of the desire for bug fixes and extensions to S-mode and SAS-mode as well as a consistent union of their features in one package. Installation instructions are provided in sections for both Unix and Windows; see below. The current development team is led by Martin Maechler since August 2004. Former project leader A.J. (Tony) Rossini (@email{rossini@@blindglobe.net}) did the initial port to XEmacs and has been the primary coder. Martin Maechler (@email{maechler@@stat.math.ethz.ch}) and Kurt Hornik (@email{Kurt.Hornik@@R-project.org}) have assisted with the S family and XLispStat. Stephen Eglen (@email{stephen@@gnu.org}) has worked mostly on R support. Richard M. Heiberger (@email{rmh@@temple.edu}) has assisted with S/S-PLUS development for Windows. Richard and Rodney A. Sparapani (@email{rsparapa@@mcw.edu}) have done much of the work improving SAS batch and interactive support. Rodney has also extended ESS to support BUGS/JAGS and has an interest in improving Stata support. We are grateful to the previous developers of S-mode (Doug Bates, Ed Kademan, Frank Ritter, David M. Smith), SAS-mode (Tom Cook) and Stata-mode (Thomas Lumley). @c The name is ESS. Not ESS-mode. @ifplaintext Table of Contents @itemize @bullet @item License @item Stability @item Requirements @item Latest Version @item Installation @item Starting an ESS Process @item New Features @item Current Features @item Reporting Bugs @item Mailing Lists @item Authors @end itemize @end ifplaintext @menu * License:: * Stability:: * Requirements:: * Latest Version:: * Installation:: * Starting up:: * Current Features:: * New Features:: * Reporting Bugs:: * Mailing Lists:: * Authors:: @end menu @node License, Stability, General Information, General Information @comment node-name, next, previous, up @section License @include license.texi @node Stability, Requirements, License, General Information @comment node-name, next, previous, up @section Stability @include stabilty.texi @node Requirements, Latest Version, Stability, General Information @comment node-name, next, previous, up @section Requirements @include requires.texi @node Latest Version, Installation, Requirements, General Information @comment node-name, next, previous, up @section Getting the Latest Version @include getting.texi @c NOTE: The above INCLUDES inst_svn.texi (Subversion/SVN Installation) @c vvvvvvvvvvvv node name *must* match the one in ./ess.texi ! @node Installation, Starting up, Latest Version, General Information @comment node-name, next, previous, up @section Installation @include installation.texi @node Starting up, Current Features, Installation, General Information @comment node-name, next, previous, up @section Starting an ESS process To start an @Sl{} session on Unix or on Windows when you use the Cygwin bash shell, simply type @kbd{M-x S RET}. To start an @Sl{} session on Windows when you use the MSDOS prompt shell, simply type @kbd{M-x S+6-msdos RET}. @node Current Features, New Features, Starting up, General Information @comment node-name, next, previous, up @section Current Features @include currfeat.texi @node New Features, Reporting Bugs, Current Features, General Information @comment node-name, next, previous, up @section New Features @include newfeat.texi @node Reporting Bugs, Mailing Lists, New Features, General Information @comment node-name, next, previous, up @section Reporting Bugs @include bugrept.texi @node Mailing Lists, Authors, Reporting Bugs, General Information @comment node-name, next, previous, up @section Mailing Lists @include mailing.texi @node Authors, , Mailing Lists, General Information @comment node-name, next, previous, up @section Authors @include authors.texi @bye @c Remember to delete these lines before creating the info file. @iftex @lucidbook @bindingoffset = 0.5in @parindent = 0pt @end iftex @comment Local Variables: @comment TeX-master: "readme.texi" @comment End: ess/doc/ChangeLog0000664000175000017500000000401112423756516012252 0ustar eddedd2013-07-02 Rodney Sparapani * readme.texi/announc.texi: cosmetic changes to title 2013-07-01 Rodney Sparapani * ess.texi/allnews.texi: cosmetic changes to title 2013-06-28 Rodney Sparapani * help-sas.texi (ESS): convert ESS(SAS) to ESS[SAS] in the table of contents as was done for BUGS/JAGS however, this is not a complete solution since the nodes themselves are still named ESS(SAS)--... and there is no way to fix that, right? 2013-06-12 Rodney Sparapani * allnews.texi/Makefile (New features): All "new" features as discussed in ess-core; see below 2013-06-12 Rodney Sparapani * ess.texi/Makefile (New features): really "new" as discussed in ess-core; see below 2013-06-07 Rodney Sparapani * onewfeat.texi/newfeat.texi: migrated pre-12.03 features to onewfeat.texi However, this will have no practical effect until we stop including onewfeat.texi from ess.texi; see below 2013-04-11 Rodney Sparapani * onewfeat.texi/newfeat.texi: migrated pre-5.3.10 new features to old new features in accordance with downloads/OLD; but, I think we need to go further: is "new" valid more than 2 years, i.e. 5.14+ (07/11)? However, currently this migration has no practical effect since ess.texi includes both newfeat.texi and onewfeat.texi; does that really make sense? 2013-03-08 Rodney Sparapani * newfeat.texi: @item @ESS{[SAS]}: long over-looked @code{SAS-mode-hook} appears! 2013-02-25 Rodney Sparapani * Makefile: ignore warnings from makeinfo 2013-01-23 Rodney Sparapani * currfeat.texi: cleaning up the language in Languages Supported... S family (R and S+ AKA S-PLUS) 2012-07-06 Rodney Sparapani * ess.texi (ESS tracebug): just trying to see what would make the tracebug key tables look right 2012-06-22 Rodney Sparapani * credits.texi: fixed a typo ess/doc/bugs.texi0000664000175000017500000000276212423756516012346 0ustar eddedd@itemize @bullet @item Commands like @code{ess-display-help-on-object} and list completion cannot be used while the user is entering a multi-line command. The only real fix in this situation is to use another ESS process. @item The @code{ess-eval-} commands can leave point in the ESS process buffer in the wrong place when point is at the same position as the last process output. This proves difficult to fix, in general, as we need to consider all @emph{windows} with @code{window-point} at the right place. @item It's possible to clear the modification flag (say, by saving the buffer) with the edit buffer not having been loaded into S. @item Backup files can sometimes be left behind, even when @code{ess-keep-dump-files} is @code{nil}. @item Passing an incomplete @Sl{} expression to @code{ess-execute} causes ESS to hang. @item The function-based commands don't always work as expected on functions whose body is not a parenthesized or compound expression, and don't even recognize anonymous functions (i.e. functions not assigned to any variable). @item Multi-line commands could be handled better by the command history mechanism. @item Changes to the continutation prompt in R (e.g. @code{options(continue = " ")}) are not automatically detected by ESS. Hence, for now, the best thing is not to change the continuation prompt. If you do change the continuation prompt, you will need to change accordingly the value of @code{inferior-ess-secondary-prompt} in @code{R-customize-alist}. @end itemize ess/doc/ESS_intro.tex0000664000175000017500000002652312423756516013103 0ustar eddedd%% $Id: ESS_intro.tex,v 1.2 1999/11/16 20:58:36 ess Exp $ %% %% $Log: ESS_intro.tex,v $ %% Revision 1.2 1999/11/16 20:58:36 ess %% Martin suggested a small fix. %% %% Revision 1.1 1999/11/16 20:54:33 ess %% Another bit of documentation %% %% Revision 1.11 1998/10/12 21:09:20 rossini %% added andy's notes. %% %% Revision 1.10 1998/10/12 15:53:25 rossini %% emacs clarification made (thanks Martin!). %% %% Revision 1.9 1998/10/12 15:48:16 rossini %% Released in semi-final form. %% %% \documentclass{article} \addtolength{\textheight}{2in} \addtolength{\textwidth}{1in} \addtolength{\topmargin}{-1in} \addtolength{\oddsidemargin}{-1.0in} \usepackage{palatino} \usepackage{html} \title{A Quick Introduction to ESS} \author{A.J. Rossini} \begin{document} \maketitle This document can be found at \begin{center} \htmladdnormallink {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/} {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/} \end{center} The example file for this session is \htmladdnormallink{rossini.example.R} {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/rossini.example.R}, which can be retrieved (from the Biostat machines) by \begin{verbatim} cp ~rossini/public_html/talk/ESS_intro/rossini.example.R . \end{verbatim} to your current working directory. (note that the final ``.'' is very important!). For convenience, the \htmladdnormallink{latex} {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/ESS\_intro.tex} and \htmladdnormallink{postscript} {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/ESS\_intro.ps} versions are also available. \section{Common Emacs Information} \label{sec:emacs} This is not a tutorial for Emacs. That is a subject for another session. Basic notation for key sequences: \begin{itemize} \item \verb+[tab]+ is the TAB (indent) key. \item \verb+C-k+ refers to holding down the control (ctrl) key \textbf{WHILE} pressing ``k''. \item \verb+M-k+ refers to pressing the Escape key (ESC), \textbf{THEN} pressing ``k''. \end{itemize} \textbf{Only run one Emacs session}. This is a cardinal rule, that you should try not to violate. To load in (visit) new files, do: \begin{itemize} \item \verb+C-x C-f+ (replaces current file in window with new) \item \verb+C-x 4 C-f+ (load new file in different window) \item \verb+C-x 5 C-f+ (load new file in different frame) \end{itemize} and to switch to another file, do \begin{itemize} \item \verb+C-x b+ (switch to new buffer in window) \item \verb+C-x 4 b+ (replaces current file in different window) \item \verb+C-x 5 b+ (replaces current file in different frame) \end{itemize} Buffers are the representations of the files you are editing. You can treat them as the files themselves. \subsection{Useful (X)Emacs Commands for UW Biostat} \label{sec:emacs:uwbiostat} In the following, \emph{``Emacs''} can be used instead of \emph{``XEmacs''}. This section is thanks to \htmladdnormallink{Andy Dunning}{mailto:adunning@biostat.washington.edu} and \htmladdnormallink{Greg Warnes}{mailto:warnes@biostat.washington.edu}. It's also available as a \htmladdnormallink{crib sheet text document} {http://www.biostat.washington.edu/\~{}rossini/talk/ESS\_intro/emacs.txt}. \begin{verbatim} USEFUL XEMACS COMMANDS ====================== STARTING XEMACS (Currently on GIBSON, GORN, SOL, ATLAS, ABACUS) --------------- rsh login to machine xemacs start xemacs, edit xemacs -f S start xemacs, run S-plus xemacs -nw start xemacs in _text_ mode (nw="No Window") (useful over telnet session from home) ANY EMACS BUFFER ---------------- MOVING AROUND ------------- C-v Move forward one screenful M-v Move backward one screenful C-l Clear screen and redisplay everything M- -> Meta- - moves forward a word M- <- Meta- - moves back a word M- |^ Meta- - move up a paragraph M- V Meta- - move down a paragraph M- < Meta- - move to end of file CUT AND PASTE ------------- C-d _D_elete C-k _K_ill from the cursor position to end of line C-y Recover/Paste (_Y_ank) killed text (repeat to copy) M-y recover former killed text (after C-y. Repeat to go back through stack). C-x u _U_ndo LOADING/SAVING FILES -------------------- C-x C-f _F_ind a file C-x C-s _S_ave the file If you find a second file with C-x C-f, the first file remains inside Emacs. You can switch back to it by finding it again with C-x C-b. This way you can get quite a number of files inside Emacs. MANAGING BUFFERS / WINDOWS -------------------------- C-x 0 Move between windows C-x 1 One window (i.e., kill all other windows). C-x b Switch to new _b_uffer C-x C-b List _b_uffers SEARCH and REPLACE ------------------ M-x (then) replace-string Replace string C-s _S_earch forward - repeat to move to next occurence C-r Search _r_everse - repeat to move to previous occurence MISC ---- C-h or C-h ? _H_elp C-h c (command) _H_elp on this _c_ommand C-u 8 (character or command) Repeat character or command 8 times C-g Stop, undo, unhang. C-x C-c stop editing and exit (_c_lose) Emacs STARTING SPLUS / ESS -------------------- M-x S Start _S_-plus process buffer M-x S-mode Change mode of current buffer to S-plus code editing S EXECUTION BUFFER (Usually named "*S*" or similar, mode line says "iESS") ------------------ C-c C-d _D_ump S-plus object or function into new editing buffer. C-c C-v xxx get S-plus help on "xxx" S CODE EDITING BUFFER (Usually named for the file being edited, mode line --------------------- says "ESS[S]") C-c C-j Send line to S C-c C-n Send line to S and move down to _n_ext line C-c C-r Send highlighted _r_egion to S C-c C-b Send whole _b_uffer to S C-c C-f Send _f_unction where cursor is to S C-c C-v xxx get S-plus help on "xxx" \end{verbatim} \section{Replacing Command-line Usage} \label{sec:commandline} \subsection{Start-up} \label{sec:commandline:startup} \begin{enumerate} \item To run from the command-line in a non-windowing environment: \begin{verbatim} xemacs -f S \end{verbatim} \item To run from the command-line in a windowing environment: \begin{verbatim} xemacs -f S & \end{verbatim} \end{enumerate} (note that depending on the system, you might be using \verb+emacs+, not \verb+xemacs+). \textbf{Optional: } The first time that one runs this, you should construct the object list. This is done by: \begin{verbatim} M-x ess-create-object-name-db \end{verbatim} or \begin{verbatim} M-x ess-create-obj[tab] \end{verbatim} where \verb+[tab]+ is the TAB key. One can replace \verb+S+ with \verb+R+ or \verb+XLS+, to run a different version. The object database feature currently only works with Splus and R. \subsection{Replacing Command-line Usage} \label{sec:commandline:usage} To enter commands, you generally need to be at a command prompt (i.e. ``\verb+> +''). But there are some nice exceptions. The follow applies primarily to \verb+Splus+ and \verb+R+. \begin{enumerate} \item To get help on a function (help(``lm'')) without spoiling your input line: \verb+C-c C-v+ \item Completion of objects (functions and data): \begin{enumerate} \item \verb+C-c [tab]+ \item \verb+[tab]+ (sometimes). \end{enumerate} \item Search command-line history ``manually'', matching on current input \begin{enumerate} \item backwards: \verb+M-p+ \item forwards: \verb+M-n+ \end{enumerate} \item Complete current line based on command-line history: \begin{enumerate} \item backwards: \verb+\C-[uparrow]-p+ \item forwards: \verb+M-n+ \end{enumerate} \item If you are reviewing old commands, to re-enter it one (with the cursor on the line): \verb+[return]+. \end{enumerate} Many other commands, as well... \section{Replacing Cut-and-Paste} \label{sec:cutpaste} The next stage of statistics package usage is usually to cut-and-paste from an editor. Since we are within an editor, this is moot. \textbf{Use the following suffices for your files:} \begin{itemize} \item \verb+.S+, such as \verb+critical_simulation.S+ \item \verb+.R+, such as \verb+speedy_simulation.R+ \end{itemize} \subsection{Cut and Paste} \label{sec:cutpaste:usual} You \textbf{can} cut and paste. It's pretty identical, and a bit ugly. \subsection{Efficient Methods 1} \label{sec:cutpaste:eff1} \textbf{This works from the process (inferior ESS, or iESS) buffer} One improvement is to use a \verb+source()+-like facility. \begin{enumerate} \item To source a file into Splus (within ESS): \verb+C-c C-l+ (load file) \item To find what the errors are (if any): \verb+C-c `+ (backquote). \end{enumerate} The latter will tell you what the error is. You'll have to go back to the file and edit it. \subsection{Efficient Methods 2} \label{sec:cutpaste:eff2} \textbf{This works from the editing (ESS) buffer} Better yet, use a file, and send material from the file straight to the process. This works if the file ends in the proper suffix (and hence, the mode at the bottom should say ``ESS''). The following is possible: \begin{itemize} \item Send current line to S: \verb+C-c C-j+ \item Send current function to S (assumes the cursor is in the function body): \verb+C-c C-f+. \item Send current region (highlighted) to S \verb+C-c C-r+ \item Send whole buffer/file to S \verb+C-c C-b+ \end{itemize} \section{Editing} \label{sec:edit} \textbf{This works from the editing (ESS) buffer} See Section~\ref{sec:cutpaste:eff2} for communication between the code buffer and the process buffer. The help commands and object completion commands (only \verb+C-c [TAB]+ version) work. Syntax-highlighting and formatting are present. For comment indentation: \begin{enumerate} \item \verb+#+ gets moved to the right-side of the line \item \verb+##+ is placed at the current indentation level \item \verb+###+ is placed flush-left. \end{enumerate} To dump an object into a buffer (for editing, saving, possible reloading): \begin{enumerate} \item \verb+C-c C-d+ dumps the named object into an editing buffer (in ESS mode). \end{enumerate} \section{Advanced Usage} \label{sec:advanced} \begin{itemize} \item preliminary integration with noweb, for literate programming and data analysis (another talk) \item Has a transcript mode for recreating work and providing demonstrations. \item Except for object-completion, everything mentioned here works \textbf{identically} for Stata, XLispStat, and SAS. \item Makes versioning (version control, document revision history) simple. \end{itemize} \end{document} ess/doc/NEWS0000664000175000017500000001374712423756516011217 0ustar eddedd== Changes up to version 5.0 : * Works with XLispStat, R, and S(plus). == Changes up to version 4.8.MM6.XE3 : * inferior S-mode: C-c C-a is comint-bol (not attach directories) Output cleaned up (thanks to PD). * Code cleaned up, more according to Emacs-Lisp Style Guide. * Added some code for S4 (not activated yet). (thanks to JMC). * Added some extra configuration code (not activated yet) (thanks to MM). * reports to proper authority (Hornik/Maechler/Rossini). * Makefile updated (i.e. Unpacks into a subdirectory (this has been true for all XE versions, etc)). * Fixed up output from R (KH). == Changes up to version 4.8.MM6.XE2 : * Works with Emacs and XEmacs. I think. Documentation needs to be updated . == Changes up to version 4.8.MM6.XE1 : * XEmacs compatibility added, Emacs compatibility broken. Easymenu now in use. == Changes up to version 4.8.MM6 : * Lots of patches by Martin. S-eval, right? (AJR: I don't know). == Changes up to version 4.8: * Keybinding changes in S Transcript Mode. RET now simply executes the current commant. M-RET executes and moves, C-c RET copies, leaving you in the process buffer. These bindings mirror those in Inferior S mode. * If S-source-directory is a lambda expression, it is evaluated with the process buffer as the current buffer. * The default starting directory is always your home directory. Set S-directory to `nil' to get the old behaviour (use the current buffer's default directory). * In Inferior S mode, S mode and S transcript mode, M-? is now bound to the new function S-list-object-completions. Also, S-resynch is available from the Inf-S menu. * S-request-a-process is now bound to C-c C-k. This frees C-c C-p for the standard comint binding of comint-previous-prompt. * Massive manual update. == Changes in version 4.7: * Probably *only* works with Emacs 19.29 * New semantics for S-keep-dump-files. Values may be nil, check, ask or t; the default is 'check. It's also now buffer-local. See the info file for more details. * New hook, S-post-run-hook, run just after the S process starts. Use this to evaluate code at the start of a session. == Changes in version 4.6: * Works with Emacs 19.29 * Font-lock support in S-mode, inferior-S-mode and S-transcript-mode buffers * M-RET in inferior-S-mode is bound to S-transcript-send-command-and-move * S-site now much more lightweight to load. == Changes in version 4.5: * New, and hopefully simpler, installation procedure. == Changes in version 4.4: * There is now a command to send bug reports: S-submit-bug-report. It is also available from menus (Send bug report). * Keybinding changes: S-view-at-bottom (on C-c C-v) has been deleted. It's functionality is provided by comint's comint-show-maximum-output, on C-c C-e. S-display-help-on-object has moved from C-c C-h onto C-c C-v (and now has an alias, M-x S-help), and S-execute (S-execute-in-tb in S-mode) has moved from C-c C-e to C-c C-t. == Changes in version 4.3: * The variable S-source-directory-generator has been deleted. It's functionality has been subsumed into the variable S-source-directory; if this is not a string it is assumed to be a lambda expression, and behaves in the same was as S-source-directory used to. * New user option S-delete-dump-files. == Changes in version 4.2: * New user variable S-inf-filenames-map. Set this to nil if you are using DOS or some other system with limited filename lengths. * S-local-variables-string and S-temp-buffer-p have been deleted. S-mode no longer adds a local variables section to source files. You should use file extensions to set the major mode. * S-insert-function-templates has been deleted. Its functionality has been taken over by the user variable S-function-template. * S.el has been divided into four separate files, with autoloads. * New file S-site.el for site-level customizations. * S-ask-about-display and X-displays-list have been removed. * User variable: S-ask-about-transfile. If non-nil, asks for a transcript file to use. == Changes in version 4.0: * The TAB key in inferior-S-mode is more versatile; it completes S object names when point follows an object name, and completes filenames when point is in a string. * New mode: S-transcript-mode, for dealing with S transcript files. * Multi-line inputs are now evaluated neatly * inferior-S-prompt is no longer a user variable. Instead, set inferior-S-primary-prompt and inferior-S-secondary-prompt * Uses the comint.el supplied with Emacs 19.20 onwards. * Hook: S-send-input-hook * Emacs version 18 is no longer supported (sorry). Works with Emacs 19 (and, unfortunately, only Emacs 19) * S-tek is no longer supported, and has been removed from the distribution * Works with S version 3.1 == Changes in version 3.5: * Support for multiple S processes. Pass a numeric argument to M-x S to start a new S process. The name of the process associated with the cuurent buffer is shown in the mode line like this: [S2] * In the process buffer, a paragraph is a prompt, a command and its output, to make the paragraph functions useful. Multiple S sessions are delimited by ^L, to make the page functions useful * User variable S-synchronize-evals * New function S-request-a-process, bound to C-c C-p * New function S-clean-region == RELEASE 3.4 INFORMATION * Works with version 3.0 S * Command-line completion of S object names * Recognition of attached data frames * Dedicated S Help mode * Tek graphics support * Several bugfixes and code cleanups * Texinfo documentation == RELEASE 2.1 INFORMATION Improvements since last release (unnumbered of Summer 1990): * Better description provided of functions loaded. * Better header for this file. * S-directory is now a prescriptive rather than just descriptive variable. * better syntax table, so |#; are better recognized and commands using them work better. * we have a version number. Local Variables: mode: text fill-prefix: " " End: ess/doc/info/0000775000175000017500000000000012423756516011437 5ustar eddeddess/doc/info/dir0000664000175000017500000000115712423756516012144 0ustar eddeddThis is the file .../info/dir, which contains the topmost node of the Info hierarchy, called (dir)Top. The first time you invoke Info you start off looking at this node.  File: dir, Node: Top, This is the top of the INFO tree This (the Directory node) gives a menu of major topics. Typing "q" exits, "?" lists all Info commands, "d" returns here, "h" gives a primer for first-timers, "mEmacs" visits the Emacs manual, etc. In Emacs, you can click mouse button 2 on a menu item or cross reference to select it. * Menu: * ESS: (ess). Emacs Speaks Statistics (S/S+/R, SAS, BUGS, Stata, XLisp-Stat). ess/doc/README0000664000175000017500000000206212423756516011364 0ustar eddeddHow do we organize the ess/doc/ directory ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Source: *.texi [texinfo] Targets (see also ./Makefile): ess.dvi [DVI -> PostScript] readme.dvi ess.info* [Info] readme.info* ./html/*html ---------------------- Structure: TWO main files (note that a third one, announc.texi, is conceptually a subset of readme.texi and is only used to automatically produce ../ANNOUNCE) ess.texi | |-- ../VERSION |-- ess-defs.texi | |-- newfeat.texi | |-- credits.texi | \-- authors.texi | |-- getting.texi | \-- inst_svn.texi |-- inst_tar.texi | |-- requires.texi | |-- help-s.texi |-- help-sas.texi |-- help-bugs.texi | |-- bugs.texi | |-- bugrept.texi | \-- mailing.texi readme.texi | |-- license.texi | |-- newfeat.texi | |-- currfeat.texi | |-- stabilty.texi | |-- requires.texi | |-- getting.texi | \-- inst_svn.texi |-- inst_tar.texi | |-- bugrept.texi | |-- mailing.texi | \-- authors.texi ess/doc/license.texi0000664000175000017500000000113712423756516013023 0ustar eddedd@comment ESS is free software; you can redistribute it and/or modify it under The source and documentation of ESS is free software. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ESS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License in the file COPYING in the same directory as this file for more details. ess/doc/credits.texi0000664000175000017500000000562112423756516013040 0ustar eddedd@cindex comint @cindex authors @cindex credits The ESS environment is built on the open-source projects of many contributors, dating back to 1989 where Doug Bates and Ed Kademan wrote S-mode to edit S and Splus files in GNU Emacs. Frank Ritter and Mike Meyer added features, creating version 2. Meyer and David Smith made further contributions, creating version 3. For version 4, David Smith provided significant enhancements to allow for powerful process interaction. John Sall wrote GNU Emacs macros for SAS source code around 1990. Tom Cook added functions to submit jobs, review listing and log files, and produce basic views of a dataset, thus creating a SAS-mode which was distributed in 1994. In 1994, A.J. Rossini extended S-mode to support XEmacs. Together with extensions written by Martin Maechler, this became version 4.7 and supported S, Splus, and R. In 1995, Rossini extended SAS-mode to work with XEmacs. In 1997, Rossini merged S-mode and SAS-mode into a single Emacs package for statistical programming; the product of this marriage was called ESS version 5. Richard M. Heiberger designed the inferior mode for interactive SAS and SAS-mode was further integrated into ESS. Thomas Lumley's Stata mode, written around 1996, was also folded into ESS. More changes were made to support additional statistical languages, particularly XLispStat. ESS initially worked only with Unix statistics packages that used standard-input and standard-output for both the command-line interface and batch processing. ESS could not communicate with statistical packages that did not use this protocol. This changed in 1998 when Brian Ripley demonstrated use of the Windows Dynamic Data Exchange (DDE) protocol with ESS. Heiberger then used DDE to provide interactive interfaces for Windows versions of Splus. In 1999, Rodney A. Sparapani and Heiberger implemented SAS batch for ESS relying on files, rather than standard-input/standard-output, for Unix, Windows and Mac. In 2001, Sparapani added BUGS batch file processing to ESS for Unix and Windows. @itemize @bullet @item The multiple process code, and the idea for @code{ess-eval-line-and-next-line} are by Rod Ball. @item Thanks to Doug Bates for many useful suggestions. @item Thanks to Martin Maechler for reporting and fixing bugs, providing many useful comments and suggestions, and for maintaining the ESS mailing lists. @item Thanks to Frank Ritter for updates, particularly the menu code, and invaluable comments on the manual. @item Thanks to Ken'ichi Shibayama for his excellent indenting code, and many comments and suggestions. @item Thanks to Aki Vehtari for adding interactive BUGS support. @item Thanks to Brendan Halpin for bug-fixes and updates to Stata-mode. @item Last, but definitely not least, thanks to the many ESS users and contributors to the ESS mailing lists. @end itemize @emph{ESS} is being developed and currently maintained by @include authors.texi ess/doc/README.XLispStat0000664000175000017500000001155512423756516013265 0ustar eddedd-*- indented-text -*- $Revision: 5.1 $ ESS: Using the XLispStat family of statistical languages ======================================================== This module is currently undergoing development. It is not as stable as the S language support. However, it should be functional, if slightly buggy. Please send any suggestions and bug reports to ess-bugs@stat.math.ethz.ch. ESS (originally S-mode) was initially designed for use with S and S-PLUS(tm). However, it has been recently extended to support other languages, including XLispStat. If you are looking for a stable, old XLispStat mode, we suggest ILISP and the recent modifications. However, those features and new advanced features are being merged with the development of ESS[XLS], which is similar in behavior to the interface for S (unlike ILISP). We denote by _XLS_ the LispStat languages XLispStat and ViSta (though the ViSta program is called by ViSta). We denote by _Emacs_, one of the GNU family of editors, either Emacs (as developed and maintained by the Free Software Foundation) or XEmacs (which a derivative work). The following is covered in this document: - Editing files. - running an XLS process as an inferior process to Emacs (we include - using transcripts. - Scenarios for use (possibilities, based on actual usage) - Philosophies We assume that you are familiar with Emacs terminology and syntax: file, buffer, region, description of keys etc. If not, please read the New Users guide (found in the info pages, "C-h i" (by pressing control h, i) or Tutorial, "C-h t"). ESS[XLS]: Editing Files ===================== ESS[XLS] is the mode for editing XLS language files. This mode handles: - proper indenting, generated by both [Tab] and [Return]. - color and font choices based on syntax. - ability to send the contents of a single buffer, regions, lines, and functions to an inferior process, if one is currently running. - ability to switch between processes which would be the target of the buffer (for the above). - The ability to request help from a process for variables and functions, and to have the results sent into a separate buffer. It should be automatically turned on when loading a file with the suffix *.lsp or as set in ess-site.el. However, one will have to start up an inferior process to take advantage of the interactive features. iESS: Inferior ESS processes. ============================= iESS (inferior ESS) is the mode for interfacing with active statistical processes (programs). This mode handles: - proper indenting, generated by both [Tab] and [Return]. - color and font highlighting based on syntax. - ability to send the contents of a single buffer, regions, lines, and functions to an inferior process, if one is currently running. - The ability to request help from a process for variables and functions, and to have the results sent into a separate buffer. - interactive history mechanism - transcript recording and editing To start up this mode, use: M-x XLS ESS-help: assistance with viewing help ====================================== - obtain help files in a separate buffer for later viewing. - send examples to XLS for evaluation. Scenarios for use ================= We present some basic suggestions for using ESS to interact with XLS. These are just a subset of approaches, many better approaches are possible. Contributions of examples of how you work with ESS are appreciated (especially since it helps us determine priorities on future enhancements)! (comments as to what should be happening are prefixed by "##"). 1: ## Start up XLispStat, in a process buffer (this will be *XLS:1*) M-x XLS ## Load a buffer to work from C-x C-f todays_work.lsp ## enter program, functions, and code into work buffer, and send ## entire contents to XLispStat when ready C-c C-b ## Go to *XLS:1* buffer, which is the process buffer, and examine ## the results. C-c C-y ## the above is a shortcut for: C-x b *XLS:1* ## Return to the work buffer (may/may not be prefixed) C-x C-b 971103work.S ## Fix the function that didn't work, and resubmit by placing the ## cursor somewhere in the function and C-c C-f ## Or you could've selected a region (using the mouse, or keyboard ## via setting point/mark) and C-c C-r ## Or you could step through, line by line, using C-c C-n ## Or just send a single line (without moving to the next) using C-c [RETURN] ## where [RETURN] is the return key. ## To fix that error in syntax for the "normal-rand" command, get ## help by C-c C-v normal-rand 2: ## Load the file you want to work with C-x C-f file.lsp ## Edit as appropriate, and then start up XLispStat M-x XLS ## Go back to the file editing buffer C-x b file.lsp ## send regions, lines, or the entire file contents to XLispStat ## (the last one is demonstrated below) C-c C-b ess/doc/ess-intro.tex0000664000175000017500000015146212423756516013162 0ustar eddedd\documentclass{article} \newif\ifMM\MMtrue \MMfalse \newif\ifdraft % During writing: a draft: %\drafttrue % FINAL: \draftfalse \ifMM\drafttrue\fi \ifdraft %% generate tableofcontents down to the \paragraph \setcounter{tocdepth}{5} \fi %1. introduction % a) a statistician's needs % b) statistical analysis packages supported by ESS %2. emacs % a) buffers % b) key sequences % c) modes % 1) font-lock % 2) shell/comint % 3) ange-ftp/EFS/tramp % 4) vc/pcl-cvs %3. ESS % a) interactive % 1) S family % 2) SAS % b) batch % 1) SAS % 2) BUGS % 3) S family %4. ESS as an open-source project % a) origins % 1)S-mode % 2)SAS-mode % b) unification % 1)ESS-mode % 2)Emacs/XEmacs % 3)Unix/Windows/Mac %5. conclusion % a) summary % b) what's next for ESS % ESS internet resources % a) home page % b) ess-help % c) anonymous cvs % References % \ifdraft \addtolength{\topmargin}{-1cm} \addtolength{\textheight}{+1cm} \else%FINAL: \renewcommand{\baselinestretch}{1.5} \fi \addtolength{\oddsidemargin}{-0.5in} \addtolength{\textheight}{0.2in} \addtolength{\textwidth}{1in} \ifMM\addtolength{\textheight}{2cm}\fi %%% \usepackage[authoryear,round]{natbib} %or (if you have an unshiny latex installation) %\newcommand{\citep}[1]{{\{\sf#1\}}} %%% \usepackage{alltt} %% Postscript fonts \usepackage{times} \usepackage{graphicx} %\usepackage{psfig} \ifx\pdfoutput\undefined %% Stuff wout hyperref \def\url#1{\stexttt{#1}} % To help fit in lines ?AJR: stextsf? \else %% Stuff with hyperref \usepackage{hyperref} %%\hypersetup{backref,colorlinks=true,pagebackref=true,hyperindex=true} \hypersetup{backref,colorlinks=false,pagebackref=true,hyperindex=true} \fi %%---End of package requiring ---------- Own Definitions ------------- \newcommand*{\regstrd}{$^{\mbox{\scriptsize{\textregistered}}}$} \newcommand*{\tm}{$^{\mbox{\scriptsize\sc tm}}$} \newcommand*{\SAS}{\textsc{SAS}} \newcommand*{\Splus}{\textsc{S-Plus}} \newcommand*{\XLispStat}{\textsc{XLispStat}} \newcommand*{\Stata}{\textsc{Stata}} \newcommand*{\Rgui}{\textsc{Rgui}} \newcommand*{\Perl}{\textsc{Perl}} \newcommand*{\Fortran}{\textsc{Fortran}} \newcommand*{\Scmt}[1]{\hbox{\qquad {\footnotesize \#\#} \textsl{#1}}} \newtheorem{defn}{Definition}[section] \newtheorem{ex}{Example}[section] \newcommand{\stexttt}[1]{{\small\texttt{#1}}} \newcommand{\ssf}[1]{{\small\sf{#1}}} \newcommand{\elcode}[1]{\\{\stexttt{\hspace*{2em} #1}}\\} \newcommand{\file}[1]{`\stexttt{#1}'} \newcommand{\US}{{\char'137}} % \tt _ \newcommand{\marpar}[1]{\marginpar{\raggedright#1}} \newenvironment{Salltt}{\small\begin{alltt}}{\end{alltt}} \newcommand{\emptyfig}{ \hspace*{42pt}\rule{324pt}{.25pt}\\ \hspace*{42pt}\rule{.25pt}{10pc} \rule{316pt}{.25pt} \rule{.25pt}{10pc}} \ifMM\newcommand{\ESSfig}[1]{\centering{#1}} \else\newcommand{\ESSfig}[1]{\centering\ifdraft\emptyfig\else{#1}\fi} \fi %% Use \begin{Comment} .. \end{Comment} for internal comments \ifdraft \newenvironment{Comment}{\begin{quote}\small\itshape }{\end{quote}} % \else %% this requires \usepackage{verbatim} \let\Comment=\comment \let\endComment=\endcomment \fi %%--------------------------------------------------------------- Start Text \title{Emacs Speaks Statistics (ESS): A multi-platform, multi-package intelligent environment for statistical analysis} %%For blinded submission: %\author{anonymous} %%For regular review: \author{A.J. Rossini \and Richard M. Heiberger \and Rodney A. Sparapani \and Martin M{\"a}chler \and Kurt Hornik \footnote{% %% A.J. Rossini is Research Assistant Professor in the Department of Biostatistics, University of Washington and Joint Assistant Member at the Fred Hutchinson Cancer Research Center, Seattle, WA, USA \url{mailto: rossini@u.washington.edu}; %% Richard M. Heiberger is Professor in the Department of Statistics at Temple University, Philadelphia, PA, USA \url{mailto: rmh@temple.edu}; %% Rodney A. Sparapani is Senior Biostatistician in the Center for Patient Care and Outcomes Research at the Medical College of Wisconsin, Milwaukee, WI, USA \url{mailto: rsparapa@mcw.edu}; %% Martin M{\"a}chler is Senior Scientist and Lecturer in the Seminar for Statistics, ETH Zurich, Zurich, Switzerland \url{mailto: maechler@stat.math.ethz.ch}; %% Kurt Hornik is Professor in the Institut f{\"u}r Statistik, Wirtschaftsuniversit{\"a}t Wien and the Institut f{\"u}r Wahrscheinlichkeitstheorie und Statistik, Technische Universit{\"a}t Wien, Vienna, Austria \url{mailto: Kurt.Hornik@R-project.org}}} %%\date{\today} \date{$ $Date: 2003/10/22 17:34:04 $ $\tiny Revision: 1.255$ $} \begin{document} %%\ifpdf %% \DeclareGraphicsExtensions{.jpg,.pdf,.png,.mps} %%\fi %%%% To cite everything %%\nocite{*} \ifdraft \setcounter{page}{0} %%\newpage \tableofcontents \fi \maketitle \ifdraft{}%% large line skip -- not for draft \else%FINAL: \renewcommand{\baselinestretch}{1.5} %%- \baselineskip=2pc \fi \begin{abstract} Computer programming is an important component of statistics research and data analysis. This skill is necessary for using sophisticated statistical packages as well as for writing custom software for data analysis. Emacs Speaks Statistics (ESS) provides an intelligent and consistent interface between the user and software. ESS interfaces with SAS, S-PLUS, R, and other statistics packages under the Unix, Microsoft Windows, and Apple Mac operating systems. ESS extends the Emacs text editor and uses its many features to streamline the creation and use of statistical software. ESS understands the syntax for each data analysis language it works with and provides consistent display and editing features across packages. ESS assists in the interactive or batch execution by the statistics packages of statements written in their languages. Some statistics packages can be run as a subprocess of Emacs, allowing the user to work directly from the editor and thereby retain a consistent and constant look-and-feel. We discuss how ESS works and how it increases statistical programming efficiency. \end{abstract} \noindent Keywords: Data Analysis, Programming, S, \SAS, \Splus, R, \XLispStat, \Stata, BUGS, Open Source Software, Cross-platform User Interface. \section{Introduction} \label{sec:introduction} Most statistical research activities, particularly data analysis and communication, involve some form of computing. The computer user interface is thus placed in the central role of facilitating statistical tasks. While presentation of character and graphical information is the most visual component of a user interface, perhaps a more critical component is how the computer interprets user input. A familiar, well-understood set of input behaviors can provide large gains in efficiency. This paper introduces Emacs Speaks Statistics (ESS) \citep{ESS}, a software package which provides a common interface to a variety of statistical packages on the most common computing platforms. ESS is an interface to statistical packages that provides tools which facilitate both statistical software development and data analysis. ESS provides assistance with both writing and evaluation of analysis code for both interactive and batch statistical packages. ESS currently supports the S family of languages (including S \citep{BecRCW88,ChaJH92,ChaJ98}, \Splus\regstrd\ \citep{Splus}, and R \citep{ihak:gent:1996,R}; \SAS\regstrd\ \citep{SAS:8}; \Stata\ \citep{Stata:7.0}; \XLispStat\ \citep{Tier90} and its extensions Arc \citep{Cook:Weisberg:1999} and ViSta \citep{youn:fald:mcfa:1992}; BUGS \citep{BUGS}; and Omegahat \citep{DTLang:2000}. ESS can be extended to accommodate most statistical packages which provide either an interactive command-line or process batch files for instructions. We start by describing the Emacs text editor, the underlying platform on which ESS is built. Next, we discuss how ESS enhances a statistician's daily activities by presenting its features and showing how it facilitates statistical computing. We conclude with a short history of the development of ESS. % and conclude with future extensions and related work. \section{Emacs} \label{sec:emacs} Emacs is a mature, powerful, and extensible text editing system which is freely available, under the GNU General Public License (GPL), for a large number of platforms, including most Unix\regstrd distributions, Microsoft Windows\regstrd\ and Apple Mac\tm\ OS. There are two open-source implementations of Emacs: GNU Emacs \citep{GNU-Emacs} and XEmacs \citep{XEmacs}. Emacs shares many features with word processors, and some characteristics with operating systems, including many facilities which go beyond ordinary text editing. More important to our goals, Emacs can control and interact with other programs. \paragraph{Keyboard and Mouse Input.} When Emacs was originally written, character-based terminals were the most advanced method of computer access. Common Emacs commands were mapped to key sequences, creating keyboard shortcuts for convenience. Over the last decade, Emacs has been extended to use graphical windowing systems, such as X11\tm, Microsoft Windows, and Apple Mac OS, which allow additional forms of input, for example using a mouse, and which encourage multiple applications to share a single display. Presently, Emacs is more often used with a GUI, with commands bound to mouse actions, but having commands also associated with key sequences is an important ergonomic and time-saving feature. Emacs menus and toolbars on the display screen allow mouse access to frequently used actions and provide a graphical alternative when the user does not know or can not recall a key sequence; these are also subject to user-customization. \paragraph{Buffers give Emacs control.} Emacs buffers are the interface between the user and computer. They can be considered to be a collection of scratch pads that both the user and computer can read, write, and respond to. The user can simultaneously edit many files and control numerous programs by opening multiple buffers. With disk files, the working copy of the opened file is placed in an Emacs buffer where it can be viewed and edited either by the user or automatically by Emacs or another program under the control of Emacs. Emacs can save a backup of the contents to disk at specified intervals. Emacs presents buffer contents in ways which optimize reading and navigation activities. One example of program control is the embedding of the interactive operating system command line interpreter, called a shell, within Emacs. Variations on this theme are used to control programs such as statistical packages which take input from and provide output to the command-line. The resulting buffers provide a copy of the entire transcript of the interaction, which can be edited and searched while the program executes. \paragraph{Major and Minor Modes.} Emacs capabilities are extended by loading %% AJR: If we remove ``or byte-compiled'' we need to remove ``text'', %% since it is wrong. %% text %% or byte-compiled files containing commands and functions written in Emacs Lisp (elisp) \citep{RChassell1999}, which is a dialect of Lisp \citep{PGraham:1996}. Emacs commands can be called interactively by pressing a key sequence mapped to the command or by name. %% AJR: this is actually true for M-x long-command-not-bound-to-keys, %% but I'm not telling anyone this! % Rodney: I don't understand what the problem is with telling them. The most important extensions to Emacs take the form of modes, which provide specific enhancements to the editing behavior. Major modes provide a customized environment consisting of mapped key sequences and associated commands for performing tasks such as file editing, reading mail, or browsing disk directories. Only one major mode can be active for a given buffer at any time. Major modes also can be written to intelligently control other programs such as statistics packages. Major modes for file editing are often determined by the file type or extension, i.e. the characters at the end of the file name that follow a period like \stexttt{txt}, \stexttt{s}, or \stexttt{sas}. Examples of this kind of major mode are \stexttt{ESS[S]} and \stexttt{ESS[SAS]}. Major modes understand a file's syntax and grammar and therefore provide intelligent actions such as automatic indentation; navigation in units of characters, words, lines, sentences, paragraphs, function definitions, and pages; syntax-based fontification and colorization; and reformatting based on programmed conventions. Minor modes provide complementary services that that are applicable across major modes. Many minor modes can be active at once. For example, \stexttt{font-lock-mode} allows Emacs to highlight, with fonts or colors, the syntax of a programming language whose characteristics are described within a major mode like \stexttt{ESS[S]}. The \stexttt{overwrite-mode} determines whether typed characters replace the existing text or are inserted at the cursor. Minor modes can emulate the key sequences used by another editor such as \stexttt{vi}. In addition, they can be used to perform version control operations and many other operations which are nearly identical across file types. \paragraph{Network Support.} Emacs allows transparent access to remote files over a network. This means that the user views, edits, and saves files on a remote machine exactly as if they were on the local machine. Mechanisms for both open (\stexttt{ange-ftp} and \stexttt{EFS} use ftp) and secure (\stexttt{tramp} uses scp or ssh) access are available. Emacs can also monitor and control remote processes running in a shell buffer. \paragraph{Editing Extensions.} Most programming and documentation tasks consist of editing text. These tasks can be enhanced by contextual highlighting and recognition of special reserved words appropriate to the programming language in use. In addition, Emacs also supports folding, outlining, tags, and bookmarks, all of which assist with maneuvering around a file. Emacs shares many features with word processing programs and cooperates with markup-language document preparation systems such as \LaTeX, \textsc{html}, or \textsc{xml}. Tracking changes to a text file made by multiple users, potentially in different locations, is the job of source-code control programs. Emacs interacts with standard source-code control programs such as CVS, RCS, and SCCS through minor modes such as \stexttt{vc-mode}. These source-code control systems facilitate documenting and tracking edits and changes to a file. More importantly, they allow for branching and merging of versions so that material present in an older version of the file can be recovered and inserted into a newer version in a fairly easy manner. \begin{figure}[tbp] % \ESSfig{\includegraphics[angle=270,width=\textwidth]{ediff-sas}} \url{http://www.analytics.washington.edu/downloads/ess/doc/figures/ediff-sas.gif} \caption{Ediff of two versions of a file.} \label{f.ediff} \end{figure} Comparison of files, two or three drafts of a paper for example, is simplified by \stexttt{ediff}. An example is shown in Figure \ref{f.ediff}. The lines that are similar are highlighted in the two buffers, one for each file, and the specific words that mismatch are highlighted in a contrasting color. \stexttt{ediff} has many tools for working with the differences in files and in entire directories. When combined with the patch utility or a source-code control system, it provides the user with the ability to insert, delete or modify only the differing portions of text files. % Rodney: You can't just mention complex functionality like etags and % speedbar. We would need to introduce these packages. Since they % aren't critical to ESS at this time, let's ignore them. Emacs has many other important features. Emacs provides file-manager capabilities, such as \stexttt{dired} (discussed in Major and Minor Modes above) and \stexttt{speedbar}, both of which interface to the computer's directory structure. Emacs stores the complete history of commands issued in an editing session, allowing a flexible and fairly complete undo capability. More importantly, for modes which control processes, the process input history is stored for recall as well as for later editing for printing or re-use. Emacs also includes web browsers, mail/newsgroup readers, and spell checking. In addition to being an extremely powerful editor, Emacs also includes capabilities usually found in an operating system. Thus, it provides a strong foundation for constructing an integrated development environment focused on the needs of statisticians. Emacs' power, flexibility, portability, and extensibility make it a solid platform on which to construct a statistical analysis user interface. \section{ESS extends Emacs} \label{sec:ess-extends-emacs} Statistical programming is the writing of computer programs for data analysis and processing. These programs might be written in a computer language that requires a compiler, such as \Fortran\ or C. But, more likely, they are written in a statistical analysis language that only requires an interpreter such as R, \SAS, \Stata, or \XLispStat. General purpose languages such as \Fortran, C/C++, Java, and PERL have integrated development environments which facilitate writing and debugging code. ESS extends Emacs to provide an integrated development environment for statistical languages. It offers a single interface for a variety of statistical computing tasks including interactive data analysis and statistical programming. ESS is able to provide a functional and extensible interface which is uniform and consistent across multiple statistical packages. This is done by adding shortcuts and features for accelerated editing of files as well as by interacting with the particular statistical packages to provide, for example, control of input/output, assistance with evaluation, and specialized parsing of help files. ESS supports the S family (S, \Splus, and R) interactively. \SAS\ and BUGS are also well supported for batch processing. \Stata\ and \XLispStat\ (including ARC and ViSta) are supported through highlighting and process-interfacing. \subsection{Features and capabilities} \label{sec:ESS:features} \paragraph{Syntactic highlighting and indentation of source code.} The programmers task is eased when language constructs (such as reserved words, function calls, strings, and comments) are visually identifiable and when lines of code are automatically indented to a depth appropriate to their context (e.g., if--then clauses, loops). ESS provides both of these to the programmer by including a description of the syntax of each supported statistical language in the form used by \stexttt{font-lock-mode}. Figure \ref{f.font} shows an example of font-locking a complicated S statement. The top panel shows an \stexttt{if} statement with a long expression in the condition and a multi-line consequence. The keyword \stexttt{if} is shown in purple, the string \stexttt{"deltat"} in RosyBrown. The comments are in red. Everything else is in the standard font. The consequence is indented and the continuations of the consequence are further indented. The matching parentheses are shown in green. The cursor is indicated by a solid box. In the bottom panel, we replaced the matching parenthesis with an unbalanced bracket. Emacs immediately marks that with the paren-mismatch font, bright purple in this example. On a black and white terminal we would use bold, underline, italic, and reverse-video, rather than colors, to distinguish the fonts. % Figure \ref{f.font} shows a black-and-white example of font-locking a % complicated S statement. The top panel shows an \stexttt{if} % statement with a long expression in the condition and a multi-line % consequence. The keyword \stexttt{if} is shown in an underlined font, % the string \stexttt{"deltat"} in an italic underlined font. The % comments are in an italic font. Everything else is in the standard % font. The consequence is indented and the continuations of the % consequence are further indented. The matching parentheses are marked % by a bold foreground and a shaded background. The cursor is indicated % by a solid box. In the bottom panel we replaced the matching % parenthesis with an unbalanced bracket. Emacs immediately marks that % with the paren-mismatch font, bright purple on % a color terminal. The font selection and the indentation depth are automatically supplied by Emacs as the lines are typed. The user has several options for mapping of colors or fonts to each of the syntactic types. We selected % black-and-white font-mapping for display here. On a color terminal % we might use purple for the keywords, red for comments, green for matching parens, and inverse-video purple for mismatched parens. Emacs makes default choices of colors and ESS provides several other optional schemes. \begin{figure}[tbp]%h % \ESSfig{% % \includegraphics[angle=270,width=\textwidth]{font-cor-s} % \includegraphics[angle=270,width=\textwidth]{font-incor-s}% % } \url{http://www.analytics.washington.edu/downloads/ess/doc/figures/font-cor-s.jpg} \url{http://www.analytics.washington.edu/downloads/ess/doc/figures/font-incor-s.jpg} \caption{We illustrate here with fonts and colors appropriate for a color display. On a black and white terminal we would use bold, underline, italic, and reverse-video. On a color terminal we would use a selection of colors.} \label{f.font} \end{figure} Since S syntax is similar to that of C, ESS uses the Emacs tools for reformatting S code to match particular styles. Common C format styles, as well as locally customized styles, are defined by specifying the indentation level for nested statements, location of open-braces (at the end or at the beginning of a line), indentation offsets for if-then-else constructs, and similar characteristics. Syntax highlighting can be used to help enforce coding standards. Figure \ref{f.hilock} illustrates a standard for \SAS\ programming that says all \stexttt{PROC} statements must use the \stexttt{DATA=datasetname} option. \begin{figure}[tbp] % \ESSfig{\includegraphics[angle=270,width=\textwidth]{hilock-sas}} \url{http://www.analytics.washington.edu/downloads/ess/doc/figures/hilock-sas.gif} \caption{Enforce coding standards. The standard here is that all \stexttt{PROC} statements must use the \stexttt{DATA=datasetname} option. Lines that satisfy the standard turn green, lines that don't turn red. Ambiguous ones turn yellow.} \label{f.hilock} \end{figure} \paragraph{Process interaction.} Emacs has historically referred to processes under its control as ``inferior'', accounting for the name inferior ESS (\stexttt{iESS}) to denote the mode for interfacing with the statistical package. Figure \ref{f.ess-demo} shows the S language program \stexttt{ess-demo.s} in the top buffer in \stexttt{ESS[S]} mode and the executing R process in the bottom buffer \stexttt{*R*}. The \stexttt{iESS} major mode of the \stexttt{*R*} buffer is crafted for command-line editing. This mode remembers and uses the command history, allowing for the recall and searching of previously entered commands. Filename completion for local directories is also available. \begin{figure}[tb] % \ESSfig{\includegraphics[angle=270,width=\textwidth]{ess-demo}} \url{http://www.analytics.washington.edu/downloads/ess/doc/figures/ess-demo.jpg} \caption{Line-by-line execution of a command file. The cursor is placed on a line in the \stexttt{ESS[S]} buffer and then with a single key sequence the line is sent to the \stexttt{*R*} buffer for execution. The output of the package goes directly to the editable \stexttt{*R*} buffer.} \label{f.ess-demo} \end{figure} \paragraph{Source-level Debugging.} ESS facilitates the editing of source code files, sets of commands written for a statistical analysis package, and allows the user to load and error-check small sections of source code into the package. This is done through several mechanisms. First, the presence of unbalanced parentheses or mismatched/unterminated quotes is immediately evident with syntactic highlighting of the source code. Second, functions are provided for simple and consistent execution of user-specified or natural units of the code (function definitions in S or \XLispStat, \stexttt{PROC \dots\ RUN;} sections in \SAS). An error-free evaluation lets the user execute the next section of code; if errors arise, the user edits the current unit and re-evaluates. Once the code is verified, an entire buffer, or file, of code can be sent to the package as a unit. This file can also be used as a batch file for routine analysis at a later time. Finally, output from the statistics package is normally captured directly by Emacs and placed into a buffer from where it can be edited and searched. Particular forms of output such as requests for help pages and log-file output can be diverted into special buffers with modes crafted to facilitate reading. These modes include tools for automatically placing the cursor on the first \stexttt{ERROR}, for example in \SAS\ and S. \paragraph{Interactive transcripts.} A transcript records all commands entered by the analyst and the corresponding text-based responses such as tables and comments generated by the statistics package during an interactive statistical analysis session. Once a transcript file is generated, for example by saving an \stexttt{iESS} buffer, \stexttt{transcript-mode} assists with reuse of part or all of the entered commands. ESS understands the transcript's syntax, especially the potential prompt patterns used during the interactive analysis. ESS provides tools to facilitate editing and re-evaluating the commands directly from the saved transcript. This is useful both for demonstration of techniques and for reconstruction and auditing of data analyses. Special ESS functions can ``clean'' S language transcripts by isolating all input lines and placing them in a new S language source file. Transcript cleaning facilitates the use of an exploratory interactive analysis session to construct functions and batch files for routine analysis of similar data sets. \paragraph{Remote access to statistics packages.} ESS provides transparent facilities for editing files and running programs which might reside on numerous remote machines during the same session. The remote machine could be a different platform than the local machine. \paragraph{Manipulating and Editing Objects (S family).} For languages in the S family, ESS provides object-name completion of both user- and system-defined functions and data. ESS can dump and save objects (user- and system-generated) into formatted text files, and reload them (possibly after editing). \paragraph{Help File Editing (R).} ESS provides an R documentation mode (\stexttt{Rd-mode}) which assists in writing help files for R functions, objects, and other topics worth documenting. \stexttt{Rd-mode} provides the ability to view and execute code embedded in the help file in the same manner as ESS handles code from any S language source file. It provides syntax highlighting and the ability to submit code directly to a running ESS process, either R or \Splus, for evaluation and debugging. This latter feature is useful for ensuring that code developed using R runs under \Splus. \paragraph{Cooperation across Multiple Tools.} Statistical packages are intended for either general statistical analyses or for specialized forms of statistical analyses. The specialized statistical packages can be far more efficient for their intended activities, but this is balanced by their inability to perform a wide range of general statistical functions. Tightly coupled inter-operability between general and specialized packages rarely exists, but such a facility is often desired. For example, a general purpose package such as R does not perform Bayesian analyses as easily as BUGS does. On the other hand, BUGS lacks breadth in the range of analyses and results it can generate. For this reason, BUGS is often distributed with R packages, like the diagnostic packages CODA and BOA, which assist with importing and analyzing the results in R. Another point of contention is the difference in the interfaces between general packages and specialized packages. ESS helps by providing a single point of contact to both tools, though the typical interfaces (interactive for R, batch for BUGS) are different. %\item[Rodney:] I can't speak for everyone, but the BUGS users I know are % .. lots deleted by AJR %will make sense. Besides, the most pressing need for me is to get %ESS-elsewhere to work with ESS[BUGS] rather than creating inferior-BUGS. %\item[Rich:] How does making ``ESS-elsewhere work with ESS[BUGS]'' differ %from ``creating inferior-BUGS''? My question is predicated on the assumption %that ESS-elsewhere is a (generalized) minor-mode that makes the location %of the program irrelevant. %See my ESS-elsewhere quibble below. %\item[Rodney:] It's the whole batch BUGS vs. interactive BUGS thing. Batch %BUGS with ESS-elsewhere; interactive BUGS with inferior-BUGS which does not %and will never exist. If you want to call ``inferior-ESS'' ``ESS-elsewhere'' %why do you need two different names? ``inferior-ESS'' is a terrible name %so the change would be fine with me, but you can't have it both ways? Is %this why you keep saying that ESS-elsewhere works for SAS? See %response to quibble below. %\item[Rich:] %\stexttt{iESS[SAS]} was designed to mimic as well as possible \stexttt{iESS[S]}. %I need to read doc/README.SAS to make sure all of its options are represented %here. --- Not yet done. %\end{description} %\end{Comment} \paragraph{Simplifying Keymap Differences.} Simple conflicts between interfaces are exemplified by different key sequences for editing tasks such as cut, copy, paste, beginning of line, end of line, etc. These may be the most aggravating because our fingers are typing ``instinctively'', but differences in interfaces circumvent this learned behavior. ESS solves this problem by providing a uniform interface to keyboard actions across the variety of statistical packages that might be used. That is, the same key sequences are used for cursor movement, evaluation, and basic tasks such as loading files for editing. \paragraph{Concurrent Use of Multiple Machines and Operating Systems.} It can be useful to have multiple statistical processes running simultaneously, either on a single machine or a variety of machines. This capability assists with large-scale numerical simulations as well as code design and testing across multiple versions of statistical software packages. \subsection{Interactive Processing.} \label{sec:interactive} The increased popularity of exploratory data analysis as well as the advent of simple GUIs has made interactive data analysis an important component to statistical practices. ESS uses three different approaches for communicating with statistical packages. \paragraph{Inter-Process Communication.} Packages that use the command-line interface are run as an inferior process in an Emacs buffer, with the standard input and output of the package redirected to the buffer. Packages that do not use the command-line interface must be run as an independent process, possibly with limited cooperation. ESS can use the Windows DDE (Dynamic Data Exchange) protocol to provide one-way communication directly to packages which function as a DDE server. ESS can control the actions of the package, but it can not capture the results directly. Transcripts must be physically copied to an Emacs buffer to get the transcript editing features. Statistical packages that use neither the standard input/standard output protocol nor DDE can not be directly controlled by Emacs. But, ESS can still provide an editing environment for these statistical languages. The user must either manually cut and paste the edited code into the package or save the edited files and run them in a batch environment. The Microsoft Windows versions of \SAS, \Stata, and \XLispStat\ are in this category. One useful extension in ESS is relaxation of the requirement that the statistics program be available on the local machine. ESS provides both transparent editing of files and execution of statistics packages on a remote machine with \stexttt{iESS[S]} or \stexttt{iESS[SAS]} (see below). All the editing and interaction features described for the local machine work equally well on the remote machine. The interaction, including all the unique features of working with ESS, appears to the user as if the program were running on the local %rmh: The interaction ... appears .... machine. If the X11 Windowing system is running on the local machine, it is even possible to bring up visual displays and graphics from remote Unix systems onto a local Microsoft Windows or Apple Mac display. \paragraph{Interactive S family} ESS for S family statistical languages, \stexttt{iESS[S]}, replaces the \Splus\ Commands window or the R GUI window. In addition to running the S family language process, \stexttt{iESS[S]} mode provides the same editing features, including syntactic highlighting and string-search, as the editing mode \stexttt{ESS[S]}. It also provides an interactive history mechanism; transcript recording and editing; and the ability to re-submit the contents of a multi-line command to the executing process with a single keystroke. \stexttt{iESS[S]} is used with S, \Splus, and R on Unix and with Sqpe and R on Windows. The \Splus\ GUI on Windows can be a DDE server. There are two advantages to using even this limited communication with the \Splus\ GUI through ESS. First, through \stexttt{ESS[S]} mode the user gets the full editing capabilities of Emacs. Second, S language commands % rmh: S, not \Splus, in both places. The {\it language} is S. % The previous session could be R or ATT S. It is not restricted to \Splus. are sent from the editing mode \stexttt{ESS[S]} buffer and from transcript buffers from previous S sessions directly to the GUI Commands window with the same Emacs key sequences as are used with ESS on Unix. Hence the user can work in a powerful editing environment and is protected from the delay and ergonomic challenges of using the mouse for copy and paste operations across windows. \paragraph{Interactive \SAS.} \stexttt{iESS[SAS]} is a mode that allows text-based \stexttt{PROC} by \stexttt{PROC} interaction with an inferior buffer running an interactive \SAS\ session on either the local or a remote computer. \stexttt{iESS[SAS]} mode works by redirecting standard input and output from \SAS\ to ESS. Currently, the \stexttt{iESS[SAS]} mode can run on any computer, but the \SAS\ process it is controlling must be running on a Unix machine. This process is very efficient for dial-up network connections to a remote computer with \SAS\ installed. The resulting interface is similar to the SAS character terminal interface, but with Emacs key sequences. %Rodney: What is this paragraph about? I'm going to comment it out %because I don't recognize what it is supposed to be. Maybe somebody %can fix it later. % % rmh: Round umpteen. Yes, this is redundant with the third paragraph % of interprocess communication. I still want it here. Try this rephrasing. % \stexttt{ESS[SAS]} mode can be used in conjunction with the \SAS\ Display Manager to allow simultaneous access to Emacs for editing \SAS\ language code and to the \SAS\ mouse-based interfaces to the graphical routines and help system. %%%%% AJR: WHY IS THIS SUBSTANTIALLY DIFFERENT THAN BATCH? I KNOW ITS %%%%% SLIGHTLY DIFFERENT, BUT SUBSTANTIALLY? %%%%% rmh: this is a form of interaction, not batch. I restored the %%%%% first paragraph with some expansion. %\paragraph{\SAS---Interactive cooperation with the \SAS\ Display Manager.} %ESS users who write data analysis code in \stexttt{ESS[SAS]} mode in Emacs %often need to work with the \SAS\ Display Manager's %mouse-based interface to the graphical %routines, the help system, and other non-text-based features. %%The authors of ESS prefer the Emacs environment for %%the text-file interaction with \SAS, that is with editing and %%managing input command files and output listing and log files, %%even on computer systems which run %%the \SAS\ Display Manager environment. %In this situation, the user %designs the command file in \stexttt{ESS[SAS]} mode and highlights %regions to be forwarded to \SAS\ for processing. %% %% Rodney: I don't see this as a feature of either ESS or emacs. And, %% what the authors prefer is certainly not germane. %% %% %% rmh: This is my preferred mode for interacting with SAS. I tried another %% rephrasing. It {\it is} a feature of ESS. ESS is able to provide ESS[SAS] %% mode for the text processing (.sas .lst. log files) and simultaneously %% let the user have interactive graphical access. %%This can be done by either: %%\begin{enumerate} %%\item copying and pasting the marked regions to the \SAS\ Editor window %% and then pressing the \stexttt{RUN} button. Highlighted sections of %% the \SAS\ Listing window are brought back to Emacs to be read in the %% \stexttt{ESSlst} mode editing environment. %%\item submitting the marked region for Batch File Processing (see the %% next section) but using the mapped key sequences to append to the log %% and listing files instead of replacing them. %%\end{enumerate} \subsection{Batch File Processing.} \label{sec:batch-file} Batch file processing with statistical analysis packages is a better choice than interactive processing when the execution times are longer than the user is willing to wait as well as for regularly updated statistical reports and figures. ESS provides a means to shorten the debugging cycle for writing code intended for batch evaluation by containing the whole process, both writing and evaluation, within Emacs. \paragraph{Batch \SAS.} \label{sec:sas-batch} \SAS\ is a popular choice for processing and analyzing large amounts of data. However, interactive \SAS\ is rarely used in these situations due to the length of time involved. Instead, a file containing \SAS\ commands is created and \SAS\ executes these commands in the background, or batch, while the user moves on to other activities. ESS facilitates \SAS\ batch with \stexttt{ESS[SAS]}, the mode for files with the \stexttt{sas} extension. ESS defines \SAS\ syntax so that \stexttt{font-lock-mode} can highlight statements, procedures, functions, macros, datasets, comments and character string literals in \SAS\ programs. Optionally, the same language features are highlighted in the \SAS\ log with the addition of log notes, warnings and error messages. For files with the \stexttt{sas} extension, ESS binds the function keys in \stexttt{ESS[SAS]} mode to match the definitions used by \SAS\ Display Manager. These definitions are optionally available in all modes. They are particularly useful when viewing \SAS\ log and listing files (with extensions of \stexttt{log} and \stexttt{lst} respectively). Only one function key press is needed to submit a \SAS\ batch process. Other function keys open the \SAS\ program, the \SAS\ log and the \SAS\ listing buffers. When accessed in this manner, the \SAS\ log and \SAS\ listing buffers are automatically updated since they may have been appended or over-written by the \SAS\ batch process. In addition, the \SAS\ log is searched for error messages and the error messages, if any, are sequentially displayed with consecutive key presses. Another function key opens a \SAS\ permanent dataset for editing or viewing. An option is provided so that the tab and return keys operate in typewriter fashion like they do in \SAS\ Display Manager. This option also defines a key to move the cursor to a previous tab-stop and delete any characters between its present position and the tab-stop. This is a \SAS\ Display Manager feature that is not typically available in Emacs. The \SAS\ batch process runs on the computer where the \SAS\ program resides. This is important because any \SAS\ permanent datasets referenced in a \SAS\ program only exist on the computer running \SAS. If the \SAS\ program resides on a remote computer, then the log and listing are also accessed remotely. The net result is that running \SAS\ batch on remote computers is nearly transparent to the ESS user. %\begin{Comment} %Rich's version: %\end{Comment} %The \SAS\ batch process can run on the same computer on which the %emacs session is running or it can run on a remote computer. For %remote jobs, files are transparently saved (with ftp or scp or kermit) %and the batch process is transparently submitted through a telnet or %ssh connection. %\begin{Comment} %Rich: I have some terminology quibbles here with how the term %``ESS-elsewhere'' is used with SAS BATCH. I think of S-elsewhere or %ESS-elsewhere as a trick to make a \stexttt{telnet-mode} buffer think %it is \stexttt{iESS-mode} buffer. %I don't think of file saving, editing, and retrieval as an example %of ESS-elsewhere. Neither is submission of the remote job; %that is just an ordinary shell command in an ordinary shell buffer. %M-x SAS probably is an example of ESS-elsewhere, but I %designed it before I thought of the ESS-elsewhere concept. %The initial idea behind S-elsewhere was to run an interactive S or S-Plus %session on a remote computer in telnet (or equivalent) buffer. The trick %was to make the \stexttt{telnet-mode} buffer accept C-c C-n and %related commands from the \stexttt{S-mode} buffers. Hence I had to %make the \stexttt{telnet-mode} buffer think it is \stexttt{iESS-mode} %buffer. The ``elsewhere'' part of the name is entirely related to a %different start up procedure. Once the connection is made, there is %{\em no} difference visible to the user. The buffer shows itself to %be an ordinary \stexttt{iESS} buffer. Tony generalized S-elsewhere %to ESS-elsewhere to allow other languages than S to be used %interactively. %I have been using ESS for SAS remote BATCH for years, ever since you %and I started working on this together. We initially defined %ess-sas-submit-method to encapsulate the location of the sas process. %Except for a few lines of elisp to get the connection started, the user %behavior has been identical whether the SAS process is on the same or %different machine. Since we are not interactively talking to the SAS %process in an inferior-ESS buffer I don't see this as ESS-elsewhere. %Rodney: Remote submissions of SAS batch jobs never worked. I only got %it to work a couple of weeks ago. The problem was with the cd command. %You need to ignore the beginning and end of the expanded buffer name %that are the ange-ftp/EFS/tramp stubs which tell Emacs what the remote %username and hostname are. I find the batch usage of ESS-elsewhere %entirely consistent with the interactive behavior. OTOH, I don't find %the terminology particularly illuminating. I think ESS-remote or %ESS-net would be more meaningful. %\end{Comment} \paragraph{Batch BUGS.} BUGS software performs Markov Chain Monte Carlo integration. There is an interactive capability, but it is not often used since the analyses can be very time-consuming. Most BUGS programs are executed as batch processes. ESS facilitates BUGS batch with \stexttt{ESS[BUGS]}, the mode for files with the \stexttt{bug} extension. ESS provides 4 features. First, BUGS syntax is described to allow for proper fontification of statements, distributions, functions, commands and comments in BUGS model files, command files and log files. Second, ESS creates templates for the command file from the model file so that a BUGS batch process can be defined by a single file. Third, ESS provides a BUGS batch script that allows ESS to set BUGS batch parameters. Finally, key sequences are defined to create a command file and submit a BUGS batch process. \paragraph{Batch S family.} ESS provides 2 facilities for batch processing of S family language files. The first is to execute the contents of a file using buffer-evaluation. This differs from interactive processing only by the number of commands being evaluated; errors can be found by examining the resulting transcript. The second is the load-source mechanism, which provides a means of jumping to errors in the source file, but doesn't display the evaluated commands in the transcript. These mechanisms provide different tools for debugging the source files. \section{History of ESS} \label{sec:ESS:history} ESS is built on Emacs, the editing system for which Richard Stallman won a MacArthur Foundation Fellowship in 1990. Emacs has a long history of being a programmer's editor. Many statisticians got their first taste of the power of Emacs with \Fortran\ mode which was introduced in 1986. As statisticians' preferences changed from generalist compiled languages such as \Fortran\ to specialist statistical analysis packages like S and \SAS, Emacs modes soon followed. The ESS environment is built on the open-source projects of many contributors, dating back over 10 years. Doug Bates and Ed Kademan wrote S-mode in 1989 to edit S and \Splus\ files in GNU Emacs. Frank Ritter and Mike Meyer added features, creating version 2. Meyer and David Smith made further contributions, creating version 3. For version 4, David Smith provided significant enhancements to allow for powerful process interaction. John Sall wrote GNU Emacs macros for \SAS\ source code around 1990. Tom Cook added functions to submit jobs, review listing and log files, and produce basic views of a dataset, thus creating a SAS-mode which was distributed in 1994. In 1994, A.J. Rossini extended S-mode to support XEmacs. Together with extensions written by Martin M{\"a}chler, this became version 4.7 and supported S, \Splus, and R. In 1995, Rossini extended SAS-mode to work with XEmacs. In 1997, Rossini merged S-mode and SAS-mode into a single Emacs package for statistical programming; the product of this marriage was called ESS version 5. Richard M. Heiberger designed the inferior mode for interactive \SAS\ and SAS-mode was further integrated into ESS. Thomas Lumley's Stata mode, written around 1996, was also folded into ESS. More changes were made to support additional statistical languages, particularly \XLispStat. ESS initially worked only with Unix statistics packages that used standard-input and standard-output for both the command-line interface and batch processing. ESS could not communicate with statistical packages that did not use this protocol. This changed in 1998 when Brian Ripley demonstrated use of the Windows Dynamic Data Exchange (DDE) protocol with ESS. Heiberger then used DDE to provide interactive interfaces for Windows versions of \Splus. In 1999, Rodney A. Sparapani and Heiberger implemented \SAS\ batch for ESS, which relies on files rather than standard-input/standard-output, on Unix, Windows and Mac. In 2001, Sparapani added BUGS batch file processing to ESS for Unix and Windows. This history is summarized in Table \ref{tab:timeline}. \begin{table}[tbp] \centering {\scriptsize \begin{tabular}{c ll c ll} \hline Year \\ \hline & \multicolumn{2}{c}{S-mode} && \multicolumn{2}{c}{SAS-mode} \\ \cline{2-3} \cline{5-6} 1989 & v.1 & (GNU Emacs, Unix, S/S+) && \\ 1990 & & && & (GNU Emacs, Unix, SAS editing) \\ 1991 & v.2 & (GNU Emacs, Unix, S/S+) && \\ 1993 & v.3 & (GNU Emacs, Unix, S/S+) && \\ 1994 & v.4 & (GNU Emacs/XEmacs, Unix, S/S+) && v.1 & (GNU Emacs, Unix, SAS batch) \\ 1995 & v.4.7 & (GNU Emacs/XEmacs, Unix, S/S+/R) && v.2 & (GNU Emacs/XEmacs, Unix, SAS batch) \\ \cline{2-6}\\[-3.5ex] \cline{2-6} & \multicolumn{5}{c}{Emacs Speaks Statistics (ESS)} \\ \cline{2-6} &\multicolumn{2}{c}{Emacs, Operating Systems} &&\multicolumn{2}{c}{Additional Functionality}\\ \cline{2-3} \cline{5-6} 1997 & v.5.0 & (GNU Emacs/XEmacs, Unix) &&& Stata, XLispStat, SAS interactive \\ 1998 & v.5.1.1 & (GNU Emacs/XEmacs, Unix/Windows) &&& S+elsewhere; Windows: S+/R\\ 1999 & v.5.1.10 & (GNU Emacs/XEmacs, Unix/Windows/Mac) &&& SAS batch; Omegahat \\ 2001 & v.5.1.19 & (GNU Emacs/XEmacs, Unix/Windows/Mac) &&& Unix/DOS: BUGS batch; Mac: R \\ %% 2002 & v.5.1.20 & (Emacs/XEmacs, Unix/Windows/Mac) &&& Unix/DOS: BUGS batch, Mac: R \\ %% 2002 & v.5.2 & (Emacs/XEmacs, Unix/Windows/Mac) &&& ? \\ \hline \end{tabular} } \caption{History and Ancestors of ESS} \label{tab:timeline} \end{table} %\section{Future Work} %%%There are two active areas of extensions for user environments. One %%%is to enhance the capabilities of the IDE for statistical practice; %%%this includes implementing such common IDE features as object %%%browsers, tool-tips, and interfacing cleaning. The other is to target %%%appropriate potentially useful programming methodologies for transfer %%%to statistical practice. %%% %%%Literate Programming methodologies \citep{Knuth:1992,NRamsey:1994} are %%%a natural fit for statistical practice. We refer to the application %%%to statistical analysis as Literate Statistical Practice %%%\citep{rossini:dsc:2001}. The tools used are Noweb %%%\citep{NRamsey:1994} and either \LaTeX, \textsc{html}, or \textsc{xml} %%%for documenting and explaining the analysis. This approach to %%%programming encourages the use of a literary documentation style to %%%explain the programming code for the data analysis. The program can %%%then be extracted from the documentation text for realizing the %%%statistical analysis. %%future enhancement perhaps %%ESS provides the same ESS-elsewhere support for BUGS batch %%that it does for \SAS\ batch (see above). %Important extensions which should be implemented in future %versions include class browsers, analysis templates, tool-tips, and %similar features. Class browsers can be thought of as a tree or %outline for presenting datasets, variables and functions in the %context of what they represent; this allows for rapid and appropriate %inspection. Analysis templates would allow statistics centers and %groups to provide standardized templates for initiating an analysis. %Additional statistical packages can easily be added to ESS. %%While most IDE features have been developed for object-oriented %%languages, the above also can apply to non-object oriented %%programming. %ESS is one of the first Rapid Application Development (RAD) %environments intended for statisticians. It provides \section{Conclusion} \label{sec:concl} ESS provides an enhanced, powerful interface for efficient interactive data analysis and statistical programming. It allows the user complete control over the communications among the files in which the analysis is specified, the statistical process doing the computation, and the output. Because all are within the same programming environment, and therefore are accessed with the same editing and searching concepts and the same key sequences, user efficiency is increased. It is completely customizable to satisfy individual desires for interface styles and can be extended to support other statistical languages and data analysis packages. %\begin{Comment} %Rich: see my discussion of ESS-elsewhere terminology. %What is the behavior for remote SAS that is new for 2002? %Rodney: SAS batch now works and Kermit was added as a method of transfer. %\end{Comment} %ESS-elsewhere provides interactive and batch processing %with \SAS\ running on a remote machine that is accessed over a %network. This provides a powerful development environment for \SAS. %%This %%includes support for syntax highlighting and template-based source file %%generation that provides the capability of specifying all the necessary %%parameters for a BUGS batch run in a single file. \bibliographystyle{plainnat} \pdfbookmark[1]{References}{section.7} %\addcontentsline {toc}{section}{\numberline {}References} \bibliography{ess-intro-graphs} \clearpage \appendix \section{Appendix: ESS Resources on the Internet} %\addcontentsline {toc}{section}{\numberline {}ESS Resources on the Internet} \label{sec:access} \paragraph{Latest Version.} ESS is constantly in flux. New versions of statistical packages, Emacs and operating systems require new releases of ESS to support them. The latest stable version of ESS can be found on the web at \url{http://www.analytics.washington.edu/downloads/ess/}. To get help with problems, send e-mail to \url{mailto: ess-help@stat.math.ethz.ch}. The latest development, hence unstable, version can be obtained by anonymous CVS. First type: \stexttt{cvs -d :pserver:anoncvs@cvs.analytics.washington.edu:/var/anoncvs login} You will be prompted for a password which is ``\stexttt{anoncvs}''. Then type: \stexttt{cvs -d :pserver:anoncvs@cvs.analytics.washington.edu:/var/anoncvs co ess} \paragraph{Additional documentation.} An expanded version of the present paper is in \citep{RMHHS:2001}. A general introduction and usage instructions can be found in \citep{heiberger:dsc:2001}; in addition, one which is more focused on \SAS\ can be found in \citep{heiberger:philasugi:2001}. The documentation that comes with ESS provides details of its implementation as well as examples of its use. \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: ess/doc/hilock-sas.gif0000664000175000017500000002416212423756516013235 0ustar eddeddGIF87aJKў0///?0 / ///00 ?? 000???@@/PP?@@@@O@OOOPPPP_P___`_P_`_``@ooOP_```oo`oooppooppp ПP ░Р/  ААp░░p░┐OpРOРЯя_ЯЯ└ЁАААПППРРРЯЯЯ░░А░░Яппп░░░┐┐┐ррЯ╨╨а╨╨░яяаррпЁЁаЁЁпЁЁ░  ░ЁЁ┐  ┐А└ЁА╧ЁА╧ ЯЁ аЁ ╨╨╨▀▀▀ЁЁ└  └ЁЁ╧  ╧  ▀яяя  рЁЁЁ   !∙,JK@ Щ\"Р ┴БL╚б├ЕJl▒т─И/Z╠╚г╟Н5Кь▓ф╚Р$OЪL╔е╦Х/U╩l │ц╠Ш4o┌╠╔з╧Э?u э ┤ш╨аDПM╩й╙елш╨┴b┼Xс!D>ДDЙвт@UUк░X╦6эZ╖lу╩Э wо▌╗x┘о╨╦wэ^┐}╧,╕Ё_├Б+N╠ШЁb╟НCЮ,╣Єc╦С/k╬╠ЩЄf╧Э1Г-║Їg╙бOлN═ЪЇj╫нQ├Ю-╗Ўk█▒oы╬Э╗╩Тй└Га Т+W>Х°█▀┬гg"Хъa ┴яЕ╦]-Zяu╗╖ U+^n∙Ёр╙╙▐╜Юw√ў╕с│ПO╛}ўїё▀Чп┐?  ∙╕_Аhа&ц█T╦%q╞!╫ s:8Зt╤=uvшсЗ Ж(тИ$ЦhтЙ(житК,╢штЛ0╞(уМ4╓hуН8циуО<Ўш#З ЬРD'dИGЧdСIВ╪фСK"╟аФSF еИQRщрХTJ╔eУN*idЧLNЙdtYfyцШdz╔жПp╞)чЬt╓iчЭxцйgМ@JсчЯАЪ шаДjшбИ&кшвМ6ъшгРF*щдФжeщеШfкщжЬvъщзаЖ*ъидЦjъйижкъкм╢ъъл░╞ *ым┤╞ шнRдE▌з╙UЗkа&Pи░Г;ь▒Вй▓┴╩,▓╨6[мд╠>;э╡МZKi╢╬"лmнрЖ+ю╕фЦkю╣шжлю║ьк·ыЯ║V7aТ╜NїоЯ█цля╛№Ўыя┐О╢+Ё└lЁ┴'мЁ┬Ъ▐ЫkZ:H%q─O▄ч╜ gмё╞wьё╟ З,Є╚н:li┼(O,╒┼яТьЄ╦0╟,є╠4╫l│║&Cмr╩│№+└@Эь╛┌ZЇ╢GcЫo╥Е▐ьЇ╙PG-u═9яlu╧╛▐;┤r├.gtrЗ6ши░\;ыu▒вMl┘╔▓▌(╫`╖ v▄rW 7╙┴Юm6┘kЛ8н╢█yю5╪а&7їсИ'о°тпV═є╒>у╩°фФWn∙хШg▐8╞:?Оrф╖j.·шдЧn·щ.;~ ї╬аК┬ы░╟.√ь┤╫n√э╕чо√ю╝ўю√я└<ъ─o№ёзкю╣┼Y┐√:▓C╗Ї╤W №э╘_?=Ў┤gя¤я┘г~ь▀ы>╛эчЗO¤∙┌гo╛Ё( / №Їп№ъX█{/№№ўя   а W┐ЁАХ╗▀Єt╨:x!ЁБМа'╕0тпБ~ва7╚┴z╨]Ь├ыЪў+ШЁД(Lб W╚┬║ЁЕ0М! ░┬TgS7T╪ >╚├·PdЇе`B*'Е RсХ╕19Hlт ч5E(╬╨КE\" g╕L-чR╩IK-їE0Ц1T/Hcжv╖Ш╞bкНnL █°F5^КОU└ууH╞■ЁПА№c!GB╔ЄРИLд"7HЮ qСРМд$'щ▒FОPяТб&7╔╔NzrЛФ е(G╔8K~оР╖*"QHC%оRХЮlхYщBY╥rЦ╕Lбз`А)^n╩Чiц.Cх╟*УФ╚Lж2/eJцa▓ДЯМж4з├eZєЪ╪▄X3єзГкeєЫр g"sд╒лЫ!з:╫╔N Т│:ц ▄*E═z┌УУ╢WCыЦ╥Цj,╝Е-ZG│Ц▓ж*╘кZїкX═кV╖╩╒оzїл#jЗ\·3░ЪїмhMлZ╫╩╓╢║їнB▌ц╩ц∙'Э┬нktЫ╫╫ш8┐щuo╥к[`√╪┐■mP─┤в ╜hC3·╤ОО┤А┤╤тLf▓еНжsJ╨N^FMъRЫz╘РNtкнjI│·╒лО╡лe▌ъZ├z╓╕╢uТY:д^C╔AX╩╨r╝ДiaЛIB└▐ГТ-!NП(Mc┌╥п╜ьБЙB╚6░╫tьnУшIЬ╛╥░ЛLюrЫ√▄шN╖║[─ыu╗√▌ЁО╖╝чMяz█╗GCмь▓И66оЭ:▒38fk,╔:lk|эы│W7зЄ═nn3l┘"╬pE▌э░|╒Ы`■п┴ї-p{Н[ENЄ}\8d5d╔W╬Є┼╩ХБt═`╦gNsП╛<▀·╬9Zk╬sl▐<цRHк╥д нGk░Q}ъ╨йutе }Q &║╙ЛЦ4╝лчXWц╧Пz+Э{мY√(╖>┘_Й¤ьh%┘╜ЩЎ╢╗Р k▀▀ч<Ўї╬ю╓ ▐╖╫┐╜√яэАwgш╠▓уъz╩Й▐rfЧx╞/~{НЯ▐уЯ7!╔K/Єт├|юЯ╦CпєЮW|чAП╗9■єЧ7╜чIOy═/Юї╪ _рg┴╕пШЎ╕╧¤mov▌√■ўЎ╝╣9╨{ °Ъ╛ЄЧ╧Lсц\зч _ KъW?ЯЪlш-YИ¤щч╥√║ьT1¤иX1ВСМШ?й°Ш╟;╛╤Rь_г№▌·╖Я∙°┐яqЕ№■√┐Ж∙А╕╖б#АxА"х|├ўb╪АшX ╕@CЇXO▌G*┬╘)╕*хўАH(} EQT Q/4ВмДВTДP&XEX*00ГU@Г┴4Г╝dГ7иГ;ШГшE┼1FfЇБDшA!ш@EШДJH0'з! ╕ДPЕф╥ДС5БxЕ╞'ЕZШYT╪ w/╒Ж▌з}a╕IdXЖ╓ў}╢tБ[╪Ж.╖R-6V_ШIXXЗ╘фЖxxR]X!s╪{y°ЗА(*{ШrИЖxИЩ2И}ИT_uН°ИРЙТ8ЙФXЙAгИ8ўpx┼qч7▄"8'qqCqgЙжxКиШКк╕КVЕЙ@╟КWЕИ▓X?о}uuS╒┬TNwtQзtK╡Л╝шЛIХX│XМЦSЛ:P`#╢М╠╪М╬°М╨Н╥8Н╘XН╓xН╪ШН╢E`╞_ъїНF_мх_╠╕\щ]■е_уИО╩е╒╡уПфхО╙╪ZЎОш╪ Ў╡П°uПрИПъЕaтШПЇX]╔^╪╝%Пс[∙^хїП╣ZЩ`пеП╨5Р&С▐°]р(^щН▐ТЩ_" РЙ\╓РЄ┼П%╔О$-р-0У2IУ3У7YУ8iУ<╣У>йУ@ЩУB┘УAIФC∙УGYФHiФL╣ФNйФPЩФR┘ФQIХS∙ФWYХXiХ\╣Х^йХ`ЩХb┘ХaIЦc∙ХgYЦhiЦl╣ЦnйЦpЩЦr┘ЦqIЧs∙ЦwYЧxiЧ|╣Чo∙Д╞ШQHNвZЬUШЮ╡ИЕ(ШМ Е╚xoРЩТ9ЩФYЩЦyЩ :rdk▒░E?а,@@зvЪиЩЪwAk╖жk╣╓Ъ░╔Ъ▓∙Ъ│щЪ╢Ы┤ЩЫ^&*шEU┴ЫЪyp" Ё , └D╨gxбgз&ЭкYj╡ЙЫ╖yЭ┌йЫ╪┘Э█ЩЭ▄∙Э▐Юю!Х╢ ┼v$╬▒ц┘lю╔З┴∙9Р8Аp╞gxЦЯ▐▒gЦЭ ∙g√∙╥)ЮJЮрЩауйа╩а║а┌аM╓ЮEЕЮ╞╞З┐y╒ЎЮЮА═б°YЭ$Zвy!б(·а)ъа,б*·в-║в.ZkUpШбuггUИЙга┐iг@jШ 7ЖЩDZдFzдHЪдJ║cэЎ&▐Ўmв&aтдO#Rzl┼╞"Y$'Вi╨f&▄╓%╜╢дdZжfzжщ╓д`Z%╚╢mQК&╤&жo╩&V┬жvк%Pкmqк%├vеaZзv║еpъ!^·lX┌зmВжК║иМ┌иpвжE&иОz'Т:йЦzйШЪй╤йЪ┌йЮ·йакККsnet░Ш/НЩкцВМ77 7КWКГУ-Ъh6rг6_r WКЙrW{╙Ti│ЙccXP'8║·л═BМк║м╔ЗJтжЁ∙КГЕt┬XXФТЛ┐МOGU√6uPЕ(╪4с:нkГ(╩╩мш*И╬ZiЩTжzк9ХоЄ +93/ЎкША2п·К╗G(s√·п╛╫п░K{[░xЫ░ Ыv Wя п ╥░√░оj7╖Кл!7нaSлhУ▒╟·▒lCм┤J6┬║л GК~м╕:U╛║qКtsо;ЛKо┌К│O)уЪtF│Ляо= оM╫л╒JuFЫ│╪J│5ЛИ7▒@╡ыSM√п [╡X╦rWЫ╡\p[█╡`Ыb_╢d;pxA@W╢j╦Еg+D@Gwtчwp;╖t[╖╝│╢Ж (░ЩЧyъУz▐{нўyФ╟╖К╫zЦчxД╕ЪWzг'zыSyОK>єв╕░╟yТ█╕бў╕кzwЧ=xИz+>y'║МЧwxз>ф├=е╦wэ├;и█║д ╗м+╗ю│║│;║╕Ы>╕╦╕▒є╣А║r√?┴k╖─[╝╞ <╛√ЗcЫ╝╠█O╦█╝╨╗N╧╜╘√M╙[╜╪╗L╫Ы╜▄;vmKH╢ш'vXБ▌╫Iд▌[М{E/XE.°╛+Eх╗ВэЫEя[ВЄЛE-JЮ"Д╞4!щў┐╟ф┐btC╠)xldGy┤GuД╛ ╠~jФ└rDGё╫Eщ |ы ~bШP╘7┐)h} D<Ж█╟┴·$~М~8t~цЗ┬г"┴Ў'Gї╫)ё├3,├Ыr┴╜Щ┴А╖┴ lЗ?|ЕN┴< ░█[─H В▀ыHiЫ─N I┘G№─R▄AQ<┼Vр╜m▐№¤▀▀h^ С╪нС╣}Т·┴%с~▌╣СцE▀6▐$I_ хс у╦hО╦ЭРNуфХу╛у8▀┘у╤╕рЮ▐:nс°нс╔a+iтшEт"р№]aъm▐H~▐iх╟}▀S╬ф.╛С]Nф"~С2~█%IОdюхОТe~С.\,.▄pчr>чt^чv~чxЮчz>a н╪~~0оь)Д╨^ш s╫╨:шmшМ>0фЇ\▌шТ╬Д НiК╤УЮщшRпў┌щЮ■щаъв>ъд^ъж~ъиЮък╛ъм▐ъо■ъ░ы▓>ы┤^ы╢~ы╕Юы║╛ы╝>ы╗вщ└ю4g-к─^ь╞~ь╚ ^n┴iв╠▐ь╬■ь╨э╥>э╘^э╓~э╪Юэ┌╛э▄▐э▐■эрютnЪ PЁN0P0NPB@`0юЇ^яЎ~я°Юя·╛я№▐я■■яoв╞Q_ЁRЁ/ЪЦЁ▀бlб ╨oР pMрNЭwAЭецёЄ"?Є$_Є&Є(ЯЄ)Oбr!ўъЕoббn l┐P3 20АрР■а√ЙDOа·iGП)C▀Я* ЇPїR?їT_їV_в,_╤.б  мnZєkQ4@3qj■╔Яj┐ЎM▀ёN?Ч"аW ?ўt_ўvўxЯў╘Юї╖їГ┌їс╓$`п└!гжЯхQЇoЯgЛпЇJЭ пўТ?∙Ф_∙Ц∙·nЮв!~?жА?єъ)YrБS! P║ЎFпgL?аs╓Яqў▒√Ш_√╢√╕Я√║Oj|ПrЦP>К┌╦S!╨00╗▀№╬ №╨¤╥яэ│╛г╛ь╙Я¤┌┐¤▄▀¤▐oя├Юьт?■ф_■ц_#Р┌ n╥еу&&Х:$x═е2╥■·■╧F sjmэП╫ёЯ бАВ 4ШPсBЖ >ДQтDК-^─ШQуFО=~RфHТ%MdбRе!┬Д,)║T╚цJГ3ЦФ╔б═НЕU*─Ф+\╜90'─лXof(╤х╬ВZ┴f%KЦk╫▓m╒ц|;qм[║jvыїа▐╡x┐Ж5√wъ`┬Е FЬXёт┴UЛ╓н(м╧ЦD├Ю ╕н`З[с~Е9Wоe═g/sэSмх╨з)3Ж[Ўl┌╡m▀ ~шxaыЭ|;√▌Л╒ю]╢┴? Їъ∙u┘т{K╦L╬№eK╜┼{ЛО<яЄ═нkчО[№xЄх═ЯGПRх∙Ёщ▌У~_■|·їэk╘}_ ~■¤¤ 0@ггBК4P d░AД0B 'д░B /─0C 7ф░├*>1DG$▒DOD1EWd▒E_Д1Fgд▒Fo─1Gwф▒GuD0H)>\В #Л<╥H&РА└Еь0J)зд▓J+пФЄG-╖ф▓K/┐3L1╟$│L3i┴єcHД&╫K3A,ч╘:)╝ъN='╠3├3 4PA%┤PCEФ─8  $r=ЗFxУаE▄│R*эЬ╙ 5╡4JN-L4TQG%╡TSOE═'W]╙Q╬tp╙╔8ь╙ДO╗zP╙[мХO]─┬Oi¤Х┴a-╘ХSeyХp┘=Э%╓XfН╡s┼лR┼6[m╖х╢[o?Ь┤QцЪ╙RYW-РV`з]Ч▌cСmW▌fЕe╫╓ wепzБ┼ы]~√їЧ╫~ў┼Ї▌oF8aЕfШ╦pл`sбXсDWN[ЛХЦ^y3ц╪╫ОэЭ7╫zб┼У┌О{ЕV┘А3╕хНAЦ╓┌Жgж╣fЫoїс%\e╚\КgЕ╣S>Е&║hгTЬЧf║iзЯ╞ёa&FaлIл╛┌jк#╒a╥ЛWю4╪г╟&Kи╧F;m╡╫ёaTВ√m╣уЖ°чК┘╞;o╜ўц╗яm▌ж{n┴ыЦ┤bF¤Fyх╙ў╓╒\>zщзз╛█цЗЯ№съ╖ч╛{я╧╝^Єч-.╗|є╧яЇ{ї╫╧<№▄ }∙чз▀CЎя╟▀oў?▌·==Zп╞6░\БэBФP■╕└╡эПn¤г╘ Дf└Т┴kNд`/─@vРi$№*нЧ}Md%T▓0FмwлV$├P▓F╢п0B2|┘ ]Ў▒У-╚ZJє`Еh*┬ В(дa╨`Ц┴xхph'tbЭЪ░$E▓PlCЩ╞Nж/БЙНЗVь╙┼8FnёmG╝╪╟Zи╞&6kЕJlcхиAЪмЗ9╠рIи─7тkКШТ9HЁ┘{╥т+ВJX6&J╨СcK!%9I0Щ1{Х3б∙╝°HN╩ПТЯeЩ, ┴PЦ╥Фз┤Ю!q╟┐D&ХпДe,5╩VNЦ╖─e.┐DKюNЧ┐f0k─K╩┼IШ╟Df2ODLэ)╙Щ╧&3 MjVЦ╥4ж5╡╣═Obєn▄g8┼шM!б└ЬчDg:╒╣Nv╢╙ЭяДg<х9Oz╓╙Юў─'>┼╣OщСsU∙h@:PВ╘аM'?Ъ<"б=' ┌╬лL4Ю¤ZgEКQД.╘г┐ khВ,:╥Л Tв%=шI▀йRА▓вЕ)эBZ sj.эК:UКSt┌╘зщ╠iF3║╙Ю▐sз,EjQ┘ЩTy║4в%*TЯ*Uеъ┤кeiL╡ ╗ЩJбж@╜ъT┼ъ╘░2uйBыMэ╔Sит%м=хшM▒°V╡^5о5u+XЗЪW}n╒п┴Sх!XKп╩5нu╡ъW╦JU─*ЎмЙulc╔КV├F╓жТMыeW·╪╩6▒l=мe'╦Ys■╒┤ЬыjdG:ZТ╢╓╡п═зSO;[╠е6ил╒,lu╗[▐╬У╢┐e\WБ;\тЎM╕┼Enr╤v\х6╫╣6cюsе;▌ГEЧ║╫┼.кмЫ]юvўP█їnx┼k&ЁО╫╝чuX`W iD┬в╫╜я╒RWI0_·╓╫╛ў┼o~ї╗_■Ў╫┐·ЕoА_)▀ ╪└FpВ╝рR8┴Жpa·ЄшZ┘zГ5№7ї ЎМДеpИE№р ▀wF@$К Хс ╖8a╛ }K,у█w╞3Ю/Оk╠▀уШ]╔пПs|у· Щ)B▒Клаф]x╔MУ╗╥"Wб╩zAХп|eq╦ тrЦ┴їУMНъTпH╦"z┤Х =kXwЩ╠╖Ц5гs▌ъHўEkqДНl 2╠╦Д┤пХ▌╢I ╢╥@&6Вбэ/╠╤╦╞6╢╩ЫmnOw█▌╖r┐nrw▄хFўiЁ╧Эnvku▌эЖўB▀ozЗs▐ї╞╖5яЭo~;╙┴╘x└ы█oВ╖┘╬▒└ЁВ7q ^°┬З}р┴b:│├5▐%ИG▄у 5▓Л.овСу(┘G9РО╜J ╬4Є╦Gmi ╦▄х├о│╠CОвТ[y╩Х■ыХ#▓ЧлЪy╘ы№щЙє°╙?▐я╘EНuЯhшB╖x╪nв░Л=Т╝^z┌_cЫу|ы\{Р█ЮїPK}╬)ъy╧^tщ╜яC7СУемv┬п╪з3тє╦нд▐ёЄЭ╢тЛ╝c╔╧╫ёЧo╣╪╛1┐yJMIЯ╜С╕╓L╬ЧЮМRу┘B|ЎtшЩ▐їу4d─▓·b~єї╖ў ъ!B{╥у▐ў°╙¤Cx?═▀Я}┴╘шЙo|цw∙ ~6Ы?¤э=┐g╩Ч>ї╡=ыл√л|°л╜}ЄЗй√│ ╛Р─┐~■Ц▀¤^:Bв~Ў╗ъу■}Г╠_¤ї┐Э╙┐T╣lТ=∙K?иs╣╖Л╝ЩУ3ы┤╢г╝MГ@╗ы:$k<$@■+╜ S└М:М;Р╗║к╙: ─3 T┴aК╜╘C┐Цє4 5 A╣┴─╗/;█║ дЇ┴с@ВЁ@й┴Ё╗┐И;╗T┬*┬rI@"l└╩ЛB┼[┬*TС&BW▓┬-╘Я▄╜'╘B.├╝┴B0┤е1DCцёBс3C╦I├7ДЪ2$%8д├жС├Ўк├<╝Щ;d╜0╘├?d>м=_─BDAь=CTDmADLъдGД─HФ─Iд─J┤─K──L ЪFМMЇ─O┼P┼Q$┼R4┼·с─┼F:┼Vt┼WД┼XФ┼Y4ЪTДZ№"\╘┼]ф┼^Ї┼_|$[\Х=║Zв?R!52╞EJг9╞gД╞hФ╞iд╞ FEтг$Є#VDв\dFТс╞j╟q$╟r4GG║FЛйг\ьг8Цv Щ)кбsд╟z┤╟{─╟;IG  ╟ ╩╟╚А╚БЫ}TРMаe$╚Еd╚Жt╚Ж|,Т╚6|H*Y─xыкКЬТЛД7╘KС,ЇFъ╟*Aа╩.J Оd7Г< ╔▓ Ц┴Х\╔5L>42Ъ#Бб'Ввul╞а =Т&ггI4C╛~щ?К╠╔?BI8╩Ч+┬"mt╩б|Jf№Ъ`9Jt│╛Щ ╔*ЭLб;╩<ВIbМ?·FЧщ┴н▄0Ц╘╚(IB╖|KЫД>жМKб╦pЛ╚Й╟P#@В@┴$L├,╠┴L╠├TL─t╠╞ДL╞Ф╠┼д╠╟ЬL╦м╠╚╠╠╦╘L╠Ї╠╬M╬══$═╧M╙,═╨L═╙TM╘t═╓ДM╓Ф═╒д═╫ЬM█м═╪╠═█╘M▄Ї═▐N▐╬▌$╬▀Nу,╬рL╬уTNфt╬цьM└d╬щдMАNъ|Nь╝╬хф╬ьь╬эЇ╬Ё╧ё╘╬Є№NєOЇ$╧єd╧Їl╧їt╧°Д╧∙TOсLё┤N├ь ┬ьКў╝Lи╧т╝К╘╝ ╠╝КЄ ╨ХOЕL╝И╝P╓ьO■╨EВ╧мP╪╠╧┴╠P═P]╠=LLА9╤╜╨ eP■lL,r╠о0їP }╠Х╠¤$╤┬Ф╤╚╘╤MNїOт┤╬█ь╤ хQЇьЧ╔┤╤═╤ЁД╨┼╤}N!=╤E╠"еR·мLщ<╧-ЭR¤┤N$M╤"╤]Q!5S 5═%╙4еQ╞,╨Е╨,ХQu╙Х╨~▒╙7EQ.uN╒╥Э╙m╥╙PеR=х╤9}SD¤OЭ═5НS╡╠-}R'M╠№L╘}P6╒╘, ╒ ┼R┼дT&╒╠S-U5UI%RSK н╤JН╒5ЭU╬┤R╒TUQURH%M[=╬8%UWї╘я╠UbеU@ ═√Д╤Yu╨╩╓]%U¤╥K╜╥j}╤?}PА┴╬ -╘M┼╘Х╙EН╒L▌V]═:═BU╫]╬¤T<5╫EХ═х╘5╫$╓▌╙Mх╫CнMaMQk5UїTxRВW4%TY=╫\=╓v╒W`Х╪kNИ-╒O╒05╪V▌╫╫╘VmX╝╙%═╪═ ╫b-┘gЭQmM┘iэ╪З▌╧FхSSе╤)╪■Y=┼вu┘~ё╥ььWj-X|еL`Э╪TU╓z5SЖ╡Y\▌Qз▌╓НQЯWe╫жXF U#НWН[h═W ┼WEн┌UН╨_UNдmSlНT▒=Y6Н╓Н=Yi%╓в╒WЛ [╗¤X▌D┌]нT^═[Бm╨W5Z┴ЕR9Е[ЕэN┬EVэdUTХ▄Чн╧√O+ЕPЯ╡╫эYЪ-SПэ┌г╜╙ ХHЪэЫїSuэ╧╙SX═\pнUgu╪Д][╝]Yh-Pt╜QХ┌Щ▌]▄─"╤¤╓╧|╘F═╠рХYзe▌4E]┌Х\╙e╘╪U\Э-\ е^2=Rцu█▄─\G╡Tо=╥я-^╢э╠Ёх█@E^8е▐╗эVЦu╓Ў4┘╧═┘e╙аO╟u^С]┌№ ▌■▌_ uWц▀ %р∙H ▌їе▌тEM`Ж╬cр.рv^╦Хр ж`╓р ▐` юр црЎ`с6сFсю▀9▄╦╧ ╜nCжс@Т1╚╞aЄ▓╦╙ш└╬с6┐Ў>т"▐Т╛ЇK╝ b#fbёH∙╩&Цb'╢Krq┬%Ют,оtA─b-cСн!у2╢оР4Vу5fу6vу7^Мй1у9жу:╢у;╞у<╓у=цу>Ўу?ф@фA&фB6фCFфDVфEfфFvфGЖфHЦфIжфG;ess/doc/README.noweb.ESS0000664000175000017500000000512412423756516013130 0ustar eddeddHello again Its a while since I contacted you, but I have got somewhere. I'm still working on the version of noweb-mode.el that is distributed with noweb itself, but I'm getting places. I've made it more reliable: moving text used to confuse it horribly, but it shouldn't any more. And although I couldn't reproduce those `hot icons' in your noweb-mode, I used the << and >> of the chunk name to do the same job. I've also got tangling sorted. Well, it works for me. I haven't tested the line numbering and tab-resetting options yet, but I can tangle chunks and scraps (which I, recidivist that I am, refer to as threads: I can't help thinking that a web woven from threads will be prettier than one woven from scraps). Unfortunately, I couldn't see a reasonable way of breaking this out of the noweb-mode package. So my tangling won't work with your noweb-mode, you'll have to use mine. At least until you can incorporate the relevant functions into yours. I've also got the beginnings of an ess-noweb.el. For example, `ess-eval-chunk' simply runs `ess-eval-buffer' on the buffer that the chunk was tangled into. I've been using it successfully for about a week now, although not for anything particularly fancy. It adds the tangling options to the ESS menus, but only makes them active if noweb-mode is active. Here are the three relevant files (noweb-mode.el, noweb-font-lock-mode.el and ess-noweb.el). Give them a spin and see what you think. Wait up, you need my ess-site.el as well, cos that's were the menus are defined. Mark P.S. Incidentally, you mentioned that you were keen on version control, and preferred CVS to RCS. I'm trying to sort out version control on my stuff here at the moment, but was not convinced at all by CVS: it does far too many things that are not needed by a statistician. All the multiple developer stuff should be superfluous for tracking data: one person should be responsible for managing the file at any given time. So I'm going with a bare minimum approach: RCS, and shell scripts to hide most of the options. Just check things in, with automatic checking out so that the programs can always find the data they need, snapshots, and restoring. All done with symbolic links, so that the same files can be in several projects at the same time (RCS handles symbolic links ABOMINABLY, but the shell scripts can get around this.) My theory is that if the system is sufficiently simple, people *might* use it, but anything that requires too much thought will be a non-starter. What draw-backs do you see in this way of doing things ? Why would you do it differently ? ess/doc/news.texi0000664000175000017500000000005612423756516012354 0ustar eddedd @include ess-defs.texi @include newfeat.texi ess/doc/font-incor-s.pdf0000664000175000017500000040244212423756516013523 0ustar eddedd%PDF-1.3 %╟ьПв 5 0 obj <> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЫ[шЩЪ)шЩъЩЕММ╠бJЇГ╠\Є╣БЬ  ─endstream endobj 6 0 obj 56 endobj 9 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <> >> stream xЬь╜Ф╒Хи{*╟?з■;╖"Q${М┴6 "gуД╙`c{l╧]3є╞c0X╚a<┴┘ L╬ СФBH"ГPVлs 9UОoЯкn!l∙]s▀zў▌U[м╜клNэ│╧>e╫ўяК┘╖ЕbЪF╟:┼№q,П&kO╔Т╬╣9[E▓HЙОщz4M░╚▓ї╦С╛хzжчЫИ░ЄHDI8BЄiД┬ўс┴%DШ>eтЯ┴ЧЁ╒@ЁU.>Ё╔р*ГщТЮK║.i!4kЕW┘@Ўс<╘ЛлvH┬ж=П@Б,БЖb√Пg╬Р╘ Vф┼rSFдЬРУ├7&" Dъб╧>БпydXЙ▄x`2╝╩a│╪ ┤┬ЩqBёАKPZG╒ё%7Б╧р┌MDupЬ ╓T█'╧ч|Dу█I▌з┌╕>7Г8WЖ2╛▌П╧░у╕RO }КЄ=╕ЪI╧·р∙3с┬■y╕:yаIЕaNЖ╟}X п ╘V╧ V№l#Й$ТH"Й$Т"A║jыSЕn[╙к"У╢5A КжiУМВ^╗PУўсu ob`┌гв\. ХJ%A(К2 Г$╔ГT@8eыЪщ9Ь,'▓йф╛СaЮiJ5ўu╞|ф╩@ИTId{дKёb╣╥ь)╬л╫Tф2r▄Gьдв╓Х:yс∙Я"╞╟▐дY>ЯяqСд+╚vQ<╤ЇQЩёУо╔ST@╚Е фxИvKфРРя;└'$└h2ыex@eH38#рУzп ╛"А╦ьнPД,cэ∙И$p▐ ш 3sМA╟еf═Є\#ГКf#╕┐jbЎO78жIDАГ╠МWdшШ*D▄╟M╖}а^$6ь└7.Ї┴╧█YЕ╜╨T`'lЭ┐▀2зg#0ыЭ"k;hLsT╟Шш╟=\FA┬╚CЬй bв╚В:ГГоЖЬ▒;█d═°B+╓■ьё╠y└X78├╝W&╥СОtд#щH э╬ H┼CЙо%r└T>NЭ!B о├СДЛ"╠6║m╙,a█.╟0Оч∙╛KS,1C^└АA` BгбH2oЫzLО╣^З&q╚-╠╘@╬рVCm╟дLGqb╘QоvЄyры╖┐╣чя╛■ПD╗9Kd_yэЭv[д╝C'з&ц7┌н=2Эв Ю2╡u┼j╪Ф╩╞<ОЧ=Mв 'Э|╦╢-╟З 1 -ДЇАОЛ▌%ЬА/Ж█Кєja■ЙRГN╬∙@tЙ 3Зя■єр▓<╘┴░т╙@╨д╟ЪЁ┼╬%}░ясLфLx2Д▓ў4@\ О ▀ЛX╥Хё1╒ЁHЬє|Бt╥Ю╧СДюС&Iи╪В╟¤·DPФ оржl╕{Е├рNа}Мf83К#@·d╨]^рIp Ъ╬ааE°|xХ |Г6ы(╚"7Н-╤UМ┘vзЁш2╬,zс╙ФП╥гpы┬h@╗╚0=В%d ЩЩ, юЧ╥З└є8Ё╪S:╨DА╫>>O┌┴╒а─,vG:╥СОtд#ща}й┘УI┘ЄЎ0МБ▐╓А=╥< ╤ ▓ГN·xТПШ ЫшЦv─СЗМНNь╪╣эшгОїС;:2╬░Ф└K3Cйя╙Оn┤Ы`и┤c√sчїъZGQ╘N{*Ю6qv╨уИь`╨┬#Дb=U3-Гъ╩╧хЩфЮ╜яьф└Pўум]z╙┐[6н·╨З?ЎфК╒Й°╢┌ 8fcв`Ж└С╝уXоп!╓p)╒жuЖe╡6с{┤я√A╨4MQ ErИа]g├№`tuv\╥ЩсB#CLт6SMl╔╔В╟б/ГЄФ╖?J╨^?И9О╞МЯИ╞а93░ю╬─Ы╜Ч<`D╪ ╨▄Щ¤%sа┘H"Й$ТH"Йф┐.^Мб8Uo!╘f)СF ╥N╦bL3з0$Ц╨ИG`"┌aYzx▀^ л├?\QФr╣▄╒╒еы║я√нАh╙"I'э:>AлЦ▌╓u╗з'б#д╟ kgС╚p`┌┬I╓r\7Щ(Цж┌жJз2bў╡:╙o╜▓ў7■ИP█├вФZ╖сMSя┐Ї№╣|[█К\Гє 45д3И═з╙ЦgО6G}╘╩жSЦнШЦG I └ДЦA┌ОC╙ВЗq╨ЫЩ█ЗN/0y<ЄdМ8√хРтаНHг ЮУG!┬╞oE $МГдI ╨жlЬ═ ЖМ=╩'╚А╛├!Z╥%и┘фа7;э╜ЗЖя═) )╟┼pЖ]КсУ#°У0`Mг║лal ░ {`ъ╡У3Г╫√П1─б`┼y╡░RЪD6цqЬ─ЬЩ#0h0с╧)t▌└IS/FxL0аРё0╖q┴╕wУ8GЧр.ЬЁ#бnb>б┘V╧у▄9%╨╨√'╬H╚В─ь▒Шs▐Ыйщ яMёМ$ТH"Й$ТH■ыт√╝ЙА4TБ+!в!s ╔їЦK"Ъг╠pю ^nА│Гt° 6╜п╪]йTDQTUUqХЫ`Y╓0МГ╪'P╟оЛtП─╢╡ОГJ]╣DйRЛ дуЧ ╗/9!ВХДIr╢aйЪeдх>╫ф┘╝чсы}к╛n╒ЛKЦ▄DМ ┐Э═u┐┤∙m╟ю;ымФШA▌▐ХI╡ЦХg·,█PPЫF┤Н┘Лящ.LХv█ом~Р9:AТ▓cSxb)b*!╜ЩLUШp┌┐L╧Ф▄ЯcgRS╕L8│Р■┤i'NрAX╙Cf0tk═фс┬┴тЩ!┌Р\а!с╜w ─q~С0╚A(╓d╔┴&▌─6ёЄ[ oЇfЧШр┴_Об0у╗рV0ЬibЇт╕НДВs{°A┴▒ ═Гqyrv\╪ 8/<Ёfsz!■ю_Lу·ДхЕ╔ыўтpрJяАU;┴-x╞dДГСDI$СDЄ▀*Х,N7__░ ╢sчx╒Кd╩ёд┤Р╓МRА".0МяЙ8щГУ2>╧░╜)╥r█йID2ЧTEW▌ОH╩>X oїx:5UйKш5╝╙6╞}dчS9UЭд@°^ Бq╨Ў0 ив╖8hъд┌д;hфё╟ЦжєюsOпZ▓d ▒ўЭсбC_~х5MK\zё ═f;╫█М┼╠Л╬╜ф┬s╧=юшЕЮon▌╛ї╬╗я}р╤═ж3wш(M!┌M╖▌@0К1dЦaуж╫HeЖ0┬сQ8o╜)G(─ь-Ў,О@сБIш>2╠i{oёЛg╝a~Рлг|=ЗcЭ√ї■LaX={W;┴U╕Л └╚╬Р┴!8tлЕр╞zP^ ШИR┴yїА╤╒¤нА&8VfKТ┴q╪@&░уv<<Бп╥Б╓Й┴╥ОЦ╘┤WўГYа┴мВ╨[\Б/б└а3л▒╛oЩА'xкв"l,3Н¤c╟▐▌Б▐▀СDI$СD╔@Ф═Xяь╝#СDй$╞"еБXчu┬╡д°э╝√╤ь>Щ╘рЫo╛ 95Е8е╙и▌F,{ыpпbаCЮ╒мёщDўDї╖D└e╢╝3╗┌tv▌* Cбёq44ўDДКsЛ╜╕ я]bz├║Чп╗ю√De╕├╟∙7╢╛к[╥Щз#█U|∙ї;╙iз]kЇУЖ1m;JRNйО=U1Уёn #├хН╢>ў▄+/┐┤}r XJ&Б{H╬'┬╒с└eш/Л\з йА┬!Z<@ь╠ьДт╔┴Ж,╒Щ╣qоDxqГЛдRgРvfоЮ{G═&└тЇY╧▀├┴p▓$╓│CЯ>∙▐╜xt╪Ъ░цВQQ▀E╛╣ё`R#Гgя└ж▌ ┌Ц└╝╨ДpI║Д│tV╖ЗТlтE'x1IЖK0ЁЄЧpХ44'╪╠%мФ└зш┬=e┬Ь( 7╚╞c№(м┴Ю°~Ш╣┤Г nЁ@╢яц"tВ╕т<+ЙЩ5°╧░ЇfQ;ЬЙИfєЕ>°ЕWСр А╪а▒┴f@38ш╬цC!  ═#Й$ТH"Й$Т$ДM▒b&ЫЭЗжk╙╢о╪a+lбP0М*`А$∙<№^Fсj╬╗n┐√жя▀рx■[o┐ dbb"Ч╦┘╢¤чцБ╕^Ўф ї═f2з╢█═кЄ─О=[{╗√╦х)Q rCn XВЬ)v,ЭOзr┐┐їюя¤╦Oэ?█шл+V№+├╖6╛╕х√▀ >1╜зRш╧n╪┤▒┌в.║рЖBW▀GOъZxh~x√о ыЯ╣ЄК╙`ТHд{>yцg╡╤╫яїї[R:▄¤ўоzрБU/oxЗсТr<єЄж▀ч H3Ёn(Ш[tфoы▐Ю▌?УS(Ы=Эp╗s┘┬╘фЦЙ╩ZЦAЕьХЮа╙Эй╥уН*:ьР/ъ:╨П)╞$MoМО▀ЭL!╫EкКx ~YQT▀CХъ}ЪЖ$y╩g┐─"С ч mEЯ╥їзжзQW┌╡ ═ЯПdщ"Ж}Пт9yчю▀4╛▒╙B Н╘6:·шo╓█oWкk]-Ь UE▒eЩ┌╛чЦd №Б};╞пыut╚ЬпtМI├ZQoв■№U,w¤йж▓╠6P▒√b╕wкЇи Ю?╕MWЮrФH~КвЭZэ!UA╔$ЗE UkшИ#о2udXMЁg║ЇаfвC∙lл╟Є▓19}oлБаvЁ│TAєчЮF0 Щ;м╙4h"у╣О'К▓i6\╕VIdуc╖АЗ╔8овпxU*ЭиU+хЛєЎ╓√9П]ЕlЪ│жN│М`Y6╟ёже╜ЯS╔┘ЭщYрО$ТH"Й$ТH>Ш8<ПLooгs▀Ё°pyjЯ└╟┤Ж╧qВi╓bq╛н┤$)╓j[Т$╡╡r<&нZ╣·'?№Iз╙Щ фМ3╬Ёa╞┴+4h]├ы\3┘ь▓e╦Zк╢~╙ц_w3G▄єнжu °Їш╛╜cP∙@2rгfЁ<АбeШj*SН$XВа╫м^┐Ї╞[Dt,0тК╒K]bz▌ъЧ№`)1╢cдwN +o╜┌QчЬuГa╥ЙЬ&ЦгщoЬ}Ў"ЯlЦ*%ЖMЇПv}%У-┐Ё┬S_╗ц{ч/╛┌╘еZ═Ы√7);ЮйtvшW,5j:█].CH╫юVm4w▐ н G Щjэ╬K╚C∙╠хЭw╪В├▀▌єp│є Gбx№bВР}ВЄС╡cч=╣<К╦gЁТс╜пRFs/l┤зhT(\ЦJ╟╢╜};ч!>vEЬЛ█о▓kў}щ ъишЯ°┬╘╘d,▀╗ч!█┬├л╔─┼Цo29Кmя{─4╨ЗО¤║╥фзkуГГ┬ыo▐┴│P╫E&▐z╧lwЮvTH]П┼╖я■E"ЕR╥еВH┐╜ы■L'.╙╔O+Ў.╙▄ иЧ╔|8╧Х╩Ou╘?ЇЙZ∙Еv |A╖:п5OAKyщ<ЙУDЩЫ╕з\F}¤з╧!IqUmЗєБф┬MgZн·Ъ5/pвЁф3╧■ш║[9ъt╧Г√яШ(э▐;ю╣ш╝s╧uTcэЖM.N+║p╫'N8Ю∙+V╡fї║е7▐&·X▒zЙKОп[╜у`ud*╙▌╡aєц╢Ъ=яУ?u=>Ш┘V' ъу'╬;ю├b,йЦы#4+╘*Ю ФiМн[╗щ╩╦>яX Ць╣щ x┬ё_ЯмR ]й=т#ФJ^e┌K┼ ╫,д4еVo№╥╞╚ ~ж▌╓ж*Пъ8╘Х╜▄╢ &кkэ{*u╘]└$Ч╬^Ъ╩ZнZл}лЕ.№МяЦхЁ\LUЇd2=6■єVїtЭ ФПчУGЦЙ|}╘ ╪5VщКз║▀|ы■\еSW╤╢'Ъ╒g%ї ╢▄кл═ЗГHMNбО Оezї╞V╒x▐vPR╛ШRR╠█5Є╫B Ч┤°7MєОCB╙┌эD+╚oЫO}╬ЯЄиz∙a┬Ї"╟RAоY│nщ ╖ЛшcЁо_▒ц{.9▓n═к%K~B╘F'S∙№ъ ┌JёТ ~эг"'8)о╤\╕@°Ё ╠Ь╣-шr<>╝л366╣mыkей┌G>t╓@╧1O-▀Dв°▐щIЙL·Д╙h? s╥'║'ЫюнЦu╡д╢dD<йТчПЛЛ╔JmI"CCЗ╠√Т╓Ц╫и+7C╪ZM■!▀w';m¤ЩOG(ЙРn[+ _#j┐mХЎ}^╡Ъ√ДnсйП`ЬNй┤▀YO|┬1}E_Oина#√ьDYaPЪ@оБFluНов╛▐/кVзШOя╣yt-:№Sк█▒╒х║ГXПкЎ|A╤█╝HЦ+QJ$оpL;СЛ┐·╬∙,КS └$гЪVЗ!│╢WвhТа[Им5ўi:Ъ;tСе╣;╖?Q╚z^JР╓ф─вМЫh6ъы┐FйЫё°┬v╗Mв.╝▓╒■3Г%>(Xh.XёВУЩжI$СDI$С№ХL╜в|r|к~Лс6vя┌ф9n6╤_Ъо▒Є<З$IЮЧзK NрHFЗ3[6╝║ф╞Ы,╦┌╢m█╚╚╚┘g/~ю╣g\╫Е3╛я╟b▒t:нi┌╟>Ў▒ 6Ш╢ї№┌57]╗А.ЄР┘to/┐8ИЖ"$]╒/║°\╨╟G╧?Ў╪cв(:°у─Ъ5kЦ▐pЧшЯВР┐b═w]jx▌j└┴Яc█w√√7╛ЎЪfЇЭwЎп-;ЛGCQ/М@;п╝ЄРЗ╥R▄exaч╓╓ыпя╝·ълo╜∙ю╫^┘y╩╟/ёЭ°┌Н{3жkTЪгЖ■╠╛}и╗ИQO─YpMNN)┌ЎО·╕a#^D╒*)Y╞$╤┬Й╩5jП╫ЪшМ│оl╡╦гул~ф▀ю▌∙╬d∙еD<Ш∙G╔Ж;Ыд(┐TЭЬ╛/СBУ(ХB╣ф9)▒▀ё╘╤▒?Bщь╔█wмэъB╜╜gМП=75ЙЗN4╒ └9▌┼oд]mяи╫╫JачYї&┘Ьъ╝ешO═l╪т"EG╒О98└qЇ%ЭЮм▐*JрЎ9Г▌┼═я№;/ в├A3/╝ь▓gV?T╚ Q:ЦЄЕ6TЇ*yов∙$Iфз3▄╪╪=э╛bЪxюаCCCЧ╖Ыцфф2ОGє╜ttфm├┌б6P.Щ ЫS╙O@Ию$ОяУУ■╚╘=кВ ▒пВл"O[Ощ:ЬПtIЄUcDФЇщ╩Г@╜sМ(ъХз█M╘╫sжщ╡Mїхf%│Шьdц┤lё╕NУтшВяЄm*![╩4^4│CD╝╨ДЯ]Фs╨/#Й$ТH"Й$Т┐JВ-P,MW:┐kщх▌╗7█Ц┴°ЙvS╧fУ>rїVw╧@│б√║нq▀wЧ=▓№▀·3 ┐r╣<11qь▒╟╛Ў┌kХJЕчёf|жixct╞gм_┐▐░Їu/╜p╙uwHшRМГ╬o╞+п·6PрШОn6?єЩ+ Я╛√ю{A`8фRD:┐Пш|▐°+╓~gWп├┘┴╔]├┼■▐Нп┐вh▌gЯё ╫M╔б6GSж│їK.ыщ╡5гjЩ╘УП┐╛їЭI▌Ў|_p С$Д'йvзРь)5wБл║╛p╠╤▀кU SrK6ЇaMщ╓ZhAеОrЕ`│Ц^*с[иP╕└2╒fыy╧A\№o║Єь▐▒ еу╟√чэ▐їАбгLЄYюSУgЦ Д┌ъээ╙МR╜1╢р╨юW╢№СёС Ю╟╨l[yд▌AG,:{tl%░WO╧G╞бвl·╝jх╔J y°╡-uм╖/ї·ЫwТєЯj63┴▓Й]║╜<╦e╧55AР╝Rє3XьqКFI$СD╔_<Лa╪╔кЄЯ;ЗwОМ╛!pФcЁ┼|▀╘ЇD&Уi5; +╢[:├Ун╬T&У╪ЄЄЫ▀√▐ї╢mo▌║ullть│╧Z╗ЎUэИв╠qМоЫоk3 w╩)'m╪░╤░╘╡ы╫,╣■N ]d1Q▐4╝w┘rу4Mц3ПНП╞Її▄s╧╜ОлzМО(k═ЪUK┐пшЬЗ╡b═?┘┴5ы#╙йоь [╓с╣Гч№╣yТўH└▓Х═:┐°хWфД╓мUEочы╫№╝╘pГБEЪc║<_bI╔u]ИTI║╡u█э╣ЭwЩw▐▌q╗$!Y:#.шVеб.ЫЬB ║?Пg▀▐■є|IЇgхQj▀}ЬтпЇЭX╙╕я┘т!Б=.ЭюЫШ|╝\EGs·─╛ч[m44чSUY╛kbт▌DЛО║R╫USQрёЪ┐px╫┼~я6фвJ┌Л╟le∙Кx ╜■╞З║║>ЩР√Z·Шb? ┼$ЄZД@SЖ2lр6 б╔DЪе┘┌шш┴H2■фЄjkEв╛▐╦╖╜√ ivPоU█x%uЬ╜!йШ H╜j╥4лZMчАї`5ЙlО#8n╗ш№OЇH"Й$ТH"Йф/ ЙHП╣M6нЯ╜╗s╗уL╚в░eу╢б■yЖб%Уi╦tж╦Н#О<╢\Ю▓▄Z2{р■╟·п цyю°╪─Їt∙╘SO^╣ЄВЁk╡Юhш4MТ$ Ш°╚#ПQ zqу┌п┐SFЯёР╓t~>Y┘8╝зь█"Cf?~╥'Hдп|·Iф│gЯ}оПИ^Xg║"╜5kWсь :Ь\▒ъя]z╟║5╧.╣щ'──Ю]╣bўЖ═пЫN╧%№Зж┼}JGN!їшc╗n║щsВhYЦw─№П-:ь2├H║ФД╔╥=КК 2k╗╙ G√и]o▐lр┤▄Хд'pL╝▌n│,ыС#ЭЎ╙жЖ2∙O(ц Жэ╧э;ibф╡Г?№Ko╝}[2Б║s▀p\ЛфGх8▒s╫J@▒гПJ0_$█2G·└ОЧ Т4╤╕╙0╨сC╫4jЦb¤┴tЗ▒Є@d┼\ ЭЯLЯ┼Т=S╙╖╖4oюg═╢┘RjLHчСы╣Ф(d┤ц°tыIADC_╓╡C╖єщ┬кgюИ╟P*wБк/▀RЙ+-УЩ* 1ЦE┘Ї╔Мy*сv╡н╤`<Ыг)FМ9эцВ3;эЗё"шьbQHюxўЮX Й╥∙}┼╝П4╫WЎМ<d'╦ЧSdЖgєjGE(?ZhТr<5XJn4CыH╕YtgЄ▄СОtд#щHG·┐оГ╫*eв├№¤ЫяnєQyll╫W Ў[ЪВўi╖TЖЦ(Zxфсev gu┌Н-Ы^┐i╔-█▐╜k╫шшшт┼Л|Ё┴d2IQ°[bжЙw, ╗°тЛя┐ ■ю▐╛'Ч?uу ┐Ч╤Щ┴`ёУ%єmKm7═█бEC_1[еж¤Д╟¤_6Ъ )∙ї╞▌ТЧ│7ЫАл╔°х1╣█2╤°°╧T ~╜╤°╡ув\■╦PТcгн1Т0:Ў+A@Iс*JФ}╧╪╜ №-v╜\■5Ї8Юу 9О2╣╧°>ЗZ╡'&LгГєЬ(;у╟т╝iъХЄ-ЪК└▒ШМ.№n╜<ВH9ХN4к╙Н╬]╢Н·zп75EФ║4╡Л;Э:╧╟ C9р+╧D░_ў■-f╝┘-й#щHG:╥СОЇYУ╚LЁЮiя√#╔г7▐^N2╩~Jk№![ xДХЧ-[╞r / ╡╙▄┤qєї▀√Бк65M█▓e╦9ч\0■р°°8╬мyIТа с`х╩Х!=╣b├н7?lщвn7,ўНЙ╔Йw╢╛°Xл╒Жb9ВжёF┬ОэY└Ш%HyЖ╫м~z╔u ЩЙЯ┌l77n·гbю|~═├?\·#bк■j!uшъч'}р╥є ╤BвЕ?┌╓Fh╧EЧЯЁня|╩ї5╡a╛¤╞╚o~ЯeeлЭЬч╟Г╓Ж▀ЎЁn╫аu■aЗONН9Ох√.\бP┘╣1╣lж+У╔ь╪║Z/%║╒╓dWяBAЖw╜Uь[└q▄──Дя√Об"Жb8gю▄┴эon:╔tў╫к╒T:-К"┤lў6FN╣оЫ╦х:Э─%Яы▌=A╥iТ╢c2╫█У═IO.┐.ЫC═&▐h┌╨РшЗП√g╟жtях╚Є>Ax]]]╗╖┐╘▌?wrt4Щ═┬еJеВўpйЧП8·Ccccн┌иЬ*x╛ЛIїz▌6Мt.gЖ╓м3R смЫ <чgПU0 IЗu ▄25╢}сс399┘i╘ВИ╤Ь$Щj9SШхGЎ╝ХщмMяцфloooг╤иЧ&zчХ╦eшNUU│┘ьш▐╜°╗tЮ┬╔yS)╦щn█╓╔Xylв╚Б▀ Lж╪cш&E1╜╜¤я╛│MО┼Х╢┬Є╝еU·ЗО°°Оmпp|ЧуZо▌Dd y№гЕр №И3hI$СDI$С№7p╨є╟2=]√├Ў▌нZ√-╦+MMwwwЧжФdвшШ\н┌^┤hQ╡6э╕z:{№СG¤л_йКZo╘_¤u ┐щщi └$8╥А]╫Щ/^№ю╓╤m[█ ЁO |Р╓░▌сw╢ОЦ*гоgPФOРExщЙO┬Ноы╣Oбdлн┐╗эн■∙G╔╪1нNg∙Є[-ol╦k╧№pщM─ЮёчzКG<╗r╖─▒°╠пЛB╖aЩИTHnъМ│П╛ЁтПwўф(Ч█▓щ▌√ю\1>ю╡╒Ву'qViцCp3P╚░Фйw8С╖,■д╥╓5└ё╢┘@dЁР▄ВbR,еvжК= з&v@╘йю╡Н|'╧v┌SёD7Pm╜Vс ░╧2ыQ4гАzFщT2┘▐Zu*°ьп~бN%╟SMcМЧRоg╪Q$у:д(д╟Fў Ф╛╧ЖВ/╫┴IТ мЮуgxДМTfаQ+{пpщ╝Ш74=╕ з<╧Э¤А`I D8╚оЕf├∙v$Aвt&YлАoF"╒╫jМ┴IQ╬C+ нЇO&█MаC_ОзХЎиФHQ┤▀оM└═]}єз╟vR| ┌L44─DAkMwЄтЛ?Tлс╣Х Е>>цШ┐k╒[╚╡Ё√F▓i╧єСгРL2СH5к#╪=╝S!TZдД,ЛХRЕfi┌qР▀4│Пq$СDI$СDЄAЕЄ╧mўфЕ╡/■Єёх╦,м┌╪O░Dd╙А╦HК┌8ju╩┘l║Vл¤ъW┐■∙╧Л┼APUХчyEQ╟╔d2L.Н Wy║яз Ў│╣Cє:Jeуж╡ў▄{╗П,К╞I:jЁё.I╥>т╙Й9Ухzнt╦яюС╣pїЙх7sRєйзяZ║Їblъ╡▐о├╓м┌╔╤єN<∙JuY╚еРM╤Э▐A╣XФ;d^W╛g╧ЎёН/╛▒╖╘д╤B╔Ac╜ЖB(Д#└*!з[ РРЯРє-е\Т ЩЮR ╕─═зЗ:ЭОn╫S▒юfзщ#/K[ЦеЪ-1$"рАd-┐C"╔C*└У╠%│-2▓ы║жзУИ╧Гe ++ЦE!ЦзY b├Ыц(рN а╕┘й1ДштПC█1оhШ╢Л(Юв5╖╥WьЪШЪЁPGц К╤D╚╠& шЖm°╚хi╤pМl2[mV╬Хq┘dо╥\│{єЗЪЦ^iОKlZ╡ЇдoЫа*Щcp▄╥Бє z╟rЖeдУщjszаgю╚─^1'иfХ!т@┤║е'фD[i╨┤k9ЪJ@яvФi╔pЭЭH$ъН*M▒щt║\щщЮПBнVI$eаX╕jFгQ┼┤жuт▒,До╒ъ°╕#,ЮI╢╩R╨3Р,╦╥НЎ$DLф А░║eРсЙ┐МГСDI$СD╔"Ж╙╤╘╝▐№▐ё═ЪК'╟5╡ОB╤I▀х<Я╣Фf6▓Щl╜рфeЄЕ╩Ї─└▄їz╜╙и я█&═Л` ▐цжжQ,ыЪf,Х┬ Ї&п9жH ЪSЫ;041╡╫▓i╧╖с]~р.╚gс(в ╙|Jжb═Ж&▒єm█^▒ЄП,╜Ёт#KЧ^Glwlс№▐╡лк$С=ым/(MyбnLH4i9нД,1▀j╡Y$╗H░▒fВ╞z│╧?E┼Ё4ПnС·-╒╓Х*Е$я╛├√°ЫЗ85XФ┤PЛCIЩ"%тТъO& пуТЖi╕╚Yа╩AЖ@┼XЦЕЎ/&╟уёJkД#R@┘$┴jо┬ ╬╞Sбєй|│┘┤№║─цЁ╬НИЬ38oч╛╖ФЄq╧тP░j@3yBвiъeI6ReLЧ[√d&п╪eБJщ.ШJЕ■Ёl╝╠┬ГТP+─:g■ш╕б┌└Од─д┌L_'В╔м▄▒*╨ПЭT0.q:HгСнєСЭр3Оу┬эpЁ╗щЩC╜C{╞▀ВгRИwСЮ чE*[,╞'Fа$╟qКо╨И5Q+@g/Ш╕╩BЬ%*)bSi:HСиМщj$NxZ)XЮув6З╥.▓I┤Їжя#├х■╛▄є╧эъ4йп_{]╗эл.b·ah╥s Ъ" W▒СGIЦХ ∙яЫ^оEP╥DZ╥-╦└ЯїN]dD@Х-▀JJIР╤ЙQй)▒ ╧tYЦ╦Н2┬├ЩРв─K-cZbc╢н[╛Ц3сf▄╒╓D01УєР/qnlы╔@i┘D▐4M└Q┘<┼╙'Сnъ.╥82юzn"Ю└∙?╫#р┐@ `╢╓ис└СIЖaрvIТъъФDзUА`>ZiO╥┘Z╜─s"├PMе═Т4■\МVшDИP+╟ EрЕD$CЛMНЛ╕ч,█bV▒[╣xPмю5у\║.A█лнкЗw{$*б║uД╪|╝PnЧIМШвхXЙX~L7G@З·ЗvПюЎРc╙ нШЬкЧ1√√▀▌√║Hfр╖АН▄8oЪЙLCEЮчш>░2р╢6Ї:╨p&Э)╒KЇ┴┐M╝ё ╖ШКщHG:╥СОЇ 5Бh╝╣2"Тi╓┤л╡╬4╝▀с5M"┘G@rxЖБ< Йб]▀s|╞v]└Г╢RОI╣О┌ц▐┤;$тABJ~HеR╙╙╙ 9k(╛Г|Б`▀┤РF"_dY╙╥KВiГT@J@╚ўрФсM1╬4ЪS,УТШ<═а{°е3W>}я╥е▀%Ўь[780 еЧ▀Ре▄+пlЧдE╟Z╢-jyЮ"=▀╡Ап,S╫TKМх¤Щьр√└╥u▌ >!А%B╗▌Nз╙НFP ╬$ AM╙аI═fЪж·j╡ЪчyЛ-┌╗w'A:Иp9ОГ#╝ЗsR.Л`P╩)Вe№Щ╩ыtZ╢эжR0╥'п┴щt:▌▌▌4Mэ╪▒э╕Ъж╔ют`╗e╙ФїBыАPб╪ьяя/Ч╦###▒X ╧)Ї<иоZЭV┤Ъ$┼░║4┼ВЖcITE╖l∙$╟3pfцШ5┼╡mк│PK6Xд Б&C├єyМнЁ'4ЯчY╟▒Е%A~°сїz·~╧Ю====сb"ИDl▐╝yХJй┐┐КAа╔╪NG┼f №Цх!ь╙╙e0Bс\>m█x+sи44╬ГoPь/№дё▓─$╥СОtд#щH ї╤<ЭД7пЗ4Mo─Ву┘L▐2Сч2ОэЫж╦0I┘ ЛL╗х╕ок╗┘\WеR) ! ь█╖Ш░▐°АRpt┌╡С─┼M▌I&eMWЖ,Хз║╗ @)┴ы▐РФ.BxA ЬbЁКє<┬2Иjн▓`a^╒KЫ7?╗фжя╙╒Н┘LЎ╣╒k1f┘Ф└'LУ╘ B║b─хXGiZF'ЯK dy>aYМч│яc`ЯЁеzл╔╤AS°│оуZv<Х╘ХєЕОжj%ЦL╪Жй[&ЕVрс ├sщD▓╤nк&'b4щ╣╚55(г▓В&ке*'тКО Й11Ч╬э┘╖з+╫е@═V,kTЩ\arl:С╩Є п╟0ж  9)╡9!├▒щ╕д++r|│╙ЦxAN─╒°╠3мэ╣рГ Kp╛н*ЦnР ХIKНvЭB┼RЮэС ╟═n)°D·дfjpОAл║!░1КauE√C¤УеiYI╦cr╜R^╧$SКоБ}№└°ЖЬРФVЫЧDИL"ЭВШhж╤Х╦OLO┴╜р\u|/ЫJWъ5IрJ╒╥@я└ж└qЖeI<О╝└ `YWр╔C∙LьЫОХeшЁ,g:6X3l ┌█╙▀6б╫H╜_{╕OA щ∙HG:╥СОtд#¤WkDЎ┼фДуjЦн;О%╦▓уx╛G╟фTз╙Сcвв6$Щю(╒x<хYNl╓▒DЬ&й╤ё▒▐ю╫ў,├дY╞6-QЦ@Ы╢ХJ$;Х$X▀╟Щ;╧wDСu=G╕f│)Кx║бП@Р  П^· M╦ХrлллX.╒E!OH═ц┤ вчЯ[╢фжыЙ}√▐\√┬Z╫╓яI╫гhJr▓Р/ОНОrэ{Ъяk элD╨бs1)>>1СJ&)РG╟F╞9 ╩Xв\й▒o╧Ї└`a▌║]▀кs|╧s xu╓j═T2у{N!Чо╒&hLс╔y4#yЮnК╪ЎЪж-╦j╡:<╧ўўV*▀├├╓ ├рoН`┴√hK■вЭв(▒@к╒j╕И:╝╘мы║б;нж╤╫;hЦmЫТєрю·ЦePsРz┬▒ь░(ШЮк╬▐;Ц╦t═А║2┘Їшш╛9s√''╟▓╣дaш$ЕZнFWWЧу8р x~тэ¤FGБвЕ@└▌]╗vїїї┴q╡╥Ф─$TTHТ%В ]╫Щ7o■╛}├p|░╜╚▌ОROеcбё`<7и~ylтД║НЭЪЪJ$pЬ&Б3ЩМжiхry╬Ь9нV в═qh8_п╫┴C(iZz:Эn╖█` ГAаv╕╠╛oыLФ─-йЗnВ╗а╥\.ZГJ┴ №@Б°Cc┴╚──D6ЫЖ┴/ °С╤╫7055бк`[ХхxOOqllВч┘■║Й╫▌▌л(m╙┤:sB╙└эФ(╩ХJй^o╬ЩГ√┤Z-У$ U└/$░?99ЭL╞iKей▐▐■z╜╩0\"╧F|H&╙P└■Aэ├ПYбЦ`╗МєP°Цсj,ЦАg╞╢]ЦеЛ┼Ю▒▒И┤ьwuхб▐ЁЙr]ю·▀aЦIд#щHG· 0эш}p И∙М╛ЖщЧ─;7╗ас/╩гЙz√Я w1с0╤ыOЕЬ!B\x╔їHгд└hад╟ВZ╗f╒Т%7г;[}Cёuы^├8╚PN░W аГ(К ╚uЁ┤Ddхsi┬╖G&ЎЙ2 Б╖*а Ё pFw▒nР╢Ш;w▐╢m█z(ЬСCЕАПx#ХN╟╢m Тэ█╖u╘Q╙╙ЁV╢9фРёёqКвЁкСXТcхr╣┌l╢z{{L╙j6}}¤ЪжтэЇЖ_Олз╥ S▀' ▌ЬЮ. Їa╨┤сХO:ОE╤DлUOgТ@fАVсTEЁарJЖ3эАЩRбisч╬▌╝ysooя╪(рQZT.UЗ·'╞зЖц lxqc▒╗└sт┴g └P<═°//h2(Б@╜P ╨0■ЁЯчеТYCЗh3сLA╨└ж_jрX°iprrrr╤вE√ЎэГN│mhДЪжFqЧ├╙F▀{LЎ╧]@ Г╟ЫюЇJеRбP└;ik╟╗)R4▄ГБ>ъш[╕p■+п╝6wю╨Ю=├mЕBЮ3╧Csp\лU┴F╗н4Ыї|╛ыа 3Ф7M}ddьшгMMХр╕лл╗╙iУ;бQЇ аЬaY└м▄жR└┴Э;w2ж╙┘}√Ў╪╘>@$▄ ^┼у└sd╗▌╨М┼р'▐q│╤hтB-P/xЁ>я▐╜я┐╪Жg 8;99Оsщ _ _Fд#щHG· 8э╠|v&KЗ?╝ЧЙ┘2■lV┤g)П$ jЇ╧ ~яГ┐?╟┴*ЁI╦гВпСyxхIрс ╚g╓мY╖d╔R└┴F▀`r▌║7рЕO1$@бу╗4Гl╟EVS┌▀■╓7ЫїzйT╦eВ└▄ё╟;■ю;▀°П ┘щз_°тЛOмюЧь▐╜ч╨Cр ўЪаdpA░ ╝b╕єЭя|чї╫w-X╨ l┤uы╚Ъ5Oт└Н└CТ$W*(Ё╨CЭ~·щлVн Уv ИOИя╝єT я~╧┼i╚є╬;Я┼_иC,╦▄s╧=>r@m█ЇPЬ╗c╟`аp┼╔E]ЇшгПтрzАрs╧=7o▐<АB ╣ ь▐│Ь^ЬЪЪ ╫па`WGАкГЎРяр-\Аъ.╗ь╩XLДЖ¤ълЫ7Б╠║╗╗┴░йi:р PP▌╫┐■ї °╟]]]Л/~·щзб. 3( ╕Ё─ ,ДНчеzЮжЙdм╙V]╧АИЕM■3oHE┴Ёwэ╫╛Бч2═Р╡_▐PЪоАЦсGFЗ╠?д▌i&щйщ hl╕ф╪,Я}Ў┘╖▐z+Ї ^^.Злy┬/╕@I°вt╨8\r╔%pi■№∙`М@└╬╖┐¤э7▀|ГgЯ}MГGш╘SOЕЖCTyфСССС■■~'№╚╝▀Д"Ў└(x┐n№ЕШ+о╕т╫┐■5─Г3съш ихл_¤ъm╖▌dёжФч╩ЁчЪ5ыЧ№`)1╢k▓wи╕nэ╧є)Ъ┼8ИlЪёё─6▀мЦз/╗фsw■сwйdЮЇiU1╗{√▐xы═°# ╖▄r 0 `A,&э█╖^╖pf√ЎэЛ-ЪШШbY╬^р]ГсNАдOЮ¤╔eП/╝( нV шА`xxпa╢ЗцЇyф▒П=Ў Р─┬Е ?√┘╧▐u╫]я╦~ @'Gq─Ю={BузЯ~ъw▄Aт-к1AЮ╗°в+ЮP МГУ╗vюeh╔─;1в .╕р╬;я<Є╚#wэ┌W├4! K__X ж|:їFepи{jjт╕уОГТАA╜╜╜яЩ}_╝}п ?&wЭr╩)?№pШф╗·ълJ(б▒└P]"w\ГжI@@`A┌YgЭїЫ▀№°UТЁ&╥v p&2CвВHЖ╣▒D"┼0Tш- ┌AВТ=;vьЄ<чSЯ·Ї├?ШJeе-╦q-]7ч╬┌╝∙Ir╣ Tюя╟P°│rхJ&t0Ї^8Tr _zR/┐№Є_¤ъW(р9hщaЗИ ─v¤ї╫CGАA░ ╧╔╢m█у└><9P~и┴cnЗ3 ■B╗╕N8a═Ъ5√╧@и_zще0 ╖ю┐№Є╦CCCЁ╝]xсЕk╫оЕ>м╒jLаmит/5!ТH"Й$ТH>иД┴hv!∙■є√▀ЮяС"х  #■?Z╟Lррьь└Г8pаоOZ╕░'сСb║Бm╕q└┴╡л^\rрр▐Э╜ГCы╫╝ьxEsояz╛A▓оi5Уi┴╖э>z▐цНлС├MП79A╬фЄ√FўїЇЇ|Ї─П>╡№й0[xTлUр} шяZx╖┌ ╦t┬сNxу╨ДKг Б%Я}ЎY ╝pTz||Hо╢;MО'Л┼░╫жMЫ4┴┬З>Їбїы╫З╣в?Тч─ZнП╟жKУ┼bю╝є с╖ўїїLOO√>q┴я▐╡{ы╓Е|q╧Ю╜АzоГ{∙|p(О┴r╕OaШ╒бuCx@Э░U╗ёълпЫ^XЕ√щ№╣?b^В{├∙yзЭq┌╦/╜ ╬@╒╟}°╕╖▀|Xjll ``K╙КЎT╡u╤EЧм^¤╝къЩН7оЕГкоыkЪа07>> nАe└шюю^А9И╨[&У1M}vО▌Я ° UлїББ╛уП?сЙ'g,C∙l6▌h┤аоЕ ▌│gW▒╪,Ь$xgгl6 б┤| ├├├╟№3╧<Ю@гаяа·д┬├░b┼ x<┬ nPРо; №є7l╪─~<ЕГє╟{,TПАУ ,АУгггPж┐┐╧X8hаIЄдУNВ╛НCиO>∙фuы╓╗э░╨П{ўюo├o√Ьw▐yП?■8<еєц═█╣s'woВKQv0ТH"Й$Т фАa▄¤й;"xSюдHб`Ip╒Э¤рэU╚ЎXрC0жМ╖ЪёЩY,AuДУDЮ╕vї·G6ўЎ╧_┐vЛу2-р╧Ъ°&╔┘о▀v\ХpЭsi┼▓Gd>WЩ4О:·╪ё╥Ю╧^¤й[n╣eёт┼╦Ц-Г7ўт┼g├Лшф╛√ю╦х3Ё■Jh4ъ∙|└%Щ└ыреЛ┐УB╙нV+ЛЇ╝Ё┬ Ё┬Жў¤╚╚Hoo/8 Є/ r]╜▐l4└╦Ч/ ╓╖╛u├ 7|ў╗▀;ЪЙАO╡[FРТLИ;19z┴ЛяраРpb▄Й'Ь╝zїZ]│о■№Чe9▐l╓ л╡yєKАчЭw┴вEG№Їз?¤▄ч>ў╪cПБo@0@ :KЧ.z;є╠3Ч-{ЄТK.`╙l6┐Їе/Бo?№Ё┴{ДАRN░▀n╒UW]u╟w0 .}Ї▒╧=ў ╩Т%K~Їг╕АУ^x1АяСG╕vў▌ўЮ■╣ЭО·Є╦/└}эk╫╘j А╢█n√Cл╒°З°'0{є═7ГУЯ<ыЬ|!√Л_№"№B +0▄┴pгF9▀#╫:щз=√▄S┘L╛TЮb▐▓НO_їYЪ┴[√▄}╧]]Еn╛п|х0d№╦_■<╝·ълЎ│Я=╔AdаvЁy╬Ь9!o═Э;:ыаСАш╜∙цЫ╨╣А┼Л-ЪЪЪИ<цШcVп^ Д (БA]t╤EА√P °АX·j ╫▀№еg~?└oЖm█╢э╪Б?{ 7zшбАь^UUбЫр!ДZрЩh╛тК+Аb┐¤эoCy(чo╜їV(P*Хрi№KUDI$СD╔2`2XюрZH{ДsЎлМ12xyi{─_ЛГd░ЕЁў ╡ р¤88;╣0ИЖъ8╝16йЇ$ЖB7Н│Гл_X▓t 1:║╣пoю·╡ЫПб(╤ &рСмы╣ЖEC№s·╗┌5╗XШ╗Ї╟?aў┬Kп\╣тФУO▀▓e#P┬Т%?(Л┴└т'Я}v%└ ╨Fo__еR ╢t╢├R│▐HеR$"А▐О?■ув╚Ll▀╛=рЫ.Ч■╦w>╞0@╪ЪU╧Яz┌щы╓о9щфSю┐я▐pA42\)LЯ─╤ИЙI HЮg═J:У°─'>╢ї▌7БTe;ь░ysy■∙╒]ЕЮ#О\Ї√[ю╚dнЎЇ 7^Иv╓Yg¤■ў┐(╣ь▓╦yф ЖxА"ЁO ЇOpщВ .Р$∙╓[юь┤U ┬╧■є7▐x#P╤Ч┐№хЗzш ¤CxOhЪо╝ЖШ@KУI)СH·ВyфСУУУgЮ╣°∙чWB4ъї╞Yg.^┐~├Й'Ю°рГ>Юzъй└жp# аjШ╗·Їз? Ї|№ё╟НA╨╬;я╝eП?∙╞Ып▌~√э ёЯ щC╧оNYї┬ЗГЬyРч;,╧8╢WйЦ╛z═╡╖▄·╗x,╔░╧Йч,■фos3E╨х_╗ЎЪ{я╣ +_∙╩п¤█╤╤Qасп}эkw`м3╬8кжЄЪkоЮ└└▀аRЯ8°°SO>%ХIKВO&~№├ Т╚1,▄xэ╡╫B4А№ю║ы.xTЁ7мu¤╩+п╝Уe∙'?∙ аgШEЖлАГ│э·SБgц┬ /ДГоо.╨сОх╨GP╦┼_ , ┴▄╡k`7№h9■ДПо]╗Ўу 8Я~оС юw┐Г║┬йЗСDI$СDЄ┐TH╝L╪▀ Щ8/`╖¤8ш═f й$<Яp zDxpЩ$■t╞╓┴▓Гaj│ х·"LВк`O╝Є╕╡л╫a▄╖o√└└Ьuk╫╣I╙lЁ╔cЗb└K╟umxЯzъ┘w▌u;Mpк*э ч╢щ3ЩIБ$$4ADщЛю┌╓^vэ╜/vA@DDzSдГВ╜▒k/иАаИXpUдиtHHB╩╠d·н ▀9gBЙ.╛√_▌ў╜╧ючzs╦щ├∙▐ч9чyP┘кккQгF= №є6lЦкwLEС@*АQ┤г(К`J@ИД7h╨ $RWWw╔%ЧВ∙т╝N8iэ┌╡▄ О╟╬>√lЁЪ╞ў жыыыq4│f═P5PщО;яzще┬╤HiЫ6▒hTр┬>шрbгN`k С*б3 ─|╩)з}Є╔╩D" r'Эtт╥е╦°_┤╔ып┐ └·p┘RФ*ОЬw▐y_~∙хq╟ў╓oв:¤·ї{єї╫╖l┘ВОЎ╕▄╚нжж&п ?ейЖpИ]U_xс╝ M ццт╪▓и(ЭLВТwn▀Б╘@Д°РX▒bъИ╤┬г╬▄|є═/╜Ї*╪hЖ■ЩхЙш╕_|СябQUї┌kп]∙╤Кx$┌┐o┐HМFп╔═з[pЦ-[vЄйзм■tїЙ'Э°╔кUЇsеzя_╬=ў│5k0H0x■ї▀Ю-╢╪bЛ-╢№╦r╚ї| И╢o═Я╪рЩдщNс_ЦГXРДГ▌хJ┘4├╩FФ1П3F╪╛}{█╢mWо\╔¤╦04╣+Aр&ууП?└┬З╦йкщs╬9ўгПЦЯ~┌Ы6nш|Ї1я╝ї&Рвкк·иг; D┌╣{╟1╟t-+█╒▓╕fzIv╨-├g"УPQ]╧їчЬy·рбЄЄr_└Н╟ ╦lQX╪√╕c┴"йD▓MЫ6={Ї°hщ▓s╧>ч█п ┘гWўх,з╞78КlЛ6cn┐█онУШ2└UKЦ,iХЦЦ╓╓╓ВiРкs·щз┐∙цЫ@Р╟YgЭїї╫_ўъ╒ OnzЎьЙ?O9х╨б█э6 у╧■3ЁЛ┐Вt╖▌v█╗я╛Л2№Ї╙Oў▌w▀'Я||9dўpW2T╔╩6[YЦ/_╬═п°├Р,Zї╪cП}¤ї╫╣5є╥K/░вСWп^Н╖Р)Ё╫╧<єL░#╪Е▀╣s'╩y═5╫╝Ё┬ ┴@А√гХ+&LЪИт}її╫└D ж└░I4щ╓$КГ$ы=НSш╩H`n╫о]? №s┘Y╙Р╫9чЬрCE╨╦└Vу╘SO}ч╜wщюЬгПщ╨бЖ╩┐Ў╦п╨Ю╒UUW_sї7 №жrOрЫЫ┬┴ё:▒МCYt╧<э┤Ц-у▐vhG√|x~у·їенJ@{hНло║jёт┼xL╜∙ь▌ P^╖n▓гNkj╨Ж═нэC╨╣шAЬ¤▐;яцx}'Эt┬3ЛЮщ╨щHT╓ыў}Ї╤'Яr╩{я╜w╓9gг]7зэў▀Яu╪┐╝П╦[l▒┼[■╫╔/р fYА ▌|ю╣ *№Й╣Щ╗V>ым3>■x╒ 'ЬЁ┴Тў/╜ьтЧЮ) Вt█m╖LЮ<╡UыV╤H╠сRъъ"Е┼Eїё╕ ЙТ кщt╨╓╫Ж╧┐ш№▐глшrrCн█╢┘°├xцъkпyr╤вvm┌ пу °зхKЧ¤ї▄s▀xэїkо╝ъ╒W_u╣\╠з6Cы#┘эП╪║u+G╜є╧?м╥╝k.╕рВ>°чgЯ}Ў_|СH$Аи╤[o╜yA^■>№ЁCTp╟О7▌t╙╞НБx(v╠1╟tю▄p6|°Ёyєцэ┘│ч╬;я<┤▒Ш]╫ЭBГБ╨J└Aаj$╣Є╩+Q6╨и t╥║ukэПв0`х|у∙?¤щOKЧ.и!й>}·аl╟w▄кUл2й4╩ ¤Жї▀|ўэ═7▀№╤╩Хi5Г"╡╚/6╒╥ШЕnGZ╫Р)zє─ODaxЇф@ t■Ў█oйўяtЪя№`б)@╒а▐n╕└tсЕвxш%я╛З╟n┐¤ЎysцАM1 ╨Ш╞Г╒╘╙ц>ц╛Є╩+╚L цk╤вЪt·Їщу╞МEэААи `MДfy∙хЧsss╤T=∙сЗhCФ _UUUh╠C╢3▀YМъа┤°P{╞gмY¤ЩЪLЭq╓-√И0@}яш7m┌┤+п╛¤u┴Eо_┐■Лп╛Do█╗ўo┐Э ┌п[╖kЛ-╢╪bЛ- фpР·f╗Aя╛√ю'ЮxВ[#AKЦaЮ~┌йЯн■ аАы└ВЗE╡G╒╒o┐¤╢╟чнммшl┘▓Еn (/w∙<Жe'╨ЁkЩL═▐ъ╛}√В╪@o■Ь└О]╗▐yя]╖╫є▌ў▀OЪ2yOY92 °|╧?√▄eЧ\·╞kп¤╕щЗ9sц╠Ю=ЫР,Z \ё║▌х╗╦`╛P(ЇуП?NЩ2хЗ~()))++[┤h`о╝╝9╓╘╘ФЦЦ░FПНчБP?№Ё▄╣sБ#╦Ц-├3Dн╗uыш┴cW_}їo╝ЇAЪ╫_=╨07qт─`08d╚╘ёР═ ЦE╒С·ФSN9∙фУ┐√ю╗#П<Ї*B╓╗wя1b RzВ└@c(РёТK.вБnС╘н╖▐К╝:р*< Vг;peеro╒р┴Г╦+Ў╝ сЗiк╢═ ё╜ХUН K╣я"╛ЖOЎ║S║]v█m╖б╦АГ,ФбЕ\Р;илооnёт┼t?x4┌┐фХЧЧЗ,АП]║tв.(Ш█эЮ5cfз╬Ga╠А╪:vьИ&дC√<¤┤╙B╣╣└A┤3AўбMPёсCЗ!Э┌┌┌ &АG∙>ыбCЗ")4╬иQг@с▒X ┤Кщ╨бCs~ 3·щзzЬу▌УN:iхG+╦B3▐}ч]Н:·Ю┼Щс ъО2#5╬^x ╔вЬА]\─Я\Л╩l╬XLXtTЩв▄ZТkAxhm╝╦ЩМ+/ё0R╞є:Н╗lr■у▒zqd╞у∙ю┌╡лKЧ.сhп# tCuUUN($Л"_Э┘XАж|╞]ўq сД░%биx(Be|hОн(▀Z┴╒lїё·wчю]╣L╓н_▀кU+┘бшкжЫЧGC&6│7Чs-:е┼├\НЗ+\UIРС+w!h█ю▌╗пY│Жп╦D}1$8ц,|атu╛kЗЯИ┤)hД:°GоyхпЁ+ЙTкmы╓Ы~№17д▀'йC╟Ю╢┼[l▒┼Ц  Т┼A╨f▀╧>√ P╥вE ╣ХУ0┼З>їfwУHL█д╚°Cв╬_ТЩ4Я°щtk░B:С,*,млбvU]▀╠нйСIMв ы"З$№ lтЮP▄N'ч3║ЕЕ█IўW}5жЎ√▐Т╝▄╙ x и▌▄╬┘цш╠-╦@X ▓├хмПP█оCV4Гp╤wh.dБжC@ъ yс╤╚<А2е+U╒2УнТ─нt2Щ╩┼░с▒Х168Ъє!Ї?АCYp╧▐и#Fw7x╚вRD"ЁЧ╟Н6IдТ╕Вd═fМ▌═ ╖Шг у··z№╔1·pы┼/ўх ╝n;█bЛ-╢╪Є█ цОT*┼5#|├Ж╟C▌qг┘┴ТЯЯ┐i╙&1MWVVтджжпdqР.┤*)Y╜z5╚ 37└Б6итGyФ0>eЄ┼mFFMe2Я_7╡·x╥Ї╣▌▐T&ййї@'H▓@B╛`y┘оЦЕйDLj(Vу<═O┬с05Юf0фжфd<┴╡ТиїН╚L╖╘З▒°NЄ▀МГ|У ╫zв▓_n6=▄щvя^jО╧╔╔ССd╞_╬(h(╩ыN╖ф&┘╞ЪА╟√o)?·Иoq60uс2°BR╨-Н·▀Т/&0 Rцы,Qkк-n╞с!╟ 7XСТтб╬#┼├@° p═1WЯгё∙╛ЬЯЙзwHс+D∙┌^╛ -yXщ№╗фp█┘[l▒┼Ц М4з╢└ ор*<оSр;SЫ├ALy╣╣╣-Z┤°Є╦/{ЇшБЗ╗Б[▓dI╓X\ZZ DвЭ;wFB|CCvяHГB Wи▒SТ-M╧╔ E├З╟щr{+k*=БIЦM ┘Т|nW}╕▐уr(wв╛╛╤5 Ч╞ПЛNвj:уu╗│АKз6Mn:T ▌ FjksB!▌д■ЬcЙ}┴─ЪBс Є ╝@r└8▀ЙD°6Л├J°eъ]q╚╠▄hЯ╧ЯМ╟=~Ябыр 4Чкktу╢м$Т ы0¤ъeu╖M══ьЬЪ│┘ЛGгНЮЯ┴.°6рЪ$МюЦТЗ`бы ЪO _$Ежу;i°RB ·░В╦б ╝нВбР┴ ╞эцап▀XEт[Ю∙Pо┤FkрЧ╥\}Ыж8╫╣))аЪH ─┼├Jч▀% Цv╢┼[l▒х▀.?c5т[x єцБ▒∙Zйц■▌╞-рр·їы|ЁA▓ї√я┐╟╘│l┘2КГ█╢mk╒к╒gЯ}ЖG{їъ┼ї:▄/a,╚O°&YQїh╜ьєP╟ЪJЬЬhЖЮHз№^&Эr(КЩ╤@=ЛД╦╩CнJС?}ШЫЙ+└Rжnд1#т┐║Az█╩▐6SIРЫИ;>]╙RъE╣щы√Т√/┴A┤;П▒ТC]°цb╚ю░╥бk√Шэ^q║▓-`-ЩPРЪоЙ╠зO,$╤═ЇВ╥aЦєН╩▒х╫tYБAо@АuЦEL#еж▌└#ц│░UНrr4|Э4зї<╠■т*4ю┌Ж∙║┬ю_кLГШ5лLХ┬?Ю╥88 Eс` єe и8( p╡ГЬ#╣nC├р╖╥ 6Цч╫╖│-╢╪bЛ- ▀фg>╦∙.L┬p╨чєaЖ┬l┬Чr,▄╦вEЛ Р╔d0}ї╒WШ┬VнZEq░╝╝╝░░ЁуП?╞|╨│gO╬`АЛ╒ | &U``n╨MТQЙйП[Н╫;▄.@боf@ЛЬч╠DRtyиE╒Й,Зb▓°rd═ QytС&бЦгQВtшuдя!jЪ }╞KЖiР┬Чv░щ┤КцхqA°цх=T┘╘u┘СmjТ╔║.qМ`{П%4Ч╠)6╕щ&═ьАnN°ЛbCvYЯ54╝ЙDTНRT&CN#Z/ ╩ЫZ&нЁРDAИ╓╒хфц2_єЁ√ э╞┘+ЙГA~Сы░∙|S╜ц>╨жрjИН╗С,BХ{щ┤;4-уp╡ГД¤8∙ж┬╘°t ╦a╢3a╗аЁЫ:р{рWдєoС├mg[l▒┼[■3R__╚ыШ/АgА?А▌ю▌╗єЄЄ╢m█Жя∙ц┤ё║я╜ўрП√▌[│fM*ХRф▐F>∙ф`_п^╜╕.Р;ця7т Q0-ТV1х?╪пя╪╣sИ" p╫дйSйЪPUЙ╙EYAqО╣gр╚ЗFС@p╨-7?·┬sYaS═╫-i ├мПЛ>?1(I·h:nЦ5%┴H%,Qа·HЎц~║л *э ╞[,╚7є╢=МTмЖ ЫЦЛ9№LKЧH#BБрв) .┐чёdВЎZ3;▓ЫKЮCdЫцh╤╒mй "э#Еjsнx╜РуQё]t╒йв\y┘eЛ_}їч▓9ЬsЛ*▀╬╒i№[хчъpЁЯMИH▓ЮHXжйр╦╔"ё╜{}-[Pїщaбp8 Е8rД┬oя╫н▒├Тяй"┤i¤V[7╗Эm▒┼[l∙ПHs┌A╛▄(р,W\\№┼_p└8фє<ф─gЯ}6■№э█╖у_°╒лWГCЎ9ЪA╕Дt{ўю═ўСp7╚Нд┬-╚t═╗(QЖл ю█wътЧИо▌|╒ХЛЮ{Жsи6wAuё─═Ч]▒ш╜%$Щ║э║kЯXЄ╫WСqРP▓dTA ╠▒тїa┬&l├2JWV╕JК(f╥В╟┼Нz U╕ЯL~?№Ё├QGuШйPЛз(HDТ2uag0ДkС▌╗ГееЙ╜{╜А┤[м▐дz;▌4h░ш├K>ло╕ C▓ю▌╛c■ь9Т VUT>>╡я╙ЗLвИш╡h$Т├"И\rсЕп┐ї╓╧es°¤╖k╫о╓н[є╜о▄Хў╧╒Б4Б┬&╓ФХ╜Ї╥K▀м¤z╬Ь9оv┬  k╟~~%%%Дэ9▄т|ХaЯ}№╟╠╖╒ ╩в№Ыф0┌┘[l▒┼Ц И4чwЩ·Ж3 kcы╓нэ█╖_╣r%╖;Єy<ЙDЦ.]:uъT╛ЭьgЪ&▐в8╕c╫NОГ╕╘гGщоОЖ(#|кфjк╬┬Я)їё█o╗g╠hтў═3юЄлп*8о7QS─х&▒СO>4ъЖЫ·8█╢{■Бпъsг╥│;Q╪&S>щ6N╜р╞p─bFNьйxj┴У{vэЎ*КаiВ$dd┴r:GOЭL [■ff+╬╛n DЎY┘LbКЇh▒#5DЫTЙ%p│g├u│сyбЙСВОIwэр-q┐BR<╡Ъо0ў▌╩╛b6н3оКO╢╔jH·Шiу╠TZe┤щ╕a├G<2Ж╕▌√Z&ЫЛ╕_ЄН=╔/щ:╜O?6e╥Ў-;rГARFM?·бQCЖ ёфхk╔Штё#;-ЪP~ЪЪH нhRC? +5-б N[╪И╓U▓┼╓ўU╓┬ТT4т╬ n■ц█а╫?lЁРЕЛг[-5%°▌їйD└хзїMы║ЪО┼9бАшёf█_`эo5ЎQC+╨ M7N▒╗сeF▐ЩС├ЖОЩ■8>?Итдc0w√┘Ц╧жi5`л@;СcХ┴nё\Ё#HХ▀|?э▒Gз,\а║ВвGde_ ├йq\эгIЦ╛ шЖ!+J═ю=∙Е-'Пz°■ЗУ:Зc╓▓&├h>им¤к┘0DpыС!CЗ▀?\@'ЩrW─gT╠ч╧┘gЕЖт4&b5╨:i$ws▀°9В+╒Ё)E√Ч╖ISЭи╨ЁJ*3b╚╨q╙з[Ц&8ш╟e"ЮЇ·─[l▒┼Ц▀NЪ3sя"бU m▐╝╣c╟ОЯ~·)ў x╚ч5M╦сЩQгFё СЯ■9ШАHqpK∙оV┼н>√ЇS║v░{e║t╧r8ZFU╙i░gЛ№К#'H╘ Й&Ж¤∙ДЙkWar°╟3[∙ R$ш├+D3IT{їХ╛■,q╚╧╝`╪[яoА8Щ▐╪бeТj╞ЧУЭ`╥Щ┤█свл E╣l╦рИ█╨' ЇрC#вn%╘║5&pSС~┐Гш$Т$╨Р╧Н%K┤Л1ўю▐╒ви5IжИаPWИ5╡Ba═@!С║p0/D f▀$ТJСМFЄCЖйJ(ХЕ9▐╩ь,w╢(bУоE2I╠Iл)Ч█C'╬tЖBg"A╝^f╝ж╩Q#Ч╨· F[╩O2├SЬ(2&R кё┤D5Э|╜ЭLDУЦ<зVu║Sх╤G^|┼Ш^$┴С╓)Э$^1i╒╙░V█_KЗ╣▄ й°w5т┘Твїa┘э3mBUм~ю┬∙▓ьpz\D%FuНlvз%'F╞-9LMИФnЕ4ё2Лd,ILК2Щ┴0I┐ФA;╫САе5,SR▄$╔╓'-╦v║yє┼Ч.Z№ ё╔к@╥Д* Б┤r2Н─W %6[ёйаo EСb╡Q ъднa1@L╒У▄АЦI( !ГQc"Mо,╜IeWNP6T)eСH№▐╦пШ■┴д>FrєikГfи 4gXzFFз╫╫уУЕ╚nВч=ЮМ╙L[ЩMfЇШНР╓Й!Уz│ yч╬Y╗<- с╩квЦ┼─Фў!#зЎ} ZM┌\tIU╥F]#бк [чZў%Ч═|ўzCЭ▓.Йd,╟эе╘о┤OЭ^╛BФЎ;ЬD│·Яu┴Ь╫▐жk11]┴@╞й└ИЙk╠п╕Sb+D ╢╫╥t]┴Cёё{щї·AFЇ┴ЦвA╥-ХRЁ;E╓hU$ПС?]ЙыФj┌+;HmКЄлЛ}dЧЇ▓%б:jФ╝ыВ╦f╜┐─T#bAР1еHS√єм-╢╪bЛ- Ii #┬`0r█╣sg█╢mЧ-[цt:yФ▌H$╥зOЯ7▐x╖║uы╢g╧юТц¤ў▀Я4iўт▓b┼ A▓╞т═{v╡*j╡z5┼┴^▌{Аodf,VУ╘ Zi)Нпнг╗3ъ№╤г█╫E╛·№у╢=┼ф╚W[Пь▄u│Ш|p╞4тєM╕нЛ░ЦипKХx┬╒Хэ╙ТтЁ╟J█▄№└╛╥VT╡├Ьеe2Ъцt╗$AФ╤2MQh╪Sвйw ∙дЩo┐IB■X4ь/h*┌UW1w╥дcИ√·AГ╟▌q{0?7QЯ║▐\ЁjЖЪкй фчуї ў22*╥l█╛▌┼Ч_6s■▄√~Иx╪4ЬVgПЫ░х╟ЯО<т╚;FПгоцУNЗ╚3R ╪╨СF}|╚ьydчЎЩ/>ЫDк┌#у╟)Ш; єсыпo█▓Ё╞Hq╦ЗяР╥╒#┌w╝}╪0ZрHиўш╚╡С░?6e<С┼:Н№╣2BH]¤ф√югт╘ШрwП ╚╘йУЗМ{╫╣tjY\╖uwЧ=7F┬e▒·гО9zрДq╔┌OaA:ЩP╝ФпШhдP[0y╥хЧ]Ц█онЪ╙й╫V .х╞╛╖=ў╥ЛАТL]XLi ч╠█╡is(X0d╓\"QG:Gv╠√[%Х╛хщЩ├я╕e┬┬'IB¤╟и╔ЧПSfF<┴Bл6:k─иЎn╫ wї{ьЙY╗jк]▓c┬╠9АW+rs@^j8цn=яв'▀~]#I▌що%ЪУ(∙─!hdЄ]Г╨╗9┴`▀1q -%q B[+ыъgМЫи╫Fъу╤.' ёЄw {р■▒S&╩а@`и%П╜нЯЪLu<жєЖ]█&>╜ /iЩY╖▐Yмx6¤┤╡╕m█┤('ЙРРДЗжOKj)OnN2ї8$щ┤!C№КR[╢w°Ьg╠Hн┌╢ЇчSi┤║x▓цс▒cI═╒ЖO}bт W√шяQb·Им'2NWрP8hА╝ыvэzl╥фVyy;~°1?<¤ёqў ё─B=СЪ=z┤й▀№╒┌^]╗╗B┴]СiС▀фpW(ЇЗbУ><2 ╟ОMр#╔)n▄╣u┴т┼йp─╚Э0`ИVMWDК╣┼┼%)╦┌йyш∙Е{ы* КЛи.╡6"╬I#GT─"бЬЬQПLвc╒зАГo8єВNэ┌?8k╞и╗я=m&Pr╩¤З`ЬЗrЁaFgфэ}¤nO,Г^F╒dТJ╞Ь▀─бt╬8/r ¤Гoў┤╚5┬ё1│fЯ┐╗Qў .V|╡▀■T▄╢їоАU/ТnMЪ·q√0  ■SgЛ-╢╪bKєr╕8╚╜DЯw▐yкк╢k╫ю╔'Я▄╕qcзNЭu?ЗГ\;°щA8(│R0LH═GГ╣)п╛c╗\Y9o╠╚>ct√ГГ/╣qъ3/Р6жS┬+R╞ wМ|яШW==■║█X°ё°I█╢lв╡ ]╡$Qr(UЙP═ГбkIбЪ !UiўЯu╓ф╖_'nG*vчЙВ╣ї╗oж▌z╫ёЭП╣q╘╜жZцП|`─ШW^аF:Гjn╞ ║ч║┐▌р-QилоYЄЎ;_~·┘ KЧ╙╓╥ї▒ў▐s∙╡WЧ┤kУNйєз╧1y2ц:)@╜сPХO$9ф·єsB╗}№∙ч$Вщrwьz 5·┼Й ?╠Ш8┴ЧЯч°о╜хQсO▀}фЯОз█лч╠!Гяxпйк&1╞M? │птLжTкTОЩpу5╫╨▌╛n1ПN~|ZUM╒вчЯ'{├ДH#п∙█#c' G┤╒йЛE[▌ЩЯ"кщФтqЫфP┌A4TMэаЫ·<·т│TMШуKFъ<╣╣f2∙▌Чk{ЮЇgN╒╧LЩr┼W$Т╔ВВЦєg=ё╖~}▌э[Ъ▒zq{эГ7▄а┤+>ёС▒у╟∙╟¤7ЎЇЙ'╛8┐╓╘ЄЙ/╢сз╤╖▐~dзЎ7О\ХМыimщ╦n╣ёй╕еожeпЗъР єж╙╧~j┘√─A╟JТ┬╡ид╙Кр* Ї╦|╬ЁxЇеИ▀Ею%)П╗Ь0х╘БГя║∙╒вI{ыk╟>>═p╔╙g╬P▄^Рт╕√ЖН<Фшжеыa=5c╤ВЗч╧"▒xr├&Пf<Ї╤YstAКЫV░╕Шю:·щзL,}┬▌о║р№ЎнJ╤к╙'<~яв∙a1ъq{ЭItЛ9l°=ў▄7╚з ╛ШЎ╩╪Щ╦w▄ї╩wъ9чЗsЎа┴▀m▀╢`┘RтuW}√mЮ П2lфЁaЪ(: [ЦeR%=║&u▌н(f<&й┌М#n┐■┴2ўbn╬Д╔ЖO Zєэ╞|зo╘└сгGПекGП[u+О╢E$рV╡МC╒╨Ь3 ╗{р=IФl╠zdЄ¤єч`QT▌╣ў▐;√╦>▀°GF?1uf╕╢nЁ├ОЯ6∙С╣sйС╨э╩╖_~┼В┘s├5╡бттqгё╚├диИ?екя~Шz} ю▌║^7eDY╕║╘5tшшWЮFЦн█JСi}?4g╞▐\R'hэr[:Э^╩%вНГ╢╪bЛ-┐Щ№ №ы_ ЪL&╣o╡.]║╠Я??ХJё@┴┐МГВ╣╧XLcцЪ╘3m2O─тнККУЙД╟ u╡─GЯy╩иw_%y∙ПЬ~щC╧╜@ZхRлPTпM║Є╥б xКx\гП?m╘ЫяQи╧O▄t╔W:Х0E┴эёиЖОRйjFMжВ9┴мiОYfя;ї╘io№ГNЎtКпл╡|┐█}kПуЯ№╟?ИеТвЦ@└kN■єKk>EI49юО;ю~┐яШN╘Жh╥%bС6DЗX╥Жьйxf╬Ь>ГТ╣Їоnк[+,\x╫╪С─уд?kєОю8~·у╘oNП.DK║3╫вfM╠╓imЁ╣gOЭ3gO]mqя^╘░K | ╕·ЕП=v═WzZР▄жъ╪ў▀/xх┼'(2Є╖[Fъщ╪С╘USc║[┌╗э'п╧чEтШe5s└Iз═X∙1ЙFH▌1гЕkХВ|к=═дDEVd'3■яПГ║ЙЄ▄r╞) ?YО ~oeYЛ╥Тd<цsы╠fШHO>№║>+ь┘Э¤-э\є▌ТхKo9XL%ЙщЭyї╒wOG┌Ч▄u╔┼│ж╧&∙н╝цЪ^Z┼║Д,8╟\p╤╚iУH╟╓D╧Р@░f├жчЯ{ё▐Й-=#8$кh Gя║№ЪYЛ_"!/║|пЪЄ║Ebijл5H▀│╬Ъ┐№Cj¤L┼м┤zу-уxHn]J█\MЯ+Q]С░ЇP(д╨хА йОoЙ╞iуKдяyч╬√5┌G║N┬СС¤юєЄ+дb/бЮ,%f╜5h ]╩дБў▐z═5y]║QK┤!Рpb┬дёў╠ЫШ╩$єЬ┴▒}√ї1$┐C[шо╫╔Ц╩Й├Ж [■K#х{CЕE`ЭFG3ь┐╠@lZ$Щ╝∙╥KЮx|жTR╩ йQ▓зТфхРэи╡yi┌ ={?ў∙ЧtВ╧CъS╔вс|RNY&ЪЮ┘Їг│e!Q\джЪ┤╠┐■Ї?? ┘j№и]v▌}╞╣3▀ZB╖RХэдi:╠&jFЎV/ЬЄ╪▀.╜Ri┘ТZЇ∙╫▀?є┬є7?4X(( Uс1ў 6·!еM╗╬┐d№ь╣дM╔А╦/Яё─В┴УJN~`─¤SжТDТx¤$Оэ)_╛ъуЛя╕Эh)║,б:z▀╔чM{єїt@sсw╡n<■Дз╫оа╞}┤Oet■5¤·.~)iTxZС ЖэТНГ╢╪bЛ-┐Щ.Ўщ╙Р╖m█6RDXZZ·Ї╙O В▒°РkiД AК╟у∙╣╣щtZM╙@┤ОяX╖aўП?v:ўФ▓=╥ЮdЫ#О╪ФЙ▄ ЇУ─▓жў╜3з6YS╣зэ╔=kЎV─┐▀rt╧^5нKо6XЄyїLZvSMМaЩ уИЪJ╣]n=ЮФ▌+Юe°9чLxуuкїq(t6AeЪ`ШN>s╞;я┼"╡u$╖х─╛¤Ж-ШGУЭwЭ{╬мЧT┤p ▌<╝U╒Т`ъюs╬Щ∙ъb:СKl╣Хш╣щ╝єЮ·°C№.▀*,┼¤╦ЕУ▐zЛdR─нпЛ┌╡▌╬TM─-9ATO?э▒Q¤КЦ!ШщЭ.╢▄M╛с╘SПj█о Ї:Эхe╗╨+╗"с9╦?п$+кo┐юЖч▀z╨@ўоКЙG3ЦъЇ║йL╜Й╠Ё+оЩЁ┌t║°TСжFг╠┘▓╚=3Ъ|╚┌┴Фz█Щg>▒r)]ЩЧIИnзЮQЭ.ж╖ЛеИ╙=тo}╞-zТ┘х┘ЦU╝■╠3Ю_╜ФjRлSw■ёO│╫I"╒ў▐~█ЇЕ╧gияз╬∙Ї})"ЙDSу■r■И╝LBn╢хV$ёфеgЮ¤╚ В╠RСЭгп╕v╘3O┘$n─жщ]╙ЖJэо$╛└=W^∙°{яР·:RРK=GВо\ЮыN?ыЕўЧRL╘У/э Z#г╔Aкъж▐?ddыv█╖o╢╚_╗■╗Щ+Ц╤Еqйq:n=яВ'_yНBаa╢╪╬MХa@Ў╜╒7]}хY:>╝kWОдаS┬к∙╧КЭOн∙Аъ╥v╫ї╜Ў┌∙o Э~УаxрЫ┌Ї#╫_7°Х╣Ю6нИ&R░SVЫьlм4╠╠╓-п?√B║жNпOф{}U;╦·■¤%т░H└m╒╘║∙H┐;z·)·0:╤щT╙ G PS]Н_НQQ■Ё└√zФ╢Kюи╚╧ %ыы-Ы&р;┐ъ▄|R^qєU╫.·шУь╓%0(FИ╧йкц°o;щФг█СЫЫK№оЄ▌e▐┤YQW3q┘█┤ИrUЧnп|¤%с═]{-··;Й▐z¤uO.[JЗМо▌s╒╒╖√И╓mMUг╦GrCo╛√╬k▀~═V[WGЭ|▐шeР<ТолuIy3n╜m└╙3,Е?║c╩Йч ┴Пх╚@┌H╣т&Q▄┤П■Mёm▒┼[l∙r╕8╕f═Ъвв"З├Бu&yyy╕╦ГС6ЛГ█╩v╡j╒ъ╙Г╢Т╕4~ЖCЦй√1ъ ═б╕▄eЯYТ╘ЯЪ<ёЪсў8▌■o0n╓▄░Р ╫┼ ∙MИ╕t╧Рic▄EУо║iшЬyв^t\o╢э╤─фл╘ЩЩnшIж~Х5MKжЭ>?[;и▀}╥I3Ч~H╫ыЕЗГвЙnМ<я╥1│gС№:}юНї╗■·y+ЦS-QF╗яК╦з╜Ё╤╙$H╡tVUНPРO╥l╛%Ў9хфg>YE╫╦╙Щ8Пш╥НgЭ¤ЇТ╫щЖ БmX╟√¤хпє^}Э*∙"└& √9"XP3HRyсEc^yС*ж╞x pC}e╫EЗ▌}╧└╛¤Zю┌░бuўюT╗щIqK╙щ%╟Ч]5ў┼ЧH]ШфЙЪаК.Щ-M 2ЄэєзУЯ∙°c╩X~?*лкЇ▒}╔$ХN╣\▐Cс ▌4шК╦╞=:═▌2ПюHEВiХ╕┌▐░ВЄk╓_Оэ╜фє/Ч5IтЁї╗рВYЛЯжж▐$сE╝ў*рc└┼╧x∙яDЁ ╛шВйл▐╖LKИdИ├3ї╠┐ ~∙DЫ'й~4'0ё▐√Ж=:╒╨2╩ЩLтш{▄ єW}JdГvУS4 #YQу+(в╚eС■чЬ;ч├ў│№!╥ш╝А╘■Ч^>ЗfgQ 2┌!Эа|щtPЦJe^Ь>√┌є.бJ╙=U$РCТЙ┴ГN] д╙ИK└ЯCю╕k╩┤╟И/HЯЙ╟щ3с0▌$Q{▀а7▐ЁhRкIўг┤jЩ╔СЬAъ{ъО╛VSDrУШJL╫ГЧ\<Ўу╖"сЪа╙G|~K╒Ф▓8╚t╠шzU╙~°IVuAtP5╚s╧,╝сЙ╟ё Ё┴Р╬▄|·╘б·┼э6УI1/╧┤,ъ█╟0чП╙ў·┐щe{dGИь)'ено┐ттч┐ '▌Ё У`юЭ\2√╣чшH05:Ё▀▓@ьн╙ оA╖ўўo█╝й}ў$Юб∙ЎEдоЖф┤xЇж[-\АС?Єьє╟╝¤.СфIw:.йн%∙y7Эy╓SЛ%"їйX<┐m╗Tї^w(H┌ФPu^Рeъ_о╝`9"ПОЬнс√о╛j┌gKЙ╙"║HjbO]{╫MПO!Gф╨еКU кпu)НОвl▒┼[l∙╧╦ст П)xєz╜ХХХ%%%А┐║║:Я╧ўs8╕}ў>ь╒Гт w4гж3AСЬ┴4р i╪эл╫уїO╠Yp╟╚fe╡╪2Я6T:■╨├ПxhД3'Фкй^8{┴їW\lw$|ьэw >╪╙╣-de¤ДЫo■─L╥2рхЧ?ЎЄbI ╝сoП}ЇОЦJ*╬Йkc■|FзОэп\4Ч┌y▄╜ў▄z[┐ЦG┤гц{ЁЦnС┤∙Ё%W<№Є+t╧,╒жф╒MЖctЭhZ╜┐OЯ╔єцЯЫ║C╫нH}&СЬ2f№╚Щ3I▓ЮДиЦЩИ=°Ёиёc╞▌╝т╠┐№¤└╜Г╗в|ъ╛A{ЎVНШ6Щ┤F_╟╤ц╖_}═В┼ ╚юО┼'NЮ2l№xПп/╡eыдЗF>№°,░,э·d·╔∙3 6ЇIС$┴╣ўыпЯzэХбуFУ·4q·Ю0dgU╒ГO╧С є)[[Тх╘ьfїFэ ╟A}╞ :Вj" ╢k^я<я▄┘_~R^W╒*7°5ш╢█┼woСФ╗юш?ы╔ь╖?√ф>\│Жи╡P╦ЄТ╔W~єхд╖_ег(Э$┴╝+N;эя}╠\ с∙шШ)ЗОсЁ┘cдкjЎ#юЬ1═Л╩ш'▐╘g╪│ шКЛД~╙╔з<╡j%СХй╫Ў4Т.█ў√(jVl√╢∙sч╒╒G^ЧJ╠`AшВЛ.ь▄╜╒#*JїЖMO<ёДшvзTMRФ .╜╕чzS=_:н╨╕,YУ19 цїDr█║Н/?√|О█K¤П{▌╒ёh┐┴ўЦvl┌vJr╒╢]Л=Ыммї{╝w@ЄC─я$uuOОЮ╕u╙ж[Ь■ш'Эt╓iз▀>rь зЭ┌щЇЬ2┼кй\╛▒зЭєрcП╬X8л╓╥ЄZ^r┼е▌z▓╜╪┬=w▐Щ'╣J\■5я|╪╗g1шн6R├зM|nг>ёш°Йf"md┤їы╫ с╪▐Ц"Е▒q {╜P7╥х╟O╚═U╒UЛЗ;р╜т╩л:vяFLбj▌·чц-Ї;Ь▒ЪHn0чкkо5цсЎЭПъ?i╗и└ЧS╜│ьС╟]u╔%▌/8єБ уйеX╙-ПГGЕk0sOУ╘^|¤╣чЎшttЮ╧W▒cGQ^╛ЪH▀2dа┌╢Х╚qаt-·уППMЪт ТЪi║<7Ў╜г¤╤G2п/flч╬┘S&ИрK5Щ║ёю;·▀?иєЯ■0-╘3ПШииЬ0n╝Цб:|Ми~wЎ/ь╘СЕБVй ╬к┌╔&hN╔яєщ╒╤AО [i╡╡s╟N.█╢#┐uл√зL╜∙─SO9щф>у╟▀sїХ┼Е╬ЮE2iМл╪╢ ц═╙SS7Кr▀░б$/DЧ@Hd№╜Гk╫o+,*Є╠\╘vт-wm█╢нeЧОcf=╬╝█Рфg▀<єтєХn3#ZGцЯz╞ЩэёcСl┤┼[l∙═фpq№чv╗yЇ∙x<юёxx╪║_╪J▓│ ЎhВГ<'║бвIР:▄ш{┌9є▀}Лц-Ч]╛ЁхWй3Й╟H2uўх╫╠|эUвР╛_4 ┘шPЧ╙R▓╙╔Б╨Hv=ЬЮJ'ъc(┤ЩМ(J*УмЧ_n^^n@3в╞cu╒▐Ъhn(HЄ№$г╞+ъТ]╔╦ў╡╠S▄bшF$оEтF"eh║!UZv>Т√┌5-ШвЖc:ЮIеєОьLН╚┴щ1-7kъНh╙зшu бАФыЧ\nBde├м_╖A2ММLtЧ├ x┐╫аn █╪С╠h{kbu╡Тi╥Ш╘а,╩┘M*╔t:FыХTУВCv√╜б╝\╔═вЖnEcА╣ъp─щvy0э√¤ЇЯzЕ╞v┌&╢X+ъ:Й╞╒h\KдшвСh▓P∙}╙Кз╒H mТIеrПюH╒Bш#Фв╝JOз!┐ЬЫ┘│'O▌5S^╢+Y▀сШгЇhJqюэ}┬ЇХ+*7~%Д╥║YzLWf▓ы╙▒x}LлЙ║Тjое(вШР┤╤ZїъF╫╟╙їq=Сe│Є ║`╣¤>╘W╠╓╫4ыcйdOъ║jJТ█я хPНЧIЭT╟╢юМE┬Кифбэуё(┴hСG}ь║═(VО╘E-"ффхчрз#╗ъ╬0└╟щh ТIщК╟,-!ЗeъВ╞╝@k╤=FZ-╩═WLG2Mxф`Qб"╣╠┤*z√y№ц-Мю╦dк╦╦Сzп╙!YDM%Г■а )√¤╘Г%pP╙H"n╨qЫМet~Б├p№▄ё9I╓gкўfвїMpхчЧЛGuз**D╔╡4їИйоН╓Жё╦Ж|yyДGД├W]aЩ№U─ш▌R.╔╧#9Оd<жV╓ ╒щp╚ UMд\нКмtшчЄyщf·/G╝╛жуЩ·Гt║\x7@▌\cиGлkеz5ФЫGЧ╥кщ┌кj|дyC9!<уp▒b╙|+ca№И B╣^ФЬ ╖q╨[l▒х7УцpTVWW╫вE p▐║uы6l╪PUUfуfтT*┼}т╪Ё∙|<3c╞ \Ьl┘▓e█╢m▀}ў▌су vм■╝эzE╪Ї∙ЧЭП¤Э?eС·╣ХeL'?~▓║╙ 'А├6о^uЇOдv4зdIЗ└AC7╜И┘╚Q7ш:*C#║жJврr+"╡╠жиQ7сПз(:8йоИ╘k╘jщї╖├▓ ┴╨┘╛ZЭВJ,╔<(Е%#9Х╨80p╫I=*;HЖmpр)PsRе°' ─еdQee─Ы.Н!RL┤KFtE║╡й&[zhT█ЗgЕzЬ╢ZА}qM,Ъ5▌ьнI└b┼╔ц√╓}ЯЩ╝%кБуQьLцZv4iн╞╘XvMы+▓·╩ьО╝╛█xлZ╘4I▌ЄY┤Aї)┌╚Е8В┌тїж╟%y▄┤Э╩л&▐qяЁ╟жС╥═дfзшдя0Mr╓▀рБc╙lLЗ░°$Н▌И╝ёБ"sЖу▒ьx]hЛYKqCчQbSpht М@7:│!Лa┬Фл<Z<┼bzM·a#fXyЬLщЬвнПZ╬и@3 ░P├*ы< #MCaп▓╗zЎG─┤ПЖE╒е Г шYЬE _Ui╨6╓QL ├Ы░M╓ж[cуBў_чkЛ-╢╪b╦o ═с P╫ї6m┌р|¤·їеееUUUбP(wш╨с√я┐/,,─38тWpD°╒W_Эp┬ @;п╫╗vэ┌t:╜tщ╥_ГГt■Jk_|&СL2щt3╖╠ви╤шj▐мс ╚Ф╬HgssI СЖйЧщXи╥│'UM1хKВ▓В╨u║┌Й┴ЙpgHM¤_`Є╥Д,╤q8tF@НVhС*]иСЩ▐f,f8HзJ▓`"7+SэpPf█p╤b╦┘QцШ6ЩгfЦиh▓й╘дqTш4М ╤=░Н8(X┘}┬ -╙╚Y╩i┴ЫTГЁЭн═р ╔Z┴J║└й,ырПNЁНї▓їхУ=╖КRпОмЙ╡=Сh<'╟'0┬└эpmНЛюЁЁ!QU2─rъЁЖ2ВD}6SынNїZTC)[)Un╣м╞"╤¤╪Н╢ём)ЦV╥░IРИ╤`└Р%█aьН╡ [DjЦиP╡$·PO ж,) ╖ЭЫ$kЪз╝iXTw╔бОб7√┐┼ШLhjПжj╚lYtfAWMЇмбmк уЙ^P5cЮнзk\s`щЪеИnлomL▓┤Х5ю╙q─╫:b°▓·Є╟щB╓ж╚╔╓6d│nЁqcй]5лHКУ┘}uV~┤9uK)╥╠<║.YВе╚lДяkMгyеQb╖╚wIgн┘tэ%╟x║г┴~nQa┌kТ╥TС╒Wф0▌Ёщ╨ФШm▒┼[l∙╧╦╧l%бfHъПШN╖n▌┌еKР_QQ╤Ц-[О9цШ▌╗w╖h╤GЬуJII╔Ўэ█{Їшё╧■є°▐]▓dЙa°є@ф╞bA┌ЗГL]╒dэ [pUW╬ ЕЕ63ХJ∙▄lязa$R)П▀ЧQ3▓!╩N%ЮH╗=xеЩ╔дq╪дjъ3║G`Ў6╔Aмм▓"╔ЎTx╘ ░EgK╣dp pP6LЩД╧ЎLп╞fgтўM╖4S┬DM*─I╥┼AЭ*лМА┼&▐dЖкC╤вЖbъ;;╗Ъ*]e┼J%Кt&═N▒i╢╔А╧ф5РsЇP4╡54ЛEН╤E╔N╚&▌нc1k/█вРРи╡Х┘╩йI517┤O yE^╛HС└Х}ї%,╪┤hRГ┤тT(ЩT+еKLщ├ ▐hуH} (oЩЖФуVx.щЪ╜оА/эrеИю'ЩWC`√5кT╦ЎРЪY╜╞>n╨йЪ╒d 9MEbЬе3╗ж Y K f╨7°╩Kбйo▀R7▒С╒X.їшСnлqp/0╠НK#їf█Gчл╣yXEXleЖ  ·DЎГ%З#ЦЕс╠R5i ?\{└╩BЮJS╜#╛LГоЗ4DЙэ жЯBУ╘╢л3║в%Р╕&▒qф:mZ:H╠}*d$гSВtJ▓dИ L═~"I╔ЦFLПf"a0)╒√йД+}i├J┘▒бє╧ЛЪАўНa╓}Ж└╕Z╘═<j* Ё ILк,╔оЫ╕╘°оdп┤┼[l∙-е94╪╥иу▒п╛· ┤W[[[XXЙDpф№WWWЗ#╬qе▓▓2///ЭNчццr+є7▀|#I╥[o╜їkpPч┌ъэ─`AlЙбкЕ!Ы@2ЖОIEвЫqMС∙Ч1з■0iШЇ∙#▄X,i*]"&╩Н8и▓┤[ё┼f&╔Р▓бH╥L#Fзтж4─юл 5OдQ_G#╖QхЩJT┼▓|fQ╓@╓Дd╫щ К:лaс?i▄,╥t1;;ЩжКур>╛a3tVГ╒а3╪zBY0Е}хцН.6┘Мq жI╢╛rc█qk░V_Щ#H├╗№1Гя^╡Ё%A√TfДЗ МzM I╩+J<UВ!╒╥<В"5XDў├A╓ЖTkkъS╬Z(E▓_Ё_fш▀з cї╨8╣6*5╞Ж┴╢i4ЇЯg┴WиYPУa ╦т╣X╦╩nRn╠FўН!VG═4ЗШ═ЭsМeЪкj)Ї√Б┌■-├I77d-7ГГ,x▒йщ" ╤fъьдq5^V╖┘╪├bcфEЛщnYбш╓q┴LзNa╣Qwj╤o 6HLНХЮy▓цЎhf▄Gwт ╜В45║%(├╕╓╔Нь";ъLщ'юS■q╖┬нь╔ъ·┌Кў▀=╠лLїЛVЦ∙Щ║e2 IР▒ёон┤┼[l∙ е9╔еR)&ЇX,╢g╧а!XW@~m┌┤∙щзЯ:uъД#╬+**┌╢m[^^.╦▓ккGu╫z<ЮХ+W■КЭ┼Т╒dvhв╪hЎ╩╛B:шХFЎM▒ +▌ЎMc кKl|z┐їy√'╘иОz└j╕ЫЭ}н╞в7р╫AйX▄жuiв▄Тzp_╓~7U эўhS▄_м¤│Йжj?░=*7Ц▄: ╟¤+q▓7BЫ`5IT M*√М╘д Цї└·яW■Г▀8Ё▌&╦[╡┘OЛжХiмя╥─T█4K8рйf╩ЁVГM║ ▓Ї*_I┘Lj ╜&xЩпGфА╔░#_└wЙ╔ЪY&6Єmh[╥$5бiQ5РЪЦj?О?xT╪8hЛ-╢╪Є█╔╧ь,ЮqЗВр<Ш┤П╟┴uы╫пя▌╗ў┌╡kq─9ор:ютa░\ы╓нё·G}Ду╟№kpЁ?Ps[l▒┼[l▒┼[╚╧ю,v2Iз╙ккn█╢н]╗v╡╡╡─Э;wvщ╥х╟ь╨бО8╟\╟▌Ўэ█я╪▒гk╫оHсГ>p╣\АBm▒┼[l▒┼[~┐╥В╓4Mуk╫п_▀жMЫ-[╢╒╘╘А╫н[Єлмм─ч╕ВыЕЕЕЬ¤~┐,╦Я|Є R└╤╞A[l▒┼[l▒┼Ц▀п4ЗГ 9P_Aшp8╛°тЛcП=v√Ўэ?¤ЇS╖n▌╩╩╩В┴ О8╟\╟]<│vэ┌?■ёПHa╔Т%>Яo┘▓e6┌bЛ-╢╪bЛ-╢№~е9ЫйкЪЧЧЗєя┐ ╛c╟О8ЦЦЦr_╙ы╓н+))ЙD"8тWpч6lш╘йУ█эAо^╜)╪km▒┼[l▒┼[~╫╥Вф|>и.ЭNГ▄╛¤Ў█.]║ь▐╜╗аа`╦Ц-▌║u█╢m╖уWpw╗vэ :<Ў╪c [;шїz│nиm┤┼[l▒┼[l∙}╩╧l%бё╡Г[╖n Г999ЙDвMЫ6ы╫пя╘й(G╛▓╫Б@UUUnnnЛ-@tлVнB"+Vм░q╨[l▒┼[l▒хў+═саоыЗГ;Ъ З├|Oq*ХЄ√¤ххх]║tс^fp─9орz2Щтс╬Э;#Ех╦Ч#{эа-╢╪bЛ-╢╪b╦яZЪ├AОg└;╙4╦╩╩°RBYЦAДЕЕЕ?■°c╖n▌╓н[З#╬q╫AqАHyду+Vр-[;hЛ-╢╪bЛ-╢╪Є╗ЦЯ╤║▌n░Щ╩dы╓нА╝ЪЪЯ╧WQQ╤╛}{єєє╧q╜║║║]╗v█╖oя▐╜;R°Ё├].╫Єх╦m┤┼[l▒┼[l∙¤╩╧D%цццтd├Ж `┴═Ы7Ж├ap▌ю▌╗y`bqО+╕╬cs┐Гр║UлViЪfя,╢┼[l▒┼[l∙]╦╧°ъ╧Т╔dS┐Г─ЄЄЄттb╙4уё8О8╟\?└яр√я┐яїzэ╡Г╢╪bЛ-╢╪bЛ-┐k∙W№r╧Вы╫п/))с┌┴={Ўч└Л8тЬk╣▀┴гО:╩эvГыVп^Э╔dьи$╢╪bЛ-╢╪bЛ-┐k∙эа╫ыu8йTК√ь┌╡kYY╫ЦЦЦ╞уq<Ж#╬╣vpўю▌▌║u√■√я{ўюMlэа-╢╪bЛ-╢╪b╦Е№╠┌A╙4Г┴ N6o▐ ЕкккrrrТ╔dQQ╤╢m█x№т╞s\╟]<УЯЯ_PPв√°уПС┬╩Х+6▄▒ZЎ"╨л:!21z*░'Ъm▒х жX═\¤Фp╚╖ДГЮ9ЁЕfr№ ·мГs<д4Ф╨■╣█bЛ-╢№{е94 ├сpx<]╫├сp]]] Hз╙╕RYY┘йS'юeGЬу оу.ЮЙFг╕ВЦ-[║√шгПEЖГ A4EI)ВС╩$NЗ@RД8ЙЪKoиД°╪╠ ЪDM╦LеRx]Цe┬╘ЫHэgj^VVVRR╥ЇITG╝ОЮИккh~ЁвТ╕X[[ЫЧЧ╘х╛╤Ви6оg2ф╬+┬_┴┼={Ўу$Йp╕& ┤Q}ЬаY∙nЮу!є┼ЯиЧ█эцoёsфЕ\p7П√|╛╞▓A╧∙IcЪНЩв№╚пг├d&чЛЗ].О╚┘% п╫╦л╞лПёБКу+Б╫·╟Тт%чeрm╬фw╤>╝)ЪО▄П╩╞k╟пр╡@Qq┬ ╔k!1с╖xOб5x√єОhмrг▓Q;┐▀▀┤╚eцяЄ[Аз╔ ─oгeрйёЪЄч∙(E;ЁА?M;· ▒ў`VUW█√╓╣w ├PдГ MЄi4ЖXгiиQQAP)"╥З. и°! ╜7PDк5j>Ур/Ъh4еЖ^з▀~ ўЬwюrs ┐% |g╔s=s╬>{п╜vYяY{п╡їn~Ё:s&oмrII YТ╖T$ ╬Ё╖qЭСс+.Ўф2шў╣╝ЮP0ш4╗w89tЇHГ· в*ъP╢Jь +┤■▓!П░═с8]ZЬУН╫гОи2юЖ"`л$ф╧6 ┼KEIй7;у Рs╪ь]Ў┤и┴Ы'├CбХХUdey+*╨С2 gIIYNNЦY▀И╙iя╩о╩+╩│2BJд{q╚/о\ш~╝ИdвКР-uюАaV0j╕т┴В*ЖMХ9╔2s\Ч╞╢m█┌╢mЫк\ц╔fц|═щX P(gєTNФБR*!#Д╬й(.bтЇ░пPy░ЇгGП╓лWYБa┤ ┼л╫E0тО;.╝ЁBйr╦Ц-СFt*ЩръХк}б3ЁEя▌╗= ░Я@Юи>╙ю─MИ =A5ЕFRШx X|KaШ╣Lbzй▓┼╗Р ╗Ц2u┐Ї:Ў+db/|9)[д╝▄юt(К ╦ЬЗ▄№(║N▌║DА└RзOЭ╠═йс░█mB╤╩"├└7їЕГ.З IKЛКjx2├еNАKз:]\Ф[#ўЛ╨═╝ЩЧ;ьў;XЦ-▐▓И┴i3Ъ>ШСёНGЁ_мНП√╘йвЪy╣р* x]n┌LЗ╦} EJJь5rА■Ф╦и╬▒S'НяЯ╥╥┌y╡t▄s.a"╜И:r&а╘I>ДT Q▒∙pЕr▄╔ў [ўю▌-Z┤PШРж<ў~Е_y]p??ТЎ7~С▓,}№ъ├╕ГR8{д┐·╪┴м╪╕qcЦ┬yCЩгШВT3кТъ!%F4к# т ;e+5U▒/в░╤Яg9░!╙Е█д─ёЛdФ чIЩ-ї/X╘бjМС√m╒╫"Лк U5ю F ц+МD()№тwp █Л;hsиРКЦл╤П,Ь<│o╪e,;вЖ*│┘№┴cЧ├Лы┘У66ouAy░d╧┴нm/or∙/.m╪░!>аС│■ЪФP%Мv╘Ё╛√ю[╣rе╚Кsэ:╚чБxцЩg°╙7жЪ@Х6▒8pU╗Ў┌kQ∙+Vи3┐5qБWщ8+)s^cMХ9г!C╬YI╦ХIКьqъDрЗ┘╩w│▒&'zZ8Б^yхХ?·╤Пц╠Щг╦'U╣,N7рШ├rы┌╡ы║uы╥OЧ,7b╪*-1вГ4#V*╒┐jКd┤QGL"2Ц<йwеi(p┤5jБWи!РхтжаOжO┌╛╠Y╖·шV^IFYщfц╗я╛{╒кU╕Г√пx]ьйn°б╪i"┬}ЁL5╔зHП╖Р!╛" иY│fб╣е╤┴└;|█ ▐╘б├_▀y%▐╪бю╦╦]^O1zWэZf▓╚gЯ}vфш╤▀¤юwХЬC╢И0 ╚nрH├№ЖСчrшD╢|№ПЧч─б#эuГ╩p°~П█4JX╓E√=8В╝!lЗa-ЛЪ6HCh;рRYiiн,жЕ╒││ ╨u33С╨f╖ЧЦФd╫╚ЙC▄h│Р╧¤╛єЛ/w╜у╫╖▀■пП>*-/╗ъ╞_ЩЛъш▒гг╞М>y·Ї ╠Ш6bdЯ╤XRbgУ/ХМ У:Ы┤MV┤и1кЙЖ44Aс3п~¤·z╧чЪ*ї+▌ ╠▀8╠Ъ╪▀RН_Ї: ╛╦IYбRй╞/e(&Ў╬Э;пY│})9WєSY╦ЙДзї°ЩGЖrСPК, $ёЩ,M'Ь2&┐ф в@u°╒JгП2NїВ┐Х·ZdQuвк╞д┬Е╢┬мr°Ёa№тwxZ╔╖wp0и'╘О=х gf╒UnП ·ФЧ?мьUоЮЮЇ┼Эw ш└Си╦csdWй=?║м%БЛn3K?уC5bэ╨бЧ~°БО8╤▄|є═ШAn┐¤v▄─b ╠╫Ш2и╕┬Щ║Ў┐■ы┐0╣ЁГТX S<~Й 9√@▄╚ЯпMB╓й╩Е"┴/x▄╞╘Жk}iШD┼└Щ)ї/o√b╞г╖▀~√ў┐ =▓иGнУX.╕%rU▒щ8NШxM√ь│╧.\╕РЮфI%,мB╕Р/r.√2р @24Гщжп8Ўы_ ·╡╫^CJ╓ЛЦB]ь4и╚ЪФ`M*H/6i╥DЄO┌╛Фк$°омjСg╕╪E·Ўэ█н[7|!шЎN P7ДЁфG▄|∙хЧби6n▄иbрПмКЇ╪│g╧FЖ▌╗w<Б<СцїW_ √}]я╗ ╣еK│sr╨─mЕСv╗Єтт├GП|Ї╤GЭ:u2`▒▒=7к№Ac4с═{vу7l|vEЬ╩■┼g ╠v{>√█╟wtщR\^ЬУW3Д№БLЁ }Ў╔?~·╙Як╩НЪ╓@mO_╪╪┐aцHдNTЦ┘Ї▐_о╣цЧ╩щV╤░▓9В~Я╙ыс█БЄ ╖├╡ц∙U╢pд╙╜ў-Ю3зfн╝;;▌КF2rsРb¤ЛВсp╫NЭ1─,}╓╧ЙpМ─HПа/╫╞СnлFbвt▌вv╟w¤#s.ёгЯ╚╬З*ї+▄a-Ё@ўh▀╛¤|└╬У╪▀R═W─4╩4}at0Б@Х0~iлЦиё╜ў▐{ю╣ч╨'iвЦuЎ─ПOЭ8╦! Д@;╪╕э╢█┌┤i3n▄8A╥╘"№WHМс╠w)v┌Фб.л─ёл╬▄ D>ED/o╝ё░Є[o╜еbГё ╜╛YTЭикq∙AЕy°р┴ГН5┬/-P╕ э┼Ts╧аi~└Ьц2~П ╒╔u╫EШ╪╘# Єш╝ыМ┼b╠oєЯ;╛iЛ1;p хbR@ Й°С╩%]ЁЙiВ╚ ╚ЧKиT├·G'^чlЛ Ь╥`(чwQ-Ь▌и║8йё╣a6LZ.ЛР-ЖbXBJ'ЙCЗ5h╨АЙ∙ї╠O[}Е lГ+┤═q:)▒\╛┼мt┤╟%i Ц*ъмЭ l#7╬░ШЪ╔ХрoZndA- б╖Ah_|ё╓н[уцhtSфЖDЕИ╨H""0├╬-ПJMJ┌╛┬Wlх6Я.vф)+V"Ї(фм┐Haъ╦R, гшЯ №'ZSЬ@PвAй>ї*s=щЯ]╛т╞ыо╜аi╙5╧>wї╒Wг╓^N8\^RТ хr=│pс¤·сv4─`3VО╦╩ гPВ▒▓l 6Ёэє√╝Юту'kdх╝╢f▌нўvUvВ9Eг`░┤ь■ЇзЫn║ └5ДмЁ5а└K/╜D{ыВЙ╕Wп^╕ ╦Ц-у╓F▄ЧнNй╩э┌╡+к Aн[╖R┼'>-o╛∙ж@ЯЧ_~∙ХW^Y▓dIЪm4ФтE┘Шпb┌Q┤ъEnумЮz&x╘еKф░a├иЇ(ю X╝x1ZБ/B_О3эО6j╙ж═Їщ╙!|Сp┐╫}ў▌Зъ╝■·ыhw┤5PуЬ9s╕╪Чж}d№с@>ы╫п''4vNЬ8b█АИzўю Yб╜Р8A┤╚BDР▄}ў▌4#нZ╡КНЛ╤vш0SжLсРд ╫Q(aЗш∙sчї╨пшфI╘┤у]wЗ|>з▌ЇA╜BбO?■8р3,О?√∙Uпм[w[Ч.■твМ▄H*)-▄╗пшфйь▄ Ы4Ў╓╩ЛДГ╗╤Н ш *ЗыЕЛ║Їьб23JК   ∙ПO┴╓зЯ№уК+ор(╦═лY???3╖Ж╣▄Fщх┼EЗ:}ЄdНЪ53\о&^╘o╦╩·№гП╩}╛-Я}vU√Ў┼зOуi(hsI╗м┌╡б░КD▌@ДQ╡a╒ w▐╙U[╣hёю╕╜F¤zFXБp( DшtFвЧ├I0┴ПqHJ╡иЗQАFdC╦╛╥4▐f·"и_┐~DhGМ▄{я╜ў∙чЯ╟#|Ь┤o▀~щ╥еш]шф@l ,Р}оUъW▌║u├╕ЖH1в√█▀в: √▀/╜ЇRЇ╒д¤-╒°э╘йКАp^xс░Нn╓бC╬?й╞/3─╣k╫.|t╜Ў┌k .дтvD$%ю`цШ·═o~Г9 О;юМKжoъ@▌! N┬{ўюm╓м$ЙЎ┬T╢b┼ q┼├└┴░E·TухBz╙ёю#П<В@дДяv(а_|С╤oе╛YTЭикqЙ0xб┴БFЁЛk▄┴¤o/юаr|¤╢╘╩╬;n·тїS Л ц╒а ├бэЫ┐╩s■и`└─╓П┘╜█v°▌5#M/пйЬ▀Шхpбo.I$кg|Rs·бхLЎrq╢NЭ:\╝гВ╝ыо╗ёЛ_@y7o▐|Ўь┘PсРA╛Є1чЎ!+иL╡─1╕9j╘(Z!м7▐xИP Ht(IZ.б%0╣▀yчЭ(є■М3▐zы-HПp√╓[oE╣Шs7nМ╖f═Ъї▐{яL?Se3b─╠к`щ┘gЯЕ*▒s7U╣(hЇш╤╨|@T▄К @├▀¤юw─Ф T∙мBYё─Ч7=] vLх4=BЕ│3(MO'w░n▄╕%ВБх╦ЧгєaBєўВчБвЫв84╓W&Бс;vp╞pО╝ю║ыЖ B╫'╘ё▌w▀@b√[гoа P.╘ Аю╣чЮ}√Ў ╨~А rHщ╖Q)╥iLв╜▀yчЭ_¤ъWи#.└єдIУЖ*ЫЁQU╖n]·:po┴ КF┼╤╗hЛbлсЪH▓e °-Ъ?v n▌║Н┘┐═Б└┐> <'+╪хЦЧХбшП=╬uсТу╟O9Ж▄U╪╪`РХ[#╖nmo^о╢рk|}нЪ┐░kяUЖ3шлp}F╒╬/┐t;]шx7\{▓Н╪>{ъ6l`аO╛U[ ёIж'гди╪ЫХYлf▐╛¤ ■щ/┌ущй¤Ех╛К═ чГ▀u°¤щУз▓r▓}х Z_hм(;\°Юєz╝Е╗╢}╒Єв╢АG╤UЪ4й\╚ОFёо╫ьKvЛ;-Mкщ=▄=гEМ·j√ТТА╦Д]}ї╒_№▐Э:u*║"@~,с[ }╥H$ВПfR╒~Е/7.Y ╖б'р[}г2i#░K┐лWп╞X@A@HЬ0'▄xуНй╞п╕ў▓╓┬─`жbkчhU┼┤ГяI┤ ж&░G╫~ф@/+┘█'k°Ем╨С gHщБє0ЕBЛи╪>Ht9LдI╟п2Q5-▓(а0ў╜рЧ▀]@ДШЬ!"Lд▀b}-▓иzPUуr╓е╗~qMПУo/ю`╘a╪KU┴ГП╬^їД▒ЁфeфAc╝*7╣▀5s╓ C =с5╘O$#jўЮс1'{УУwФS√ВкЗ>┴М╨иQ#╠_№vg^|LcвЧ->\┐У}К╚8╙7nт╧═Ы7ууИP╠`тOК╔╙Ььсу╢д─r!\╠qP6PhLАТ@6Шр qd└бLП4HIhх░Иt2Й/ch&ю(чlШк╛4уAчс[ХB╩n╕│0!╖3╩ЖH}H╙├─└нБ`xЁр┴╚╥^╡jUЧ.]╕d╡к█cТ6$╔ї#░'K<·╛1┴жм-╕EХеCгбЙo╣хю,Ъ╠хЮ╝дэЛkYўзу№∙є!║О;кШ9YPMe╕цzЬК\Ё 6sцLиd▄ДВь█╖/ZЯ^оHO▒┼2╬;ЩПєYб+p─ЩZ═·Ж╔чйУ'1эfижП■║йnЭ:-█^LП▀г;w}Є╔'┐┐╗У*/SЩЮэ█╢F№┴Л~ЄjE# ▐▒¤Tiq╗Я■╪щ1C█ФХe║С╣}╒▄]√ў ╩YЩХЮ├цяъе╧▄є└лщЎk6\0КДЭо}[┐jz╤E┬№Єyєz q{ эЎе│gў*(0ФХ)tcЫн▄_с═╩AбYЩYЖЧ4°Х▒ЬA·H0`╧pЫ%GГa#x0.:-w2╨+<═╖Д2mKшu°иm╙ж W!!%╚ ╒+\КеT┘п─T┐rхJ4┌С)щ+╞Оз√▒УWй_aдsOc┴аУ╖k╫`Иp$▒┐С├─ёЛШ0▐7l╪@╞└-░&~SН_Z11лИЕХбy╕ч╥Ё╥в╒дшжЫnЭ╕J[▀╨}╚dж┼M┘ь Юё╤Л▒IЛ6┬\ў╠3╧`║c▄УФt№╥bz°ЁaTЗ_Шп┐■:.0їqbЧ¤*╢╪З─╖U_Л,к6T╒╕ГЇ=а╤К╗V$ ╩∙─d1\╩сJК▒╥м\к╪░ю6y╓╙гT ╙4HбЄлPЖкPуz═¤яe {a╘\JЎШЎГкCaсBbrЦф╬6Щ5dQъ▄╕ItИ∙8 №╦вuЖь5сЬ╬%-|к>√ь│╘М9В┘JlЩ╠!i╣xr╗№Є╦СТМГвeQЎ8│\LЕ°Ё┼ЗRАГ^,М╞R+ов╣э┘│╠╙>'√ ыKeГ╔а Ш▄1YSt╘y▄▀Э▐:(KЎ▓Б|~∙хЧ▄p и║d╔h20vэ╡╫КєJ┬ЛP6иФю╚ Ю╤y└$X┼ўб.╚zФ(УHФ°Й]9 B8N°Х┤}┘+°щГ╫╣╘о4gUвL[|д@(@1CC#10:┤Ф╝%:Ю:RЪUo~█0МУК!l=G0p:Ь▄єgЖ$`с╝∙}√Ї▒{╝Ст;jЕo∙в┼=иЄRХУїтЪ╒╣Щ┘═Ы5+:~А╬=uтЎ.Э o╢Ъ?дь╬∙ =▒ #cT╪пCa ?{тдВ╤г ╫в╛ [жїА3аЫ╙■∙G/:u ║Щц  ╬└О~┐С▐ыЭ?eJ С#ХкДГБТwнЪХ▐(╥Хb■▓▓Мь,e┌√▌Ю ▐╢ЫB&юСШйv░█|ё┼`ГKэ aЩШёI╚└h>eNI╟/ў мKWчEU√?пi F2:╤ Wq╛є*цыР8~A└Ч█╖oчZ}Яо°J+sO* `Йs xг-MўJ│"╧╛║b┼КVнZa╥_┐~=:┐lL:^шКG│7юc╚\w▌uHЖт╕Ш@ ЯИL:~Q.R~Ё┴╨╚ЗЯўШ╗╛ы·ZdQuв8ю ^гKL+ ТA3а`H=╪q╥╙/П6Аа#fМ ЇPюzr▐ЖG Эї +пгJpу№pНШ╬ЬF%<)ЧlT╠#М :Їълпж╦ЧХ╣ХMT&_тKБ_.╗vэ┬ДОмаp2ВXWнZ╡l┘2ЩtRХл╠y№хЧ_ЦАgШ┐ЄєєёёM¤Gаг▓Ж ю╪▒wш╡╩н{Ь╘H7cд*WbтаарщcП=Ў╫┐■UV▄─└Р╩dк╗aв╧сБСК╘Щб┌RuGY Фй░;о[╖ЕBЄ└ЭH %!ыу°У╛╞xД:╥e╗e╦ЦPЩиK╥ЎеёX╠Ц▄К╬СЫА█╥iо╨┘Qh└╗у╟П╟ыєц═г{#Ем743зУДрfЛ?ё1@wщ3(╫Ё4ўU╕=nЫ▓№>#б°∙╜ЎтK╖v╕Y╣▄╤╥2PcT╜╕bE╟n▌Н╧кР#│VNnуFНВ>C╫Fь╢▓а┐NГ·NOFе┐╝╣Xlьь█╟АД@ДбРrg,[░аg▀~f9╞Oщ╔ЩYYvпO ∙ПOы╒о °kdчT°}EзNo¤j█]я5╦ +зc¤Єw▌ЯaЇ√TЖщГт░╟ЬУ&AЯ//╧▓Щ6xt╫КЄь╠,▌\з╬┴ПНEob╬YМ╪Ч┘шKДп╝Є ┌ЛыЮЙуd|M"╘CЗбe╣т_╒~%$√kщы╩╛─>#ё╪╙╠F°·ълп~°a сNЭ:uш╨Aмp╥у*ъБ°ВёФ X╛mdQ╥цФr╓эtши{ўюЭ0a8coйуЕ№KЖ╚№Эw▐aPz*Фx╙M7бюмWкёЛlС∙█o┐M┐@ф`7qт─ў▐{я{ипEU·су╥,╧¤[°5тЕ(пЩЭйК╘cг_?¤╓И]┘]f╕iЖ├╬┼╙╞┐8№┐Н;├│╪e\WUы ┐┐┼UЎ'a└ФН)F"$╦В/ўrїъ╒ыЩgЮ╤з`$╕э╢█▌ея╗я╛K/╜t─ИШtpS│xХb╝№Є╦?■°cFDн!НTхB-\╕РЙР╘╞<ЁЇ╙OЛk-_СH]GРx╙жMk╫оТC>╚╝GП╧>√м╠╦╘7й╩E┐·╒пzўю}чЭw"├ 6рk{їъ╒x:Йa№D,gХv╥-86═╞г╬ ╣ПrQё/┐№ТnMиї▌w▀¤тЛ/▓╛={Ўд·┴TО▓Р╨y█╢m▓ wэ┌ХN╩МYsє═74HШЙk_к s├4(в? oр\\l▒А \НвЕ°Ю{ю╣уО; I<Е$Ч,YВБбb$Ї░JлЫCььK▄M╞tp┘┴p╚n└)х°2▌ЮDН:Ь╬█╛┌╖gяН7¤ИЄDсБCЕ>∙°уоЭяq╒оЕ┴▓m╦з═▐дсy╡0мN<░kяЮ+о∙%сЭ= г.▌╕v¤═╖¤AeyВса И$Z ╫■gу╫\sННЫСп╖mk╓▓EFv╓щ'▐zу═{║▄cЪQ>Hъф╔>№Ё77▌Фm┤pY┘[o╝ёЛ_■▓V├Жше'N|ё╒╢Я▀p}№6Ф}хЮL/E\lGHFаOЇlQКвgЛ9G╥'╤СPV ■¤g╬Ь)╟/Gдл<·шгsц╠aVUъWл╨"гGПЦx\┤e╨AЇиХ+WB■b^Bгрф╣xёbд╢░ю╨бфIЧ д╣ї╓[ √▀ўщ╙'╙RИ╩╥╤Д7┘Л╕У╥Ffд@є└9у@А│P└ьў∙КNЮ",9]T╗Vн№zї1&Ы7iz┘/█+З╜в┤─_Rvр▀√╦JK]n╖═щи{AГ: ъ#FЙЯ sKж╙нб/?¤чO.√/{╢7т░]r╔%╢H╘щ╬V√ьгПМЁoхх╛ Ъ!;л═П┌f┬ся┘╗oчюL/4(╞x╪у╔№╫┐╢\r╔П█╢mу2О┐Л╪╜ 1б ssє▓▓│Ы╖mЫЇb▌DЗF!zРMв"лЇ╒ЩQr8жRєq1КСН`AП▒─ё√ълпr│┌╫_}ё┼жЁ# Oл╘пА1╥uNf╧Ю╜e╦▄чl ЇCoЙУt№Т1 и^x71!▄r╦-мЛ~рF.║%ЮrHК RQЇI╠-0╦fМЩ&hCт#╠_|ёrK:^ЇXKL,ье№КO╛╢m█rйЭш┐й╞/2╟d┼Ё:HЖСИi╘wZ_Л,кNЇ╟╠╠╠─╦╠xЯ&.▄ █_?═ ╓╡∙k"┘QП-ш:u°█╖o^iЇл/?( aVq█╜х┼■c?┐■ F╨=wвEїЁ И?i=zZ`бaЙaA└*fj0ЙywPUа4╠bPфxЪ╙& ╠Є@l╚┐KЧ.\╞┼\)м·`в┴+Ш│ЕKьЕМЦXоa╟░5Ш(┴Ї-F╚с┘gЯe╝╓|╙░ jБ4рDVёБО6lфМ&я▐╜╗╛ЖЫX.Ў╤D ╒Е*@█Qе▌t╙MH,╛Ьg5 ъ[Є╒ЩvНXНК! Д№їc▄xрПзГ4и╢┴ф╞НёБВ шHЎN╘TПSM7p╘явOB╣в[rI=i√вi·ЩБ·@▄▄:╞KЫ"═HzX]eв║БI╚Ў▌w▀еe*Н╡zїjz a(рB∙AэAi▒!╕LwИ3╕C;Є╪CSF═qaЪэвfЁ└hMу╬аФw}╜9╫лS╖Q╙fЕ╗wГецm┌T~;├╗┐·║м╕─эїdfg5n▌КaиA;wlпс╔tFTщ╔╙їєєў;▒█.n█╓0BЪ█KОЯ0bкв∙¤Ыj╒·B'аUl▀сюэ;▄NW0Ўz3Є/h╝яюЬЬ▄ЪujI0ъя▐щє┬с`^^э№FЁ╨ф╩rf╙W° wcьL▌Ь╞nЙ(w.j╗JОвё°э╖▀&И$pI┐│f═┬ў▐Й'pНET╡_!1рИ2▌Щ╣зП0╞╤ЩQ(Э-°Д─У/щ°Eзbl▄┴5╦л'я`\0(Х└b╥G└@╦Ц-QЦ{ямч┼G─▄╣s╤XI╟ C╨ ~хR8╛ўXwpДз7kкёЛGАЙ╚]=??П0ўb|}╧ї╡╚в пщО;(╗g0&KJJЁkш°╙▐ пв╗кC>╚┐└ИFцўйhЁд'лЦЄЩJ├a,AgЖo║JpPЩЛ&~°с╟<~№xФ+ч8'Б`Лў▀┴ВЬн$ъп╥bщщ╢╠╫Ш═┼N&oIldЧ0]gФ╢╟.▒\▒ищAнe╒М╛Бtж╙7╕pЬ─4╚Ь_╔xЭ^╒жjЄr┼√XvOън0╜АЎю▌шР_iDЗхf0vФ_тб├IЙ╗'Qq|y4i╥ДyъЫ╞╪ЕшBИйЬSррЦ╟$И├а╠°╥ВI█WКЦ8фд8iИoЁ▀Т%Kац┼ПD^СїM9╝%\}ї╒╨m║&[РЁ<г|/╛°bю╨glГ[_Е╦у▓┼╠уFPжp╨ew╪mЎ▒F °¤╢H╘%&4Ы9В*╜ї┘бКp└юr:\FT°╩╜ЧЁ2lnъ╦pDLмiжПV┬╧H┤╞Щ xЇ\IЩq@в╦юfб╙╫┌яє▒я╜╤6ьцЩ┌~┐╤k╓L╦+╩3╜Щ'OЭ╠Їx!Н &аэЁy·┘gЯI╝tК"M$snj╢┼╬ЦюФк┐щ1╠ЙZxп╝7~ICФЖ|юьмR┐Rц4BЧyе╣хвЧ"O|pа░█ИСX%М_P!ЦВВВ-ZbB°Ь4фФ╟{ ╪ЇклотZкМ#К│6^!Жг╨е_yчЦ;М8 Р1\╥МО╛иь╫▒▓в┬гLУdkJ▄°╒├n╦ИfЪя║╛YTmшО;И┴/о$\г4┤W$в*╩Ф▀оY*SUД╩<^;tЩ├V╤"еrTЕ╖Ї╕╩мбьюи╩ Щj═Uе═ГЬO1Г№їпeАe░!Vк╪┬yєцїя▀▀ '╦-)@WШ╢╚0O√ °р▄┴Ё╬2╫x╔с╝rЙLgrE╥r1]в8Ъп╪qЖес!ю %з@zё3 'т"Ы╨Щ>U╣вYщ└+>╚xЭ!0 КеKЧvъ╘)═I_:╤Є╩¤уИ╞J]╤&%║mК╗Ж4"▒Q2d%вР░AрЯъкs¤ /╝p╫]w-[╢Lь▐|У╢/ПЭeЮ╚mI2Ch<е╔'╬КАФk╫оэ╒лЧ@:еJ1КO┤xЙ╬Я?└АтЖЙмз┤Е┐х╦ЧC╔с▌√ю╗ПAR 4J#НDmQЪ╟├╤░╙f║mЖГу┼╥Т:юT╢x8lD|╧ H0м%.╖C╦с═ДВvз╣й "╞о]├Z *п╦▄Ышw9Ь╚03├у╩0╝FМб/Щp╨pхЙбл@0ф┤W:░┼╨■N'0.ЪЮгй2┬в Х*╜ХUь▄CкeхЖ!67;'ЎPн]╜╞╪'P^XьКЭ>╠В╬▌ЦC)&ЎTД/F`╚YЪ&╒°e░:╜╦Илj┐т╕fчфзWЖюзZF"фF=Х0~;vь╚LЁ9╬ Ч ╞─ Ч▄д°╩+п\{э╡`I>\еG!7МСa├Ж 8c0·жё┐╤ЯКИ8╛RН(r└S╩п\╢О|Eуsh¤·їй╞/sУMКР'4P■юъkСE╒Й~р╕Г╘х<█Чk▓Ш2╩цЕКJЬ5Шh╦№╩_^ьпYгЖMХ+хн8юїцШн║авКЬnиШ╠*√Т─HжА877Т└ВыТ^RЄEAУ@Ш!°о╠Y&A═╚▒WЬn╥ФKH╟ЇТL6╛`тCn▄─-0K?∙НYЙiMJdEТЦлЫ▓└9ЪЦ║G/Ч═Ч■зT▐!\щ#`ХH+╩ЬУц# Fr°w Р%1║HЬ?т YУ┬[шФKЦ,бОь▌╗╖:╙Аz╓ЎeПП╞ООхMr++▌ LБИEAъHНnа\у"дшзЯIшAIМ╩╠АmМEТсёD*сУЄ|╖Q\8tЩ└.Н╪MпО▓╥Rn╝#oe╞v■l-░Л?0j4g/єХgy2¤(4├ рНЦ∙╦3│▓Вба█ы*╞Ъt╚цt]:2*Н╓E%┼ж╜╤.NGeS·|Ш2▄А"А}Еee╗ХF╡@ Фсv2C*┌╠Пq}║шt^осъ─╔Z° ЙДЄJ┬Dc┴╠SСDe╟KoЗЦ`u< *а$╒°UZ F░У■sю¤КЖv5тZ.xФYщЕ&┐6l ▄)1iЁр┴ьKЙБЯЇLЁ.▐"КхВ┼+'╢й3чеD"8&╖┬dЪё"vSй▓аC▌Щ уЛу%щ°╒'в╕Щ∙╗лпEU'·БуJyQ= ╡├f╢5╚╘╢P4жL┐bЗК:Ey([─TNЧ.╞X08Лмщ╚ZМ╪╒011`ШL╟╝йbЗЧЁE▄бQH╒Щ╦ ╠0jSфДвb°F┐ЦiKЯ┘uP"kXrЦT"$MUо,KЖb&T▒yY|uяTuц┌ ╦тfje.х+-╝Я('ъ┐ЇЮwI█E@Т▐RqИ0MbБ┌▓T─А▄bh3╧к■_╒╛\xНкo┌╫уN╫╛Х╓▀╩░╥ХoХЦЫЮщh▀╙зЄjцб■ЖKп╫ ╣╕=ХRгЧqrq╠ ╟╖Kк╬аущшNм ┌H░qtM¤·╓ЭEYd╤ўCйр уrЕ╞<@AЎa'╞Tжbт═Ц-[тOA╠ЎgЙ;(хЭ ль╞ЗHdiRXй░iа=к :°╨бCPE·ўїл┤г%ЖИJП_oПВ╬Зq< ВatY╣жsЙю╘жoL╤ёК:╙MПq╦╚C4vд}кr┼@ш0╧╠х}.|ИQДЁХЧU╛╚їP[╚A╢├╙╪╞?Ес¤√ў7n▄8¤╞Ъ4эBо╚э:d9 ╘_╘3Ч-єтRаL\b╡oЪЎeM.йыОсй┌W(MЫ▄'Чж]Ru &└ДВQЩhZцЧлyVaЛ,▓╚"Л╛-к*фвhb▄AZ 08(Ъ5n{╕юKбbKzЦ╦╡<,n{╕ьвcTWrЬеan"Жа╓М ╝ '<Ёа╤WA]ъ*SПoЧк\▌AVmhz╤ЧrДyY╗б Mк╖1Я~▀6єH┘G[QЪ0нй┌EiGxйX╕2▒▒С[uж╗ЙРd┼╠еqe√┐ьш╖┌7U√wъжY┴pй┌WчS?╦!U╗$эB4И╞ЩоF╟ЕW┤╚"Л,▓ш╗жк┬AL┌Iуr-ыГГ$p1П9QЪNТ°T№вЙщЕ*ЫчdЛa_шЗ(w$жk*a╔Ц┴Ї&j╩д√▀хQQxУ╗u S╥r╣┌иNKz`Гl└╖_.▐qSЪсm`JЙPГ&4╣CxНокЫЖ█Еa;WZїъ╦SоРКшP║я(╗а▓ПФ:├G█j▀Tэ+█UЙ┬i#ф0I┌╛Л╥.`ХЮ║фїvIEz╗╛ы°Oпйю`СEYd╤wMUЕГ<#41ю w■РpPПfэBПм:wю╝~¤zufм┌^╜zqЙ:а,вкqHФЯnYQж┌у╢Ї5jИбE╖Р╤┼ЖqЄж\36Н═П¤─*Э ЪИЇї╕xаuы╓РЮт>├кб.ъq9Т╦y╩─╙зO ╦_■Є·ыпз?\.i╗РРЫ2qЙ░JА┬Р░:╓ФsЇl)CтTтB┤я╧~Ў3л}╙┤п╝┬хZёPбGШJh_╞Cц esOЩ2e█╢m╦Ч/O╒.iD─fк]╗6OёО KЙ*#+ ]╠Mч╜P`СEYdQХш<Ў&Н;°яTЪ&Ц=dDб,E▀чDMCXхGЁ![╨vэ┌┼ ИнВ┴YИЗ╫КZЎ 'MУадqЗ°I? @о╣╛Ж▓(\еэ▄?uъ┤,Тq╦▄1мМт#Z9i╣OСXим{l│ с╪щвJ;╛Э┴PФi3л<-╞┼ЄНcйI(uQ1╫уsoTД╓GYfд1еЭ╛еb╨lє√C╧Dqє¤°Б&MЪ@АV√жo_uж}С$U√r╦░ДPж╨0Є┐№Є╦дэТк3(mЛбДьс .▓f-Ю▌╤s8 █"Л,▓╚вoЕ╬cя`╥╕Г?№▐AЙр╧ї/шз)Sж┤i╙ц╬;яФP╔▌╗wЧлWпю╤гЩЖ*Z▓dЙШa·ЎэЛы∙єч▓LЫ6Н!ўжOЯ.pчбЗтNI╘К;ыEm>|Yбжи┼┬Е y№┌т┼Л∙Ц\CяО?lМ7ъЯпг&LША*Ё┤+ъiZn╞М│o▀╛ 6р>^;v,'ЦЛf╖?№Ёь┘│√ўя╢бщQ0J$╬ '$ЮЛп╕тКNЭ:IЦa├Ж1H▐Ёс├бЄСэgKЧ.▓!╞Z│f═жMЫp'Нsq╥v!"$╘└SЮ5rфH№Йз@lш-x├ т)З,nJ╢$тBЁМыEЛїъ╒╦j▀4э█╗woт-фL█▐-,,DЙi┌W?┴)┴├бCЗ╥╖K" p╖i═Iўу"=]м└YdСE▀Urяxb▄A▐ !с uХДОЬr╚jЄЇ╙Oг\`e┌<Ёg╧Ю=╣JYмZ╡ ║Ў╓[o═╦╦ГEMа▌Б-╚R╖n▌о╣ц$Г╢жЪФc╨Pj█╢m╦╩╩а)QS(°IУ& 8ПА&OЮLНОя╛√n╟ОY}┌uxрБло║КихЛ/╛Аве9GЩр 0аuы╓hшlд╢Жз? ∙╧С41КЖ─_xс№9g╬Ь┴Гг╩\u]░`0√▌я~gЖ ■&Д╧MбЇx╫Єх╦P5Ж ∙,[╢мOЯ>и2X╒П╦Cz:%m}yQ:с2М8qтбъ9уO}ЧчSA┬HА|ЁT└3o #РъБ╠Ы7╧j▀4э√╥K/сЛшЩgЮБpxsю▄╣╚ y"i;0П&рт▓╥b═░YБц!╘бb{s╙я?┤idЮrЬL▄№`СEYd╤wJ╒$ю T├╢1+7╤sUОkdr0ФмCщЛХ\щC(▄аA\C ┐√ю╗╚БиEto╤4Л'╠╫бDXiЪ4iRXX╚EC<ъ┌╡+╨┤x~~>р┬╞Нi!Sцт#Ї.╖|qСО9Sb6э╠4:ЦPЖ╚2G}╤~Мш┴eP ∙цИєеL╟дчО4 Уру╣чЮ*B)7▌t0M╢IJЛЁВWРк┼bfе╗п;vьйзЮB/Бd╨<' eб╙<№Ё├HАз╗vэв',▐Т(╙xJЎTla1;Ъ(К┴Цщ╧k╡o·Ў Ыg╫╠║!g░G░лbЎW╓Не;┘╚╔iвmГF&\+їЧр║xКвбс°Ц Ш(a∙Єх чA|Й я╗я>оu"╧у╟Пыз mЁPv■)ЛЫЄ'╥Р█еKЧвtК2Eq¤·ї╦Кл№УрЁт└Бz№∙Е_·,X░ ЮxтЙ!CЖ4m┌t╪░a┤д╥єTlo}tqщfEёщБ4шtB3бnhgД=0u"Yp╨"Л,▓ш?УкI▄Aк+}oT @ АъJ└6кF╘ЗХс┘k║ДТ;}·tTЛ ┬~Wп^╜a├ЖW_}U┼l'PЯєц═C╨ю/┐№Є╓н[╟ОЛ╫Qт┤i╙&LШ 4NХ5=UЩч=ў▄├°ЇrE╬|Ё▓В.─╗иBўю▌WмXбb╤а}√Ў╔┴*Ф~нZ╡Аq▀|є═?№pЇш╤yyyr┼Ёс├буY4.)ЁгЯ3! ВР═K╚╩▐п=z\yхХи&▐zын╖6o▐№╘SOбO0В─┤lе"F'"n nz$╚┐Йg√Jby]╬╨cЛK╕Aevh·aXэЫ╛}Йщi╘K╥И\зжI∙pY_ЪCм┬╗wяn╤в╩ад V┼6Z╓AЛ,▓╚в яиЪ─╘O5рБ│PH│g╧ЖЦЭ1cї"°|тЙ'Ю~·щ╛}√"╘04+ЩЩЩm┌┤╣∙цЫБ`PЛ√я┐х╩Х¤√ўЮ@EЖ 6■|№>■°уМ╖З?:─`Б─O5*ВъP╤вФ╧? №вЛ.ъ╒л2П█ьOсLЪ4i√Ўэ╦Ч/з╒╬Щ3азk╫оЇь┘OИjrь <°╥K/┼г4Mгc5eBZТ√ gbИ╕ГуЇЫ▄ёQИqU`WсЯьЧ4>·шгhq0f╡oЪЎ%▓─pX║t)$2╝ыо╗РLЬВЩ -Лoкqу╞йШ╦░юP√╙Я■┤ааА'є╪ш╕╨┘qd┴AЛ,▓╚в Lк>qUL┘pp7┴д.X╓TЧ╢Ьъ5C▒╨э Г%rИMЭ:ўС∙m╖▌ЖG@З▄" "+╝▄86Ry╦о┴8╦Я2c\л╪ItЄ╚;╟L"E╦#=fо[■╨R#хc╡o·ЎГz│f═╢l┘┬ЁБlbЖ!DM/╣фТ░О ╡H?Ъвг ╤╖lЮї? ZdСE¤gR5Й;ИМВ╨1vЫr╕вжWCE╣*gъ╘зВa▀А┴}kf╫▓▌*аФ█L ░a$3╚|┼б@$ТУч кH(\а\6ДЭNє$╓╥а╟уr╕ УЇ8д╞╥QВиm2├╞OXьhПс╗!У╕Ч_┼4:_чbэg▓ Тe╤Пwx№=vщ^@°.¤mQ.}QQ▄А.╜Ї╥n▌║╤└Е Лlcz-а9Юzъйc╟Оё╚ЁМL└фЮ={Ъ7oо┤╨═(аваа ёа^!AZ▓ЪЙ║╚mВм№JДdY_жs.3зУ╕Ю¤█Y¤Hx╖XЙС!zкx■ъ,<─!▓∙▀╙╛╝L10╤ФВк:╘аA\ 6 ПЖ╩Ў#Юз7h╨ажMЫвї┴ПHЖР1MLr ZdСE¤gRuИ;И\"*b╝К(Ы=ь░ЗХrE ╝ч°╫╝┤тцN╫;┘╣┴ЖмPк+ЕвxSЕ╝╕Ў╣ яyбЯ+NФ╫лЩiЯПёЗх^ъ╘▓▓2Zh(└√я┐2/,,|ї╒W;uъ┤xёbю ct_Q╞D$T├H╙│g╧ЇЗМ ╪░>|╕nZcГ╥┼UЭyю9Т╛_Px;лdДa╝h%Ж╖Ї╡ .Tgю_╦LЇIh╗d╔╞z$Я─мф -√╩+п▄~√эчrp_Ь╪┐╙№-▓╚"Л,:?к*LЕ╕ї№ГГaq╛ЕАчP8!е2ё└о╢ √_НЪфzU-[б╣б /█┤B#╠?эЖе0Ьз╩U░$ъ╩▓й,шнтrП╟лв6<*/UЩ5НdTЎв┼%фu"нY│f█╢m]t╤н╖▐ ▌,┴AкT/█Ы/aЯ╣Р'O╔П6¤(▄GJр(▌У'O9r$??┐o▀╛┤иХФФ0╘Я`┴m;wюl╒кUkЯTЩхъАOvPЕыЖ╜*С╛@Ьц┤_Трl·эЄнЇ0K|Ь╒Щ ╓Uв╣sчВ+ИўЖnрVоШыЮ╘┬6╧╟лj╣╠A>9ЇJ%╢o│f═zЇш┴╓I▄║Ч╪╛\·п]╗Ў╫_}ё┼╟э■$·Dn█╢нКEnтв│:▓}√Ў╓н[WUn▀O■YdСEUХкМШp0к┬└Б╬Р├ї МкКP╣=├.═·╦м╫▒5Н:O√всР-╧хМ:╗\╢И;уВгбу┐ю╫ц┤╙ч╚ЁT°#╡3"х Яreх*ЇиУ'}▒8к[иXЪшТ▓─з\Єг)( ╞:+╤d┬ v╘ЇЙ*Я╤Аг▒╨tt)рВ#QгЬ8q ╛0Y╢╙бL╝иcшD╙B╔└(xKМaщOзHEIеФ▐Б╞Чц:#(=╞JЪ╒y4 Ю─╨& DцжU2├Ь╧г▄8█│ЇБдэ╖БТGN3{кЎХ╪рЇ┐ЦВ─=_┼ZЩшУ¤ p OyВ▄╣╪nщ╗╬▀"Л,▓╚вєаъ*l G├&4ЦРГ╩Юб╢К╨яд.│╦┌▌eБH╕Nо╟mьr┌Гa[юСш┴'▀╕W╒R~╗:rЄdуZ╤pЙ▌ °|╢М\Ы-╦aь'┤3f ВЬЕегtЮl&л*quX6щє4dE/.ПъА@J╫7╪ ВдХСЫ=ёФ╗╓╕S╣с)о╙пSгй3w}щц╠│:$н)эgР3▓%nH┐╘О*аw╥д─c▄╥└╔ |Вgb╟4V▐4${ЄX}┘ и├ZЕ┼лйкхТ[q┌╫ЛNl_щД╚Ф╝ьJL┌╛╥@HF@╤Б+▐д┼ОЙї└@<ЄО0ю<фЎ]чoСEYd╤yP5БГAqйи-0с`F% Ы ╔vхG2ВЎ ■═▀=E ь~t8╡▌бА═┐+3█Vф│s>ё┴mкЖ:эПd╓░ЗГ╟╜оh4Ra│gЬЕ╜╬<EаЖ7W°dр:(╫T,ё8?╓─Э╟BЮ╣ Н.V¤iR Ь╪Ў╨rr\ЦI№У^Й║Ц/ж▀ЁwHRЕ-'О╨їбJїe╩t(Qi╧╖╨Йg╧а\БТщmД·сuRVХHа0%Ав╤╕-тu╦`╤Ї∙Хvпj╣RЙФд/╟ыэ[п^=^уW№▓уHo_q "cq└Э╟Ц0Р5 х╤#tЙ╞ОBN│w6=}╫∙[dСEYTUкpP чРР-T6░{q╟T┐&"Ми0╟цЪЁлyO7Н┌+▄╩х ╫ ЯЁ┌О6kQ ё╥тЬ#▐║2jЛФ╕CЩyКз _ъЫhPD└╥╫d╙│D.Йъ.╞Йфр╫|чa┼д∙Sd┼ъ╦ОnА#Xзxщ}юх2CmЛ█P╥ЎEYДзe Н╠qЭж}q═VгГ ▐хО|кЯ╚*+╙дз╬╦∙F╧є╗╦▀"Л,▓╚вєгъХ #╗+вь└└░▌ЁapЩї▀WY╦▀&,│╛┬vG░┤U#O█Лє■ч├┬К:зzl╕─p!╔VGOЯкW+зш─╔,oНй│ц 3\ЩЮ'еEEП?■8TT√вEЛ╘┘╢╟∙¤~eйЁшА}~█б╕щpR5I╕╣`┴В╧? |┌┤iАвD┼ДЙЫ`@└_aaс┌╡kЗ ╞M┘RF#Ц4Д2Ы33b#·PCуr{в^╗н[╖^|ё┼UнйюЙ┬X$╗vэz ¤ў╗wяЮ4}Ь)-Є╥K/uш╨!"\▒b┼╒W_Н╒О┘M│W2=лМ╔╬HK°]╢l┘╛}√p╘иQ└:исiU╦e ъ╨m╚Р!rIb√>·шгx бсС■ а╠СЬ╪╛t▄N▄@Ий█E┬:x┼Mv╢кЎчя:Л,▓╚"Л╬ПкДj▒EG─|a▒й░SUDХ╫жК╒°+ ╤─qY8ИD¤UQлЖг¤Oj_╨\-Z▓н"я─Р╫~й.0Аc╪)>q:пfнЗ ╞╓оw┴аQ}э.UQь╧══xъйз И╣sчю╪▒·5═╩пhzQrчg3г▓7n▄дIУ!щ▄HЕЇИ╥Ї |йx%Г█1c╞ їщ╙┐42щЎ'╢qz╠Z╓┘░aC▀╛}%ТЯlС;vь°ёу╧яАTР╥;vь╪Я■Їз═Ы7Cцg9:t(ъЩ$M6pр└_№т7▐xc▌║uYeк*У ■Bgє╔У'у&└1dВ╠!вС#Gт>yWч].л╞эЙй┌Нx№°q¤у$qK@\√ТsЇOe~┤╚ЦG╜г▓ўъ_ЙЭЁЇ╠E+╗}^ЁVф╛▒╜кЙ║ВС@ж-KЕэWn┘й"GЦС9Ф&▒╧ЬЕю╘г~@уъ▐Ъ*ж┬┼yУqї╟оЪ╔N;Кщщ2B╧Y ╪╦d7БбїбDЩЙlуzеXЄдС8КД╕╝Аg¤Р▒5ъ'│Бщ╚";╧tМ┬ВРў╠ Ц4рНзnрW└Кфd^Gф " }м╬ p#itшT╘┤iS╘QнbV1FууN5╢И8XИлk┴ГМ%HЮ27]&╤ЧэВ╣NЗkH)╟ДР╔Tхжы╒U ╦L)щ"╓╞;Л,▓╚"Л╬ЭR┴A┌ИO╢n▌┌╝yє/╛°вqу╞Мg}Д@Ь@╜ -▄о]╗={Ў@╡n▌┐я╛√.Ї▌o╝ё}┴┴И▓Еб#З▌ДГ~уЙm,r═╝сУз[╕Ягм╠SЎ@яЛПяUп┐Ї7wV▐╤┴╧ X5 Жэ■ ▐НfО.╙№В6╜√?и2T д▄#6!Ллб┌<═B╪[░`┴■¤√╢&LШ░c╟О /╝Рpd№°ё╓┤i╙yфАk╚Сц+12A╓Д 9 ┘Ш1cР╣Н;Е.Y▓dр└Б─2AЁL╛~zїъEу╨мY│ДёВ!▄мY│!CЖИ 'x└#R╞Яр▄NЬ8СuyтЙ'А GН5|°p ╦├З/]║TЗЖ╕LF>е3Б╜С#GвсQФE°ИQКИe╫wв╛Г Ъ3g3бщС;╔}ЇQА]фНХЛlq???┐{ўю(U8vь░╫Ф)Spс]H▌qЇш╤vВky1sц╠#GОаv╩▄й&ЦNфМ╢ФDНO!фж╠╡Z}dРgПp йзЮвOёE]Ї╖┐¤нAГДк \░Dв▐Tхжь╒┤╚"Л,▓ш√вTpРghQ_o█╢н^╜z╨e<яП7CB ╙5Р╜BЩ■°╟?Ж*№Ї╙Oбў7o▐№╜ДбО*G╘ДГ6хwы─^Ua3|О╞Т▒-кК╜│о  зиЕ█йpTФ╒ Y╥f▐[KOД.└@!А,R"ФЕЫxЁ╫ D┬┴дхжы╒┤╚"Л,▓ш√вTpРN T[{Ўьб&вb"бс┐▄Х}°Ёa(╙Ъ&A¤∙╧F╩ў▀ {ВГ╬ищJl8ш╖йИКтЫ▓ЗUС ЛЫ╣бr└┴╝╨╨Y?Z0hW░┬]\ЪхlX4zcsХ(╡Эp+╗сzlл]Ё)_@e█Х═^Zц╧╬2V]╕╝╦╡?9dvх╩Х╙└БiPЭ8q"@ j╬S┼шу9j╘иВВ╝~Їш╤Ж ч╤ТД√хcП=жL]NрHЫ# Cм4┼№G'` H╡IУ&Р^╞т:/[EМO─"xY╤╗Еы╚ YЗGМЙГЫрдn▌║@3▓ Ъ1cАx╕apce┌╖Ё:▓<-,,Ф&x ├3Вур е^]tД├UoдЩ5k2·╘╣e╘y КВР█┤i3`└·ЇАa@RYnж._dДE~мА+┘E╟з═Qўo╨;дЭ┘╓ pШ╘яХ╗%─ 0 1=ЄK╥rSЎj ZdСEYЇ}Q*8UhAmЇ▌MJ╞жР┴ПЙh■n9tш╨Е^░Ї╟?■кєЭw▐∙~╬,VЖ ИaМ°Э╞Щ┼*hфBыаЭ3п иFQS║JNyЛFн╝jvЧ/<╢№╙┼Yб┌╟y╗Й╩ зРЛ[ed┘є╩|х*фWFX шxБА cд1ю1╧ЯДО;ЦЯЯ╧UW▄W▒msx "гE▒т>7╬sKЩ2ї:~Сl╫о]t;АpББrTBЬ?т?┌ ■АWhT1°%╗т╕D▄_шLCф╟4▄╦╧Ьщ5BI? ЁLЛ1ю│▒Ё x▄3'aDР ЙёП╪╕|КК:г?APm█╢¤Ї╙O╤]Q╚Цk▀e(TДq│iч├M`_@I`J▄Є╔'ЩЖ(ьг`Ж^8$0╧>╩OAЩїP┴'Юx┐їъ╒Гф┴ 0%8є╚еМ?Ю9уYб╩x▒~¤·╜{ўf░ыє;Й╟хgїъю z╣i▄Xp╨"Л,▓╚вяН╬ бVа╤hlBb║Q&┬AЪЕ4\│f Юn┘▓║l╙жM▀9T&"4Од░G¤<д╬8╢╬ 41VРUСЪq├з& ·Ь'П╗ўПY√Ы╟о{│nn╗ O╙ю┬Qп5Ru#aWiP∙▄!wж+╧╙хпЁW°*T^═║4PЙхIў,╞═Gyu5k╓аC┤╟F╔YЎ∙)Т2└пJ╢оq▄╙╕qcФ╪╝ys┤%╖H2 │╨3Т│└>т3ZМ┼уШ╫zA√ўя║e╤H6m┌┤Ц-[r█^3f SКl╨|(╚FdИМъгН5Кёе▓PС└)▐╘нЮ▓Т+┼═Ы7ПЎmХAВT{ь1дЩ4iA!▐E3!7Ф.%ъїхЯтЧ├*$-7eЧ╢раEYdСE▀е_,жж░БЦ┐I.РъЛ┼┤ФA┴}°сЗ;vd╘░П?■░Ё{ГГ! Л┼п ═хc┬A╗з] enQ3Ч#r.═№zЁ3X_Ё∙б=СЪ╡r─╢─[НU-═иИиH╘ч╝иY╗П7Т╫╕жrE№A_Ж╦cцbшZ╚ВGН╤KЧаdэ┌╡_}ї╒Д фp6ИЗ~XbС =dН┌╤ЗVVъя#FрцУO> XЦУУ3}·Ї╟▓Д╟8╞D`╕Ш2e а'╨ J╟═·їы∙ф1sКKъИЇ№3╬);ё╠Y╤f╫EC3!JGqнZ╡┌╣s'┐УСUЪrSН@ ZdСEYЇ¤P*8иL0@╕wя▐ц═Ыя▐╜ЫОдо$╨д К TCoД═Ы7C~Бf*ArЛДФ═щ│╗ВfфiфтМTLвJ╘┤╖ф5╧PоР¤д=o UW WЛ·юЕє?ё╘hv╥U8ъЭЯиl┤Х║╝┐}▄Шёїы44╝П/qeKzгM;Ї·ш╤гБєh■S1л╒Ёс├sssqДj╙жMAAAИc╞М:Ь8q"▐Е─°Ю0iф╚СДe╚°2A■EEEHщє∙шЬ0╛rхJа╝A#"`Mt@BАGCЖ Щ1cd╪╖o▀W^yеg╧Ю╕╔¤miп0NбHЫn┼Їс@╤`╕Wп^ЪМИf#ЗhQФИЫ(7nЮ80??иnвфхх 4И°щ.\XXXИ║s+!0Т╡рц╪▒cQ▀┌╡kф!╝ЕВв1Т=╩ 6DY╕╨Y╖n]H░АТ"Bе/^ аЙЮ'~9`╡{Ї╤G╣kЕ ╢├╙╣sч=#Aм,ЗЪ(SЄ─▌ ЕVU▌╢╩─№B&єц═C)H >k╒кЕыi╙жщз╥е*7UЯ╢раEYdСE▀еВГ╨VP(ЇЛ╪╣sgлVн6m┌─=ZqБfpН;T[я╛√.t1ТЭb"а№ и─хfа"юD┼╘ P:№rл█А╨п╨5Бo!╞║Оф>AЁРШЁ■█▀■╢qу╞*UЙcт4╣╡qц╠ЩxеNЭ:s`o!+ \И_Ф╪йS'`P`AаFd5l╪0А5╝B╟№ (▄vя╜ў╥Ї┼@V!╖КfD\кTй25ю╞╡∙С9Л/╚╫pdDBО╥╗{╘<юWo|┤й╠}p─ь╬коyЭ7всиК 5кn╜¤√x┴rь┤ И ;РН╛║▓ЙшПZО├M.ЖM─╚ю▒─KcOB█и╪ю=e║ym╚+╠D╝zyЙ─|╤9МЪбpАЩу╬╞Л@3-[╢dАeVM,jД&r╩╤ШD4Ф║Нц╥ДF ▓DД▐Ж<)VЬ.)dF*е{╠pг Ъ$ы:4j╘($р"r"=■°у`Г┴ TВk╬╣}Цe╒ШЁЛЎ╦дЄ╓?Пr В╔╝uы╓█╖oOїаєБЇ▌У╓йYdСEЭ;U8 * A═А3&МDCYЎ,UбЮ╝c}vE╙МЄ ▓╡O╢{┬оЬ╨╧nlє·_╫┘Є╩╞.ъбjЩ√=к▄o╕╠T│g╧1|Ф XчфЙь╠,*у╕гБ╔` ╪ОЛ?DЕщиNЭщU╩и(╩ ЄЗ╠БНЁ╚║ЬАЖK╞тЬлЧоbAUТ."w√щEуц╘йSyфC$ъO▓┼[─:,ФVhеcAHYVVFф╟Й╞Ї═p─"qYЁЁ !&J╤╧╠EJ№Й─<┘Fj─X6sч╬>|x··9сbс┬Е={Ў╘┴оN─DJ·∙2+▌▌ф▄ -NГ+ЩПjqЄпj╣Lаu@╔ЖKJ═В5ЙХу\Э,▓╚"Л,▓( U78hШНxГДГ╩бBОИ╙АГ'╘╘┴kBGsгзs3l9NgH9Г┼■г┘ї▌ >¤uncўу╦2▄Oь╞zqQё)oЦ╟сtЭ**╩╦нm7│#Цnc├5!Ф2БХ▒l;уF1zF█5╜Xра╬Хщb╠cыFМA╕ З│бP4г╜╚"#_gVz╢╩4J!▒░'>·QrI╜t┤*з└IЗр^q╤Ug╞jAbr╦UQF{┴}S Ш─?Z_-%т┤ig╩1В## lJм/эЛ ╕Mу\·│бх`eФ┬ Въ| ibд "{ х_еr╧¤+,,l╘иQ*fд▌qБw!Рs vmСEYdСEкЪ└AГГ╩ QЫjРdЛьQз ╪UЩ·реэЎЄ\U^╙г2▄.R■╠охG╩UQF-╒■ОЛ№╩сU╬,¤EU╚чўy2<╞Y'A├О┼U?╔ИNИ▒С$СзTk┴Йx∙╨СЫъ@Зq +И=Мaєh6Л3,еВA+[┼" ╗┤╥╤-Ь п╚РФF,VЦЛу╩DлЇ!м┴M░zЄфI▄gфФ86тЎ╞┼нn o┤ ёOФ┬Gr^░К"ЬhHcЖь6quOПДcк╞┘n╧Э 1╬"ЫЮZфх▓"В┬╙├V&Ш╬c╡╧├ъiСEYd╤ Bк.pP┼раdiкщап╘╘ИК%Ns!Щ╞CFгAQеr╠GvєOЫ FBNЗp0fefХЧ√23│ueп+f  ╤╨FHЫРшrB(е┘└PYдD&999ВЩЁ'`▌P└│╝веНK╖╚_╓y 8AЙ╠Ц╤ЮiЧв_нКЕ╢&╧▓<-╦─Й8Т∙─Б)Фўї╒^Z.х|9f╚`4t╤хыH, ай╝╚$нА▓GSЎ&╓г¤ТзПи│paVт╒╦В╬├:и┐╖3й№╧п\Ў'^дZ en}┴:)6╡╚"Л,▓╚вдTНр ╨\╘ДГ╠5j┬;[╚И4дqf├АЙm▒╒_ЯRY*тSЎl (Ч╫H ╗Tdeym*RVZЬХЭ ЭоМ`0LЇ├┼AZщЕ╫ФЮH\%dXc"й5├92r#┴AГ╒ fвЛНСDQYr╙]4ТИuН╠Г7n°├Я\ЦхS&Б*т╓╛iеk0ъ┬x:╕ЩХХEгЧDоAthH8ЗTt? Ў'оМ#gФNМ;╚ЗкЪLZ_ё#aИЯs▒З╔Кj▄╜є z 3Dз└╗D∙W╡\К%йЭїмдБXdСEYd╤╣P╡БГ&[ДГС╪m З`╣r█Х-Ї]Юю▒L┐i FХ├8═╫А┴░▓9НУM2\Ъ ГзMЕC6шxЫ▌D}QкyВ▌?T╖№1#Oща+▒nБу[Дqиё└БРТ╥╝zё" Еx%╟╩╫Щя╦&6MFИ9oсфП;ЩЩЩ▓7СаV╚Н▐№SПв';№ц═Ы7zЇh=Б╕¤╩┬%л0Й╟Ц [JМeIб┬╢,нъ^├ЙїeЙ"У╕шАII2d╥pч┌╫bДRЁs┘ЗУ╩┐Jх▓Йsд'═ЧФ─О(8[Э├┴'YdСEYDк6p╨─АQч7pР╛$╢И▓Н_3MT┘ё╖╣&╠эЕ╕┤GНуОe┼╒P_╚ыq¤БIУЯ|Ї╤qP╚╩ ДhД;Ъ9~№°╘йSХ╢LмbkФ║.РRв4%w╕3П{Єшj ЁВБ]ШzЭ8\╚щpH `1}·t<ъ█╖пмWъы░▄/H9г ¤╜ў▐ЫЯЯп{н╞mMу▒┼╠DGЗL└eb@СlЕsbTЬзТU╞жhKс=z┤^╜zЄвО]x╬пф6tш╨3f@D<СFDп╛*КGєч╧0`кrп$7∙q█%│м)) y+mєв,=Н 4√▒R(Л╔№q╝ЕъаЗ<∙фУ╥ АП╟ОЫк▄дDQKSвE&MЪД№Sезg▒0┬╗р*╜WНEYdСE U8и*ПвуJ▒мp05UЗUДhbpш╟5═kуН┬l┌╕!ТMxb▓ўшXyyFfvЕпїЗV▐┐?░яq Ща╛╟/*Мн╧▌БАeА t┬а├Аує╤╒Фб-╧в@ │g╧.(( юСe▀├З╒MШ0 ХТу╫yiО╥╫%┴92Щ8q"г=шЛн`№3Ё5▓в╡Тgпбт║%М╦╩╚сщзЯoxD╫W▒wО?~─И╚Я №I╟"Цb]IQЩрЙЛц*╚╥ы▐╜√5╫\K╗,т┴╩╪р:5╥<╕MЫ6└╟Ї╦&█4Fтw┘▓eЫ6mZ▒b°GMЙtP╞э└c?жs7Їёэи█ !XФ╔а╙lPp;n▄8╚oЁр┴FH?}·t$&{У&MBЮD9<°О]╦VK"BeF4▄╜{7╫@СїВzш!YT№мX▒в[╖nР-дЗ╫iуF№·ып╣<н;╡Ёа╝-Z0bв`2▄Ь?~aa!WrAщ!| HJПl╓е@МА°├.╞┴5[ьa$Fї╣(ЯXn╩юl╛и;╩дЗГ|кG с!З"┤╚"Л,▓ш\иZ└A┘/h7В╔ЬW ╫m▓ИлЪ▓ЩOmt@Й─RШп┌eех99╣АmБ@x╞я╟e┌ЦМб"@3╘ё\ДО_┐~=А 0╫[Б┤ ┘╣sч2Wшuшц|╥┴┼▒c╟А>L╗Пж╒m°Ёс└R└ya\iЕd╕·)K╧DuД>Hр5f╠дШk╥д ╫▓∙.╣рKф'╟M -D╧`YЖЮсj#Z╜uы╓`H w└Шю5g╡ТJM@|р└цLгНgx рGe┬e└G╝Е^"╛8фY:ЙАZ\АА0JВ┌║u+░жkЁ╚С#∙∙∙tИСSШЙ2ХL[= bбrьa+гsKЮм ▌fЮDвЗ│ск=ПфZ0 eB2╞*$-7iП╓с ДЙLР!zЭеH' j#NK`Х]╤"Л,▓╚"Л╬J╒╥:h┬┴Ис/ОШл└ve╖ЩЦ@[D█SиbK─▒Ъ╞W> °C┘Y5┴`EE╚уu"/з╔Гu1▓╥ЬЕ┴№┬Е Б╕┼░qу╞}·Їсv.·|6╔╞A■Й╫k{Е(M"ю└Cuъ╘црстУ┴мА Й┤T╠NgFDE^x!└"Єсz(3ч╔┬╝PЪЙЛЩ╙4┼ХG60╜=╨@▄.йяGфq┬]a─▀YwЪдk┘▓%Кр)╧°4hPx%мС5PAN╕h╫о▌З~╚═ЪA9A'нЖ▄e(AU,Ї#л)┘▓ ╞gЩ3g;.^┐~}░G#х]w▌иў№є╧г╩x╫(СЁ └┤SзNи$№hгAО╔Ф ▄ёK9$ЦЫ*:аО)pуms¤:)╤╡E┼P>╔ =hСEYd╤9RuБГ▒╡сМ┴├4pP[YО!B№?дь╬╥╥▓zuєЛK*ЬNЪUYiyvvж,█╤Vз╗Pрц╚С# /{WзEёўgыщ╕чТ.┴.D─VED$П>║╗╗д;%DРїo#bб╥ ╟ї╙╣ї■fчn┘;Bф{S;;єЭ_ Сc╟ОUкT Ъj1e╩Хй.ЯHq"ВЇ.AГ┬L╙?aЦ─■h═ёу╟ЙR+╪SS#tН<%" Т°█VнZїш╤гP*sD5yД?Й") ГHТ #╛)─щ┴ыїТа6$F dDъд8T╝И /┘кОьVLКG^е╓xN ┼Gb─@Щ{ЎьIЇзР/ЬЗ┬4И╕би$ЙфB"RЪ¤СБMVо\9--m┌┤iP#°E^NдЖj╜а<$Об▌$джH└Ёй<ў└/╨nи■М3рjЯ>}РbОй:ш/"Ж█АЮBЦ▀┐CЄB _┐R╛ЧЕ╚ Л V k└▌ШцxЩ'BoV+эV№щбM╒(хj"║g▒:tш╕F№+ш *d*икtP9-_■╬BаЄгWУ=HT6УЫыNH└с╒░├└И╚ЗL╖Д─;)Wо\╖n▌T·  ГД;! _HР╚оrrr╩Ц- ДГ81└S└oА!К0uъ╘~¤·ClEuS@Ко(dзnцK,╒╜q !I-#$Й EФОU ;zЇhрпзNЭ·B$RР>╘NеYДАкvuДрТ▄╒╓АK─ЪАl─ gF)@К┌t▐╝yэ┌╡#│$`╤)йЪ*%Ец"~9д^p?┘йПPXтЎAbў@╜H▄(0Eэf╩$kиЁ6╒√ъ╛╜Wй/PaHGн*pLЖТм▌ЁZєХ1ЖСў√9УKжМ┤=┴═%t╨ (╙▐eG┤`?yяQ$┤ЮlхGЪN╖╘бCЗ╫В №√@ Є·Їщ┼Ш1и└▐nЖ;сqр╕PаtP<"0`Р$8 MAЪ ▓ ╓ujeТPєъ╒лзiT░ С й╛┤p┐jk/ОсС~°ЪЧt*UtJ▄eкTйrЁрAu?hХ,■е~B┌S╗ы ╨ўY│fСД╨,└ябF─Jx=∙╩ ф!ЛвэЕgМq> *┴Т╠2╨f$0И1─Т$╦Iв@*[─ч¤/╒KЗ:t№7б╙┴B╨n%>ЮьАз:╒к BR$в qS═╠╠ъйЭ°!YxйкЮT╦╥╥╥*Vм╪╗woТм6ЯvO<╒■Мь╣Bи┘╚Du░%{o@}бT$2ЛкнV╦Lоj▀&TНlяAfдlj╪mтXM╝j╘2wэ┌╡rх╩ЁKbИщ$aи@X╒`┌j5g╠Ш¤Х─k╘Ж╣&MWП;6wю\╡qК┘■лP#Р#M№p"ДФббА╣B3╬Ы7я┌єХХxHКЖ>Иw╥бфh╨[╡╞}{√╤eЛ:hТ9$╤("!Л5D╤У╬╝М,╡╦¤i :tш╨бC ЭВJeАuA1f╧Ю дъLьЁКь$Л HzСH%└аjp┘PОpэ╡ZъFфm└lVнZQ`│┘а╤8эHш4╤Б┬U╕ЯЁ<█ИщёnБ?бД╧С-OИiUx╙Dч;d╚YЙ╜B)╗ЩA·pг%ДЖ╨/`9PwТб_D>з5А#<ШЁ9╥МpП╦хВ_т╝rЄфI`УРЪDFН╜В44Ъ@MюБ4Ч-[дЬ╝b╫╜{w8n╓мЩъ╔л6ь╕qуRSSУУУ Б╓ю wГl█╢-ТTч║mЛx╖@KBЗ!╗кР04Р;щ─иqъ╘й╫Ю/|a№╞DЛ╠ф╟Mче9ЛfwLы╠СЮC╛AJ!╠`╟Т!}·╠ЮЎ╢*q$ЮI┌Й:tш╨qшt░(TСР0|О06Ш╫aК%МMї)&▓.эftЧдR+ХкNДW┴¤D8д·ъТА└Дойq°TRе╞|ЖєДu+"29Х═и┌R8IТ╒Ф&ЖwД ПRNЄ╕╜OНzMМ█И RЫ9╓*Й#│Цс] ХЙТ█HуР▌чИЖ)We╜E6╡√Sw╫[вЭЙВЫ▄м2oт└ёЧ┌Yэ`д$жг┘b┴о$┘шэf{ьЮryYQ╓тМy#c6░зqФ╬ї;╬№ЁIф@▓ITФFЬfыm:tш╨бупAзГEбr"яБ нSa*к╩ПlRB)█╙AУСЄ_╕p┴хr┴dO°бsц╠щ╘йУ╪╥TеbДЖк▄BХ&jэ╠р┘АДиЮЙФQ YвК БВи)лБKDёM$XД╛РЇЙ╦ЁU┌_╡~#тRR U#IьфH1T!въlAtЧк╚Ё*Y v&*╡ЕЄ└ $Л┐╘╬╨┘HTmUО╣ж╤╚╟Р!Мж?ї)УЮшpФИ*^КЕД°p╝Af┬┤╫w╢ўо┌@▒2+Р x■╝sы╨бCЗЧГN AeDв│pс┬Ўэ█л╗К┴ЇOT@╚OtйH Тм)ТЙЯLXQ═/▒!#Ti╝Ап@╗kЗ▀"B5н=ЬкЕущ╙зўю▌[ ╚З ┬їA╩─хYM▓X┤hQўю▌Б═*√цJMD4┬дT┐fд╨,тOMЄR=[╔ pJ╣¤щU^┴н╥╬KЧ.н_┐> Й4,Ўп╢3д╣d╔ТО;кE╝# П╪ ЪЇ╨╟)СJ _╗-+МGvl∙$%R╩$YBt0╧Щ┘s╫3╚N6нS~u+A:tш╨q╜╨щ`!Рb╜L╥x√э╖QБHI╒ўEд╓P iМс*№сбeDdDбOЯ>dЧ[m$Hg┬Д ГVЛбЪ╛i▌Дсq▓╗1фвЪтйlМ▄№ї╫_%ёэИ_Лъ╝м ЙЗ сF HJJъ█╖/Ь!╠I╒ ^йЙ┤jP╡0и└■о┬▒V7 йAЪ*╟╥>~)nХvЖ─П?>sцL▓┼3┘OЕ*╪Х°п╢sП=ю╛√nXxРК─9╣╤╠ +G▀∙J╦─\%╘C│{mO╚K2КЎ ═sfї▄]┘╚( t:иCЗ:о:, тHKВЎСш}DРгЦК0 эмпR╒╔┤H,m\=╒╠╥T7Ж█ AэЭк аъЯлїЬ@цD ╤РB╝ SHюt╣\┌`+dЛaU9┬=└<ЄЄЄ qЄ" A╕кuC╣ккЧT_ЙСФe═╞╩jvиpXХ6])¤[вЭЭNч▒c╟╩Ц-KЄ"╛>Px╥mо╜ЭЙ┘окVЙ8╓а-yтsNК╣Д╔o╬n╡·О┘йЫн╝├╧╣╬м╛╗_└╥AY ъtPЗ:t№?а╙┴B Lh╟т┼Л·щзх╦ЧлЮY│fA ╗tщB( ╘8A√Ўэс$4тЪ5kа╜:tш░b┼ т9╤кU+" "!Zц╧ЯThA▀╛}╒]I Э @Stя▐}╩Ф)III╨P└o ╒СиЖQYwъ╘щэ╖▀Ж√Б Кг.Щ1c╞БЦ-[Ж x$YC9Ы4i9о^╜:==ri█╢н╩█а +V2diБKuЭZиNP$b╔]$;;.A.999dSцщ╙з'&&z╜^8Жь<p иWjjjСР7ЧтЦhч#GО@F─ыZ:L|||│f═HОйЭIk┤i╙ц■√яЗЎ!╛)FУБ║@/}~┐┼]юМямФЇ╤ггЪm(улt0@╟rт2~№Ц╩85▐┐Ш╥muш╨бC╟uBзГЕ@dEЁ s9╠ё$ж R&я~¤·S!Т6h╡┴Гё"╤ЫсLЯ>}А╜ў▐{;wюДЖкQ╜zїо]╗к▐@/р╬Х+WТZлсЪсAh╙Е 6o▐<%%о Ш8qв8p╒кU╨nD"ыё╟CBdлZWHЮкZ╡jFF)3▄п ╕р║uыр╢╓н[C:vь▄И╬ЧЩxr─gO·M╚Д▓X$S╢╛%Э:tш╕NшtЁЄP%m$╓ R(TеJХ222аи─╒АД─╙>кТ9-зБ;Б^#INNюR$|1\┬■д╩qъ╛p$┬T┌╡k'ДDЖЄ╘п_┐e╦Ц▓─╘ПфH,ЎЬN'╔ш┼╗я╛╗g╧ЮФФФК+]#Є9╕У▐И▀ ╔СЬД╖pї╕АА!CЖ@:Ё, у Y═*Qв╨D╕h4┘еГь╣%ЗL╟НзFu╣Rт╖J;Cт$6aVVФдWп^╒лWын╖-ZФЮЮ5ЕD┤╠/█╬HсФ─ИФ WёQ╢Д ¤▐Цu[ИCn6{└╬j│;■d?oьГ/;сф╨╧ЮЪЛr Ш:t:иCЗ:о:,bёМК╘\ХвСє└-р qр]╜zuZZ┌┘│gЙjХиБCаВ°╒╨yyyЁqЙB@dНР8с"@AИT ╬W;pр┘√Є]╡jUлVн╚цlsц╠щ╓нЫv7B_РвУUK┬у@D╘█=5jc·Їщp tзVнZm┌┤Qc; с7ZюrеЎБдаH╨8ъф╝кУU VС╒Ph: O@"с╢"╗Bi т▀╬P6РЭpf╨ЮZ1╨┴НаР&▌vPЗ:t\7t:XPCШб{Ўьyя╜ў╢o▀ЮИpИRпAГ└иб┘║uы╢m█ц╬Э█еK╕a╔Т%йййу╟П4h№9■№▐╜{OЬ8▒GПЁ'P вT:tш╪▒c╔╞┴Р╕─ОЯ{ю9р$╨ёчЯN№'HpУyєц┴#@MАC°¤■├З├°УьфKК ╪йSззЮzъ╡╫^ЮЕДf▄╜{7Р?(dєц═б"дРЫ7o~■∙чUW▄╡k╫~є═7Л/╓∙╗Ўц"┤Ж╚ ┤*`bзn·|Нй▌*э|√э╖ўэ█lOB -_╖n▌Э;wn┌┤ ╨DвPЖ▀л┤3┤╘ыЧ_~Щ9s&6%d╝IЭ═ЇЧ8_e╓e╜;▀}Kщq═╛+ул`н~6Ры:;рУЗeЗ^Ж╖b▌│XЗ:t\'t:XъOd9┌m┘ра~¤·х╦ЧЗжY░`A█╢mЗ ╙∙М3~¤їWи#└m└N`╓/Sж ╕ ў@├A╩сp8!!!77╫l6пX▒В╘Фд LюLOO/Y▓фкUлИш╦ыїNЭ:ї╨бC─╩НD`bБ4QжI ╨·Ё,фYРXwp╛Y│fp H фY_q:ЭЁр╩Х+Q_Бsrrр╝fY■│MфHЫЗ 5Ї Ї$8 х╘ю GnZF,ъоо,V[гШ╖3╨AB╕Ui"С┼цE"╥>"ьT7J╣┤Э╒}STХ7ю~оxA@м╜S d╓▒RU+e =▐-;е¤╧ юdаГ!:рО╗╨oўC8юаЖZЗ:t№┐б╙┴вP∙MлVн}Ї╤:л/ ╔╔╔p кt╟хrA╣▌nb┴жЪ▓йЖbЁKNе3p/bKGX┤#╤uА{И=Я*HSNс°▄╣sДфй>╝└]АUhеnкO0з5jtю▄юЗК+╣й%Д┬╜$ёЬ▌╖o░"╡·W x)Y$Шбv@дH─>дhWс2"{БhеГънrK┤s╟Оя╛√nhg▓я0Ў `Ш═ 6n▄H╤n[╖pс┬╦╢3ёwY┤h╤7▀|C8:~КaЕbs╤┬F┐DПЩъ5╣=jAw╖FУ;яs║МТ9BЕ╝Ом;kabГЪ╒ща:tш╕~шt░╚|Ф"33│|∙Єo╜їLсZЖtш╨бj╒кСcu╛╫*■┤A^Р┬ЯИП∙єR═)!($ ]Tё~U9 !%HёД ьК°█к<ЖЄЕ█рёi╙жежжЦ*UК\"╘ДTъ╝ X ╣жее-^╝8##JHЬfо.║CN▓─Gд╚■%jФэц"HГЖ*└Я╛Иb▐╬└S╟О =r┘░aй`√Ўэ╫мY▌zё5!1eрx#ЧmgЄ^H7Г╧,%%ыЧ#Т┴@S>4╗■Ч╔RеgъХ6$!▐Е/№┬ь╢Щ$cLОm┘Г>иwСъ╥A:tш╨ё АN БРUитууб>дH*UВ3ЁKЪ.й╘ДЄзкt.▓∙hЁ-eQwKГK.ЧKы gАX@vE8╣╪ уB─Z─О░5▐4,░R °У8эRлЫ╝йб■о▓g1й╕·аv╦`T└rTRHn+┬/ т║qK┤│J6lX╣rх#GОРА█7nDЪЁ╫D8zеvЖWчб P$RHlк╚░вД╕0∙▄Z[8IаdCв╤MчB╔УеdгdАjЪ=#╢6Gц.и█ ъ╨бCЗО t:иCGё|a@КєND│>ўфёEYииХЧР╠∙8>3░rщjI╖╒.щмB╔Т6и uш╨бC╟uCзГ:t/└Uв2nхИ╬Ч Iв9хr!BN|SДК"Ч)О╤%Д:tш╨буzб╙A:К$хЄ^3mqЁF─+зe :JсВТЄK+g8>В ╙BО╤уъ╨бCЗОыЕNuш(^:F"|Й├jc^!&$P(Цмx╫fЕвИ└ < ЗМIзГ:tш╨бу Эъ╨Q╝t0Аx ╔vЩвE oA'╔aрИ▓l5ЩБ■1вДщ РBJ 1HF┤ 1║▓XЗ:t\7t:иCGёВаX 4cR( СF+╥МАшР.hу%ZцkB4e▒ъ╪ишУuш╨бCЗОыГNuш(^ о$*цeДШAfgТ &Q"X$d ё ТXDгЗв2▓╨:╘бCЗ╫ПbJХ $А■е4╟фW.tц_eC╛▄╔]с$╙<ытLED3╚HдГ▓тZL▒<жЙ1V╞БСD#┘зБ+┬M▄▀▌BE^┬MюnW╦ю/ХL╜∙W@VG"mV┌в■+;░м╘ыZ~uш╨QьQщ ═0Т`╞г } Ф ОeLсИ╛е╟╥╘ез.{Ж║Їю┐╗4▓f┐4#кPqог,┼л╛┼ ЪzKЪApЙ"7╔╩y·║&▄K[╗Ё;Х _╝бq I╜┤╡Pн )їО?Е╢|7wE!+▐>r┴Ў╤∙mu╒╛х√Є╡╝-n∙ ы╨ёя╟-@i д фВ 9:x)∙║ tЁ▓y]┬пг,┼л╛ A\T)┌НжГт%╥╡BТ╢тMI╪pY)3ЙIй(№╔ {╦З ╫ща :G:XDYLiхВ2НиKU╞ ▐╤цJ├ю н░|U║зс  ▄ЎП╘WЗ┌7pшН╔▒Иt¤U:x┘Є▌,]-СвВБVщр%тmЭъ╨бг╪вШ╥┴В│V№ Иm╩MогV╢qe╣аVЯ°7√1№▐iё╞═|Є%║it-tЁ┐¤_-Э-д)╛Ьh░╨m╖:t█A:■E(оt░╚Є·JPЗЫ[}─╣▓IС:иjq├л{х№┤rAЩ╖·■╟pMВ│Ыш q▌ї╒д┼E·╔Хt┼7┘¤щЄVГш_Hu*иC╟┐ ┼Ш^Л╤╡z╧н>ъ\о▓E╘vZ▄дщфТс№▓\¤MtЁЯпяBШnоэ▌еRW║аЮ╛д0W7╝I╦ХP VW{їн▐Яu]▒ >c:HP0Р\~╗мpрV─%╒╗╘и_ ц╞╫°▓R:mСКФч/зовx╘ў?Е+╥┴╦:Ї▄|WЮл╙ iбKн/]┤▄p·їgF:╘бCGёFqеГъ∙╦ёГЫрэx│q ЇHK╬n4=·╙с╛P╘╟ы(L1ляЧWф╔Ч;╛itЁYЖBх╦ОrQюu3Ф│rсГKs║dM{лwfЭъ╨ёяCёеГ>╨n╖┬Ш╬K▄цcF╬А 4├В ░4├)сe°Ш└q <╟д|ZB gр╔.Л┴%(ш▀╨r7дuQP\н)З┤Р)eh╜╤T8&Ё╦CAл┼ FвУ╤"4;╦тGQp M l6█▀Тщ?X▀1о╘ #СН(Г╤и▐)K▄wё╔ЫI▒qюT▒pJ╚ дшш▓с╪▄∙%*фO ·з$с└S╨E6╚Л╝Йсn8╝╫xЮх╕P0h▒|G&╙Н+╚M╘UФФ~E╤2*шWМ╥пв8o4\ьWТ,1Ф╛б╢┼┼ФЖ├a│┘,И▓ "▄J╫г├R╘L├|Ше9ЖFFКНE#c`YZR(#IЗ$╟<╧CВ┌"BщсънBU└h eЖ∙█b▒@M)74GЄb№┐▌fЗГp$l6Щек-Л oPця№■╓т▄№·■GаЎ H Иy ├И0С├чпЄOwЖ╝qo@щmP 4╦P╪VDЖ╬F■x╡%)D╡l ║(,CA│═&Q╕ГJ╩Кт╞JЧ/ї#.МА▀o│уя╚о┴l╬з╣╖xП╓:ЛТя:_г┘ ї(уО щТъ╨буЪPLщ 3▒p╨`╢╞─(═%$yC╗┼д0ё┘MКDQЦX╓ЕрA╓p∙╔ГфвЄ UXrЭ vcpЩйD9Eд d■Pчh_г┼rжB╩С╥hЕ :%ЙHТ░А╨`вQ╓h№Kх)Юї¤Wт╥■Oc>%R, Ga■╢ZбЙЩл┐┴-%╝┤рD╛b  ЙE}Ч¤и Ф┼М*T сgE╕И┼╠ ╕/yВ~З╒~УФ┼Ъj/сЮl2+╒T6№W╕у[V6U(!М╞p ┐xЦQ,DcQ,&╝┼kкC╟┼Т╥М░ЬОE#ЛY╞╗╕Є0▄░ эf+Щ°@РГqVB8Дв8╓N~DR╒А_`3┼НjqEzLЛ3(.Х?Ч@e q7C║@^ фОE5@▒О&z=Йчi(Ш └kGвА8ЎябГ h} }Рэ 2┘IC╬-ДBм╒*ДCXdn4\lф┬Э7Z Ж fЛrмИЬХ№0U╡Y/sБ+ Г sAR\>Ж P9╞╟ &c@l▀фb8╠X╠д0ЕP@/vI#МёX▌,ЙШr╤@y╓└ёв└17▄\X%~j▀"QЦ3bЄ eАd─▌тtP╓t┼^євqБ ┬hЮ▀пШ[[кC╟┼Х║╜HТЫ╫a▌ >Зqєе' рл/#┘┘&╗=ЬA╚╚ъ╤╣ы▄e╦С┼╓╡Y╙╣[7 зI4bВ @щЙKКъўZ╠щ`бИъА s6E┘ #╠gб@Ё╬ZПт╤ЦП"зх╞N'Т═V[■р.гг┐ Юy!у▒gЯ═┐ц]Е╖Н1в▀рБЧуп╥┴тU▀)┐яЛ¤_┬tЁ╚▐}┴pш■зЮФ╩n├н/Ё╚Д]zeкР─эЖ g!зpLE╩l■m ~°rяy╕╓bЫM ╧(|sСГ╥R╫C▀эu%─8°╟sН_Vb(▐╩|╠@\Хod К─├"}╛СH h6█Ё·Цfрж╠▀~?ЫХёP╜g юНo"`нш мё ╙┴_ўэ ЕBП<∙$╓@▀У ·U▒wuш╨Q┼ОЪ F╕АB|p яl▀▄▒oЯ╝Уg▀▌°^чЙуНMФС┘К╬_И∙KW/я1┴фP╚ ╢.+╨FQъ9║иоз"ТЄЯФ4А:#v|╘╠8wЎэ Р╒В тРи`бСDA╤`¤ O╤4+Х╥Ю╧Пxi╕Р+(у КЯ/╒PКH┐░ЄЭ╒▀~ў▌;▐UФq╩Tж(°·╡я0eщ"─╤ВТШ"nТФздВZ#D┬LPЪ*├UJRдPtAл┤\МЯ>n|╪╠:л╘╫ж╘Чеб╛nдR~тЕZOI\╓rFйш WГTHйmо┬nпRЕ╧▒+╥┌√╠┼fЧ╡═ЯЯHS╙З3ТЄ<е╣ ╦ZhдСв^╠J.иЛЄ2OЮLHH`q з▒╠Мaєm yq\▀┘ч╥g.\ИV№p8К╠F°Иа Ux1═B╞ЮЧУЇh┐RmFЛJб┬┬au<Б"╤▐=z21qъ┤щ╚Q`БP$▓еT╕й╒,F6ж▀└Т)%╛№Є╦ХяmР∙e╖т│ |Ю╥┼V юWxnбRMЩV\У ~╔7}ёЫR╬чK▀зЄКeе▄∙╥A╓ИХкв$Ю┐░~хк/Ўэ]╕cЛ╠╨ЪWVф-j▀гц╝╢7jЯХ/щoЧ▐si·┌~K╕ймй=иВcJ▒&э I▐├╟ЭЙё(▐ЙяН╔╕C*JyXFОь; яL·мЕєQЬ"▄НD░╨Ч┼уЛ4─ЩА.▄1╘╖аO╡e╓>л\-╕▒р√ХшB7|nкьЦ╓\╘@║8и%S:@~╙JR■7(ю№rсце╒ЮнKCu▄z╕ItЁЇ┘вtРбhB !E!╞ ВЗЭqq@АPV╬ЬО║н]Ж▄Юй=ЖЇ]▓q▓rКвe·F╢i9ЄГїHИ|ь∙Й{Ў ЫєМ8Яў╨▒uлW]╚╩,_▒BО'╖KП4[Й$╠`8.▀ї°ЩЇX╣╪XНЖл2■Ъ ;bЬ$S(ЖЙм+] ∙┬╚hBС0▓█#╔E4пМ30"Тp[╨H<МD ЁнhLDAёЭ4р3УyГ /гa─Д{АЄ╕=╚Пd^6}▒░╔`bСНAz\Ы_X╛u+SНМ╠R1Дr|юЦ▒*╩dEЬ3а(╖DГ Ъe Д░ЮБ╔пТФп ╠:w6╣ly═P[Ф*EЕа*CМ┼┴F8╪т═f+6оgэV2Db?ГЧЩвў╟∙│╖Ч.KєQnЖ^yЕC╕бrЄPR2ЯЩ├Х* -ПГ╘@yД#ЁBc┐┼b▓к╠╩2Ф ┘м0х2═Z°╡I┼6ОК┴k┬^Н▒`└`╖AьC╛д╛╩[ц1[ТP!Ж%).24Єцц:Р ╩╤e"L' ╡В┼+fФ╕o╕Пй QИ─"&ш$▓2eBЖoАЮП9 ╘ТU┌_тз╦ў╘ Gв k┤ЩдП#,∙BXЄ `u╨╝^▐fцЬ╬мє┘╔еRа?B:\W╞.>@3 #пYmэъ╘]║√#№" &lЕ)K▓╤└KвБ┼ў░╢]╟пZНL╩╘Б^├ &Q▓ZаwNJ\" Fqа(┘яе\╬pо█ Я'gрб└KхKт%ОU╛&Q┬эcфp9А@/хJЕpШ72М╔,#╤_ O┌]<├╫ ¤>F╨dСЧcФ┼C╘oVIg2ЇFдQ ╥■╡fK╓пGf ■ б3B~ШЎс├┬╟ь #╓Д═RЩxЦ єa'g┬-А>;ЛK.БлR6{(р▒8тpOаФO8вt @°Ит# Е4 /k╩'CJs▒╕Ч▒ хВюЗ╓А╩AўЖЦї·╙Z╝1√У]"╟1Д╬ИЪOРB^Я╫щp*╦ '┐Ёu├вИч▒нg┴7+є<Ў З▐╔B╫ВK:┘p8╜╞d6_Ф╕Уї[,╖Е~│═╬√ЬEщЩЧdQ░Х%%юи┼│К]а▓^єEС┼И▌_XЕPЕb╜Яxv·G;СL░zЗA@МYLP=+,ъ3=cZu╛zКГЄИ╕┼╤gжГ▌п7#╟цLDС(qяры╞геR EhxP)▄╬РКxєLI."zФa И5|уВX`)Й t √Я├gАы╦(яYщ╥°s3(fхXPа!ь╕_╝QЫ▌И?8I°=л ╫TPH! ┼p#═°a│╙]Жf<ї¤╚`DК╧У ╙K~в╪╨Ъ+F<Д─HД▒:СjQ╟нЖЫDO*tЁЫKш RВ╠Y═xШещЇЇt╚2zЄTBfnЯОm&lY ╟жt<~┌tOТ5ююjp┐√╫ГоЬ╚└^▌╗═VжT╩д╓Э )Щb║ ф Ь╪ у{>k=bцu~/r9;╝Ў╩░├╦▐{╩єфЭKG1!■╬{▓№ц1#лЇЁCxоеQЮ█уJHХбЛВ a б0Є[#RЇB╢Ьы╖[э■`╨~чэ╚aFBМаH╣`ФсF)(├/МЯWrВШы╬NOЗaц№∙єe╦ЦЛ┐╜j▐й╙qё.:.Ю4▀сo╛K▒┼√<▐rП╘╥#м┌УOЛИ:╛╘`сЎ-xddБе│╝n│╔ф2XС;ЬёєяVл╒G о{*╦&sD ╗ГI Э√~Я╒nsХ/Ль╓c√ЎmO pwнG0эyК3цKA ┐·чў·JЧ╚Вeяоe В"Нбe▐*s(*um╥|юъw0¤eС═q ЗГ0вЕ2r!ўDУ=тєЫю║%ШВ2v^ёЮ╧4║├ЙХлe°╒▒FK╣ЗT8=6F цхY]ё╟~■┼╩3╬ЮпPжмыЎкЮS' .┌├g┐■:.>!&R nC╬╕и?ht9=oЬ╦ пу√?╝┐b┼р∙Ї╕j o╤|ЇОн2Ёi─^4TМЖM&=;т=╛╙ЗЧNL4Wмtъ╟¤qI╔Бh╕LЕЄXё╩q1Я╧`w`эєЗ }4Uя╜Ч║Зрў}√Б9▌YэXЭ;~, │&c∙ЄхYЫBГ ╣t*┬ЕX╩Гў·Єr╬xoN╢│t╩▀~W┼Ьрм\х─/√9Ж Ю║Pэ∙:╚Мв√┐¤╢в┘▒аc┌рсCЄкзdF#╖T■ю{2YС│ bЩ0°Ё3▀▀p2уg╧dVx·i╤bЇYМ┴ы1а╝@╓omNЗ;(]є~AКЕ$FT1eуёoўв╝]ж}╣'kё▒ ЧТХт}ы▄╤┘п╛Mr┬w$:o+Зтэ▐Р╫a╖S▓Ьwт┤'#.Э;v║Lй╥ЎRеB■Ах╢ °kВеuQ° -ф╔ %┼уNХХЩЩТП_@╨wц╚93░Ь,Sею╛па:хm&ю╘7▀&█m°║itЎрA_(L╦tїcг&XdЄ┬ЩЯ~0Ш Бp░ЄгПр0Ч8К╙-▌VЗОШ┬|`6ЫYЪ╔╚╚Hp╣lNg4Z0|DЩМмЬЇ╙жкК2sц│k╓z<├e|╜s[kЙГ▐hїTrеC№jи^╩╚QЮo~╜ў╬{sнЎ╫╟НЗBЇz¤╒╓с7 Ъ,vИ@&оS╦╖,XМx∙э╛ГО¤Ї╦ь∙ цоXFЩMё╔)Uюм■`╜║ЁС√╝>G╝K─╧фувА М`\Є2ю└м╤тS,2█э═R█qU+┴КРgaБЛз*L╒e(6 _0 ╟вqqN╝╪ХЕМ▀n\┐NДp8ЬРРXяЕ╢Є├xЬ:~t╙· БJp&╘yй~╥}wfyr .╗С3Ъ`┴эП┴x╒цЕЧ▓K▒Л З╩Ейл?rь╗~┘╖ ╨▒гМ├╥▓[Gg╔ф|1XоПb═╙{Ї═╩╩ъ5b░@гэ|Ееp$2dьШX4 │╛┘ю╝,─с:▒шУ=Т╒рУd+Mqxj╧¤Ё├6JСИ''╖┌w╒k╪аm╟.ы┐№╩А╟7f╨└Г{>┘▓∙▌е╗╖Э╔╔2P╞W┐Z¤╛ЗЁ┤jf▒$ їе█╒}qщ╟╗+ЄB╠Х,vЗЦрБP╞┴▀7п[├ЗГ0qj┘ж-m2Щ╦W┌╡√й3щ╒кT:mЦ>2╘ьЙОЮЇфухЯйЭ ╟╟Х└│ЦC)fЬ┬V╖°АўЮ<▒{ужSЗЯ;zтБ√юўC╚d╢Ц*┘оd`eJВеI╝├╒яйЧFП∙■▐╧a0хЖZе╢гялДмX└Эw■ВФчoщ*гb|╨▓kgcЕ▓ШqЕ├Р ;Єч╣╜NЧУ4O└4s,cр№Y┘{6o∙`▐Т%[7бЄ ([╫ьЯ}> Ун(┼╥█¤З№№▐охЯ~:oщLп▀w╖%╣цг╡Уъ?Хх╔LNJA14ъеf#· Z¤┴√!#u╥Э╒╝U╦{k╓ВZ∙г╗═qЎл¤Яl╪┬ё╕╢nЪкIГjП╘РYю╘щSU╦W┬ Й0▀хї7цнZЕщ %!+R"├P|╨ ЕfМЩPJ6Q╛░╙b{╜ctwеlwVRRЄ╠ёўn▌=wЄЇпЎ~√╟┴├V╗ыХfпЧ~р>lў▌╥d╩9~bё╝░ КЖ┬Iё /╝Ё┬└бCVь▄Б╗З▀:wj═Єх>o еt╣зы╓+]г&ЦB'4Ъв>Oю∙s[╫мЙeх─│l╦fovя╙s╓7_JFЖvDхKгс К2О▌в8F3XУ ╧5·─o┐ўъ▐cыG╗│╜юДФфWЪ╛VюОъК~ъ№П┐|┤sWnV6М*╖▀u╟¤5kT╣ >bКвб9╙f|¤┼Ч╙&NЦEq√О╣>g2ЎЗ>уГ╟ыN╧\8{оAD@у^lЎ·m5B!┼`А╟ПХ╛ў@яn▌7ю┘ T╛в-с╛юOz▓ж LЯ>▌Мф|Ў═▌▐√У!$Z-╖┘K┤щ3╕; 3'7┘Ъ0№▒FО║ъч=9бDj76dЙЁ %r6ЪЫ╩╦]│tЛ18ЪўшS╧▄їH-wъ▄Щ х╩Мn▌╓ЯЩЩЪ╓Н│Y╖ЇQДП9ут▀zуMsЙRЁ▌e Їє║5яXlfG╝єБмt╫4Ьзu:иу├?Lэv√┘│g6╗┴`ИЖ├РebJ ╩╚ДпvЁг5╞ Є-|чc_l1Ї¤ў╠ЫёJ▓(Ф:6°╣з╟▓┘═Cяп=Ў╙oUй&еюmZ═┌╢┼В╚fB┤bЎB╙5ю╛g▀П?c5ЮlЧ.W╢¤В╣XOО ъ╫g┬вEX╝чPhKъw╤fIv∙░П30у╗Ў╜G═ЮНмррo╓║U;gХ*ИЦЕЬь▀■ёсоЭГ'L єБ$Ё┤▓wЦ\`уCjNў∙Z╓qї√[░ЛМ3^▄Вс├в▀c┌dм!в)!Э2q╥аIУє9╣ЮI'еш4bж√К%▀[O╢ЮФМY хFe~XбQБ╙}ї∙чoЎьб(X s║д╡я╙Х.cJNRT▐r┐▐wGї7╗w@еKаC'ч,^╘m╩Xdw СС"Вl5D╗Ф*єЬ─cхf8 ╥╨foМЕЕР╤Д_D8Д\.Ш/dЬ/Y"Еc├_xнDBRЧU Ё &J╖ь╤%▀~М\VЙцеg|╛y╟+Н^E;▓ШЗwы╘║K╟J╒└ъKЦ┼n@М░ЦЬ┴▀е0ь7 D╙3жvщ5d┼RФА;/:сЮ▐5нў╢wЁл─Ц╠┤║п'ФHn╜z6Ц&fG╝▄h╥з█Р▌(#┤D╖Ёщч{№ї▒гР+(╫.Ь{Wхъў<ў╓─╔╥╠nzОЫД{И▀Пь}█╡Ш·юZЯ'╟СШИmXтеЮM▀Ш╣v ц,С7Л(рGFу░^=╟LЭЙ2╝╚тD^_╖fMц|¤2P╕·2Э·╠ ╡и╤║oK8Щm°рC█АL(AФ~ ълwьш7jМbьaBnў─с├╦VкЁfП4xe▐уЗЧ╠Ш┌▐/V■2 GМz▒Qг▓5)/Н╛ l╧'█w Ю4{УЁ┬{={я?zxт{$F@Ўв53MмeОжвБа XЭё░╥ш█рх╗ю║лї°1─qъ░A:u╢┘,t\Їоi¤їБшбI╚h√╞ы╦vюB▐\яВ. а{█vеТSЬNgч┴Гё╚гxmЗ╙╙г┴╨╢ Ы▐j╒%$C■#{tk╙>╡№=ў!ОЙ°єLО╕^ї_}рЮ{[ОБ▓▓С?:b└АQя,Бё╔H╘█НЫЎX<Х4#ЛeсУM╠ЩЬ╠КЙ%QP√№лI╔оОыц"*oъї┌Пн¤ъs8иЯПЮK |є╬║п╝ВlNxу√Ў~╛q¤ЮпC,_т╔ ;>╞жJдуFJC█сГёы│┌¤GП/Щ>╗╫┤Щ ЦО■№+ +>ZC▒n╛Y┐сЪM█Ёўkw┴ ]:|DP╗OЫКU╥$ е▒╓Х.ОuО.Yй┬иFLЩВ┐_Жў.Н╧√ЁCe%`<Ц5vпSч┴╟j╟ЧJйїЇSЙw▐Щo╝ы Ь?xшы╧>{╛▀╢uЩЪЦЦ┌╗Чє╬╗╨Нwf╫буя┼?L9О╦╩╩JNL2Ы═A┐?Ф(]:ў╫Я"с▐п4Ш╛kл''g┴а╔,╠╚=[т▒Z0cС?NM>дчЇ╤0єн1╛C╧(╣4КOB)╔ны>╗тУП_ЫЬАф^F#╣c╦V з╜Нща╒1Ё┘zwяB▒^╬&O=▒щлпP$ДlV┐╧cw%кї╗иL─╢_!HчЁо=ХKФfь.щ|:мтGNЮ8f╙:dА▒ЖQЎ╓хЄ]Gф№Зe┐Я▓ШС█╙5╡¤ЇIНe╦т│0Oy═╠@%Ka╗╬╨°й╟7є96fbн8тЖ┴ЁVулvoi*ЛXБ )t░э│╧.√x2└| cм╠Q ╙o╒м╜ Ж->ВJз(/ ╡ще%╗>╚╖ ╧╩Cyrя>¤╫пТГ╩ЗеJT╪X$$╔▓I┘Го(Д7я═┌╗ў°9 ЁЛM╡,╚└їkЎ┌фЕsидx%ш4Еe М▒╫ fl▀ОмXiОds#Яwd╧Ю#Зўge┌╬sg╬9УТэ╒к!╬И`1К2сH√┌O,∙юkdVЇШaZ╛╘pї{я F√УЄxbь°dЭЕ╕╛╢CўЗYГл`|>)¤|,шwggX,&г═╥з┐╣█╢!глЫГ▒n═[╠Y▓%%@^=Z╖z{┘RlAиўЗВ~ P╜3uF`D`]╤9}·vl╫Югh_о█h1S,cиTAё┌a`:iP╗ЎЎ╩сХЬВы╬▓Q┐▀шp╞rr ё |vg╡е╛∙цтMЫDwУO╓|(╚┘нп╫yvщРL8hйZ-я╚ЙeП╣h╙√°EНmЮ{n▐ьYb$ЬЧСYоbфv2hюg ГЧ∙ШьЎuещЬА+╬7<▌ЄЩgV∙▓XQXD┤JСФ]╪ИEФ╧╦К╝ ║=ЮЬмы╘[°с.Е-┬ ╙╢У$Xe E[▌∙Ё╩~DJ°gФЪЮ╓╡ўЖхШ┤Вп╘yaцш хJХєЬў┘▐PЮ┬V\6Cj╫╘┼_|Клc2B^ИцP$╓╡┘Ыs╫п├цnШ 1aЫ╖_ЎьйXкМ├фBg╥ся▒S' }o■jБ$E┼N Ъ,А╢в╔)╞ёэ█Ю1 9бH╤nнZ═Y┐^a!t~,╠М ╠╬бС lу'j/Ы1╓Цо█лe:"3▄ргЧ╛┐KщД╪А~}'═ЫЗ╣╕/А┘b╞╝╤t╪╬░,WRyR┤bриЄa Гbр( ╪▐4ыЄ╘│є>√ П?0Ъ┴К╫fjЎlЭї{>╞_Я╤╚9┴9ь╤М┐▀ }▓▀а■╦?√yr1є│┘аЛcZ│i3╩═EЙ x╨ГUБBИz┐┘в{jзWВIж/de&V(7h°╨iл╫*^sQd▓t{·Е9[╖#Л"ЖМб╢╡k/█ 5"{─D∙бO<7vўЗ╚IcОЮBV'╢Fxp╬╫╢·C╦~·┘╙Ы╝└╚n]Gо[Г;б'№цsugОЮФT╢М√Ї9╩─└"|Є▄cж╧└623╠╪o╡ fч8RJ ╣┘>9 р╜°╝\П╖]╙ц╙GОУ"1WХк╣Зёz└ис+╖n─▀├═ю;╛_b}╣╝Ч╦qХ*aб╖R∙.ъ▐f╤И└Gв6з/Ь`═& ЄЙ╙В╧їєчyэqоО╜z,Дfb╚f╞<>╧█╗~¤щ;?─г┤-]░РQлgЮ[0kЦ чdfVмT! vd╡9▄0DЎэ╧Х-╠═╡╞'@Yз4h▄o┼2ф0 1ЖхZ&╙/4X╗{g>ЛН┴Ь─д=WoЎ╢н╪╤╟Ру°7ч:ї┼W▀~·Й ZНlLМyCБ_~;0oўGШ И2Zцїщ▀е T*х╨W_|Є┘з▌FНДZ╟¤╘)M(&l2╢Ю>╥ √╝fУuhуfcg═B┼┘QXjЎ╠3ыў~Б)R6├╞ю▌рq#C)╛ )Є╟r▌4Ъ│fцО╨┘lШ¤>?├┴ы"BO}╡U▀ЕЛРНF┘┘(оT╗Ъ/¤щk,ПO╘║] │#┴dгв╝┴a╦ееГgO╛╜bеbЕ СШ═aХ5_J █~QX╤щёu~▒┴|аЄP^п╫,8З6|yьо ╚о°YEQЯЗЮЭ╢s*Ех╚OўxЎ∙╖ў|И-▐░ї|°ЩЩ|И9H╝\Т╘зщ╙6мЗуя?·°°╫√щ▄А┴┴╓л io╬░Ны1QЎy▒ьSВvПе5o1°L█ Р-;╕Ивpю№╠∙sе`─A6ЩIМO╪▓g╫№┐┬YDр╗3 j╘t┬╝∙╚j┬о-■pл:їV~√5╩╦A╔Й-Ю{юXr└в(м°m└¤╪b,В=Z"сюm▐║│LiаГ2═DcВ3!╔цLx╡g╠╝)к┴c╡7н_g(СВ  ЭKя▄ьї∙?эW╝Ф╜|DЩЗB▓┤ъуKёЙ┘&!eр ї'B╟sЪP└Л┼ЦBь╡║╧┐+@ш'з╧,_╕°шoЯ}Єй│g╧&$%~є¤▐Щ+ЧCБє┘OМoЇ╚г[╛▀З╗7,К▓3QR"q~э▒╟╝єЮJе╦F╜╚772X╠]GП┼╚iЖп)їё:Л?¤ I ГМв■НM▐Ўz┼sЕї|¤яоAIV|?mEыЛxб╛╓МDvЄл-√/ЪЗr$/╙ФPт╡Ъ┐╖oяўs╬Д╤o╡K╢8ЬV╧є&З-▌У{>/{╩┌wФ$@єо7╤Аh_Nо┘j┬╫║KG╢RyfMО7╟;ЫїLS▄8`╪A3╗ў╠J╧|в╓c'NЬ╒╛▀R%Х▒СV╖║Q]Жёъ%Мx<Ўд─Я╢o▀ ┐пвnП╦dОE°и(е{ЄFmX_V^VF|J рG5l0Ж#)Ж`╪Їцaй*┬tЁхЗkPHЧеi┐▀_кlY╝ц·?є─фп>Е┴w└╙/MZ╣Х+С┐6х ─6|iтюўahK{░╓ьoўM─├ЬL hЫ:░w_W╒*°N,MЙЭ;°╟╢m█║ шЗеPSЧ· цmUt xjз·vы2u╔",HЗcH┬╓┘T>]PБc/─┬M`X ьK╠БK,t·xз.|░ O └єHh^┬┌й╦ YКd\7j─Ш╔SЁК8_NJLД+┐|╝ч▐Z╡С═>║GZZя..а╪рЩ╬·хЧН╗wt5<Яё Daтяє╩+╙▐▀АЕf┼ЛРfЕCз═Ь▌&╡╜╣\i, ЙП╧▄ єЖ ╥&НG╤0╢а┤G╬ЇъТ6у#мe┌ УЬ ╠щYsfз╢kЯ\к4v{OH└vтэ>~┬ЙcOpьaЫ┌д╔тн[q}╜фВL#╚lВ75e└А~i]ёлЧ),╔ащЇo┐+Uу!┼SХ▀╜ё▌Je╦WyЎвiЕвEО6▌sgXЦ═V[ю╤у├┌vЮ╖^ЯА9* KK│n╣тЗлр└└$8 Ъд:░LrШL,LЯ╨K9Cъ /-^╢ў7╝\О9t█wQfўЦЬ╝!M█М█╕╙A@Mj╒j└{+Q,$Е┬s&Mk╒ш5g╣КXu¤╨└фЭ=_ё╢Ш╟kИПW┤▐┤")Лт└БЛ╓VУнD№┴ ЪLz▓S░ЄС┐∙}т╕ёГ╓/AIN\AOxLг├╢mugu▌^х┼4ze╥';0 3Р█▀ёйn┘ЬХLB┤|■Ч_6мX▌k╩d$GztэЎЎ╘┘И│a╔T°╨o]√їЬ√∙Ї"зK╩╩др╦в·╢l5u╒JЕФ╦xэ¤9k■°ы╛■?х #`-'NЎъ┌q╞ v"Ў:v:2аC╖E░о@вт╬Ўn╨p·Ўн╪u▌a[<~\▌║u╦=Ї~<[∙~)Ї╦ЮПян] оОLы6r╚`°Рё√Ехв╬|√]╣ЗV╠9MуЗ шЦЪъ(_хyqФиsщ:uЮ┤}Л┬╬НDГБгёРИХ;mрр}A¤с┴ ПЯ=ХK╞┤╞j>╛ў╗MЫ▀я?-╝^лЎЖ/┐╞▀╕╧Ї4oяw#FНЪ k*XbГX@юё╡jЄъ╩]сЧтqгЧ▓<╞ЦЕ│Жk█╝Е :<еМWсю╖9yиB9"юЄRУyюBbУрs9cЇ║xrZ/i├аgъNX╣ ХO╞*╤ Я~шp╔√ю└┴╠бOf╗5k5╛\╝├╝├╫╨Vm╞о]Г╡"БЁ№I╙Z4~═^б"■*б│╕1█╞>P_л=tЁ░е╩э(+bxkJ·╒╟jm№Є╕╠с╚№qу;wыБьNe$╟+о{┐йTє!┼╘!*fч1╨]с∙В°[ЛЖZ7~y┼g{щ ╥ьдЗG╜(/8Eв=HrзЧ.xw^2Q╩╨}·Ї[-[м·с;еч╙Rn-q#7╡х}№рг╞,╪╔Л[╫┐[еL∙;Юy┐}°B)8z─Ў╨Г:╘q╦сЯw%с8Ое8░[н^п7>) FЬ╚ў?╝√╬╩V3зx■°}хМ=`╒ыTJТyС▓;B√~┘░nmыicє~∙u√▓╒н&OBл/rXьHРGvь:╝▀@oЮ; ┼''.Y╣┤+м╘У0;√╙■ у╞<м╘╜)▌y _i╝xхЄRw▀Щ┐C}1▄Ф 'ч°╩'%┐┌╕╤┌w╫ц─"╟ФнR3%|┬Ф^╜█╢ogu9╙326o┌╘gЇh╠╪АЛM(;DЗVm╞╠ЪAЩ nпўЎАЕr44Н╟^СJQ ,Ь<эХ·/є|кV6xHо7oш╪1ею┐ю╩:rШХiNFэZ╢Ю┐x o╡x■j▄ПЗTЦэ┌и╤Ф ВA┐╤hжY╞Лn╪╝е╟Ёс╕`X╕" пїLнюл█с--yc╤═█╖ў;ж▒-Ю=wN╠ї▌_в╒KН╓о[ыОyЫ\Yй/EOэ╒╗]ЛЛYвсXx┘кХ?■·єЄХ+Щ╥eI╚Ф ╥▓C*Фк/╠Ъ4ЄЄ╪дД/QуeшаДХ┼mЮ}vцдip╤╚┬сP\R╥мs║ПлHн eyT╧>йэ┌╞█у2/dpЛ H+Ц-S╡iт┬пЖ :~№xКeм6Ынb%nЕ▓IЭ╨>u@ясH╠чr√№Ы╢li?jT■■╝╣┘k/нє╠3v│ЙЦ─p(░~█╓NS&q ∙<в;0д]ч┤╬Эл╘пГU№ЗO┤ы▄qЁ▄╒я╗ж▐hЮ╟ШР H((КЬС#;╨┴Д╞╚Т╥F╙╕┤ЮC 9}№╕#>┴ n▄▒н Ш1H6╔9~b\╟>у&О│▄[8zрЫ_{wя>d▐ЇЄ5Ц]bїи п5jd▓:.dЬ7ж$NШ9m╩т%p> ╜7╬% 2m└у%е8,Ы(░$Ц^$6╖[яо;ўч$8Э;п¤с√╜Ц-0TнЯшш╨Ў▌ЗНf{цQh╒Ь=▀╠Щ3з╦иA╔▐#|╝'╨зYЫ╗■П╜ўА││*є╟╧y{╣¤N╔d&Н▐Люъo]uQX@AQai ДJ ! щЭZшEE@КАЇт┌`ХЦ@╩$У╠╠╜s██ыяy╬{яdр■Їє▀U? { ╟;я}я√Ю·Ья╙ў╪k┌3╫o┘Ш╩gя╛√юKц/fба╚хчЭw∙Щ╙I┼Ф_╩цn╗∙╞7╓┐3w┘Т┬Б√┴╡╢o7кu RзЮz┌эw▐'s,p┘qЭА?╕j╞МoЬ°н╬|▐мж гя▀ў█w■0cїтюГўНлuзRЫ{┴еgЬq·nЯ ,рHуўo═Щ}┼мysКЯ8ЧM^╡`┴WП>FSTЩэ_QЦxЇсisfбxLчЮz┌е\р╪^6Ып╓ъ?}Ёб3`~У(-О}эКх╟uФ3R▌m╩о╦/Э9Xk,╝¤>ЯУ2Mг7Кb Ш┬▓п"╟hTJиLj╞тNюшщ>щВ│фbvу└Ц?p еKЧЖеЯ╔^?o■й'ЬdWы@vАR▀╕Ўжў6╝?kюЬОO}2╤KT╖╠Эu┼E^(I4╕░╟n═▄т,фъЛgЮЄ▀╩╩Z╡Z╒rЩUWнЮНd6ЁьЪc█Ьpъ╩e╦єЯ:ц╙·▌ЫgЬuц╩╗n╖▀^8┘^x├YчNЫu┘{ЇОв_5|°СщЛаеЭЦ╫oZ0э№┼Лj√яМk∙7┐;я▄ цп╣j╙░Є№= ул_S3щБн[╟Mь╗d╬мХwгg @║o~─н7▄─ELkФM  шgў_╕lВrU^b■Щg_4уB╫v3╣L╣Q ёCўЯ}хЁ│З▐~oЭвъжыь╛чG¤Ф█▒рd2р*М╞сs8BщСcQЭwЎ┤юb╖(ёз]0cї┬+m?Ш╡p[╝fх▓Mяmъ*фЙSЮ3В(▀┘q■E3X8╖ЇЄ╩Ьр╕6ЬBvрIкr╤ь+HЦн ╨Uu╬!_Ъ │яZ~х6╫LхЄч,ЦuШ_╦w╓мY3┤ю¤╔╣No░ Gщ.l)╧╗юz(╠bl▌╝tiн2Т╬д\▀9oщТE^└Лт╠K/G)&5А%8ыЫ▀╝щю{P╣ЦДc3ы9VТJag8И▐кЩЧД╢╧S@З\ВкЮ╖t!;№,Ф=╙и┤i╦#?{ш¤╖╫k▓║v╤т┼═#фк╦/З╔┬D8о│█{|∙шпд'M─╖[bP\?k╢Fеjmт.╗Ю1cFb┴┘№╣ч▀╝jхцў▀ы╚eEЮ;{ёB"qшs┴ s╬Ы1Y╔╕Ц=u╓┼дР┐·┬K ╧ыfт°╔А}сЇт5-ф╣Q(ж/fQы┬Олk.ЯA╣Zэ▌m╩┤Лg░XМИЧOЭ┌╚┼╬┬┐~ўД╛]&▀vщ┬Є╨аЧ╫gпXМJ╠н╛nY √┼НgjЄYчOЧ::q╒йhc`╘M\▐cв4&D█ЫеfмЭ3╧МBI╬Щ}х▄3N█єаO8√LвжЯs╢╬╔Еc┐uВ║╦ф;ц-* ╩]∙є/┐4╓д┘3.╔╙,Z1ч2ЗПe]╗VОс`TjЙД╢}эХKищ >ж`>{┘Т╒sfЩЮ┼╩х8Г╦ЦY53Ч╬Ф╦NАсщщы¤╩W┐ZАЙbєц═╔e╥■`н(лз^4єцUK╝b·┤єж*┘┬uєФ6lЭ4i┬wс╣ю5│ц┴┬т0F,╔╕E /Э)q╝,┬■mdє╣щ3/!мП G├л/├qоМTзL┘ї╗═hZмв╞╓Е ~┘┤s` k╝ЁЭщ▄╕pбУJЭq■╣z▒;ЁAUАС)НL*mG╛╞Й╘q%ОK,h/>Ї░П¤№┌+/ Э]ў┌у╚г┐RЬ8G┌─XТ╫╬Юу╓МФд]>g∙▓U_$j╩╣sп@Тш·+/йWкК${╦Є╥+fУФ╣╠ЛImуц╟|x├█я*КtЄвеKЙпы╓Wп\%VmСу╧[╡$иT╓.\!kъf╗: ъU8Т(┴oЭ5╗╩C╡ъЮYQ5Пє?gъЇ\╠wvts╥qЩ]з▄2w■╨ЁpЬ╤]б▌╞┤м▀╕rХm█└8ax1\ODwї·ЪХл`й├{1$ьг=ў:Єшг╥У'уs-Зmсъ┘ЧЗ~4R-├>:єт ╪ц┬Н╦g^О┐Й└3mAС/\╢UF-╗╠их╢│Ш┌жcжЕБ╛_▌▄ ─O┌Ї╬;╞Пы9ЎЇя^│|iШR/\▓а\/│┼5g╧╚КJ╔1╩о5ха¤?цШ ╗L ├уVЛ`иo[╛в =╪┐98╧Z▓[╒v%iЧ┐╖Єqp0С▄utt└╢ю╨╦п¤k┬вЬ`C)^б0<< 5|Ж+ЯВ xсЕц╧ЯawЄфУO┼~ё┼ |8Hш]KW|√▄єЙп╜·ъ3зЭ╟┬║ЄHLb 0zє╩╒gЬ|{є5╫Ьq╬HvuНсPГ╞┬║o═єHС-(`Pл@нd┼╙YЙ uvI6$\(X─╫РiR0C A4╪К+П.в╚D6S╘k$═XC│a:╢>n╞йiz:▀[Ог))aАзkиЧAМEWЗ╖g╙кH@>╩хr▒з╛ LKTGЇФд BD╤P СЦ0 МСrZ╨ FXB└ЧJ╒╪┌Ик┼ Ъ0вn╓2Z] #ц{(И0╛аыFQИ'УрДa└ BцгZН╦вГ9~ХN7 $ь°ЗОшZєэA3Hї╢╖▐ю┘{o╕тМ╘ХbБМО6wз\R Їs|ынЮ}ЎИ"/Ц(╝╦╤Їй╒IGЖE2G[двёIСНС╨ў`зЬr13тdqщ║ў▄ #╖UG─ОжшаШ╤╞п╓D1Н6T*■Р▀R&ЕbШ|F╖╩MRЙи─ГC:┼sv╜мОыbвAC╞nrох╔Ъ╥29ЕI я-аAОЛжf Ь▓Щ╕К╤Ж?0НФ╣╬<Вцt+бЕцИFi[кп╟к▒(╨.Js!1(╫ДО│╡}л6╛c╛ХР╞ba╧i╦T├їB╙D╖ЮШma╩$oЁyдБю╥ЁvлARhGЙ0ишJ3╖n╤wщcНЇaЇ№zCьщаi9жЦ+ЖfГз"a√╖62Ьээ╓┴┤lн2внo╜┘╗ч>╕HFкl7╠jк#Е1НЕ┌[ofў█З}[%0╚═А<й╒ИЪf{НнНбaЇbqmаЩюHEVT ╛38Дл!/P'p_@=Ьб!%├о3zЕ─$┘GД43▓їн╖{ў┬┤neDnю#ЬраZ╥∙жР(&Б╙ ;В1╔ТИ№░Юv#нжhHФЩ╪╠Ж▓└зшЙ╟ощ─Ч╕МдЫнчдП▓SО9vEЁ)╔░\тs9Шд╥█owь│Т═vаЩv∙{+HзiЪ$Iп┐■zWW╫лп╛ЪфЖВv└Кт║.╘Ё8"├0╞П °уП/Z┤╚ceу╞НА#■∙pРЄqеN╙dUЖЬf╔1G╙ж╞д10ЬююД?Cхt▒╕#* !Й▓▓y3▒╚├▓cЪКв'йZЫОm▓дьЩ╛╤@┐ цЖ▄╘гМ,J┌ЗP╫r╢m┘:a╫]ё└Cx┴█Х2ВvЖaDyМ?  ь└SXО╫ Y`oг╨xцC0Z▄t<жЮmCПй└aЄM'>З╢Ё6╦w┬T┴ц┴гЁЦ*▓8╫╨DW.O▌╪═ьC│аbq(RЧ%~рс$Ў(P.Я·В$╥╤м╨л0фZвйЭс`▄(АБрV╦цАLGQ╦Є&j ЭAUU>╔╧СXй√8м▒ытC╨{СЙ`mб"╪ъV+2 р$Qш ▌ы?Ш╖ф╥K.&Я╪M│ЇTjЬё)▌p QТdОu╛СЇЧЭтФГ Є|19▐фАXтт└рn╘к├[│к╛y▌√w▀yч╣╬Ш|Ё'╤q▐ОqЄ╪сh[кЦJрр╬щкBПЭ7bXн#:╠dP╧+br╝жuWрI╦├▓_p╠ыИeV$дЩbqмЬ └8░Gв %╧чЫу╧ьэLWQ'I√╪FГЦ┌Ъж6╗Ж┬Л╪П`u╪h р░'2└L\| EЯDQВФD3┴P2ъ╪AЫ7Ы>-vTWY┤o╬┤╠p ^╘Hуъ╚·"1l_еlщ╤¤╖2м$╟ NLаЖobТИЎ╔╕"╢JвJmдР═у+Ё╒└R╒ 3ЙуБЫФ`Ц╤3>N∙8d▒,ЪоЭ█м[|T╨│╘ уЖA;ТИШаУ$ишУ. s#& ХY| г╓Hщ)Xьfн&PANе╝Ж!╧А <И[ЬЮыy█╢-={юКr|4E-1[:Щm╧Б?dKШH╘ <9ЦX|К@ВR╦24-8╢└ЙЙНrв╢]Л╩Т@ya4б\╠Тg└TR Я╬Q▒ Ф26g(ОЩє3Г▓А~▀─t=YЦ,▀├ ╘!ЖЫ╬░ ХWo╗·┌sf\╨ё>ЩDh╟╝3A ЙR▓▒═╒zbдkn╨x)rг<3Кcp^;╡:·T\╦ФU5!╨Шn'Б├■┼еБ∙{p ╞<ЗAлЪ╤c┴yє∙ТZ╬ =>ОT╪GО╟Ъъб&БЙ `└ыVC╓╙&╤В╪o┤Yдu╫ cк╔ ▓lМщК-УнгI.;╖I;+I╗№╜ХПГГ╔1ЧNзM╙|фСG^|ёE@БЦe┴аЁvoш"pо├Щnо│'=Ї\|уН7■|8╚R╗!√ tGfT!ю>цАЧ└s;иjТАЭ@"цp└4аВ°┐h╕>вg╙pЗ─"їb▓/├$z╫1eаb@Оy>░,. |єЩд)╓jЮўФ&с |86сEшE╦▓╜Е ∙╩к╬ёpЬЄ╬Йm6ъ-с "KC┬╚X╢$Л4╞СТ$ЕїЧ╟ZРрZL┘ ╩С4пRХ╞ў|шb\2p°г╡84/БГ@№зл╧{─KС├|X─мПИЭЕ√╦3(жЬ▓iА┘*FъЩLО┘╨─Ш&N` ,А jТЗЮ#нЛ └)@о6RRЇФG'└qИ]e!╔mъЩОд3ф╚Йo%MжCQЪ6И-╠mVJzб# ЬR╣| Эўм√хє ·п_8ЇфуФЮqLЕ─53-3▒ 9Rkрь+ИДc└)вЮ│E┼,ї|/▒╦м╓+Е▀so╗сжНo┐╙Э/ЦKЩBёфS┐3~П▌^бf╜╞╦ТвкнИГ╚J┬ ЬЮAфЖВ(2яTх▒G╓d8┘КJT─╒гZНe!Э╔$░ШаH╪V╡j╘ars╣О;БaVEь9╢&кшНk┘Ё|ESТqФeTiьXNр╗)MЗЭБ.ёa;ех1╤#╒М1МvT2─|Nrx╛т┼L╗ОЫъ╞"┬ж░}┤CШw;N╝о││8а╧╨,Ё:e∙ЧCЮ╘H06ЕЩу"ЧrAьъLpЗn)DH`|6]╢j9-k╒к-Эq°░\пЇf;=█2C?Э╩ШЦСБсJ0щч-Ц─ Юd№k╩Е:GНПN} MИ ╫RRЖЙЄ=k╕жww{Jє n├▐Q┤к▐╠Е\Hc▀D%жaМ[j ╒·qМo SDAKZ57КБа┴<╒jе L<╥!T╟ЖЕYH╔iдu(Ы# B3&Н"oц└р╧Є╙Я№┼^√эъЕч╔░БнИ╝8КмБeйА┌б│ЦГR4fс·п╚═┤╣IўCЎTБл7ъ░ё%Uе°ЖPE,Y╒-УFр lШХ|ЎX▐б+OгСуt─vкXї X╔╝╚EЕ R XWI1ЬВГф YсР%├L20"ЎB╗КpЦMЩ4ЮdQД=Зфо╟Ш7&f╫IйгB I)м@аО┌█О)╔Шч╨4lQтэB1▀ўАЗДC(v}^bi╓У¤+b6yHУV│▒Ём╦;M _Т∙=Є<╠Bшx,ї`/ЛЬмл&1uRT┴1┬O│├@т%Мюр4Тмтбe╙иж╘ИD/¤wI╥█е]■ц╩╟┴A@~∙|░а$I'Я|Є·їыGFFА▓Л┼флэ█╖П7j° W:;;л╒кв(CCCя▒?|ў▌wЯ■∙?Ш ╨с Уr┬ВЄм╨( `b№╬╢0Р▐ЁlHTыЄ AвY;A╩┼г░,DT√З└┼ )╞v╞Ў{;уи *Я─uМЫЬ│ `Ф8\╙╠ъЩD=╩f,Q FА╘t& NFБр(5▐лЪН┤ог─! Ч`*╦мiЩl@Bl О!│HП╪=г%▒еZYбGK╘pl uKF╡Ч└╡(·Аь ОЪ2>┌▄{р#xs,D$є.╫Q═M}ьЧ#аЇ1х3 ▒@╟╩9├.Jd!ЮсH,8│d6V\"ВМ`НBСЁсИМЗbУAЖКh8гp)─C]╞J!Ъ#`Їа$MмiY"╗[╗ZЪMзQS└щЖбхЁZ0 Zk╕Ц jQг╞┴╬Ви├1O}╘\F\b╥┼╗vГд╥Ж╫( i╫j╛AУ ┬K1┬-┐^ЙЛy;▓3аЩ╚Gёuф█NF╒-╙╘┤4jtЭ┤╦57q И╦╚%║╕▒QБ¤Ы%*▒Аощ_BU ┘stYI2ЎV#W┴T@\┬╠╕Б├Й░гc A <%NVH"5ф║QжeНП[яНЩ&Ч¤см╨Цx·аБё3L╛ЛYt╞ы┐aўLМЫ"КСєQ ╦о╤└╤QTDН,LRв╤─═тKЖы$цхбtG╨╦qY бж╚╛хКК╕ЮаH╢HQbF1Т└ШКд%<╞ э.╟╦Vм i╓S╪Ў╤b╣╬%ДV@%\█БZU╡h∙5ББ+ =╩є"ZїДqМB$ъЗо ╚Ё-, ЩiLh X Б╟МєбЄ╚l7ўiт6|'╩0с∙@IGQ╞▓G╔╖╦WЗ¤ЫJ╙ЦА6╤fMMgС61╩├11▀ь2ю#ш┐У╚НХFЮ╦ЙbBйАь╫G:2!L╚$0╦Gш5К№ е╩M<Ч№Cг"├▒RJК╢с`╗№╜ХПГГА╛*ХJ_╥ o┌┤iп╜Ў*Ч╦Ъж▄w▀}_~∙х╧|ц3п╝Є |Ж+щtz```╫]w}чЭw>¤щO├пю┐ ■ёу╟?Ў╪cМT╠E╠dDjэл╓A'p*╒ЎrMсDФ╪КEжe╜TR║K|╙╢▓ж╥-C2k[<@┤Є┬3░:Rющщ┘ё|Lо└вОв7╠жъj┘╬V┬═╕т&ДКYвЇАЧ1}кe{@6tЙнчZНСg.Шp°Й─╕t╟vEM_uН╨єєTт$vдE─СYnВAВх░E╡a @С)n▒■<Ь╝Сa5оe4Хg"Бx\ >Є╢яТтXFZС\├тHKщ▓уЦ═Z+{яG└AyQHTs~╘╦╡о╬"№▐%┤ь╞ТPГьШh│╪┤Ч├#═ў}YbЗ\¤пUл0┐Ь┘qР╚Nч╝]7rй|в─(▐Й2жж)\hI1vШIQxжTUUЮ ╠B─╟F╕E{q!` ЯХ╖зЄY9Хhаих╪╝$ЄЬ╨RЛ'~Е═■╞, Jт=╙ВзJj╦*О6э╨ёf/rМЬФ╝╞шЮMF5_ФЦЙfОєL3М"╛┬є:nов$∙ID|╣╧ РI`ы═ЦLхп$бН ╛'░Ё▐ЄЎ┴ёZ╤d╨░LЁ ▄к@4]═2L╤ьFKл;jD╪&чjИЄьРЛ▀УR*╟t╠A╒─@ФЪМ└Zл[К$╨м╗FзЮе-│└Ч ╫H▒00nАКP∙ПIb8█rTU∙┘аг:Sощ·CZъцШAgЮўMCDї}s┌же▓35╞NХGМJO =▒j╛-Kjй<╘Ыяа4ъдШA/Ж╕0O╓їDЛ║╩r%Э/Жо╦ЛqQК'bkЫ╞{I{l├Ф▓║Б√7T пгфяЬk.я┼F╫CMёАY═er─r4╢┬ЦuIг╤`о▀▒ф╔"я9ои╦cM6)DЮПы▀uф┤О╩S │Ш└h№>┤╢╨Х0N$┬ш{>ЗТV╝!░AWбЮыJвцFaП╚кe█╨;%н├n`:┌┤ДcФї)-Щ¤ЖcgЧС╫л╒|G▐w|Qc9П У╘▐╤╥Х( █╚dPFl▓юdb▄ хq▀╒=АЖ█═Zч°юd╣Е╔Ё╕є}ц хан 3тмЩтrЇЛftмс(Ъ─Бiйlvt╕(*и-E╙ВўюX└╪~фal╙2 4M`"Ёd╫Оы}аyш:i5Э└ыИH╕жї(u [√╖ЙЎтV Y"╧Л1рQR |╝хX*╨У ;UXв?├┼ @}╦Тa▒qВ┼К¤Г▒у╓UЪ╜RS╟╘.эЄўT>zЮаИWW╫п~їл)SжЖqйTЪ4i╥kп╜Ў┼/~а▐G▀┬ХН7 |¤ї╫с╢Г>P# ┼ббб▀■Ў╖дM"ьzp╛┌б├ x┤"╙ўЕ!$▀ўД╚ ФDэ░xаФR▄:HуХ╕▒╝]nр┴п5╔T╒4sz╢iЗ╩О6eД18`T╤B▓e░В27Ю╪y─╧vн┤вEбпlu}J5т╕─ш0F┐О =%╢дOиЁАч├A*6г ═p-рьU▀ёD]u┘U┴vy╩(Й@- f3ж0л╟╪qm8╬╥*2─о/JBО╙╪yМD┬(5┤}ё#вqЧ&а┌!R/Фv$fСIф- С╔x>·L╕%ё╢ы▄Lе╔`AORеdx}?"HTeг¤;ъu╨\ ниЖїj╩9GУмх!#\БJРчM/°СШ°УEq\╕яЛ/hй─┌▀ї"YRJ,+T3|┬aу┴n√h │CCA╨▄Ь`<6tМиж БтhBдP:D$pЭвъА$GL═R│mиfА╧ЁЭ@╘леQ*ЕGn╘д┌ЄЬ(Р9fSИj─└Ч╣-ZР()ыдэp║bpбх:]КNЫjtTyя─иmo∙M'N-;M>cykЯI%0+>bрХЫДУ4ЙаEФч▀ТgАОЮ2бК,(^/╪V#ек1НG"Wт╨D1░M╞^╞ьv└Ч%▀╥EMdH /М зИ ╙╠ыzsUєд╕RрgЦи)ex юЙБўm`фdЕMЯ дЪxНр№2┘R"═кШFЪЕ7JTБ┴╩з╠$Ъ╔лР%К%ОКШ(Ї)S%┐AБaCYГтФQХ0@║!ИЙt╡╧I@╘╬тFwуH+Sz6т;dv@ЬАmHЬMЄзг ╗.гRЙ╖XSSh.Fz└ё^УUє▄шЯ┴├╙в┤А¤╡]ORдQй!.л#.щ,З;4═,Ак█б╧─∙MЦ)М|xЪ─ёСч3¤,кoАHyь╢d╕т BуgЧ ┘МЦя╦ьf`дUчи╣ь|Кh▐з┼╥#сяc║Cv█┬ЭдщS╚у:фt╔!▒с9ш╚Х░╡aмЁ└в·З6А~р&DЮн■цЮE▄F╖DЭСp║Ы┼]ЩGщt[U▄.wе▐°h8`x)R╚<▀Ь╨7aы└V└└rРH№ОбN>ST,╕Эу║ц╬Ю│d╔/BфЁГ{я█w▀╜я┐ ■∙ ╨u█▐щ╫√╥+/╞¤─БЯ@C8cЎВчЦJ%MW№╨╦f▓(} |bЪчў╫▐ўc8,O>Ўыw?╬К│╚╖Юя╣¤юW╛q█ўя#в|╥сG▄є╩KFйA0╕yУ,Ё┼BОш╠┬з╘ч%╗╣sm ▒$Ь╦╢LY╓┬D┌чбК└tH┐bЄoЯ=фё_@уB8]ц`╟ШIRЛЭ╚у║dА,)╩X├С:╔б┤╣q│╧шъ┬и(Ш\лбёЫщ]D╗5G╬c&=Ы)7kЎ╚x5╫иVхФЖ■(ДФ#Е4F^0░#H▓щШ9%Еz ▓(г°"╧'∙]Шqв`ПeгfSI╥╥╝oвlОчъыпч║:+█╖ц?q╩]<_P3╡║YdJ╪j╣жeUm╟╤(з╤из╥Y+t^цЪ:h╠▌┴╖дqaKK├ZИT9hIщhKB9К╕fга5*▄ї/гfZI┼НAЯ №rЙС°N@wlє┤ж╣╥(@l╜¤Еє+yиYv║э├е╒6╢gН>Ёe4ц∙╔=дхЄ╥J1=dаvЦСЦ4sЁ$?█e·Бo╚Шnr╔RGД┴■_n▌ПДи∙УИ4-3Ъ-;t\єС;·Ф╪hОZАНj│Gяр[+aT~╠'Цc·8vF╞Ўzь;#ёШї}╘=;╜qФ РОс╬"c╪Ъц╪c~з▀щЖиi╡╢СР1ыЗМY┤ь:Ч@О─·Х=3эь╪▌1╢МЭй╢Цг▀╘hLcvZъcvшО√╥Dpг3=╩О■j╠╛mє&Л}√╤S3╢ ё╛№ш~\▀?4■╔їДНЙТ╡┌lR▄44КG═Rvn╒ОkqkmМ~O?8Ыд╡ътfЬАў╜]┌хяа╘Н?Ж:У2░iєж╔'?ї Жб6БЧ╬чV,╦* Юч╢пk╦ЛП?■°╥х╦ ╫ Єь│итg~∙╦▀xл╖зўеЧ^ОcДPЙI1hНоы├├Г┘|F8UQг*z.)Uо]║№▄ЛЙу▐|¤їg╠╗Н%aд4Xшъ┌Ў╬╗w_╡ц╥┘sЙ▄╕h╔╘ЫoAcч08я█'╒GЖя└\aшєт░e)Z e5оСЧ╒Є╢■оюn Бa Щ\йfдєйс▓╤SLб4 I▌║b┘i╙╬ОEЙжt7▒╫G╣#I┬╞╕hП3\ц^t╖oХ'Ї\t·i#om╕¤Й'с▓_)Зй╝PР+^мIhъ,Gф¤╫^▀хА1И рJХ7╤щ е x ;Й3BЕЭ┘YvВEu9╙Ф80нТ.A п.q^C╘ыЪЦЕz:m┼и;9!1╢Л├X\kдоe СН№k─<4у╦в║hуИ^cu╤oА╪!QD╞ю╞Н7-]&У°═╖ xэ}▀#у:И T╨еCЦ╩Э]EшмGБ-П0╫GшGяD╧KSАбй532k╔о╕QУ8б ПFёL╗n╫э║]╖ыv▌о ju╜a|▄╖Qф▓ЕШДЫ6їOЮ4ёйзЯСe,Щf├ў├TJ CА>`║┤к╟v$ётc ЪЮ8р аж_&ppыцў╞ўЎ╛№┬K?q└'р7 T$╣\.зRй8Uj4jщ╬N┤Ї ▄3√т┌G'ж3чМйєя╕∙ЎМЖat0┼)_9·╬[n%Щ№G|e┴ў~ш║╛ХC▌w╬<щДе?╕'МЬHKYh!.г-гГШ╬3ъR^!Фn■├█1╓1Н}ЧbP=@Й&=ЕГьU\┬k№░6э╥.э╥.э╥.эЄл■зр`*Ч╚▒eS▀фЙ╧>ЕpРу╕p0Э╓╖oъююtпZлщЩ4/HЙt╨umО#O?√\Тдn╤В+щрЖН]╜╜п╜Ё2<юа?A#╩"─В ╕╢-+2 С*╣VC╬дJы╓e\ы╝йg▐°├╟?їШo▐ ╥╫ шх┐^zab╢у▄│ж▐yчэ╘▓gЯ6mс▀'╣жlз1═K┐Є╒e?ўo░┴д┤kП=╤▄xд*t4и6ЖR{M"║D,gєр░ лу'яВ╢╠├C"Н▄╥ Ci╥┤жQU┬гЭ╕Гс╥"┴rЖ7m\ШWUОУлC┤п(wuXД╡┴Е ~ц═?║┐№З╫Л}мC═h/╞╩ю¤ў&M9¤░/▀ЄГТ└╖╒кHz>q!АэRЭ╧чИОк-=▀╘иТнямSEй╨╤╣eєж\1Wi╘'L┘¤#1·л4╕eKw║Иi▌9tЁл╛■╟lw▌╜пZ╩х╗ау¤╧╝0a╧)dRзmФ▐█┤aў}Ўx{▌█√э╜╖c█бm╫З*╜уz\╫5L╦ гq'Єш Z╒xSЫ╪ц▒Я√Ч√_{ `0US>цыр╝AжЙМ╘Нъp(G╧з{&`╚lлбНЗЖ_╥BGO╥─в║ЕpTmй^■Д╖]┌е]┌е]┌е]■ЛГpЁгKEZ.зЎ└ж═у'O|са№Ы▀№&Ч╦IА▄\╫ў}├0К┼тn{эY ,*a╬тХ╦Ц┘6цN°хє╧ё$~ЎАГ шЎ Ы╗{{_}ёe╤Г<не9О╞,Ъв┼їбэЪк )Н°ю╜╫▌P ¤ы~гfйт.жм{ё╖√ю╖▀&┐1¤┌Х─2╓^│ж#ЦЮyЄ╔№┬!F╣╛?0n№фmКt■m7╗JTeцg┐╕tхъkя╕╔UХFLO:ё;╗°Пhf аNфg¤u>tп╕zс@}d┘ЪыSЭЦ\w├ ╠░$╝т┤яИqh╓j╦ю╛├}▒tAф в@jUoдq▌▓Н┴╥дBч)зM[=n╣S^tчї├V╜3SШ╢▀goX{╟═k╫Ш$(Чъ Ї#"Fqix┴Ь9╞`Y4╝)╜0Ш"цvЫ№Х┐Х▀ГH╙'2╦┼7%fq╙жЕЕ╤ъK.√╒╦/▌ў°ує╬;OOы1╧M=mjz╥~,▒3єтЛ╫= лЯ>є╤b╣wL┐x¤Ў-ЛЮ°!мvP ¤╜Kf╜Ў┌+лn╛╞К▌yp¤√ы2Щ╠еWп&##+f]nЦыєц^yыї7m╬wuЬ}ё┼$Ч╟К╥иiIlw▐╫┐z═¤?&Fм-Х*]╤╓pkЙ8╓ўo╛qа▓5╕┐sF▀з?╒МЮЧ`╛Р╣BЁнМa;I█X░]┌е]┌е]┌хoжXж▄▓isK:(Яzъйшk╝╡_$@tОчМ7■{?·AГє8xэ╥e ╙ўь ╧qД> 4ГГ[7nщщы}ё┼ЧQY|р┴qDУ@3╟yЮ# l.─, vжзлЄ╗ ╩ўM9 _¤ЫЧЙд.°З╜т╤GIW]·}гОlнмЩ6u·o'оsч gЮr╙ндлHRСBR._∙╒oMъю>хоЫQ*й ╧┐xЎЕ│HW'╤ВЄ{я╗&Э¤╣╧фvЯx└┐r№┘ч▓шж№╨╢m]]]L_Т┴mчЮq·╡<╫C╟жZЪLуy╡7▐XqїъЕ╖▄Ж@╟П~zцyп╛ё╗пэъ5╙(Yv·щч^4C=ш@в╚Ш╘8Bзыo■sw¤шдwє+Х╨╡с█╗стЛз-ШCzЛD +/Ъy╥Щguя┐_╨и yЦ^,1╓ї@ha┴─!Аo]Л█u╗n╫э║]╖ыv¤╫оїzТАє├uG∙l."ёцНЫ&MЮ№ЇSOIК асЁ#■═6-М╣ц√ь╖я-ko╢C▀с>ё╪(Ю{■Ч<└┴gЮ[8}╦цЮ▐▐_zА 4ГЙАу8Тqд<,Л|OwЧe6╖O┘e2┘^"ы╢\w∙хч\┐Ё╨кoOЯq¤Mд7OЄ╠3x├fRПЦLЯv┘]╫С\v╤ЧОЭuяПИHЗДаkЯ╔$Ї/?фИ┼=BtЪu>[кЎ)З}ї{╧№ВyD{5o╬╫ПЫ Ё├$ L█ў1ЫGoМfАлSQ¤√>▀/Яa▓.гЫ`bP{ю┤│о№▐нhъ¤[3JКЁщєП8№ъЧЯ(U╢utwЧ╠:фиE?·!ЩШЄlC▓°щ▀№ў5П=Шб uєвуO\∙уЯ^┬4а▓`∙N,+╨ ╡└QЄпYШК╤Ї╙=ЇЦ'Яl╞Ж╩еK╛uтЄЯ■└щeI9■╙Я ╤S╧▓11ш9Я?d═·ЧъДдk╟еаa╙┐t°ЪЯ├$Ю fГ└~╒кh┼ш║зy╠нП=═# ГLш└7єЇ3Цо╜╤в8 4КY√.:ю╪Х?╛є╕xШcГ°┌сЕЗ╣·╢█HJ$╒эЮkУ\чyЧ═Ъ╖xaў╗yОS3Н╬ою│Y3єAЖ5cЪф%qТрп╜Ї█u╗n╫э║]╖ыvЭ╘ ыO┬AЭ┴┴-Ы&їM~·YДГpъ/yФх╪╗LЮr√Эw╝ї╟7w▌}╟wAxЄ▒╟W-[n[О@°чЯ¤%Gщ│╧<╖h■B║n`coOяЛ/┐aъO`bДГш|кк▓я╪AшеdE╝°sNЯ╢_(оє·┴{HВh¤z¤nУw};j╠╜я.└╫Э{!ў■P╡Z╔¤╙▐¤¤ЫЄ├v6Sм23я║╔ч╤5uть{я%nЕМя┬8eб0єШo-╜я√6WWuЩ╘├щ_°╥ЪGЯ$ЕОD^ЕV{Iь0#&У┤■э;№о'Cу=№5┴(м∙П╧■╙╜/¤ВдX6^╕s{увOX∙ЛЙ╩╣Ж% ┌╠CОZ ░iЧмK"┘вчqЇ╡П¤Мx&*Э#Єэ■▄]╧╛А └Sg╞╨┼░у╝DУи/IМ7ЬЦVYO йЩgє°ы°)f┌3ъ$У&Q4у░/оzцс*o*кv╤1'\w├MдР╟Р{еhї┘зЮї─]Ї╞ (еx┘╫┐╣ф▒╟ЛГpгyGh╟g~∙╪╡▀√>Iep 8 █u╘сЗ?·╥sФ │єЪ╨ИУ¤┬▌┐№С╣╪uиЪ┼V║ф╠╧║ч─ Щм║н:Pшщ)┘$е+п╗.r,.нAo,Л%*ИIS=LiУ,Й°╩X■ъЛ┐]╖ыv▌о█u╗n╫X╫э╞╟}EaN╧╟$┌┤uєф▐IO=ў┤,KжiН╫]йTП?■╕xp√Ўm√я└√я┐з╔К─гtp┼▓хЮуrФ{■ДГ╧=¤▄ВE щ╞Бї╜=}/╜·КE√юw`LБGe│чyВ╚ЙhF╤єыjШpП{▐_╝ц┼'т\r╪q╦|ИДu╥ЭG`PмЮєеCп√═╙$p/№╥╫V °Т╔8NЭ+д$тЯ{Ёо╜эv▓ў$╠ еi#╖п╣h■▄;n!i#&йGЧ~∙╪eO<ГВ:?D╜эипkU╒3П?~э╧┴└жкД1Qр·pэЎ┼ О┐p*═hZоГ╘]Єцжy│.Эў°(▀єBb¤╙+_|&LгО7╔╖ ╧gяzэ '╠a■ї3=№ц╟~БB╕b╞Ўw7ь╣ўЮheчвщаK14K╪╥╙c№ Ш`Т]Ц=э╕C>s╫Э╖лSжР·╔ч╚ЎБk/Ы}юmkкВй*·╖∙╥}O№уьX.∙э╞ЕW╬╝фЕj$ъДО ╒ЙР9чKG\ў╠SD11ЖжрЩ■ЪШцЩ╟|sэўА3▓J8Z^ўю═w▐~ё▄┘4пbВ^│P}чИ├юxтQВ_▓*╡СJ.]Ьw╓╘│N9y▄?@0,74]▀№Я┐Я°йМ═:═eмZU╦·╫нПВp╥Ю{╟&Ёh├2d ·КNїэ║]╖ыv▌о█u╗NъЖi▓╠R▄Nu╡ROgЇ|║шЖЎЁP╣{\ч╦/╜ ╫C└H║Я╞Dд└ёЮ■∙┼ █Aш╫ы╓ныяя эo?ё┌┐с═╛ ^~∙╒РrxP@(°8ж╛яє<┼ФCШ√;8к*Т@╕Ёў u▌ k╬╗iХe╖_╢фЬе╦IFКyLирl┌жэ╬eЛNY1╗n6юЬ╖ь▄елЙaСq∙▓3Bk╡∙GЯЇOЇе3O╥&ЎV\яъ%лЧ-┐ЙTKQзЗя ~╘Є╡╖Жz*р}тф╪ j╡Zо│8№Ў█:┤┬╡╓\}╒%│.є8)еЇД ─▓lm█║·Цы╛;їL╖┌ш╥ ╫Эw┘@ihё?A6GЬ s╛~ъЄ;oлwЙЩq]■6^~■Е+╛w╔g╚╚Сх[о\r·)зТBa╕4иNшЭ1▐5╫▌┤n▌{√я║kгjj=СF-8(1@О╩ы(■╞?¤є┴√я7ыКY гСю,\x╓┤╒7▌JЄjмsГ╡бЗW▌·/Я°З {юбI╩╧ц^ї┌╗o{ч╥]Ў┘?g║Ф╩фwя╠_╝фВ╒╦┼О╝ы;┘оО░^у QL,p·С_щэ7w╬<╟ў╘Отesц,\╛Ья╚4▄Ў■▌uВz}┼КE╬║Dш*4ъы▌Е▐+Wеtv╞Й'╠_4g─с▀ЫЫr┴┤єо║у6ВйZ█ЗзOЯ╬~ї╩UЩ╛Й╚cp─єlIUУЕєЧ┘║╢K╗┤K╗┤K╗┤╦ че^л}фuQUMлV*║оo▌║uЄФ)>Ё@.Чс├7s1u 'Х╩№№СG╫\{mihШ(ъoЮ@┼УO?╡р`щЭ?{{ є@Ф№ Ё╔a$З∙Э(х9ОвПq─СH8YQI_ё╒o,X{#щ╨ уЫ_┐ўЮ√JPЯфR─ёбm+П?хв9│╚УO=■Ы╖_s#╔ЙиО#:┴w┐╙5h]v√эwм^Є┌·wх\ёЪХ╫РXEUйУ╪╗ш░гwящ Ta╗QчїЇ╠+ц*╜░Б┼Ygjq▄█Q°├ыпзєY;т:зL■ю∙чg╞wУ╪&о█Ўв+ч ╢_ф┤╙ч-Э}▄▒ Я¤┘·бН=у'Яs┌w>%ўР Ьz├ hьЄ╙╬еО√^i█MП<Ап╘ИЦ]tъwЙ P]k╚тE ццЄ▌съ█Ж▓Э▌M╚СжБ №▓дА╖m_4s╓м┼ o╜jХa[█JГ╦╛/ %RлРЙQф╙M#w▀┤╢lеM¤Лo╛wэ┼╙ X о]Щ фx¤цым░сvиы╦█╘Фz╒UлRШ`>&ЖMy┌╫╛q├П▓№┬Лj ├еdхwЮлХлYнcю╘єГ┴б▌'Ў┘f▌$▐0ё∙|v╤КХT╘1ЯjГ╠?ў╠acxЄф)ХўK o┐76jдXИ5Ъ╔M?∙ф╛ю▐Kg╬DWe┬▓┘╩ю╨╡LYe:ўviЧviЧviЧv∙(^гёС╫ ├(tu╣ж)g│хн[Лу╟?їшгУ'O▐╢m█ЗoО1gЖдеSO>Ў°Х пtъЬ√╧=■D>ЯЇ▒╟,Y@я╝Ыъщ¤їK/ДФЁ╔OЕr|Ащn┼ц3B╠* в╬ТБ.;хЇKo║БиЇЇO║х╬яУЪA:2Бя вD▐╒╙gЬ┐ц"·3жO]u├Z└PЁJе+3b╘ ЪКЙ5K$лС|УрrhыцVjЄx╓У\Fф}b┴;%┼m/зg<▒ xи╗┼╠Щ4 CMx╔2+╢])vHТэ╝T┼ЬnbъТcОZ■ш╜b╞$%ДяЎ╦у'!О]ЫJ)▓}РL@ЕэЁЦMЭ]у╨╧╚s─╢H!cЖЮ└ыОcge╡╥АТh тИFM}.fIс╬>ъ╚ыQ]&ЙC░ST!╛хd▀ўeАЖЖE Я┐еD:raA╢ыуд FД№╠┴╙ ТЩ@ф;жи╚°ЁZ¤kЗ∙└є/zн`lJИв░ьд"l`в┐JC╪PПd4┬ GavМ═├йtОh"й┴ы╨ЗT]| ╦╫ b█н╫НlWС╘┤╢d!╗ЙLУo7Vф$Ё▀В╜D╗n╫э║]╖ыv¤ ў┌оZQТ.єГ╡оjеСrG╦Cf╕е╩╚;o╛U7НМЮ·Ё¤!х\О┌Оєц 8wЎхqшfxх╣ЧEQxЄЙ'ц/╛Т╓╓o╩ЇЎ╝Є┬ЛА|Ў ф?ЖА%)аyуц?Юв│Д*a°╥oТвОSsФt╠'Вйщ Ц,8НнвXP0├╗+ ЄБтЫ~БКЙ╛╥М1▄p5ь╩в'kHёy▓a▓╗╨&|ш┴+b╛yhАJ1W3aё\аt&%Ыp^дh,DБ│~л`шчСя$Ы╢]w▌5чм╜ЪффRdЛ!Ч UЛЗ╣ODlГC7eL└ Й&╪qИ&;я╬ о Y╩sv$\ RЎJ─b═╘М╥ц-│/╗№·k╫Ё}╜д╞ly!1╡═~бG8ЧШ.Ф2gdJъ"й·qЧH9cя0#HКN╨*QpXс│yRнЮsтwо╗х╥╤Б?╞<єЬe7┤T║<`uЯnD0ХЮLXJ:тZ X┬K+,╤╜JJ▌у;р╜ОGDХlq▓yEd╕7нт·pm4MДё7}ДЪ\╙Хфп╛°█u╗n╫э║]╖ыvНuн·>┼1уМTлS&хр╪┐¤╓Я№чo~ ╤┤- °б√ЮЁi═ёЭЄр╨Уў▌kz 8юЯц╫4~¤л╫,ЬO6 МЫ╨є┬╦п┌!┘ыА=╩YКxД├ВДх▒хyЖc╥I0.J)$КNLц╦a╗д ╗A║╙qв!`ТwЫAД■▄НIЁJ╒ЧEQ╒IТoеР,Л√╓3∙ЩМг╗0)√Dg▒PЖэ];Um*З`eg!▒)╛=═ak╖a/Ь6#┼K╝"?оЇo╗эБя╣nш├▓=><Ф1П[╜N┤ )├CЬ(пpоGтк╤╫Ст8▓нц|дзx;а║ЮhЁ:ЧIH9S(Ф╣Ти<9у█чd╙╣■■■vW╚╝П hП]3CЇT+ёИ░$В65j,░_D2QP О╔яPъG╚;яю╡{7 ┌RmсЬ╣(7 ге╦Ч┼▓ьЄ\┼sКуЯa5▀"< щ°!┘тzБ,ё*└?bФ╚°:╗└(╜│е1iRz╕tш╤ИЕbD &eЫ▒GO │:│╔EwОuРM ▀Г╢K╗┤K╗┤K╗┤╦_╜8╬G_зeEЭ 7╚┐ √╔o╜∙ЗT:+К╝уxvI iфF║╗├3╠мк>■рГ}┼╠ ∙ЖE┐xьчШдю¤█√·║_№їЖчM╪}╧кэxЬp│l■·╗■-У·z_·▌Ы%█═NЪ╝eдjzQqDРг8)х)сq1─Q"еjJ( ЩI)ЖуКФ#^а>v}MСу0Ф$▒f╘R▌┼эеr!SlФ+╗М╖e├√╜у:╟▒,'Х╦GК╥?\ю▀[йЦх ╥8NДY╜рxQ├єеt┌r(]┼Bup0п╔\д4eдV╒s┼-есLW╖щ╗Ф °0ф,OР%7е4,│'U░╦ївЪ*UkB>]│═|:у╟Q╔5*Ў╔╣Zй"eu█u<╦ю╠f%/[Vхrг"ф│жяїЎМ█ЁЎ╞.9Ы╧f+N-БГ0Q Тt 'Ч═┬YоуA║Р│}пn╒╒Мъ█Ж ╙bGIТxJFъ5к╔Т"F <пo№°■■~└ЗВ$єТц√БmЬ╒=╧дШ╔dМF╜+W( nЗW└├=Сп∙nЬ╥dk)▐)+Ц╙йзxО╓L#Ji╧ч▐7№"04▐:░й│oЬыЪ▒э)К"Hвa;в$╒jНоОN╫░тЫ гШ╧ ТT╖ мккЦCу ~ч н─ЕХЬ┘ └З╤ыЙp3сX╗ oiХЦМ3N╛є└ц▌╔_\э°ъcгcfяaэ М;ВQ╚сь-\"╪Ы▀■OП$кїу╓╦wt╜uZ┴Ж$nzB!ПИ├╪j╒╪Я┤Ф╔╧w╛ tА¤ xQМ"Р0 Ё┐Эо'O`Пko5█┘jО·ш=ьel.iЄ▐дU√└ьXУo Ы¤ц3у1эП╞ЎВ]bw┤жг№%Yoнq°o~╩╠*BьоКЭ╗<:Ю═v№9═√ ▓├Эm╟У┘и╖П╛Эн┬d╕ЪГЎБ▒j▌▓улd1я86╞Ф_г═П]-;=vз'D┤y7ьФ▒√и5л\єЗ4;√c·╡уё└╙КУ║г╡Qsг▒mцт¤]Q;5;∙yЄЛ╤█╞v▒╒ЖЛД√╨$ e¤ X>8E }∙Ы"цAiўўO╧q│┘м,╦├├├]]][╢l╔хrp= ├П╕Ы╞╛og▓ В╚2иe╝ё┬ЛЗ}·S=щЇ/√∙▓∙W╥uЫ▐Ы0qЧg_■э`@х╜ў[7Tq═(Ы╩╗╢ч·О╟ЩTю#аQ▄Z-ле╝00+y^@YЫ,Иsт ь▀╝q╖]v5лuMWC╪ вш┼жXЦdанz(е╨Ї #]b╝k╫uUYT┤zГ$Iq╝ FwЇe8(ЛВ*+╛m┴юMМ"Ы╗Ъ░h:ь"oб─чpo=*Т╦ъ6Їч: ^рsQX(Жл%t@!$неc?6╩╒▐bWehдX╚ХХмKЬ/P╦┤Sj^Одию││Р[М█P@Ы jъA┐К}`{IД/в╨ЄгАVЮО Ч┤tZаЬmV;;ЛДгХj=Мyg╒╥░жi╜}Э¤[Жd1╨x>Є8UK╫ Ч╫╡╟ hиЄ\O>я Чмzн╖пя¤┴mjOз∙AЄСC╘╦ ЮB╨ыИrb:╜a╦цT:Э╔ж\+ZvRфMы)╫r╥щ┤я"'╓╩╡┤ж'ebL┌╟dЯУx&ў!"°W+░BА9)rnгc4▒л╕u╦FE▄ 4m╥о╗o┘>,Jку{0)<ЙEйbоnгVПB_Sa^< EТSйФap╠гm9┼b'░7╒rЙ▄╬b╛Z7`FDYБ]Tлp3L.мLQАyцrЩЇ√я┐?▒o<▐жg╖ЦcY▄eтДЄ{Ы;s╣!│╞л2,?Nj/Кx▐K+ГхRwоS$█1 ч╞Ув▌└x╬v}X ^Lе╘Б■нЭ╣F╡чцП[Д■ z=╣|Сw ЕJ╒ ЦmC5·╝[╖n4dШкjйt6VW/WP┘j╡*┼З┴BУ▌WKз2IЁяh_xў∙>;╕┐Ю√ь 5 п√#Ж@BЁ╪▀В\qK8]HВ┬ц е╙щ ▐п  A p║ЁS╨ж¤х¤!щ■T▐═Є╩КцrёКкЪHyТйХ>zэ╒KO:▒^ф╫╜Є╥ТEєИ▌╗╖0lєЯ╛)є^gX╦эEK!l y8а─ц(Mо ┼ GU5%@╣рЪу░.▓вБ9ФpxЮ/цsЛO?уЎў▀Hо;█┘·┼W╗╜╤Шbъ╔╪О)Й^xЖ╫║бЪЖM3дe:╝└ХKUК&р╖╚Х8ОE╙lнVЕb@ХС}b-<·kW {У╪ █чSтOЁ┤EЯ9╒╚чє^ЯшртXРрZ╡J 8X!═|▒H)hpCs╧Ю▐X(╠ LUлС<СЧЛе╓╪╪R═+╣dahsгнг\оЙzФЪCR( R)5[╚PWнYЕB│В╧╡Qн╔СP@╤,PдbQXxЎzщDo┴EcpДВ╘╒EлкхёPХК ╩тёRЙОРhg▌ДFtр╧;Ry┌ыSy╩тТ▌)JUil·j╦'`З2r58и%#W8╖═cmD[хь-oQХz│@│▓рvYЖЮьэ9|TКбjХRUХ╒а7fТ"аЗС`фЁ╔R√ж▌■╪aаq╗F╡Фь,е║#~╤ЁВj╟ЪeНvЙ┴гCзп╩eРe╦╠,╦+AEYr╪Чw╗∙/┐° №N,ыM$=ЇР╬юp@8(QЦ▒їып└█ё█╢яМ╞ыЖYкФa@┬_98QХp(P*┼б[║%ЯN:уф3Щ├Н╣TR┴фРЙtjфР&аРeAo┼╨EТ╔Ў&Г> ПW?└№u>q╧╬6Зb}бt*п\▌+ ДеєXA╝┴`g"[╤С▄Хr▒9(9ЦЙД█┌;}■ вш|б@тРRИF ,О$ ]ЭЁf8t3RE╫3f ╣Ё╩╩┘№╨Hlч╖;@Мr╒▓╖еоfрoШ5╒cQ4Ж0Пd J╓ ЦsЧк▓cА1&|n╢}╫╙уn ;`TбT╒ к╣%Ц╔Ua,C&·ч]ё(&M╝Щ╒Ц5їMXЦв┼№>еT∙ьу-+─ыEПo л╡Юt▓y@kWoO<^Я╦▄n╔ O▒ ┘B,ZзщК╟/VХ▓бЫ K34KR@q┤в╓ЪЫд┐|╒Y_╫Р═eр╙2№╛@M7а&M╦с]lW{З╧+E├╦0АuL▌н пOD°Яюю^О▓=Д^╚&=№ш\Yы═8╖┤8х╗vўTK∙║h║░ш ╚*№ сЎ<АtЁе╩0\ЯЗ)wикn$жL┬╔чЛ°{Иф9VУe4Сц<~!Щ,·¤╛Z╣шX┬Tбb-╦Д┬Щ|EAp{Ip_Н"mS╓ўь╪▐kИЕr┼эб В╫ ▀██ЎЕz;┌ ▌i4АЄHM_@9╗zsО0iA┴Б╢DЦ╦U░.}о5О=|Ї╖·М╒!CЫ╢~│гбб>▌╜{р╡Ё'╦▓ К∙dЧ─УЭ;vP╚МДcЇ═╫7РkР:a┌ ЕФJ~ ╛M]]@ХЛT# ░ аИT~╡жrпщ&ЖxU9╩│j<$ЖOГ¤2Л─б├°dw╫└╞╞─ЮОЦXьлo┐|╚Б]Й^ u┴ОЭ╗m]ЛЕCхb j`█Оэ ═-#G╘▐УЁЖUO^tю╪>░uА[Т:╗{ PоъY/╞ T(?╕ЪM┘fG╨RРn▌№бэ Ц╝2 IАop└·ъЩ-┬╩є7vР╫uRФUЩ2╢tfпрЩ¤З~╖щjvMй┬√кVs ю░5▌єз э Ю6╕╓ЁiZp╕┤°╥0Ё╒▌?╝? T▐ ╦х$СЪН╓╢М▓d)╜Є╥%╟ J╨Ф╧6┐╗d╔<вm╫7 -Г╓╜єЙъ ынГ╛lOдИ\PH╙╢IВї ┼lж┼╒A/}B╢PИ╗AПJ└зВ(╘TM╙UP ╚JOO╧Б╗Ў╝▀^9u▓Лf╢╢Ф Еp╝о О╝eццє╣h4╧Ё┌4 p░l█кVх@└Я╧\.P# └kА:╖[╠х▓сp■╓этБэАj ╓ю]в┌77 Я8╪┐N╓╘ь▐╣-Х╦ж╖6┴7+┼- Ц─pвT+╒l +Рv6ЫО─C║Us√─T&═╗$▐х1 ┬╥i]Q╜бR-АG 8шє∙lL┐V?АCеу(┘~(i╛Xги╓ФШ7рEP4┤T.╤5t╚аrE-о┼╔g╥,/X/z▌й▐ЇУпAV uwвp╙ЪGЯS└ЫЦд╢|qи.ь/vў┤J╥╡╟П┘Р─дчЮО\RT( m├┐√жKIЛ∙3IЮ)ЦqЗ +ьўєY╣В╗Tx4╓4У!шООБбп█╕ }+Й╝░ў/й J8ЦА`∙t&}рр╚оo╛[1w╩дЁi"ТЮ┤buм▒Хсе|╣о4DS#Ю▓]н╘└DЙghкблр|∙┼ч╧=Ї0>г▌▌Нък+uЁЮ={А{;v?╝тVфїг╗P}# ╕I╖▐╓╞Ю╛¤ЎЦбъу╤do╕╝mO╫╧ хw╗▌лvдЦi=pxжZК╟у┤%ю e*е└╚┴▓eЕ] у№┤эи0аHt╦U╫мxq-эrБyVл╒To;Лз╦mП╟У╔ц5В:шg┐╠Х╒X╘хr╨Я}╞ВьЛеrCcsGG╟И╚х P╨У▒─ш└QАFj4ы▄╙╙8hP╬и╣|Я╫]╔ЦхDv┘╕ ё╞█ж·Ц-n┌ВEкPТ:$I▀я№V╙u їQ?√E[WЁ(xСа┤}ы╓U╖/Cх"jo┐ыг- ╟'єХb╡ьё{>▌Пчд)ЫшЫ√╟│ГрЛТX╬,╫uу╟_w═xhВPм╛жh$ы`АтKЕh$VВб╩╗A?]пjКc#Q^пr.╢ZСуu1pь@t]оNIVb u┘lй.ъ¤Їу╧ъв!d(j╡дл╡_~d*WdПЖиL.чї░Zн┌│зуйUлP[╫▓7_7,[ x╗ ╓эКДг{vяZ5s░╨ЭD,sх▓[8Ї╨d2Щ╔dX("С├В╦кZUлU ╘'┐╕kE■b.╨X.Ч}У┘п╧4EyйZf┴╙r *ФV√KГ▌гT,└┬ЦJ`└=V┴bъКp/Й h║yH╫ып@║ ч▄√┴юnу█Uэ┐л? T▐ Ых ЖЛЕH*#╤╡J:.2zuэUзЭLХ Я╝ ╬т%╖йЮ]С║ц я}к∙"Х·ж/█zъ├═╒в╩У┤j┤ф╩ж╙Mю]2ф-+▓Кa@1Eф yЯЎ╨ └Д╖9h╬шS╫╝╖ №┌▐▐чd▌"yVдt6П╞╙┘4╝f8ZS└▌╓-├D|bШаРо ═рlЖ!B:Э╠<№╛,╦t_╨Щ┐zь▀;▓я2Ц¤8╪╟Ж Eg3щ! UKЎЎ6╓E└╠їfТм_e■щ'▀ўvSВ╩G┘°8 mэ[Ёt,UW▌╖Л&к┼"ah-їuе|─▄\Ё└эцy╖╫"(к\Ц /╨їям"С╜o╓▀ь╓∙┐■T Ыc(BЧЬv┬╜я╜э*╝эЦ╝Чq╠╝Ч_╜!█б(ЦI%zът=Йd(┌аАщEДйл╢е√=R!Я]x═°∙<- Еt├ЬЄ█▀╬X╡z╚РЦою─╝1зАиiк[Ї$ H▒ф▄▀м·р#H}ўЮ]╤PxЎ Pow_░%Лвч╬ЙpєеЧвэ{╦▌ї╬Ы╣Zэь╙╬└ё/З ^Ў╥╙MKэщ>`╪╨bA■ёjФ╢наЛ─wm▐ь▌█╢╖Бkv█вшЫпPCЯЩВцM$эZ·╞║lI╨є06╥ХЕЧ_ЙВa(╬╒Л▀?eъ╠GЎ√ м╛ЁВє╬┼┴2¤▐╔sч▀qї─Ek╫─┌S&7I╒Л┴ё'ЭЇш█╢wьj═╒J┼b┘╟╣b╝ял╧>yh═2$WяЩ▓l┼К▀^▓ъу?╒кr▓╗cфЁ!m;╖57╓_s┌Ш┼╧┐TФ░рЮАп╓╫а╘>D√Л-╥f8ЁФ!lн"√▐Q┤Ы╞МY╢с¤Т\kjОVлК\оАпьц┴сб"▒H{{з╫у7а╒5╗ZУad─(╡Jssдг#ЙуАrЬ╫ыЙэЯ╫Й╟Г_|ёm0lnОя▄┘▌├чЖвЮЎ╬ шШmш>пT-√╫Мр╧┴@Wo: wїЇВo`╓dR-╠╣юЪ5O?Я.TLЪ'╓┼╕Ю╬$z┴б╝ї╝sю фQЭ╜ ▐э!ж"Я╧╪Ь+TxNP┤Z 3^ы pЭ)|1(╔ё,шбж)x ▐йBЙ>!ЯлхЄЩ╗P2 T╩сk<▌ю∙+V°C▒|EйЪ╬ЁСёb┴ШrЇh─люX5щ─УЮ∙№УBй >q╙АЦЮt *d·q╟-}se9A╔[(зЮ>·╓ў▐▌%,qи[ сВш╞е6-xпYУ$h▓-Бе═╜·Ь╓п▒>╫ф |з╜╜э┴yє Kx■УD╙Ч,]vщe╖m·╚уeо9ш?╝╢╢5IЇv┬яxГСЙ'Ь:{э+5UkиoЪ|┴╕█~p`KЁ╙O┐Єz¤ЁS3╟ЬqчжMШЮзX.├Q╙╢4├т▌b*ЭБt е дл╚2▐ЖбKВ° и№╖╫C░`╝T╒P╜вЫгiгR╔wї,╗т $╕╜№rи.╘╙Эжg▐u╫]6с·CЖтФbй╛▒сТЯ bщ·╖Юwh:_(-Ец█░б╖лm■╣>№∙Я╙┘\ NeЄР / ╕бf@a ]ЯG"it8W°бэлъ Аь╖Г6;▄й╣y1ХI¤бb╣рХ|▓\aH#╕["IФ╧- ьпп·╒аA═∙|po·ЯmтЯРn╡VбI╛╢╛Y╚M█Аўс7m╙∙й╝ .хfu╗─Ъж1"])&┬.ЄЭg┐vьВZ√ш▌u█╢}╤2ЇА═№╣&ЕФж╓╧vwЙм╧Р-╨ И╒/ъкеЕLбh∙DDS┤b╕ЁОЧЙў┤Шvа┼║О'ЁУ╜=с`p╩EM\╕0 ~z ЬпФ Г°▀4WС╦~oЮс5TобЩ4KAu├;<^Pа@▄9Ъ1uМШа╝ `╟╘-BЎ╛EaЇ╖л√╢ю▌J╝Zлoc╗M┌V)ЯЛGВnЦ▌╛mлй*ёpИ0,0╧Ф╦эП┼╗╙i╦╢лЕм_r╫ ╣бl ю√h}Sжкp▐`а╛1Х╔D|b.╒[лTLЫ[A5@яёHm╗wC┴U%╖▐p>ЫЎ√╜KЗZ:ЛF!ЧкгJ╡rСП .иPИ╚Q#RQ╡O ┴∙ООuТVKN9∙$dqO~°gYGдGъ(fЁЖEцL¤Ц▀^┬ В╓╒ЕHтЮ═Ыzл2у ┘И┼█∙Э┐"b╥с%║Ч\-+хт╨жцO7o ╗E0э$╦YYSїБCЗ%╥Щ╞╓Цt╛ZSTОw;√тцР╡k■_Й1║▌|6Э К▄M╟рE9°╪MбT^xё}■Eйкж29М2^щ█п┐ДB.OJ Ї_Ўz─R▒0є╘Sю╪░Pалл ║╙МSNYё■√xF╡: ▓ W< ╝вы Їр▐╕iЄ '.Y┐√$.>ЫJz}╥╠УOyшєO{:;З ▄▌╓9m╠шe╛чh·M╟ЬАв▒╠tр@в9┐9Й■ў▌+√x┼▓F╢┤l¤rg(w╨ПUзАГv)7gтД=въЖфё▒,ЫLt▀rсyл^~Мt}}<У═O{Ў▓ Ыъ[╗we'Э>zїлп╣б'СЪ╙t┤╗¤╛O>═d2 .бАя╞уО┐s├█<╟йК<ёЇ3СКV┐╖мn{в│╣йХз)+[ЭzтЙk╓oи9zХ&l·&-04U╓з_t■ТV7╢4o▀╙╣hЄ4Ф╚Lyц@Ё:шЎ┘b╝ъpЁк#П^║■▌P,Ф/Y*42`ў╗7¤8╪╖!▄Га└┴┤=gU┌▒Вt┼QG▄■┴GP╖┼|.ьў ЬЛtь▐╬NpGiЪ.Л$┼иЖ>pЁ0oАяMФ,█ра┌╜ооlv╡Z=ша┴сГб╤██ Xу▒g!▐-╩q4,Х╚∙}╝яOС{zzhЦнTфуО хЦO╖╡ TЕ4Фp°vЫ╒K╙O;e┼╗я╫ GЁF└гeлЦ СаПг╨їcO┐i╒*ЖwSЬлu@ЇЫн=С(Ї╧к╫э═2 ┴╚Ъ,ёТC9ЁZ╖u7чощ5x]и<ВЗs1,AAjrM╧Чёц┼PHLt$=nf╞I╟-¤П,Гw%╓Lkр░!╜5ЭKs.в╣>ЮOжЪЭ|№Йў╝ ~"Сиkn╠ e╣Z╫╪pуQG/zэu7═║9:эЇ│N┐c╙жT*XмЫv8Z╬fє╢ур√пDйЧ╘ ┌_УA№╖√ЇYГ┌┬ ·└в6√┌kчп║╨ ъ┘0╡╣7LB=╔+яyh╪╚S╧>у╬gЯPК9pн#ё║квN8щ┤Еп╜┴Є└_йШЧПеQ└sРЭЭЭw▐yчu& 4║Ї╓┼ы:^о╜шчРb._└щТФiиР%и'Ё╒4б 4еШ*/ЄmmСp>шmk_1с·G^|щ▓уOЬє·:RРBA%Я',+рС▐╡c╟NП[Lч▓+WнЮ}╦╝rнojRT}юЧNЫ7Л▓╠[.╣уЮ√└гNх ё·FНв├@r6^G╘сCтЦpок?┤}ЮйХkG┴w╩╡▓└ Кб└зЁ ┼iЦц}ЁОш│┼,<╙°F4:╪_я╡Yь/fИ$ёЄ╜$ys╣ ╝г(рI╪"╥МЎзK0ДеYЁ}э2Сiы6 n ┴s╙И■й╝ .хн╒j#(║ъЄ▒дгJО■╓УП]}·ШC╜╖юПx▒╕}╟═-C6n■s┬ж┼ 8l[ж$ч╘А╨e x╙dё4[╒-D(╟б!SЖЛдAC┬Ў°}0Ёa╕┬Рp▒ГYV(═=ц╓╫_ЗмJ~ЯFР∙╛√UЁйU╙Д1 п√ч№|ЮSйT@р5XkЪх|RЧ ТЕў!]Вдa(:}СQ▀йС┐┬Aє┐р`? Цr┘CG °ц╧▀hn°юыпWL╝╘IJfEп|сЗw/∙┼аЦ┤k"йg_¤№╤cРж#╔Зbёёє·Зк╣Ї─╤зрШБMїи╖▒╠М█n1|и*╫о║ф╖xъ%Г┐E=▌PB*ж╖c∙+пСASП√5r└│xd╦╢╦╬·-╛\$╙{хM╫Ьz╬╕╧3\╒ "d┘├╘D┴╣т╚├Р╔=╢ёу|ES▓╞ ЧДLя┌▒ЇЄл|ЇС▀_r ▓э█_z.2xXWN6 vЇ│ ┤╨y╡ZnИEM∙z╦зП▐qЗGpЧwэ╞л!ЭЭHФnхe─тРКэ=йQ?ЮH╔¤uИge·╖ЎaЎ■x: 2╥E╙Vн8єь▒K(Ўg│YКс&Я~Ўф╟ЯИ7┤Veя┘7НП=ZЎ╢w7хKe┐s╣б╔|7Нs╟[oБk!Й▐h4zщ╧■c┴kпE"QEн ,Y,ф▄в|жrEой╩Ч] Ў:j╣\ 8iЎшSozЄI╠°\ОgЄYcg<√T,Шt┬й/╜√▐9G■b╔ып╬;vЎ╧,║Їк√╓╜UиLетда╧Я╠W<dlkцqG▀╣ю Вb╔W┬╖°Tкх№Єk╟▀ ·+хb╢T(x╚бу╞■ц·╣ ъ глхS3╟ОYєю╞J╡ З║zz-\|╙╠ЫгсШ╟#В╩L°╒▒ў╝ў>Xшh(X.W'Н╗tёуOР!ПF╪>П7▌▌ы╓ЬY_║ш■в═ )C6(╞▀╤ QG7П9їоїп▓<╦▐ЭЭKf╧_ёр├0╪Ъdб{Y°L╞UG; ╒78╖'Wо >ПЙ╟пM9$=pя5цН4M┼╟XТ╘L╜ZЙH╛▀Яvъэ▀╦ЦKA`кХКЖ\]4}j▀│фхЧgNЬИчеg╓}ўW5%Нсm °GЕЧ^Кc= Р! └c],╓ЫL.╝ю:ФL▐╡yєї╟ГЖEЕ┬-ў▌э▐▄╪дx`┴хW_Нт1TХ/Ю5чЁ#ОIдR.╖Є╦░Ьн╔Н>■вГ╝яуOqDКW▒─Й6.MФ ┘·hфк#~yя╟ЯС є┼W▀p└Иdк└+Ч╔Єn╚Э¤Н╞E╟wЕ P6╛ї┤ФаЁ▒╚Jб(J^Тuс╙BА╒*K!ЮFУO>юяo4TФЙце\Y╬Х╒xC╜кХl]▒╠┴3╞Ь∙шЯ>d9╫ЮЎ=сЖЖ|1├їW_yудi°№Шсx|╛╣о╜хбЗБЖб80@а╝══н8@к рАZ¤·мЩА№а╧n7[╬ё▒ ░N ih:|┴╢L°▀й'Ьp█·╖и╛Рd┴АP▐Ьq┼U╧~ЇцжM█>Xл,░В,╔░ояvь╝s╬№ЕП?КF╗i╟┤р}Юе└Ў▒4}эё╟▀№шг MMEC~Ж ╕cGз█-Т4 ЖАdh@C|7ФЙНX`чАSл°└V└ Ў╚╩WJ8Ж└57╟█Ўьс)rцiз▐ї╟WCВ√№c~}╧ч▀&J╡─и hj╠f╥T▀┌╖жк3╧;o┌├uЁ░]эiУphЖ│yся.@▒hїY╙aФ╡Мhvчю▌╛@Рв▒Д> ю(╪┴J █A╚d ЇC█j╒┴З*qМ▀r╡ї пaФ вP╠)p▒ЯP╘Ї■Є╥`5ГщK╞I_║Vй/]hшWаНB▀|ц╛9╟в═■G╙Е┐21■╥╡*^ыЁ{}жmХЛ%╝ьH╤?Хў▀е╝Т TКUВB&eИ√ю╗\еёД_}ЯP▐[╖9М▒$+∙╝Э┘^·п П:°Рi╒t═*╔n╬┘Вїўхс░├Хe╜╗╗s╚АБЩTz╞╔з▄ё╬z╙l▒─КТbрX'Б@`єц═Ё▄┐┘ш{А║s╠1рЧ├Ы▀}ўЭртAх┴ЦўжТ@%P)г9ЬBРBфй/Ї!ъ╖{W5√q░/^┌┌уаc{>██╙Пl√ъ/╦о║╒╟Юx№qG╙╝0ю┬ЛфDў╘╟ 67вA╣PШ|■инуЎ?<2їтK|#F,╛√^*╔;N2Уn]Оr,╟0th°ё╟ I▀│~┤╪╬ЙзНЖ╘ ГЛ╧;ь╩гы^┐Ї╠SРъм°`[╪+\<╥G{Sl╣х┴gyA╝щв▀а╠Оy>8№Ф]┌@QgїМi'Эz ▓ЕЗ_╫б▌╦B^Бф╚lwч┬ыпCеълV_u┴HфW<¤ЄЕ ╬gр{HЎ▓ ъ;Ym╢ИПmv╫|еtj┴9чаЪ2ўО;[ZZЄ╡ъ-╦nлf2╖>ЄX░╛бj█┌╗т`э╠■ЭВ}│2x▌?█x▌┘╢ ХтP√Dў╓п╛5r╨ugОЩ|╦ьH└ ЭgюяпBс║Ew▀яёЗ е2CБeRчMЪАtc∙│/ХkК╚╗`x9рлфєAпg·г╜Ёb8,<*╩▄╦оXЄ╠╙╣lб╣ймTе\щw:╙нУ'?°┌mэ_ ш]x#ёДO╕єН╫╜ШЦZO:ё■/?█╢ї█Ху.Yё╠3S.╖vч╢│З {╖s╟ёё╖╛ЄКТ8IR╙е|╛М7э▀├ЁO0╢1єДcя^ў&/H=й4яaLН▐8v╨░█^zоm╧╬√я╜oён╖i5dфиЭЭ╜╚▒Ю+~wсФщ3O│└╝m;^┐_ХUDА╝╪3зOЭ6¤&ЁЭАз].┴#г═ї▀%C .Ч!+вAL9uЇгЫ6Ч ╡[. ыўzA ЙbэжыоY╝tv6Я@Й6╢$╥┼·цfь+rlн\04|┬╔c╬╕э═╖M|%M B═Тq▐7;╕7ь БOW*eСМZEb\z╡LЫ╬┤│╬Ьё╓[б·ЁЎн;F BiЦZ.ъ╒ъMЬПцЎ╟ё№└&╫■·╪╗╖|╥ЦшОЕC;vм╣yцъgЮ┘M%Т жMЭ4gю╚HЎ&$пфr╥ЕаR∙О7^WфЪф'О>mх┌┴HТФH$ц_w═├o╝ Ьуў·▀^2m∙ЁB5эцБ-]=i7CHД6щ─уV╛│╔$9┼"T├Ї√╚╥MUFОЁHWq─╠gЯ}~┌%╩╡tиЦя┌▀Й╞уQмйк NпуА▀2ъРC╦T¤тє╧cuu┘t╨ $t┐Pй·│ЯWkJ>ЫБ!@У╬╘уО^їцk╪Z(╟л°ф8къЦhеVvмcш╙╞]t╦}ўА_М▓хКnj╤x▌Я>№рЩ%╖uqз;ЕTu┌╜ўtши]╗ЎPz╦╕8Пф▌╡g7ОЦjр╔╘г▒>Wс}╨g╖ЛЗЄyеd2 э▀?°рQжahЪ6яМ╙я╪░A╫4яЦ└ЙК╟г┼ТТ.╚їё·J>эвQ9Ч ¤▀o▀vяк;W?■tQ╓КUyшИ╓▐ом└3rйц1╤╙uяН7▐╡aа^6_А╟╨\╡&[Ц-y╜╔d·Ж\U:ф`K╟щ╩╡ ╧▒∙LLi8╠ц╥PЩ┐<№╨оd4q▒r1╖шЄ╦я}ц)вжОw╤╝Ч╫sБМтX╚W-Wl╙o0Лх3┘yУnШ╜ЄNDТ┴p╘└1k╚Rк╟чшХlbс- Pw6r∙╩ХAU╖wws<╢ГРOls=ЗЎ│Tк╨╘т Бэы╧qЪa└зGsL╡\f8n█w▀q╤╡єЛxcы_╛▐єU"╫p╥Йы?¤цОIs░o▐ЭDнMи╖ХФВ3g╧r5─Mф▄r·Y╚@Хbh<┘╓┘ЙЖЮ:gО╧ч▌ч(╞╪┬ЫжMШ6}Pы`Н$ ЖE/єЦkоAХ ╛сДжq,m0У4}ыУOB┘└М-Ю1uw!EG-Mи│∙¤(Ъ>{V$\_╡pD2╢7─ ^╓ьЛ}Eш√#=Q},╪w<╓dБ╒iкS╧√ кЦЧ<■╘Е^-╣)╢м╓nЮ< ╛tы╗яЎдzb~┐╦0зw"─ +я┐OjjIБЧI~┐Ч,dЄЭ]ия░7CУ 9╫ъ╡/▓4SУлУ╧>y╜лxp╝ИE~ш▐+N¤5"∙╗>▐ЭющX°█гЭjх▒╖╔!XЧS╗цШHNzщK!тў╔9ZMЄ.єЪОGДtч3/вНш,Q(\Ф=яЇ▒П╛┤6ъЦN=■d╧}·з^Y╒]AЭрЎЫEтs6i╓%шУjеl╚┼O╝Ё"┤зНТV!{√SO`╚¤~!▐▐▐iiе▄b2Wd8ОХaуPy,░аН├╓88X╧┐BSВСnнW (┌ьйУP! ╣╛є╔зn8эМ╒я╨ЧqBн╔4a╫E#█wэf╜Тх└6ФКY└Кtа▌п9№Ч╦▀z│/┬▐т0¤Ф╙ю ьSеж│ЩА─ГєPСХЧ_ОLчс╖╫╖}╟╨a├Аb╤hOg╟1SO9yю3OЫ║ ╓╫яў╧╕т▓█▀xЕ#И ??ЄСїя\v¤япЮ4ё■┼KЧ▄{▀╠є/{x¤·6 FыgE┬бdрыП;ъюuoPЬ kA▓бP`√╢нЛw!╛РZrгоО5ы╓╗¤╤d╛╚╣же#╣@#g╩фй(У╞Wi{|g═1bШРЮЖ║║П╖|tяъ╒6М╙t∙В╖▐їР═║ЯЫєКАG@f RрЄЯv▀Ж Uцc┴ЪmА═&ukX╝n╧╖[gM╝I.Ф)г·жЫц/&╢╡╡uўОэН uАГ└7УN<∙╓╖7Ъ═╣╜╜АY╓ю;Y╝√А*КХR└у-х╥Нсm╒|q╩ЩcЧm┘ТкФ┬ЯR*╩Щьр╞┌╢п8ъ╚╟?▄\*ЧIОщ═жOЮ|є}ў°c╣RЪ?fьм'Яlnn@aY┤u·yч═~ш! P$шУO<ёБП?. 0╛-]Ыv┌)l▐ вt╙Ycч=їФуж ТC)Ж╜ЄЄ▀▀╛ё=Ч█╙ЫLq╝ЫзPА╡о<ЄЁ5я~@╣=5ГW─┼░хR!Є+8<м:ўм▒l∙`▌эїЦйVdпOЪz╤EXсgёйX▒,8╙o╜5 Б-АогЎv╘╘ДJ%ю╛i▀| >_╨4 7G+х№═гO^■╩K▒h╕Xк▌Э╬56)╩%█╤XЖЁ вVнM=ёф?№0У╦°2в0ZкФМ;║D>Э {p└Э╬7ї▐{ хЭt┴EиV├З9╧│x┐ьэO>йи╪{_Аї╣щjЯ>wЎщsp·мЩ╤Hjuъз╧╟3ш>АC;0L$╔▌╙Ыї°у8.C░╚╩gzчM╝╩╗ъ╣ч5ЫrhЦЧ|█vю╨▄дщ2C$сL;¤МeпмЕ:ЗlC╧!uэсЗгжFФJуeЬ╜v!g╟ ^пўяh▀Bб▀.▀gў╒│▐W▐╜ї<нп╝р╜L;є,аr█_QB]РюРЩsч╕X╬уєNхз)d┘°| ▀э╦RHg▐цLА├"КДO▀|╧=┤ЛО·|r2u╙)з!▌B ў╠;ыK$Э4M╛▒a╧юЭ~M╣ї╝sб┴pУЛ╚┤@X ╢ ║└▒ЧЯx\w=ё─ї\И4эХ6Юy┬aH'ю√днЬMM?m$▓м7╛KЯ)6C"yэпG!_t╥3ЯСnЛлB))╤C\r╪сИЇ╝Є┴ч██║Xп╧▌╓fЬ°+dX╧╛▒nў_╛Ю5iЛLY▓`└┴?╧ЫLE┼╦v▓R├█z▄тш╟■№ч╬╬NAp╪О╗с╕у■Ё┘gЪжВЫz╙9чм|э5╚d2ЩфYМ■╕╣\,°|╛╦О<∙╝xр3ТkИs*▌їь Йt╓Н╫ПР╟┼╨jс·О[■·█╝?дШdW"YЛуE █╚зУСpp┬пОY·╞zVpбъ■ўDдж·юЁ4L Вa[Ц)║└┴┘gЭ■└Жї╒ Ё┴╕=7Ьtъmoo"XТс╔\&p{,MЯvъш█_y╒%ЁЖc╦║ъE╚└═чЭ7чБЗв┴РЛ└kR7Ь6ц▐П>ь;ЧН╖LАWPкT√ы э█л¤╖с┘ўe~_рш■x╘3╞МЩ√▄3ТрЖЦk°єа?АПтЄ■ZU!-═1хЩЮwя_qOwЧK ╨╝[CдвйДc .АXh╥┌ь╤гW╛ >I╨А╬%@aDД├сT*%║=√уН;√B╚уУp8XЇ▐гH¤█]pиz┬&RЄ╔юОрсрm6╩С'Дq╬3/Д■D▓'НAЯ╫u мщ─#П║c╙√$IщжY,се║`$ZHt∙С╩ sтХWC╠┐ БPм.Х╦7┤┤цб■m(ї╜1▒ъ5Ф ╛╟┐╧т ПЯ╩√O)/№ ╪z├╤)ЮRФВП╢7н}ёўгOu¤ГНocь▐їe¤└б7~Rц╜hш_u$9$╥А╥i{/"в╠СЙxг┬г goЖдVни2Оё╤╘╨x∙б/zхU^u╨∙ЬiV╫q·cMў t q_╠jтяZ,fФьь°┼!Ь7Є─+Я} ▄╒J.З/єа┘┐t╡mє╚УO┌№ёЗCЫЪЛ╜╜є╧╟╫╒+ЕттХ+╜═2жхкпуhjЄa┐@К№╨;я_ЧЄЕW\БФ┌ЄзЯ╘▄┌╒╤6ёъёиTxэOЯ.мГэеЛ╧°5b°╒яmuQЎU╟EJu·▌/╘pШC╥m]q──onу╝и╕г═C╔┴░p┼СG У{p▌&ВsW∙E!W╬/╝n<╩gQ▒О╞3щ4Тef─Рл╓ю ыЎgRiЁ┐╛╛║└{▄ЙTo}S}нZr!ghSCч7[╗vўє├└ц¤ц7gгjСф_~Х.W▓╒К;┴┴Y▄Ї/┐X▄?;╚Т$T&iк~╤╡sчЎжжЦы╟]░р╤з|р╔╧єщT╧И!┌vэPu3▄2(S(Лп╚7я▓MCUфgО╜}├ЖЪRїI>═0жЭtЄЬЧ_nmm┘╡}зS*-Э2х╛чЮ'(Жb╪ЮDкVлН1"У╔rp(z╟|ЁЪ7_G>╬дВ╕T╡╪Й▄Ёє#Я√╙Ц▓нзК9ШЖ╟}туЯ}Т!LЛвФl┘6#yT╝∙╕г■`S:_м)ZCsKGGG<Ь0цф╗╓╛╚1$╪Qo 8с╥+g▌}╔Й"/8╡╥М▒з/}i-╟╗\ЬЫfЩлО:f╤лп 56╘5╘┼.:x╘┬ч_ЇxESSCб╚%┐8vї╞НЖ╚Ц4GрSїz┴w¤ё'╛Ё┘зйrIqС┘j┘чёXКцsШыO9iц]╖ 1м7SFЩr╩╖o▄dрСD╜V▒Ml┴╕ V╕E╓L╩%Вп°Z,оиUЪж ├`nёб╩╟Ю▒№гПz▓ЩЗG╖╙├Yv<ш'Ms№з?▒~╜в╚ЩBЮўz'ЯzЄЪ?} №Ъ╧дЧНєЭлcС(>╒KR]Э+ц/╕хЎхl ╟·╜╛лП(Ь~сЕ7▐╛|└А╨ДхB▒ооn√Ўэ║щ0B`ЁршЦў?{pїКgЯ}▓│c╟ h[{W╕╛кеб▒~╗зл- еz╦-Ъ╗xЙaYшЁ│└ы└х5╥L√п&░9aўу ▒Ч╩ь╛╨·Оaй▌=Э┐:ъ░r6[Iев>П]Х/=y╠╛▐╒[и1x╜&└┤$сs╙;wэxhїЪ┘K[жэЦ<Ё╦┼x|В)лмR╕ц╕г┌┤9[(╬8√╝oп╫бэYuяl╤л╩▀\їє█ўё№┐╗еу╟╦╧П¤№Sy Йх┼3eaXэ&╜4z ┼чо=F╨╒П·q░kўW н{q╨:Є/])╓цY|5Э 8?!т0ЯdЩ┼ 8sB¤ёъ╨~gDЯD╟░r*х28^Wy╘┬Ч╫В hС?Ф/Ё└▐w╡╫╛ЫВЎ║зvD╝|Ф─╓5Я$╩Е\8р╜№дУP)┐фй'¤нЖУLжnЪ25╘-╛}ЕшХ░dЯw.рk╫^>ЎLDРox_wё[╛√■и# ¤!С╤╚╝yєЪЫЫп■¤ZgЄxЯ}сyт/ №∙ВЫoFк·шKkп╝ЄJ│Шэ¤╖O?ю?Р/0эЮgъгбI'ДУ№╦Ел╚╦+/ █р╜ы┴╟╘Ж▀я.ИZ╞╦щ╣Bў╩щ3P┼╝a╔╩Xу└Вж┼ЖъNvzэ├Ж'┐■жТ╠╠?E#уч▄<ъиcЗ║╡Q!Ч_~щеHQЦ╛√/Є%╣Д/сPkЩю╬;.№rqУч╠=фРC╛▌│√╢3P ╕шю╗hAФ ├МкжеЫ╓┐┼QП(8Жm╘J╒B╬P*n╖{Ўo╖цнu╔Vl:░ЦЛ& ╣Їв▀ЬY_║щ#Y╒Ъ╓U%Є)5xpюЬY╙жM#I╥╘-00ыТ╦<■╦pХBaё╠ВЪбYКсКеJм╛~·щз▀■цЫ$I╗\мбы╗╢o_s¤╡л▀|╜\.jЦinR╙с┘dWч╩│/ШєЁ#:у 9\7мю=эK╬┐dЎSO╣Ъы`$U├эr╦ж∙ус m[3/:w┴Э+┴┘И7╢$RщЖ╞·┐|ёщЪ+/_°ь╙ЦЙoршшщ╜уъы╓|ЇЙм█0c^стГF!Ю┐щбЗdY ЖBє/╕p═╞НСИ╨╓ЦйU╩ ╬=Е"3Wн0uЭ"ие╙f▐╕xihHЛЙгnz╡6(╗фч┐╝·╢e┐>ї╪/┌;hС74= чwu.║pК√ч.[┌:dфw╗v/?a┼ыoB>╙йD╪яеH$╕╪лП:f╒ц?хJU┼DcЦ°ПТ╨<гыЪйщ}┴=ўве Gг;╖o┐ї┬ ч┐№2Н/У$я╝№▓kюZ╙╘X?xЁрO╖|╝l╩ФYлW],ХuЁ°▒g/{Ў╣p$Ї┘Ч[c╤:┐G╨Л╔)gЯ¤─╟Я╢ўдe╔ЪVW╫`ыj9ЯЙЖ∙tj╤∙ч▐ ╔Я╙╣у┬│x|цЗz P3 AVк5Лал5%Пs│mы╖<НV^w╒ф╦ёХI ╬√╩ы&▐∙▐GеZ╒v╙P щ<Л╨╩Л/[┤Ў%═┤Ю5,█ЁЎ&S+-Ь9oeYr▒ Е-╗їжЩ│$I▌┼ЧЪАМУ┤э8xг·■√·■k°й╛+И¤[Чёt]Яs╔яжн^Э╦e5ълп╛ Г╦&L║g▌[▀яшXsїХW-]рб┴▌{┌█[╠?ўВы▐qЙ|Ur▄.о&ЧцЬv╩ДGЯ8xPйД8Їя/7tъ_╘wk▄_БiЯЩы╦ю<√Nlї)ШН╥0Ъ3f)╣мR,┤ВI:у▄kю}дiш▌=]<(У*Б фz═╤GO╕ў╛╛t▒┬@КPiЖЭG ╗йЙ'№·╢Ч_е]№ФK._ёЇ3рЕ┬Шr ю}u╤owь┐╩╒Пx{э▀е╧} eшG═╧П¤№Sy Йхэ┐№╔░t┌Mi5└A√¤ЧЮ╗·┤1Вб~░a=>J╥│ч█║╓!▀Ї9CЖ е3╔"┴╤0 ▀╞AI╟ўCTX|[Зэ>√a╬>QР▄Mнк╞2┤еr╡╝t▄Еє╓оe▄в╒w╒▓╙wП╚ √sЯл╖▀╤┌7fюЭ,DшЗЪСx▓╠|&┘R_┘╤Gр-&е"╛ЕL{ю├ПxBбйW\Б╩.╗Ы°Б√п╝т Кс═╬$∙▌▓╣л-╒Р~{╩╔}7 иП╛ї╓е┐╗%У╚▒ю~с┼[ц╧═twГ;·┬ xю╤Gвp°Йз╣т╩ uYAс╓╒ў▐5ёДЯСс╨Т{Яq╔x!Ю{тС╗wv&М╚p╖╧?√WGааА╘<2 Д▄H гТмy¤Ъ;kVJeT)═=ЦП─ЁB^█.П-~Є ВУJхZ╨урN{{√ @C∙№3█■▄▌]Шv∙х╚6a<,ЁA┴┼Їtu╬Ъ0o─СhУ°$Ц иv╟╕хЪkV┐ЇrоАПRB_u|э{ !╩┐2l¤ўQїeiя|D $╣  S ъОГ▓аю╬ЎЯ4R-Ц'№цlkЪў"┴7 ▒зЄ∙|Kk3└tOoЧ$╣чЬz╩][>Б7┴▓ё.7┤N╖ж▓К√°j);ёьsQ╣║°═╖D╔Ч╠ц<^┐Б#]ьпА¤ыц}└·[ўї┤И▌gў<Уho/·1sЇу■єSy ЙхЕ■╔ F╖ Z$¤ррє┐}Ъ[W?|ў-hжзc[]╙└НЫ>/╣<╬╨_u$Зw К$РОяaEвЖq░╩АГМНwв■ qў-CЖ ╒Аa═╥L*┘{р░╚╢4MЯ4zЇ┬╡пт  @№лqЕ╨▀╕д -Z╟>№?Дбv▒\OwWsC╜*Ч,├И╜╜▌]-Z╢w╢5╢╢Л╒p(T*л╔D"рУ|нС%╫*°▓&▌DФй┐-П╞┤r,Y,ыюю.Ч╦сP`─И║н[{pH?с╚dкN╢ `P"gsР╛FЄ>Пpэ▒ЗCж·рSJЁч █4НZi╚╚Q]╘У)Мряlыж(┼/Йz╔┤LЪУВэщLыбї▀lыё╗]7oз│Qбo 4вp┤┴╥°D░Еl▌Ў вRС5Eї№щLжa`}&╬m1рЧ╠Ъ"▓┤ЧwЛE╒vxQвi╢Z├┴иЫЪы+▓▌╙УЁ ·aис!Июj╣ёI{v╒┼#┘t╞ +ЖхЎ°Щ╝[Є╨4Y╔хъвБB║x╚аy╔Д?,ЧЁїАА С`А"ё╠╚}}}=I╤╔d╘Ьу8ш'J▒╨пg]▄О]╗Y╓Л╫wtu.╒╘ф∙·/m╤X8УшНD┬╜▌=ї-MUMЛ╖Ж╖|╖c@}SeGЗЫсB═ёоTвоо!█ЫмCUMO"▌хїф;УЗ╪╘Х№├PУОeЦKєп┐ю║ Z+╦`█└ √╜Дй45╖l∙BЁx)ЧHўv┴7WV╩C7l■р╙c¤ЛDп▄ЫJВmsыў{-╦щьhЛ╟гП√ып┐нпЛU╙]Тл2M(╚ИDbfеъE▄─_ z╓гOи╚╨y╓_оTф╓X▄.╘ЁLМVД╩4INЄzўt&╜■@.УЎсPиЦе╒ MЩ▐∙уяh°A█@RЮцYЇ?Еб.+╖фЖМq2dEа)B3n<щд╦╓▄;d─HUлy╜CRЕbho└АЦ╢О╬h4Ў¤w█ЗО.Йt2]kkk1bDв╖k└А╞ООюp8▄╓еЛ[°6AU╒■ЛМa╚╗\─gЯ}Н√IтЫрCБX,┤k╟Ё·ЪЫЫ╣"ўЭ,ёB$MўУ4гЫ8▄Бн╩ДZY|уНЛz╘ж8w0\и(4A│ Сшъ`IчЎ╙V=■xйRЛ╓G│yАм/v┬ ╖ю╫CЦ─с$QlяN°}A^`w|╗u°рVнZdЁВзщ r┼*░>┴ЛЕjЩхА╤ЖXбЫ╗╢я9r$Мч╪Ъm*8Аcн\ЙЗ"j╣ #"╘PзBYЁїCsP.╖8╚Б/¤_UЧ▄;/╪╖Ї┤▀Бь√л╢6J:О EА┤vэ┌nhJ╩? e¤Ўп╙└я 2="%луkўx╕.Щ╔@¤Гц╫·В:еsYNЇе·ю>F}7оЎ_ЕГэ┼AЗ╪?вИ╜╖Rї═|ьeD├Ь@UMО╫Gk╒кR*I лХJ бp╣вфs╚ 5}┐нНуШP82юї щdбяZ╪Pр.H_eЧє=>┐╚░Ввъ┴p░н=Й╟AJ ып7А┌√╫ЛўыПЇ▄/┌?■ъ*╫+??ЎєOх¤'Ц╖oяm╪V▀ь`╬ПgЯ╣ яT?▄ЁC▌▌▒н╛iр╗Ы╛(ё{Ё░┐t$─#ЭtС°╬ Г╞√Ё▄:^л-s}│Гц■╗x8{ё═ОG┼-[╛¤┌;╙▀H╬√╬╫}ў▌═╛H69гс╠XЦ=╓NЬмС? @ А ;y qРї╛▐ї2 ╦Б ∙═╛Ё╛2 ╩Б b╔Б╜Й"[Цц&9ТмHОц>8<╗┘wuU╫}эяйjТ=NVУxфI№| №Pмооzъщч°<╫я9~ьX&┼_√ЧЁd(Iw;▌t╛4┬ЭЇс=Т▌яКOю0н ╧&uPВ0,╒┌▐╬дХе#┼+я▀ХбЦbHi&█SGЦf1ЫSЕ1 %╘╜їЭ┼TЖ0M]3ЄїJ?Є√ж.Aу╒vєJ╓5,О@Ул╞cS╬╚▌СFЁ+p╢mЙ┬Лє4AъП┤╞ть╞╜TД╗█Э0М8V(3у▒ўbУ:Iс╜Сйлs╒Щ╚sL╟╬цЄ[н'gx1ї+ФцTр.68Юq)Т╨░Чgеб╓╖ и╘Eн Зк├нf ~5(▄yi╘+ўю)щtбTВ╘дЫnз╫E╗#:Юч#╫Bh╔╝ы З¤У╟k7n╡8%=░╞LZж|яD&╫oЎ Щ7|P█╙═КТяиjщуННЦ:Ч╔╢╢█╣Bvп¤ч/и╕кyik│∙ї▀ Г ¤╩?9оч║n1Ы┘▐Zуй0 ╝Bб`8n─Є+мBF╤МB^yяpТщ╕Ъn@[b8╘Б_<э М└▒Г~7ЭVЦs-Ыз8ПгФр3Ф└єЭна Яп¤)ZВ* /№═_Т"o╞p╖єё∙гГVЛHКжХ\й┘щgЛEИYduUeИр╣ ■▀И╡;─№№_¤у?ЇЗ&┤ИКХhк┘дОдIОуLc┌о╠╨Бaэ╦_&F&┴▒▀zё┼n┐3█ШE■║в@╔ь╖ФТюўU"Иl╦=z┤▄n[щМ8 Зa@їпкА╛ГvCVXЦюмьї╡Z╨╙0мTJПm╫2Г╨k╘╦я╛√│gЮ■╕>ЙВМЬ╠СП\y∙\Се ё;┐M Z├|ы√ W╩ П4l9 #ЙFM∙у/№■ z■kЩLЖУR╒ ∙;Ею# Щ#&grC}ЬЖЧсИv│]пФш╨л}?├эЎЖsGЦ┌к.еSЩ,qэънrб─dеР▌▌эЖI░Фа(c█(╧T▀╙·*4╓+∙Тэ║╨И7<фUА2pa6Ыw╤ЖцфдДЯZG▓?Q ╩XЄ`xН-@S9ЧA#┐▓,╥4лk*№"Ц{√юцl)╧S║├~пVле3Щ═цАdЪaб°Впgd1Є\ В#╚c█)U│вАЁ!"┤╢;мЭФ ў)J*E╢бє(В╣═цдсb.Эх%k8М,GЦ3 гq&ЯDJ °еGг!/░P2[&<╖4iaАZП═╣ЮU(╚╜^зPЪО4╙pл│s═fлTо┌о7йhТ$УОМpMПs@ё├ =├Я°}ЯЬўЕв╒з¤0а$2╞┴р┬ў┐ўе▀№ └┴ХdWТїїН╞▒╫╬╝=╥сёУя╞╜ГДGЙPбK▓ЛнqФO╠Lb┐W ┌ш"╧╔вшXv╡ЬZ╗│S╚хБ░lЇpт├╙nt▀Ї╟8sэg√йср).О?#p0Щ;iЇ╔0иVф┐z■╫?є_Х╖╛▒#╥эvзд│|КП(н?ЄCПh# iЙУD╫ F▌▒╠злY╣█s° пНЗh▀В|vз┘иBю*╨T╔Ш[UU8є■√└ЕЛЁD ┌┘▌▌:ФГ▐Я|■єДхKKDk зo¤┼_d eитh╙\_╒чцєоcшГыqщT °sнK┤ф#5-sJ4ф4ыб =M▄╙Tк4Ъ┌▌▄^м7(╟W█}╔AU~╚╤.щso╣vi&gh║ыаAЦT:{х╩Х╣·'╡wZуё°°╔c╗╦pГ╥М╥lЫ╢1>:?уZ╓x╪-Wk=═u ┘ї2Ф"гNй▒6bС5OEи┤jї┌╗я■╦╥ёУИ╢е╧7ъ7n▐╔ф ├сHТХЩj▒╙ЄЬhЩcY9Юї{АХrщю┌z:[Ї)pPэv∙б5У═l#7УG│}RЙ(▌їЗ,╚8ЫN{ЖТ▐╪╧MPўuw╢ЦО>хЖфэ{┘\БцhЙc!║dОъv╨Fjc╦6-жVМk5ъUи·Ы╗эL. фФl·\,xО╪┘щd╙йBNььк'е┬┴Г├╕jЩЇ|$J`H?║cf▓╢щМ╒A^IЛ$хМF"/IЩ4v█;NиЪаy▀h╠▄█h%гф▓ИЦ╔зх,в█t╓їl74г(Ї!╡єb╞.╥╞їЖК'│Ы╚p2Гщq-6И{dнў+ОУ_° №╛O╞√FTа]LЩ╢═~Б╬ге$┐!╗Ўх│пб┴т;wo4ОэНUУУшзО]Yo2╣?╞е! ЗВЗ▓Щ╔RЙ▄С@Й░7лoкDа tД╚ ═╓О└Є╡JEiОч╥РЛю/P■u}` Aьy2(░ў╝dX3┌├┴$(Ут[ ч╕V2вQ-Ч677КЕBз█хRKs)N╥;#СфА?Л┼№╓юfо^lvЪbJё=h╨J2гШCp ╪╪ ОaucЬJ╔У▌KYV3┤|>o96U(AZЦ ┼Я=╓ ╨╩╘╒477чПBс2tУнr-/t*W╚П5═┤эlб┌эw2)Ъ БV╞║НЁ╚Т═RFЎmГЎ=R╫│╝╪эЎ╥еВ╔РЖosХх╨r]▌╠зsQE░Ю-╨ИOш0 '4y╙)J7 IТv╢ЫН∙y╟t║═▌Zе╬│┬а█a┐wp0$&╙@щдЭ¤dR┌tБб$Б╣}¤·Йу╟RJцъїы3╡:╔;;╡┌,KУcиуC┤;4BFЄ|ф├%Д╨gi╩▓Mа:h¤яьь╩CДpВ╕╗╗Ы+б2PyиЎ3щ+жхt:Э·ь№PBьPnoo╫kДЫЖЦ═@eOkpG┬-еsщРt┤ё8pБЗ°╝}э╓│'Юnu{^Je╘F░=▀~|8a.ХюїzЮЙщt▒T╛}√6Д╢╡╡ьХ╬H▌vт╩ И┴╪T2▀їrК╨oяB4╥,ДACл/В║їХBкЖы+╒Щ╨sC?Аь#2Ь1╥JХr╟╘BЖB Щ6c√I <╨дA#╦Аф▌kю.+·@еЦbh█ў)NЇГxDЮМzн╓┬\Eэu}╧й╫ы#├ьЎ╘B╣lШ6AOЦ╝эПўб%%!gХ;kksєuИyО"бy├p'MrЦeбэDБ`I╙▒ ╫.Wл╛О╟Ъ▌h{ Aзх┤6q<╧Ё╨nr #├╖L╙l4╨Д3 #ЫEU>ЄRdYА╢Р* kге╡фe+е(ЪжfR▓жк▓$Dh▀Я>е9╥╦ ╟О-ArbiЪ lHTРwy)-e`Ц╤peB╡Фя╡w%IМg╨ОШoп,■╨┐oB)*)2'є║>6M#ЧR<█];н┤┬o■╚▒+╫я╠->╡█яr╔2tFVю\┐∙ь'>┘n╖!ёA1Х╬f4c ╔-и▓K7*┼ТкН бЎ╘a&Ч╒u`вmКх√√8H$ДqsЭЬnР Ъ8|ё|4Б@DШVRhS"ъcэўcгA}&Щ┌иКи8доP╬dбДД╫NdYU╙(1 HхzОЗ ╡МfрфєpМ2▌▀MЗ ▄ыаwgУ▐eТ0|GNе<╟ВwtCа╚ВТЗn╞KТuУ(ё╨lu┌ ёJj┬w\╧є╦3╒н xn╤єЬА@;Є∙Q╕╗█9~тф;я╛▀X8b&Г╕Р┌ы.Mъжh/HПQ╘#.ХЯм╣?П,№╛?╧ўEKц9/pYЙu╠aЪ!╬№¤▀¤╤o¤Цш9+ч▀°╓ J▐\█\XЬ{ыЭ+Wn▐:ю╡[wа ╚д╥Р1&╕ДTА┌B$╟аъ6Ўq!║?({ч├щ╢уЇdфр^я!t2)ишГOЙж╝RM▌!Ь■4ЩwL'.U╚ MпYг┼г"ёXъ¤+┌IЄO▄zОЎB▀ырШЬ┌gШ '\ў╨б┬∙{б&kЛ╚x╖АoД51·╔ Э╪│C■щШЙ╚╔тЮйP╝╬~4N|DNЗ~┌a╨Cc√жд*J~┴щ▀zп/iR'┼0╞)ЦJqж№в=X@O╟└~┬ШJBLMШЪ) ёЇыLх╔¤_─зи$╗ТЗ?¤чй╜Мv▀r√╜О ╘XК╟╥вЕ<И╞╔ ╕eHL╒·╔╘~╞Щ°ЩJ╥юГчЙdт┴aсЩМ=▄ї└}╔:дў&в$ЧN┬CN]╣пщ+з╥9╡├Ё▀W=OўБ}рУ╜Р╞>Ўs╞ы{я┤ў+─▀ч с╤@L}ўр╬ёх╛▀┐Гзя╥бQ:}[Єp'2ё ?81goЇцБ|qвM¤Ъ Ь%е№ОлOЎ║Бя JЯd-БЎ▓╥ЯuШишр┬ф╗ПР├ ЗЗдЯд тГYц■8y╝∙}/─■:ы▌■ч~▀╚}_hmB;6Ч╦AЫ6i╥АаЙ┼┼JvFн▄╡╙J∙CD╖n▌|·Oяlm╨D╕Xп=}ьhКЦ/]°ц7┐I^]█i4jлл?Е√~ьc╦╞ЫИ@#ТМП*B∙J┼зЙ╟ц4 ы>Щжшy`2╫uЕПUЭь'ч ▐Т╤M╙Иxd╫╢(▀оФK7n▄8}·4а▌`0шt:ЫЫЫ╦╦╦╖╗гR1}Ў▄ ▄х╙Я■4▄@ш2YфOю ├q4єQx\╟┬┬┬┬┬┬┬┬B╥tчa░e3bГБЦ═ж4Eї┌Н ПчYЦ!C#ЯCn2]'Ё,Гcщя}я{_№тУЮ╛7▀|8reeср┌Vkv╢▓╝№f╧<є Xфф)юL@РИ╗yЮбp╫ ╓G%}lz>ЎЄi? ╢╢╢E╣wяЮя√Т$бy├{│в╤╩?Ог)2ЫRv╢7ЁГ№ф'?Y]]ЭЩЩy¤ї╫с[п╜Ў┬┴wю-..╝∙ц[pS└A░|МФгСЦ░ ЪFў╞чуEXXXXXXXXXП_║>>Ї╝ @Д)EДуfлx╖▓▓Т°IЭЭЭ█эvL╙З IH"p8°эo0╛\╚▓ь┘│g╢ZэR╣x■ьЕР■╦зNЗ╚╟1щxv&Е№еEЁРE│Ф└ЙЄЇ■oёИ-╢╪bЛ-╢╪bЛэгZclъh╞2l╙6╩е pZs╗ї╘▒г+╦л╢kЙ╝дЬ∙ЄЯ№╧ ь╧Г╚ ╒_∙╡█╖o"╟┤┼т°CА┐d░°ХW^СeyВГ[Ыхъ╠е ╦$M|·ЇпТ╚яэоя╙8╚p4<,Z"ЎЛЎ▄Н-╢╪bЛ-╢╪b√╦`5U?Ї|>W┤lCdВ o▌╕╜tт╪┘7╬∙б╟│P▄я~■ў k W■¤╛?╓М╞тЄеЖo╝ё╞Л/╛xэ┌5IТЦЧЧ│┘lИф╜╡; ЛЛo┐їЦчy╟П+╟q╚═ЄЮHmчIъ╤╝╞`aaaaaaaa¤Ые╟лГr┬╒ZНИ"└╗П=¤Їп┐О|Л·>╧╟√ю╪60├e╚л(Г╨Ь;wю∙чЯOzWVV4M[]]E8╕▒╛Vп╫Бс│SзN% КУыэ╧дСяM,,,,,,,,мПB#U=Ї<╨┌p8Ьo4р°№╣s/^┌ыv╗└оы▓, ¤~?ХJ┬Ж!╔йёx Dў▌я~╖╫ы┴╖▐{я=]╫/]║Дq ы╔╒├p╨▓мJ╡ъ∙q▄╥▒c;;;ЦхфєY└6U╟-,╠├IYЦ╟4╘t4X|ф╚С╗wя┬5жiЮ?^┼╔▄AМГXXXXXXXXOжЖГyB╝єдТJ]║xёш╤г@kТД╢Жп╒jЖa Гj╡ ╪Чl╣╬░<░▄┼Л?ў╣╧┴зp№╙Я■t4]╕яJ▓qo╜>[]╛┤┴йO> ЦB█√EhG.Ъa)БЧhЦ:╪░[l▒┼[l▒┼█╟iGCэ╨єТиh║Z(╠╪╢с:╛ r'j┌PС╙C┬5AрF! №ц{!├▓ З├Ч_~∙K_·R▓┴▌Щ3gfff&KI╓╫7ыїъЄЄjзN= Цв░{╗CRpLТ4├PВ 1П▓ :╓┐GккMэ┘}`]╫╧dR,╦Sё╧ №▐ЙK╫п▀┤mSQ╥?√┘╗'╠═╒G#}fж(КЄ▌╗╖Уe%/^№ъW┐Ъ ┐Ї╥KpЄн╖▐Ър`н^_Y^гшSзNБе) ь╛╧8жb╤`1ї$°р┴[l▒┼[l▒¤e░#U;Ї<░/Оmз3й{kыЛGVW.лгС$КMю│Я З,├╝ЇЄ╦║жЭ},├0║оє<╟EЕ▒р╬0╪╤ ╓Gе╤htшyA ├╚чє╜^я╬Э;лллОуh┘┬dЪf╡ZUUї;▀∙▄._╛Ь╔d.\╕Ё▄s╧СЫЫЫsssя╝є▄Ї─Й└Й└|├сyдi`╔У}ъ@╙. ▒░░░░░░░░Я╞уёбч-╦к╒j╛я╢%Рц║.╨!`▀б╫├e√╖ъv╗┼bё╓н[═fpЁы_ : DY.Чп^╜ Я)Кф╟є<\kЩXЮч=ж╞┬┬┬┬┬┬┬┬ЪЁ╪бчiЪНF Ш┬1а!Ь?Їz█╢SйTйT l4эv{8 Е╦Ч/? №єду8ЁхЫ7ojЪ╞▓l▓ЯЭ$Ipw8ИЎ7вbЗ>╞Ч╞┬┬┬┬┬┬┬┬┌└╪бч3Щ PY╣\^__/ЛD╠|╟z}Ж@z╔T└d╝H└я▄╣s/╝Ё∙г¤hcccmm ЮЧ╦хр3╙4УО└ДўGЗУс┴b,,,,,,,м_м·¤■С#G┌эЎюююg>є8шїzKKKЁяб╫+КА,▌nаИ` ЁеЧ^"Kе|?Б<╕8╤u]т~°{Щbaaaaaaaa=>=мx.ВT*еыz2Ь√!o(IR2┐Рв(а╛b▒╕││є Eхъ endstream endobj 8 0 obj 131379 endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000384 00000 n 0000132051 00000 n 0000000325 00000 n 0000000188 00000 n 0000000015 00000 n 0000000141 00000 n 0000000432 00000 n 0000132029 00000 n 0000000159 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 132106 %%EOF ess/doc/getting.texi0000664000175000017500000000067412506744203013037 0ustar eddeddThe latest released version of ESS is always available on the web at: @uref{http://ess.r-project.org, ESS web page} or @uref{http://lib.stat.cmu.edu/general/ESS/, StatLib} @comment @subsection ESS subversion repository @comment @include inst_svn.texi @subsection Git for ESS development For development and experimentation on new ESS features, there is now a GitHub branch for @ESS{}, available at @uref{https://github.com/emacs-ess/ESS}. ess/doc/hilock-sas.pdf0000664000175000017500000002213112423756516013233 0ustar eddedd%PDF-1.3 %╟ьПв 5 0 obj <> stream xЬ3╨3T0A(ЭЬ╦U╚UdШЩъШ(шYШШщYXЕМ,LбJЇГ╠\Є╣БЬм ╚endstream endobj 6 0 obj 56 endobj 9 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <> >> stream xЬэ▌Нy╙╚·7`╣В$@**╪P{*8Ь ^╢В ,[┴Iи╢Вlи`У №ЪМ"iF3ТlНх√▐ы┌kвПЩС?~$Ы╒▀ ]=╕┐┐?;;╙╓╓╓╓╓╓╓╓>ъЎjяЮ>}Z░▀у▌зOЯцЮ яхQ╝{∙щ█i█ъ╟▄МЎ░╜┤╡╡╡╡╡╡╡╡зn╖т╟м;▐= ЁЯWпЮ ч?пЮ┐{їъ╒Ўп╗╗╗O■№эїУы ▐~■ї¤л╧я╛~¤·∙ъ·█Ў{э╥&ЕrXo╘Лпj7┌╖╦╚сm6ўgmmmmmmэТ█cо╜╦КwэQ┌giлФъ▌╞Я▐юJw>|°Ї╦я╗Ugя~╜є╛╛qnдKПwН!╢B5╢─к^╜ЧЇIїnыG2} т{╢█№ ═Ы7_ їgwz¤qДUё.┤Yd╕ЮЮ╦°|анннннн]Z√°о╜{Ў■═╗wя╢эч╧Я_╝√Яў┴т]№фl╩ФRЖИў ╨■Nk]╗о6╛z7шЫ│╡d·я█Ы╫п_ ▄∙╙ПV;╜>№ёо3╒х■╠Юkя┤╡╡╡╡╡╡зm╫п╜╦НwU└~ўоя■·ыпўя▀o·¤··&╘урH╖Уї═┘*\╠K№цl╗чЎ.!Гп╜K▄>tэ]|п╪╡w┐~∙є▀ ■ў∙∙∙vыM╝√ЄЄmwz]╢2>hkkkkkkЧ╓▐пыыыЗўg?╓Ж┌█xў█o┐їn╣m╫п╜╦ечwя...~∙хЧ═Я?■Ёс├▌ √┐ Ан╖┴sм╙xи▐хО╥є╗w▀█o_n"с╧ЯAioS_▓$s&╨╓╓╓╓╓╓╓╬mў№ю╟хQ╝р╪ЙwЛ"▐,J╝k№ь▐╟П╖┐з·╡хэ>█ "Їп░E╢| Nf7Н}╠зўяЭ╒T#юЦ╖n;kbэ╣Eж║╫╗JУят h╞╜√╓7╚и┤╖№─┘k╢ыЬ╠■vЙь╪yk,ц╛АBИw√%▐ [8`И┘яk(─Рx╫8s:р╠Z$2ю┌ї│└щЭЗ▐Є█'Iw▌ЖдsЇм╔TБx╫^XЯLcЖэ ШF{2ї├i`ї°Fyрвqлnэ╗▓╛)я┌╗╞ЫeуЄ╕Їўщ╬7┌╬╨У{^$▐uv▐■│ъ vЭ╗L~дY╬ЪF№╞Й▀x╒ ^СЕYC╘wOy йч░`cлw/]│Яxa╓ьё.^x╦ЭOntлў3I:яFx·S▌╫ї═─;N═ёn|╬h/,6▐Е&Я2ЯСХ╣H80Щ°4"KЖНХ╕┴фўu}Хx└ЙШ2▐eЭ╣;╞x7ьe$▐╜ь║■oLvуЇЄ╚O╝5rП(ў╛я8│}╡в■g¤M╖╛pXОy╕▄нsaф@BYдzдН,RuЭ7l ЩO╓4G╤Ю^яаc<╥da╩С┤┌>К╨} s* jЕj ЬёОSс1└Й8Хxp"─;АEяхQ╝{ёт┼z╜^нVЭ ┐8┐Ш{╢ЬЬїц?Xо√√√H·:??▀lєх╦Ч│││▌ЎёЎхххгxў№∙є╚ЁтЗ'▐░lwwwС╡█xw{{╗Ik)╜]__┐}√VїОвЙw,[JїnяR.е√Ёс├╗wяTя~XUВDБ─;Ц-╜zЧя6█и▐╒╠яV _pТzАт╦Цxэ▌│g╧╞╗Уо▐ 3a(╠ъъkНГц,▐░lкwхя╥Йw╨2°┌╗╬Нi╨╡w╗SlлKo╛їspЭ█Дvlм▌НТЄц>rVС)Ez^╡6юь!о▐m√`╖F╓╕Э√ж╧з╖ Ф┌З╣П┌√о╢с.uь═╙р█~kqАc2мz╖╔v█F#с н▐5.вКДТ╬ўя°Оэ Ш°f=fVб]RzSE[╡B[дчмq'ЬdЦ▐9W╔╖фПН┼;Цm└╡w╗l╖UOxCп╜KЙeбЬ┘qd<л▐ ╞─ммсЎЧ╪ц:У█;ч▌ТЁ ЭЬ`┘rлwНl╖╡Kx#кwт]z╖щ├uЦпъ▓кwС}у│ъ4xwёв╩°▌;ёюёn╠сф╓з2`╬У╞;'g8Fe|s6х*╖ФфС▓cz.3л°YёnЁ9╙▐ы╥кфq╟\┬8F╩Ьлш<╗ю▓мx'█pt╩°▌╗э█pшЫ Н╙sэw█°Wzw<л╬╙Сы╓┌u╫Яэr╙E╜├v·й┬kууЎю╗'СqWПv╬зыnJМwJwйbкw╛ЗЦ9+FKПw▓╟(ё┌╗ЫЫЫ═Цggg╗╜BэЙо╜+AЩ│b4_н`┘Rкw█УTщ2лwёSлs)sVLA╝`┘RкwЫЬvuuХ■ ц,EяX╢Фъ]ХЩЁ2кw╗Ш─╠╒;ё`ZкwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(3Wя.╬/pРРn╜∙О┘╠╒;ёО╥Иw;╒;xD╝р╪й▐э╙кООx└▒S╜█зyу▌ъс хdХ╒у?;'╢П9зМ√h}97 бzWЮ CaVW{ гщЭO;Н№▐─;ОЭъ]y─;ёF(аz╖;╖;Й╓x{нЯ░ы▄&┤ccэnФФ╖яС│КL)╥єк╡qgqїn██╕5▓╞э▄7┤{╒║q"ЭGц┐√"k│╞ннJПwЫ'╔╖э╫т e)гz╫╕т*J:3G|╟vH/# ЮUhЧФЮ╟Фп┌∙&╥s╓╕#'┘>2ч°▌Чrч&О[√S╝р╪P╜л╥bY('EvyЪoЁмz7│▓Ж█_bЫ*▐Н╣SцРR╪╔YО]1╒;ё.╜█Їс"з2╖▓кwб}у'gуЭч╬9rv╡╜62n{▀J╝`!Tя┬я╞Nn]0еЗa=чо═╫╔YО]1╒╗*'ИДVеьШu╢nЁмтd┼╗┴чLsпTЛМ;ц╞╬Ж═9>л─%Э╦kуf┼;┘АХT╜█Э,p.┤*eўР┴│ъХ╣ю·│▌Cn~иw╪NKUxm|▄▐}Sж╘┘sЮsя┘ф╚┌▐qGФяФю(V1╒╗▀%╦Ь{Цяd;╩TRїо4e╬К=є╒ О]╒╗°й╒╣Ф9+ЎO╝р╪ХQ╜ГbИw╗Щлw╗Ш─╠╒;ё`ZкwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(кwЛвz░(│Wя.pР0Эї▄А│Wя─;ОЛx@щTя Лx@щTяFYнк╡╖√╙т■аtкwг╠я6гoФУ/╖є┘щЬ╪>цЬ2юtК╣╣ @їnЖ┬моЎF╙;ЯvO╪теS╜ЫБx'▐└■╠_╜█Эн█Эbk╝[╫Oчun┌▒▒v7J╜л┴уFНЇ▄8НЩvD╜█v╕io╓╕Э√ЖvпZ7Nдє╚ЬCwPя┌мq█лRtЭJя(]╒╗╞Ыh$▓t&Т°Оэм╨╚├╞ эТ╥єШВS;▀Dz╬wф$#█Gц▄{E╓fН▀2D╝р═_╜л╥bY(EEvь};Х╣]╥┘╜Зa%екЎх▄╬│иэ╡ёq{ўMЩRg╧С9ўЮMОмэw╠U┴D(▐P║RкwS\Хmоq9 БЗЗG е+иzwxт∙f▄Ўш█═┌C,°|7Е+вzWПJUWЛзе°Оэ Ш°~;fVб]RzS╜лWр┌╒╕▐ъ]UЛ#ННу=WГR▌V=╡s╥.iunРR╜ m3x▄Ўко)▐0Ч∙лwUZ, хд╚О#┐┘0xV╜─√яzє\╓╔┘▄д8ь▄ngоК╕x,Kb└╕╣Г└МJй▐Йw¤▌╬я║жsвёоjЭЦЎ(Къ]Рx?█;zК#Нw)C89 └\Jй▐U9Ч╨ЕVеьШЮ∙╞╠*╛AV╝√∙ч╘╫▐M°gчТD^{ЧШф╟M?9Кw▓│(иz ОjX[ЕwL▄=dЁмт_Аmt .Ёгх#╛9█^█╪а▒Wя╫o█┘о■чАoWlбp▀`╫ОЬ?э▄╜ўЛ▒█хб?C▌VJw╠кФъ]БoГ┼═ъ$│┬С~ПAщАT╜+Mq│:╔╕pдёf4їоў╫уfQтмN/▐ї■.1╨VDїО$зяАцо▐Эл╩LiюъЭx0)╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜X╒;АEQ╜XФ╣лw8╚ЕXпчЮpцо▐Йwщ─; Бъ▌ёяАкw{┤┌D▓ ╗яАкw{4o╝{}s│∙ ═ы╫NaА═]}Ы╗l вzWЬ`(╠OHЫДЧя▓6╬▓}0эгgаMїо8т0╞№╒╗╒Cc¤kкэ║Umaч6бkwгдНС│КL)╥єк╡ёг╥╥ЎЬlїpZ╢Э╪vkл┌y█·┬Ў┌°╛)vйэЯЭQ╧9\ШJ╒╗zTк║X<-┼wl┴─1fVб]RzS╜лч╣Ў╡wН┤ 3╥sя╞ Нш╓Y╠я`*єWяк┤X╩IСG~│aЁмz7Иў38▐u╓ъЎФ╪rу]#╖9] √SJїN╝ыяvt╝kЯД═к▐EЎНярРTяВяR┬_(▒х╓RтЭУ│0ХRкwU╬%tбU);жg╛1│КoРя~■9ю┌╗╬J^теx╜√╞%^{'█└$ к▐┼┐гZ╓Vсw<л°`╞┐ №h∙аo╬VБo╚╢╫╢7шь6┤o╚.█E╛9лt*еzWр{q│Zn·Q║А T╜+Mq│ААєWяz=n%╬J╝Q╜#Йx$Ш╗zўc&СR╜╗╜╜MяЁЄЄ2зz'▐L*еz╖ЙwЫ┤Ц╥█їїї█╖oUяfУX╜█е╡╕═6═xзzpHщ╒╗БёNїрРTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяeюъ▌┼┼4╟q ╓ы╣gБ╣лwт]:ёHаzw<─; Бъ▌н6Сl┬ю─; Бъ▌Йw└сй▐' ┼; Бъ]q─;`М∙лwлЗ╞·!╓T?┌uл┌┬╬mB;6╓юFIII#gЩRдчUkуG=$╟╗═Эў░╣8зиИъ]=*U] ,ЮЦт;╢Г`bъ3л╨.)=Пп▐Йwp╩цп▐Ui▒,ФУ";О№f├рYїnя╟╔Y`МRкwт]╖тР@ї.шxуЭУ│p╩Jй▐U9Ч╨ЕVеьШЮ∙╞╠*╛AV╝√∙gN╝УэрdT╜ЛG╡ мн┬;&ю2xVё/└6:М°╤Є┤─жt'оФъ]Бaд╕Y%╟;┘NYA╒╗╥7+б H0їоў╫уfQтм─; A╒;ТИw@В╣лw0Х╣лwт└дTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`QTяEї`Qfо▐]Ь_Ls<╕╗┐Ы│z'▐LыЯ╗"kUяОМъ▌>нкj=ўАгz╖Oтppкwх АTя╩#▐#P╜[=┤╓╒ўF╒ 7л┌┬╬mB;6╓юFI O#gЩRдчUkу╬┬╩и▐╒гR╒Х└тi)╛c;&ж1│ эТ╥│ъ0B╒╗*-ЦЕrRd╟С9iЁмz7Иў#▐#S╜я╥╗S╜ яА#TLїо╩╣Д.┤*e╟ЇЁ4fVё ▓тЭ┤ф(йz ОjX[ЕwL▄=dЁмт_Аmt .p{\АиbкwЖШ2gURїо4e╬ *▒zwss│i▄▀▀ЯЭЭmWЕ┌∙╒╗▐_ПЫEЩ│шУR╜█┤│·Їo╬╠&еzW=Ьu╜║║J№┐sЎДмХ7а0ўўў╜╒╗мl╖∙┐ъ▌ яа4wwwС╡╗kяRо║█╢///UяNИxеIй▐m┐9Ы╥█їїїаo╬r┤─;(Mbїn╧┐{WВ╞┐Q1╗Ф_c▐╟Ь3Z╝А╥дWяЎ∙╗wЕ╚·б╗╜■*^╓┐Ь6с4Є{яа4кw5тЭx╟яфлwїЯ/nЗЫ╬√5■O╩╞ў э╛█&еє╚ЬГжп═╖╢*=▐m>qєиJ▄&╖zўЄх╦Ўf?~▄6Онz╫╬7ы└┌▐?#=ўn▄╗{hUc╬Эa.qm╓╕╡?┼;(═Аъ]#сэ▓]ud╒╗╬Z▌Ю█Tё.>чм∙▐цёЦN╬@iЖ]{╖KxїlWYїо7▐╡╧WfUяB√╞O╬╞;╧Эsфьj{md▄Ў╛ХxЕ|э▌&с5▓]╡иъ]JРJ<П▀8▒Зa=чо═╫╔Y(═isvЁulЭd]хЦ>▒┴sО╧*qIчЄ┌╕YёN╢АЁ═┘НuWZк┬k█tv┌7eJЭ=Wс9ўЮMОмэ7pDЙёNщц┤лwМЦяd;8МУп▐1ОпV@iлw777╒C<;;█о ╡UяNЛxеIй▐mпЫJў(▐▌╛╕┌├┤8ЬGёюыЛл█╧ў╒┘┘·■~uv╢╔У┌┌┌┌┌┌┌┌┌╟╒nVя╛■}?o▐`Мfїюя╧e╧╬ЎїЛ╒ї ╓х╠G[[[[[[[╗мЎ╛лw╫/╬п √J╚a:Ь|#mцє╜╤7лэЦэ═v=дt2∙мШVш^.S╩l<уF>дSЮ)├zЮ▌Б_╛ :0~─╥^╗Ў7Яy▀╦:ЯeНз╪ўЕЁьi╨P ёqKxI▀я╡w█J█n∙█ля7╟яЯюVk╖╓╖┘_Ю╜╛:▀О;ж■1ЯФc▀▐J╫Яю:╖┘оЭЁ╕▐■Ш╒ь╖Oсэ▌гw{√я█Г╧ЙП╧·│ж■8╠єhўx█oш1Щ■╪О┐VD·=G┌╖a╗Я╞6ї√ё√═°░¤╝╖sу6п?пп║▐J[╟╕[▐yЫ╘╖э█╣q_дя[7w▀°╕╣ПЯ┘_:я╗ЇўЕ╚уpOяeН╟U╗ ╚s?хy7╒▄6╖C¤╛є║1цqww┐O>ЯмЎ~лwэ╧Н%З№ RfoфФ& ИP┬gОc╤√Ё┘[d╦кї9Є└wYd─эк▄)MЄ╩РrПд┐(5nч╣Ю╣пвї?уХH╜│є0ўээ3w▄е╜╝oMЄ0ЮЎu&kш╜n3lJэgх■^ {_хz Ьўa╣╟kяR>Я╒╖┘╒Н:?пД>╟┤?F>gu▌^·ёVс·\и╢╫иI┤oЗЯл╛┐n═к│ xх╤╨П?╙4fХ╛яьўWчg╩▌у-ЇYmd=#2nу╣У8nJm ы╪{oУauОP═)▐g╩mШR╧█>_ъ╖s√6?Ёc,¤╢Jм+дўЯuэWё╫▐мq<~_c█яУь█[√∙\╪▀{YJ]░wЫ ч╓{ь)╖╒░v№╛Ыфїjяэ¤Uя:skoцн┬┴<▓░╖ч°╛│h\ЬС√i8▓6^uH№s@н"л┌С5л2╡?в┼ы(СПрY╟█.П ╖sГЇ9DЦПй▐е<к│f▀ ■╔╗¤ ЇГ/>спrcJ/щ7я░В╙>кwщ┼Ю╬9▐w╠═°^6╔▌┤┐╥]яУ╜{Ыо┐°$╛z7▐хму┌╗°╡o╗╓╞?╟Oї╣│7SG>;FЎЭъx|.йju╡x.¤┌╗╬э5╣╚ucо!╦┌╖1╧ё╫о╛▌оы4ъаё█╣ў·Х°╕э:S╩╕Нm╬ю}nи[ лe&▐ЖСчQ№║Щ╨¤{╚╟Xч▒─_{ы╧ж▄чi╩╡wЭ√╞Wc╞\kЙЯ/Jму~■{~еЬ╟╪╙{┘░·w№vИП█;ч°|z╧7Ї▐·.A√5$Є|хю[\їnфзЦ▐КQ9б─zUnї.^∙ш-БД>м$кяЪFhГ°╛КWw┌[Е+ЭKту╢чР▐є°KCB╧═цТ├^J5мИzрїVg`@ї.еЗ─■│z╬║ў'пH%▐їc █щ╧ю▐Y┼ХS╜█SyxЁ|z7╪kс0╥ybё°└ ║Ўо╖╢╫√yи╖&Qц╡wб╧ ёхбЪDи>W╒кwС╧Эё:_Ve√k_[┘{\ёы╒╩i╟п═Ё7ы┌╗Ў╥ы ╜uюм9tn3∙uTS╜цд╦╛┐8°v.є┌╗╜╛╢~╠D╞э╜│Ў ╜>ї╡wбaф╪' ╬l╓ы╠^п╜╦═єv1╒╗?ё │зъ]o╧щцN)╖чЇYХ)^╜█mРЄg╓ёvVM\Ф>bяlР╗c╩Д│*Ч)#о░Ne╪лh╒UГLYY▀╖╖Я1ужЎ╛0U1/4БSл▐эcVё√eЎъ]╩н1WЁ8шя▐эЄї╧уя·=з╬яЇ%ЮУ>Ёo n╖┐╗┌╕M:Пw╗╢q6╓╢√o▄U╫┌╞Є╞7gы█м[u╕╞ЄФq█▀Gы▌╖╠vф;\э█$Є\╪=пYl▀╫С▀6ЛЇУ√Щ▓}UP{╬#┐sй═ЗnЯ╨мz_7Я Ну:Ё╡бэ·D╟┴╢jNСяу7╓ж╫ЬB√Ж^oыs3ю°ўЪ°√Bчc5k▀╨уv@НнР▀╜kWтsO5┼·аСk√ж}nF╞э}╜К┐Wж}ш▀╜ЫQQУHQH╔░Ёq╦|y?LН :э¤▀Ь-дf6цsб╢╢╢ЎМэ_╗s°:eb-ди9╧5яe┌йэ} Ы│╥~п╜╙╓╓╓╓╓╓╓╓>p√Q╝{ўсKuVU╗·Э╢╢╢╢╢╢╢╢Ў▒╡┼╗/^м╫ы╒j╒∙ єєюo╓0╠¤¤}o·║╜╜MяЁЄЄЄQ╝{■№ydkё`Zww▒пBят▌&неЇv}}¤Ўэ[╒;А┘$Vяvi-n│M3▐й▐Rzїn`╝S╜8д┴╒╗Ч/_~№°▒╤Ыъ└╠ЖUя6┘n█h$<╒;АЩ╣Ў`Qлw■∙ч┘┘┘vс&F┌кwsJй▐m┌Y}к▐╠&▒z╖¤3^╖█╢Ы?kмzpHщ╫▐еЇ╓ё│╞кwЗфwяe╪7g3~EїрРWяR╓XїрР№ю└в╕Ў`Qлw777Йк▐╠)еz7ъgН8vт└в|Лwщgs(\▐й\ ў z┴[[ endstream endobj 8 0 obj 8302 endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000384 00000 n 0000008972 00000 n 0000000325 00000 n 0000000188 00000 n 0000000015 00000 n 0000000141 00000 n 0000000432 00000 n 0000008952 00000 n 0000000159 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 9027 %%EOF ess/doc/announc.texi0000664000175000017500000000526112423756516013044 0ustar eddedd\input texinfo @c -*-texinfo-*- @comment %**start of header @setfilename announc.info @settitle ESS - Emacs Speaks Statistics @comment %**end of header @include ess-defs.texi @node Announce @comment node-name, next, previous, up @chapter ANNOUNCING ESS @cindex ANNOUNCE The ESS Developers proudly announce the release of ESS @include ../VERSION @c -------------------------------------------------------------------- Emacs Speaks Statistics (ESS) provides an intelligent, consistent interface between the user and the software. ESS interfaces with R/S-PLUS, SAS, BUGS/JAGS, Stata and other statistical analysis packages under the UNIX, GNU Linux, Microsoft Windows, Mac OS X and other operating systems. ESS is a package for the GNU Emacs and XEmacs text editors whose features ESS uses to streamline the creation and use of statistical software. ESS knows the syntax and grammar of statistical analysis packages and provides consistent display and editing features based on that knowledge. ESS assists in interactive and batch execution of statements written in these statistical analysis languages. ESS is freely available under the GNU General Public License (GPL). Please read the file COPYING which comes with the distribution, for more information about the license. For more detailed information, please read the README files that come with ESS. @c And to clear up any possible confusion; the name is ESS, NOT ESS-mode. @c Thank you :-). @menu * Latest Version:: * Current Features:: * Requirements:: * Stability:: * Mailing List:: * Reporting Bugs:: * Authors:: * License:: * New Features:: @end menu @node Latest Version, Current Features, Announce, Announce @section Getting the Latest Version @include getting.texi @node Current Features, Requirements, Latest Version, Announce @section Current Features @include currfeat.texi @node Requirements, Stability, Current Features, Announce @section Requirements @include requires.texi @node Stability, Mailing List, Requirements, Announce @section Stability @include stabilty.texi @node Mailing List, Reporting Bugs, Stability, Announce @section Mailing List @include mailing.texi @node Reporting Bugs, Authors, Mailing List, Announce @section Reporting Bugs @include bugrept.texi @node Authors, License, Reporting Bugs, Announce @section Authors @include authors.texi @node License, New Features, Authors, Announce @section License @include license.texi @node New Features, , License, Announce @section New Features @include newfeat.texi @bye @c Remember to delete these lines before creating the info file. @iftex @lucidbook @bindingoffset = 0.5in @parindent = 0pt @end iftex @comment Local Variables: @comment TeX-master: "announc.texi" @comment End: ess/doc/README.SPLUS4WIN0000664000175000017500000003275112423756516012743 0ustar eddedd-*- text -*- ESS: Using S-Plus 4.x for Windows ================================= (also see detailed help at the end, for more information) Beginning with ESS 5.1.2 we are able to use inferior iESS mode to communicate directly with a running S-Plus 4.x process using the Microsoft DDE protocol. We use the familiar (from Unix ESS) C-c C-n and related key sequences to send lines from the S-mode file to the inferior S process. We continue to edit S input files in ESS[S] mode and transcripts of previous S sessions in ESS Transcript mode. All three modes know the S language, syntax, and indentation patterns and provide the syntactic highlighting that eases the programming tasks. ESS (originally S-mode) was initially designed for use with S and S-PLUS(tm) on the Unix computers with interprocess communication using the Unix standard input and standard output protocols. S-Plus 4.x was designed for the Microsoft Windows 95/98/NT and uses DDE as the interprocess communications protocol. The protocols are very different. See the document README.S for detailed information on: - general Emacs features. - Editing files. - using transcripts. - Philosophies - Scenarios for use (possibilities, based on actual usage) The following are not identical in MS Windows to the similarly named sections in README.S and are covered in this document: - running an S process as an inferior process to Emacs - ESS-help: assistance with viewing help INSTALLATION ============ The easiest way to install ESS on Windows machines is to place the unzipped directory tree on the machine in, for specificity, c:/emacs/ess-5.1.21/ Then add the following line to your ~/_emacs (or ~/.emacs) file: (load-file "c:/emacs/ess-5.1.21/lisp/ess-site.el") For improved startup efficiency (but not execution efficiency) you can follow the more elaborate installation procedures described in README.S. These procedures depend on your already having installed /bin/sh and make, programs that come with the Unix-like utilities from Cygwin: http://sourceware.cygnus.com/cygwin/ iESS: Inferior ESS processes ============================ iESS (inferior ESS) is the mode for interfacing with active statistical processes (programs). This mode behaves very differently with S-Plus 4.x for Windows than it does for the Unix versions of S-Plus. S-Plus 4.x for Windows is full-featured Windows program. It has GUI subwindows, icons, menus, buttons, and Windows-style interprocess communication. By contrast Unix versions of S-Plus have only the equivalent of the Commands window (running in an ordinary xterm (or other shell window)) and the Graphics windows. iESS for S-Plus 4.x is completely compatible with all the Windows features. At this time it has been used extensively with NTemacs 20.3.l http://www.cs.washington.edu/homes/voelker/ntemacs.html http://www.cs.washington.edu/homes/voelker/ntemacs/ftp/ iESS uses the ddeclient program included as part of the NTemacs distribution. We recommend that the user install bash as the shell under emacs. http://sourceware.cygnus.com/cygwin/ Our programs do work should the user choose to use one of the Windows shells (command.com on 95/98, or cmd.exe on NT). The starting key sequence depends on the shell the user prefers: bash users: The S-Plus user starts S-Plus from within emacs with "M-x S" (or with "M-x S+4"). msdos users: The S-Plus user starts S-Plus from within emacs with "M-x S+4-msdos". msdos users MUST remember to close S-Plus cleanly and then close the *S+4 ddeclient* buffer with `exit', or take the risk of not being able to shut down the computer cleanly. Either of these emacs command sequences starts the usual S-Plus 4.x window. There may be a slight delay before the emacs window can be used. The S-Plus window must have a visible Commands window placed on the left side of the S-Plus window. We recommend placing the S-Plus window on the left side of the screen and the emacs window on the right side of the screen. This placement permits activity in the S-Plus commands window to be monitored while lines are sent over from the active emacs window. The user then sends individual lines or groups of lines to the S-Plus process using the emacs command C-c C-n (for lines), C-c C-r (for regions), C-c C-b (for the entire buffer). The lines magically appear in the S-Plus Commands window, as if they had been typed manually or been sent by mouse copy and paste commands. The results of the commands appear in the S-Plus Commands window. No results come back to the emacs process (this is the major difference between the Unix and Windows actions of ESS). An entire file can be sent over with C-c C-l. In this case, only the command `source("filename")' appears in the S-Plus Commands window. No input statements or output from the commands appear. All global assignments have been made. In order to create an S transcript it is necessary to (1) highlight a region in the S-Plus Commands window (the easiest way is to use the Ctrl+A keystroke or the "Edit/Select All" menu command) and then copy Ctrl+C it. Ctrl+C is a standard Windows keystroke. (2) open an ESS Transcript file, for example myfile.st, in emacs. The suffix ".st" stands for S Transcript. When a myfile.st file is created or read it always comes in as a read-only file. This is a protection to keep the user from accidentally changing an historical file. Make it writable with C-x C-q and the paste the copied region using C-y (the standard emacs yank command (which corresponds to the Windows paste)). Caution: switching from the emacs window to the S-Plus window causes finger confusion as the keystroke commands are not the same. Once the transcript has been created in an emacs buffer it has most of the standard iESS (inferior ESS) mode features, including sending lines back to the active statistical process (program). This features include: - proper indenting, generated by both [Tab] and [Return]. - color and font highlighting based on syntax. - ability to resubmit the contents of a multi-line command to the executing process with a single keystroke [RET]. - transcript recording and editing Optional Ways to Start S-Plus 4.x with emacs ============================================ 1. If you already have an S-Plus 4.x window and wish to add emacs access to that window, then you can start an emacs iESS buffer with "M-x S+4-existing" (bash users) or "M-x S+4-msdos-existing" (msdos users). 2. If you really like the S-Plus to run inside an emacs *S+4* buffer, just the way it does in Unix, then you can start an emacs iESS buffer with "M-x Sqpe+4". There is no interactive graphics available in this arrangement. Postscript graphics to a file are available. None of the GUI menus and buttons are available. ESS-help: assistance with viewing help ====================================== The key sequence C-c C-v entered from any ESS buffer sends a help request to the running S-Plus. Help files in S-Plus 4.x for StatSci distributed functions use the Windows Help mechanism. They do not appear in emacs buffers. Recommended Settings on first use of a new _Data directory ========================================================== The first time you use S-Plus in a new directory you must do some setup. - Click Window/Commands Window - Click Options/General Settings/Startup. Click Select Data Dialog off. Click Command Line on. Click Object Browser on. Assuming you have downloaded and are using the gnuserv/gnuclient programs: http://www.cs.washington.edu/homes/voelker/ntemacs/contrib/gnuserv.zip - Click Options/General.Settings/Computations. Change Editor to gnuclient. Change Pager to gnuclientw. Note these are different. The behavioral difference is that gnuclient will freeze S-Plus until "C-x #" is typed to the emacs buffer. This is the correct behavior when you are using the S function edit(). With emacs as your editor, you are less likely to need the edit() function. - Click Options/Command Line Options/Options/Key Scroll/Page Keys. - Click Options/Graph Options/Options/Auto Pages/Every Graph. - Click Options/"Save Window Size/Properties as Default" History of M-x S+4 and related functions ======================================== In May 1998, Brian Ripley wrote an early version of an interface between ESS and S-Plus using the DDE concept. The original version demonstrated feasability of the concept. It was limited to a single line (that is, C-c C-n worked correctly when the S statement was complete on a single line). The region and buffer commands C-c C-r and C-c C-b did not work. In December 1998, Richard Heiberger completely rewrote the DDE interaction to use the ddeclient program that was first distributed with NTemacs 20.3.1. He further developed the remaining functions to the point where all ESS functions now work with S-Plus 4.x on the Windows operating systems. Detailed Help For S-PLUS 2000 and the License Manager (Thanks to David Brahm, ) ===================================================== Found the solution to getting Sqpe-mode to work with the license manager - I set S_ELMHOST in Emacs with (setenv "S_ELMHOST" "123.45.67.890"), instead of trying to make it a command-line argument. Thus I was also able to reduce the number of modifications to "ess-sp4-d.el". I still change the delay time by hand (from 30 seconds to 10); I wish this were a variable so I could just put (setq-default inferior-ess-delay 10) in my .emacs. I've attached my new installation instructions, with these modifications. -- David Brahm How to Install S-Plus, Emacs, ESS, and Cygwin on NT. (David Brahm 11/9/99) 1) S-Plus: >From MathSoft (800)569-0123 Desktop icon "C:\Program Files\sp2000\cmd\splus.exe" u:/splus/init.s s_proj=p:/home/s s_elmhost=123.45.67.890 Start in P:\Home\S U:/Splus/init.s contains: library("Lib", first=T, lib.loc="u:\\Splus") U:/Splus/Lib contains directories: _Data, _Prefs, Flat, and Source Resize S-Plus window to match Emacs window. In Options > General > Startup, check "Command Line" Options > "Save Window Size/Properties as Default" 2) Emacs: get "em2041.zip" for FAQ Extract (with WinZip) to C:\, thus creating C:/emacs-20.4 Double-click on C:/emacs-20.4/bin/addpm.exe, copy icon to desktop. In "Emacs" icon shortcut, change to Start in P:/Home Create file C:/emacs-20.4/site-lisp/site-start.el (see below). User can put additional customization in P:/Home/.emacs 3) ESS: get "ess-5.1.21.zip" Extract to C:\emacs-20.4, thus creating C:/emacs-20.4/ess-5.1.21 In C:/emacs-20.4/ess-5.1.21/lisp/ess-sp4-d.el: Change (sleep-for 30) to (sleep-for 10) (twice) 4) Cygwin: get "full.exe" (or "usertools.exe") Double-click on full.exe and accept all defaults, installing to C:/Cygnus Make directories C:/bin and C:/tmp Copy C:/Cygnus/Cygwin-B20/H-i586-cygwin32/bin/sh.exe to C:/bin Right-click My Computer > Properties > Environment, and append this to Path: ";c:\bin;c:\Cygnus\Cygwin-B20\H-i586-cygwin32\bin" *or* put this line into C:/autoexec.bat: set PATH=c:\bin;c:\Cygnus\Cygwin-B20\H-i586-cygwin32\bin W95/98 only: If an error "Out of environment space" occurs, add to config.sys: shell=C:\command.com /e:4096 /p Here is my site-start.el file: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; (setenv "HOME" "P:/Home") (setenv "PATH" "C:/Cygnus/Cygwin-b20/H-i586-cygwin32/bin;C:/Progra~1/sp2000/cmd") ; ESS and customization: (load "C:/Emacs-20.4/ess-5.1.21/lisp/ess-site") (setenv "SHELL" "C:/Cygnus/Cygwin-b20/H-i586-cygwin32/bin/bash") (setenv "S_ELMHOST" "123.45.67.890") (setenv "S_FIRST" "source(\"U:/Splus/init.s\")") ; Initialization file (setenv "SHOME" "C:/Progra~1/sp2000") (setq-default inferior-Sqpe+4-program-name "c:/Progra~1/sp2000/cmd/Sqpe") (setq ess-ask-for-ess-directory nil) (setq ess-directory "P:/Home/S/") (setq ess-execute-in-process-buffer t) (make-local-variable 'comment-indent-function) (setq-default comment-indent-function 'ess-comment-indent) (fset 'run-s "\C-x2\M-xS\C-m") (global-set-key "\M-s" 'run-s) ; ESC-s runs "run-s" which starts S ; Window size: (set-frame-size (selected-frame) 80 56) ; Always auto-fill: (setq-default auto-fill-function 'do-auto-fill) (setq-default fill-column 79) ; Macros and set-keys: (global-set-key "\C-u" 'query-replace-regexp) (load "hscroll") (defun flat (tabw) "Turns off line-wrap; prefix sets tab width." (interactive "p") (turn-on-hscroll) ; (setq truncate-lines 1) (if (> tabw 1) (setq tab-width tabw)) (redraw-display)) (global-set-key "\C-c\C-f" 'flat) ; Fonts (uncomment the next line for a bolder font): ; (set-default-font "-adobe-courier-bold-r-normal--*-140-*-*-m-*-iso8859-1") (global-font-lock-mode t) (custom-set-variables) (custom-set-faces '(font-lock-comment-face ((((class color) (background light)) (:foreground "Firebrick")))) '(font-lock-string-face ((((class color) (background light)) (:foreground "SeaGreen")))) '(font-lock-keyword-face ((((class color) (background light)) (:foreground "MediumBlue")))) '(font-lock-constant-face ((((class color) (background light)) (:foreground "VioletRed")))) '(font-lock-type-face ((((class color) (background light)) (:foreground "Goldenrod")))) '(font-lock-variable-name-face ((((class color) (background light)) (:foreground "Blue")))) '(font-lock-function-name-face ((((class color) (background light)) (:foreground "VioletRed")))) ) ess/doc/README.Microsoft0000664000175000017500000000373112423756516013334 0ustar eddeddIntroduction ============ S-PLUS use ========== SAS use ======= Microsoft problems ================== See the file `README.SPLUS4WIN' as well, for more information and details. * (RMH) system freeze and ctrl-m, a solution for some cases. Frequently, when the *shell* buffer freezes while running either COMMAND.COM or a DOS or Windows program initiated by command.com, it can be unfrozen by entering the key sequence C-q C-m RET into the frozen buffer. What I think is happening is the coding-system got confused. Command.com is waiting for the C-m C-l sequence and it only sees the C-l, which it knows is not the end of the line. When we manually give the C-m, followed by RET, it is happy and completes parsing the line. For example, from a *shell* buffer running bash (with ps in the path): command.com ps C-q C-m RET exit C-q C-m RET command.com /c date RET C-q C-m RET command.com /c date C-q C-m RET * (RMH) Changes in ess-r-d.el for Windows One of the design goals in ESS was to make it almost unnecessary for users to make modifications to the ess-*.el files. We have split the R function into two clones. R-unix is the old R function. It uses the starting argument "-no-readline ". R-microsoft is designed for Windows. It uses the starting argument "-ess ". We detect the operating system and fset the name R to whichever is appropriate. No user changes are required. M-x R always works. * (RMH) msdos.el Start an msdos shell inside an NTemacs that normally uses bash as its shell. It should have been easy, but had many parameters that needed to be set. I am sending a copy of this to the Ntemacs mailing list. I think this function should be merged into the Ntemacs distribution, but for the moment I am attributing it to us. S-PLUS problems =============== SAS-problems ============ ess/doc/help-bugs.texi0000664000175000017500000001533712423756516013276 0ustar eddedd@ESS{[BUGS]} was originally designed for use with BUGS software. Later, it evolved to support JAGS as a dialect of the BUGS language via @ESS{[JAGS]}, however, @ESS{[JAGS]} is documented in the section Help for JAGS. @ESS{[BUGS]} provides 5 features. First, BUGS syntax is described to allow for proper fontification of statements, distributions, functions, commands and comments in BUGS model files, command files and log files. Second, @ESS{} creates templates for the command file from the model file so that a BUGS batch process can be defined by a single file. Third, @ESS{} provides a BUGS batch script that allows @ESS{} to set BUGS batch parameters. Fourth, key sequences are defined to create a command file and submit a BUGS batch process. Lastly, interactive submission of BUGS commands is also supported. @comment node-name, next, previous, up @node ESS(BUGS)--Model files, ESS(BUGS)--Command files, ESS for BUGS, ESS for BUGS @section ESS[BUGS]--Model files Model files with the @file{.bug} extension are edited in @ESS{[BUGS]} mode if @code{(require 'ess-bugs-d)} was performed. Model files with the @file{.jag} extension are edited in @ESS{[JAGS]} mode if @code{(require 'ess-jags-d)} was performed. Three keys are bound for your use in @ESS{[BUGS]}, @kbd{F2}, @kbd{C-c C-c} and @kbd{=}. @kbd{F2} performs the same action as it does in @ESS{[SAS]}, @xref{ESS(SAS)--Function keys for batch processing}. @kbd{C-c C-c} performs the function @code{ess-bugs-next-action} which you will use a lot. Pressing it in an empty buffer for a model file will produce a template for you. @kbd{=} inserts the set operator, @code{<-}. @comment @ESS{[BUGS]} supports "replacement" variables. These variables are @comment created as part of the template, i.e. with the first press of @kbd{C-c C-c} @comment in an empty buffer. They are named by all capitals and start @comment with @code{%}: @code{%N}, @code{%DATA}, @code{%INIT}, @code{%MONITOR} and @comment @code{%STATS}. When you are @comment finished editing your model file, pressing @kbd{C-c C-c} will perform @comment the necessary replacements and build your command file for you. @comment @comment The @code{%DATA} variable appears in the line @code{data in "%DATA";}. On the @comment second press of @kbd{C-c C-c}, @code{%DATA} will be replaced by the model file name @comment except it will have the @file{.dat} extension. If your data file is named @comment something else, then change @code{%DATA} in the template to the appropriate @comment file name and no replacement will occur. @comment @comment The @code{%INIT} variable appears in the line @code{inits in "%INIT";}. @comment On the second press of @kbd{C-c C-c}, @code{%INIT} will be @comment replaced by the model file name except it will have the .in extension. @comment If your model will be generating it's own initial values, place a @comment comment character, @code{#}, at the beginning of the line. Or, if your init @comment file is named something else, then change @code{%INIT} in the template to the @comment appropriate file name. @comment @comment The @code{%N} variable appears in the line @code{const N = 0;#%N}. @comment Although it is commented, it is still active. Notice that later on in @comment the template you have the line @code{for (i in 1:N)}. The BUGS @comment constant @code{N} is the number of rows in your data file. When you @comment press @kbd{C-c C-c}, the data file is read and the number of lines are @comment counted (after @code{%DATA} is resolved, if necessary). The number of @comment lines replace the zero in the @code{const N = 0;} statement. @comment @comment The @code{%MONITOR} variable appears on a line by itself. Although it @comment is commented, it is still active. This line is a list of variables @comment that you want monitored. When you press @kbd{C-c C-c}, the @comment appropriate statements are created in the command file to monitor the @comment list of variables. If the line is blank, then the list is populated @comment with the variables from the @code{var} statement. @comment @comment The @code{%STATS} variable is similar to the @code{%MONITOR} variable. @comment It is a list of variables for which summary statistics will be @comment calculated. When you press @kbd{C-c C-c}, the appropriate statements @comment will be generated in your command file. @comment @comment Please note that the @code{%DATA} and @code{%INIT} variables are only @comment replaced on the second press of @kbd{C-c C-c}, but the actions for @comment @code{%N}, @code{%MONITOR} and @code{%STATS} are performed on each @comment press of @kbd{C-c C-c} if you re-visit the model file. @comment node-name, next, previous, up @node ESS(BUGS)--Command files, ESS(BUGS)--Log files, ESS(BUGS)--Model files, ESS for BUGS @section ESS[BUGS]--Command files To avoid extension name collision, @file{.bmd} is used for BUGS command files and @file{.jmd} for JAGS command files. When you have finished editing your model file and press @kbd{C-c C-c}, a command file is created if one does not already exist. @comment However, the command @comment file was created, it recognizes two "replacement" variables: @comment @code{%MONITOR} and @code{%STATS}. @comment @comment Two @code{%MONITOR} variables appears on lines by themselves. @comment Although they are commented, they are still active. Between them @comment appears the necessary statements to monitor the list of variables @comment specified in the model file. The behavior of the @code{%STATS} @comment variable is similar. @comment When you are finished editing your command file, pressing @kbd{C-c C-c} again will submit your command file as a batch job. @comment BUGS batch @comment scripts are provided for both Unix and DOS in the @file{etc} @comment sub-directory of the @ESS{} distribution. The Unix script is @comment @file{backbugs} for BUGS major version 0.6 and @file{backbug5} for @comment 0.5. The DOS script is @file{BACKBUGS.BAT} for BUGS major version 0.6 @comment only. These scripts allows @ESS{} access to BUGS batch features that @comment are not readily available with the batch scripts that come with BUGS. @comment node-name, next, previous, up @node ESS(BUGS)--Log files, , ESS(BUGS)--Command files, ESS for BUGS @section ESS[BUGS]--Log files To avoid extension name collision, @file{.bog} is used for BUGS log files. The command line generated by @ESS{} creates the @file{.bog} transcript file. @comment from the @file{.log} file when the batch process @comment completes. If you need to look at the @file{.log} file while the batch @comment process is running, it will not appear in @ESS{[BUGS]} mode. You may @comment find @kbd{F2} useful to refresh the @file{.log} if the batch process @comment over-writes or appends it. Similarly, @file{.jog} is used for JAGS log files. ess/doc/help-sas.texi0000664000175000017500000007044212423756516013122 0ustar eddedd@ESS{[SAS]} was designed for use with @SAS{}. It is descended from emacs macros developed by John Sall for editing @SAS{} programs and @code{SAS-mode} by Tom Cook. Those editing features and new advanced features are part of @ESS{[SAS]}. The user interface of @ESS{[SAS]} has similarities with @ESS{[S]} and the @SAS{} Display Manager. @comment node-name, next, previous, up @node ESS(SAS)--Design philosophy, ESS(SAS)--Editing files, ESS for SAS, ESS for SAS @section ESS[SAS]--Design philosophy @ESS{[SAS]} was designed to aid the user in writing and maintaining @SAS{} programs, such as @file{@var{foo}.sas}. Both interactive and batch submission of @SAS{} programs is supported. @ESS{[SAS]} was written with two primary goals. @enumerate @item The emacs text editor provides a powerful and flexible development environment for programming languages. These features are a boon to all programmers and, with the help of @ESS{[SAS]}, to @SAS{} users as well. @item Although a departure from @SAS{} Display Manager, @ESS{[SAS]} provides similar key definitions to give novice @ESS{[SAS]} users a head start. Also, inconvenient @SAS{} Display Manager features, like remote submission and syntax highlighting, are provided transparently; appealing to advanced @ESS{[SAS]} users. @end enumerate @comment node-name, next, previous, up @node ESS(SAS)--Editing files, ESS(SAS)--TAB key, ESS(SAS)--Design philosophy, ESS for SAS @section ESS[SAS]--Editing files @ESS{[SAS]} is the mode for editing @SAS{} language files. This mode handles: @itemize @bullet @item proper indenting, generated by both @key{TAB} and @key{RET}. @item color and font choices based on syntax. @item ability to save and submit the file you are working on as a batch @SAS{} process with a single keypress and to continue editing while it is runs in the background. @item capability of killing the batch @SAS{} process through the @file{*shell*} buffer or allow the @SAS{} process to keep on running after you exit emacs. @item single keypress navigation of @file{.sas}, @file{.log} and @file{.lst} files (@file{.log} and @file{.lst} files are refreshed with each keypress). @item ability to send the contents of an entire buffer, a highlighted region, or a single line to an interactive @SAS{} process. @item ability to switch between processes which would be the target of the buffer (for the above). @end itemize @ESS{[SAS]} is automatically turned on when editing a file with a @file{.sas} suffix (or other extension, if specified via @code{auto-mode-alist}). The function keys can be enabled to use the same function keys that the @SAS{} Display Manager does. The interactive capabilities of @ESS{} require you to start an inferior @SAS{} process with @wkbd{M-x SAS} (@xref{iESS(SAS)--Interactive SAS processes}.) At this writing, the indenting and syntax highlighting are generally correct. Known issues: for multiple line @code{*} or @code{%*} comments, only the first line is highlighted; for @file{.log} files, only the first line of a @code{NOTE:}, @code{WARNING:} or @code{ERROR:} message is highlighted; unmatched single/double quotes in @code{CARDS} data lines are @strong{NOT} ignored; in an iterative @code{DO} statement, @code{TO} and @code{BY} are not highlighted. @comment node-name, next, previous, up @node ESS(SAS)--TAB key, ESS(SAS)--Batch SAS processes, ESS(SAS)--Editing files, ESS for SAS @section ESS[SAS]--@key{TAB} key Two options. The @key{TAB} key is bound by default to @code{sas-indent-line}. This function is used to syntactically indent @SAS{} code so @code{PROC} and @code{RUN} are in the left margin, other statements are indented @code{sas-indent-width} spaces from the margin, continuation lines are indented @code{sas-indent-width} spaces in from the beginning column of that statement. This is the type of functionality that emacs provides in most programming language modes. This functionality is activated by placing the following line in your initialization file prior to a @code{require}/@code{load}: @example (setq ess-sas-edit-keys-toggle nil) @end example @ESS{} provides an alternate behavior for @key{TAB} that makes it behave as it does in @SAS{} Display Manager, i.e. move the cursor to the next stop. The alternate behavior also provides a "TAB" backwards, @wkbd{C-@key{TAB}}, that moves the cursor to the stop to the left and deletes any characters between them. This functionality is obtained by placing the following line in your initialization file prior to a @code{require}/@code{load}: @example (setq ess-sas-edit-keys-toggle t) @end example Under the alternate behavior, @key{TAB} is bound to @wkbd{M-x tab-to-tab-stop} and the stops are defined by @code{ess-sas-tab-stop-list}. @comment node-name, next, previous, up @node ESS(SAS)--Batch SAS processes, ESS(SAS)--Function keys for batch processing, ESS(SAS)--TAB key, ESS for SAS @section ESS[SAS]--Batch SAS processes Submission of a @SAS{} batch job is dependent on your environment. @code{ess-sas-submit-method} is determined by your operating system and your shell. It defaults to @code{'sh} unless you are running Windows or Mac Classic. Under Windows, it will default to @code{'sh} if you are using a @UNIX{}-imitating shell; otherwise @code{'ms-dos} for an @acronym{MS-DOS} shell. On Mac OS X, it will default to @code{'sh}, but under Mac Classic, it defaults to @code{'apple-script}. You will also set this to @code{'sh} if the @SAS{} batch job needs to run on a remote machine rather than your local machine. This works transparently if you are editing the remote file via ange-ftp/EFS or tramp. Note that @code{ess-sas-shell-buffer-remote-init} is a Local Variable that defaults to @code{"ssh"} which will be used to open the buffer on the remote host and it is assumed that no password is necessary, i.e. you are using @code{ssh-agent}/@code{ssh-add} or the equivalent (see the discussion about Local Variables below if you need to change the default). However, if you are editing the file locally and transferring it back and forth with Kermit, you need some additional steps. First, start Kermit locally before remotely logging in. Open a local copy of the file with the @code{ess-kermit-prefix} character prepended (the default is @code{"#"}). Execute the command @wkbd{M-x ess-kermit-get} which automatically brings the contents of the remote file into your local copy. If you transfer files with Kermit manually in a @file{*shell*} buffer, then note that the Kermit escape sequence is @wkbd{C-q C-\ c} rather than @wkbd{C-\ c} which it would be in an ordinary terminal application, i.e. not in an emacs buffer. Lastly, note that the remote Kermit command is specified by @code{ess-kermit-command}. The command used by the @code{SUBMIT} function key (@key{F3} or @key{F8}) to submit a batch @SAS{} job, whether local or remote, is @code{ess-sas-submit-command} which defaults to @code{sas-program}. @code{sas-program} is @code{"invoke SAS using program file"} for Mac Classic and @code{"sas"} otherwise. However, you may have to alter @code{ess-sas-submit-command} for a particular program, so it is defined as buffer-local. Conveniently, it can be set at the end of the program: @example endsas; Local variables: ess-sas-submit-command: "sas8" End: @end example The command line is also made of @code{ess-sas-submit-pre-command}, @code{ess-sas-submit-post-command} and @code{ess-sas-submit-command-options} (the last of which is also buffer-local). Here are some examples for your @initfile{} file (you may also use @wkbd{M-x customize-variable}): @example ;'sh default (setq ess-sas-submit-pre-command "nohup") ;'sh default (setq ess-sas-submit-post-command "-rsasuser &") ;'sh example (setq-default ess-sas-submit-command "/usr/local/sas/sas") ;'ms-dos default (setq ess-sas-submit-pre-command "start") ;'ms-dos default (setq ess-sas-submit-post-command "-rsasuser -icon") ;Windows example (setq-default ess-sas-submit-command "c:/progra~1/sas/sas.exe") ;Windows example (setq-default ess-sas-submit-command "c:\\progra~1\\sas\\sas.exe") @end example There is a built-in delay before a batch @SAS{} job is submitted when using a @UNIX{}-imitating shell under Windows. This is necessary in many cases since the shell might not be ready to receive a command. This delay is currently set high enough so as not to be a problem. But, there may be cases when it needs to be set higher, or could be set much lower to speed things up. You can over-ride the default in your @initfile{} file by: @example (setq ess-sleep-for 0.2) @end example For example, @code{(setq ess-sas-global-unix-keys t)} keys shown, @code{(setq ess-sas-global-pc-keys t)} in parentheses; @ESS{[SAS]} function keys are presented in the next section. Open the file you want to work with @wkbd{C-x C-f foo.sas}. @file{@var{foo}.sas} will be in @ESS{[SAS]} mode. Edit as appropriate, then save and submit the batch @SAS{} job. @example @key{F3} (@key{F8}) @end example The job runs in the @file{*shell*} buffer while you continue to edit @file{@var{foo}.sas}. If @code{ess-sas-submit-method} is @code{'sh}, then the message buffer will display the shell notification when the job is complete. The @code{'sh} setting also allows you to terminate the @SAS{} batch job before it is finished. @example @key{F8} (@key{F3}) @end example Terminating a @SAS{} batch in the @file{*shell*} buffer. @example kill @var{PID} @end example You may want to visit the @file{.log} (whether the job is still running or it is finished) and check for error messages. The @file{.log} will be refreshed and you will be placed in it's buffer. You will be taken to the first error message, if any. @example @key{F5} (@key{F6}) @end example Goto the next error message, if any. @example @key{F5} (@key{F6}) @end example Now, @samp{refresh} the @file{.lst} and go to it's buffer. @example @key{F6} (@key{F7}) @end example If you wish to make changes, go to the @file{.sas} file with. @example @key{F4} (@key{F5}) @end example Make your editing changes and submit again. @example @key{F3} (@key{F8}) @end example @comment node-name, next, previous, up @node ESS(SAS)--Function keys for batch processing, iESS(SAS)--Interactive SAS processes, ESS(SAS)--Batch SAS processes, ESS for SAS @section ESS[SAS]--Function keys for batch processing The setup of function keys for @SAS{} batch processing is unavoidably complex, but the usage of function keys is simple. There are five distinct options: Option 1 (default). Function keys in @ESS{[SAS]} are not bound to elisp commands. This is in accordance with the GNU Elisp Coding Standards (@acronym{GECS}) which do not allow function keys to be bound so that they are available to the user. Options 2-5. Since @acronym{GECS} does not allow function keys to be bound by modes, these keys are often unused. So, @ESS{[SAS]} provides users with the option of binding elisp commands to these keys. Users who are familiar with @SAS{} will, most likely, want to duplicate the function key capabilities of the @SAS{} Display Manager. There are four options (noted in parentheses). @enumerate a @item @SAS{} Display Manager has different function key definitions for @UNIX{} (2, 4) and Windows (3, 5); @ESS{[SAS]} can use either. @item The @ESS{[SAS]} function key definitions can be active in all buffers (global: 4, 5) or limited (local: 2, 3) only to buffers with files that are associated with @ESS{[SAS]} as specified in your @code{auto-mode-alist}. @end enumerate The distinction between local and global is subtle. If you want the @ESS{[SAS]} definitions to work when you are in the @file{*shell*} buffer or when editing files other than the file extensions that @ESS{[SAS]} recognizes, you will most likely want to use the global definitions. If you want your function keys to understand @SAS{} batch commands when you are editing @SAS{} files, and to behave normally when editing other files, then you will choose the local definitions. The option can be chosen by the person installing @ESS{} for a site or by an individual. @enumerate a @item For a site installation or an individual, place @strong{ONLY ONE} of the following lines in your initialization file prior to a @code{require}/@code{load}. @ESS{[SAS]} function keys are available in @ESS{[SAS]} if you choose either 2 or 3 and in all modes if you choose 4 or 5: @example ;;2; (setq ess-sas-local-unix-keys t) ;;3; (setq ess-sas-local-pc-keys t) ;;4; (setq ess-sas-global-unix-keys t) ;;5; (setq ess-sas-global-pc-keys t) @end example The names @code{-unix-} and @code{-pc-} have nothing to do with the operating system that you are running. Rather, they mimic the definitions that the @SAS{} Display Manager uses by default on those platforms. @item If your site installation has configured the keys contrary to your liking, then you must call the appropriate function. @example (load "ess-site") ;; local-unix-keys (ess-sas-global-pc-keys) @end example @end enumerate Finally, we get to what the function keys actually do. You may recognize some of the nicknames as @SAS{} Display Manager commands (they are in all capitals). @multitable {123456} {123456} {really-really-really-really-really-really-really-really-really-really-long} @item @UNIX{} @tab @PC @tab Nickname @item @key{F2} @tab @key{F2} @tab @samp{refresh} @item @tab @tab revert the current buffer with the file of the same name if the file is newer than the buffer @item @key{F3} @tab @key{F8} @tab @code{SUBMIT} @item @tab @tab save the current @file{.sas} file (which is either the @file{.sas} file in the current buffer or the @file{.sas} file associated with the @file{.lst} or @file{.log} file in the current buffer) and submit the file as a batch @SAS{} job @item @key{F4} @tab @key{F5} @tab @code{PROGRAM} @item @tab @tab switch buffer to @file{.sas} file @item @key{F5} @tab @key{F6} @tab @code{LOG} @item @tab @tab switch buffer to @file{.log} file, @samp{refresh} and goto next error message, if any @item @key{F6} @tab @key{F7} @tab @code{OUTPUT} @item @tab @tab switch buffer to @file{.lst} file and @samp{refresh} @item @key{F7} @tab @key{F4} @tab @samp{filetype-1} @item @tab @tab switch buffer to @samp{filetype-1} (defaults to @file{.txt}) file and @samp{refresh} @item @key{F8} @tab @key{F3} @tab @samp{shell} @item @tab @tab switch buffer to @file{*shell*} @item @key{F9} @tab @key{F9} @tab @code{VIEWTABLE} @item @tab @tab open an interactive @code{PROC FSEDIT} session on the @SAS{} dataset near point @item @key{F10} @tab @key{F10} @tab toggle-log @item @tab @tab toggle @ESS{[SAS]} for @file{.log} files; useful for certain debugging situations @item @key{F11} @tab @key{F11} @tab @samp{filetype-2} @item @tab @tab switch buffer to @samp{filetype-2} (defaults to @file{.dat}) file and @samp{refresh} @item @key{F12} @tab @key{F12} @tab viewgraph @item @tab @tab open a @code{GSASFILE} near point for viewing either in emacs or with an external viewer @item @kbd{C-@key{F1}} @tab @kbd{C-@key{F1}} @tab rtf-portrait @item @tab @tab create an @sc{MS RTF} portrait file from the current buffer with a file extension of @file{.rtf} @item @kbd{C-@key{F2}} @tab @kbd{C-@key{F2}} @tab rtf-landscape @item @tab @tab create an @sc{MS RTF} landscape file from the current buffer with a file extension of @file{.rtf} @item @kbd{C-@key{F3}} @tab @kbd{C-@key{F8}} @tab submit-region @item @tab @tab write region to @file{ess-temp.sas} and submit @item @kbd{C-@key{F5}} @tab @kbd{C-@key{F6}} @tab append-to-log @item @tab @tab append @file{ess-temp.log} to the current @file{.log} file @item @kbd{C-@key{F6}} @tab @kbd{C-@key{F7}} @tab append-to-output @item @tab @tab append @file{ess-temp.lst} to the current @file{.lst} file @item @kbd{C-@key{F9}} @tab @kbd{C-@key{F9}} @tab @code{INSIGHT} @item @tab @tab open an interactive @code{PROC INSIGHT} session on the @SAS{} dataset near point @item @kbd{C-@key{F10}} @tab @kbd{C-@key{F10}} @tab toggle-listing @item @tab @tab toggle @ESS{[SAS]} for @file{.lst} files; useful for toggling read-only @end multitable @code{SUBMIT}, @code{PROGRAM}, @code{LOG} and @code{OUTPUT} need no further explanation since they mimic the @SAS{} Display Manager commands and related function key definitions. However, six other keys have been provided for convenience and are described below. @samp{shell} switches you to the @file{*shell*} buffer where you can interact with your operating system. This is especially helpful if you would like to kill a @SAS{} batch job. You can specify a different buffer name to associate with a @SAS{} batch job (besides @file{*shell*}) with the buffer-local variable @code{ess-sas-shell-buffer}. This allows you to have multiple buffers running @SAS{} batch jobs on multiple local/remote computers that may rely on different methods specified by the buffer-local variable @code{ess-sas-submit-method}. @key{F2} performs the @samp{refresh} operation on the current buffer. @samp{refresh} compares the buffer's last modified date/time with the file's last modified date/time and replaces the buffer with the file if the file is newer. This is the same operation that is automatically performed when @code{LOG}, @code{OUTPUT}, @samp{filetype-1} or @key{F11} are pressed. @samp{filetype-1} switches you to a file with the same file name as your @file{.sas} file, but with a different extension (@file{.txt} by default) and performs @samp{refresh}. You can over-ride the default extension; for example in your @initfile{} file: @example (setq ess-sas-suffix-1 "csv") ; for example @end example @key{F9} will prompt you for the name of a permanent @SAS{} dataset near point to be opened for viewing by @code{PROC FSEDIT}. You can control the @SAS{} batch command-line with @code{ess-sas-data-view-submit-options}. For controlling the @SAS{} batch commands, you have the global variables @code{ess-sas-data-view-libname} and @code{ess-sas-data-view-fsview-command} as well as the buffer-local variable @code{ess-sas-data-view-fsview-statement}. If you have your @SAS{} @code{LIBNAME} defined in @file{~/autoexec.sas}, then the defaults for these variables should be sufficient. Similarly, @wkbd{C-@key{F9}} will prompt you for the name of a permanent @SAS{} dataset near point to be opened for viewing by @code{PROC INSIGHT}. You can control the @SAS{} batch command-line with @code{ess-sas-data-view-submit-options}. For controlling the @SAS{} batch commands, you have the global variables @code{ess-sas-data-view-libname} and @code{ess-sas-data-view-insight-command} as well as the buffer-local variable @code{ess-sas-data-view-insight-statement}. @key{F10} toggles @ESS{[SAS]} mode for @file{.log} files which is off by default (technically, it is @code{SAS-log-mode}, but it looks the same). The syntax highlighting can be helpful in certain debugging situations, but large @file{.log} files may take a long time to highlight. @key{F11} is the same as @samp{filetype-1} except it is @file{.dat} by default. @key{F12} will prompt you for the name of a @code{GSASFILE} near the point in @file{.log} to be opened for viewing either with emacs or with an external viewer. Depending on your version of emacs and the operating system you are using, emacs may support @file{.gif} and @file{.jpg} files internally. You may need to change the following variables for your own situation. @code{ess-sas-graph-view-suffix-regexp} is a regular expression of supported file types defined via file name extensions. @code{ess-sas-graph-view-viewer-default} is the default external viewer for your platform. @code{ess-sas-graph-view-viewer-alist} is an alist of exceptions to the default; i.e. file types and their associated viewers which will be used rather than the default viewer. @example (setq ess-sas-graph-view-suffix-regexp (concat "[.]\\([eE]?[pP][sS]\\|" "[pP][dD][fF]\\|[gG][iI][fF]\\|[jJ][pP][eE]?[gG]\\|" "[tT][iI][fF][fF]?\\)")) ;; default (setq ess-sas-graph-view-viewer-default "kodakimg") ;; Windows default (setq ess-sas-graph-view-viewer-default "sdtimage") ;; Solaris default (setq ess-sas-graph-view-viewer-alist '(("[eE]?[pP][sS]" . "gv") ("[pP][dD][fF]" . "gv")) ;; default w/ gv @end example @wkbd{C-@key{F2}} produces US landscape by default, however, it can produce A4 landscape (first line for "global" key mapping, second for "local"): @example (global-set-key [(control f2)] 'ess-sas-rtf-a4-landscape) (define-key sas-mode-local-map [(control f2)] 'ess-sas-rtf-a4-landscape) @end example @comment node-name, next, previous, up @node iESS(SAS)--Interactive SAS processes, iESS(SAS)--Common problems, ESS(SAS)--Function keys for batch processing, ESS for SAS @section iESS[SAS]--Interactive SAS processes Inferior @ESS{} (@iESS{}) is the method for interfacing with interactive statistical processes (programs). @iESS{[SAS]} is what is needed for interactive @SAS{} programming. @iESS{[SAS]} works best with the @SAS{} command-line option settings @code{"-stdio -linesize 80 -noovp -nosyntaxcheck"} (the default of @code{inferior-SAS-args}). @display @code{-stdio} required to make the redirection of stdio work @code{-linesize 80} keeps output lines from folding on standard terminals @code{-noovp} prevents error messages from printing 3 times @code{-nosyntaxcheck} permits recovery after syntax errors @end display To start up @iESS{[SAS]} mode, use: @example @wkbd{M-x SAS} @end example The @file{*SAS:1.log*} buffer in @code{ESStr} mode corresponds to the file @file{@var{foo}.log} in @SAS{} batch usage and to the @samp{SAS: LOG} window in the @SAS{} Display Manager. All commands submitted to @SAS{}, informative messages, warnings, and errors appear here. The @file{*SAS:1.lst*} buffer in @code{ESSlst} mode corresponds to the file @file{@var{foo}.lst} in @SAS{} batch usage and to the @samp{SAS: OUTPUT} window in the @SAS{} Display Manager. All printed output appears in this window. The @file{*SAS:1*} buffer exists solely as a communications buffer. The user should never use this buffer directly. Files are edited in the @file{@var{foo}.sas} buffer. The @wkbd{C-c C-r} key in @ESS{[SAS]} is the functional equivalent of bringing a file into the @samp{SAS: PROGRAM EDITOR} window followed by @code{SUBMIT}. For example, open the file you want to work with. @example @wkbd{C-x C-f foo.sas} @end example @file{@var{foo}.sas} will be in @ESS{[SAS]} mode. Edit as appropriate, and then start up @SAS{} with the cursor in the @file{@var{foo}.sas} buffer. @example @wkbd{M-x SAS} @end example Four buffers will appear on screen: @multitable {buffer-names} {long-mode-names} {much-much-much-much-longer-description} @item Buffer @tab Mode @tab Description @item @file{@var{foo}.sas} @tab @code{@ESS{[SAS]}} @tab your source file @item @file{*SAS:1*} @tab @code{@iESS{[SAS:1]}} @tab @iESS{} communication buffer @item @file{*SAS:1.log*} @tab @code{Shell ESStr []} @tab @SAS{} log information @item @file{*SAS:1.lst*} @tab @code{Shell ESSlst []} @tab @SAS{} listing information @end multitable If you would prefer each of the four buffers to appear in its own individual frame, you can arrange for that. Place the cursor in the buffer displaying @file{@var{foo}.sas}. Enter the sequence @wkbd{C-c C-w}. The cursor will normally be in buffer @file{@var{foo}.sas}. If not, put it there and @wkbd{C-x b @var{foo}.sas}. Send regions, lines, or the entire file contents to @SAS{} (regions are most useful: a highlighted region will normally begin with the keywords @code{DATA} or @code{PROC} and end with @code{RUN;}), @wkbd{C-c C-r}. Information appears in the log buffer, analysis results in the listing buffer. In case of errors, make the corrections in the @file{@var{foo}.sas} buffer and resubmit with another @wkbd{C-c C-r}. At the end of the session you may save the log and listing buffers with the usual @wkbd{C-x C-s} commands. You will be prompted for a file name. Typically, the names @file{@var{foo}.log} and @file{@var{foo}.lst} will be used. You will almost certainly want to edit the saved files before including them in a report. The files are read-only by default. You can make them writable by the emacs command @wkbd{C-x C-q}. At the end of the session, the input file @file{@var{foo}.sas} will typically have been revised. You can save it. It can be used later as the beginning of another @iESS{[SAS]} session. It can also be used as a batch input file to @SAS{}. The @file{*SAS:1*} buffer is strictly for @ESS{} use. The user should never need to read it or write to it. Refer to the @file{.lst} and @file{.log} buffers for monitoring output! Troubleshooting: @xref{iESS(SAS)--Common problems}. @comment node-name, next, previous, up @node iESS(SAS)--Common problems, ESS(SAS)--Graphics, iESS(SAS)--Interactive SAS processes, ESS for SAS @section iESS[SAS]--Common problems @enumerate @item @iESS{[SAS]} does not work on Windows. In order to run @SAS{} inside an emacs buffer, it is necessary to start @SAS{} with the @code{-stdio} option. @SAS{} does not support the @code{-stdio} option on Windows. @item If @wkbd{M-x SAS} gives errors upon startup, check the following: @itemize @bullet @item you are running Windows: see 1. @item @file{ess-sas-sh-command} (from the @ESS{} @file{etc} directory) needs to be executable; too check, type @wkbd{M-x dired}; if not, fix it as follows, type @kbd{M-:}, then at the minibuffer prompt @wsamp{Eval:}, type @code{(set-file-modes "ess-sas-sh-command" 493)}. @c (solution: @code{chmod ugo+rx ess-sas-sh-command}). @item @code{sas} isn't in your executable path; to verify, type @kbd{M-:} and at the minibuffer prompt @samp{Eval:}, type @code{(executable-find "sas")} @end itemize @item @wkbd{M-x SAS} starts @w{@SAS{} Display} Manager. Probably, the command @code{sas} on your system calls a shell script. In that case you will need to locate the real @code{sas} executable and link to it. You can execute the @UNIX{} command: @example find / -name sas -print @end example Now place a soft link to the real @code{sas} executable in your @code{~/bin} directory, with for example @example cd ~/bin ln -s /usr/local/sas9/sas sas @end example @end enumerate Check your @code{PATH} environment variable to confirm that @code{~/bin} appears before the directory in which the @code{sas} shell script appears. @comment Specify the path to the real @comment @code{sas} executable in @file{ess-sas-sh-command}, i.e.: @comment @example @comment /usr/local/sas9/sas $@@ $stdout 2>$stderr @comment @end example @comment To find the @code{sas} executable, you can execute the @UNIX{} command: @comment @example @comment find / -name sas -print @comment @end example @comment @end enumerate @comment node-name, next, previous, up @node ESS(SAS)--Graphics, ESS(SAS)--Windows, iESS(SAS)--Common problems, ESS for SAS @section ESS[SAS]--Graphics Output from a @SAS{/GRAPH} @code{PROC} can be displayed in a @SAS{/GRAPH} window for @SAS{} batch on Windows or for both @SAS{} batch and interactive with XWindows on @UNIX{}. If you need to create graphics files and view them with @key{F12}, then include the following (either in @file{@var{foo}.sas} or in @file{~/autoexec.sas}): @example filename gsasfile 'graphics.ps'; goptions device=ps gsfname=gsasfile gsfmode=append; @end example @code{PROC PLOT} graphs can be viewed in the listing buffer. You may wish to control the vertical spacing to allow the entire plot to be visible on screen, for example: @example proc plot; plot a*b / vpos=25; run; @end example @comment node-name, next, previous, up @node ESS(SAS)--Windows, , ESS(SAS)--Graphics, ESS for SAS @section ESS[SAS]--Windows @itemize @bullet @item @iESS{[SAS]} does not work on Windows. @xref{iESS(SAS)--Common problems}. @item @ESS{[SAS]} mode for editing @SAS{} language files works very well. @xref{ESS(SAS)--Editing files}. @item There are two execution options for @SAS{} on Windows. You can use batch. @xref{ESS(SAS)--Batch SAS processes}. Or you can mark regions with the mouse and submit the code with `submit-region' or paste them into @SAS{} Display Manager. @end itemize @comment Local Variables: @comment TeX-master: "ess.texi" @comment End: ess/doc/font-cor-s.pdf0000664000175000017500000034633512423756516013204 0ustar eddedd%PDF-1.3 %╟ьПв 5 0 obj <> stream xЬ3╨3T0A(ЭЬ╦U╚UdШШы)шXшYЪEА,и ¤ sЧ|о@ Оl Дendstream endobj 6 0 obj 54 endobj 9 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <> >> stream xЬь╜Ф╒Хи{*╟?з■;╖"Q${М┴6 "gуД╙`{юЪЩ7Г┴BуЩqА┴А╔Y !ТBЙД▓ZЭ√╧йr╝√Tu a╦яzЁ╗ы▌;л6м╜клNэ│╧>ї¤√Д"FЎ╛D▒ ═ гcЭb■ЦGУ╡'dIч▄ЬнЛ"Y$ЙD╟t=Ъ&Xd┘zВхH▀r=╙єMD╪y$вВ$! ∙4Bс√ИЁр"LЯ2ёБ╧рK°j °кГ°dpХAИtI╧%]Ч┤Ъ╡А┬лlа√pъ┼U;$a╙ЮGа└Ц@C▒}╟3g╚¤ъл Єт╣И)#R ╬╚╔с С"ї╨gЯ└╫<2мОDn<0^х░YlZс╠╕ !Аx└%( нгъ°ТЫ└gpэ&в:╕ NkкэУОчs>вёэдюSm\ЯЫAЬ+C▀ю╟g╪q\й'Р>E∙\ ═дg}Ё№Щpa <\Н<╨$Й┬О░'├Ау> ,БWj+Мg+~6АСDI$СD╔√П ]╡їйB╖нiUСI█Ъ E╙┤IFAДп]и╔Л√Ё:Ж710эQ Q.ЧЗЖЖJеТ EЖAТф* К▓u═ЇNЦ┘Trя╚0╧ИЙ4еЪ{Б:c>re Dк$▓=╥еx▒\iЎч╒k*r9ю#vRQыJЭ< ▄Oуco╨,Я╧ў╕H╥d╗(Юh·и╠°I╫ф)* ф┬┐rP/vр·р┐ыэ,А┬Н^h*░╢╬▀gК╙│Шї╬С╡4&И9кcLЇу.г aф!╬T1╤Б?ф~AЭ┴AWC╬╪Эm2Йf№ бkЎxц<`мЬa▐-щHG:╥СОtд▀ЧvgдтбНD╫9`*з╬б╫сH┬Ef▌╢iЦ░mЧc╟є|▀е)ЦШбЗ?п`└ ░б╤P$Щ╖M=&╟\пCУ Д8фfj gpлб╢cRжг81Йъ(W;∙<ЁМї█▀▄їW ╤nО╟┘Ч_}╗▌)яр╔й╔Б∙Нvk╖LзhВgАLm]▒6е▓1ПуeOУhB─I'▀▓m╦q└!ВB C !¤ауbw g?рЛс╢т╝ZШ"В╘аЕУs>]"╚╠с╗А <°Yъ`Xёi h╥cM°тчТ>╪ўp&r&<B┘╗Ъ аЗ о╟ДЗяE,щ╩°Шjxд╬y╛@:i╧чHBўHУ$Tl┴уА~}"и ╩АWЁS6▄Л╜┬aЁ'╨>F3Ь┼ }2ш./Ё$8MgP╨"|>╝J╛AЫudСЫ╞Цш*╞l╗ИSxtg=БЁi╩╟щQ╕ua4а]dШЮ ┴Т ▓Ж╠LwБKщCрyxь)h"└kЯ'эрj╨b╗#щHG:╥СОЇ√╨╛╘lК╔дly╗╞@ok└iЮРh┘A'}<╔GLРMЇ K;ьЁГ╞F'╢я╪zфG√╚gXJреЩб╘ўhG7┌ОM0T┌▒¤╣єzuнг(jз=OЫ8;hБqDv0hсB ▒ЮкЩЦAuхчЄLrўЮ╖ vr`и√╤√╓.╜с?ИЧ6н·└?Є°К╒Й°a╢┌ 8fcв`Ж└С╝уXоп!╓p)╒жuЖe╡6с{┤я√A╨4MQ ErИа]g├№`tuv\╥ЩсB#CLт6SMl╔╔В╟б/ГЄФ╖/Jь╫^?И9О╞МЯИ╞а93░ю╬─Ы╜Ч▄oD╪ ╨▄Щ¤%│┐┘H"Й$ТH"Йф┐.^Мб8Uo"╘f)СF ╥N╦bL3з0$Ц╨ИG`"┌aYzxя лC=TQФr╣▄╒╒еы║я√мАh╙"I'э:>AлЦ▌╓u╗з'б#д╟ kgС╚p`┌┬I╓r\7Щ(Цж┌жJз2bў╢:╙o╛╝ч√╫ РP█├вФZ╖с Sя┐°▄╣|[█В\Гє 45д3И═з╙ЦgО6G}╘╩жSЦнШЦG I └ДЦA┌ОC╙ВЗq╨ЫЩ█ЗN/0y<ЄdМ8√хРтаНHг ЮУG!┬╞oE $МГдI ╨жlЬ═ ЖМ=╩'╚А╛├!Z╥%и┘фа7;э╜ЛЖя╬) )╟┼pЖ]КсУ#°У0`Mг║лal ░ {`ъ╡У3Г╫√О1─б`┼y╡░RЪD6цqЬ─ЬЩ#0h0с╧)t▌└IS/FxL0аРё0╖q┴╕wУ8GЧр.ЬЁ#бnb_>б┘V╧у▄9%╨╨√&╬H╚В─ь▒Шs▐Эйщ яNёМ$ТH"Й$ТH■ыт√╝ЙА4TБ+!в!s ╔їЦK"Ъг╠pю ^nА│Гt° 6╜п╪]йTDQTUUqХЫ`Y╓0М╪'P╟оЛtП─╢╡ОГJ]╣DйRЛ дуЧ ╗/9!ВХДIr╢aйЪeдх>╫ф┘╝ы┴k}к╛n╒єKЦ▄@М ┐Х═u┐░∙-╟ю;уМТШA▌▐ЩI╡ЦХg·,█PPЫF┤Н┘Лящ.LХv┘ом~Р9:AТ▓cSxb)b*!╜ЩLUШp┌╖L╧Ф▄ЧcgRS╕L8│Р■┤i'NрAX╙Cf0tk═фс┬┴тЩ!┌Р\а!с╜{ ─q~С0ў╦A(╓d╔┴&▌─6ёЄ[ oЇfЧШр┴_Об0у╗рV0ЬibЇт╕НДВs{°A┴▒ ═Гqyrv\╪ 8/<Ёfsz!■ю[Lу·ДхЕ╔ыwу░ Jo┐U;┴-x╞dДГСDI$СDЄ╖ХJзЫп-X█▒c╝jE2хxRZHkF)@╞ўDЬЇ┴IЯg╪О▐i╣э╘$"ЛKквлnG$х?,Ж╖z<ЭЪк╘%tШКЪ ▐iу>▓єйЬкNR |/Р└8h{ШОT╤[4uRm╥4Єш#K╙yўЩ'W-Y▓Д╪єЎЁ╨AГ/╛№кж%.╛Ё║f│Эыm╞bцg_t■┘gsфB╧7╖l█r√Эw▀ўЁКf╙Щ;tДжэж█n ┼2╦░q ╙ы~д2CсЁ(Ь╖▐╗Ф#bЎ{GаpВ└Л$tЩБц┤╜╗xВ┼3▐░ ?╚╒Q> ЗЮ├▒╬}z_ж0мВЮ=АлЭр*▄┼`dg╚`З║╒ГГBpc=(/LDйр╝║▀шъ╛V└+│%╔р8l ╪q;Ю@ АЛWщ@ы─`iG╦ ъ ┌л√┴,╨`VAш-оЛ└ЧP`╨Щ╒╪Н▀3ВL└П┐ЧQ╕ЪєО[я╝с{╫9Ю ц[o╞ЩШШ╚хr╢m ╣y оЧ=■ |¤Щ╠╔эv│к<╢}ўЦ▐ю■ryJГ▄РЦ gFК└Kч╙й▄яo╛є╗ ·уГ√╧▌:·╩К ╞ЁнН╧┐Ї╜я}ПШ▐])Їg7l┌XmQЬw]бля├'t-<8?╝mчЖїO]~┘)0I$╥=?¤SК┌шыў·z О-)ю▐╗W▌w▀к7╝═pI9Юyq╙яsдx7╠н :№░o█║╖{╫╧ф╩fO%▄ю\╢05∙╥De-╦аBЎr╧╨iКЙ╬Tщ╤Fr╨чuш╟cТж7F╟яLжРы"UE<ЗЖ┐и(кябJїMCТМ< х│_`СHРГєЖ╢вOщ·╙╙ил э▄Йц╧G▓tCЛ╛GёЬ╝c╫o▀╪i!ЖFjyф╫ыэ╖*╒╡оН╬ ▓в╪▓Lm█}S2Б■є└╛у╫ї::h╬Ч:╞дaни7Q■ ЦН╗■TSYfи╪}!▄;UzX╧Я▄ж+O8J$?A╤NнЎАкаdБ├вДк5t╪aWШ:2м&°3]║_3╤┴}║╒Оcy┘ШЬ╛╗╒@P;°Yка∙sO!ШД╠╥i4Сё\╟E┘4о \л$▓ёЙ▒Ы└├dW╤W╝"ХN╘кКЄEЙyk╦╜ЙК╟о@6═ЙYSзYF░,Ыуx╙╥▐╦йфьNДЇ,pGI$СDI$яOЮGж╖з╤╣gx|╕<╡WрcZ├ч8┴4k▒8▀VZТk╡-IТ┌Z9УVн\¤у№╕╙щLr┌iзyБ0 ур┤осuоЩlv┘▓e-U[┐iєПо╣Сг?ъ∙V╙║w|ztяЮ1(П| ╣Q3x└╨2L5ХК)КF,A╨kVп_z¤M":q┼ъе.1╜nїєK╛┐Ф█>╥;з х7_щиЙ│╬╕╬0щDN╦╤tЙ7╬A∙╚┌╛уо\┼х╙xIВЁНН▐S)г╣Гч7┌ПR4*.Iеc[▀║Хє╗,╬┼mW┘╣ыЮtuTЇ▒П}njj2Ля┘¤Аmсс╒dтB╦╖ Щ┼╢Зў>dшG_н4∙щ┌°раЁ┌╖ё,╘uБЙ╖▐3█Э']RW╞cёm╗~СHбФt▒ ╥oэ╝7У┴Й╦tЄУК╜╙47ъe2L╞sеЄї}мV~о▌DCЯ╙н╟kН╞╨R^:Gт$Qж╞&ю*ЧQ_ йє▀╣ў%├|,W8[m 4═ 4с▒L її]┘ъш╙е√╕╩e╧░ъYAXшСЪйы╚є│╣▐jх-─Т]]т3л~[,аEЛ>;92йъ╧ I )СL╞vюZ&╟╤t }рW)m▀ьи╣┬вJi\Ц{e┬,Жc·╘╗[[GI$СDI$У└╗╡НИЖъ▄Qй╫╖m{yГТ,═z╛ю╕║iщ4├QдH▒Фi7╟^єЇЪ_№ЇЖnФ╩еm[wЬt╥╟$)окэp╛ Р\╕щLлU_│ц9Nъщ^s3GЭъyp mе▌├{╞=ЭsЎ┘Оjм▌░╔┼iEю·╪q╟▓"┐b┼JВа╓м^╖Ї·[D C+V/q╔ёuл╫cмОLe║╗6l▐▄V│ч|№'о╟3█ъ$A}Ї°y╟|PМ%╒r}ДfЕZ┼│Б2Н▒uk7]~╔g+┴Т=7| ЯО;Ў уУUКб+╡З|ДR╔+LЫ`йШсЪЕ╘Аж╘ъН_┌┴∙В┴O╡█┌Tхa▌@З║▓Ч┌v┴Duн}WеО║ Шф╥┘ЛSЩBлUk╡яm╡╨┬ЕЯЄ}┬▓ЮЛйКЮLж╟╞▐jгЮо╙БЄтёЬз╚Ъc╩4з85SyшрC>┐wdW<я┤╒x<їцычs(Я√"p!═╕К9кыл ^Ь|Б·|dRиbшO┌&ь ╝mr>бVZwА╗щыклЪ·нИDw▒Й┌О√4Їpeч\0Р▀║ушюlцTE5'╞╓gЄ╚2Сяа#П°;╟*]ё4@ўo▐ЫKгtъJВ ┌ЎD│·┤$в▐т▀Ч[u╡∙ bIг╔)t▄▒▀▓Lп▐╪в╧┌J╩2BJКy;G■рZhсрТV &аi▐qHhZ╗=Вh9уmє а╧∙є/@U/?H°АЮgЇtПL╝m/8┴м╙LюЛжК╖>°<сєЪ┘(цз╩г┴XsРВЎ├iЕсfрц╗{gFI$СDI$яKтX╛Rщ№╢┌м╛·╩╟┤2ЙK│)ящ'IВO0ЖЙў-ЦуЁО╢Ю^■ь╥%?0 k╧Ю]╒j¤№є╧╜хЦ?─у2╧ЛнVH╬uэ▒▒Йп~ї╦╦Ч?ayюЛп╝ЇГknхЙ│pv╨╜eвЇ╬ЁЮI╧%┤Оq╔┼Ч╤4¤ф╩р╞ЩgЮс╕╓ў?$╟RAоY│nщu╖Кш#Ёо_▒ц╗.9▓n═к%K~L╘F'S∙№ъ ┌Jёвє~эг"'8)о╤\╕@°рq╠Ь╣-шr<>╝│366╣u╦лей┌З>p╞@╧QO,▀Dв°ЮщIЙL·Д╙h? s╥╟║'ЫюнЦu╡д╢dD<йТчПЙЛ╔JmI"CC═√В╓Ц╫и+7B╪ZM■▀w';m¤йOE(ЙРn[+ _!j┐mХЎ}V╡Ъ√ШnсйП`ЬNо┤▀YO|╠1}E_Oина├∙ЇDYaPЪ@оБFluНов╛▐╧лVзШOя╣qt-:Їк█▒╒х║ГXПкЎ|N╤█╝HЦ+PJ$.sL;СЛ┐ЄЎm∙,КS ╚$гЪVЗ!│╢WвhТа[Им5ўh:Ъ;tБе╣;╢=V╚z^LР╓ф─cвМЫh6ъы┐JйЫё°┬v╗Mв.╝▓╒■3Г%>(Xh.XёВУШжI$СDI$С№ХL╜в|r|к~Ус6vэ▄ф9n6╤_Ъо▒Є<З$IЮЧзK NрHFЗ3/mxe╔ї7XЦ╡uы╓ССС3╧\№╠3O╣о g|▀П┼bщtZ╙┤П|ф#6l0mы┘╡kn╕ЎV]р!│щ▐8^~p9 EH║к_pс┘6аПП8ЮфСGDQtЁ╟;И5k╓,╜ю╤? !┼Ъя╕╘Ё║╒АГ?!╞╢э*Ўўo|їU═ш;ч╠_[vПЖв&^Бv\~∙A же╕╦Ё┬О-н╫^█qхХW▐|уЭп╛╝удП^ф;ё╡7ЎfL╫и4G ¤й╜{QwгЮИ│ркЬЬR┤mїQ├F╝ИкU R▓М H<вЕу9Фk╘н5╤ig\▐jЧG╟W;>:ЇЁ┐▀│уэ╔Є Йx0єПТ- -v6=HQ~й2:9}O"Е&&Q*Еr╔│Rb┐уйгcД*╥┘╖m_█╒Еz{O{fj oкАs║Л_#H╗┌▐^ппХ$@╧3ъM▓9╒yS╤ЯШ┘░┼EКОкspАушЛ$:=Y╜YФ└э│╗ЛЫ▀■^DЗГfЮ╔%Oн~аРAвt4х mи"ш TЄlEєI$Т╚Og╕▒▒╗┌-|┼4ё▄A)ЖЖЖ.m7═╔╔eПц|ёш╚[Ж╡]mа\■A6зжГ ▄ ▀''¤Сй╗Tb_WEЮ╢╙u8щТфл╞И(щ╙Х√Бz%ц(Q.╘+O╢Ыипчt╙kЫъЛ═6Jf1┘╔╠)┘т1Э&┼╤▀х;┌TB.╢Фi╝hf▀ЖИxб ?╗(чА;^FI$СDI$Х[аX Ъоt~╫╥╦╗vm╢-ГёэжЮ═&}ф6ънюЮБfC-Ўu5Zу╛я.{h∙№фg@~хrybbтшгП~ї╒W+Х ╧у═°L╙$Ё╞*ш┤╙N[┐~╜aщы^xюЖknУ╨┼Э▀МW^Їmа└1▌l~ъSЧ>}чЭw В└p╚е:Иt0~я.╤∙8╝ёWм¤╬о^З│ГУ;ЗЛ¤╜_{Y╤║╧<эоЫТCmОжLg╦ўЧ\╥╙kkF╒2й╟}m╦█У║э∙╛р"I$ORэN!┘SjюWu}9ри#┐QлжфЦlш├4Ъ╥н╡╨ВJх ┴f-5╝T┬╖PбpЮeк═╓│ЮГ╕°▀uх┘=c╧&J╟П)Ў╧█╡є>CGЩфY▓▄з(&╧$,╡╒██зеzcl┴┴▌/┐ЇG╞GВxC│mхбv╢ш╠╤▒Х└^==ЗК▓щsкХ╟+%t°б_mйc╜}й╫▐╕Р┤Ш D│Щ ЦMь╘эХрY.{╢й ВфХЪс┴bс ╚'ъ═╢Г·s_и+{LЇGЬbv╓МЦQ ц┌bсXё;vо═цГ╓UPWёмB╛8▀h╓tMД··>╔ l╗▌t°A@x╛╡c╟УрC2~─╨ВоGY╤Хжч═¤ФG4лНх`%Э:[╫Д╩к┐П┐S ФO5Q█LУ ╟уcТ╘Qw▒вji█╟╦ы3)╘▌ujг╓6ї═А■|ьXG╤s╤GN╕шЙзHОЯMxYшo7╘┘¤tlЬ$їЩ┴bП pPМp0ТH"Й$ТH■v!Ё,Жa'л╩Ow я}]р(╟рЛ∙╛йщЙL&╙jvVl╖tЖ'[ЭйL&ё╥Лo|ў╗╫┌╢╜e╦Ц▒▒Й3╧╙╫;p╫]w;оъ1:вм5kV-¤▐▌вsB╘К5 d╫`мПLз║▓╧╜┤╧<ыЧ╚═У╝GЦнl╓∙┼/┐$'┤fн*r=W_їєR├ iОщЄ|Й%%╫u}d R%щ╓Цн╖цЄ(Э>▀62╥З═ ш█;7ЛнW_4Ы@<■▓Х╧■{:Щ8т░┼╧?╖>! F<^ИzєyOCжЛxkЦC╜▌g/+ЭuА% ч¤П╤ЙJBшRt;&─,[╒Ь▒Б╛ЮRuЗх╘;ъF▀E▓p^▒╖o╟о_$Т┘├C*цН:К╔xН│╥F▓ИА8у▒╦{√цМПmjhлpТТ9 бE∙t▐e▐~g√нТДdщ┤╕8а[ХЖ║lr -ш■d<Ю}k█╧єy$╤ЯЦcDй}ЇqК┐▄wbMуf╝gЛЗЎШt║obЄ╤rq╘й{Яm╡╤╨ЬЛLUe∙оЙЙ█t-:тr]WMEБ╟ch■┬сЭ√e╝█РЛ*eh/│Хх╦т)Ї┌ыўqъъ·xBюkщcК¤$У╚п"┤Ъ┬0Фa╖iM&╥,═╓FG FТё!ЧW[ы(її^║їЭ√┴H│Гr=и┌╞+йуьеI┼№ЗъUУжY╒j8млI№`s!└┴p█Eч∙аGI$СDI$IHD▓x╠m▓i¤ьЭ█gBЕЧ6nъЯgZ2Щ╢Lg║▄8ьЁг╦х)╦н%У▒√ю}Ї' ЎяЮчОПMLOЧO>∙─Х+Я"┐VkрЙЖ>A╙$I╥АЙ=Ї┼ач7о╜■┌█eЇ)iMччУХН├╗╦╛-2dЎг'|МD·╩'G>{цЩg√Иxю╣uжы ╥[│v╬в│┴╔л╛э╥█╫нyz╔ ?&&vя╠╗7l~═tz.:я?5-юS:rъйG▌u├ ЯD╦▓╝├цd╤!ЧF╥е$─HЦюQT XРбX█Эf8┌GэzєFзх.'=БcтэvЫeYПщ┤Я45Ф╔L1Я3ln▀ #╧йtшб_x¤н[Т ╘Э√ЪуZ$?*╟Й;WКy°9УSП█╩f.гЙШуQеЙ<╗{┐ии┐пV╤ВC╬╖╘Тbm*о╓█╙▒Ь╝gяэ,П┬1┘ЮввhщTNWС╥qY:УЄнЖе+ZrkН;! щ О\`ЪUД╞[╓гЮЗ2щЛ=НцУt °(┴|Ю@l╦№щ;^,H╥Dуv├@З]╒иYКї╙A╞╩уСs-t~2}KЎLM▀┌V╨╝╣Я6█fK╜и1!ЭCrмчRвР╤Ъу╙н╟ |Q╫: ▌╬з лЮ║-Cй▄yк╛ |K%.╖Lfк№╟Xe╙'2ц╔Д█╒╢FГёlОж1ц┤Ы█ ╬ь┤─Ла│ЛE!╣¤Э╗b1$JчЎє>╥\_┘=ЄРЭ,_JСЮ═лб №hбI╩ё╘`)I╕╤ м#сfq╨Э╔sG:╥СОtд#щ ║^лФЙF єўo╝│╒Gх▒▒Э_■√oh ▐ е▌RZвhсбЧ╪1Ь╒i7^┌Ї┌ K~`┘ЎоЭ;GGG/^| ¤ў'УIК┬▀3M╝c1┘Е^xя╜ўvўЎ=╛№Йып√╜МNЛoЫ,с╣ГЮ├Ь│°r]╫xрЎB■4Zi║v┘%ЧёBl┘Єg<КX╖цЩе╫▀&аS└╤╧■лKяX│n∙R└┴;7═ЯwЇ┌U╗Фvўgо°7═р\dЙТБиёN··╖.Ї▄V2ЦЯЮ0╛їХНL╣ИъўР,{Ы|Д░yБ|g█ж╙H╙СясE!х:фр╧!╧l)w█ъ╕Кх-Цг╦╙ЭVє^╕7!~║╓∙#M└]БР(&)MлLЧ╞SSд3╣];nВZ*%DR(УBsчл61Юю.ь┌∙лZхsи╒B<·┌╥T ╣j║▀╛єжЕ;б'{|░-7Е,JМui5Еф╗< Фdэrх╖╛Пz║┐LG0Тя╡л═▀ГI∙│BМ$э■M<ОЄЩoZj╗i▐ -°Т┘*5э╟t8ю в╤TH╔п7ю├шЦ╝Ш╜┘╝\M╞/Н╔▌ЦЙ╞╟жкhhЁъFу╫ОЛr∙/BIОМ╢╞H┬ш╪п%Е+(QЎ=`|ЇЁ╖╪}u╣№kшq <╟ArerЯЄ}*.╡j5NLШFч9Qv╞П┼y╙╘+хЫ4Бc1-\°ЭzyСr*ЭhTзЭ;lїї^kjК(uij++v:uЮПЖ▓▀WЮЙ`┐ю}[╠x│[RG:╥СОtд#щ ▓&СЩр=╙▐=ЎGТGп┐╡ЬdФє╬ Д╓°C╢Ё+/[╢Мх^@jз╣iуцk┐√}UmjЪЎ╥K/Эu╓yєчОППу╠ЪчС$ аVо\I╥у+6▄|уГЦ.ъv├r_ЯШЬx{╦ыАП╡ZНa(Ц#ho$ь╪ЮМiQВФgXq═ъ'Ч\є╙L№фf╗╣q╙s╟│k№┴╥SїW йГW?;сшЯ√O-№╤╢6B╗/╕Ї╕o|ыопй єн╫G~√є{,+[эфAzMре'> 7║очz<ЕТн╢■╬╓7п√Ч&cG╡:Эх╦o╢╝▒Ч^}ъKo vП?╙S<ьщХ╗$Ў░┼з_- ▌Жe"R!╣й╙╬<Є№ ?┌▌Уг\юеMя▄s√Кёqпн?Й│J3ВЫБBЖеL╜├Й╝eЁ'═Р╢о■И╖═"уА╖АtрУb)╡3UьY85▒в&HЕpпmф;▒x╢╙ЮК'║Бjы╡ /HА}ЦYGИвЩ╘├0JзТ╔Ў╓кS┴gеЁ uТ(9Юjc╝Фr=└О"╫!E!=6║бDЁ}6|A╕■HТaї'8├#dд2НZ)╪{ЕCHч┼╝бщ┴]р8хyюь▄ЫHВ` ┬Av-4╬╖# е3╔Z|3й╛Vc NКrZah-а╖x2┘n·r<н┤GеDКв¤vmnюъЫ?=╢ГтS╨Ў`вб!& Zk║{рачЯ ╛ аZ ╧н)ЁёQG¤Cл▐BоЕз(x╪7ТM{ЮПЕdТЙDкQ┴юсЭ б╥к %dYмФ*4K{╨О№жЩ}М#Й$ТH"Й$Тў+Фяxn╗'/м}■ЧП._f∙c╒╞оxB А%"Ы<░XFR╘└QлS╬f╙╡ZэW┐·╒ЁЁЁ╧■єX,&Вкк<╧+К8ш8N&У┴x`Ъpid╕╩╙}?∙ўЯ═Ъ╫Q*7н╜ыю[}dQ4N╥∙P;╨АП╟pAHТЎЯN╠ЩШ,╫kеЫ~wЧ╠-АлП-┐СУЪO=╘щtt╗ЮКu7;MyйX┌▓,╒lИ! $k∙IRЮd.йШmСС]╫5=ЭDtx,SHXY▒, ▒<═▐4GwR┼═NН!D┌ОqE├┤]Dён╣Х╛b╫─╘ДЗ:2_PМ&Bf69A7l├G.OЛЖcdУ┘j│КpоМ╦&sХ&рЪ▌Ы?╪┤ЇJs\b╙ке'е8x█╘U╔ДГуЦЬ╤#8Ц3,#ЭLWЫ╙=sG&ЎРИ8A5л в╒-=!'┌JГж]╦й╨Tz╖гLHЖшьD"QoTiКMз╙х╩HOў п@!mШрS2k64ЙЭo█ЎКХ7ydщ╣чZ║Їb█;c чўо]U%Йьg|Ю@)hВ╚ ucBвI╦i%dЙб°Vл═"┘EВН54╓Ы╒x■Щ(Є(ЖзxtИ╘hи╢оT)$╣xў▐╟▀ьp8─Щи┴вдЕZJЪ╚)ЧT'x2axнЧ4L├Eо╚КU2*╞▓,┤x09ПWZ#С╩& Vsq6■Ш ЭOхЫ═жх╫%6ЗwnDфЬ┴y;Ў╛╔аФП3xЗВ¤{PЪ╔HS/3H▓С*3x`║▄┌+3y┼. TJw┴,P*ЇЗgуeФДZ!╛╨8єG'└ ╒v$%& ╨f·:ДHfхОUБ~ФшдъАqИ╙AНDhЭПьЯqnЗ╗А▀M╧ъ┌=■VХB╝ЛЇФXhh8w(R┘b▒0>1%9ОStЕFмЙZ:{┴─Uт,QIAЫJ╙AКDeLW#q┬╙H┴Є╡9ФvСMтЩВЬёI$СDI$С№M/┘ЧюШ5ХУкЪ█ ЙФHу ЦО{.K ЦcЕieЬ├_╥╡\ф╨мhZЁЪV3╔ЮVлх·о$HЁ╞яh-YИ╜╒щVГgТЖ▌ФШвm│"JРФg╗ZU▓|жeTmдHЬЭїE╠°ВHYк$т\Gi1Ф╠°9┼iм~ц~Я*п^√└╥╛CМ Ч√√r╧>││╙до■ъ5э╢п║И шЗбI╧1hК0\┼FN%YVR,ф┐gzY╕@IiIs┤L,╓;uСUUB┤|+)%AF'Fдж─.─ ?b*nд#щHG:╥ 7j╤x%0reD$╙мiWkЭix┐├kЪD▓ПАфЁ2 xC╗╛ч°Мэ║АmеУr╡═1╝iwH─ГДФ№РJежззr╓P|∙┴8╛i!НD╛╚▓жеЦ╙йАФАРя┴)├%ЪbЬi4зX&%1yЪAw▌ўK1fо|ЄюеK┐Cь▐╗np`■ /╛.K╣Ч_▐&I9КО3┤l[>╘*Є0д\,┴ аФR╦°3/Ф╫щ┤l█Mе2`дO0 ^Г╙щt║╗╗iЪ┌╛}ы18 4MУ▌┼┴v╦ж)ъЕ╓бB1░┘▀▀_.ЧFFFb▒ЮSшyP]╡:нh5IК`uiК ╟Т,иКn┘ЄIОgр╠╠1'jКk█>T fбЦl░HMЖЖчє['&&рOh>╧│Оc$ KВ>Ї╨Cыї:Ї¤ю▌╗{zz┬┼DИ╪╝yє*ХR/Г@У!░ЭОК═°#6,╦C╪зз╦`■Д┬╣|┌╢ёVцP;hh2Ь▀а╪_°Iу`ЙIд#щHG:╥С■ы5вy: o^iЪ▐И'╟5▓Щ╝e"╧e█7MЧa(Т▓Щv╦q]Uw│╣оJеR(B╪╗w/0 `╝ёе рш┤k#ЙЛЫ║УL╩Ъо0 Y*OuwАRВ╫╜ )8\ДЁВ8┼04рчyДe╒Ze┴┬╝кЧ6o~z╔ ▀%жл│Щь3л╫ b╠▓)БOШ&йД($t┼И╦▒О╥┤МN>Ч@╚Є|┬▓╧g▀├└>с(&JїVУг9ВжЁg7\╟╡ьx*й+8.ц M╒:J,Щ░ S╖L м└├Жч╥Йdг▌2TMN─h╥sСkjPF/d MTKUN─ (:■GМЙ╣tnў▐▌]╣.┼j╢b╔Xг┌╚ф Уc╙ЙTЦgx═░8Ж1°╟РУRлQС2ЫОK║A▒"╟7;mЙфD╝QнБ╧<├┌Ю >▓ч█кbщ╔PЩ┤╘h╫)DQ,х┘╔Рp▄ьрЦВOдOjжgр┤кгVWT░?╘?0YЪЦСЁ╖l1&╫+UрїL2еш╪╟Мo╚ Ii╡yIД╚$╥)ИЙf]╣№─Ї▄ ■└U╟ў▓йtе^УоT- Їl gXЦ─у╚ мЦuЮ<Ф╧ф┴╛йсXYЖПБ└rжcГ5├╢а╜=¤}`zНЇ╤{╡З√ЇЯЮПtд#щHG:╥╡F4`_LN8оf┘║уX▓,;Оpс{tLNu:9&*jCТщОRН╟уPЮх─f╜K─iТыэюq}╧2LЪel╙e ┤i[йD▓╙QIВї}Ь╣є|GY╫sБk6ЫвИз·X ВаЁше╧╨┤\)╖║║КхR]bёД╘lN "zЎЩeKn╕Ц╪╗ўЭББ┴╡╧нu=`ЁЮt=Кж$╫! ∙т╪ш(╟╤╛з∙╛╞╨~░╩БA:УтуйdТвБiptldЬвМ%╩ХК└єRLR;эx2QлTбIЙX|34ю PТcX╨Р A╕Т4C·,/HНД#ж┤ХD*╤j┤@[Жh√з Р. АъШ╛ЛhЖЧДx│Р${>nwGQ╥й╪╪фH_▒╓иP$FWСЛ5ZMи▒╖┐o█;[╗║ЛрI8ф+Hв╫n ЎhЖ>=95o┴┬fн ~В}├╥Nl+-иХf)h/╞`Я№═s┤к+оэф╗ cу,└n26%Aм╓k1IkЭV"└╥Му┘4э▒<39>18gиR*CФТёДэ:J╗╙▌█Sп╓T]╦д╥UСE Z ┐;└>╟ЁPТg╣└ЪQЕG4Ўс╜[azо+╔r╜VЛ┴│ЛMLNjк┌╙█лk\е) о╢[-Тв:эv6Яi╘ъr\kЁ│зпwjb▓PьВ(╡Х╘h9v.Ун7╟CпA+Вz╤ЯhСа╜P"gр.]╒рI╦хjез╪нh*Ь╔Є%╨эfЛbhhуфЇTwWСдйVг gа╜┤┌Дл╨kp QBЮQ ╦Г╖`Ю7Ё╙s\░├P4/ p g ┬p·ъВ'Ё/┘Пtд#щHG·¤j2╚Жy34Ы2,гБ╠Вє(▄╢9°л>Л|ъпп┼Я1ЯЩ╝ч╜;w1Ь;шЗдЗ╔√@рOД'╜А▄╡°л$▀#ЎюЮ,м[ў╝ы;@uОяy.п╬ZнЩJf|╧)ф╥╡┌═А)<9Пf$╧є├M█└^В@╙┤eYнVЗч∙■■┴Jет{x╪Ъa№н,xmI┬_┤S%H╡Z QЗЧАЪu]7tз╒4·z ├▓mSТb╝└]▀▓ Кb0BO8Ц▌╙S╒┴┴╣├{╞r╣ВоPW&Ы▌;gn ффX6Ч4 ЭдPл╒шъъr<┴O╝╜▀ш(P┤╕╗sч╬╛╛>8оVЪТШДКjI▓Dды:єц═▀╗wО┤╣█Qъйt,4Мчж╒├/OГM<ГP╫б▒SSSЙD╬CБ╙┬$p&У╤4н\.╧Щ3з╒jA┤9О чыї:x%MKOз╙эvМCa0╘ўВ┘ў╠aЭЙВ╕Е#ї╨MpTЪ╦хBkP)Д(h,ЩШШ╚f╙"°%?2··жж&Tlл▓ящ)ОНMЁ<█┴_7ё║╗{еmЪЎgNh╕ЭE╣R)╒ы═9spЯVлeТдб °ЕЎ''зУ╔8 mй4╒██_пWЖK$р┘иГ╔dъ╪?а}°╤#╦"╘lўГqъ└2\Н┼Ё╠╪╢╦▓t▒╪366qАVА¤оо<╘>Qоk├] '╠2Йtд#щH 7╙>Б▐gВШ╧шрK`Ш■pI╝s│ ■в<ЪШб╖ ╡Аq▐~╜■T╚"─еБЧ\П╘1JzМJz,и╡kV-Yr=1║г╒7_╖юUМГ х{╒:ИваА\OKDV>Ч&|{dbп(s"АxqлвЪпgt{сF)`Л╣sчm▌║аЗ┬9P°И7Rщtl█"┘╢m█G1= oeыаГз( пЙ%9V.Чл═fл╖╖╟4нf│╤╫╫пi*▐Nя@°х╕z*Э0ї}╥╨-`┴щщ╥@ M^∙дуXM┤Zїt& dhNU ■аd8╙Ш Ъ6wю▄═Ы7ўЎЎОНаEхRupиb|jh╬└Жч7╗ <'x╞ ┼╙<Б BЁВ&├Б╘ ╡ у y^*Щ5tИ6╬ l ЁаОЕЯж''''-Z┤wя^ш0 ╤ЖV@╪б `jgp9╒]r╔х▒Ш!2 √ХW6nЩuwwГ`S╙t└Aа2а║лп╛·G?·QWW╫т┼ЛЯ|ЄIи ╚ Jо№1 aуyйЮзйF"ы┤U╫│ baУ ╠RQ0№}ї+_├s ЩfHА┌Н/n(MW└╦Ё#г├ ц╘ю4УЙЇ╘Ї46\ЄьЦ╧<є╠Ыo╛·//Ч├╒<с\а$№ Q:`.║ш"╕4■|░М F `чЫ▀№цo╝П┴╙O? НВж┴#tЄ╔'C├!к=Ї╨╚╚H┐~d▄я┬╗я╛√╝_7■B╠eЧ]Ўы_ тО┴ЩpuЇ╘Єх/∙Ц[nБ▓xSJ Ю(8'XДЕ#Й$ТH"Йф SёЁ(Ё ╬тр■WС╖▀Я$╬·x╥с_kpР▄/yО|я┬Ў)S'╞AП6>ч╩ЁчЪ5ыЧ|)1╢s▓wи╕nэKЮчS4Лq┘4ууЙm╛Y-O_r╤gn ├яR╔<щ╙кbvўЎ╜■ц№рЗn║щ&` *└ВXL┌╗w/╝nс╠╢m█-Z411┼▓4Ь╝└╗├ЭI?єу╦]xQ(Zн@╨┴ЁЁ├l═щ?№Ёгyф~ ЙЕ ~·╙Я╛уО;▐У¤┌OАN;ь░▌╗wЗ╞O=їф█n╗Н─[TcВ<{ё+V<ж('wю╪├╨ТЙwbDчЭw▐э╖▀~°сЗя▄╣оЖiB@Ц╛╛>░L∙tъН╩рPў╘╘$0─1╟%Гz{{▀;2√Юx√^1~Lю:щдУ|Ё┴0╔wхХWФPBcБ а║D"ю╕MУАА└В┤3╬8у7┐∙ Ёл$сMдэ@р8LdЖDС scЙDКaи╨[@┤:%z╢o▀щy╬'>ё╔╝?Х╩(J[ЦуZ║n╬Э;┤yє╦Т$фr@(и:▄▀Об.Ёgх╩ХLш&`8ш ╝pи:ф■┐Їд^zще┐·╒пP└s╨╥C9Иэ┌kпЕОГ`ЮУн[╖ ╞Б}xrа№PГ╟▄g№Еvq╟w▄Ъ5kЎЭБP┐Ё┬ an▄ё┼ЗЖЖрy; №є╫о] |0>88Xл╒ Ш@█P┼_jB$СDI$С╝_ В╤ь BЄ╜чў╜=▀%E╩ F№╡ОЩ(└┴┘┘Бp`!\Я┤paO┬#┼t█pуАГkW=┐ф└┴=;zЗ╓пy╤ё(Кц\▀ї|Гd]╙j&╙Вo█╟}°Ь═W#ЗЫorВЬ╔хўОюэщщ∙Ёё~b∙a╢ ЁиVл└√╨▐╡Ё2n╡ЦщД├ЭЁ╞а ЧFJ>¤Ї╙@xсиЇ°°8Р\mwЪOЛ`пMЫ6hВЕ|ры╫пsE&$╧Й╡Z=ПMЧ&Л┼▄9ч.■├nэыыЩЮЮЎ}т╝є.▄╡s╫Ц-█ ∙тю▌{ї\'ЎЄ∙<р P&ГхpЯ┬0лBыЖЁ,А:aл*vуХW^6╝░$ ў╙∙s─ ╝ўЖєєN9эФ_xЬБкП∙р1o╜ё░╘╪╪└ └Цж+эйjыВ .Z╜·YU╒!27n\ U]╫╫4@ `n||▄╦А╤▌▌╜s7а╖L&cЪ·ь╗?Ё*кVы}╟{▄cП=╩0XЖЄ┘l║╤hA] ╝{ў╬b▒X 8IЁ╬F┘lB&h∙@ЖЗЗП=Ў╪зЮz <БFA▀A ЁIЕЗa┼КЁxД▄а ]wю╣чn╪░И9№x чП>·hи(',X'GGGбL?Ю▒p└@Уф 'Ь}ЗPЯxтЙы╓н v█aбўь┘▐Ж▀Ў9чЬs}ЇQxJч═Ы╖c╟(ю▐Чвь`$СDI$ d┐a▄}й;"xSю~дHб`Ip╒Э¤рэU╚¤Ў XячC0жМ╖ЪёЩY,AuДУDЮ╕vї·G6ўЎ╧_┐Ў%╟e(Z└Я5ёMТ│]┐э╕*с:g/■┬Кe╔|о2iqф╤уе▌Я╛Є7▌t╙т┼ЛЧ-[oю┼Л╧Д-╨╔=ў▄У╦gр¤ Ф╨h╘є∙АK2Б╫=└K'Еж[нV,шyю╣чрЕ я√ССС▐▐^p@ф_ їЪz╜┘h4А!Ц/_■Нo|у║ыо√╬w╛v4Яj╖М %Щ%vbrЇ╝є▀{▀]@!с─╕уП;qїъ╡║f]∙┘/╩r╝┘мVkєц;╬9ч╝EЛ√╔O~ЄЩ╧|цСG▀А`АtЦ.] Їv·щз/[Ў°E]" 2└ж┘l~с _▀|Ё┴ўеЬ`┐▄ к+о╕т╢█nc\:Є╚гЯyц)Ф%KЦ№ЁЗ?p'╧? B▀├?pэ╬;я>ў▄│;ї┼_А√╩Wок╒m╖▄ЄЗVлёП °╧`Ў╞o'?~╞Y∙BЎ┐°E°ЕV`╕с ■FН r╛G8оu┬╟Ny·Щ'▓Щ|й<┼2╝eЯ╝т╙4Г╖Ў╣єо;║ ▌|_·╥U`╚°Ч┐№%xxхХW■ьg?zТГ╚@эрєЬ9sB▐Ъ;w.t╓#╤{уН7аsЛ-Z455y╘QGн^╜P !В>║рВ ўбЁ7░2Ї╘о┐∙K╧>№~А▀ [╖n▌╛Ўn<°рГ┘!╝ккB7┴C╡└3 ╨|┘eЧ┼~єЫ▀ДЄP ╬▀|є═PаT*┴╙°ЧкИ$ТH"Й$Тў+d└d░▄#└╡РЎg?ь VcdЁЄ╥ЎИ┐╔`- ся√k▀┴{qpvra0 ╒qxclR'шI ЕngW?╖dщbtts_▀▄їk79CQвL└#Y╫s; Л8Ж>Ў╪єцЇw╡kv▒0wщП~╠ ю∙-^╣r┼I'Ю·╥KБЦ,∙~▒X ?■Ї╙+VА6z√·*Х ╝k ═H└ йT ^Ё@o╟√QQd&╢m█Ё┴Л∙_░|Gрc ├ДнYїь╔зЬ║nэЪN<щ▐{ю4@#├Х╥┴ЇIНШШВфy╢╤мд3ЙП}ь#[▐yHPцРCЩ7ўаgЯ]▌Uш9ьЁE┐┐щ╢L6╤nO_w▌5АhgЬq╞я {АТK.╣ф┴Зb╕я╛√°  №╧  Ч╬;я51y·щЛЯ}v%Dг^oЬ~╞тїы7№ёў▀?ру╔'Я l 7╨кЖ╣лO~ЄУ@╧╟{,╨эЬs╬YЎшуп┐ёън╖▐·╙Я■4z=╙ўя└SОg█лTK_╛ъл7▌№╗x,╔░╧Йg-■°os#E╨х_∙ъUw▀uяЧ╛Їе_ ·╖ггг@├_∙╩W ю└XзЭvZВW]uЁ.°6[щ╪b ╚mЎ чэ┴НWхлp╚яЎ?▐П ■Ж╡о_~∙хАw▓, °╟?Ї│║Кў*З ЪX№╧╠∙чЯ╟]]]а├╦бПО╜Ё┬ Бe!Ш;wюДксG╦З?№с╡k╫~ЇгЕур╙╧5 Є▀¤юwPW8їЁЯNў "х■▀$ НЫI$СDЄ7 ЙЧ √√>ч ╙▄ЗГ▐l╓РЪ┴A┬є ўп╟AДЧ╔?√ ЁБ▓Гaj│ х·"LВк`O╝Є╕╡л╫a▄╗w█└└Ьuk╫╣I╙lЁ╔cЗb└K╟umа╖УO>єО;nе Очхt&├ЙЇЗ?|ь·Ю;∙ДЙ╬?явГЮ№ Пн^√4╨РМ¤4╚Bм▌l А)A└Я28ю╕П▄r╦═1╢m ЕУ╒N9х┤Ч^┌>#~эл__Ў╚C'ЭxЄКхП_q┘?№ E1 яЭуy╓>БaиK3@4CЦJSАJЫ6m4 8г┐┐╤в#╫н[ч8▐)зЬЄ┬ЖMCу(ЄФO╕ч■√>ў╣╧=▓ь╤0)°╪КхgЭuЎ╙O?I╤t&У9т╚гЮ|jхХW^ 0▒p>^}@Нf¤▐ў╛wчЭwn┘▓░ь@╜у▒ д0ъa7I`JА6 Бч┐¤эo OЎ╬NкbY°}тф═С]вbD╠с^│bV╝L(Тs╬ТsAв&LШп fЇК┼ИvЧ═У├╔члъЮ┘]dё>|╛ўЇ~SЄggNшtж■]▌U ╓√o╝ёFАрX$ъp9╧>я№ЭЯ~╩─с░╦/┐x ┌ 8М∙ LЗ├a°hцгП>bж╙m▐№8└kы╓нCбGхИCТx╥БШ/╕рвў▐{'KdeeШж}■∙ч╜∙ц[╠├ўвЛ.x■∙░▐|єMАQ╕Є╒W_¤╔'ЯЬyцЩАPPЭ~¤·зю┘│:·nWWW╚uДEsєД╡k╫2+ ╝┬ДКэРф√Ў┴╒Ап╣■║╖╖┐Нлъ┴╦:УЯЯ▀╜=7o▐ Gzщ24 a35╪┘ ┘+Ы]tёEЫ{Ж▌╗w№ё╟бО▄╨ysч╬Е}Ў┘gАЙlЯb│хБb░ЭС└F'Эt╥╟МЩЭuюu┼WЁAEр\└Vрц /╝к ,u┬ '{ь▒p( ╬Э;б=Еo╗э╢/╛°в▓▓рЫ-ЕЫ4мK│ўЕб",┌t4Ь╟я■·ЫVее╨┼╨╬7▀zы╙O? W╦+╚fФ╓э╞w}╡+┼xЦАЫ║iJ.ЗEбКKЕ▌44:·ъК▓tU╫+_yэU╖╫{╬yчn┌┤йCЗPY╕яё╟Э√┌kпjCэ╦m┐■·ыДn:№═╟э┐%┐┬AТ┤ 8x8 Т4ж%-iI╦_P■ ВЦpA/ро]БирO╨¤,┤ЄeЧ]Єю╗яЯ{ю╣ ▄·z╖Ыn╪№╪цмм Оzў╛o■№Е%нJB┴ИьФ№■`qq1РНD═Еddd┬5п╣цЪ■w╤egg№} ¤ўpр╬Ж Z╡i ў:чм│╖╜∙╓U]╗╛Ё▄є▌o╣u╦Ц-NзУ╞╘жhЭ┬APEЪв█юШЯ■YЦeUUс╩└j@ZпА5╫^{-▄▐ №ы_ КGc"саF/╜Ї╥W^▒ы╦]╒╡5Ч^vщ[█╢_|╔┼ |у ир▐¤√z▐{я╫▀~{╥ё╟╡k╫Б}√БН:uъp6~№°╒лW°pG\I└djAh<а~¤·-Z┤@· ъэ ╜ u∙хЧмПрвЇЗ g2=l┌Xil:▄FHHЪ╙ТЦ┤дхп' ЩЪbЎ╚г7▌╪эЕчЮ√с╗яAVо\IЪШ╪П╦UQV0╠p∙├?,X░°▓┤┤┤╝╝°`оввюXWW╫к┤%g█╙жM╦═╬йи<8uъ╘ХлVО╝╣э-8f╪ИсP╬УO>╣WЯ>Pf`И^xбд░оyчЭwю┌╡ @sю▄╣└гGПЖ:6█м└^PЧд╛рВ ■Ў╖┐}ї╒W:tz*В[ЧХХMЬ8 дrO╧{Б]Ш- Рё╞oD║ЕKїъ╒ ю ЕАлр``5А9шАдQгF9вA3┬┼с├f╦╙р. ╓╗woш2└AЪ╩╨Ж╗▄{я╜@]~┐ щзЯFЁPh└Аpп▄▄\╕руЙ'ЮPuБВ1 ТуО;╞ PT√ЎэбIПРэДr┬Eа√аMату╞НГы°ыъg╧ЭL╞№м╟О ЧВ╞Щ2e╩ё╟ЙD``,п8ж¤▒═╞5d,r╤┼}Ё■ЇЁ╬= №єaLC╜а ─}/\╕░KЧ.Э;wf╢O ї┬┬B`M╢q░╛╛■▀ХД%·╧Р д║д%-iI╦ ЯЄopШ 4·|p╬9ч└Зи_ Sф` РЯЯ╧V0YИ8ц7 фхх▒х`╢.\яўKNIr`Дd╨╙phb8rч╬ЭаШБlрt╨╟@lБ@■№e▀^Ч╧ ╫╘╘Ь▐х┤ЪккЬмьx4ЦИ┼р,Т2о╪M│╘╫╓┴щCaМНг░ш═АSp#°Ў·ып▀╝y3А'Ш,N6еьXPT°┼_Ь{ю╣Ё╒юя╛ЕBк:vшyё┼ Вuї@Щ@-hЮ┤м▌╗wCБ┐р·═6+|ЫP1M ╞AЇ·>¤ЇSh%(╔%Ч┴PSаJ# юM═ Ь,z3\╜Aа"АMЁ░√щзЯа<Ё'45\ °щHSX└BV°O>∙║ШПєГOр=Лфъїz┘-Їfqq1Ё4Ф`ЭЕТЖ╨ЗК│5n6Bа0G^pРа·Zъ╬bkч╪╖ ъkпБЎЗт╣Nцb хiQZ┬Т°┴Я>П`СМь7Т.Ї&№ ЧeF┘ь╠,°юWЖжГFЖЎД?ar╜ 3и┤* Th:6ъ■KП╦яХ├iщH╦┴ьє?]¤FйЄf~|Z╥ТЦ┤дхп" Б@IГ:╦B~а│Вe 6╧ЖaJ,gш├Х :П├)@cаtлък Пh╚тa░X┴p№▒╟√■√яГ╩ЗсЪбHX╖-Ыч$^АkVмl▌▓eA^■ў▀~╟╓Щ0 ─^%AДлё╝22O╒-Z┴@ Y\e╕Q╖n▌Ю|ЄI°ИОlYR║я└~ЦG`jъ═@ч▄6э┌}ї╒WPr╕РДS`РXсNЭ:1{╥ў▀╧ЁЇp ДpYl(4#ЁTН┼\ty▄p ╞хж.╖A┐ЪФ%&fСqрЪщё)зЬ┬ьpp:Ё1┤█ш╞Ўb┬{╕РФЦm╬k╢<╕ЕСЎ ╠ьВP)hph h%и0b╫о]сНJJясj,5╘pоW`б¤i4l╟СЛ┘ЮE8╞\к├Ў║╜╪)М╔аЕa<8$Щ 88;7ЗэSd>┐P5=б▐щД╞St╕\PЭЖм$p╝KV6аaII Ы└╝Е9@├xю╣чауасp╙╢m█┬`>┌'ч┐. 6ьiv╦]╙O■8╪Ї╧├+Ш&┬┤д%-i∙ ╔┐┴Aр<╨┘аnЕИ╝ hъ╜КF_jkk ЛЛ@щВъэ^[]ГЙw│sБhw zчuВJЎPa╠┴И╤H╤ЎЙ'Ю╕ ~ ╦№▒╙ ╟╟5╡╓П9Е[Ч╢L─т║кВО/е^)═VГЩ╛~°са╨Ї{ЎьДЕRhю█╖П▌Xa╫о];v,--ЕТ ▓oп█щ╩/─╡B -8╕}√Ў@ZЖYЩ1оvд0╘hЎs╣<Э┬Вrг-9К╙Ї}ЁfXбvхвВBVB°Ё╟=?A√+#&: h3 MqкWc]г░Ц╒т ╓b╨ЄPlhи5t.░/@№I'Э-е:¤Ї╙Б░├к·ЗK1▐T~╡хой╗t╙j■yфЁ▓¤╩?·Wь4ж%-iI╦_I■ ДБ┌U ╗m█╢а8Y8bq╠Зў@yYNn.р╤┴jд:P╧а}ЛЄ Шu░UiK8Ф┤aщ,СЁЬ╚╝\с  Бў@!А └7eхААП,+р └JЬZдRs9y ╞ЯГГзА▐@ыwщ╥х╗я╛Y{oAЫБA;@I╤р═QХЗї Г6╓Шp@|р│г║╬"8Z4z ╘═х@{3єX╟?=▒RТЭО8L\N╦0y├jб^╠bZTPXSU- №¤?mэ;ZбNО+W╩f ╥╣ytуъ J╪З0З├Ё'LрёЗ.K>┐^/L│` *Ш║x▌ю4ж%-iI╦ В└я0а│М0З PпЁC}д=ёyyy▀}ў╝fddTUU┴Ы║║:8%ЙГЁ ^ZZ·сЗ╡└/>Лi ┐Єшu┴є,╕1C"╢╣═T╡Дк║╜>├╥├╤╕'╦ыryj\╫LbЫ'И╔ЎfUФ(╠/К┼0╠o│╞VФАRgv&╘Фn╠TСWРeГёДeМfzИ№Пс \Р-hB1XЎ°Г ЄGwцf╡є╕▄▒H=L╦эC√вElЛчАEз├внйjж╙#4з>┘B╢v╠З9╩`оОгкпmCСШ╡╬ДRФ$╛╒u■Б╞WMЇЁ ┤M╙╓M5СPт FKPM▌44┤OZPshy5бd╗<╠°dеМmмYbb└JМрia▄fтU` ¤Щ ll\1Лo╙qїa├ T]├v)░х?╠ЙЙБkб╗`┤│TЁ:pOZ╥ТЦ┤№ &┐▒·┐╜╠Д╟lF╠3їH8к'''заарУO>щ▄╣3№╢│0p[╖nM.╖l┘p.┌йS'╕shhHt╤р╛А.ВhыFfn6┌╜▄з╦SUWх╬╚└R╦╢M╤╝.g8v;eIv┼┬aУkЮ└аЇА,$^X@▀4ЁВ└O▐╠ `%P-┘┘сzї╞ХDc4Б┬?Dў├е╪JbVv╢I╙l░uUPфЯяиnuq╗▄╨{ДуХP╪щrщ jS ╖хАГЖe*Ж.╣Э/┼╒QНfq╨чєAС╪R/n│гО╪аwПV▌▓н~0`IDрtиsя8кы№!- эЙE╒nм╠p{`Ф╠╘HЇDB3tрfxMшЪ7├з█раhX ═&жA┬▄qdG~vОжи╠p┼┴Ь-в╤Р∙з-(╣E╟UFУqхжуК╕∙єЗбцE┴ыё┬п{Nс!ЗaНFah┴s укииHt8┬╘M[╩ ╙┤Z╥ТЦ┤№╚oм 2WQBгyАоa{еОФ|╛b√╛&MЪ─R╢~¤ї╫Ё╗¤╓[o!■Є╦/%%%;vьАC╗tщЧPcqщeAЎЖ∙єoД┬в╫Mр_╫ИCЖ7║i─ФД╧уSХД,IЦк╦Nич@yEvIK"Ёф╚ъБm╫cк│ЮИ&Б▓SlЛЁD╙u┬гСмAQ&пg7¤уw╔бк╫R5цiБ┼`p═е■¤ЧEW5╨С└Вx╗╛ek@Э8eиQ0▒E▐хЇpШ┐Ъ4ыЛ┴мz╠ЖЙDаП╓.╚·j─▓┬@;├иb■"GК°?*6]є5L├!ИМУ АШ+чqч(░┤ b6╕й┌╔^`з7t;| и dщ╦╠╞O ╙R|Цў┐5$■Xa%V5шNШИWMG╫xрб№Y$ЦИ├Ї&Л▒╔№pДГ!Ш]└Р6:бC4юрфн ЯЎ┘ uб╙ТЦ┤дх?HОДwД.р░└Aп╫ *Ф√Стщ▓,6l2dИкк;wю ЕBя┐ >т`EELю▀}ў]рПSO=Хё№▓│P&LШ &иt ╒Ыe╖KЛЖeЧа╨╨TаEж┌нXЬw║Йn═ в@Т┘y№╩#EQ╖ИкY$кJ▄╬@Muv1Жt1-ЇфmjA∙}╓┴├╖є╙л╦4∙oЫ:+К+;╦▓П┬┌Б)(░ЙLS╒ B╕`BБкв╩4MKWБЙИ.б2╠3Щ│╠fнГДобCЫ К█Оф╤|$i┌╬╨н, sЪ>кы№Qвh[rJ╕№ўв$╕RШ ],"`╪Цбh0z,▄\HТ╙Гж╓Ahчp0ШЧЭЫфн╕Вod'═¤∙R│f{VГJ╤q┼(PQt\aeЫ─ToР?ЭuРfОО╟в^ПЧ.f∙f╗НК^oТщ ж$▓Ёч▒╬ж%-iI╦АД├сf?gБф■ь╩╩╩rss∙хШ╖)$0K$Ў┌kп№▒╕{}ЇQ"СDd╤F▐{я=└╛.]║0[ pCГлA rЦMНp▄д~}gоzРH┬╪!Гц-\ИfBM#'2ЬфШ1t°¤УзРМмўї\№°гh ╜Щz╧[o┘Ёш&ТХЙ*╛5гb=o║y├k[I<╤√О█╫╜■Z│8H(╪2█Р/лO░▓&╦ЭЕъУ-1+1тїШЙ╕рr$эFм< Эv╡Ы╝·g]y∙ц═Ы┐°Ї│|╨Щ═ТaXD·н┼ю├/n$QFТ╢"Q^rрJ1Ьк*сРрТ'ёh╪ЭХ▄лS ВtДъ░╕╙дIу44╫╤Uў0Є√■√яП;ю╕г╜╬(0▓╜.7Т┼Н·_Ў>Ў╪cЪвО?z┘ЖЎv╗вСР73╙╨u▒aXКMJ,цq{`■а╓╘н^╢"T[O4cЄ┌UDж ЁБтъ$~а№Й═Ыw~■┘╩UК╣9╪▀╢Хс▄_э╘╥|EyyiI)Ъ╥ /;тuїю▄<№:Y8gю▐_~Y∙╘f"С4ж%-iI╦(GК╗ ``└rm№№є╧э┌╡{чЭw╪║b│╟cЄЛ`Ё═7▀\╕p!sWЎ│, ╬B▄w`?├A°иsч╬Ё*p|CЦЖBЁ@═JЁgB[╓зў╨╙И╧╗j╞м▄vk■Щз-Б╢БHМИЄ·╔Sю║╖ЗгM█╟&L║╡╟=╥i'Сj╘В|уЖ:Bb╤HЖ╫З{Ў"1З█пў/Щ3╫gЙ√╠█░~ё╠щ#╞П%Щ>"И└Э╔MWфP8C}eр+╙вНЦ$╛Q'┴MЩ▓хЦ║и2ЖOM3G▀ы╕├п·Л▌ЛЦ,Ь ╨Z╙╘╖ПX:bhSї╞ё w&M╜Оn X╠┘u╡╡╫он▀S.ШfvqQU}ufV╬╪▒гем<ТИРlк╘p╠эї4.Ч║¤7sЇ╪▒c╟K99v<╞∙°ўЮ╥^E°1╡lYЦuU╙╪│ /SqdfM%б╪╕┐Я;ў╙ў ' ?ы╥%я╝G╕╔ЄвЖ╙-╥g▐v╦дч!▓8ў╥k╟╜№2╔pЗ@▌C╙уЪщ╔Ёжv╬┘N°!╫T─N╙Ш▐л╧фЙME╝ЮЩ3ж}√╦╧Ol{їJ,╬y2шсTKTБ╒tXMUI$Dr╝x├жЪЮо,K\\U▄NQ-$╙┤L╖южнSЄs"ZиР╧Dl▄╒'╕IU=Сsз▌┌m╩kOЪnN0╪bеEq▄Ч&ЛX}а^Опї╫хфф3╡У▄P╒╣zМ╕°▒ў~ўэC├з/Щ;п┌VЕ,ЧbШ╦ц╠]░t1UтС╦№$+┬мйZСDМ8▌иэв С]C.┐j∙є/ ╪$.Б8И╩бzCц7й{ ФЬз┤e╥-wЁОnM├╞A#.о}cy@q╞вDв√ъ8°─·П[Ч=■q{_рvjФx╝X*┘БlЭШPё"└+╪o╝жк▓╦e╥НСUс)╪JH╒TlЛєq lТL║╣/nСП;q╦зрO5q ▌-├5ХЄJgn1"EЖhЁ─пД ╬╛т┴Ч I╘8ёJ$[BЖR4ф╖G╤/т.╕x4єф IмПF^пУD,╢┘євЛ7╝╡Э8*┼&]Й║9^q+'╓ NЗzAГ+*╢к█V╡ зL"a║БЎв@ШМ6о┌ЄЄ№ТR`P5БWkъ╣╪Є╨wu ВVнл%0Їю┼НО<╛w@k█z4!sGU~Цy╧UWm|{ий╩╞eq▐<╠ГDАГ╥)░╓╤:▐0Щ╤ФирєFгсLgu╔╤h GЕx\─Lр*-с┴Р╦сEЛD <░0 ИЕЭЩj4цp°p0├░Й┼qwЗ,c\╕Hд╛╬ЧЧЧд@╕f"Б│/J.yrs▒їlk№ї7═┘Є ~Ыс┼ ─Y╛Р?РЩЫMв 8rЄэwN▀╕ √╚%┌в5ЯьeplGdКт°Хсб╤Й[╕╛╛.77/╣СV3У^U н ї▒▓pОaЄЬD╧Хр╣└╣Н╟I8#y2▄ЖТaмBерс═╬'Х╒д╕╢$!ВЬ╚╗ё1HKZ╥ТЦ┐░  %┬мм, ╖¤√ў╖i╙цн╖▐┬Д^4rs0ь╤г╟ /╝_Э|Є╔d!i^¤їyєц▒o┐¤6╟q╔┼тЯ().∙ЁC─┴.зtЖ`С.kqМr╫▓%цЗИ╓cр4а├5╙ж╡єw~№nЫл.091╕єчЭN·ЙПOZ╛Иx╜sz(ш▒░?Qъ╘V╡S┴с ╢m╤s┬╕ьТ╓╕╩ P┼ёq▌LШЖ╟хЁЕYЩВeZUХ|f╓Фю╖M[╣Ъ╕▌аьH░ Ёсл_|БD#─ЧEв4№╤5щtрЖ3f<ИFчў╕ў─Оэо3|╥╨A3Чо .ў╪юw╬{z3С9╘╨║MlСДФ9'jN)м[╝l9░I,█ ·╘WFНюУG ╚∙гэYз/Э~¤╒У ї▓*ЩN&■ ┌У&иPF▌┬Н╫<Ш╫к5ъ╘╛!6т` U"шОs2фьо+_}Э└;ЙM-лZ2d№╕MпeиКh║з¤у╓В╓еВ╧┘g╘pjNФзЇ╕пEFNхю=yY9┼%е▐№)\3ы▒ЗЎкЛЄКЭPб║'╔s&LeЬУЩ5f▐\l 5БKЎ╠~ОL9┌┴ J"цu:╞OЯ▒f┴┬╛│g╜ц┌Ц%еeee'w>е▓жP╠ЧЫ=r╤╘┬6eJUЯ▄гO╦№№╕aЦ╫U/x№╤qCЖ╠]╜к>PЧУ[ИJbЫт` TЯЭЩ q┐┴├т╜ЛOВx]Kz у▄╥=+f┬сY*7єо^Yy╣ГжMЮ7kЪЩP│вцАеЛHом6╬гiS/ы>¤ё-ПМR)щ?;╘.╧Ф╝А&aUїy|\4╢xьx9Юи,/kuь▒}g═2N╦b║`bаi#o║e╤ц'ув┤ь╝м ЇQ╫bАчfЎXЬЭ ┬ММZ┤Шdр╛╟M9ЇЯз╫╚S√Ў╔╚╧ ┼в╙V>@ЬNвk▒P╪SPШ:|Дйh╧█║э 7▀┤vуЖ{ю╣'зeв┬XфчДю>▓4hс<╜оZB╖'КХш(у_4y║/Трuш║З╞▐q√╝gЯB^еДж╚no йWja╒ ▐_9э▒╟V╬ЩИEъ╦.┘░ълЖ¤ОВK╫ySZ2r╠■ъГ█╢╡kВfO'Y2,Ь,6▐FG┬│PY6╙║ЄИ▀УЩ1gъtbа╒╞╪┌IЦYиЫ╗acьрA╧┴ЗГоЩ╗h╤вiSАЎ№лgm~┴СРy╕тj┘ю▌'v:▐v9+┬с╕╧3kїJтp╪║╞AFc7Я╥∙Щ/w=4щ■╧∙▒эy]FMЮЕQCa┼╘3│(н5c&9*TVqRi╗▓=√╟?·─вбГGо[[]W-ч╦цOу`Z╥ТЦ┐┤-▓(╤W_}╡жim█╢]┐~¤╖▀~█▒cGА║▀┬Af№р0й╥чL+Нfz1ЩЫфЎ√ЎКUUлg▄▀cц$Ч/k╘Нў,▄Ї8iЭo90jааЪф█}ўП6уй╡─Pf▀╤{┬ЖMvЖ╠╡iЕLfєжn╪В╠╔ВA y@R"▒ME╠иоЩ╪o└м╟O.╒╫гz,*┤#aОUч!¤U╖Щ┼╬╞Р">/Ъ7╛╪u И!-╗ЬpKП╗Я|tsEY∙М%╦ч╬Ю1nїЙhD ╞│ Кs w▄!фиЙ°ъ┘│╟?Ї`─еIз !5їуцLэ█╖o6'gХvxш·;*┬■╔;╖Ь*Є╫gў0a┬$MS№╤Ё├O>1~┘2 ┴КЬ6-Qї"bй][╨Vз=wKn"▄▌ёьG▐~ЯdJDН(║ц╠╚ЭvэнSЮy╩цвЬ╧;╡█▌Sз╬Ду├fтБ╡k'.]М9U#1нЄ╦o╓,|`ъЇЩ╕Jюv$▄ТлM▒сuъжцJШДw,5fш░сДF╞Щ5oюдuл)щDUИ$-Ю;ўююwxNз(GГБеЛ╫╒╓.{№ т└╖Гя║{·мЩ┘m█┬ё■·┌ЬОэЙCвд╟O>jЄДi▒яК─cEчЭ=╢Oпп╛ ■їOwR`iм/.╣ri╨eAn ╬]Щ<їЕчИ!Y>▓{я]={<№┘;▒ф┌Ш■╙Б9 цJ^ў═=я:╢]{х╟[^~ёОc╠LПДпЫc╧╣ц┤Vэo6ШtlY,[є╪╞╔¤З╔АNЧ┐▓j╓╚╤3GМp┴T┴уНя█╖цй'З/_Ж;bKсMЫDвУю╕{цУO╖╟Д'Б'J$шt╣ИiМю~╟В∙ IL9°╦╛№┬вM╧<█k╞4█0╕L╧╧_;г╧}gЮ╨i└д√cї╡ЮЬь1у╟╬▀Їю@а╬@УЗэqч]╣Щ9<с╡u/╜Є╩ч╗┐|°┼IMС]+'N8hИ╨н)+╫нЩ╕v·▓dR#ЬmO>|┬Рс═]·└╩X╝z╡│e рж Иrє8и&ъ╛¤n∙ФY>ЯяЮСГ ╬.╬+Z╜xI┐┘3сИ·┌Г╣E-юя~я┤1°6-~ЄiЛЦ╟.Э:a╪ыИУПk 7Ск▐¤|¤┬eD╡┌v>сТ▐▌n▒.<у╘╙IВР`t╤Р┴#'O[Z0yv╙цKЦДk*2Z├x&JeїЁ╗z╡?╢▌▌¤яГ9П Л▌[^~щ╛)У°м╠э╚чеХ│чН3 bd9тР|э┌ДaЮf▐ а╠i ╕9/+╗▀░0Ёkё}xш╪QYyy╚аС─ЇC'ПЫDтJ0^ ЇугV.йо*+l╒ТШd╔°√З▀?¤гMПЯs∙Х─хZL▄╬iч\4хеWрW7K╔Pvj\╡x┴щq&,╢}ЛHАГ1hЎ3у_я┌░fЭaЩ╡сpлc█ї:э4сLШ0t╕DDБуkk№Щ┘Y┴pдд]Ыa#)D╒>зЭ▓ЎЯ/СВ▄╛W\│цЩчИaН╘ёєOсrдьYxёї^ГЗтN5аU7;╕t[Рw▀хW<Ї■{Н|╔╖И\├/я║фї7│tbыJ╠ЭЩБб1ыjIFйк&nоП├УЭ ┼А╣ДИ[ю:ымGЯ{пPT8╓э№sЯ{ч]тrE=hр╕╤cr;t─▌БzJEў№╒ФвУO^5f| 1уqх┤и;╖╛f╓╠щ═╖UЕ╦═╫┐ ╪Qг│█┤┼pKА°55#╞МY╝e ─@muvI ╕\C─ ╛a│ЬmXсяpў·√еєf╧╔=я Ofd╫7+╫о╖j╥8┤▐ЮГд░▌ТgCKN╕╢ыьП_пЛ╓fчцг╔:─Н8ч┬┼п┐√сk╧┼зGЇ╕фv;б UСGО0l()╬#yh%?Ц/Ь>k╘гы╤ ├ЖKЩ#о╕n1L-К2p^с╠q¤НЛ╖┐О#ц]║▐√мs╫╜ ю─Ажs╚hNшО└LБМ;O?ы▒ч╢РЬGp▀Є▓)sfL{d-V!к▄wу═-YAJ[уТq$Bjлp:╤"wю║Э3FМ║п√Э-NшМ╗>рАкъхы╫ Щ?Kй)w╢╚┐ё┬┐= ╩╦Феi<єЄ*[╒╕;Yи╘ццKGИыЩЦ┤д%-9Zь╤г@▐/┐№┬RК╢l┘rу╞Н f▒╕┘╜ГШ Дв╤h^NОв(ЪвfddД{h╞ly╫ю▓~ш╪їВЄГХ┬┴xыcО∙N О┘╕╘╔╥╛3ыуuU█№э╘║Ъ╩ш╫{Оыrj]ЫВ;╟НР\Щ▄█Й!ВM╒+№░Gq╟y"ю╓╥t°▐¤Э├хtфхя▌єул█▀4yкЫ█│k7ЁUVF&▒Ем┼Х√╦Вёhз.ЭI Hъ├уnщ6w█VP.э·рыo┴╒^sхJPcа┬▒Aw▀╖тЙgp█sQН╟&ш;ыщ ╚71ЄП.g<√∙╟t?╛DАRkcє{ЎєЎsшаjР■Ч\q┘Ig─ъГ5A┐'/╖. jъBА╢в<╘С╕u0╣М!олБ■v╔Ън╩?ЎТЫц=ўЙ╓вnЛEЙ╦;хЪЫзmyЖиБСгFЦЧM2[Ф╒╫и@}ї5+Z+ffтъV8v╫х╫>║¤╝(BШБЁрuДкк2╜y¤╬┐╕C╗cr│sА╫╦*╩UbUъVl}Флъп╜єЮ╧╝ЎZjяаMВ!l^Ч ╤А╧Cnы╛№╣чRaЁ╕єМгЦE╨ыё─│Чj┴HХ┐.зи(и╞╟м\ *?Q[э*.в,°kW#╜╘Й)кп╝╜ └EЛHKк∙2 ┬IуF=▒║ов,/│ФФWO4p·є╧Rх╠С╒╙ЗЫ№╥fl288aN╣╕█┤з_д∙цxтЕ╞Wя╛Є·G╢╛┴\Е╞▌uwы╠╠Т╠╠√Ў .gY 8√Еч▒Вх└1~?а▐╨┐_╕l√vdYМ└iрЦJCГnZ>l╕ж"СШЪ╨JJ[╢{ў№Ч^"С`X72КЄ√^xсh.иLuЄsзЎэ=u∙X$зчюло|ф╡нX╡Z?ё°po%pж(&~уM."t9їTxиЎь█+z]?э▀╗w╗a√я╝є╬╟Ю}7B1lМ!┘ О█Чо]ч(-Б2уАс┼├p╨в~$║]]3д√=╝№2v:.утЧco╗uP,╠╗$╟─╦o8╣m√·H(?3╗Аs╛╛у¤9_╜нЄ яР%У'nїнўЇ[│Ю:)ё2o░-зAkv╖[N<ЎШ╩X▌wZ0'+╫s0к─╒ЙЫVСш╨C№╤й▌юЬ }dЗHж ╛╫∙[┐є#K┬l*Pїy├FМЭ5Уфг├;ZOЭю+LGИm╬я7`╠Ъ╡юGQq+ч-▌6╝¤* ╩ щz▌╣'tГ#■ььl- ъЙiпФ q╥ея┘╗хС'р)╙#1°Э┘w░|┬Пв¤OрL▌]╖▌~╔9ч√╠ц1(й_3╩ъыx∙9▄Xщe╓-[ ╧Qв.\ZX№╒╫▀M{~ ▐TтmYИшЪOrж]I╥ТЦ┤№ехhqЁгП>*..ЦeN4ифцц┬╖Ъж¤■R~аддфГ├\IЬ2ц▒РECRc┤;Yr║╩?■д4n<<nўёC.▀д^CfнXр╘ь3OЕb>∙"Ы8зП:z╤ Wq■╝[я╗j┼A^kq╓i╕╚k"┘║)╕╨Q@з│v╦╨%]]H"Б╩fщr╩(qтёЇ╝хж Ы'Тьпл╧).FЯDPЧс(╩X╒L█╝n└вШ│o║~┬ЛOБЄu▌M 7<╘5в√-Л_}БnЙ]{уК5Iv6EJрў▌xїCя┐a&bВ&║■Жп┐j╒╫ЁЩ$!╝пўщзм√хл╕┐╥Э[<шЄлЦOШ╬╖iGjл╤╞щt(╤аУновБkd6ЙЗl├iс╠X"ъq{√t╛hэ█oгbsRu_Y9╣╧░щ"y▐юW^■─╝ХЬ╙еД№БD8лд╨СЭ┴чfБЦ╡┬▐уы}їНы6=Клы$'7р Ї6UБ┘ю?└W▄вт╗яJNэ фДыюy┘└┌)ў╝э╓ O=e°"T┌╟с└вАыd`╛Ы╧┐рЩw╖cw╚4{J} *xц[[W∙щютvэ═а▀ЦKЦнX6~┼К$√r)g╒AЧН8\G ЕeЗoЁ=ЁЎ;$QНЎ╘Дuў╣g?Є═Gx| √╗ ▀ ╛j╟{l│%Q°с╫tЭў╪CrЛ┤GDч^┴р╠N`d╩3ЎО√цн_O$i╞РбўП/+s├Сnрщ╪┴Cч╜ЄКЇє/VРzH <я▄Хя╛Пю8PмxDI─Ь∙∙z▄=в Аl╖[Р]┤·\ўn7m■╫Gh ГЩЖeН╣ёЖ∙+Wс╞M(Ч┐■▐█o°Нb}-╥ ╓[V=Є(юFЗЪV╫*╤ЩУz_|╔║UыL%Бa┤m=a█.АYFР"№}╫_√╨ /гТ$╤РЬО^7▄░■Х╫bї╡▓╧'∙| ├ж╤4ИЩ╕=└┤F^s╙взЮB/]О>*▒─РЫo^■┬тq╠4d№р▒$#n'·Є+Ў╘▒#з~Є:qQ'gНРИ╨╗¤Iыvэ&А╢D╪═0v"JжФs U7╠Ш0ЦtlUнїy<╬╕8ПЬ▄Сxh╘wNЪ╒їцЙ[Ю$А╙ёЙ│·Ю°т│k a,6шЖW<ї4эаR=Цx· ╕бП╣■Ж∙Pц· ),$&?ьцыЧn}═Щ12Є┌fMШъ<жНтпu┬ЇГ8╠░_8й=Z═5УhЖЎ├^3EQF╙#OV?┤╢▀фё$;УDгўП3ЁЮ^Е╛,░X3 шDзC,╬'╢Бnj<й▐∙I&L"=╕`m╞╒uП>╥o╔b%ьwхX─┤gqZ╥ТЦ┐╢-┬ЗyoПзккк┤┤р╧яў{╜▐▀┬┴╜eН8╪е3т 4г)*╗(░Ъжь? \Ш_рr║H\щ{с∙k▐xЕdfї:яТї█▀!.^Л╟р╝ьШr╫SW,фr▓G_y¤ВчЮ'YюP$╠┘\F6ю"╥Mr╔сД╩;03▓ГуC5┬a╤у╜ц╘.gЮz┌ф╡kP7к┌Ygt∙╫ў▀вg▒оsGУ╫Q╗"и d░b7├ЕbГо╜z┼╟я┬Y╜/╝l▌█рШ╛W_▒цНWЙSXЇє¤уk╝t)Л 8п▀аБ#ЗyOъАкWj>√lх#знXF┬ СЬў╢пЄ└┤╛@dЛ─tїч¤═_:`┘ j┴КЗ╝`┬╪╤,ЛTW°Z╢д:Ь╖УjГbNaУИ╝^чЯ}я░)7RWJ┤╒нШ4щЮknЎЮzR╠_eZ·3╦╓▀7z :QВ╩JD ю┐т р?^ПF%╖ўЖ┐_Є┬╢╖У +B┴┘ цО╜врёРъ┌e│ч EЯМ╓C|▐ ={╠~|S░lVыЦ_■ыу-╧<;cЎ┤f,б Н7a■Г+I0 et_ЯO>AГдШ└Oo~ьЪntggАЪЯ9h╚д┘Л╘y║ъЭУ3°Ў[X╖y4рГ?4а╝╫╤y┘┤АZЖ\p╒Єн└%P▌ж1У>¤ЄЛ▐|ПоР▄┬■]╕ъ¤wqЭF╢BцО9n╙zт░═Д"H╬qЧ▌tB╦╓wA7A╦є·°ёгю╛юЦNч  юuў]ы╖<Л.└4є═м╗ю▄[]│■╜pеТм║:╕!Y5jD ╣єРмF+▒ сAўЎX▒∙IъёmС`h╒┤AE?w·Я ЬQWw╧ї7<╢mйи 4Ў╜W_¤Ё+п`ЩE9Їє╧╦Ц.Эт░║4b▌╫┐_fQ>ЧУ┼bЫ▒┼╙ы nZ7 D$SЫ;y┌╧o ыЬ╬зmMH┬╨ЖЇP▄с┤╥∙dP╞5╗~|щЩ-БР_pIq█7▀Zz▄qУ\ %Щ6bДGH<·▌gЯv>¤ +3╗:Ю¤└2▄Ецє°№єНk╫e;]Цb╚╝╨зo┐■├Ж╡юt▄DШXць)Sў~їUыВ┬IлWAз Їє▐_Оi▀~╩Є░Оq5\]│a├Ж` `Ц╧уНkj┐бГ О=Жж╧╤B?юyЇСGаwаШ╛№Ь╦п╜║├)'г ╣╢╓ЩЧ_■╒╫П>╝1;├S^^>}цМлo╝ёВK/7{6M╫ДTюTd@Л║иЫ8~ъъ'Ў0c╞Ї╤sжwш╘╤╞n∙╟?ЄO; ╫ОBїO?-9∙┤уOм ЗФxbX▀бCЖ <цв│Ж╬ЯН ыЬ8└Ё?¤║є╔з$8;С!O^╢ ЬИe╕|zХ_Єe╗wmz№С¤J╨эЇd─э╛}√ еЕ$/ n╛r╩МП_|э╝є╬щ╖|ЮVS╣i■ЄЭ_э╩<╡єМE Э`ОЪ░_ў╚┼нJ▒¤сЪВИiLк+їh╚╣ш\┬Лїq%╖┤ ┐║╩ЄHm}Ж╠{y>У┘х╚╩╠╬╬фaьМ╣н(б0з[╣┼%╨ь┴ЪKЦrZЧQмкм┤гС┬м\_╒ъkkКТСХЩСЫПK╪ЦmFQ╘x┬0,┤цёvёqш#H═Q 3Л╞TEЄ╕ЄK[р4Лz ═Wъ+*LU╔╦╦у%╤ .К9ЕEpeE╒$gc▓┴ФiРfmЖ┘ВEю9єВН╝л╓ DГ>╤хi▌-Ф"║¤лJ╠*hс░КcJ╠.neTV╟83│M+тrXёx╕║еD,.╣▄0бr┴sуКY7Б5c╗оо2ьЗ..╠╚Хаж║Э бДыj╒·Р╙)√КrqР╫Зъ┴┤F~~ЦЛnВ Звїї E39Сs╣│є e/▌Р MP[e╟в0V=╟Oё║@ЭкkN╖/3 ▌G@ЪQWоє:╗ ▓╜∙╣╘╓k5о(ПЖв.З ┐КўffyK░ХТб┐БqуЪ )с╕вhN_╢ЮЯ┐Н╟ВїujB┴дЖк.╗▄пW╬╠а╧Сhrщ0╘iIKZ■фH8x┌Ї╕╧ч{чЭw*++Б|д$uш%╠є╒╒╒╦Ц-5Л┼AC╜ё╞GПГД█ўс╟mNыB$ю╗П?щt╞┘tYН■dЛЇ°Зў>ьxю╣Ё№эЗя╓yиf■ Mb5Bs0И└5`X╨DLВЖ└с╬$LnБ*╪└Ї!Ц─ЇYS$tiI кb╨5Юю▓2i АJчdJ╫D╖V▄`' ╔Г█*▐Бч-С┌█lMOp&'╣]─рЙ╒D^Ў:1g █▄ejЁ /)Y"Цaе9▒8╙░ nm▓JбИXK7xЧМ╫┤tKDw╝W,Ю$iМ∙Lc CХmЛо╤╦Dn╥ytВСSщИ)"┘2эXP▒p,Ї ▐є;єtЫ -54жnbD█ СGK']j╖iЬaУn▌4що/╕5/&UпО╚░7-HЖfЛЖkтл╨ВMуЭ█ЦХ┴п1│ KВў┼ХєxDч-╔Gб0ЪК╫ё`■eвШf,┬╣Ь<?▄;'tё░. .L▌┴2╪╨]ПJўКAQ╤╪╞Т з"нпЗIЭ6hэа5$1Щ╕SHk4;ИЖ╬4Pk5Б╠ ░И╓ьдЗY=нD▄А^s║╤m╓в ?,л1▌юе╔6ЁX:rL║рЕсА▓m▐-у^RK,Ю^qЬчP┌&ЙКрё■*Ij║c╤╘6╡кnц░1У╠з&QtдLxутЇxзкуОF╧Pг 68┤?кGў1^┬м+ЬА 0ЄКeЪ°;юабb,═└kЪh(Щ╟P╝Цf╪▓+9G╖Ы╪Фи¤Л▓Е┼▒d VR!&@└└to&╒iк_О╪З╪Mтп╛б┌.╔┬┤'t═ 7╢k╢G8mЛgСисЎGєТёАP║-┌"аKR╟еО╤$Z│¤╤фc4 ИХZ%eъ╧dу╣T>Тd3%┐VpЯ#▐├ й$x|у] C╡╨Ї&P4L╒╣!Ш5╟зR▀ $їYу?ЮD)т26[Ыn┌Q╪т6u[хТэ '$s╚Єhy▓iё9б1╡{┼l.6^▓i*╢&╠,аJL;F▀7йn├[}Е,Й▌ЧТ▌Mi'У|4>J╥д╩р'Е┌ i▀╠Tz7┌VйgАж╨╨v2√пm▓TXT&.2^╘▓э╟ж╞^ГXA─4Т▄ЩZM│╜ё╚0▄п█Рu0═^g6Ї∙!ЖmГF09ЇЖJSЫ!M╫Ву*мЫк`╙■ei┘ьbЗ~?0Ъ┬ЇрмT└╘■.╣w▒П╫8╓▓<╬╪ >СHФfц╦└\┘мЧщHуHrWn├6:Aву■Й&/a -Л╖t┬фс╣Ай=│╔│и▌Ю9╤Оє╨ ╢м╤.ё°$рЛhИЖ:;[nЛ╝EгЫ ФJщS`[&f┘fхa шx№1аюэFv─│Я╘лНГ√РО┤г╔8ЮЦ┤д%-F∙ ы &цy ╝чЯ^u]7MУуЪ ▌Г▓(К?¤Ї╙ф╔У сУ7▐xo╟ОGНГ<¤¤UL=ж$|/╙: [У8Y#ЪЭ&l▌RсcЩ╟ЬмЪaвLБП╞ф│єсZАTиKS8╪hzв╩Й│t╬6┘xц╛ШZЇiФ╔НAЦe║&г╥ K┤й╢╨U├эPЙ.PGUTЖ7░жвlШдQ$╢GбЎ~╠"═╢щА╓а-Е╗█kA╣Їдж9═-[G&ш~[Ч8Йcг&ш$gsh├Fы <з╨c"о╔ёk╝(т▒й▒MGЁпў╣ж%-iI╦_QОДГёx\Цeа@╖█¤уП?vш╨Aг6{<|ЙD^}ї╒;ю╕Ъ|ў▌wсчu█╢mИГe√qЁФSЫ╟A╨р E^└хKкХx─щё!ОеXDUЗ╙Й6░Д":1OоЦ▓a№ mjДk╚╩└ьЇЮ}·ТЪ6╪rп-│▀■╥O╤А$╪а*э8U ╕h%9Q,jEгЙ{5┤▀ШQ9╝├SV╙Fsh>╕Цnс)ГЪЭ╫NХЯн;ЄIУHу▐┼C K╘фCMLdТЄ╡У')РXмd;РFу O 3┤dВР┤шQАтR╓4ЕZВD T(Z█hQ4дPО,┘╘╔╕vv╥DREg+║ФЄЫFХfLNД&BaВО╞ MОMКIk┴,;╠╨'╓2&╙3pб`ПИА_╨22]^F╙быЙщ┘@█вАw▓йЯ<г:Т4╨щжA7├Є\╞L┘їq╦ ╨,sЄ╘ш─╙Ц└ чN^L А8J@нkжДegmNxfyвwGSmN\╓o`BМЯНЖ'ЩСfУ═IЪ эд┴rw7Р║шR╕EЧ4.╚5\╖ jL╫и▌Tцыылr╧З╓L─x>╟6^в?РйKВНШ┴╥r╝╤d%YZ╡dъжc╙═ D)┌"f?фУc╗┬ц╪~╡╘*sТ!S>3Ц7▌№@?oX░хЪ╢?IZ░щ╠Е#йNol┐ЖЮрМd;:йиG/ ЯK╡5]ї┼у8┘└Лg2╓з-П'дЎЛR`bK╧Т═7О┌m;Щ>zqj╤s╥Ў╫E│lЩ╟A%jt╩БEА╔}ЄXА!B1]╚У╦╡╢╒╕ Ы▄p┴!╔&Ён╨╕УбсЯШDS;5aршs$┬гI7╬Ы╔БfШЪ╠Ihin╬┤╥6}д╕$єЩН█ИНЫ&'Z╠╫З╨аiLKZ╥ЄWЦ#с`"СА▀d`3з╙YQQ╤о]╗O?¤╘яў╔Х─ыї№¤ы_ >|8├╝╖▐zKQФЭ;w■┘b1ш╪д·▒╔▐A╩Q■·@nv6б^┴PпЛ┬йi╞ ╖╧лjкhЄвCК╞╔у4щП╡▄IRGЪН Ыюd╚вв╙Ж)╪ЦИ▓T*f7n▓Щ-Ei╝hуц@ЕjpРVъ ]LZ╤D┤Ц ╤Qjl╗u╧mЇG!I&╒)╠q╘╩Ш╘гЖХtї%НGтъЯaО╘J+╫╕ДjзLDё╧dxe'┐Цyfk4mK6Й╚ < Z*ЁЗlsN▄Э╟76╤бД─n`ъh╦Ф╪ц°├О╘S#░$hж%;Шs ╝(Єl│6Z)W!1╡■оQГAБ?╘╘╫Аъ▐hп┼}УИ▓2*vKvЄЖnЛАA1h█Їж╪2[|З√)8вЫ°Xe▒UL╗!└!·├Ё ;* Z ╬▓шb6ЧB╔T lў'эWЭ"I,бщRhSрШ8ЖГ╝ ╙Їw ╠$i╤%√_хт3У╡─Эм╔yi0GZ╕Жm┴АO┬нe┴Y+sIЎ▒щ@рSW5МфB}cьA╞╥ (jЦ╙├!╗Э'сX8CpбЭ╠%├L NЗ┤[зCЪгЛ╚ФМtС╙У│█╔lкqУоуr╘Т▄8ДXщC╘тщ╙ш├A0 GЛq№6т─3б─pА╚<Ьа ЖmЫtВ@7х&[▐а{>шf?┤Ї╞шr╣З╥YТ╠ujFЧ2┬\a<$╣╣C▄Лbr▐ХЪ■5tЩР*0╡Ї┴Ё▐4$Yд[)<Ъй&D╤УcBd\h&няй╜│iIKZ╥ЄWХ#с иoП╟#Ru▓wя▐╥╥R`9 ═7 лНb▄П╧>√ рПa▐О;ррн[╖■Д_№┴┼0УУщЪШж╔5`pD5 Q°∙6,^B 1R┐╪bSШHYSЁMpщ─HmЦчТW░ЪZ┘╢}В8И╛┼&Sо║хb{╟M\-3ь4┤аН4▄[EЭЩп!Ы)n╨BЯj У╢Ыд└╩:TХ┌M^Ы╝6Xa╪нркR╙╩R╡dъЖрЩ¤мб)T├░e─р╞╜Ж╓!+ашУ2р5║у4u╗сS8Ш2d6i▒дeкIЫз ╫Дю╛ЙсДoт8╠7Y╖эдП╟oс =_гф ┌M(НЦ╙Р■{╫'EСїлsў─ЭM, *ж╧Д їPAФ$ц└Йи╚ F@QDE╠9+ &TDPQ0Л∙<╜;L(░lЪЭ╘9}п║vЫЦ=рЁ ╘ Зcow┼Wпк■ї*Еiє=╙ИHJУu╟ЎЪ╢Cq;&'Kh▌╝y│эЦ╠3тэ.ЮE╞╢;Ць{Ў:d╣D░∙╨2MITИ_┐┘\З6╪╔ДЪзЦГЭE9Ё/Dh$;U70╣7█kЩ DЪo;╝╚7:Ы ╚v<JPM\ЯkЮ╨$Kю╓ЩCI1мЕ╪|>_&╟=╦rDБОФаЛ'╢═@UD╗Щы4)звiZ╒рYqVl"CиЙАп╙├fC].╨т╕hжММц1 gт'5 спoo╥╬└·я·<}6o∙┴|╟ЄmрнР[ я▀тПє╦yы&м╡р1pYЯ╘┘рлэтЩq`Д╢ы°иН6Яэ┼F┼mEЁ╧ё = ╞Д▓lOщ ┼ЫвГn`Д└kклл;uъЇ╓[oс¤▐╞+№1EQUu∙Єху╟Пў╝■·ы@Ч.]║;Л╣bsL╪VгM╝ё╫'-ЇаSЛт ╓Я ▌8в&ж╞lK3У╪pй~QМ-O}┼╚╡ш`c%иЕ╝l"К Тn m┴K3{[/6б]╢"▒Н╩i=RF╦%RH+`Z╨Зpz┤╡ДЕ*╡Бbбu`6їы7эЎ[╩l╦в[ ыЖЙнgsc]▀(@┤AQnцLеП┬хq(┤2Mylr┬43їbК_Їi▌(mMQ4ПЪЖ%═KbC[9 ┘ i▌Юы"√kЁ╗╜Z┐D╝`═m╙─u╘╣9%ыЖCa░ы╫MпU╒m╜@╫KS▒_:YLAAёG╞ЦC qSю[;ЖzKщр6╬%┼&@щ ┼v J)(((((((╢kP:HAAAAAAA▒]Г╥A КэФRPPPPPPPl╫аtРВВВВВВВb╗еГ█5(дааааааа╪оAщ ┼v J)(((((((╢kP:HAAAAAAA▒]Г╥A КэФRPPPPPPPl╫°▌╤AYФXаГМЗр#∙╫1 └W|Є┬Пl╙╙Їе╠║hB┐,┌ЪC├ЎЫ_sи9IAJ▄ц╟жўEQ3~ A▓ы┐^?нL╤│┐Йп┼n╓GsH,▐·▀╢ ┐бп(pv=O═¤fчБLXЄЗшсxCo╠·9Є╫╧╦╞∙*╩╗╧рШ╕тў╠║4┐q┘√═ ]╧Zп╚H8ы╩▒Iё<Ё╙ф╩g}ж┘{╦ЕЛZ.▀Н╥╝ЮГ░Ф7╚~иsБ║6√bЩї┐{°┴ 4Р]?Oa▓╫╝YhMz█./[м╖aQz═Г7иXс=пщo,%6,ЛMk(┼я #:╕ЄЧ щ ╟░Дl╙Тe╝┴sI*Q;Ц╞ jTQ4О\1 b9ф╣╕wТ°╡-K└ЗC║ОЙ"т╪ ╤Исq┐e;Hрq▓ ├О╩Вы8<╟л╣L4sTНЧгMь┬▓░_9Ъ╞G#Z!I─M█тQu БбГ3С┼!cLCсeд("[╧с^╨╖г>╟·ШТfЄYЁ}кр<┬qС─┘╢┼K╝Г|╙3БUИЬtЩм$i]╟Пл&У╤lA/Й*╚┴)Tsj┤$ QШ╢ЛdrTЁ-Щсуж╧░\6ЫЙХЧ8X╬FBРСэg ┘xYЙ iеi╘QD▒EЕЬcK╕Z"PA&пб@W▒2rЮ┼B░ 5$рКJAAAAё├ И■╨┴ў7вГA╦0q|ОЙDфh┤РйПAяe┘ПM┐єь╤Ч├├№G?юЇ╙QiSiЖQфЗo╣m°ЕAx╧дI7Ю//ГЮ Ц╟¤в╫l╨оц{оcшRDn\SЭккBЗY&╟yЕD═B7,∙··xey└▐D├╡YN0С╪QxY1$F=i6DПтQ_с ╤uZж,RA(0BАМ├ц !U>aкy)uСгZЖ,)ШЛА*BЧ╔ztё@Q┴╖бб╢м╝╥G^┴0b▓Ьk╚$KJ0Э*фQ$Оt`'q¤оы2@}>4Rв&√▒╬А°╙ў=╧2 %йп^[^┘[щЬ══пА0+$Э║к;в┬лЦ#ЙШ║ЩTд└>фйЕ\ш06NB║Лe_d`╕l╛б╢"^юпйБ▄б6ХВуYаШ┌ИAaгУw╦дIуж▄А-╗>╕Кm█КВyЭн└ъа╪╘·ЖhEЩ═░6ЄАдbєpFЦ═х▓r,┬ЄB:Я)ЙЧpЫАC`ч;ЦЮwL11=4Rр7.Ё6AЇ-Ы`ф@Asб╕Єy╡M4ъщЦ┼╕▓$!╦├╢2*рЙ}╠╒\▌t|ПХ'ояЄЫ qЁ▀ъъъОm;└│V0EЦсy.│vu╔;@╩5Ё<╤╠Bc!Пс8╕u╢@№┼ЁР└:║Z░Є%й╞╞zIО(J╙Q?(ieu#кИ9'ЧфгPЬ╛Еtаї▓╚s(_╨У1Тял#ёЮf▒╤єpнsy╘hвь1 ,╥ТX}жF<Х╔2?Sв1H ф2mв╝$Р6J░VUгЙh`л┤у З жЯX.жсmЮВъ Kr╪/■╖═┼ ┐=E╤╡AL]ч8.СJAcдkф╥╥zїЪ;▓╤E├╬╣ыёЗQi ёшЗ┐█i╟╬╚2O0`ю sзЬqdПYя╝Лd╙A╟х:-рx╬9 iоi╔Ш[╪╛n0Т╝ц╗я*╦л Йl<▐Фv]GКВ\ИгH╨У║A╧n°└_ @╢1]╙)▐╙╛l%вHцЄЩXв\AяgeЄмщЁ%I·kЖх]╠ж\▌рв2ЮFc<╒PБ°jЖ╣О*1╙0#╪BЙ╣[&ЫС#ПmK╕оT0r)9Э▓п[ 6╟БЇ]█FТР╓ЄЙHBB|█]o& ┤MKТdрRЮa▓Т╝j┼ўm╩█pЫЭ_ЙсЇЪ┤"╦кmЧ╔d╪PЯ)л(!Е_W]▌╢MЁб╫╒*ххv6яЩHк(╧:║АГї$ф▌6с┌Ш╧TЦФЯ0т<Б(╗XМ>cy<М ╚1фп╬ЪН ╣▓ФЭ╟є╪ч{┴┤(№╧u░═,Ся┐№▓║CЗM╡l▀vШИвЄJ2^╨T╨▓ щГА│9TТ@ЦБв2Щт4\KцD█▒ЯaПе@╠xЎ╒vl─ 9]/НD═Є ЭЕбИn<0∙&$0╗aВО╤8$+·═у В└м[_S]^Uйц2PЎ▒d╥│xрDY═хвёvя8@е▒Щ═(ф,+U^ЙSeqI╞`√wоk#Б/d▓1йЙd■╘╧┴6]╚├∙└Ў98║мЁЖe)"╚╦v]Зg╫p╫Хb▓CFAЦ╟Ўr7пs█ГБ,FDИWsM(п╚Р/╦┴Жo[z╙ e%╕╕kkк+┌╡ЧЩ··ЄD9j╠┌"/дтНЖ╩LМ1'Е┴PcсвaС─Ш>жГЮВ(дааа°ус7жГ>6cA╟@L∙l╢P(┤▌a ╚6ю╕|╠йgн┌{┐'╟_█чШ╛U=║#[s8─+шся╗■·Ю╜zю~p╖чо╛■и>}╦{Й╬╘ ў|╪╞в╢" ЖщD$bRrа╟╒ыыФ╥▓╟ю╝УA|>ЯЧ$e─ШKзМ?сЦйn6╧З╠TШ╞┼dшR=╧f8Aї Ж▓щqл3╛к1v@0-ГН╦ЦэшжЦМЧ ╟CЛн;"ы1Юo║ШsБЁ:H╫2Ё *╠%z^6WHЦд╓V╫T╡m┐j╒кvhLЮB ╣╡u╒йTЩ─уC+Ы#I°4c╥ф▒У& }DTu"MA'MPDс╤05┴└Д╞0jCC┤┤ьС;юdV═mn~}╙`}│h(cж│R"U┐re∙ОЭm╞j╠e+Б4h:тx╠>НK W╨Ек╥F#ЧгЄW|┤\4эЫo╕∙Б╟Em╩4KgХЛx`4x╔фES?·Ёг}Ў▀_Й┼1Х╟ыI╓%х∙84t.░КLp╦─╥█ШNKЙ&@Zfu╡мE╦ЫcжрРО.*╫╡eN┬B&\I┼L╧m·Ш Ъ6╢2└╔L\╚╖@вuЯ№}▄╒у[ЎvПз■Чч]l мпО╟]│-акШ\в└фщ│НлWзк┌A╘XкС╬йяO╗ф╥╦з▐Иdаё F3u1 0╛з╘X4П╕░b ^ сє╢ю р╪ГўLЩr┴5W;щF>G╤и╧c%╢'жk╓ФЦз рmUв14Ш$Нg3*ЙbG└D¤`┘фKБ:G#JаИ╛зъf^НФХуe Q╟┘\6Y^fЩж(IШ╚f (Г╪lфь▒Б┬r╝Ы/{┼-30╟┼ifєЮe│╝╠HR`Мgш·A К?~{ы xsmGЦe╟▓ ╩h4кп^ч─ 'Я4хїЕи1s╙_╧╗Є∙9╚╫Piы╛√+╩╩{ЯxR╙║┤═╠п,┐v├T╚▌р╤#ю}ь╤Qcо>Ї╪╕ gOЯКвl]║о\О═╛√~ж:s·Е#g┐№мъ8FF?g─ИHз╢N0щЙg▓│$FЖ█ с╫`─▒*~П╖ўpОs╙°ё;╢k╖ЄчUЧП┐КMХ┌ЕВРМ7m╦ ╓с▌0qbC═┌=ў╪-Яm}ї5wПЯpс ╫! OЪ[┘┬╙ў<`¤Tg°h"q▄ewXw╞═╙╗Ф╢∙╫┬ww▐╡╦J┘W#\Yi┼E_Ай" !╪└╪ц▓╙╞М▐}ў=kы╬╜ъ*─yЖо╔▒6ж:╒╘?q╫▌Эў┌¤Ып╛: Т╦G 9¤▐╖_┼FP╝ЛДє╓нГ8е$п>ц├k╓|№ю╗5л╓4╘╫s<▐u╫=4їжє.ЗdiъфIэb╔х/╝8░wя<ЄjLUiW~╬ec ПyнаH2╧Є╒▀ ╥ ╧Ы9U═f█╖л }░єx╪M╫?є└#'ЯtВ/К╡║╓vя╜N:ўьЯлл;┤k╧8ЮъU╡Wy╕╬╓ыs╣▒]К*╦}Є╚iЧНМ ┬│ж ?╘╩ЄшGў┼v╙rв<ч∙─вч▓К┴¤Уч╫¤/єЧ-├Й═л(Щzuяы%╦Ўъq9iуЎёЖЬyF}}║ах,\tэ]╖#▌D▒`О╧░═┼Я▌x¤u╗<╩TШГў╪Oy╙ї■яш#,▀Я_°╤Э3ftь√Чяsug=√ып┐▐▒]√}╗uC∙╩f│я.]v╟╠зkЦЪOgfLЯ>fь╪▓к╩мZ░Р╖[ў├▒9ЗmЩЪ╣╝дDХ?ш/З┐Ї╬;A~3(█▄№Єа[■L╦ФE╔smИ/╒G.RН╤├╧╣эё'░╜PТ0a╥t<9╚ёx7╟?8e╩Q=zь╥╜;╬Нкцkkf>¤╘илоBяz&Зу5зЭ1д▀чЫ~ ┐Ї└жКДMV^ёП╥hLў#.╕wjNd╗▄ Зь3(ЯCrфс {rш.╜√тРY┤т═7Бs :эt╛кx╞╡Ч_~╩1╟ьyxwlwR ( ╟дkъ8╙V%:j╨а{ЯyE#╪ЮьDФВ╔тНш ╬%▐°L┼2H╫/~▐Р_╟ ЎjxЫЫ_▀GщьНз ■ыНWu<╝√ЕG╕√║Ы╤╬{L9°ДWЯ]]¤K√кО╚Ёпя{№y#FTЭ┌'█Й|╣ш╡■¤ўєп╝OВ╗ЮxE№'ЯzєЬчЁиИаЫ6'Ё"+c.I2м│ xтН┼H│p╓ОИУо╪└оuїkыШr<┐ ╦ч_ ж]╒¤P╫W╣d№╦>┌w? ┘xЗ▓нЙч ╣■╒чаЇqЎM4f▀├o}ч=$[Ш─┘тГR─ so╜г{╫Г*I~ ╒мпyфЩзFM╝ / ▒IУП▄яаЭО99°яєoG]6·■ў▀┬#Ы╟{┴6╪eLну∙rЧwГ%wЦщЙ'▀~╟]ив 9)ч█ "e%ЭОьБ╫Гтє∙╦{ЇЪЎЄKHWQY<╪║МёЦ`ъ·┐?°x╫├║уХЛEгpў{Kё╔26юMшs╠ФЧВ9kZDAq╔┼з┘╝х╜rч={ХUю8xedЫ5K?°рл╧_3&ШЎ╟Ўюs┴=Swъ╥e┌iчЯy╞Рк╙·▀┐ўЛп╜Й Дж√Є╜w╖▌│╦Б¤·сM!лk№Ukf╛4gшmSj╫№\┘б#$|l┐уGМ▒█аc1M/Xу╬r╦Л╧с─у╙q╨┘▌О|l┘;┴┌ иС╝═°╟a▌ЄВ║ R:HAAAёG┬oL=|·ЕСxипнэ╪▒гm█│oЪ╤eM├7Я~▄циГ╙ЕB▌Єo╗qD]Еr№Еч!Yy`ьХ;i┬w▀~│Sпnїkл▀√ЄИcО¤"┴Ю:~М$E╥НщTксн$:Р$ #сГ┘N?·и┘Л_GЦЙщ t╞Zpf!ЇЇЮ6╓п▀уєцс╙╘T▄+#Mrт O/ZДT∙6ЄTmU╨;╝JяКс├o~·i╝гXЭжтЕb№&ш 9pF7p| ╘г{? ∙5Б╢КxЕ fц╛Ї }{L∙x ░РсїЁыя Ч╜цФп[2s_═Fi¤бСЧЭўЁ¤╚JгКrФv ДSЇ~Ў═Ш╕+ZSЗRхїю{╫ЛРм╢ф█4N┴Ы^l 8ы╚БяЫ= %RxaЬaс═╬╢=ф╕БO┐║)╟┼я!┐r0ЩkкияН╕хЪkеЬy`в=jT}О}q┘ы3>XМ├┌иOЇ╫ё│ЮA2А▓ЄВ╗╢О+лIО8°а=ўйj╙ФЮХ┼Ьg╜║Ї═зЦ╝Б\ ФсьЮ╜{їu,H[ ╥ёуN>сЦЧЮG╙Aх,]N$─АZМWPK#┴j╤Ъtу╩_ц═zжmiЕЦ╦Gу▒┤жЮ>aГ┌╞зXO╩e2йTКЧд┐ЎцоЪv┘шс╖Oaei╞╪kоЫ>уГ┌=їTPє №>Юї'^0ът['WФЧ_ц▀╞_¤К2yПcz#LД 9╪│йщZDЙ0d╦з\─P(М5rЄ─Й▒╬ЭГ%_К&0Jч^╕╞ ыьуп,─&%КЙ├Н:ф╢Щ└├T╠├|╒8czuыя" Л╖UГaГг:а_╧pЧvя~√чя"▀04S>Ч+`u╩▀╬?eрри,Г°*█╢н╦eV7╘r╞щ┴6ы№│╬║ ▐{P,FОMF║Жвп╛Б--ZЖ$e╨>√╛ЇхЧШ)╞вИь┤P"-пv╠╞злcF^0щЪkТ8┐2╡══/шДЗ.■╦w~╜Hч╣▌z>Є╞2dаQ╟Ў╣ўэЧPiх Дфєv█ўб/>G╤`w-УDkк╧╜Ї№G^zєрг└ПsъeзЬ:}┴+╪jUp┌ ъ╠└hЗ╨ЩG>є▌ўЪ6ФрЕ}╪j{┘░aSo╕A└Y$\F@ЄАCО@ю═koЬ<ЇФ!\:▀╔Йd~^═╦ЄЇ╟ю╗Ў╒╥ лKл┌#╙╗ЇргoXмН@И┘ЇП▀Чv▄з╨BЧ <хъk}╟6tыЧ┌╒{░ К5?э█│'КJ^═┌╦.║°╓Ыfа╢UШ├Уc─}z?°┴Тт╔bmт╙p ОкH&Й║Й╧!·qenm▌к~м*п└';Gхgч╧yєTь╞вp╬┴З<·╞Ы╪Р\╚бЄR#Яхяv╨ ╖▌▒GU╟.m┌▒кSМ╞o╣яюqЛц6цS╤$Pє3ў┌oц'Яр╒омЛ╣╗"¤▓fuЗЎэAхF█Ю8┘│ЇЯsН:wЁ╥Zн┌╪ё°╛XШл╘iчЮs∙ OЭЭ╪эШыЯ╡OЭ9аў╠зЮ├№█p.=nр w▌ёєO?илъ▄{╡!╦ж"╩!]ё|▒К╟K#{s▀в╫0s5 ─╔C║u{·│ПчСє╬╧8ЁРYяМЩ"М4D■ЗЯWv▄ilё$g¤Pы ┼ ┐Л╔b╫vb▒ШЬ╔З╧UЯЯx┌ ╫/]b╠р╙oЭє√ьS▒╦N°фш═╠пcбЖЖ CNЩЄ▄Sимt▄р╙oyЇ)─+г║m╔╦╚┴фe╡kЭ|╪aЗ3nК'QНЎ╥мY√ї:╝уБ√"╧╞ЎE▌FМpq┐■w╛ЄК`╞Аxощю3рvyа\┬шУN╣э┼y└▄╜BБmWE╢Т,_╕ Уnь}▄ ╠╢Ax~Ь{■╢█N╛xФЗьs╧?я▒Щ│1uegё┤iєЦ╜~я╗п#╤ў5╙иmШ|ЎE7═ЩЛН┴<▓ы╙п┐▒и▀йCВ)√─К╫ ¤у/N╕`К─pЩZЎ╦│xъ)и, ╥[ї┘Kц╜<Їкл▒Y╤ў▀zў╝E з╬z8▐жКuAя_lpз┘▓"ЗН;╛ab;├.Щ∙╘QП├╞I∙"tщ░a╖? pw│РУbёQ}√▐;o▐]ZВя▐╗ю5flpо ?мGя╟_]ДY2и/оxш┴█Ю~т▐o>┼< 0Zшsь¤п╝ВCОF▌B~╓╦єO6Мчёб0╦ЯЫSўп¤а4Ag`Ь`xsюЬ~тХг▒и ▄дуO^<eg ╜pьS3СЮ>ў╝│Щ┐]n═╗я|°┼ч'№mтL▀iЎНУOЯz-оJ>Гъы'^|┘ї╖▀Ж√t0┐╗а {^ЬНb°╠uрш╫№їьыn┐+╪n╠╗О■╘№y'Ьrкг█йX┬QM>.m┤єЭВВВВтўЛ▀■▄AYЦ ╣╝(тSw ├(jхzs'N>кч%=Эqуu{╗ы_╔ЫкЛ3Ю╦╣▄╙зx@╫▌ї╜oъ Gu=h╖^}Ё▐^МАЎy°T8П ю╩b|▄+YjA°р|8яу┼п √╗uЩ╝ K<├564Ьp▄ё╗э╗>=╫ўЦ┐╣фЗ╛╫4]РД █kяоGОOf╬gА╗жєЎГ╧╝Ё╠3GЬ:╪└Gp0ч^zQpXМGNО^p█├o╝Ў┌G¤┼К ▒Т╘░│╧┴4╦4Г]в▐┐/^╗ъЧ_~^═p,$rп¤ў▀√└ё╝a@■■▒Ёї¤у+╒╢╬╦сm░~╧#П┌ч╨Cё:HM√d┴в_V■╪Ш═╗М█yЧ.╔╢UїмР\п╝ЁППнГ°>╚p}°·ы+Vми╧4n~~Q:¤╩╝єю[їя╙л_┐ЙЧМыu╚с╟9ывчю╫ў╚s/Йщаэ^▌ °a├Ж■│ц▌uEO┘yП=ўю∙ФК·Ж■фГ y=┼Л╦Ц,;м╟YфцР;rЇеP@╢к┐6чE╜оў┌в╫П8(ТHд│╣3/╣╙иDСV°j∙Єп┐·╥╥4▀sX╕ю■┤_▀▐Рх/╬ї ·ъ~7№Д ▄¤░I╖▐▄їШg_2JМDРГV╝ЎЎ'~тс5ЭB▐╨w▐yз▐╟Ў├г9КLлЎ╦╝╣hФЧэ9╛└╥г√ю]ў├ЫlXфgr №`∙gЯ~к·Ц─ёь╕ыCO>~─Щ'3°╕иRb ~2БXО│=Оc]9ЮЕЇр╕яВvъ▒╟°{э╝cз╞╞м(I╤Tкв}√├O:Oшm╠f╛^Ў╬WЯ-Memлр:{ь╜Wп^╜]├Ф╪sц∙Щ№ vзvэ╘╞╞=w▌ї┴9╧Хr└%╫\НG╚√iщ▓Я╛√юч5k╥ЖY╡є╬э╗ьz°╤╜Ї╝крМДХKЦ| пo╙j└╗~ УОOэ╜+и▄Вйw╝<■С' <¤╥╤ч|D┐~¤]qщ▀╬9єА}ЎL╘cС$┐єь3ЩЖ┤]╨ъъwю▓╦N{ю╛cП┐Xщz1{Ї╛√Ч.~г╧╤╜ЗЬw╕Ьy├М╖Ц-8ь╘г√пкDЦєЎмчkъ2Н╤КЄВ┬w┌c╖ю=z)╝╚8┴1Ш<╡RPPP№СЁ╙A╠ ╩╦sЩ,D&Лву8ёx║╨ ╟Э2хй'Рг ?°├╧╠Цу"ЧУd8H7╟Яy╬╘'Ca─IГ|■╝╚,ё\З┼77 ├┤╝mY6╛ МgВЁТ3$╟¤ЄуПXIi─яЦ╫Tп9ъ╪┴6 ╙s,6ЮЬ?ый]║ьЦ╬жя╙7]╜║┤▓ °А@ш yє#╫4╓ъ╛$╥h╜ырKч ЁїЯп╝%╒+Kжm╜.Я;жф·╛осгy1▒▐Ю7╖вмd$ы|Ё┴MУдР*╝ Чух+;uЇxФ╒їL>╙┐w╝%─v█f─╚7╦?J7fYБU"▒орЧЧЪд╛■1╘Юя░ф╨;?╕ЮXАД╣Я}№С J[Р_¤¤╡E╚s▄Ш┤▀С=>[№жнY▌· №╟▓е*ы|╘СXр5u╫]2цЪ╟√a┘[Ъэ╞cхЭ?ЙТ╦q╠╟o/C Y┘ё╩т) y ▒╝яЇ9сД`/нўсв┼аG@їЦ╟╟ўБDё╨╛}0s╩k|,4шГ%oдq╫▓█eiПю┴>leЦ╜°ry4├Gвш·ўO?jdь#Оэу:N╛>]RZ╣|с"█qСФ╚Б=О6 ╬qPн▐x╜Яы█┐_╙┼╙9 IС╝ё&2э█╡пнйю▄є╚пЧ╝eзR]П8│XCЕКї■Kє"▒Dм┤№З5╒}ОlкжД╧ИvPp7▀Ы│gэ▓╦оїїiиЬC╝@Кy■▀п/K&u╣╠^=z|·ь▄Є╩╩N=╗┐ ц"Ёx@ПфZdфв/_}-UV*EФп┐¤ж╫Й'р¤╬ЖCФO?№ ]▀ є┬сGўЧ_-~Лс9+┬pdўр\nрїшЛW_├c9▀╬Ль}·ШОt╨и═*└╦геГ №╞tPU╒╩╩╩B.СEd|п}ч+:tД╬U╦а╗uкk╫м°╛c╫}Сo¤┼Є╜<▀Ъ`╗фТ:°gZ/туЭ╔┼$╢эI└╥0W▓Ё!,ёДoшНойРh%o\╗6UQ╤t╓ ┬!╪к*D# їuem*uMcБрpм╚x&╢┴слG╞╬yЦ$сUwxГГn╒Оєх▓щЖdUEc╛PПС QЇlF)I6.нк(kX]]╓╛ГY╚KЙxp└КЇваi j╢ввЭЛ|═RУbФ╟K╞|K3\╟цQP$8.▐│╝сЭ┼с%u╢m ╧р╒xоС/╚ёДзммшъццWdО Ўм@D°r?,╙жm1$*|╤·[▀cX░╒мAm█г╝Н-Э боР~UЙ" ЫрP^╟У°└з9|Ї`бPИ)▒рli'╕&єьь┌Ъd╗╢Р ]╒2Й┬сБXШ|uu╝m<╪Ж┼:'GьЪzб┤'─0Ё>9╢┴H╟qаЭPTX╝¤'ШEНЩFЦчёD>ЫM─бРQЯЦW╖┴XA│ЁЮа╕,ч╫╘&*╩Гхq>ZUЗ*Rk J_R#IЇыiж,KMТўPжж6.I\,КчИёЇ(▐н74(хFA"▓ \ЧчQc#║злl2цz~N╙ёБфЮпИвпъLРZпРcS%ДЄ"Злнпл,/┴╗pЁ5ЙиЕ ЬИ╦bSw %▀5kх╥╝╣G╟[ЕмXТДa├╦·┌╡J▓пГЇГ┤r┴СщЦ╔+▓a2#сЫ╗ё┌G?ЧkL┤oЛ4,ме╔eaЬГw 10^u ф╓5Е╧ч│ВчGХ$*Ёщ╓╛g!ЗН(yC/СуМMjдааа°#с╖?w0ЙЪЮ9#Пc╢сж ЮcЙ<Г°l6WЩLpf╨═фTL2X╧RбєЛ;о├√b`lk┌Gс3┴┼R<0вwФAзш╕8|IБHe`0╜!┐Z&├KвЙXЖ.*Кы╣@5╙РВЛeY╫c |Z ╢┘Ф─]Щ╒▓Ё~c&БўmУ┬(HЗ~Z╗жк]╗рX╠╦jкW╡o█юзХ?ю╪й3Цм ! ╣L>СLjЪ╠▀=ЛПГQАЛфЁn|e\.█ │b SНf√╛7В,┬cЫтjжГ^3ЇА9ВTёоjrDЮч9.+╩Ж║╣∙НH"C.█рD╫0╕^ФЩih())ЯШdФWL┐b▄Gя.¤ы)з7r$NДИw╦цГ;▀аPX╤R╠`X╙│└Ч$t╫8Я█Зw╢xз│▄GьsЁ┌ёyЮйййm╫ж▓fэ┌к6ХжЪЧВ╪M`р└q▌`лuиБОЕ Ь°nдЩ°°F$Ы╧Цч╙,ь@A<О'> U═;║YU^a┴%l кол-н└7╗оg▀░W╫пMHR"Q▄╖┴Ш╚хUЫEGАжЛ.()лiz╧Єгж▌▄ОН╡В╓МЄ°hELIГЁыъ3е▒╟5m<кллMЦW Б+hF,"{О/sМоYJЯ╒чx6b9╙┤вВь,>/Э|б1ПЩЪБ╟X▌rf$▓<)В▒є▄·╞LyEЩ╫t)J` 5<╝~4╙╡|╧g"B*з$·H╚ды┌╟*pP<■gт-ьЕR ▀&R╙X/Ф─lОН 1▄ЮшeTЛAREФР=╝Aс2┴∙▐ ш>Ю╒╞ы+}&g║╢├Х&ш┌A К?■Gtpe@▀▌ИВ╟qL▌ИFгр xLЫк*DоfБ5FK╦ x/f@"9o]tё]└°·8|┐мЛ\┼╟╫|╣>NП0▒Ё|$ МкЩ▒Иь╓╒|╫Л╞"∙╞Жx*ХMgТех╢e1┴vH ╢■D"Юm│ВР╦чЙЮ╩S Q|a+DЕПЎ┼<▀i QZ║─8Ь`!GF╝ЩNЧ&K▒ MєщЖxEЇЭжяB]_p&▒\╨cXр+йx╥0-YТu▌TЙ!ЩЄ╜жЭ┼ ╩ЗLщ|фi+╔VcF,)┴;m╠╫ї╡E╓A|┬Lp#-8╨їФ_,╦ейTcc&Х┌▄№BРЪЪЛGГcлЮы∙,░їАu·∙<Q>\╝(СБ ь▌╜;╢%╦╥╣╞hyJCЦИя╛ї┤ъ┌ТТ>┌Є═о═ЛТэ║2╟╣:ФЗЪЕЪ¤╪fй·м╧е┐EхaЫП A~)(■4°Э╥ADbБоLDкg8>Є9"#й▓"эИ¤ЪЛОЛ$n╜юЗДF┌╩M%z┘Р[╘╒╒A{ Об ЦeаШZBщ ЬbЧ-|СЖЪШ╓]╢┬V─╗∙АNВИаYД└╙щtiiщV─ RЕюзввВ№╣uЙ$МЩt] :ш° #ГGA▒B│N┤p█rхmИїкu╟д"АLb▒ Фr·В╛К ╛ТЧ (pе@|Бш@А▓Ё<╧c_P]ШаBx╛ЗВWPУ╫с9бЩ¤сё╒::И░=ъЬ|#цwp г2║L╫▒9Псx.`lШBР┼Ў╞fув╫№В ┬▀└I╢┬Д├─▀┼DУхH║Г`Л┬hЮ%А\@6%A`ГXAoAhдЎmNщ№Jp└CиЦP:!Я█╥ааL├▒d J|Sыg╢U¤ B#L┬▄К)$№ЖB@БКТ|бm!Я-┼пЪ_ К?~╟t╨Є-Чсг╚bёжЙd ЩZу[*wЁZ?╟СбыГ╬┴vЪьL$щ█(6┘ УиI│-┤Jбу╨╢-<┤j╔Ё "┤)[▒№qЛт▌RЫЪHW6И[/И▓I|KrK,!РVьgиH╬!┼EДH╖нФ■{┤вWн2ОI╣Рт╪Ш▀[А╨Fv┬─l╦r\Чt▒Д'Вюl╠ypф{.ї+4р∙ы&|]iЮ%░╕G4l=.(fAН(QG╙ШШш▐0╤ЇГ ╢J9─╢e ї~!║║║║pрHЪр┌┌┌╩╩J┬?4MГ╬жХpH▓блNеRd║║uУ[яЦ╥╪РdТ╟L&Й$нс┼ЎR(0}БшBInEк60Г╡2:'V╥є╔64ЭnC┤вWЫЄК З▐И)ОЁ+|Вzя╙щ4BМйаф Р№┘LФ=+0#Бp╚Фq!ЯПБ|·х:№Q№`q у7¤╤─ч0┤Юц z>е─БН ЬшЩ▌а┬a:ШюрSsRюEє┼Д╢Fm$З╪2ё▀,CfБЩ`ЪШЗ`!&█ЖDcтJ┬gЪHнкй▒HФLбЖ╒№7Я)&jЙk.─vG3м╢┴+}0╦╖$:р╗Г╙0W█ в`L├└9┬3х\qбc█gЇ[╧ЇAьPВб1  т&РBgn`.╞╢н┐╨└'ИЧ╝▄║&и8я─,GКlЫ╦g3ёkчЧВтOГ▀+tСп9│ЯїМaГL ПЕЮЙ &─Р' │╣█i╢Ed55YБч┬ И═┘С╓╘╘TUUAS-4мД'СVЄ9БOнX√аЧРЁM i°Zi╛7Е-Нwые╨бC"№нОz p 9]╗vmЫ6m3█╥Ц╜╪ЦC║▒╓M иhR,ЇЄЫД6╞жЇк/PЙ┌ЗKWбPаЧ"ы#CЫ |Х╟;ь░├!XЖщ╗╢Й8A┼├д╨,~PW┐ОaЁ▓ ┐rYeф╣иЙ8о╖v|@/m°╢└0╢▓tЭўРп[rI М└l╞eE+70■1ы╜█,:И╨║┌БEЛ Б░&ж√P▄Ш`n<Ч0BаЖВ$Вю╡k╫О(ъfE·лБ╠ДТЄ┌:zZм╥a╤╖ВmU┘$F&(0|▌╥ЇгвМo╝Ьу┐Ч╧Vр╫╬/┼Я┐W:ш ;g]>ю·█╕▐eГ∙"шЩlД╖H:,╥Q═7ш╟Х *h9╙▒єnc√▌╦·╦╛┼ЦХ╓9 DG╢ж^u╒U7▌t┤╨yГ"!sщtш▌m╖▌6~№°╓%H67▄{я╜_}ї╒Їщ╙б-▐║ЦnKу▌"└ТЇшгПBYB╚Р╚pр┼KDD─uхХW▐xуН─J╖u┤ь█o┐▌cП=а %нKм╕kД,tъ╘ нO'hEпZё5uъ╘╤гG├╨в┤┤tГ▒°Еz┘? №є;ь0xs╞gРН╞d═%ш№Зя└│ш└Г╗}╛|9╝┘ рГ й" ┬2╓ї├? ┘╪╪x└бЗт?┼@Ш▐·g╖╗I4яь■▀▀|#"Vm╠ю{рHт]▀cQУ)9n╙Є>О grQё)3■F|1Q░T wX= {x)бя8L░н°Я}nh·ЗЎё▓e@(:╝{pXО_╜fї├П>Z]]O&аб eЄЩ ╟┼пR╨ЁNеRhєf'6d$\ZGЁ═7▀ь╣чЮнx┘&їЧ4ы$^x═┼▄╣s√ўя┐ )╠x( И~╖Й|╢.1┐j~)(■4°]╥AЖ├Ў?=~ K├FBЛGЗd╫-Ї╨ХХХЧ_~∙4} Г¤┌kпЕ╨2Щ Д╓║√MaKу▌"@q^}ї╒└QB▒ЗжИ-КЧ ▓y╧=ўАў▒c╟nE│NfЛ&NЬrГВr╨║ХС╨A╥мOЮ<2Є█v на╜jРыi╙ж╒╓╓B_N нoG!АчIУ&Буыо╗О╝ й├УП?a┌Ё{ьбЗ└┴yчПD┴)lДъ╩0dJўГ%oup╥IБu0аq▐z═Рї~v`rч√с╗яКУйня▌яX╜pЙыiкjЫxпz<ш┌1ШuМp ╧<,·UsYC╒"ёШЛ7╜ЗЇЁ╕╬Zк&F"■є│gл╣№░є╧~цL╟uO;э4FЦ╙д └}ўе3Щ╔╫_╖f═"лншєл4*w8D┘ъ$с▓иV э &А┬╖n&▄Жї7мГc╞МБA#┤i[Ъ■0уDT°s[╔gKёkчЧВтOГ▀ШТэ┴Ч@Цc█PаГNp╓@Bдыr пp╚сРЖ╞Ь■шн│╬┴=|Кn╢Ь;СЩ&╘<┼Lмzбm╛Т3>Кў)З6!(─;8#k┌╚╝9о╕g*▐3ТQhўj1^pY|Ц![З▓ЙЕНqF┬ 'kКЩ1yА,УцxSёвв┼4ф=сОд╗╩чє#9Єн├^xL╞╞┘$1ТУ)╚╫VшёE&┼ИLК╩!╝vГНКаZЁ b{ ╨uРUx.`hХД?!G-Цo(XYlD\Ж{ЖBъ┐]°ХЬТ╩У<Р,УўDЧB∙ЯО╓ТЮ 9=x }О>j╟Эv~рЮ{·ўя_Ю*Х j:YД №[_|·щуЗ AоГд@╬оЗ 9ф╗║бЛ▒H0D`<╫ёWд│Яыъ)Оcs▓DьАжк╣╢│ЁХ'Ю|▓ч8м"У╒КЕ▐╝y▓ЕЧ╢CЦ к щhYйп ╝4-$Й│}ьМs╬╞DR▒;ВR└H╞█Gxс┴╗я>с╕┴х;ьpян╖Ю~╞йк*╝Э╝3╚│ёIЦcIйЕ2l}х∙ Е╚°П╦И╪╔╨.рСZМВж |I6(Р║┐A╣РyГ-╒+╘╝╒&8ЧС'!ўбЖ_фeЛїЧ─BДдВ■CvКЧXРЇЗ qOД┴ВЎB%"i(▐▓ГZ=IА)ДарсвЛ.ъ▄╣3Д |+LCx┬$5м│┼▓X╝мЦt▀Y2kЙ^╗у√K┐>╝╟~▒ж!√Кщ╟ я╖Et* 5╫\ тХW^ЙК:r2йВAd╟О/╕рВ░ё"KL└б8лWп~№ё╟├╞Єэ0Пqу╞СЕ╔SжLБмЕчZ]zще$вЄЄЄЙ'^u╒U╙жM#═:i╝ZМЧ╠├B░7▐xc}}=4м0·'M8Жў?№Ёў▀чЭwВ╥фMЯ>╜╕kД&"В▀ЖЖpL:E┬I?┌b╝ЁbДДAsL xУ&M" ён╖▐ТNр■рў┬ /le╥6Ь╦#Kу!@╥ФЗGшЕ%╥·|1D BГ╘Bf/╣ф╚,Y4rфH╥РFПMN┤о?√ь│{ь1╥∙AЗ@A'OЮL╬v╣ыо╗BA╡X╛┼ >|°ю╗яБ@DW_}5ДE9j╘иTh! ш°▌w▀ ∙╜тК+HБd└ 9№тЕЗёу╟CqА/╚ Nbi▄s╧=PGf╠ШAdЕ6AI,aўF▄<;√Щc·Э,-]0o~п^╜░·q═Х┴┤╛■ъ+688║╦╛√>x√э#@аa:РE_3╛¤╟7╔x№╟ьz╨Б╤ЄRЯёГн#L░╚в №гOЬ<фtН`уЬяCО~Zё=Д╢t╔[={Ў$eкzП▐Gщё,█Жй│а D З█n╗эзЯ~║¤Ў█├їйd >ЙZPTPWТЧPЖнWUr\<Ф;дЄ╛╙N;#▄└X<КCA'╧ds(<╘ шx~°сиЮ┼юA$¤-╓_H*4GрBГ,CUВ╢¤║ыо+с▀t╙M 7Єr[хЧВтOГM╤Aи&d[¤ЇSh_╚кdr╝3┤╣Ё┌Ёь ┌5b-8 №єў▀DMMM]]ph+╤·лт6О╛B1<ї╘S$ЕPZРr2с Dzгn╕Z№Л/╛xЯ}ЎqC[ ];┤Єdд┌─.]║siRЙ236ОM'╨Vh" █Г■zAаbчЭw8=n0щ┐▒Zi[MИ] ▓*╥А}Г3)Zt║0"Б\@яф ─ ∙Еqш╨бфJ"ч<РЇт■кUлал#ЎKшРа┐ (zH╚d8b─И6m┌@╝-Ц/Їы─ЮiГп шЫ!┴ае06/ №P$ ф№єЁЎx ╨CA=Ё└сЛаP+╚P▒У╡эaў╓  ╖╪ў·°уП>шИ°█┐╜╟^{!r\Я B?Ў╒Ч_ЦЧЦеыъ╦╩╩▓Щ╠╫_}╥Р!┴в=ё▄з╦▐+-)QєDОE;ь▐в5[─ж _█Ыє°У'Ю5 <╣╖╬╢м▀№T¤Э╖Ч╥нЦМчБЧ╜║юЗуїЁiO╧ є╦/YСу▄ p╚їn√ю V ¤/┐№▓rх╩╜ў▐╩4╛cЧЭ/сq╚Fc¤є╦пv▀cр░?|єэN╗я2┬t0╪Нща(Ыўц╙ALBМи qыVЯ ,═а∙▌║u#їў╦/┐сCэА*▐с■ДAPУ┌┌Z╚oUU╒░a├┬S╢Hп└/9PZи┌PM@sА┘├$"h{heЗМlк■1"лWaX.! м└ваu¤ўЫOщ'WГ@ ЕсиШМB!RР4▌РkєNН9@╗AМгPA╚znЦ■WlЭ ч─I!В>▀Еъ ]№U╜уО;P`рДД▌{я╜ чы/ 2 ╡Д╨АM~Ў┘gрЮмх%zСB, C(&Ё╗MЄKAёg┬жш 9▐Х┤`╨є┬╚s╤вEdZпEўdшрдIУа*A√Ё├╔Ы╓ш Їш╫╔╘'жГ6МйёLёхч=<э■с(╥|G1 ╢У╘ЙИg╞Ь■тн│ОG:B└D╘tю╠fГЛ╤ЕGоР╤vё╠ iИйП0h╕/╗ь2034CЁ|┴ dЪ?xэ ╟Г8ртВ▐И>·шг/4m▌#╤ т@є╧гGПЙA8ў▌w▀ў▀)A═S├рх╓[o└nб9#В%ЦhбIЕ~Е4Иx$У2ДIl*^Є┘¤А^тМи!К▓ц║:~ATЗ4┴─аэ2ЇX╫\s Щ! Н|н]x [y┬, ыВ?бБ; фh1╕Ос├WР4Ї╨# с@I╡R╛(шn!┐dв ╞F╨+CШk╓мБО'Ьл"Э\(""╚)д (рW_}╝Т !@ЪБl э╨#)ФVшрЧ╘B└e╤ШNзkЦcШ╝(¤¤УOA╢√tРХ═ЙСш╖Я╒░яАShY║╢╛ы!З"ЯЁ■┼G н{пгL;╚/р9\█}ёйY╟;+8╦ЙьMAОn°О√╩╦/8ПДHЧм4MCВ∙h┼W_э┤cgo Ў╒tz╔Т%O:Й▄2╥X]╜|∙Є^╜zсп w├рbQи╪,Ь│Ь2нesСD╟еi|4Вiжы└Ъ╙LЭ╖ИB9cx╫S#РьJ:h┌╧=1єФagуЧQ┘(и26G1╛a╬|Є╔бчЭ@ш╣@S" ^&ивPИ>·№¤ўS┴║I╥┘├аЁьС#1 Кl╬╠Щ'ВW4ZВбЪрН,╝aК$гЁ4─цch<ЯG═pм▄Т╟▒xЙ╔╤Ah2бГф╢ю┌┌ZР+√pI░D╘└ц┐¤Ў█w▄uр╩▐Р·BTT Э T╚И5s╩н╨+▓■Ш░ Ж1─ТG&HK▐:╙b¤%БC┬`─B╓Т%tс6█Pё╚дm1W#З∙ГGpъdиx$aнИЪ╠фВ╦)SжпnСл<╘ИРН▌s╧=дйДАиA╬d*ЩИЪМс7о┐р╞ЦРl▓├Ъ,1ДФД mII-#Ж╒mХ_ К? 6EбК┴Pъ ┘╗0+Кl]7═ 3ф8░АА#оkX#лл.о├*╚AТE0Ё HОВsШ°\d┼|Lb o~ў╧=[▐├вмXч╙KOwuЕS╒}■>ue.Дo│f═Ах$Qj,Q оY│ЖЫ┼xя¤єЯ ─э|Ё┴!р ▀Тx8╣йgЩчC:уу╣Tї╛uЎ3o R|g║├*\оB>мПл├n}┌s╫[z┴TH╛O▌:к:,aM8Т*Юo^bЄ√>м∙(@ro▀╛pяb0Я┐╕$n|їз┌дьxW _dxI├aАx╣gee=Ў╪cJЛ╖]Ф▀·ЇщИГ┌╛■·k╓ЗА!║RС╧bБвdB═Р" ╤U\е¤;UkЙ╞[XXсДQуъБy°сЗesJE6┌ТkУlP╩fё!Msta/j+wmjъ╖▀~{Ж╜йьРр3ЪГАБPсV▌М3TD@т^╝ўЫ6m╩:╤Ё▄АdM4┐b@F,cў╚ЖЭ8мCt.aС@8A▐x╤Эь%л9:ўi;О─█г▌Шх[ceШsДm╪я▓┴\Ueхk/┐r╦M7╗Rьч'T■└K+W▐╥╜╗┤╔бЮ}z▐ч■▒квЧjdд╫м[з`_ёig¤▐^сAK ╬s+оъzлхтRАГЦGФ╦мм\║dI╧Ў╟ы=P^V╚╥▐∙╛^ўeЭ┤ П╦╔─╕х╦/┐ь╓╗╖ЕБJ=Ю┼│gыш╨R╓оTN+їЬ╙NBb╘ЄA╗!╦Г┌хqK╩ B _Uї6Л┴p<} Згя╤╙ aЕ<¤Ї╙╩╞mg№0Ы0aВ@:fОў~@ИTw]с╜┴@BЭ┤#╘▒гhї$Р{▄чЧЯ=У'O╞Я>°рИ#╨╖'Я|0.╛pD'═▌RqT'?╣ЁdOY╖еIbK'ЧжLЩжс╞Й'&┘,VСmг<=NpХ╖╨XP▓8&y~qТg7nLs┤{ ¤ўы╬7J√r;*у5dшxвDpP╝╙╕ Жp├Ж xr9ф╤1ўє╧?╟├╦▌║uxИ▐ ¤dpРЭ╖ЁтйFУe∙▐Ъiй*OН∙┬ф╣╖кz╩яS╝ЩГе╩V%╡!и▌Є╩ь┼7*Ь─╗╤щ╡}лбD╗m█╢}я╜ў┌╖o╧m▌╕ FХ╞УЫЫ{ъйзтmN╡КЎтєЧ2F┘п@цс├ЗCъS,сп]╛╦Ё^╛я╛√ФцRJq╬O|<▒эВГx?F 8эRy0i╥$╘&z╝%ёB─╦.ъ¤оl╖╠тР!CP/b╚Г╤гGглQz╕╪vщК1tшPL<ф╬<є╠3ШD З√ь┴Х╬чIXОчJВїЖS3┴╫ё!SPlpхё№ь┘│╗т╪KВ┬Oia,°f'аJrмM╩■Ї'╔с]╗v┼Э_q╗A%Ф=°┼-║УIЧ7ш*жЮ,ве&°╓▓e╦▐╜{у^`A,'АT╠;Х╗╩╓_Юw▐y█╢mНQ8и4] ╕ъNёДm [W@Knз+рўo█╝┼[Yu╞╬к▄┐┐FЭ:ы>√p∙·║иTwав|╧Ю▌Б*o█╙;Z.└weaсо▄ь╢зЮф╢Ўd▐К х дж╫|s∙є╫▐|Smеy,а┤сўЭW_╜Ї╥KнїЖIЇz╖eэ8ё─Эй)>ЯўЕчЦ▀┘їОГaГ┴вьlk│°┌k╙"ё▀]╡ъ/∙Л ░OAY┘╢ █╒юМОUбР╟щ№)nс`╪N╕ °f:0║Г┴┴╕V-8ип.>цЬш$ i┌qтF╠Я?ЯOЬ`)+nщЫ╫t∙SJ═▓В▀¤н╧- Nlz╪ДG╝─,ъyOсН7▐╤#GОф╖╗▓CЛсХ▌дI╝у╕п*ИyрHHw▄┬ШpTЮp┬ @Д▄Dз 8~╣;STT╘жMЫЮ={▀шyт╢ль¤j╝Ўю▌ 6Lў0d├╙O?Н╛QН7f╠Ш9sцМ5 Х╔б├(Iи╬пa╝jQ¤Ф╘╖Й┌┼1^пш6mwю╜ў^А┌Зm "N5ВЙ\@hF╠╣имM$╤u╚8}·tpLГф`╪С╕3Вщ@mР cDА╚{Q ╞Оў>Ш├├Ж гаК;┐X$X╛МЇЛ1vА9└ГБj╤y╘Iы@B7╘?a┬╧░Tи▌gыШ8L:ЦЛ2ШP|wёЎjн+░шЗ╓┤╘7c9q!Йb▐iя╚O╛ObЯ_6Н╫┼▓e╦PувrQI^ёеБ┼)╦Й.T2h3z+╓,ЗTХMЛ/Ю/░K╘~QБf▐EE┤Ю°Э2e ╙л`tрOЛ-·ўя╧-ю█╞}~├v`╝oЩ╘+Ьц4┤ещмY│P'^ЙGq╝Ж 7Фd│╡Qxn▐╝Щ╧W╣Oп╕╒лWSЛёщзЯтўq╤ ▐|O▀р╠╖_mк*з:ЁЪHї╜╩хk╪иV█vнъ6▒ГkФл|╢5?пЁw'4+-+ty|Чv>_ейj┴┴(у}3-┴щx+Veb╣В7^ж№jь╒лД:N▐~√эxуп~└aр▄Е╖6!И╞M┌эсЛйx╙)-┌E▄vй├/РY^^!╩г-"Ж┤р(р8 `─ЖH╞т*^ўh┤CЗ╫\s ъ┴└!Їbl╗▄c┬y┤xын╖тхЛ╫4╞Еw4 -м╤ ├П°╙яez╫▓╧z╛∙XFA┐ў▐{YYYttК╦g"'МВRР╕ДJJ\┬К─└мl║Д╙$?v~q╛_┐~─ы┤pG+Р╗иэ║ыоЛЪA│е╤>ЙжЩ@Б $"Аь /╝┴ПЪ!щE0У∙DэшАHSс Х╛┤■д" ¤Ч =╖ИNЯП.:▀╝ys+ОwN8АхЧЪСШUU^ К╬8ьOї5L│ 4QQa!`Д3l%Ў№╩що▀░^5╥xrC!t ┬KВ▒BнKa;▒░C9╢■° а-ЄКс▄░Цjb,брfL╗сx¤"rBЩ╝№╝╠&Щ╬HМON7Wр!ўЛлEq╫Ы▓╧qЯ_>Й▐Гx∙░sўЁ╫X╩H╚ Ў─'ЖЖй╓{C▓nЁеJcDvI аПr@-?b┘с Ь{o╝ё=/q╦Г╒z~QАЯй▓╜├╧░и╠ц?▀x :(dА<·Eр ╟?■°c╗vэЁa╞═╔Ц-[ус╟8C╜Юb|Ш 2o╬>°Ён╖▐:дюК▒ЕqЫх)╣┐╝Ц;├┴<A;TнK)эк┤L╪]щV┤ъ¤√╜uЫжZо$╒hrЄМсжи╨MFFНЕ┴HxUщ╓rД┬|▀%jWEВ¤рАїЛzГ╕Б¤з9?╗Йи▒`gd√4БВ|M2^∙2цЗ2Г√у.L*MmжNЭ ю=Ў╪cG ЖYч╢m█┌┌г├I!гl┼ ─0╤(!`\>3H/╬3GяЧZ╡j╡sчNPL■ЕbчЧZ^e[< Bx╦@ФНhЙ)┴ аmpi°ЁсМ·A7j2P╩ {Q╒ь┘│ё№╨AREб>5└>иж┌9иHМЇ╕░IфХныТлtч'tйи┤(zDe ┌(J%ZS╚&ZssУSЖ╨зфРэFСX·sЕ`╩Ю~·i№тл&;;[ x8В─┘I(╤zуе╪чЧ°`*эQ╒GqШы ,B1╘Я▄j╜7─]cш╨бxGуТюt╠╫Р╛юв^т░╔У'гK╒═╥!·Wе=Р°Н√╝({5╞Цg╓j=┐~q╠1°∙╞k╚╨ёDIр ╥4Ы╛·ъ+|╫qwВеxM╤уН63|]у*До╙O?5╝є╬;исЛ/╛HATе╨бД^ ╢SaL╬╙РхFbYЯзJ&,Л┬^хH│г╠T_/@/Wn&ъБ■∙·└РжOЯ~▀}ўqЫ)//Пйr%DЦXЪЛ%nдХ╧Гe]▄═втЯЙ┌Щ*РK▀lе;Bв═2LрВ╛┘!C)'/еАзГд╨аb▀#FМdu9OеО╛yt87К.D?ЩД╧Й 7>ё─XЛРШt^╓бЙцЧ[ fliєJ+~║щИЮr╩Ф) ╣─єёЫ+_OоА3ш╧=ў▄#{|Ьс* ─*┼ЖГ>}·аcA-╣m■╦gГn ФД█▓╣п/'¤8УTWзиE(rрТ'гZдГуТТТх╦ЧcжPн$ыУ╒√sф└Н╗▐T╠єлb╥╔PAЕГ#XWLRвlMд╝dт╢Ыш∙7nЬ▓Y7o▐<|ЭsФюJВ 'LША┬╥║,0.f"█аф f Yў┌Й}^ТЧWЗ¤№R¤мgРByж·╣╟k╚╨qCЙр d+╨╛6ёТърз&Гp9"ACu┬C╟-|От$=Сa;и"о^ 4Г√- J└ЄО [D9]ОшАВ43Дё╔эNqYёe┬╒ЖГ Ббg0SЎ╦/zHа?-ыI4║цFio%юMP-╟э!e┐йaЁ0ЮГk╓ ЮQэКРC╘Й_Fф]╘0Qy@E#QS`Л╗4ї ─Є╩▐Bв╚GsЇ▌ЙmWвl╕ш├T°+ъ.nHUГ√ЎpШ%OчЁсАBzf╚6∙╦gщПиjиДгвn╪░aHT┤ОDє+$*№Тб %╡GиБhП╠╤s;╡dTб╔I╔йЕ╤Й Ырю]Шн▌[зУN┘ц╜Зф│╛~TD/(╢Йв┤уGЩ╠╦n,ю╒а<│т╧N╠zЇ1JЭ*в╝Фq%o7.ЙP╟[ HДi▀АЩвG-КZo╩ЎXR1╧/GБщFatЖ|ОЇъ0╓Хш9я╝Лf:╒zoLЮ<om╝hЇCtИVЁ+ZI╛·И╘%Дз╪квк(gй├$╤bЄ+Лю║J3╣╤ЯЧDххЭSнч7*Рз·ifфЯi╝Ж 7Ф$I▐BЩЩЩxB┤ёП│З╨MУ╞·xM╤ъЙOиY│fЦр╖▀тS╡╔ї╞Тz▒(╧М╪∙┼ aФ ▓И!ftф*Sг4уtzTInb┌u l╥Щмыl8бH▐vL hQ╬@пa╗Ъ╝ 7qrvnы$;■b┐еЯ kСtвОiЁиЗK┤▐т>┐RЮшЦЫ▄@йю║bЦs╤Ь╤┘.Q╗┬У╪чWпl─I>kЄвулOПX─ў╗Z2Є▐и.╙Їч(nшиичEE4аq/■єл┐ЭД3<∙│О╫РбуЙ┴A2╤╡у╟─W¤eЩ╚ П-?е╕M┴╧?кEpcєц═ё'р n∙№є╧У┴AСj4┬Iр╩кк Ч█сr╗ЬVd]k8ъ7╕и┬╕ц░0г╙>эм ╩ tZlz╕▀*Iвш╛*с?pМў5wЇ$\0cы3l7■SЁf╤e?уlЛ╛A─ЖоєH╘.kацТп? Л┌UQ╢ ┴эQ:еД)эМ>P═╖]Jt┘#гxу6e0ТAKt╔сH\К шu8▀хb╡&░X┼`м(>su╥W╖ ╒ ВHт╬п@L\%TТ╜<Ъў╤=HfAXб+ДїP-a╜╛ыGu║|QИCk├0cн╟╪Ў_OиS-■╙ZWg∙■в0ЯЁMФg║5км╞╕_мъ0█╒)╓!кW·Ч└Qд╕ыM.┼>┐МЛ╬O\╜{╒ZWqAнЬм╓{CЎ:ф╦Р|}ўmU─rFEРЛ┼F╓м╤ЮMЁыЕХ╟>/Й╩│'╒z~uЮшо┐╠x :(дФ┴╫Ю/F0еЫ╒№$Ї бs!^GbG8Из~¤·ї╕e═Ъ5╔р Х(╩ЖЯt/░?╜nK╞Д\╫▒ [█╞?yПр ┐ъЬк┌ЫD║}*╬e9ю@Е#A^tQ$иЕПo(nзтгG█т Kvїи{Дq║&OEb╩─╢+ЮХ"Ї]E╬╒╧│9╔[ нг?(г┐O╡╦zшё-╩kZФyd╚8urc]Вл ╣╔(░ГжH─▒|ОU7 paц┘Б╒▒Kв∙╒yBС╧IС╩┼Ш/*bОn ж│ХИ╘'┤"JаbIyВ┌E▀й+EiжЕЇ)√Є:|╦?с|"▒J╠( BiH╖MфG>G]M╘n\╥wЩДНS&я ёKUЙ5╕  Eн7eЫL─>┐J{0┼╗_╛┴]Ex╚Au▀Є║аJМXЗЎ╟xщэ▀┐_╛Wх5(є+╓вЗ\]q)╓░5╩M;кL▄ЄПP(∙єлєAEВ╧ГL░■│О╫РбуЖ┴AЖзh▄╕▒▓7Л∙zбBG╩Ёэ$6хLУЛуVнZсDЩ?№Ёо$$V─]K╟V═a8"ТCФvxуЕВV■ЧE─єдIУh╫╠┤"}Аb[Ч/( ї╨═:Ос[[ьЪE?G}g\У>╛аqЛ╛1─··NGX3╔П┌К█.їOФ[!;уЛH G$ъЗК|Л╙ї─╔}╠фi?№░їLв,Dгyyy╦Ч/oe─Э¤%К╕ ▓╝о╒╨eз `еi╦д qNT┌ж$РЧН0╟╠яс╠пК─√РQ'Я_=бт<&╙\ANъ`"yМ╔Y╫├▒!0ЧL╘CЖ ·┼(IТ:Ч_/∙╜{ўr;ЧTq╦;lЯ╞ 9ё─qцуП?ЖЬ:Dj╣ ?ЗГбИ╖3╖╥╕й y╓╢m█■¤√╦Ч7¤╣e└}кЭ─ЕBE╠▌(P #h╘в"fRт│&}Xб Л1КД( p№%юe¤щDLfggГ{ш эУШЄ8n╗t,РЪqЖVV┴РёhИa∙T─XЗ╤#├vpWegЕ┬y▄В!╚Ч7У╤б°╖░{c╞Мs │УkeЇшМl┬ЮйъxЖ;╝:Жр╖Ио%р╙+ G·ш╢сN;ё▌Д И├╠№&Ъ_I3╚!АЗрГ░МЭ_ G▀їSvn└н[╖тQт&)╗эМДH■┤в█h║}√Ў╕о╒V└ЇЕ^╕n▌║╪НrCЖ 2Їs╨q├!HMЯ(Нd╗ А╚╔╠╠▄┐?Д47Є:tш░g╧J5Фa╬╨XUИ~ ▓РH┬┘LPyd0Ш8Э╨DН║ в·щVмn'б╬tO├Xж$э6 jA╗ =═╔Уxн,╞°,h2їQ╚ю▌╗[┤hAaO╞ЄvF╚жLТй|аЗpг╖и╗Фн╕Х═8В▒╟|г]ЛR│ё3@RКQ▌hц7╔№КЦN╠^┘Я╕є+▄УБ|√э╖╫^{эП?■Иj├Ъл╗DФМ╗x;в▐1* /┼╛ 2d╚╨╧J еpЁаЭрс¤┌эG╦! АЙ}╟ОKС┴6i╥$П?~╩Ф)L░БУў▄s}oQ├─Й╤╧=z@вг 0 j3fМШ(с^╚?А╦AГ5m┌TlЫиUb6LHю√ю╗o┌┤i╔гFН┬Яиd╝k┤╗rхJА-VZ(i╘Lх╨└Б┼ив·┼_─$сф▄╣s╤ЁМ3╡ :═=Ї╨Cш6цЁW ~°aтtO▓bРє╕gЮ|ЄI№П<ЄЪТю┌╡+╬╠Ъ5Л:$МHаFД3LвЪД$╩#ОsrrVмXAфGDgїЎэ█г!Ь─╒-[╢0║├О╫гlМИл═Ъ5SЪ╢,кЬ─и┴Нx└╠oЄ∙┼nAБa├Ж┐ЄzШh~uєG▀√я┐x┐·CЗbI<|г2Vє @╒o╚Nю'(▀ё╙ТЖ 2dшgе V8xЁl<┐т╕┐СJ(5ХнYщ╨б─-эиyы▐{яЕ$Ж(b@╚iB&╗d (▄YзNЭ={ЎР╒tYШ7oд;CUу`Єф╔║U>$.╖╒└;┌G}╡AXв?├З╟╜D6Р╛@ешЗ╧ ╕щ╙зя█╖╝гВкwя▐МЙЕ╓'LШdьТЫЫ╦─/р$а┼╢K╫nМОQ[╟Н╫зOr#E╙CЖ Бь█8=}│д├BUшЁИ#0v╘Гb8╞FД■Ё^BРфb; -)сх0╠9sцЗQЩGУ8T╪╝ys 0eяBВєиЯ╛лT┬qи═EЪю;I ║GОс└╠oТ∙EўА>q√АШ! hЬ:L4┐┼,j╫о▌ц═Ы╣╝&Iф#╘Жe@] _║егБГЖ 2ЇK╥- ┼m&∙¤AW$║/═╬>Ж@DE╝"°+╞°B( H┤БnPсбл;ЪALцфф@Ї2ю"D/ъg╔]╗v╜Є╩+∙∙∙└╩О√?zЇh*`ЙС 5`ч ╞╒ввв╠╠L╒бJВ┼ф▄BEЭ╕:rфH╢Л╩█╖oфБ╩i·&+╢] ЁйзЮ┌┐?· йП>CвгBeу░Е М3Ж╞mbщE╗░sЗNС!BГ ·ўя▐├ХФФрМSЛ╠-Bar,щ┌ ёягiўR%M └╔╫╖кyЛ°АKх▄;FМK2╟" 3┐QєЛУГ╟0бД╝П?■x^^p▄∙UСX0▓б╧;у╖╤T▄~=кТGД▐╟zаu┬A ¤╟da╥Н╥Р!CЖ ·яДГ╛n└ДЁm╢$─∙╞FeУx qedd@Р8 Вa└ВgЯ}6;;[Т▒М1%Yy,с┘┬цЯтЬБR▓I╠Ь9УHв╕╕Ш▓ ┴├nPeB╫Ke█ЄЧЦЦ╞mW╫f1· G╬HafЫу3Фd╕2╤▄╨█╜Ф┴qЛ-vь╪ёшгП Vр/РY│f═╢n▌7_0)*x■─`щМFБuИ∙└фбCЗв└М3ИWPxўra 2D@з╕kиЯЖз╤с╛Щ▀$єKєJL+°я░c╤a°Т)$v~й&ФД#iy%ы┐╛T<╟ Э°ИJщЖ╠H.в╘WЫNЇУ┌VCЖ 2Ї ╨qХrVTT9S<╖'ьє[∙╤k╫r╗%U▐tOJ8Ё╕▄%еъ╘кн!П╟х Yё5▄; йK5м▀╟Х_zj ┐?рTОк▓ЄЇЪ╡&├sZ#8p ]2%я╙Д (∙ ╠}ЪТXi▓,╞] 6ДшХШ#ТN ДK¤·ї_TИXT5m┌4"╞d╛Q▄ЮЧЧ■в@вvЩ-W№m{Ўьy╓Yg 0`╤вEЫ6mЪ2e Y╞═VN3└Gу╞НЩрDg+·3uъTЇ}h▐╝∙Ёс├╒OдE.p'ЪЛ·`╝ў▌w░ки▓┬/p■─Oа╪ш╤г╤.╨ ·▓o╕w╥дIтjU╣юЗ╦ Y└8=тЙ0ЗиЕ.├(Гж%░▄oj~∙╕ЙяЁ▄╣sўь┘3n▄8╔В;┐║┌ПСЄгf▄H╬ЬЗ|bibHKеэD╦Б┘,6d╚Рб_Т■;с`╡7Л╛а+┼у╡Бaк}knщ■f-Ыэ/й}с╥╩Жuы°B┴ЗK∙Bu╙\∙▐▓╖█QP╖?%X█Хцлиd╘╠HKёVЭБР*ў╗k╘Wйю2o∙SS&Б#FМpDТУ╬Ь9sш╨б╠CЖ i┘▓хр┴Г╣ї aЁОдб╢ТуЕ╝Дf░e№ сКЪU─▀sЄф╔А&в╚!А╟RFбгБ┌╗ Dgjr╚ РЛh@┘·0f9cШ╝DЎцияЙR,qаУ;vьШ5kЦ▓╜pЮ√ТRЖJ╡c(╢├19XХ бШ'ЗS#ЦЕ,ьИдbгr +Ы╕< M═/▒)ниЁг╩ЦXРкDnщRХюИдсfЕT=вЖЬЬЬ(lТ,5lЕБ╨Щd╢ааАй0┼Й8╞[ш╓фР5d╚Рб_Ж■kс`u╚╬[v9KU E╣╥Вv$[Ч║чбы5l0fшИЪ╩r@оt╙Фk╔╙я╣╪ ╠ЬЁ√2л\▌Ж d8Jе┬╩щ·Я┘Уzфс ;>=Ь>р9ц `т?Ч┌╖▀уП?ЮЩЩ┘╕qу═Ы77k╓ьЗ~?~|▌║u /жLЩВУы╓н;э┤╙╢l┘▓`┴fс20nд▄epьЗzш╤GUvм╗x┬╡yєцРп╗wяFЩ1c╞0t0g>ц╧ЯП{Яxт └ HS░╜j╥дIqq1ў╫&rssщdJ{я╜ў2╢N╧Ю=[╡jе~Ъ┌Д.ииlЄ╔'y5г!41j╘(╠_aaс▓e╦PfмM@Dsц╠Б╠^<д┴╧Dz|&Ig╞НЮa-їэ█Ч%Б8 W┴v хщ LP√э╠/7@OtМfОф пКw9NЩс.J,Aйг6l8LЭ.ыдF6yшAЙь(ЫуьМ▄Х╚╘Р!CЖ ¤|t╝└┴░ ▀е8=╩щё;м85)*kя▐Ы о╠ч╧ймm;Ъ╡o ЗЖ▐╓г}З╢┘Х%╛КЄЦоЪ#GНЇ■о╢█сйqаR╒H°└░А╦Y├СR█УюЇЖ╞О╤д<╬Ф4ў■¤Ц^Ё(++лc╟О@H:┐└&аH}░уеoFДqххх═Ш1ГЙф√ўя┐pсBeЗ5СшtУ&M┌░aC├Ж !qq;│Щ.аfHtFmР╛ихя╣ч^)))8h╫о▌┐■їпЦ-[RаУ(/ЙЄP?H▄fмАz\vbbB%ЖЧcр$╚Nї╙T╣Q█sР|tYХ\щ╗vэ:сДX'!йхв·дааu:"9╗0 ┤НгПнL3 JР╣ЬЬn╜бc╘ЦсрЩgЮ┘╕qу╘йS╔dvТЖwyl3f *╘PHСЭЭ aП[Ї╝Шn>NШ0a╟Ои╝zУї3]O$Ъ4°F┼7"%] ╟<Г (├вrcРОу∙Х¤▄'Я|2??Єф╔ЇeцГ╔лSжL2Ю9sж╥bwЛп Ъ├зMЫж┤─╛ъз╛фЙИ┴╖ПT╬v┘sЁло║╣░ 2d╚╨С╤ёё└i√ЖФФ╦н№UкVZ и}фСG[хeл*WFНz╩SъєХ:u▌Ю&ЦАxk╣a_є@К▓ЎМU└a{ж╪√╦хХОT+Т$gЙ-Т┴жгавЁгАgДjk &zш!ж╤гG+1р^О ахi┐E,1Я╫sпQdjмФФФ@LRКc>pЖрЖтЯъ:ЩTT2k╓,ъuпWп^4є'Dа╨X└Ak9А"╦╟╓тш╓ДbСЖ?|Ё┴▒c╟╥3уРрg%┴Въ─mЕЧ$`^╘╥в┘]Гў ЦцwЎь┘└Иfp■№∙╖▌va.*фF-с~┐~¤0┐шГю╛MЮрj▀╛}┴(6$c╘K&"╞Э~°сЗ ■ў┐Л▓РШRL'NЬx▀}ўCн│!CЖ ¤жшxБГ6yaw0ф*ёй╘╢;pX╣_╨эqэ°╦╥╦╖└щr(=P│Vmo8фv8=ZZd╢EGФфюЫЮ│4j╘(└X╞П/Ю░╝c╘┴6Ърт *Б╚I╟шж·╘EЙ┐-:Д┴─╡CЗm╙ж═╬Э;Щт R_E Со4╒*aР?]O&╥ЭaM░\иж"О╤уЖTo╩ОrБ'р FЗЮИ~NИJяЖ╛#`BVS┐е∙Ф╟qaa!╪dЙ?e ЛiIМї@╩╩╩j▌║╡Дд&WїШЕЙHВТ▄╨gzh╔ЖLЮ─ d╚Р!CЖ~&:.ра▌a╘u фнщLuЦйЇЪ╩х,/9РЪQ╙Эъ*wк╫│~╒лХЮЮс 9*Ь.З╧СVZ╤иa¤¤.o╜`°O-╖╫о&╒┴ т*oEJjZед╞ЄzkдZЫзР▓РR║╡z╬xЇ╟d(56┴ФхФ═"S)ЫQ °EuСоттЖ,oСшqсHa▄Щ 4жу0▄╦Т╝%77Д╛Щ,)8 РВij┴єXЁД·1@це└4ahР═(╠╩гТOl▀╛Эє}мИ\_Юd┤Z2▄▒ф│дEЭЗ├╨0┐Э∙┼In╙oХ3Ї √п_8жPB№╚╫В╬Дфє┼иp╒чЕaфc5╕Ж 2dшауЖT0д┬▐ЪО╘Ф¤╩ЭкR<*P)n`╗▓ЄАпж{ю┐╓ьи*йЯ┘4╗░(РТСтp╖к▌`чО-йMыдя+{ф№╬ ╢╤a Do└Ёз╒░ь л№■TOj(рOqДФX4ЬwкГ"ЯтP44╘B)═ЫТъ└pC:Oщ ФА }┬$ФШRS$ео─BЛ(АєФы"_uJnЙ╞В:H=ЇИТ╨<й" *A!сHj8ю°Ч'2\zHW║мJ`с[ii)■dpr╔Ж"∙м&■жцWтf3╝3·HG}fYR╫;к╢У╕х<╚¤b┌z▓ЗT.ъспщ╔─W╔▒5B0d╚Рб▀p╨К3гB~ИВHO'кГ d╓ зк л}ї─║Ў╫йQбB^gJy╪СЮЪ^3.-▌пъ╕ФxЯ<є▓┌┼■Ї┌Ю@eХ╗fZ( ;BU~_zJZХ╖кFj║ЮzAw)р6%√,╩!Й┘лЛ4ЪL╔ш─&OюКВ/мЬЫХ▒ВVУ╓ФХХQ═Г┘[*╖OОcЬW╤c╒мYSЇRQ°F6+%▓1Є\а┌L|B%QЗЇMF─└╦4у@0 ЬС°╥▓/Й>ыЪ0]_%\$┴&ЇсРL '█пг@ЖПО М"╚O▄rйiг╬МЖЖl"*║Эd%┤б╘)cO▐nЇТ╢ыaCшВ>$Б▌(А╤I№чаMK2d╚Рб├дъ┬AючHЪVЙ)╦є╟VкA-`┴а нjЬЗJ+5q¤╟Eї╥╩aп╦]Ў╘лSw_vNЭ║Х)■Ъ╣√Ю:гє╔!лв░╧яHє(з┌[Ш▀иa# ╓Y╪*╠дm37а 4#мГp 2[T*В╪pwAAA╙жM "9RbAЛw─ЗФv]╘NQё#°Cа~╣лX\\ ▄ т?''═qУФ!B╪PT╛>`& !j'Q╝tБERlт]иБ│ЖKhШЙЭЩ2e╩╨бC%▄▒МC&7ИeХ╜бI MwгВКю ╠B ╩шzьП└>║▀тА┌)ъ╠dD^ЫpIя=-$а QЪд▄P6vд1ю┼y▌hRЎаёЛ QХ4дkEЗ*xЭ╤R╪N+ЮцЁИm7╤ТжТL┴Qш?К$wnсBM∙╧Р!CЖ Квъ┬AHH=И3╚&а№тШrЁXnЗU╚g┴╛юмН┐,8ш;Ьб,Rъя▀|RXп╞з├чtй░¤Е@■ь¤7╬╝сКс▒-■x╢rYйm┐т _ejZъВ∙Oш╒╟7у ЕC+WоДTFW╚vuЕ1Я╛лИ_HkjИ Ji{|╝EЁН╛9(█ЧЬ1;C▒зЮz ▐s╧=╘ЎMJ%Q6pрЁгП>·Ё├ыо ▄ў─/!Фh│вм╕Pd╟РЦ^HЗrssйОТ! У█е6сШl:3щ-╤Хю╡ .║3f╠ш╫пЯ╬@FьcЗЩЩC╠╬OЩ #JKОб*АW`qЁ_DЇ S1ь#чevШDШCы:Щ║ /^╝╠G 8?`└Э{I┌Н╗ЮeЦМB╟ШЙ$╤·Я>}:╫┘ыТb╚Р!CЖ %бъ┬AВИHЬ╠╠╠─/О О▒+Й √B╢Э!-8┤\Л-8Xi╗ ╧Ж╧ ъeьwйа├YKе8Гс╒я╜бrv■■Ю>┐+єOnqQ╦JU├eG"м(KпSs┴в∙┐ ~╓фщ╪ ЗK╦╦xр╚ЄйSзлБ/вWН б1e01Я ?╚f╩xs▓╡*ЄЫчEс${╡lK╢,╣u8f╠Ш╟{,мeK╙Cшт ro╝ё╞┌╡kg╧Юн┤°vв├╜bЇ&}`tЎЬ OПМ:я╛√nЖ\f Ї╠└pц╧ЯПK*▓I╩_Ї─mУ┤[PPАz└I\bЯ :ЩVUяв S_▀Dй!Й╢ЙсЁчаAГ:vь╪┐ иPyd┼ш╤г5jtя╜ўтЬчж69╞Єz,b>▒8ЁЗж9▌zЪ▌ l┌┤ UqЧ∙м│╬║¤Ў█ёlЁо$эbY█бQa√Ўэ┐√ю╗DЫ┼═YYYx\ ┴╣ъв|Б 2d╚РбDT]8ИєLё╨мY3@№тgtc╣cУд╬Rщ9├щК:ГЦв╧M8X8°═Ъ№·щ√]g╪┘└чJw:_ьr╒Y╦д┤мЯЮS8 д+█рn+▐ЕЄЕ№╬4╦}v_IImwк╙хf2Э$ЩFн+ EЯG┘┬(╩в╥^я▀┐Чшк ╦<╓,*7а ╟иGb6 *╞└|nd╫н[ЧНК>LZkЖГ┤дЗЮQv╝j┌&RqE}XT^2 MДД_\вВУ¤^DsшўИEЯ╟рИ▓ nг V-Nд%fИДГ┼┼┼ш$Ю°M│QQF)эP╒││А dц_T╛k╫. Б}·┤n▌Z▓K9ЇЦMШЬЧЦОh5г&О╓РTpКТH9C@В8tmЧЧ╙╬-т┴oH8╒ |╡6┐A·>ЧJўлE╛E7▐8·╦П?▌╝>х─╞з╒jp_├▀╖оTйR╡╙╩№e╡Ъ6:PZ^╕oл║НmЕМУ┌#@:оКI╡_8дЄ═7▀╨╦╕SзNЭ;wжmўю▌АГ╕·╪cПm▄╕С.чЭw^я▐╜i,ИБ/_╛№√я┐g┌▄Ўэ█П9▓ ■L█╓╜√ю╗mt╢┤Ъ8qв°53q* Є╦/P0Аz╕]iю╧╕Ш Ч╨оД&╞∙┴Гr{┐└O@~LLLГ?╤▒їы╫cж[╢l╔Ф╛т█d│uы╓╖▀~<╤7p╘╨I▄;h╨ L+Ъ`}ъйзd║p Мb ▄ шЖaдв{D╞▓WЛМHL eЬ8{·щз╗wяаМ?^Б√Ўэ Ю`\└a╠зЗ╖l┘Вzd-б6Ї▄╞($KпК(Pq╫мY│╢m█FE)=c╕>qуzЇ╤G1ПMЫ6й$ч╖╞ВЄ∙∙∙gЮy&nзFЧqPE┤Ю\<▒э&Z╤вбE/]ў┘2кШ/╔тbЭc 2d╚РбDt╢Г4ЪРЄ@;°%::ж╢Г!:T0%Va7░╬Xp╨Б┐Ф╡∙л ▄j№?╫ц╫tЮспё─eЧ xяхвTп╖AКoєое▀▄hЯГ:P5▌Оt╧╬}∙u╙ъ╓@]^Jъ┐у┐POг'╫┬Я/╝Ё┬√я┐┐d╔eK·бCЗvы╓Ml∙q▐Їщ╙i5Hкўf╬Ь ,`┴?БuЦ.]╩]?┬,рZ┌Р-cа=TE╨гGП┼ЛKC▄a$АаеЪ▓H╘R}┼2tЮе╗4K╥П▌╞╔█o┐}с┬Е─.LЮKДAм &`iЙ╣!ыg░b XнoМКл/XЗєc╟ОfZ╢lп╩╕p;А.c┬R╜w▌u╫]~∙хш╥JЫ^{э5▐╦ kBdY]▄╡'Ф╜W+╒bр╕J╨,Ы┼ЇРb'yг╬F┘╞хр&╕ихa╛Lbвv=~2_мЩП\"╫╨!З╔jY'Ж 2d╚╨!й║pPErJ∙сЧ╕E┘ВЄ┌Zк└r;╤WF8дВaх░=ДCN^-HSу╫о═mР^ьvжЬнЎЗц▌╨е╟Зп:+иКSSj?tт┘Щеvъ:А╟tз#╒СЄ║ФгОrx5ЭЭvEё#pР┬Э_▒bАК5k╓ '{Ўь)╢bТГ`L№┴8╞▄щ╙m╘XШ▒Qq└:Ьq√Oь╔8z┬z"c:O:щ$АKF4$WЕ╖hВPEМ┘5Ъ┤├#PSС╕0МCл┬j@ClЕ╬╘ @г"J/▄ ^Б╕╩{Х0░°В .`МгЫo╛PМS░╟He$┴?DP├└Б[╢l┘кUл╖▐zk∙Єх@в└hK╢G┘UЙGг"Лмгї!ўСeOаУВzКЛЛщї┬╒ ЇЙжЯ■y┌ f╤ ;77}ш┌╡+Э`и!'ШzШ╣у8ъ$э&!~i┴│ТD%9^Ё ═IЎa│Sl╚Р!CЖУОЗ╕Гр лаSХ┘░VШжДN+u°р╒╜йj№Чksдyр`єчт.]оzeIнVНvхfЭr?y╞е═|6мTV-О4╟ ■ЪоМФкЄ┌оTЗ;-м■╜mGщ╤Л1╙┘'БQ(щ єєє_xсе┴A}╝ВWШ╣╙^Kpрд░┴О(ДЎВМ H√6ц║ B¤%kЦ╕Ж╘]йЯЯI;ЮФ<№S╝C°зlkтOЎУыh¤!PуlтFа@О"j╝vivyў▌w3F4 уR┐~¤.┐№rо0хVs_ыП' ╩ч═ЫЧХХ_v┘e╖▐zлl▄c\╕Л║=qнphдlШ╦└H\uД}`яуП?О ё'┌j▄╕▒фdЫ>}: М7n├Ж m┌┤┴1│г02■|о{k]LK>МЪст╢Ы▒щ ▀p▄┤iSц╨Л[Ш╩yыa)M┬7CЖ 2t8t\─ █цГnUj├┴МРэYь░│Т╪-T║╘°їkєд╣)AG╙}сo╜їц╒пeЧ]┴╙▄П┤9╖╣_9А=╩а4еQэтp░,XЦЎxЬхp╒Qгеза0`└┼_ L─@y№Ў█oмu╤л╖░░Р╗л`:АNЄЎ╛}√Ю■∙А5МH.бФб┐гЗшд┌╚ЕЪп╣цtЖ<дЎИЧШюн0 JX╦b┬nЛ[л▓w9ЛШ3А┌Е Ц─╤╥WZEц6k╓ УНв3шууp╧76Y-√М_F║Y╢l}2p№╬;я▄p├ D┤Їa▀$Й░Д╦сynC╦Ўўт┼Л╫о]√╠3╧рx─Ирф├?мCЇ]┼к╒cn-°вк╪цpЙFЗ·ЬКmЯD▒VZЇ:юsSипчЬЬмv┤vёkБCИ█n"Т─0 8╕c╟*}cЙkА╛)ш!:МvMТ7CЖ 2tШt\─$tк*{√4═▓┤]IN\ё█aиў*5~├∙ї╙ЎYp╨┘░╪ цвg╒I┐╗шк?{╥\Mx╟╖╗шДРr3╓М▀wў╜C[¤ёЇ>╜·4╗,┼г╦╣bх BоС#G2М┌ъ╤гЗфо8pр╣чЮ vфччC*Ў┘gKЦ,БРЖl■рГn╛∙f@в[n╣Хx <°йзЮъ┘│'D> *]u╒U@@ы╫п ╟?■СХХ%VwCЖ ╣Ї╥KБ#ЛЛЛ1a▀~√э╙O?Mж├═Я?┐wя▐`)╞Н7a┬Д>}·ид`СбCЗЮr╩)иJ╠°╕ $┌кU+Lкzў▌w╢║uыжlЗП■¤√/X░e╨(.с№Ь9spW14.Э{я╜w╓мY╩Va■эoC ┴╠#К]}ї╒▄/((Ф?~<УЎт └¤oШ°ф╒W_]╣rе╛И╖Ф/╕р┤KьИєрdЧ.]╪+Ёm┼КГ BЯ;wюМ╩йЫ|щеЧ>¤Ї╙yєц╤хEiБ!╤тє╧?Ў╥w[Т─АQDоъзq зХ░█▓т─T°╟x1 чЬs+┴[ЎеDра╧NIЄя$u▀}RTпFЩ# 8°╗p║+~n╩cкCлЛ: ╣Э3mt█ЛO░6К-'eЧ├╩w|K▀;/║рВ{юьзк|*гFХпК╬н╘!щ;qрA! иR\ўы╘sОйHИiqнЁ█Д┤Б╕ЩиQв╞Pг&К%F%#╓s╙щЭ={Ўь╨б├¤ў▀╧▌dp[J■°уП'ЭtRQQЪ&"Л╩wG┐!t¤b╬zi╚ш┴Hn "<┌╞UЙ╤"РqнгRлХЮs╬9CЖ ╔══E║WлИ▒dA0"Їpю▄╣└═@┤ъзцwЬпЩ3gтъ╥еKе~6Gы╔и─zb╩Йб╤iЪД?╤UfФц▐:=9н▓╒.єОn╠Я??n╗▒мИ║*╩Ezе$║Е.J*Є▄╥т╙x2d╚Рб├ду"ю саSYЮ└ДГ! ┘ Ї6)їф┐>┌_'нBЕ]agуPНв№╜ Zf.Ю<ё╩~= ╨ащАж┐п ;ГбЇЧ*л╩)╚o╨·Дю╜юza■Rхї{C╛╘Z╡D Х╠░yЇфР@╟ь?ЛсOМx(;;╗QгF─Ор#╤Ю▓ ўQ█+п╝┬h╞М№▐1p ╩эБ╤ЩЩЩ* MГ╦иЩч tOgtЖ┘28gl║░░ў:ФIъиTги▓╖zї5Б.{aтщPL`Ghи'эРр2DBшZd2"┬Н=Ищ∙╦╨ЙмвУRЫ` ╞GФЎэ█Чn┐,\ИБр╧иБ+Ч/X░`ф╚С:╝(ЁОS6xЁ``╡ш╙ЬиЯf"┴Xич╜Й╚l╦Ї)fВ;Dъ╧Х1c=▄юП█n"Т╢Шп=7n▄╪▒c%/bБE╙зOWЎ╖ YїЕ`╚Р!CЖ %бу"ю`$╨LХ├ВГйдUбOY^&У┐|пмvк7vЖ\iбЪi5x╦¤╬@н·╡╗є╞_╥еn╚КKу Д<'*:а|хeeM3ъл*пJOним`>4Uяд╕╙┼Ъ>╢uъ╘бП┴ Гє,ъfaмсо╗ю+lтё╟ЧаtTqQж4FО 1Ш 7ь═ДiхиЦУ№┬▄fх6oфаA!]"╪.їСв╘┼3Вk┼хB6O%mЙ(чШYO▀мk╣иcc jЄD°IL├ztGlvПfЧМк-О)QъL\┬РeWЧUI6$Бщ-wZU$eЬФС№╬▓єОK╠╬в#TVЮд▌╕+ЪSжoЭЛz8.qy░] ИШ$ыЙ!CЖ 2д╙qwP┘Бfк╩2 Ti┼═bЬСЄБп╦Є пвDЕ5▄iк*ь▒╥Ш╜!Я╧·]НМ ╥7MO8w╝щ.ОpХ╦Qщпмчкaз╝│6г1BZ╝)═єФСфиCв"ЗA°ЇМ*B(НЄaD"JА@ц@c$B╕F$┤ЙpДgвTТq eИєt╜ufTIв║w░є╡Sтф╦X3Їqц▐о░ВC╙ычFj▄ё*- !б╤d>╦?V"CРЭkв^╞U!Яй╛N─УMXЗЭжY╨з`/9 +JJxE9#ЬШо╗$ес jK╘n▄о╩ўЖ$Тn'"=╡┤╬^CЖ 2dшРФu╨╖ТZBєR┘wРaМQждддCЗисгП>В(№%р ЭIкь0╥щEэ`╪$Ї╕]О░Є:╒KGLQо45║,Аg,╟-J╡└ЯUЎеxR\~╦19╖|_ЭZї<и┴ВqUй5*r(уЙ-$▐гI╟vМN ╝е в2O┐WЗТUВJ/=╔yeг&╢b4#г┬, mшХ^ш°МнЛ:P/GFИJ2=╫░рб(5^╓/5╦Ў(╣$Хфчч7i╥D*╤г┤Дэ▄0║;0╦р*нуЄA*dqUt╝QtлЭtТk=l╟ФцЁ╡─°╒Ї}цТ├О▐╕qc╫с┤лУ$TС8СIn62zг $╩hg╚Р!CЖ EQ"8иl┘╟¤╔н[╖2| DГщ╞╞─yгL├Ж щ∙┘gЯбЖO?¤ЇgЗГ▄+Ў█6ВБГn[езьР╘'.Ф8н]уTШ╧╪▐Jц]╡╝aY_├]╕паIF}хvUZхГ╡Х╦_хOIє0РїеQ0K╘`L)╞╚╧ЇЇЙNbp8^┬Б8ЕИ╒ryLmL├;▐Лcs вn╞Z■щ╜вОW┘xВ)}1иБЫкt^aаъy%йдф╛'&ЕPOм!╤У╥╥R·№ъz5БТТ#╤xUDё╞5$Лf╣─ї╟█ЩIП▀"T╘╤|S┘°¤бg c"ъдєAPг╛╗Кz╪╤АЄFGЬ▓,ОГ!2;°`B╗Т╕YZз╦KвvУxУш>C4:L╛_,Уїy╚X6Ж 2d╚)ДиВ▄'ZАф▌░a├щзЯ╛g╧╚▀╕qq~ўю▌;v№■√я╧>√l╘Ё▐{ябЖП>·шЧАГ┴И╦H8ИcoP╣U)V▄Щ╘P0+П;R)+qЙ╧cХu*:B┼▐5k╓NёЗХ╦UоВaз#C9 є ы╘лЫТЄoН єv%RЫQG%AXpРD╡ГлвeеЎH╫юDЩ*ЕpєQЎТ NВДiSЛ&И┤T h0┴ш┴Рy) ю╝Ї╥K7▌tУ°XРИэa]╫иMzЛт<┘╡yєfjЫiФ└:г@сЕ Rk╗╔K╥¤'Ї.бУ╩Ў>╞╬░╠]w▌╡xёb·2ыqПзNЭ:|°peг╠╪ёFMPща$║C┬╩O>∙(Ев°Лщ$Ж╞─!ш9=уМ3╚оX>3▌yчЭЧ^zй`Vq[N╘7┴╕n▓█Л.-]║Я>е6▀p├ °fа√3·Ци▌╕-Jх·nx╦Ц-│││=°,├у╟ ўю▌╦H┌Зl┬Р!CЖ "%▒dЎ l┌┤щДN╪║ukff&бBl▄AЬ╟╒m█╢╡n▌Ъ6Tk╓мБ8√ь│╧~╧тИ └HК▀ЖГ)╩ч└╔░S9Rн┐Cе и0P ╤щ.wx\╩С▓▒д╒ZИ─№pE║+╜n┬_nOaQQ¤┌u╦ўХжdдz╥н╜@Bd8бc)=║Зln╥уБ - [и▀"Ўv(├OGI,┴Э° P╜$ Be╦■Ўэ█я▀┐Яг{oшЪK бGЛ┤иh,lЭ┼t;vГ]╥ўЛ┼E№ЭйїФ╓1▌'Я|23а$/╖╝iФ БХэвK-гdуаЦQEv╒i[й"p╢ккКшН3Еэ\,шs\>╨вС ПЩZШ°D┘`ЧЩЇс╓0▌оU─Ы▐═4 ]iеM°6"\&сБ∙Ў█o╤m░Лс╡ЫИh│╚я &G!hО[ШZa^еlr█DCЖ 2dH(d8·ИА╢o▀I═j▒q)ВБ│▓▓╬8у ╘Ё┴рфъ╒лб@3Ц1]Ж¤Ў╖ 8,ГB\KQ!З WZ╨PеY╨╨UeсFХfYЖ╝a г╟сVоpЕ├Yъ+kтй∙╞Лп<╗т╣W^}╡▓╕╝FЭ ╘╗'█╩└Б╗ ШsssБ6$Ю]e1~ &,╛ї╓[E*ГG№1О/╗ь▓Ч^z Ьm╥д x$С)│WмXБк└┴│╧>┼pїтЛ/~ў▌wQ∙M7▌ЇцЫoмpkХУcШЖЙ╞╔╧? |╧Ю=ШдSO=Х╨JФCЇQ}■∙ч▀zынХ+WJмV~хХWв: ═7▀рфE]▄ м8ПУ╖▄r╦·їы1йш$╖╚┼┼с╣чЮгЦ╕g╧Ю*╜Z╢lY│f═о╕тКЧ_~#К;▐w▐y';;╜Р╜·ъл?∙фУkо╣Жy ╞бЁЄх╦┴║gЯ}Ц+u▌║uEEE`яхЧ_N█╟еKЧтЛw¤∙╧Fы╠Тv 80.0▐=zаЁw▄!J\╘МK7n─*┼╨░j┴>(П┬Ш;tc╦Ц-MЫ6┼1└+уЗу┴╕Шe╙ЬЯ ═╩╞ышб▓╙[╟╢Ы(v╠┴}^√∙(=pаVЭ┌їъ╒█W╝/ю╩╖VrZjХ╧л√Ъ╧bCЖ 2t°ФЮQ!KУ-nu╞Н;(чё )П тq╫/wРХ╪┐ОГ ┤)TT йPЁ▀╟*h╗Щ╕xП#r│#Tсє{RR}·f)[ 6d╚`Ъў▀╬Ь9їы╫╟эw▐y'╨!d<l└Вя╜ў▐╛}√АE║tщ╥н[7аЗзЯ~ WБКо┐■zHz╠╩°сЗJ╙Dвп┘Д█╤bўю▌/╣ф\%`_N╕╡=h╨а%KЦхp┬■Ў╖┐a(OuP0╨Л/╛╕h╤"╢ЕQ№х/QСнэЫo╛5гo2П4к├y fа╧ыо╗¤aP@ ЯО5хххш?╗yєfTt╒╖o_`G╪#? khZ╟e+╒о╜Ў┌╡k╫■щOzуН7x\BC7▐x#а'└+°I :&ыЪK║H╙│NЭ:Їд ╚╞╕dБЎ╕s═ {лVнBЕ b+[GGуттb D┘О#АЮ°e╘МeА╟ЖjKb╗╕э&┌б╢г╜4}~ХКuКч╙T╘g+'НY.qЗ┬╚*|Х▓sk└j╚Р!CЖ %бъ╞dР`╚5H█Ж тЧ╤x■Ш┼Ю0z√э╖Y╨[п^╜Ё+█а╕лsч╬@─=╘╗^─l▄╕╚яЕ^P╢╗ Р╕╞F╞U╞4╨Е[ЗT╣IJ: р┐еKЧ<╡h╤░ЖAtRЇOL+МУ└ЕSH0ФХХ╒жM\%~т-°ЭbOШфГЯиKM╙НИК.]#E.Сcф*Пy╗▐╩UW]ЕQ╬$╤cЖ▄■ц┌┬-╕ р{├ 7Р▒╕ ▌Ы7oЮЮOЕ[лДя*bсGМ╦■глшС▒8&│u╠N╥ЧЕfLH═б╤]у┬к`ЦjЬAхhЭуf~?▒№РJ╘n,╤S ║├ОрcК+д┬.з; 8<8Щса:X╘хqW8h╚Р!CЖОФкwr'БюА∙~°с№тgИПM▄┴гH╒@ТД╟▄е"@G"3h║╜pс┬Ц-[ю▐╜p p AР░ `Б V>ъAmвУнF1zcЛt╚рUеyЄзJ6zЄ Jc eiQ░├, М├└╤g╔Bob▓|h╨а╤/щ▄P├>цfАF┴C*тFCD╪╗wяNЭ:б pИ█o╣х╞чcЗЩпПю╜│РХащ╞Нг9\И┬Т"№ ЦЁрQ В%6$бъ┘(`%▌А╪IjR╤е│╬: #z ¤ў╤4гв{(└(М7▌tУЁA╟№иаBWАr▄vу,B█ ╨нБ░▀уpЕU╕Ж╟эї]vЇдРЭ}Q _1╙nЧ╙Wх5p╨Р!CЖ U7ю ХA└|┘┘┘tvдg1╬│╕ГGЧХ@- а╪уЛ╔#Q╟рТШjбє7▐x#╕ЙкpА3o╜їj8Ri▐╝∙╞Н °p#8EWе!*Й▐@╜i╙&ръ]щ3 О1 s ╨МП╖╟ал╕╪ИJ AGPлlЬGM/C┤р.@F'╓┴иqХ╛тЦ╜┌╛}┬iИ,BmиЩAдХOЩ╞гMЫ6YYY╠"S@8Й3tшPTВєиw]oУ▐a┬_║K╦╘p :wю Vўя▀╓мYп╛·ъъ╒л% wэ╤g└5nИЮ!ЙzХ(dЫуЖ~NN╕WPP└°;╘дтЎ█n╗ ¤сЇ1еFЯ{ю9e├h Ьдц╧c]Fп╡w2Вж╙T■e┴┴Ъ)ю*Я┼g{Л╪ОЄx0S╖u&═└ACЖ 2ЇPuу╥GЦъ$l╬╨╖Є╪─<║─ЮPr╙°П C~гв╖]~∙хў▄s╧╡╫^л"└ш∙чЯ┐∙цЫ┴ ~┘Зе% дб▐иQгАаБo╪БХ+Wvэ┌Х:$ 3j┌Ё'xр╞╖▀~√К+о_]┌╔бWTбЧраёeцf%5Леее8Оaх║nяї╫_┐ї╓[eRИ{ииУ!P-Ju╒и\*b!HД3Їб╤чwс┬Еw▐y'√ФМ■ ╥qЯX^`5|т{!fОDБф?▌ЬСЇ!▒`С╟╕Дz$*5gD└4╤ЧЩ4зь╤hФКOf7A'Й°ЩwШL 7PТЪZю/ЛяИt@╓xОлI┌Нва5)`9G9╩Як<рє├!═╪╒Zл*╢Гf8h╚Р!CЖ■кn▄AZчЛ-ў╟pчПY▄┴гKЎ╖▌v█u╫]w╦-╖Р▐╦/┐Lб~═5╫,[╢ ▓╛°тЛ┘[▓1c╞Ьu╓Y@@!ЕЕЕ@Wsч╬н[╖.ЖЖу;ю╕8пsч╬иРАиюклоR6\6lXзNЭp/0═╥еK▀}ў]LАьЯhт╞:6э╪▒c╒кUп╜ЎЪ▓с╦Єх╦q/·АЕ [▒bzЎ┘gБ╜T0vЯ>}.╣ф№кHь┤╒╗wo@X└G ч├?Ь={6jFп╨IЇW_yхХє╬;ЕБс-ZD┐f┤Л Ты█╖яТ%KьШ║tщ")U0@Ї¤К┼U v▐╝y;wюl╒к=М╨t ;;√▄s╧┼Щ?~У&M╪1n═г█CЖ ∙├■ A╔e{лг\R[╔X┘°┼╩├▓Ы>}║DЕФ ╚ L╩┐■їпЩ3gт*BгDв▒IGФЭ ▄`╗$nы3╠5¤c░B└лЫn║Йй╗?■°у)Sж4l╪Pv║у╢╖Eu╨|0T╪_├с┴гтr║CaK K8h+-G)Юё╕▄2d╚Рб#жъ╞д┘╨└1│Тр№1О;xTИЪ√з:t°Є╦/xв_┐~*╒uL8 б■цЫoъ╩W_}5w?QШ┼%/╗ь2ЪСTб~└&`Иэ р*Uw^xa╙жM┴tр0ъЬ╕) ШД1`└└mр'`э &а9T╛wя▐┴Г+[Хї■√яуЭXAЧгтKSЗj%[Ъ▓5p√█▀p▌╘╗¤Ў█qМAс-n┘▓н┘`р°═б╖[рP эєШPО╣ч╠ЩCНq[ўю▌БеЄ╨%МФЬdаЬЬЬЬЎэ█╙kИ CRhP т*╓МШrяШЮ╣\*·&5╫Дrnn.:╣F °╨(юbР$q╟кe,Жвд╕ь0Ьл┐ЙєЬЯЯ╤я->Є╚#t!в'ККl╡╟╢ЗшKВз├эЁВ░%а2R=х~┐r┘:C┌~єюРr:л|2d╚Рб#дъ╞Д░ j┘▓%@┼)зЬВ_у ╬╙╕ГGП(з2АfzЇшq├ 7Ё<Aя .гь!L█Lр% ╓ Хщ╪+!NXГHsє7RxPrW|xХН!ФнаТ(═ВЁ}PШAO─tOXg╪Оeнь┌ы┘│'1лЮр▌`6f√`¤tйV╝E╕&║.Й H>ш┴┤qЖо╨А┬(Ає╥√,╣П ╬P-╡eД╬╕КKМТНкю║ыоo╝╠д√0j^▒b┼лп╛╩р5╓8╧V^xсЕеKЧ╛¤Ў█Q┴в╔╧Ч^zщХW^A╬U▀z╢_NоlGё<мeНSСМ╞╡▓h|Ы╩H┬b▄О▐╞m7■d╩E<йк*NsXс╘3RS╩¤╛АЫ╓mCЯ =!`DЧ█Sхї8h╚Р!CЖОМкwВТb└Ж~Ц8#I+Оe▄┴ ЬИW(P!╫√Ўэ√№є╧┼ьzZ3Й?о}Ї╤G`.н┴╩Y│f╕шЩткKЬ,z│в9 ┐с├З/Z┤├дFW,їО╤tЄиМўИ ▌└:ПE6l╪░х╦Чcе~ї╒W№Єш╓н█т┼Лп┐■zтr Б╩BSЬ={6╧и>\NЯ>╜QгF┤Бeр╞$1_IQ|N─╖М=_K╚Fi┘ $╬┴D/iщк"иR\▐Uьї6H╡Ў╕╜▀№eєKmэ$РrM@┴2┐эTTйо;яъ>u┌ |f╚ЬК▀М!CЖ 2tHкn▄AаИььь╙N;m¤·їgЯ}6~qМ38<─╘ #╧╧╧G╖ПовЕ·<└@╩l╘щеЧ╢l┘Т9б╤╓кUл└zQ°UЛ$▓ ¤}╪sQ╦хффа!1Сў Q%sХТ$╨├Ъ├к┬z└,А-8╛фТKpPPPP╖n],Pм0┌оR ╚ИЖЫ6m:ї╘SU>3ПЛ▐бgBE]bК╦чD$кV║M╠═▌▓Q~0▒бХCGЧФ╘к▓SjуZ╓ю╝-2ў█J├┌J╒S*#`я╗№G╕иp_У&MБ5┼AG╪h╚Р!CЖ Ткw░ммьДN╪╕q#0▀╢m█ЁЛcЬa╬Е_}▄Ae#'tЖщVб(│ПV¤║┌ЄЫhF▀╜╕п¤юъ)▒ ї$З▓$Уa0]ё╡IzLАlз 6├%Є|м+.│ЇЗ╤╘ROОЬИ╧Ш▀╥╥RЁЦhхПl╜%тsТ[Ё]E м(╒Э└A╓PхїЗюк╟╫▐ТЬ╩═ъf·к╝йй5*┴<х л`]┐┐Щ▀qnzГФ░Є:Ц+Йr║ФSTПр└G0.CЖ 2Їдъ╞┌ ь╪▒уО;233ёЛcЬ┴∙у!юаШ╡U╨qс(ЎїK╩┌ъЙBОpР>░4<▓Mj1яУ█ >hф╟P|М╠╠(┘Qjн$юо┐бЗ7QВ6╙ЭЕ>,мC+*сPЮ&оq∙,^╞zv┼#шd">╟-,aqkgШjЕfTКлК7*9+p╫°╪┌JЗ╤7.#Ю╚%Ы┌∙∙∙tп╤=u0Ї_0Y,ЯХэыг╫)╛/╒ъg">'"=шt╚&┘йЧ¤zVb 'Х┌е╘Ф/?икЧЮЧУ▀║їЙee╣Х*2╙U8°╗R╗Jч░│/oД%jч0╬PwdPиБ╙z╚^2d╚Р!Cдъ╞l╘и╤Ц-[:vь╚Ь°┼1╬р№ёw0h7UKKKы╘йГёCr-Е┘Єх╦я╕у╙├@ХSQ'Ъ*4НKq3Шц(╕ч+АR0G'▓S╕Э*N╕Qх&iZ╘i FньH.Xd╝JPK▐(╟tюї0│Ў╙ФCEМDz ч╤Р!CЖ ¤║и║qЛКК┌╢m√▌w▀╡i╙&//┐8╞Ь?тъДсхццЮyцЩG▒╬zїъm╪░Б╬АQE°ЪaъОLРЎА_{э╡z>┴°ьe№dю'╛¤Ў█]tmр╞bФ_ТАЬЁ+j-Ї¤бчпю[S^^NZнмм,┼&l╨аA\>K"ЭCnя&зф|Ое■єЯgЭuЦp▌`knd┐Ў┌k■єЯЙниЦ5kиTe5╘─o┐▄(╦╬╬k▄дi╚щк╒кщ6u└нB-°┌фЦO╝ш╩┌+▒q¤)/s;]тК┼CCЖ 2d(9U7ю d╓о]╗N;э┤═Ы7т╟8Гє╟C▄Aё║P└и·їыў╔'ЯE[║є╧?э┌╡ъз&zееер╠_ ·WQ2UTTАGр╒Ї=i╥дW_}╟Q;н звяZb:{їъ╒┐ лп╛Z¤tCєXСьчr hPiрxЖiўDНJ ]r╔%q∙МoФло║Jb╙Hд├г╚ч╕х/╛°тЙ'^p┴ ╓игF с·ып>|xзNЭ:Ф°┬Ч#╫еЎVнОЦЇ╛√─█n?√┬ЛwЦХ╘sз8├Н╩}-wЧ╠╝шпU*ьQ!╫┴╠┼бPИ╛╥Ме┤ЭqCЖ 2d( U7ю ─ p▌╞Нe┐8╞ц╚¤╒╟╘ЙAрИ└RМ╪м"Y╤╪gA*bЦGWf┴╜А╒"8├q╨tа KNNnПB?ТНЕ█ЩYрP9╡A─@ь zUTTДT(щ:А шrKЖ╙Ы─nЁ<5В╝хp\XtН#·,╤RЕЁOсА~K"c √∙М3°·╤гъО╧ш61Щ─┴I─g* |(█"; uaкъ¤э█╣щюЦ┴z/_╦_▀|╜*▌Sт Э┴4Gиu~щ№ОЧ╓*WБ хSбT╦│╪Р!CЖ :BJвД№В╝Г№Вt╞└1D?Дf▄╕Г8O╦(>∙фУQ├ъ╒лQ├п╠vР╩$Ич?№pс┬Еп┐■║\░FAчЙQ^}їUИЁK/╜ФYkWмXqцЩgЮt╥IЛ-·├■═Ї─r╗Ъ╛сЖ─ЗC┘JT ЕqШя┌╡л[╖n▓1КГo╛∙XБLCЛя╝є╬UW]Е?Q}аК Vо\9c╞М/┐№RЄI·щзШ?└ЪNЭ:с╧uы╓a^Q■К+о`.>┤╪╜{w\╜є╬;щДq8√з┼П?■\Eэ1f╕ 5Эr╩)(Ё├?a╝ SЙ╢кЪ5k■╥9цW┴g┤ОЖ№6aUГ^x!И┤Р`аЬ┐№х/вЮL╬чып┐╛OЯ>Шыєг*рTю┬4╒g╦√% j╫╔ ╝>oiнSN∙├Я ф╦p∙▄aЧ;xB~┘┬╙ T╗By╙-8XC9П▒^╫Р!CЖ ¤Ъ)дXдОf√Ўэт╣╣╣РЫР√qут<$o~~>D-PўЪ5kP╔пO;H¤ ║Б!С0т1╬Еl╪░Б}Ж,\└а└кО.╗ь▓╡k╫╬Я? ¤ў▀gЬ╞╤гG_r╔%;vьh╙ж \p┴и5vИ╖а╥Ёс├wю▄ X▌╡k╫я╛√эM/_╛иьC╢l┘2vьXnЙшLЫ6 `И▌cИDe╟┤CQХ╛=z▐yч╖░гWdh`шжЫnZ╡jХД)╬╦╦├МрЧ┌йф6ЛТ ╕ ¤┴]шэжMЫ╨1*S ∙╧в╪╣чЮKфДЮzъй √┐ ЫЩЩЙеЖn`ЦУ╗8№*°М■pt&А z ЁнlE#:YXXИзх °║ ▄Й'$.Я╣┤^gsdЭq║TP¤Я[Н▄Єб7│Q╒ ц{J├я<·╪ї╙зФ╘Mё╣Гщ*╪в░l┌■T╗Jy╙T└╓8h╚Р!CЖОШ┴AА H(j╩wаbўю▌Н5КwчqїЇ╙OЗи=чЬsPф5▄З~°+ГГ╩▐e┤ёхf+▌6┴▓TЫ°зКД╗М╕°тЛ_¤uZn1√XaП┬D3r Kb╝╕ЪУУCЇ ╓g░3иї0hо╛·j░юН7▐Р── ┼╠>s╢└F┬м<ї╘SчЯ╛▓Э╜|Ё┴uы╓сЦзDKO'D├/mУЁ_6|i└.бє╔%ЎАyAt8и$╗╞─▓ ¤|ЦеK%▀┘gЯНU■╫┐■Х║F,·С#GтI`*уЄ`╓fЎЩц6г╒.Зї├ЗеїjUn/■cЫ╙Я8ў╥~o╜▒+#шuыДВ═ ╦&■ёO╡╜к*╒r%IU╩└ACЖ 2t─t8q┐ ■√vэ┌с╖EЛЗМ;╪бCH4╚Ї/╛°5№·<Лi╕╓╕qу~°Эм_┐>1 8╒мY3cPtЫg╕Е#*--E∙Z╡jс╞вв"2╕┐Ї?Н┬C(FЗ_F╖й[╖о ¤°уП┴Y !└\║ь▓╦─╩н╝╝Ь║@№╔ vJє└еQ▌ХW^∙└ю 6ьып┐V?u░@╟Аыўю▌╦╨ГQщ╘т:╣yєf▄Д─└~иРqy0╣(@х8АVИ╒hкИ▒HhШDЇлр3Ъ#О$л▒fЁlач╘∙╡m█v╦Ц-yyyИ4Ч╧ЬИттb єФSN┴UTU╗^╜АR┘J=╕щ├вЇWЙ:нAыз╬■є╚w▀■1г╩ы7ЄЫХ=tсЯj·Х╫c4p╨Р!CЖ ¤'Ф$ю ф,1єxA▄┴w▀}8сWf;H'SИч6m┌ь▐╜ЫPГШЖ┘Дё'Кэ▄╣°cу╞НЮ0"FяуЯ(МzЁ 6A╪╙]АZ+z0@ЁIр.цЛ#7d#Х°Г╡Б┼8[Z╡jїуП?╬Ъ5лSзN╩1иРЬdркЧит┌╛}{ы╓нqїє╧?шбЗPrц╠ЩШз&MЪшyJd.$t_Т@3▄шDЗХ0ДЬЬа(@(hЖt^│fН▓iQ╓╞xъйз;aDлWпжoв═т_ Я Я╜яАЧв║■┐╙╦юl▀╫HУжb/▒Wl)╞Н5▒DEВИ╜╤kМ%&5jмиаа╘'M▒+HчїўЎm▀Э┘щ3 3;░вв?У№№E¤╧∙Ё9╠╗;s╦╣ўЮє=╖ю(.ЁН;v┬Д Зr╚К+N?¤t@{оарCў╟oТ│█└ хЦ-[└¤PMл`XyЖ╝e▌Т4CqБHkO╞^~б=Мiд╫м┌┤t▌AЗ° dФa S╛╫╪#П<Є╚#П■=·&8Ц м╣;лцо▄┤iXфT*╡╙s!▄Э;v╧г b°С▌JR!O╕;C▌▄┬3И░Е;J┤d╔Т├;╠-аw▀ └#wXJюaН╩ sКA<Yрew╦]u/■А°▌√┘>¤ЇSwzтY╛|∙бЗъц╩pю╬ 7щ оJз╙Й╗ 0P╥*┐э╢█а ▌гП>zъ╘й√ь│─ЩфсО╜╣°Ю!9ww╚7ЭнєХa┼╩ЦИJx.Чююйь╦∙╩╬Йo┐яG!gИ▄╜Y╬НХЗ*Бфd╚Р!рHFДo+√f▄M─_Ч│;эю;оLpЫЛm╘ЛбйZp0╖╡oс─Ы╧°єЩ0еf╘░к3╥Н√4СM8G╠РЇ╚#П<Єш?аo┘Jт.▄c f╦┼yю■тЭЮ;шЮpш░ннm╘иQи╝v└вEЛ~dp╨Э;vьW\@─=Є╓а├3╧<xВу╕|pЎь┘o╜ї╓СG 2Z│f═^{эїсЗрy■╜ў▐█{я╜?°рў╬>└4 ш╞╞╞1c╞|Ї╤Gв(z8Ў╪c▌┴HИ▀}ў}фСG ╛ЕД╞Н╖zїj7?РЇ█o┐ в╠d2Ё2╝Ё╟?■░Л╗w╒┼%.╥:Ё└я║ы.п 5рWЄ■ *╚drэ┌╡{ю╣'drЇш╤ю∙)Ё╬кUлf╠Шё─O╕╪┼▌ўЁM┬й кюб╩T┴vА юф,ФТs'I+'?╗ыч╨ t[╞ПB╬ 1Рde╪╜▀хШcОЩ6m┌%Ч\┘C█Ы┤╗╗∙Ыфь╛С/^╝°▐{я}¤ї╫Эk▓)JGh+BS╫/э─u^гs╜щwю╕ўд╗я.1ШЙ>Дк╙╥н{3Vю+T∙▄AП<Є╚#П<·ўш[n%qП▒C╓▌▌эЮUчf╝╙s!▄Э-,ч^@Х╧ы¤С┴Aў>1w╪╞Ок,A│эЮxБп╝Є╩Й'Ю8АK0╠СH$|>Фдp╨A╣з╙-X░>(h тБ@Бп ЖW_}╕;ї ╔q─soo/аь'Я|╥¤ВO*▀вrХ╕q~╙V Р^>Яп▄>╛ббвЪ3gN6Ы¤эo h#Ч╦4q╟вЩE"°─s╖┘■╫o│°с╦bsч═▌▒╪╩╪'д ┬м▄4шN|гЄ╝ЁNх\БГю3╘╝I├ mFhЄ║Е¤,▓╪ЧN·╒╧^|ЮЇsZ 07НQ(╪Ы╣{ПгbЪ│гШ─╖CэСGyфСG }t`крАюm`=┴Т677o╪░aш╨б└сBьБЩонн]│f═БЖягП>+<уМ3ц╬Э ям[╖·└~√эPoх╩ХЁP╣бD-АяoЧsеЩе╙iё8Ж3▓х╬y¤▒·¤ў№ы┼WЮ~є═Kz6ю╢ў▐БЬb[FЖTу%у╬бG4X█G╜▒AП<Є╚#П■·ЦЭ┼А═└tВ╜л ЎМ]*Х╧#FМшььМЮ7n▄8l╪░╒лW0аннm╚Р!`┴[[[Б┐№Є╦?&8XAА!s@Ю+ГI.БЎ║Kш[я∙¤ Ш╪ёOў║│пoр▌qlзQ};мРYж╩Я╗П$,Кв{+ЪЫД[╟PЕ%E█7╔Vm∙/╥_╬-╚н╜╜¤▄s╧бн]╗vф╚Сdч╠Щуb┴J$n)╛I╬nыюю шfй$╩<╟mQХз╙Яп╪№y─т|СH!ъSM├ЧЦРme9г┌"nut│щЬPшl>!zфСGyЇo╙╖ь,ЫхО╤╬█{я╜Ч/_Ш╠Їр┴Г?∙фУ┌┌┌b▒Жь╙O?4hPoo/Aр{ь▒Зв(3VнZА ╛¤1┴ATЦИ{Yн;;ювw╩ v%oХЩJўf╚┐√f&Уqп╡p_█q╘ ХЛщY╣Ы XЦЕн2╣ ▌wи╣ я°mЕ╛м└Зи|6┌~( pИ╢2 ^╔9═]▓цЦH+]ж -I■ЇcСєО┐Vv╞╕ш║║║аcьИ_+РtзrvЫЩ│Й╟Эы}ДR╨f% R╫gZРgEГс}Yф▄ХWE▓8БК< Xш╫u├k┤Є╕ Б;▄ГГyфСG¤╗Ї-w╗Kц▄╡Ummm---ю!~°сбЗ·ю╗яО90▀сЗ!Ас╡║║║═Ы7777Ге~ї╒Wg╧Ю¤#ГГюК~Q╣г8юR╢КEл┼√╩▐Xwl╣{шЭ╗Я┤rИ▒√Бю╘нП{`е░юj?ў6О t█ё[x▐1╬ЭR%Уn~@ьMMMШт ў╩57ЯХ╔╓ ^м└п ¤(фМ╢OdМSUТлЬV]┴Июам╗г┘=J}M╬n╙кU╜эю@v&RH╘п!Хa kх─╨g$чd{┬x█I╔╔ О{p╨#П<Є╚гЫ╛ ║а╚╜Wb┼Кp└Єх╦w▌u╫н[╖О3fёт┼t╨{я╜сннн{ь▒ BБw└└u╘Qи|#АНў▀ G+фщ╩)┴ХГш*o!М7╝уnи▄╖QюЕfиl√с╡╩6╒з>¤└ЯюnSўМ├╩^TH╛┌ё█у№&к▄ч"║ypяп√Кxw<ЁыY¤?жСЬ┐B;kw▒ЫT^Й┘°&9╗VбC6ТrE",dб6В╥┌КУeyб(~╙пЦeДВЩээЭ-═M .bК (I*ъ║щўєжiЫжn█Ш└∙l┘в ъН2Ф┤"8(o▒ ;█{ъыkЧ-[Ж┘·┤H╝ ЭбA Г- ├2$C;#!▐B(П<Є╚#П<Є╚г *╛ ·C!m]эЭ -MK8p╟I8(╛╛╛■ъъ╕вh╣|▐ТvGUU╞q┤p╔R@xзM╣ы█ТиопZ╡lа╦=vs'Л╢}▓╪БГ╢ )gQы▐╝бойq┼╩Рьи=v3mфL6#{█╜оЖ,8H`,╦Т╬U°ў┐n╥#П<Є╚#П<Є╚#T╚чwюL█Є|.Ыї∙|▌▌▌-╠~∙хP(T╣vG┬mL┐?Ё·Ь╣ў▀w_к?ЙXю¤╓VДco.\0р`z▌чС··ўт─n{юi ╠╞p▌4с w╬ЬAЦс╠CЧвvю`u.\Ё╚#П<Є╚#П<Єш{'нX▄i╕(КСк*UТШ`0▌▌нл[0wnKKKooя╫_╢TGєВ ═7ц▌:їVеPB ╣t▐№p8<ўН7ж▄6У╓mрыj▀_╢▄┬░Q{эca╕БУЖeт─╢;am╦┬lЛ╩2╬Э\█#■╠з{▄уў╕╟=юqП Ф╣Ь+YШ│Чу+▄╟ёйL:Л6╙D5Х═м_√yA> ╫▀71\┼1YQ╓оYsє ╫┘жВ,┤rщ К"▀Ь?ЄЇ[▒┬жнBm¤╗o/╙╜╫▐&N┘cсH╖:ыmR"Ъ@А)╥ГВў╕╟=юqП{▄у G<Я█╔Юbр8BЩ\n@s╚BшoП╛░·¤ў JrЙ└Ёп┐oИxEW╥Й■7Я}F╥КBнЛVкТ°▐╗яLЩ:ы█┌U▌P┐l∙*┼BCGяж╚dhЫ ЙЬM─╢У№гчсхи=Є╚#П<Є╚#П<·╛IQvОN3P╘ЗТEt·щg╛Ў3┐д(BQ┤пoI11K3Dб:жЙRРуц═Ю▌ |▓·╥▓▐zуuчТ║5Э=M ╡╦V,jzуаa9E╒0╩└qВсНэI─1мМ1m┼2Ь╒Г▀tО╟=юqП{▄уў╕╟ Ч8О▀^(цu═илПvu&cё(Iр∙BСe╕п┐oужlH▒Hазн═OQ╗64ў╖╡·zi нZ▓h╞ф)╪GЧ}°Y║дЫvщ╚цJкe8йPЖЛ·0М▓1▄F:$haД3YбёgyP│МX╖¤П╩ob╓┐Д▌╠я █_∙ ▀с5 }Снsш╝╛├'f∙'┬┬Ё/х╙Мk╗[▓Эpx 'рWwЗЎNrhэЇ'╦═╘╢Кfy5ЯЄ~═4JеNh$бHЪ2u├┤Ї╬ЎО┴w)ц <╧#╦─(J╖ЭeИР]╚М,╦.с╣ТW█╢UUЕКв▄(ЖVt ║uyз┤e№─▓мъМЦZ╕Няиz░эЦ╧vLIY┐Ф- X╛`╨┐╡н-НЪЪКl3Йф2iDa∙|бвb:▀нI'Sсhи/▌╦9ЛNФJJА Р6muH╬Й╧Q╢РОн(%Я╧УU╟ ╦Вh╜╜IКе Яn╪H╓M▐`HФJ%}~Б└qE,T┼├Fds9PЦ\*╔∙°┌ЖxWg┐ПRYТ@*╞r┴Ьд>.еJf▒$Vл¤)%ЯпolhяэцkкdK7╩езMМ░p╥BШлё╬╛н]m\PЁ¤▓ZВ cО,РRRЯ_ХхА?h*Й∙LJБ;╠┴nХM/ }Гт°жGЦ4+ й┼,aiMU╤юо6Ц"U├Фd╜yЧ┴]}IКца┴АЁ d│,Я╔9wuЛ∙Вeъ<╟Жж╩%Цf№~┐(КЁy╣дDгq├╢rщaиёh8Wб┼R -3_сe╦▓аe:Gpтx( l┘▓ейб╬y═ьN%lЖ╪╘Ш▐▄Е·е<┴1 IидYAhЫHзкCqЮдeE·■фщt=╦В<╩кО╙ AP~?╫╙┘ПЕК╣tcc¤╞ ы8┐р Fd═Fу`W] p\▒$йЁ I@уq%╙йАЛyh╞ВПЧе╟1A┐╨ЯHРН1ФNУ%CД`кзз┌a0,Ы═╟ъкD█L2сp┤Ф╦╒b∙tКєq∙ТшFТщL0ГfhjЙ[╢оF╛╛▐ю║··╬о╛ъЖЖ╛d2@╙╬zф2░╞╖┴AД┬&9 dUO╩№,cкJ╚░ L╒A1i4╦1 w%zkjыA╓╒╒+2дEa&bH╞╢1]Ws┼L╝:Ц╧ч├сpбPPt]Ч$й╢╢╢ппъ2 Ъз║║║╜│█─щa├к╓мщнКGГ▌╫УДЧгс 4╨╢╣\N╫MЦчб╧АcL#╦.хMC├hФЭbвh,ЬLfЭоgщ▒hZРгUdZ4T▒Р]╩ЇM╙-<@л#▐NХ Є-2И*╛5l╗P,24Є√▓Щ~Ю└ЯkЪМ╓h*щЦehдйEГ~╚sWOws╙YSYЮkяъйЖг▒Tb8Цд°,├Д┌╒#┐H╫Г╢"░Тк@а9║╜╜│к*Y╦х28с(pшТ===PkP╚╢T*В■ЗЖy▓4 %Вg┐/@QМX(R. чєq\&Ч├("Нu'У4╧YVCаeq╨K╨_╨╬ь╚ J ╧ю о]р2┘╡y@c┤g╦╞├МDл6mmkhlN$√kkъ ш┐йT z4╘{"САtД@@EЗFBA>-█Д╚UE F┬Т$лЪa┌}дXД╫D╔╨Фпд U┐BЬЁ'Tеs"[∙W°й┐┐ _к_∙юхеY6+}┬wMъЧ┴¤?N╫+яOг╝╨║YЦУ┼@кЯ├йR~∙kпЬ{ЇQї~n▐ьзO╜█╝y═└Б├ZW|ZрВЎ░Ц┌rжМY* 0╝БЩC@_П`мкkEЖU9B░H╒d╙,Y0┴┬╢├lОуoM;ёд;Ч,ЙьЖН[GНЁ┴╟ЫГ╒5+ Ь▓lа px╓tЁ%IсжasojjВ╞PР─Т,2джоJ╡ФT▒fЖf└$@п▒MдЧЇА/оdtf9]─pа~K>? O}c=Ч5k6 2jZH_oя.╗ь:mєцMCIе√kтUЯ~·)Ї@К╓ни╜ыо╗цЛbQЖД№fIХ└Цd?╧ри┘VR,О│ЗаЪд│щ|8.фКЖУ4X6▄Д*рШBAT }╙щЙ_▓ Ьж)╨bїRnпсuлW╛ ▌╓┘5й[Тв╓7▄╝╡нйy└·ї░_lкг ┼@(■4ыуsщМ_╪╩ЇЇt ╘╥ЧHCKK$S┼╘7Tй:╩цЯЯ-JtКпе+╦xЮрjBо╩жЦБДЧJ╢л┴e╥C|*ЫнїБ>╩>хAY(кк)АC!+▌▌▌гF √├йg¤nтЦдv╨Т╧fу╡upфM`n&Уооо╧ЖбC?╡,SеH$Ь╔dYРЯНFр@hРt:П╟с[╦БЮT√eS╕mКк2[БГю ░жf▀╞uЙtкЁА&x│Ш╦Тo уJ∙Те┌Цf╥Nе·лjcЪYЄЕ№рSrм└▒C╟LН╘d%рЛbVS АГбP╚r╨пщpz>ЯЕКвdrY0КJIо VЁ%5Хюэ:dPб(Q,КtS&┘Os╝Ip■а/╤╙╫ДKРЩG](▐t у ФmPч┬╓L1и.╬uuД?~*9■ЯO╫ЬЧ( Y$╦є╟Vy~Y│ ЬгrзAрШЗsЩФTtЪ╝:WUГ┬╚ЎЎnЮєC[╖Ь2Фgm╩уВХ)UьЗцb4╫Яь5╕j╙зkg▌t J&%"Ь?ы╛Ъ╞'d EpEа"ЪЭ┴!Сb▒ш╞╧3║кшЪ.┴З╝ў╧G ъьРяъtсмY#w█}╦Ц-А{┌7 u╓э(F6б·FшpуoЯсу @└gЯ}JSD}mu_O/рЄн[:ў▄▀╡эЫ} н┤'xЪ0j╫дШ√╖r∙к┌@,Y╠GF ЦL3╬LE ^хCZ╢ G╖\x╔м^"Y,┤"КЙЮ6┌+╖└&S#Fя╣o║а╘T│мН>X╜Ъ╪ч╧х Н═эээ├GНLз│ h╔ОК╤G4Rку5[║ Jы%6╞╘WМ╤ЫЪy┌o╦вж·+fNk┌т(йl^░╔Ш |╛ё3U╙йя╢ч>[;╗ПВ╟Q╓пYs╧Э3Q!З┌┌■┤|┼p}ЩbN,┬Aиgh╧╨ъ╦ЩdwG┴┼uf:╜T╤ъвСB·║+о@НtэЖ{юБvK2d╝║ Ё═r╨ЬбСp╠яф╥┘АЄ√▒╛>ЙfЁdж┐жж╖ ┴№Cузi▓ззп╛╛╘▒э ▒ЁлоЫА2єв ║╬╧√}╛ж?Л▓h ёxx¤·═╡ Н╨U$YСUu╖▌тgП8Ex╘╤v├ЛпV╒7ы.k╚!cшxИ╜ЇтЛ/╜фbиВXM}IVqЪа ┼╔х│╒U5yшкЬЇ'╦pК*█Є А╫EЖе┼вT[WО(]Ца╩ф%╣жб.Х╩╫U▀]╣║о:ЖtYєЪR┌w щ┼TDdУ╔*ЭщяЩy╔%╘о├ї╬N$°╧?б║╢╞fr∙кЪъ\>UЪ╜│▐▄┬ЛEЁ╜∙╒╓VГжT┘.ЬУo┴EOеR ^╨╞▓XLwїш7u<И║║:шw├З Y┐~}_тс;gт┴а╡aкпGк|ээ╖√#╛ж6W╚▀zЇq(uTuбИjЭЮXпzЁA╓*РьM75╘Ky <╦щ▐&H  g╥YЦc4UП╞"ЁМс╚╟√╙ЩT^╥LЬг¤╝╨ЯJ╘V╫Ўз·сЩbHUgU3uЛўs8─E M╤A5Г╟жы:°j¤¤йp4ътЧ$Йдш/Ы┬╩вЪэЧ▒Tр`RЩJЎ┘еQW╘╛ЮЮ╞║*0s=╔>:,tїЎ:"Ы╔у╕3░╕a╦цї MTU┼@еA_┤hu}&'БК┤ │╠-╡∙╝ТHЇBHcc]ggOй$╒VWУхС?PаРI╨/КT"4╬Екуз╦к"ЎeJ|0 ЁQSei6Nў*$├ UСэяf)щЪs╧A=∙{^ЩЯУ═p}C╩Ф}A┐\╚p║┌┐n├]Ч^ОHQ°я╛єyO┴ЗЬuНЦ│┤С4╖нtqраm*Ът °Xs9LW[ъыЄЩ,")QВц ^18 ╛`(ЖDб 9k@юом┬С╡}йНН Р╓ФuЛбLУ&П=Є┴┼o┌║│f└'╧9ррЫ_~┼МY6A╨Tв╖╗бо╢╗╖/V▌ ГщEШб)ЦйЕB6УЪr╔┼╖>Є╘T,╙tу╩│╬║цЮ√Ж iщьъ╜∙ДcяШ FIU|■ЖУ)ж ·Ф{▐^йo▐▓й:┐сК╦QO┤P-░xдz▄M7╓xэ╣чвї[═№щн╫╙е"t┌╞ЮД  <є┼зЛкЪ╪╥5r╪╨\V·■$JZfФe.>рА?╡╢▓~▀║ї[┴╠═Ш:}·1jиF$B їЎ!Т╜mю╝T^аа,д╔S╬ К╞б8MЫЎЁХп{№q0Ьсpx╦цMр O>ї╫ИеQ88сж[я║h▄╘Ч^КмiK$┴─·pв▐╜°шгs┴·Ў═ёA╥е|.W1l ·xї;П▐?I"тW╬Ь5ымsюY╣в$J}]э#v▓uу║ц╞·K╞Ю0э╣sТL▒B *Х+Ф╪╤Ў╔b╖(ЖxJaЦZФB0}:JЎв|ё4°═╖╬ЪО╒dК▓h╪#Ж╫f█3╬9ы■'ЮhыhшМ█еo>¤┤√-))r2Ч┤╦аd.ыИE╤hОў ╖БF7AХБЁ9ЦQЁЁ$ыK5╖4ЪЖ] ╒╒╤wЦп·█ ╖Ёї %pл(jцГN·∙Йw╧Щ[] ═^{=0>╘Чру-ЪN_}╩)Y╣в-Я%{╦.┐·цЫGЬIх║{╗вUёл╞{уЬWбAQ┘tОг8[//%еH╒·к]░╪N3T{_4╦▓A!дИ┘Ы╧=Щ *)ИуСj ┐їgnyuОnZрtўЎ┤┤4ЪХ═жm╙╠фrБ`╘░нX8"JCS┴X▓▌▌▌ВЪэшК─т∙в4rTSWЯЮJeтё(ЙY║■╒t┼RС─)░_`╦ ЗР├╥!ъ╬2ьtЎ╗╓пв╔ ┼~▌~Sy%йHсФah>ЯАу(У╔Щ&╪▀Р;эj╨ацLж╕7.w╔ ╟щzх¤iФ0лПїЧTХЄУ┼\oЬ┼▀zЎЙ?Ь|пФЦ/Ьч└┴ны>h:▓їэўKBLn░zsзЯщТIШ╢И5ь╫╡ЪфУ┘ЬЄ#Т eЭuV№░Ж│ж┼`║X╙▄¤Ююx4zхЩgОЫ2%~z$Ю)ц!Г*°▀$SФ с`8<N3HЪqC ╩Э!)Cs & ОчЭqAЯТ░╢O г//м.пЫ▐╢QcЗЭ6aY╕eц3щ┌киПж╫п[c(rm<Жщ&ШgВїЕkj╗·√M╦│й░р+e╙Cw╕~эч╒їMIQfВ╤H}c╝эР?Эш)Eжа 9gс╧rБА░uєf(8@UЧъOE¤╠╒З└Л░ YЦ│∙┬Ф│/xЇ╜ЄвТHж(>√фУH,╞вP:и @ Ёr0р╧ч▓╫wь] шььДцt═▒╟╬Z▓─YЯ!К╖ЮўЫY╧='kZ$ў╞╟ Оёъ{юб8┴░V║ж╗к┌зЇУ┘$ЕQТ* Ь`6оP,~°┴╟╕ gЯ}Ўзkп╜яяOе·zлллA6.╗  П< BбШЫx╬╣= OМ93<PТчq─}o╜eBЙlЦ▓эиЇв`∙▓ЕьЇ)╖^;}┼╨р░А] 2qжY─╬P УBй└╙╝м╦ QВQM5фAИЯїзr)раA-<╜zчўz╧В┼ ╟_rЇ╪√▀|+_(@ З:_Э"HMS¤>_$х|╛оЮh▐╤hф▌UяРV__яАVЗ░╢╛|ч╛D2ZSУIgъ┴Щ╘НпжЛQШйЪC░$k ├╥,`;F)ЖB"r√ыЧтиRбё|╟ЄBn-╒ДJ√k9ыъ-Ъ√KБ┬q▓Tб~╙щ$Д╚2╕CВcIJ¤П╙ї╩√╙(/┤sЮтeMaC4n+Вн╜ё╘▀/:ёД*КX<яUg▓╕m├═-C╡╛▀kС■╜Ў[Ч╠Ki%"D4I╝i╨╬0-j&┬▓ДmУР)Э┼I╨б6f┬!@пац┴▒fiшЙм&╔Оо?■Д█ч╠Бм сРКсЩЄ¤*ШЬ5╤<╧юШЯ╗?гX,jЪ╧`нЮ+d▓Р"°ЧР,ДC║а╫0чв╗╝з├┴>╓;┐_БГ.╠зScv°щ√ЯlnX√╔'│╞]КL ъK"В╝√∙чmОН66Ю│╧^иеm┌Аpт┘9sN?■дjHбЪ┌ЛoЭ4яНO$Л┼#DCс╛М°¤┴A╩2п;№gў╬ЫЛ4/ДЄE@;E▒Р╣у?с■ЕЛКb)ПuvўLЭ2эъыонО╫~╨2Чz╚Я/╔ч2╒▒hб О?э▄iO<Й╟*fЕ┴■оЯj_Ў╣S~д║╣!бK:БL▌░U▌пбkO8юOє_б9ЪтГ█;ж▀pым┐№:;Eт44/╙┘Уqс╧╣їХ╣М/Р.Ф°P└p·пE╪8aUЎЪ:▌▄&Ск*р▓4ОлЖ&лД╨я╟wчв┼йB>└єBе|NЧ─йУоBm[ж┐№Єuу╞9ыЄl√·ЗU╣к║Жўqж ■QvЄ╣чB"З ╣ЇЄ╦¤<р▒ожжзпo╩еЧв╛╛?╡╢^vЁ┴hшPФ═▐Є╨CPя═НMЪоR8XЁОЛ.B╡5HФ╬╛■╞¤8╕7С`}A╚/E3Ц*5Ж╕3wї╨╩wsТfЬти8┐ Ч─Є┘T}u╒Еь√р╩╒8E}Ёёч#GяKЇDг╤t2┼∙ w<┤7╥)║sNБ ╩r╬■]К8хL┘┼l╬/qЪuv с8T0M ОDО9№oKщК ЪЙфДtAJФЖ·┌Й╬█k╠c+V╢ышющK$■tєM╙ ╨k8▀╥e}N║NЪ╬╘ e8║╒ЖъaЖ─pк╝+ А]gGБсАAЫbээ}╫О=~╞ып╟гaP╦▓TВBы║∙ТЛf>■8Ж,(T>Уї >Аtа╥]M9я№;ц╬═Ydq─р┌▐╢Ф.Кж*╖ Ё╗Ў╜ёхчФ╩f$Qx№э'д2ЩX] ╕ ЗВX╘Aу┤:▐╧ч29\ ф¤Z)YЖIсцUGzя╦/╨,╔G=╝|y6W╝ц─Уя|sОH$Щ┘░a├¤7▀ВФ*пxр0T[W╖v═Ъa├ЖМ;я|╨№╖╝°т-Ч\тЬ▐VФо¤╟╙кж╟т╒╡НС-[RЬ▀gЫк│Mэ╦щB┘ MЗРТшМ¤ЗГ!├2 ╣╝3 GРС╪wн_(8<╬╘∙w+/╘t4и ░┐╨O└ v╢╛х√ ЩД*▌╚Ч ф_C▒MSн 4]п╝?НЄ <_╠ЙБ Bўs╕YHнЬ3√╠ГНQ°в7цL┐эfLJ╖ёСк╒л╫оMП<Їє^yё╝╓Ъh Н╙B(╪СъqN.╚J╗э╛G7KЪjц%├B╢ ╥p9аJЎ█М$i]]CюТLЇ_s╠▒w╜5Фi*Чз¤Вмk,╦Bчlmmюn╤╦┌эрГ╫о]╦│hy░х=Й>@% Ф▌ЎумАVuЪч╦л┌ЬY*;И╖├┴Є,┌v┤Зm+└sйЮюж┌кu4є┬єQ}═УO<J.┬ёз¤цLй╖kтПGЫЫ#╒Q)ЫЭp·hk√Э{lт┘чДЖЯЎ└ГD╝*c█}╔■&?`█┤u]ГК┐°РЯA╥Ю?ъ lч╕▒╟CъO,y√ьS vхёys╬¤∙▒H▒g╜╜.ф╧"╝сo╣х/╧r╝ ъ3OA╔ 7 хЙ╚■╟nшTwёk┤Ц4╠▄°уОE ╫9 m╥W4MфqOuuL╣ьRФ╣ч╛ ╧8∙╣YO?ЙBqЭ щ╚┘ж]┘bmс╢ЕY~g█fW]$ФяOL■╒пPI╛що{[ZZ2%ёЦЩ3─dЄЎ╟■нo }][g-X;├])XХqцЭn9є╬Ц╡єуV■;Є√╓|№┘n#]·є&▄rCU$Нчж▀_ИтuSx8ОeєК└uU╣y№хH╙яxЎ┼BIЎs,t/|ХL& L:щ°й╧┐ПG e∙жє.Ш■╠╙щT╢╣йA-fЛЕI1КжCc║}┬Д┐╝6wk{$ Н╓╧: Й/?ъ╚{ч╬ :hIЖо5юшг■pї║5Я▌}┌9│Юyц╩3O{iу║_╢░c├╡├oЯ=[П М (¤∙L&нmкмa°_'╩╥п;ЄРц╜╬ёBwвЯє9[JЗя┌xЄаa3^№ч╓-~Ёбi╖╧Pmb╚И▌6vЇ █lМ.°эoоЬt ┼r$ РЖ│,;+ТВ0P/╓uУ&^5щjЁЭO│,рг╒═їk{{MКрYVЧd┐О]y▄ёП/m-шJЧФE,Ab╣╥╒Ч^2э╢RЩФъ╞Ц▐■\}s│у+2tйР╒U|┬ 'Ь4уї7 DшИ$y╛dJN▐>:╕э╪╠┘Y\,№пЧК┼jbБ4ьл~ёєk▐x#V_┐f├n╗!TS)ф4Q╝·М╙E▌∙ў╟С░Бу8ьРV╜│╡╖л&k4pэuў=є,и▌Do▀фл&О┐ёжгFЎїЇ ┴и╦ё┐9х w═ЭG°╟?ЎюЧ^c BooянЧ^Є╫╣пГ#¤ў▓│╬╣ъО╗рA1мц]Z:╗√}&`ъ°г┐√не╬╚&жшF8Aжf(▓НH@╕шАо{Ў9(L▓~йTВ╒╥|щЕ╖кkk~IQ pzm№Ц▌Ў╪├6MАк╝ў^M]]к┐ЬdPЙаў│┼╥Ш=ўKr&ХД.@тЎ─├v╧ы╬`АrmгшьчLMхm¤ПcП╜у┼;║:б=╠Ь:mn╗o╤B├╢ЪT=ў┬╝Ъ║Z┐/ л Ї#PЭQ┘}╠О)ВtW┐W_WУJЇГ5|■h8LУОcbб <цШє^╧╔┴╥U▒h"┘аЬ%иSе$B- yш,-й;а╜·┌жЎn.ZэєэЭЖй╚ШMA-╠Ь°╟█ ёw═6lgv╦·НчПгPЬЮLV1tР╞A щR │nэZЖу В┴■╛>Pz▓$Н▐}w┌║R║∙wg?Ў№3Щ\с╩╙╬xЁНyр>№■╫з▐t ць╡`:c▄e3Ю|ТvJB\vЎ┘7╠║+Гk!У~¤K$+╖╢к║╛тyxўЫ T▌а9~├ЖMМ+EГ┬W╥ХЭQcЙf┘L*Еp<НЎГA┤э}ЎУLdЫZ┬▀▒~m уF╒┐ky5EUD╔G;Ў|Гh┼■ю7&С╚╢┤Д_xсн┌┌Z┐▀8╪й_╠╬Kтш1 i║^yхe┬`Ф?└w$┌h┌R╥ ╡╗уЇГ~ц7┤wZM┐эVмsу╡Н>·d╦╟╜щЖгПЪ юзwН┐╤ё═╗·╨А&╘╙в╫▌p=█Pk √ЦБ┬T╠;7╓ В3Є4tЁ─o ЕаВ ┼)W_u∙UУ hXu]К аg:NX▒И┬Y ▐ШIТ╝¤йзаl╨╡з]s ъъD▓ЖZЪPG ЗQ46щЖылтuЁ*H▄tN] ▌sdP∙pЩЄ┬AнrЇ Q╞Вхэ▒ иQ)сЖ2ё╘SРXШ■─c M╠√║аФоЭ0^║}с┬юDwM8╠ъ╞ХЗЙp q№▌?$4╡$L3Гcсp╧&3Эи╝┘Ы"ё╔Ў╛Ч^їRТ─ ┐№ яyф/усбжъпП>x┴qЗ!Ь√╙╩═¤▌эS╬·Щ- ╛l}lМfэ╥%G|t№ЛЄUсРФ&Х>О5.9ЄД ў>єrд║1 В╞▓∙,KX7ЯxЄу/╛TэО;тHdш |wEПдhlT├Ш `3qча 7J▓ е|*╞rу~s&┌▓Х"f6uч?Ю╥┴РЗ├|,╛╛н╜кeсєўеs├:geX╬Qy4`A 9G░`H╟@pкМЇА·╕Ш═B╤nШ8eSРы{Я·╟cO║o╔█хМcJI"1ло║j¤ж═t0В╙╬ G>ЧШBр6╘√%√я{╟пГ╦aX╬ЗI╟О}xї╗rI═еТБчб(╔╫Ь>2ь┐╛9э· CЗ PS]▌▌╤╔0╘─cП╣щЩз MsЗп╣р╝;ч╬f0ьЄ╜|l■[ч]Ў√Л╞П{x┌m╙|ш║╙╧√ы№∙[UшtШЎc6!╛■^срс=0o.┴ЁТкb8ЛE╓п[3э╖┐A~ >╘┘~ ╝∙╛pu_&╟°"Жй!)K"√╩ Q▓с$ Д╞]¤Ёс├ Аъiил[╣j∙Гў▌gA?эяCбшэz╘вY,фcВ~АGА╠Д╚∙{яў╨ВYEтjв%KФМkц░┌║-Ян╣~▄яР└вd╒7]}ы4Ьв ░y├·╞Ж:АГАo╞u╠эo.20Тё{fhл╝│╕▌IТ─s┼|$╠з√у5дбЛЩ▄Х??yцкUЙb>╔∙ЬФL nl -ыВГ|bYk╛р╠3Ўд·зMШpэC╫TI┼№н'Ь|¤SO577pбitыдSO╜с╤Gkjj▄¤О:ъСХ+│┘,ЇoАSWН=ЎС╓еааA)]¤ЛУo■╟?l3,P9Дм[wЯ √;-f}БЮ╛├∙8Ehєwю ┬╖ _адcрК░]╚gkba┘9V╣щ'?▓ъ=ы╛`X7 е(C┬─3╧t╘ Dлiзip>&▌~{,y24┼x╡╡бж&Ф╧#pў ы┌З ЕвЖб√R.dо=■Ш;f┐XS╧хЛ:FvїзЫЗИ┼|ХЯ═gТУ.∙Гs╟иnLyфсw╤m\╖╠@(8■╠▀Ц╙EN║Ё═ Ю√╠x╘Iў╢є╬u╥▌║┼I7mШBЙ─╘чЮ2░щ│╧╓M>уМ{Ч.RH─ЬЦ└ємхЬкDф▓┘┌┌jUw┬~·yч!├╝■ы╓н╝ыи■М╠╨╝нi`MI Ё№eЗ2k■ыМЯ-*├▓ ∙)W^хl1)*Ид├АЖъ┐c╗]Шь╪Е.'├--О╣qьBЇкыппкк"LSК~Ц*Hе+O·∙п═uLl&ЙD└┴╦хr╫Ь0Ў╞gЯ1lЁЦ-m>ЮХф╥u'¤тЦЧ^xE┘tцц_ЯЄЇvttшхо═░№я<шО∙oA#Ьt╩пitw|=]з¤т(q╠╣▌2щ╞▌їй B¤f│о№.хяхкЯЧ╙qБ¤ї и│ r▌M7▓4у╘/h~Т@&T╜цpЖF;i╞ЪоW▐ЯHy;╗РвгЦz╘╣U u─юг'Ь~Z├╬Ыу└┴ю═╒ ▓d╤╗E.h ■qGc√Эї<&fcЦJ:чЪ·4(h┬─c:╕╚Gуюс░╢sЦА&°lтНчЮw╙Я Dв:1}Ws`аЙ3─щ%ъТjЧw╨:ё№ p7мкP ╙╫u╒Й╟#Ъt.]АYМр0ЗкbИ#п¤єЯIЦмЕд╛─╒╟ОEЪЙ(цЩ╖цчq▓╧0╕╞Ж-Ы7ЖU∙ЎSэlЛГ*╧х@╙!Myd■ЫЖм▓ }■QG#Ю¤╙УO^v╞oРк╬~{╤╧П▄i╪Cяl-дУ╞О@ж9wm ч¤Rйd─№°█ Ек╟?│ўЕ[╪"!'№ьЬ¤ЎGx`Ў█ян▀┌IC╢Я╫,їЪгE║∙ь▄yЫ?·ф·ёуЩЪк+зO╕√▐Г**╬┤и6чЁ!ЗУ+0Цm╦bЮ╢uЖщ╔╘їЧПcTKЁxП└n{ъ)╔FС┌:УaУEСB║i¤(р ┤?MbЖВ2p?╟Kr2SШ>q╥╠'Я :з,ЙБJ∙Lмж6п┘`ТjыZЖ┴2dP\╝▀>╖═} МD2ЩL0щФSяxevIR"Б2╘tвя·ЙУn╗ў>AВНO$SВ АsжХ╘ ▀П9┌Щ.ДfЛБ┼║эБ{LОЄ╙Ї°}6ыЯ╧╒ ▌хМ├Щї№єЖП;х╖3 Ў79╚ъ8NыX4OKъў п?Єg╖┐°Ь/ /Э)DЭ}d¤╫¤№ДЩ/■3 Мw┘ф)╙·2b╙рбкEZжюCFв╗#Й∙B.Wл9ё°уя_╥ `иР╦и▓LРGТ╨Чъk;;zп∙┼iП┐ўAg!-Щxе,`I─╤√Л9&В║Qєb╜?Ь╪║iр└Ъb)п[╬ЁW№ъ┤ы{╛вp АQ(р╕0ё╕уX╣║+СтДи╡K;ЕГр¤┘8ў▓T╚`мr¤йkN;ї║╫_g#бR6oл╩о═uйоДе(УN>щ╧є^WA ─"Yйxхg▄■╥ UОEB°┘▀▀ь=╧єАцAЫ_q°с[╜ZUU"Аfо■╒пю~э5╚d__G;╨ п╦Z ╣l(:я└Q(шt|КAR 1>─rzЎ∙▐■Ф╧Щ?BЦ"ХьeG~╟Ь7╣pL6Ё╬▐╛·ЪZg╚╥3¤}UёшхЗ|█▄∙4я╙mL╤T °┐r"5сЇ└uЦ`:╙ЇpЁЖ_Ь°╚В∙А ,чде└G7у═еАб╒\TЕбhd╙ж-8A▄zхХ│■·hyХO▀пЬ%НХ√╗3хт╫E╪VЕуЦ h╧T╒@ `( ╚эG∙ч╖ЧФH╝7УА▐x║┐╖ПжI░4uї5╨S·√√я╛rт╒ў▌▌Зу╕TвЯ╘оУ,ує3L√╞Нгющю╝ёtш}/Y╬м┌╛|┘н}'oРЯя▐_p█м╪ k╫╘╒7^■Ы│f■¤я╨ЮбЕВбjp▄б▀1oЮПeаоCAр°°#Пyp∙▓\: └╒Ьp╠1╖╢*j ┤AєА[╢╢▀Ё╦_=╝ЄIVJК аЄ╗W╓ }ў√,~фХўе╝Ё ╪z▌╓ОРхlИ┤Ц╛Ї┬яПы╫┤╖╜щ└┴оM╓я2t╤вw \ ∙q{8МIА╥HkDXБ┴uqЖРгY*g┴;щА╢-Йря9g|454Ю?fўй│_сx┐=¤;g┌9V╫╢╦ЗзTИ╟▌Еmх√■Е╔b C}э√ь1Є╘#Е▌¤ь?┬ВPLзу>?A╥u╢х,у└cОn]╣lhSsозч╓SOуъъхln┌▌wЫ& УнпcHb┬~√ YzЇн╖@ых3┘k.╕╔е;Ю~zPєА╬Ўну.║х│пнXyт■√ГМЮxэ┼│O: Q▄}Л╫░ДuсCС,Nzр∙·С√┘8)Рц G\dZыV&Иr╢)ч/8Ёd0Щ╖c|"h2?Я.dж\z1╩дPNМW╫&√√С$Q├ЗL╛ч~╠е}сdв|Yф\_Эх╛▐DO}S}I╠│╚┌╘╨ёщЪ▐M▀{?░yзЬЄK$┴с~Є├П√ ┼ФXЇEлЬ├Y|ЇГЯ,vGiaтЖЎ│7оojj╣ь┤3&?■П╕DТ Жз?╤=|╚└нЫ6(ЪoФ╠№<'KEЯs╨оо╚╥фЯЯ|чВ%Y !U╫п:·Ш_~y└АЦMы7┌∙№mW^∙╨?Я├Кашю▐DйЇ ┌√p╗к* ╙√э¤▐╫У╝4БАИ#2·WGd╟▒!H1qFъДЦH A)"╒К гR┼F йдRДРЮ╫▀╗╜▀sO?ч┐Ў╜//ПсёfМd╞є{∙╓wrю){я│ў┌┐╡╦Z═ фєЦJC╛╙-║¤┐├┤ЭI┼m\`│НJg4·oя√рп6oн┘z╢RDОixi╔▀№╛Я╧ужEТJбfЫэёR:x∙GO╕{у·\й╥T┤ОюЮсссD,t■'?q╟г│4С═f}┴╨∙gЭ{хЭ?$XIтзY]zъ)╫?Є(╦s╨OS ¤╡>t▌у┐2╘┘СьH╞┐┤шиk|╪ыУLM Згgўс█╓м1$жк)╚Якз 7?ЎёЗ^|![л*Qh╘№^пеh~З■цI'^q╟wч-Ш7С/G╣°дO▌┤f Р0пG╥Ыu█╘бW^q·n{nлмЩ$'Бн°vУ┼u╡AQ$$XаБШ[<Й+х┌з~ъ╞MЫ╞ ∙#ц╟v╜>╬Zv" Ls╔зN╣ йзE╬ЧK╝╧w╤?~тЎ═[А┐ЦЄ╣Ц,╣№╓█т╤┌╒KР├г#7_│т█7▌ДНfЩА╧┐°Г╟п·═oБиеI╙2╛ёйS~№°пu╡ЩNзW._╛Є╞9ОуEQЄ■Ї┌6р7uYщьщ╙T┼эп┐╓Т.¤фI7?╡VЗfПvнВ╣NОНE^0у+Е№Є%Kn~р╣№QяЭ?4\жйvlШ╖─ЭI╢ЫT-Вс5▌╘ │-░uО╛Ё├╟▀∙╠У╚їО6╘Ю ▒Уо}r5и▀┘]ёR.MС ┌I═sч у╔7■цq╙4teЫ N║#А'╖b MEQjщO┤Ў╔Fн>л╖+Ч)hЪЪМ╟GЗЗЦ_p┴Ч/╝иZZ╫лпюШ5╗wbt"ЇГ=╢c╟Цa▐yщE7№Є!Т─!┴щЇД"+¤я9▓о√ЖЗЎїЦ=▓wo╚ч╜№╠п▄·╚ГЪнO (N{_9JЮIА┘ чKж- МрZ8и╒хo}тwо▌аf╦▒Kрдaъ╦/║°▀Ц^ЦL&C~▀Dz ЪЎw.║фЪ¤иШ▀▐▌`(^xтЙW=Ё╘vп╟_(Х@√.┐°Ты~ЁCE╒BбЖЎ\╨╙dz■ Є┐еуpH╣Ы▀w=┐hд╠┬ KгDшаП┬╓=№л┼'R╨╒Mm:8║яO╜Уt╨Щ╗Ё╒╤,cє@Ъ╬:ПРtdV╓фВ5[╥&уX`S#sаЇ ╠ai0MЭzнЦИ┼ЁДk{ФтEЛ8X~A86╣?┤╫фсд #ь╢G╝Г▐JbыЪ▀#╔хb$ш;√─▒ji╒ ╥j8ЩLЎ▀/╛ыHо╝щf╔чA*√sзA~ЎшгgЯ·i 'ю^╜Nч°н█wЬp№╬;·H"]╛|ywwўтє╬╤FF1пяЧ=К°ХЧ■╕тЄ╦1U╜ўСG╧=ў\│R·э║зO∙ш▒Ш?xщ]┐H┼┬▀·З#1╟─ч╝ ┌я ╕Xй▌rЎLЗяОЯ№\эX░c_Y╥Є>V/Ц╟n╣l)V7 m╒-ё╬YeMЛ╧Э=Ц┼їцqєцg^{╜Ю╔_╡d Л.╣·ЄгN°P║м"W╖6V.Цn<ы,░ВпЎ^тлrсPЫ∙▒Ся}ё Мc/║z┘╤G╜m`▀wЧ.┼Вбыю╝Г$┘0╝бШjZ║i¤п╪JтХ╟░Нf╡Q.J]┼л╛|╞эOЄП~yhШТxC╙бHiя╚u_<KЦ▌p}o ┬э{ў▌╕ф№ЫўHg.ЫО|$Б │°Д}├цb╡бШыq gЖн$Oы║fj:╧ТJйJZжD2ЧЬ·йk╓8fк`HОо Щ]∙е/|є╬;П8тИjнVк╫┐sюy №ЮD2e┘&Р┼KO№°┼?√ЩГуA▄p┘e+ю║KР$╚]$█│k╫w╛°┼k{Мb╟Б▐zЎW┐~╟э]Эй9sц╝░u╦ _|хm╖с$UйV▀s╘в%з~цЖ_■* ┐°╩ёX2рЇJцт╧|ц■-/ НчdУ5-Щь░u╡V╩╟"┴R.{▌чO√╤є/хКEЪC│x┤ц`н('ъНжЕSНжТH$XЦ▐∙╞6Ю┬n∙╞╫.║∙FPШ═Аё~╦7.╕uэжFгaл5┬6Ке P└█Ц-╗ы┴З5╙@ОuP┴N·ёA╧mQl╗,ЭКЙM2BдЗQМ%Cу, ╠╢ПЎ╤;╓оЕЦrюG>zщ]и╤4YлVУ╔°eзЬ·Э'ЯосФЁ█▓к╦uакg-:ЎЖ'С_'PY╨a┤ {°▐-4Щ08РхCА╓n6КЫ╕э╝┼▐єsЪхzgїA~IТ.є╢i- ъЩW■р.ЮcT╡y▌т┼╖<·IТг├#╟s╘╛}WЬz*╓╒u▌-╖(КJ╥╪*?▄ ╢К^оV{║╗Ж╟<╧;М.{hх;╥╧нЙ2ьры█a(▌№■є█■dX:%ТZша╜юС_-■зO Ж║qїSh+╔°└╢do Ъ╡@¤N №WG2 &8"Г╨, ╤AПОь╚:Гв░hb╤n ╤б∙bgrт├ЎИ^Mmк╞╨Феrгv¤щ_\■шг┤(Y()(BюЯХnOЛЇ:щ7ц═Fm{ЫFэ╖s4ус9╠2K∙LO*ї╒┐? °▒jщТ─L{┘▌ўx├сK╬9лХ10┘E■ю ш▄s╬!i▐╟<■{╖n╠Ў=_>щнHъ╜OХП╞╤D▐р^,_∙ўумзZkЖ╝шГп<¤єШж▌║·Щr╡▄4IЪДошКє╛Жv:{}h+ЇьY╪Ё╨mk╫Ы└siжбъM▌%П╓r╕Г▐Оf┼bQт∙А└]TГеА▀┐iє╢{h┴ыГуS╫b!_.=~═Ygb~я╥[ят=>ЖдфF▌ысХF=Ё┐Ў╩╦?тюё{╞ еU╧<эї∙s╣▄мю─Щя Z╜С╔бuK╤862Jy─кUл^╩х3A╝ь_Ча┼L┼<|>мQ ■УOЪ▓═Ул╬:лйШ╫ч╜?╬U╦@п┐ЁbмО<╓▀║iэюсс┘╤╬\&╦y=ЗоHБЖEf╔■юоM[</Ч╦л╛■5 ╚╪╚ПaщqlсBм*_sў}@а╤к bЎЪ ┐ї╨У┐>m▐╤╪ьy╨"n·╒C8ОПММЇїї5х·х_9у·Я▌s∙╥╦░┴}═▄|▀/cЭ▒ВiПх'╨ШSSю $╛q┬ ┐zхП/я╪Щ\0╖a4бEх'╞ч┼║Я°▒√V ю+'|i╡H№╗> ил+ЪOHф╡ъўJЭ·╧╖н^зЪNеоr^I│╡═8TEGm*Ю1j▓Чgг▐└:с╞зWWEф9┬╢фZ]т╣╦└(*ц░ОО7▌tфQ=ЯЮ ╘╞;RW▌vЗ╟+2олъ┐/^Мн Ч▌~;d╓яў'·▐КP├░Rщ;_+_zЎ┘ШmB{╕ё'?8lПё╤С+╧?-─ёx1U╣х▒▀ ПЎїўWju┤Ь╨╥╜д¤н a┘гПуМыHU&ш1Mi─#▐╤┴бХg|щ╞╟ГКЪ/Wzz{ЛхЖ[H╦▄\╔р$Ё╣@0Tи╚^п ц╬U╫cЩмZ$·g█√Ў`$╘█Vм^ё└├Р/еЦ_з╖Ухх?°Є∙o[4┼Ї╘дчФЪ$ьй╛g?¤D┴┴[╤Юlw M╟АБ╖W╩EIТЖo ┌╫Q3йT╨╩BК║ы┴_в╕v║~┘Ч┐МV╘Аn$q,├Жеў╡№ЖяTIЪє√EutУ╢э╦O√ьn}6Эпй@R╔Ў┤5ЄЧ╞┘Є█ЪЭ8╪?░ В>щы'~═ц3ZПncЧ▄y'|bIЄz╜Т─│╗ўь╣╛`> ■√┐¤m]FУ╚иЯbйb╛░№3Я■╤s╧-Ж╦ Ш ▌ё╪уХЖ ╓ВвНЎХ╨м:=Е?ш э╢Я▌ГР6YЛ▐эT╗∙=,Є эЛ╞h▌2(Й: Б>x▐╔ $ъъs╧>Б═МяLv═Z│■ПU╬ы╠]Ёзс4эЁОA2┤╫[#°ТЖш`Г┴Б╥v+J║╙]?9e BБ/qЗбшlfтИy 0┤ьD ╓╔'_√шу(┴IзЕ9╟░7yD~Л╖О¤tЁm▄PГ];>6┌▌СRхкe╤Рobl┤зпg╫╚`gooе╥ИД├╒ЪЪIзГ~юа░Xr│╢акЫ)DSС;╙ЙX\лха'Л╟уccc╡Z-.XР|уНqф╥П└Рg2U З├В @ЗФXлRДўkяў  ·с@в~║ёR╦e█4Нf╡сQгul<_^╨#I%рСЇкiЩы хЄ╜╟д^▀9╣и╚█╣BLh-сПEЦ2 э╢0[╖}Вд╘eMQ¤┴@.ЯяШХ╩Чк╒z%ЁШMEb(╧U*╒vx╔V{гЙЬQwuзъ▓=>ЮДВЗ┐jА ЙНZ=ъў ьM&вЕ\>О(Ж%zщ|IЇx)КиЛ╔X░ЬЫ>dP╝'ВkU-оI7M│T*еR)Вд2Щ P'ЦeбЮ(ХrW"┼pью╜√ЖЛ'R├г#╨ р8┘╒х}э╒┴X<ТOODгСЙ▒ёTOWC╙╜Сн█wўе║ъ╗ЗEЪ w'F│щd▓г0СIJсЖжg0ЭєyK#ЩcОш═B7╘ДcЩ╡ъ5▀№╞7VмшЭ3п\йy<"XbСА7ХоО╨╓н/ ^╔IT╦▒ К\Yп═Э╙▒aу ■╚qщ y"Ыё·└НЯe9#├ГЙD,ш_{m[*ЩVM9TUn╚о`F47ы ╞^ЁСП\yя¤*fш<HFъu╣7Ю░╦M┌▒нЕiм╟ч╔°┴b>чGоP-KkЪr═ч>┐фG?Эф"ТTвxЫ╔ uMйЛ╣┼#1CVК─5у┬O№ъэ?ш_░P╒Ъ>ЯЗ&╚rеlпппgpx$Ля╪╛kюВ∙Й╩фЪГГC ,HOМЎїuПE"С┴A╚]┬▓,hнкк╢CУч8№┼_CuГ P$°p0я▌=V_ww╖"╫х╓╬0LP$Ё~Ввu╣;░UWы+/╝pхOя╡IV E╩uЕ┬)Ж╞╙г├ с▄┤Ї╥я▀w_╡▐МеbЕТ┌TХЦяД?п зЇ!C w@PЖ╞╥ИШ▌█▐Ш?зWkTh∙&єГ┼J╕>╬KааВ>!С╙8IpgЪ(МR8.Бy9Ukж(рєП╪┐фfr$БF▒гt┤▄я1tлZ.╟ъщъ░eЛlн╠г( L╡`└Зvh┤)(@8╪│ЗaШD26:<╞ЗЦ╫Wn╩ЪёЛb)Эе ╝&7<~ЯН|звnеEQ└bв=%Л[S2SхS)d√z║k╡z╡.Г&даЄ▒tбTЖМ7jUп(∙^╟╨а]ь█╗╖лллT.╖в╞К┼<▀■Їз~·┬ нxЇz{├P▒ k╛ў}s╟╙Mи╪`A№ў·+╚╢╥>H║0-Фы╗Яr7┐яz~[kя(├╢ZгГ┼№┼╫╨┌Aї╣╒O 7╘c├;S]│Ю] rХў┌sц╜:Ьб1╙ О@1/ н├u4W[c[гГцфмbЫ@8УЇ═N─дн[╖═Э3╟чa╖┐╢▐ Ъ4У╦{ГС¤є╬;ЧУУ╪фжу╧йГ6O╤Dzl╠чХ·√┬█^▀'B/EсB╘_иTХЪB9┤ЧўДВ╚eЭaйZlеs┘p$с╪T╜вHbШplE)'SСббс■■nEБ ╩╗vэВм|¤Н╫g═Ъ╒N└──D0┤╣Sq├P ╗V.]}▐W┴М╛Є■_`█▌█[к╘└┬╬+6%"╤B n╩1ы├* Ц─7Ж╟bє:а;Д^г04▐ыёa═f╜&SёвcЫuБ-UJ~]V -оj4ЪвO╠Г║g ║5'L2╬Т$ ┤[wo╟Ё`:┬╠X╬╢Жц┬a_гa№пR'HlйPm╓+ЭЙ(иїжж·┴╤tО},яБ■H9aщ@А6hЖю0ЬВ^╨┤ ┼ ╜╛"Cз╬3h_╕┌Z?:Б┬н*к¤Y6ЭщN┼З%п7Й@mк7ї\!Пв#jЖa"╫Bh╦╝оХ╦┼∙sУ;wз╔[RФW$LcЮ/PЬ(b"+Ы:Pmг▐МK┴\еyOўp║╥щєз╟▓БР ·_Ду$В┬ш╚─Є3╬║ёў╨t·я░▀76:└╢cбPH╓tЗf1Ъ╟h wЬиДo{u;Ёджж╫Z=h╣\■b(&(ОбK┼╝╫+q4г+*K0f;╬дшisгуfй■¤л┐ ╒╣Х▄ЛєlSЦ╦Щ▄{║fХ╥iК├ ТФСЙ\╤C▒И<]пT(╠Z║фk╪└^млыч┐√m▒▄Л(ПВйК╜MР:Ь─БX4хкнъ"EZ▓zї%Ч`╒&╞╨лю╛;_╠utw ]ОUk╚@ьр]╔[,V0╦Q}╓мX6лx}|йZВ ·Б(T*5 ·КЖ,╤4Y,ЦБV еd2ОЬ3╦К╟├7ко4-█шN┼^yхOG,|O╜Qх9H!╝╬Dо╝ф` ╠Ё┬EЯ>+е1КZї╚o_H6p╣╡ А┬▒юдt▐щg\║ьjЯ╧╟(jЗДЎэql¤M 5лuHШш Фы /dЖ┴▓┘TУ ZaХp▄ж 1xk┤╟РЙГ/Д >ШкvvwООgАмБу%QXЦ┬кфщ╝T╚Д┴·5-PБp`dd ▐ъ°rйt¤ч>{┴=ў┤ъOТЇX&;зок█└в ┼2шh╓ZЄр З╘║∙=МЄ к╒$бn▐вГ╓ЖG\|ЄI@7╖гТ эьюЮєЇЪлЬ╫Ю; Х╓ш fеE┤7e^t▓╞1Kт┴АРOГъЯ;Nжд╚║ЙJ┘ж*7fuEuEiФє▒D▓P╙5иv└z)B╤аTгVе)┤ ║ шсТйф+п╝╓?w~kH@UХzWwjчо╜╛@и\оB╫MДsЕ2╦ЁJ│!r<├╥╒bиC<┘70фїЗM:X╔ч┘▓ї√KкИ╤ъCЧвоЫeЪ╩╪сї▓iу╞TM■Л╕S~|┤╓l▌╞ў √!Т!ЖЖт"ЯCБ╘КZТUТў`┤¤е+▌й╨гЙL╓ц╘·ЗX╧∙╜ЮPА╧e*,M▓E0ЇДRE;ЛС┴И.ПФ╔щa<в╠`5]y┴/ИZж,q,FZкi44Уц┼жbXюс╩░Р╩# гггТ?д╢7k╚MВBнЮ▓И╓╥Ц6SAf'╔Q┘bHЮо╘%ЖєєЬЧc▐°╙Ўо╬▐ЙLо^ўX╢(x┼сЙ▒гПЭ╜∙∙]cг▒X"фЧ╞Ж ┴# lй\#▄░5QР,█фX╛R-8 m9У╬vu╟є╣*Ь9т==╣╝2░o░▐▄l6╘0=>╤╙ЫЬЮHжт╒r╔▒LКвбю╜&(*с╢╜>ц&KbЙХыU_┤c4S40*B+gsЦоt$т ╣F1═Йао└╪└ырЧуОЭИИХЪUm(КОВь┴Чr Х┴-щfке╝╒&5∙q─HВ─═@╨366▒paЄхЧ;;║Q bи╓~Є╫bБнbrщ0v@Нcэ║ :б\.ў═ъА╩SЄЄpgО;nn.з У╔в╤░оЫЕB~v_bbвhhzWWb╧оБ@└WК"П'│ЕН&Лўю█┘▌7ўщg╖4БЬ=g█╨Е▒ОО╤н╫ш$Є;└HQ7id╠Qh▓█┐кя@?ЗЖ√Мg╣ЙЇ8G│╔x╝^нiЖN▓№■hj√MГА6ЖM▌▄Ъ╦8@█╙Ъ╬~:╪N :╫vCCRМж+э%qЙXddd8 хЄy╞├╤$уaДzо╩у Ё╧p88Ъ д┬╣ ▐#Щ&АOI═rшpc═╥Ко╦ ПGЬМ^J╙5╣ Meб ┼pEiВ▓VїР$)їJ╚чщьЭ|г\╩╖Cх*Жн[D l╘jMUїЗ∙b╬ч!q╦тHйQW╤QP)LЁЙж*УжБ╫ы~Ц;█ 5)\6UЖ |╝ж╢^o╜╟▓л╒║?RБЙ┌┼бtк║тїH╨уa|lв╗лKkj∙ЙL2ЮbiоФ/А╞Ь:h╖·TnБ6tj ║@Gэ┘▒c▐▄9╔ў╞О╤d з╕сёёd▓Г&ёЇё6КОFАM ЖЙ┬гК`Ы4I(jXЭ$Iууу@хб@О╧d2БPXQdI╦Хв╧а9ойh╣\.╒╤UоUБBщбK%уИn╩5┐:{▓O─ЇИ7р╡qн╓hX:┼▒PЮ{╢я>f▐┬t╛`xxNТкYф█0╒CG ╠x╝ЕB┴0▐ы Gb{ЎьБ╘жGЗА{y}B>ЫГ▓╥-м╘hJ╛РйЙ+f3PМ$M├ ┴ъsl╘э▀бi╕>ЮИ┌ЖnЫ4Юbфj-ПхЪ5Ы"P`бжJй&ГУ╦Z$.уVUСбz&2=сx╜T!9ЪаH╒4 Ж7н╓М<ю╥щЮ╬xеР7 -ХJUхf╛P ┼brS┼╚╔-o-:╪ZЄ╤┌T ·е╜Э])(yЖ└┴╝a1 x'Й3h▒Ъc╙<З╤xSSe]Н%hr░!г╒Нк┤╚+zk╒*├▓ vУ юb╘▌▌ &Ь,╦~┐lфеHQА┌BнАж Е`;╨ЦП$╒jЯGмU*в└9(юПГвS04╘Ъсц╠щЗъDУ$eйPйаэ▓В,e 2╒rtB",d3В└г=v└QLл х╞▒нЭ┼¤}┤и Й ФШнхi╩Пdи▓нл^Й3└ ╫Мо╛9█vьэьЭЭ+фБ▒kZSТ<иЖР═▌╗ўvttIju─■M$э╥n╒o1┬█k8с█╔═:4ЬJ╡ Jo╬Ь9█╢яДBНF3Л@1BЙЙвhШОЖ еr╣фў·Y} hGЁR░1<взQm╜K3hЬ╨uНдh╒2l╣-k╙Aм=YМ■б фwтИ╟╢ь3Н┬wk░ZпКЫ Йo6jР¤fгlsм╢ЛlрО@ысS▓`вФ+а[DЮЗК┴ hЪЕК╧ $═ ^ВИ$├┐╙VyHA╝├нЎс╡Ўч├═я_2┐ЇРМaщ┤@k═▓Ч┬╓<·лs>∙I▐╨6пv╒╩oу╗Fzz;_xi█╢]{╩Ъ╛}ў^'}пйщУt┴▓ ╦Aпg(╘▌Z╓]p▐ЬФ¤чСZ!ЎoM░ёwа■▐·Ll:|&Х╫~ыЎ└[&Я╨q<Ё{·п°4╫эїsnO+Yв=yБMЮ╖'}▀╠Мj├┌Cз╬tЫ{┌1>-╬pKв╗5BGв█0╩"&ў╡<>╪@╛нiQ_4ТЗ╡ЗE'╙?╜d|rs╧┤T╚╬T1N·ИЬЮ·щГ▐╢┤▀5┤╫R┤┐рЇo╜,йХр╓P\v{Ыд3∙YзU╚ Вщ%0U1жUб╖,MШ┌j╙69мVЯК╛╬┤69їEL┤W▓Eqf~√_√┌Ы╢█э ▀Z▀ЛЦ╓N+№@1N>р-П┤1ь└0|;GнQф╔ ╢¤L╡ыю[╧cэЕ3ез╜Тc┌SЙй6ї_дў/Di_:Щ|┌ХS╧Ъ~х┤zNL=╨■Я═╘╬█▌NьOiл┴╖Ўу┌нБї¤y┌ Z┐╔┬;K6э▐On9iЩ╠ф╘█ў?▀Ющ│╛╡;y╗QДФЁБЗ╠tr*╦╙5сTж4O╗йNmmv&?тБп╢▀є╠ УMO∙4Uf┐эМ╟Ыu(Ж╜╡┤Gь'Ї^■▀АЫ_╟┤f╠/XЫ`ХБс6-Ш|э█U┘иАv4`dх┌6GВ! svя▐╡Ё╚Еуг├$fўжТ ч╠Є░▄жч6\{э╡°у▌▌╔-[■╧]░`H║DД ╝Е╓м"шWвu;dN3\╕pс┬Е .\╝ ═ж9уyрd║оK█hhХJ∙(m- jфн=√Qлбmd~┐_W┬Tу▒╚╬Э;П=ЎXаvеR)Ч╦НММl┌┤ ╤┴▒|5Ўо]╖Юr▄q╟┴#АH╗tZ╦MЁ¤А╫0 IС╒"pс┬Е .\╕°[Fно╜▌O@╪№>▐▓▒Rйцў{-┤DН┌5dГeiЪ┬Je9сJ]│ EfhЄ┴<√ь│█#}╧? <Ё╚═Ы7#:80ЪюшИo┌Ї╝eYGqДЕ▄MС8▐▐ёЕ╖А╢[PД;4ш┬Е .\╕pё╫B╜б╬x╛х┬ ╜жЕНООIТ488hЪж ┘lvjU4┌∙╟0$Б√=╥°╪╚п¤ыgЮyf╦Ц-╤htїъ╒p╫╙O?Ншр╬╜Г╜╜=╧?П|/╔╢(e╡ZksA┤М║5:╪:▀┌tр┬Е .\╕pст╨г^o╠xЮу8`Д mxЪHчА▐m▐╝╣э'╡ггd>Яящщi6ЫхrЩ┬1Б╟╝хЦ[А&┬]└ iЪ^╗v-вГщt6 п_╗┴╞мў}мН|уЪб·<╚_Ъ ├,▄!HЪрЮ ё Ю @W║╥Хоtе+]щJW╛S)7Ъ3:ЪQd╡й╩▒Hx┌─XzЎЬYЫ7mQuЕgЕ║\Г3Ч\vё▌?∙ЩхШя▀▀э┘│ 9ж З№q э╔т▀ ■ўв(N╥┴╤сСX"·▄ЖM8Йwь√qфўБ4,▌╘нщtРbHxHфЪр▌Ў▄эJW║╥Хоtе+]∙╖ kХ·МчГБ░в╩<'b╕╜{чЮ■ys╓>╗╬┤ ЦцА┼}■s_РХ\∙шпi╘фю▐фK▀╢Я}Ў┘╗я╛{√ЎэВ l┌┤╔яў╖ ">8░╖з╖ў┼^0 cю▄╣ 9Оc╣Y▐Gср╗z5AжiвшСжйккАBЇ░pY│┘$)фАf▌║u╦Ц-kПn▐╝╣Vлm┘▓╤┴сбБT* ~[┤hQ{Cq√║6ж╓$)j╞4╣pс┬Е .\╕°ЛгZй╠x╪Z╣\юъюЖуїы╓m▄╕╪^>Я■зы:M╙pP,=P8YЦ╣aFў├■░P(└]п╛·j╜^ю╣ч\:ш┬Е .\╕pq°тэшав(ёD┬ц╟0¤sцМПП+К ·Б╢U*Uрq==]pREM╙А╓ъh▓╕ппo▀╛}pM│┘\┐~=╧єУk]:ш┬Е .\╕pqxтэш`;B7p6╔уynу╞Y│f[>ЩL╩▓\*ХЙ╨╛v╚uКfБ╦m▄╕ё│Я¤,№ ╟№ул╒ъЖ ни$├ГCйО─жч╢8Ш╡шиc@8r2╚ЫC8("I╤╟ $MLЭwе+]щJW║╥Хоtх!Х╒rm╞є/╒ъХP(кк▓оЩ╧0 _лХ%╤KP8\cY║cу└▀L├жh┌┴Ьr╣№Ё├/^╝╕рn═Ъ5╤htr+╔╨╨H*Х╪┤iЛуXЛТ (РSQ,с╟IК"8Nа▐I№u.\╕pс┬Е  T*╡#Мы║щєyhЪ%ьхЧ_Э7п╟О]к┌Ф$яЯ■Ї ├pЭЭйj╡НЖy^▄╖oO{[╔╞Нп╝Є╩Ў$ЁC='_xсЕI:ШLе6o┌d;╬╤ЛБ$ фФ╧8&Z|РGУ┼─срГ╟Хоtе+]щJW║ЄoAV+╡╧7c9NSUп╧380╘█╫│eє╓J╡*ЁbсСХZYрDТ&,├&А┤хШ└BсE%б╔├aр╘Хоtе+]щJW║ЄoAЦKХгТC├I╠╨╠`(P,ФрxчЎ]║й═▌И%Оу$Iо]╗v╩ їSO=%┬ъ╒лWмXБя┘│зггc¤·їp╤▒╟ Твиz╜╬▓,a╖╟pЖr═╕pс┬Е .\№╡PнVg<╧qЬ,╦┴`░P(ь▌╗w╦Ц-Ъж╒▐&Д а┘l&ЙJеr╫]w┴3с`ы╓н>Яo├Ж KЧ.┼GFF:;;_zщ%xш╝yєА'ч+Ч╦╚╦ IЧl╙┴vЬ:└tЧД.\╕pс┬Е .Н╞МчEI&УжimkУ4]╫БэЫёz╕lъQ∙|>я▐╜{bbшрЄх╦q`Ф▒XьН7▐А▀$Iц╟▓,\jY▐┬дZ0 уe╪Е .\╕pс┬┼tЫёЯRМ╚Р└ЗzПD"pЫф┴E└u]╟▐L■▐ОЩ║pс┬Е .\╕8tx╗a8рsЦey<Юz╜▐Ю╬=╚ В╨^_H░╛p8<>>■ ═чwд endstream endobj 8 0 obj 116976 endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000382 00000 n 0000117646 00000 n 0000000323 00000 n 0000000186 00000 n 0000000015 00000 n 0000000139 00000 n 0000000430 00000 n 0000117624 00000 n 0000000157 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R >> startxref 117701 %%EOF ess/doc/ess-intro-graphs.bib0000664000175000017500000003216112423756516014372 0ustar eddedd @InCollection{claer:1997, author = {Matthias Schwab and Martin Karrenbach and Jon Claerbout}, title = {Making Scientific Computitations Reproducible}, booktitle = {Stanford Exploration Porject, Report 92}, OPTcrossref = {}, OPTkey = {}, pages = {317--335}, OPTpublisher = {}, year = {1997}, OPTeditor = {}, volume = {92}, OPTnumber = {}, OPTseries = {}, OPTtype = {}, OPTchapter = {}, OPTaddress = {}, OPTedition = {}, month = {November 12}, OPTnote = {}, OPTannote = {} } @InProceedings{heiberger:dsc:2001, author = {Richard M. Heiberger}, title = {Emacs {S}peaks {S}tatistics: One Interface --- Many Programs}, booktitle = {Proceedings of the 2nd International Workshop on Distributed Statistical Computing (DSC 2001)}, OPTcrossref = {}, OPTkey = {}, OPTpages = {}, year = {2001}, editor = {Kurt Hornik and Friedrich Leisch}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTmonth = {}, organization = {Technische Universit{\"a}t Wien, Vienna, Austria}, OPTpublisher = {}, note = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC.html}, ISSN 1609-395X}, OPTannote = {} } @InProceedings{rossini:dsc:2001, author = {A.J. Rossini}, title = {Literate Statistical Practice}, booktitle = {Proceedings of the 2nd International Workshop on Distributed Statistical Computing (DSC 2001)}, OPTcrossref = {}, OPTkey = {}, OPTpages = {}, year = {2001}, editor = {Kurt Hornik and Friedrich Leisch}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTmonth = {}, organization = {Technische Universit{\"a}t Wien, Vienna, Austria}, OPTpublisher = {}, note = {\url{http://www.ci.tuwien.ac.at/Conferences/DSC.html}, ISSN 1609-395X}, OPTannote = {} } @article{vell:prat:1989, Author = {Velleman, Paul F. and Pratt, Paul}, Title = {A Graphical Interface for Data Analysis}, Year = 1989, Journal = {Journal of Statistical Computation and Simulation}, Volume = 32, Pages = {223--228}, Keywords = {Exploratory data analysis} } %% --- WinBUGS --- @TechReport{SpieThomBest:1999, author = {D.J. Spiegelhalter and A. Thomas and N.G. Best}, title = {WinBUGS Version 1.2 User Manual}, institution = {MRC Biostatistics Unit}, year = {1999}, OPTkey = {}, OPTtype = {}, OPTnumber = {}, OPTaddress = {}, OPTmonth = {}, OPTnote = {}, annote = {WinBUGS cite.} } %%--- Emacs books : -------- @Book{RMS:2000, author = {Richard M. Stallman}, ALTeditor = {}, title = {GNU Emacs Manual, for Version 20.7}, publisher = {Free Software Foundation}, year = {2000}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, edition = {13th}, OPTmonth = {}, OPTnote = {}, annote = {ISBN: 1-882114-07-8} } %%--- Lisp books : -------- @Book{RChassell1999, author = {Robert Chassell}, ALTeditor = {}, title = {Programming in Emacs Lisp: An Introduction}, publisher = {Free Software Foundation, \url{ftp://alpha.gnu.org/gnu/emacs-lisp-intro-2.00.tar.gz}}, year = {1999}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, edition = {2nd}, OPTmonth = {}, OPTnote = {}, annote = {ISBN: 1-882114-42-6} } @Book{PGraham:1996, author = {Paul Graham}, ALTeditor = {}, title = {ANSI Common Lisp}, publisher = {Prentice Hall}, year = {1996}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, annote = {Great Lisp book for learning} } %%--- The 3 S books : -------- @Book{BecRCW88, author = {Richard A. Becker and John M. Chambers and Allan R. Wilks}, title = {The S Language; A Programming Environment for Data Analysis and Graphics}, publisher = {Wadsworth \& Brooks/Cole}, address = {Pacific Grove}, year = 1988 } @Book{ChaJH92, author = {John M. Chambers and Trevor J. Hastie}, title = {Statistical Models in S}, publisher = {Wadsworth \& Brooks/Cole}, year = 1992 } @Book{ChaJ98, author = {John M. Chambers}, title = {Programming with Data; A Guide to the S Language}, publisher = {Springer-Verlag, New York}, year = 1998 } %%--------- Other books : ---------------- @book{Tier90, author = "Tierney, Luke", title = "Lisp-Stat: An Object-Oriented Environment for Statistical Computing and Dynamic Graphics", publisher = "John Wiley \& Sons", year = 1990, address = "New York" } @Book{Cook:Weisberg:1999, author = {R. Dennis Cook and Sanford Weisberg}, ALTeditor = {}, title = {Applied Regression Including Computing and Graphics}, publisher = {John Wiley \& Sons}, year = {1999}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTedition = {1}, month = {August}, OPTnote = {}, OPTannote = {ISBN 0-471-31711-X} } %% Literate Programming and Tools @Book{Knuth:1992, author = {Donald E. Knuth}, ALTeditor = {}, title = {Literate Programming}, publisher = {Center for the Study of Language and Information}, year = {1992}, OPTkey = {}, OPTvolume = {}, number = {27}, series = {CSLI Lecture Notes}, OPTaddress = {}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {Primary citation for literate programming} } @Article{NRamsey:1994, author = {Norman Ramsey}, title = {Literate programming simplified}, journal = {IEEE Software}, year = {1994}, OPTkey = {}, volume = {11}, number = {5}, pages = {97--105}, month = {September}, OPTnote = {}, OPTannote = {Primary Noweb citation} } %%-------------- Web Citations ------------- %%-------------- Articles, Reports --------------- @article{youn:lubi:1995, Author = {Young, Forrest W. and Lubinsky, David J.}, Title = {Guiding Data Analysts With Visual Statistical Strategies (Disc: P251--260)}, Year = 1995, Journal = {Journal of Computational and Graphical Statistics}, Volume = 4, Pages = {229--250}, Keywords = {Graphics; Software; [Artificial intelligence]; [Cognitive science]; [Hypertext]; [Lisp-Stat]; [Program visualization]; [Statistical system design]; [ViSta]; [Visual programming]} } @inproceedings{youn:fald:mcfa:1992, Author = {Young, Forrest W. and Faldowski, Richard A. and McFarlane, Mary M.}, Title = {{ViSta}: {A} Visual Statistics Research and Development Testbed}, Year = 1992, Booktitle = {Computing Science and Statistics. Proceedings of the 24rd Symposium on the Interface}, Publisher = {Interface Foundation of North America (Fairfax Station, VA)}, Pages = {224--233}, Keywords = {Graphics; Software} } @article{ihak:gent:1996, Author = {Ihaka, Ross and Gentleman, Robert}, Title = {R: {A} Language for Data Analysis and Graphics}, Year = 1996, Journal = {Journal of Computational and Graphical Statistics}, Volume = 5, Pages = {299--314}, Keywords = {Computer language; Statistical computing} } @TechReport{ross:lunt:2001, author = {Rossini, A.J. and Lunt, Mark}, title = {Literate Statistical Analysis}, institution = {University of Washington, Biostatistics}, year = 2001 } %% --- Omegahat @Article{DTLang:2000, author = {Duncan {Temple Lang}}, title = {The Omegahat Environment: New Possibilities for Statistical Computing}, journal = {Journal of Computational and Graphical Statistics}, year = {2000}, OPTkey = {}, volume = {9}, number = {3}, OPTpages = {}, month = {September}, OPTnote = {}, annote = {primary citation for Omegahat} } %% --- Stata %% StataCorp. 1999. Stata Statistical Software: Release 6.0. College %% Station, TX: Stata Corporation. @Misc{Stata:6.0, OPTkey = {}, author = {StataCorp}, title = {Stata Statistical Software: Release 6.0}, OPThowpublished = {}, OPTmonth = {}, year = {1999}, note = {College Station, TX: Stata Corporation}, OPTannote = {primary citation for Stata} } @Misc{Stata:7.0, OPTkey = {}, author = {StataCorp}, title = {Stata Statistical Software: Release 7.0}, OPThowpublished = {}, OPTmonth = {}, year = {2000}, note = {College Station, TX: Stata Corporation}, OPTannote = {primary citation for Stata} } %% --- SAS @Misc{SAS:8, OPTkey = {}, author = {{SAS Institute Inc.}}, title = {\textsc{SAS}$^{\mbox{\scriptsize{\textregistered}}}$ Software Version 8}, OPThowpublished = {}, OPTmonth = {}, year = {1999}, note = {Cary, NC, USA: SAS Institute Inc.}, OPTannote = {primary citation for SAS} } %% --- BUGS --- @Book{BUGS, author = {{MRC Biostatistics Unit}}, title = {Bayesian Inference Using {G}ibbs Sampling (BUGS)}, year = {1996--2001}, publisher = {\url{http://www.mrc-bsu.cam.ac.uk/bugs/welcome.shtml}}, annote = {primary cite for BUGS} } %% --- XEmacs --- @Book{XEmacs, author = {{The XEmacs Project}}, title = {XEmacs 21}, year = {2001}, publisher = {\url{http://www.xemacs.org}}, annote = {primary cite for XEmacs} } %% --- GNU Emacs --- @Book{GNU-Emacs, author = {{Free Software Foundation}}, title = {Emacs 21}, year = {2001}, publisher = {\url{http://www.gnu.org/software/emacs/emacs.html}}, annote = {primary cite for GNU Emacs} } %% --- S-PLUS @Misc{Splus, OPTkey = {}, author = {{Insightful Corp.}}, title = {S-{P}LUS Statistical Software: Release 6.0}, OPThowpublished = {}, OPTmonth = {}, year = {2001}, note = {Seattle, WA: MathSoft}, OPTannote = {primary citation for S-PLUS} } %% --- R @Misc{R, author = {{R Development Core Team}}, title = {R 1.6.0}, month = {October}, year = 2002, url = {http://www.R-project.org/}, } %% --- ESS @Book{ESS, author = {A.J. Rossini and Martin M{\"a}chler and Kurt Hornik and Richard M. Heiberger and Rodney A. Sparapani}, title = {{ESS (Emacs Speaks Statistics)}}, year = {2002}, publisher = {\url{http://www.analytics.washington.edu/downloads/ess/}}, note = {This is the url for downloading the current release of ESS.} } @Misc{SASMODE, OPTkey = {}, author = {Tom Cook}, title = {{SAS} mode for {Emacs}}, OPThowpublished = {}, OPTmonth = {}, year = {1995}, note = {\url{ftp://ftp.biostat.wisc.edu/pub/cook/sas-mode/sas.tar.gz}}, OPTannote = {primary citation for SAS mode} } @TechReport{RMHHS:2001, author = {A.J. Rossini and Martin M{\"a}chler and Kurt Hornik and Richard M. Heiberger and Rodney A. Sparapani}, title = {Emacs {S}peaks {S}tatistics: A Universal Interface for Statistical Analysis}, institution = {University of Washington Biostatistics}, year = {2001}, OPTkey = {}, OPTtype = {}, number = {173}, OPTaddress = {}, OPTmonth = {}, note = {\url{http://www.bepress.com/cgi/viewcontent.cgi?article=1002&context=uwbiostat}}, OPTannote = {Technical report describing ESS} } @Comment @Misc{RMHHS:2001, @Comment OPTkey = {}, @Comment author = {A.J. Rossini and Martin M{\"a}chler and Kurt @Comment Hornik and Richard M. Heiberger and Rodney A. Sparapani}, @Comment title = {Emacs {S}peaks {S}tatistics: A Universal Interface for @Comment Statistical Analysis}, @Comment howpublished = {University of Washington Biostatistics Technical Report \#164}, @Comment OPTmonth = {}, @Comment year = {2001}, @Comment note = {\url{http://software.biostat.washington.edu/statsoft/ess/ess-techrep.pdf}}, @Comment OPTannote = {Technical report describing ESS} @Comment } @Misc{heiberger:philasugi:2001, OPTkey = {}, author = {Richard M. Heiberger}, title = {{ESS (Emacs Speaks Statistics)} as a User Interface to {SAS}}, OPThowpublished = {}, OPTmonth = {}, year = {2001}, howpublished = {\url{http://philasug.org/Heiberger/ESS.htm}}, note = {Presentation to Philadelphia SAS User's Group, November 12, 2001} } ess/doc/README.SPLUS4COMMAND0000664000175000017500000000431612423756516013360 0ustar eddeddI finally got the S-Plus 4.x Commands window to appear in the *S+4* buffer. http://astro.ocis.temple.edu/~rmh/essd-sp4com.el There are four functions in the file essd-sp4com.el. 1. The primary user command is `M-x S+4-command'. This starts up the S-Plus GUI and sinks the output from the Commands window to the *S+4* buffer. The user then enters commands in the buffer myfile.s, sends them to S-Plus with C-c C-n and reads S output in the *S+4* buffer. `S+4-command' works by using the file S-transcript.st in the current directory as a communication file. S-Plus sinks its output to that file. *S+4* uses 'tail -f' to read the file. The author of tail was very clever. The ls or dir of the file S-transcript.st shows it to have 0 bytes. Windows does not place a positive byte count on it until after the file is closed by the process writing to it. tail sneaks around the back and manages to read the file contents from the cache where it lives before the file is closed. 2. The second user command is `M-x S+4-tail'. S+4-command calls S+4-tail, so the user may not need to call it directly. S+4-tail asks the user for permission to delete the previous instance of S-transcript.st. You must say yes to continue. Should you say no, you will be given the opportunity to rename the file and then continue by re-issuing the command `M-x S+4-tail'. The internal functions are: 3. `ess-mark-pop-up' is based on `dired-mark-pop-up'. It is used to query you about deleting the file. 4.`S+4-command-startup' is almost identical to `S+4'. The only real difference is that it starts S-Plus with the "&" and `S+4' does not use the "&". ;;; The advantages: ;;; * S text output is in an emacs buffer and therefore searchable ;;; using emacs commands. ;;; * All GUI graphics and buttons are accessible. ;;; ;;; The characteristics of this version of the ESS interface: ;;; * We can't type in the *S+4* buffer. ;;; * Prompts do NOT appear in the *S+4* buffer. ;;; * All error messages appear only in the S-Plus Commands window, ;;; NOT in the *S+4* buffer. ;;; * We can type in the S-Plus Commands window, but no results ;;; appear there, all results appear in the *S+4* buffer. ;;; * Echoed input is reformatted by S-Plus. ess/doc/README.elsewhere0000664000175000017500000000201712423756516013346 0ustar eddedd-*- text -*- ($Revision: 1.1 $) ESS: Running an ESS Subprocess which is ELSEWHERE. ================================================== M-x ESS-elsewhere will prompt you for the language you'd like to run. You need to provide it _EXPLICITLY_ (at least until we figure out a good completion mechanism, sigh...). No extraneous spaces, no extraneous whatever. Type it exactly. Now, since the prompt is "wrong", you need to switch to the correct buffer; there might be a "time-out" by the process waiting for a correct prompt. The correct prompt will never appear. I promise. Unless you've got a weird setup. Now, you need to switch to the correct buffer. This would be *R...*, or *S...*, or *Stata...*, etc, depending on the language. Use: C-x C-b to switch. Now you should see a Bourne (or Bash) shell prompt (...$). Log in to the machine you want, and start up the corresponding process, i.e. telnet my-machine-with-R.com (log in). R and then you are off and running. It'll be cleaned up. I promise. ess/doc/ess-defs.texi0000664000175000017500000000117012423756516013107 0ustar eddedd@c keep all doc macros here @macro wkbd{ARG} @w{@kbd{\ARG\}} @end macro @macro wcode{ARG} @w{@code{\ARG\}} @end macro @macro wsamp{ARG} @w{@samp{\ARG\}} @end macro @macro ESS{ARG} @acronym{ESS\ARG\} @end macro @macro iESS{ARG} @w{i@ESS{\ARG\}} @end macro @macro ESSVER @include ../VERSION @end macro @macro R{} R @end macro @macro Sl{} S @end macro @macro SPLUS{} @sc{S-Plus} @end macro @macro SAS{ARG} @w{@acronym{SAS\ARG\}} @end macro @macro UNIX{} @acronym{UNIX} @end macro @macro PC @acronym{PC} @end macro @macro MS @acronym{MS} @end macro @macro initfile{} @file{~/.emacs} or @file{~/.xemacs/init.el} @end macro ess/doc/ess-intro.pdf0000664000175000017500000023643612423756516013140 0ustar eddedd%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Introduction) endobj 9 0 obj << /S /GoTo /D (section.2) >> endobj 12 0 obj (Emacs) endobj 13 0 obj << /S /GoTo /D (section.3) >> endobj 16 0 obj (ESS extends Emacs) endobj 17 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 20 0 obj (Features and capabilities) endobj 21 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 24 0 obj (Interactive Processing.) endobj 25 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 28 0 obj (Batch File Processing.) endobj 29 0 obj << /S /GoTo /D (section.4) >> endobj 32 0 obj (History of ESS) endobj 33 0 obj << /S /GoTo /D (section.5) >> endobj 36 0 obj (Conclusion) endobj 37 0 obj << /S /GoTo /D (section.7.1) >> endobj 40 0 obj (References) endobj 41 0 obj << /S /GoTo /D (section.A) >> endobj 44 0 obj (Appendix: ESS Resources on the Internet) endobj 45 0 obj << /S /GoTo /D [46 0 R /Fit ] >> endobj 48 0 obj << /Length 2470 /Filter /FlateDecode >> stream x┌Н█vу╕э=_сG∙ЬШ#^$Q╙Ч╔╠╬vчv6'ЭЮюю#╙1Yr)z3┘п/@PО{█╛И$ nЇЎцт╒ПR╧x┼/f7ыЧК)Q═╩F)g7л_▓ў[╙ єЕ(Єl╣│цaЬ▄▄╕ўk^фяЧK°kВ\╤░▌╖┴-vн ы▐o/ч┐▌|Ь-d╔╩вЖQ0]ХСO┬3═Г╣╖pTъ╠u┴╢н╗╖] Аэц*╧~w╛я╢ Ре╔0КdZШ╬┤OГР'▌Ф│║И7UКu LЧ$└√╚Hфп¤0╕╬сB╒┘W╫lМ_╤╓ЧДЄУuw╓╧╣╬юн√Ugч╝╚ЮТ╪и6у═╬A╝{%Щфz╢9лПЬ┐\ЧD$U2-─,g9h Q~Е=R]╬╩Rс0nЩf╙в ▓иEЎ ∙я}HRЎ╛st}0k┼ъК╠,Y%╩ЩbФ╔ч╣<геп╦╡КЖRE▄L░`b╔єL└▒W<%ёу╒kй^чъ@J▒Zsb)XQшYI|╡sQА╫wЙgв(шЬт3═j┤ HPV,пA]`░\╨ЕпюЖрM\Ю▒y┼+Шh&*B╫ow√5─U╢є¤╜7█ныю югgIыэоў┴аwс▓Б╙}g╟e┐&ьaт■ўv░╞7ZЩnEh+╠"_Я(rЮ▌l╚-AR╔TC G╞\Л оО┬с╪┘╞ГёшYК'Ч°~Иў└щ╨я6ф¤┴ош( р\КоD╘дё╤ОьFHв╧│Gя┬БC│B┐╣н├уьf╝}>Г╩ПюB :Я*@╓ї!ншIZ╤/╥К>J+√бЛ юVv ╙xЬ-тъбк┴ЖfБ╧m ▒¤:▐а▒Дg├гЕ3╜╣P╪К╠ш;·Q.УЙ4╒▄MU<БiяИ╔@░G6Dby╡╝$╪rq¤∙v\|Mcт │╪√─lъv░~6hФо[Нтб─з╓╕э▄wаоrЭ}qНяQv└п╩ь█\вNV=цуРРH╪╛┌эZK╙/ж┴IХї;ы y┬Зз!╪-Ъ╖╘uR`┼Д°Ї╛Пt УўhЄВOШ┤▓+^8T╩v╤иZв)Ъ╣'И!╔nL┴Y[Ў~D =НР>м┘╢о│ ╛IУрrн+БмВ╤OжБЕАN║ЛИВвUрjр╘$дРxxъВ∙NєТГ еФтРIКчW-оZ╙▌яуЛЙ°.4╩╥√ЗДФ|.^╤ф8ОЁ,EIHй8║^эзч╨0hє╙ЫLtнJpxpп8/&^╩3  Гvo@ж 1>В*∙NbAкwё╜@Б-aRВ*│;PC8% Й8═>Y1Юш─Бц4Жp=MКЪ°╘щЁИ┼К#:R╙"(  нг╨╬╙t4 FГтu╢ь╖Цv╠QЙ┌DX5&╤╗│D▀я└$ CЁaF─wБ└фЬ%e╓╦32mKс}x√Тє╔1п!и'╚шA]9oЫ╨>╤▐|cЧVЙИc6╜жл oя╥AoГqщЭ5КК8Є╝╔at╔ё)ЦY█ўЛsўъVЛ╡╡-гJт█r╣еВ|^нTвnшЎ┤ Д╔$TpIA_ЁclЧ *╫aКа╠S╝|`Л№╕║@А]#(пDуl╫Pj* Г▒xйбxС▒xP-хP╗╒YпЎ OSMЩф\ X^kНe:B^eW)!@╥╟╫$├ b$ >.BКlЙхЦцXЧвИ┘╤╞"~п┬Нг@u2ХoЯ!╟Ль╛╬Э\p▒Ў"▄─ kd├│DЯO╚Ь╔Rд3"¤eд}Ж╛`u═юЄДT╔rYе▌Ы9Ё╝Ъ╦Ы3t (-хDN┼╧РуXзgш┼┘ Q(ы╦\_■-ЪюЎп╤yЩ¤╝Лй,╖ьў╛▒й%ЪUJ`══ъ╘{-'╧╩%9╘;LлЗvК`╖Ё>ё╠╙т├┤цИnvё■ц╒Х╧°моXUj░'TЭкЬ5█Л_№Є[>[]ф│П`и╡aЮ3^╫│э/┴ШZдu{▒╝°█Б╓"[Lи╜┼ЮRшY┌╙д>@M┬uYофi╖1ъYе╢ъw9щ╟ф┤У╨e┼ЗБ╧7zt|F(Uа√~ Й1f#<╙ШRL~░╨Уъ!!Цїы·ччы░к└вщ∙їёГ O╟gb╛1├В-ЇЙe0Ш|ь▌╚#К╕HE?▄VUqф5╡ЯcЮл│/v{Gщ╕╬LВСф"╧~ЇvEаЯЎЁЇ╣nИ\╥┴s╞уs┤z)Ў═╢y<я 9╝Z?[IтЁ╧eе>▓dU ∙иУ_> 2чт░s°уbRа╤МОК/oм5╨t╔п$╤5°Р╩/rS╚Аы0ь_жтУ├ыXк?s1uС$ ╤╡щT▄┬- ыu* uh∙g╖)╧▄ЖЮ└НщныZ0:tц└йў.q█Уэ┴%▒╚Л#█йфРКЫMчРlкt╬ъъРSъ йЦ°fУZл┐╧╦╕ьL\эЗрЭ9qT (╩c?¤■─╚Х▐x(аKЙm└┐ оXяя╧TИ+╕ВJзfZS├╟2э?╡O┘endstream endobj 46 0 obj << /Type /Page /Contents 48 0 R /Resources 47 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 61 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R ] >> endobj 61 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [362.023 187.81 512.26 196.465] /Subtype/Link/A<> >> endobj 64 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [479.009 173.115 514.476 182.269] /Subtype/Link/A<> >> endobj 65 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 158.918 165.714 168.072] /Subtype/Link/A<> >> endobj 66 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [285.516 144.722 397.496 153.875] /Subtype/Link/A<> >> endobj 67 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [352.459 131.127 512.26 139.678] /Subtype/Link/A<> >> endobj 68 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [274.623 99.598 430.14 111.285] /Subtype/Link/A<> >> endobj 49 0 obj << /D [46 0 R /XYZ 97.768 692.105 null] >> endobj 50 0 obj << /D [46 0 R /XYZ 97.768 667.198 null] >> endobj 47 0 obj << /Font << /F38 52 0 R /F27 55 0 R /F41 57 0 R /F28 60 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 2409 /Filter /FlateDecode >> stream x┌нXKУ█╕╛√W╠-T╒ИK|fO╢c;ЫЄь║мq╝й8И┬МРб3; >¤"EОd'З\Hа╤ht7НпёцЎ╒OяУ°*NBЭdW╖wWeцYqХеyиtzu╗√gп╓qE┴/M▀от"Ё╗бъЭoV ║¤█OяuqUЖeжqrt╡VEиТДц▌°о_нuQЁП╙╗оwХйЩ╓┌╬Ъ╢┌c/ H\й4xt╜│▌їjЭ(M Ж┌┤ї3O┌С├╙Ш·╣sЭHhvLо№с04░ъ(Т\│Jврqев└╫Пл8 ,╧ъ№┴Є┤;▀╨"4"╬├R+2┬▀┴pжQъqш]sо╓YR╖{ЬЧ)░-│ ▌╪r урnG`Юj╟ ~?t< X├рnЬ3ОО┬-°Ь<╘╓╫"ЕХRгlW╗▐аn<┌ї'W╧ ╥dPo║ЗМ╨y|▌;йаy─¤hzrSp№W{╙┬Ўа]╪%?cу╛5╟=я'v]ГЬ═GSёO╞`у@ёАнG╫ у<ЇЯo`щхкЖф╧s#╚╣гgaПUЪG█ю═<ОыжIHSX╡╡Lиp;ЬД fK')  ╜╟H|b╓из}&^T|╓╦▐wЬр`C к,x═Гмш╢╔┤ЗвЁУныїуЖfg█оўг"Е¤┤xМR┼█Юj^ВI[╗7╒П╬╖ПVжс╞▒їщПngЩЮ▀{╦уўл40ощx╨╔,{З╓Л"U9█T(сyХе╞}МqяdЭг9Rм╙▄╛┼м`eш▌┴T▌Е├┤9Zє@╙┴fМRщЛ╥ш▌f┐°D°ь╗╬5О ╢ч┐й├kn)╨Ўч%сMЧ∙╗■Й╝╬ЫП┌Vц^:O╖{бЯЬ$КИL#╩й^ЖУzaчh*хЁlыl ╠ j°╧O&H+░рЮ╬Ж v╙бIгЩB╤)ЙШ┌Їx·р\гRР═K╚┴s═└│└Ъ(r°cРP Еi@╙ш┐╘6QгEB┐зd,CK7Т_KstwЄ"c╔z[▀я┐│тb╤┤ї█ ╝ёцам^√уБ┤N%Uacgшй|mP@GьдЯL^Оd`Ж°н╩▀╨rи+╢Xkв╡NТoRЮ╓е0ъA╥вЦXШлqсШTOмR9^J▄йМ7l║.х*CN╠╚kzr74'Зв∙5╙╞]─)Й аWC█ВыЁкей├ёш[╩o╨уxДхЕyJi┬M ┌4ў┼╚∙щ└эЪкv╕eA╥рЗ#olїАB)ПЦ%ЯvУ╙н╕,КЯ╣∙vo[ЛПX╚rШєW╢┌Й╜T/╪O#Еф нSTЎcM▀Oи╜s─4:I├2-└┤с#Н ╛`ш└╝С7 ╙╝Dц╕uйоtX(╞NЯЩ'╓W╚KРgн┬·ы(T▒°%N╧▒TЗ ▓щ0Л╙╔┐4Э╗▀ўw_эpЛ├x║pє[▀╤eа&╚X,M╞A·g■С─╜y0▄ЭЖ?`╪ГiD 8,Г·y1∙/П ╝е[╖+╕┬н9Ь┤Qи ╚IКB№■Ъ╛|й pcQТ3│:S▒3шM7}щ══ыН╕▒L┬XйЕ┴╒╜ы╩RQ▌К1╩╤е╪бТlж√3EН1dnW:+┴HiЭ)зTШe┬Mj┴й5╕Н╫╝4°-Ънў;yьу┘кe&щ(ч ╘ }?]ЇGY╞┬{n@F·Т■чrЄ0NуЩю└ ш╚╢Н%ф А╟"╣┘г1S┘Qz 1 ╤[Иn▀t<°║нx┼╛ї■Б╖Jiи0ЄdС0%─┴╫Uч║нeдs═фq├╕'▄*°√*Ш║Б╚╞ТB╔Б°╟*Ж4ф╬Q▒$вxJD$nМcлр жн/6<И"n>┐х╬ч╗9╬╥Ч╞ї'9┘7Hку)yи▀yЎ№э@N"╨╢7ВЦ┘уx╚GFЄqЁRЁ5ПБCp?ЦT ВИ╚░Х9У wV╨=БА/M`'ш▒у h' ┐╝░єhАС/■s[╚МЕkХt─╚$Н╛s╤°ЭРЭvы┌5BЇ2D 45▐ДiDА╢Q╓▌╚ ш╖o╣Ъ¤>vта┬█2AГ[LsС╢╧L─S╡n╦ Л7`╠4q0╪Эы¤X ш8?MAш╞A╜+тТ █qПPD4!XZЖL$╡%╢X о╞*$Б]°U┐╛Аа°№й( 5ЦПй Л(УF^╜╗}їЧ╗l╗endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R ] >> endobj 74 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [195.661 536.174 249.469 547.118] /Subtype /Link /A << /S /GoTo /D (cite.ESS) >> >> endobj 75 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [252.489 536.174 274.406 547.118] /Subtype /Link /A << /S /GoTo /D (cite.ESS) >> >> endobj 76 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [152.528 446.511 205.456 458.213] /Subtype /Link /A << /S /GoTo /D (cite.BecRCW88) >> >> endobj 77 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [208.926 446.511 230.844 458.213] /Subtype /Link /A << /S /GoTo /D (cite.BecRCW88) >> >> endobj 78 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [234.593 446.511 322.767 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJH92) >> >> endobj 79 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [326.238 446.511 348.155 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJH92) >> >> endobj 80 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [351.904 446.511 394.295 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJ98) >> >> endobj 81 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [397.765 446.511 419.683 458.213] /Subtype /Link /A << /S /GoTo /D (cite.ChaJ98) >> >> endobj 85 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [473.739 446.511 514.476 458.213] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 86 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 428.578 121.18 440.28] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 87 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [125.584 428.578 147.502 440.28] /Subtype /Link /A << /S /GoTo /D (cite.Splus) >> >> endobj 88 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [187.734 428.578 277.765 440.28] /Subtype /Link /A << /S /GoTo /D (cite.ihak:gent:1996) >> >> endobj 89 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [282.168 428.578 304.086 440.28] /Subtype /Link /A << /S /GoTo /D (cite.ihak:gent:1996) >> >> endobj 90 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [308.768 428.578 423.755 440.28] /Subtype /Link /A << /S /GoTo /D (cite.R) >> >> endobj 91 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [428.158 428.578 450.076 440.28] /Subtype /Link /A << /S /GoTo /D (cite.R) >> >> endobj 92 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [494.212 428.578 514.476 440.28] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 93 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 410.645 148.692 421.589] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 94 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [151.249 410.645 173.166 421.589] /Subtype /Link /A << /S /GoTo /D (cite.SAS:8) >> >> endobj 95 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [211.727 410.645 253.57 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Stata:7.0) >> >> endobj 96 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [256.126 410.645 278.044 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Stata:7.0) >> >> endobj 97 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [338.363 410.645 370.841 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Tier90) >> >> endobj 98 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [373.397 410.645 395.315 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Tier90) >> >> endobj 99 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [490.894 410.645 514.476 421.589] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 100 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [96.772 392.712 153.252 403.656] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 101 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [156.652 392.712 178.57 403.656] /Subtype /Link /A << /S /GoTo /D (cite.Cook:Weisberg:1999) >> >> endobj 102 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [228.399 392.712 279.093 403.656] /Subtype /Link /A << /S /GoTo /D (cite.youn:fald:mcfa:1992) >> >> endobj 103 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [282.493 392.712 304.411 403.656] /Subtype /Link /A << /S /GoTo /D (cite.youn:fald:mcfa:1992) >> >> endobj 104 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [344.301 392.712 440.672 403.656] /Subtype /Link /A << /S /GoTo /D (cite.BUGS) >> >> endobj 105 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [444.072 392.712 490.896 403.656] /Subtype /Link /A << /S /GoTo /D (cite.BUGS) >> >> endobj 106 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [143.531 374.78 198.43 385.723] /Subtype /Link /A << /S /GoTo /D (cite.DTLang:2000) >> >> endobj 107 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [201.623 374.78 223.541 385.723] /Subtype /Link /A << /S /GoTo /D (cite.DTLang:2000) >> >> endobj 108 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [152.907 178.416 258.386 189.36] /Subtype /Link /A << /S /GoTo /D (cite.GNU-Emacs) >> >> endobj 109 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [261.223 178.416 283.141 189.36] /Subtype /Link /A << /S /GoTo /D (cite.GNU-Emacs) >> >> endobj 110 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [342.94 178.416 427.079 189.36] /Subtype /Link /A << /S /GoTo /D (cite.XEmacs) >> >> endobj 111 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [429.916 178.416 451.834 189.36] /Subtype /Link /A << /S /GoTo /D (cite.XEmacs) >> >> endobj 73 0 obj << /D [71 0 R /XYZ 97.768 692.105 null] >> endobj 6 0 obj << /D [71 0 R /XYZ 97.768 667.198 null] >> endobj 10 0 obj << /D [71 0 R /XYZ 97.768 288.354 null] >> endobj 70 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F13 84 0 R >> /ProcSet [ /PDF /Text ] >> endobj 130 0 obj << /Length 2454 /Filter /FlateDecode >> stream x┌ЕXMsЇ╢ ╛┐┐┬GэМ╜СDQ╗ЪЮЪLТI[O:S╖щL╙WтzKв*QvЬ__|Q╥┌█Ї$$AАА№·щ╦W▀┘]╡пJuўt╛л√Cy╝+їaЯ+}ў╘№+∙є.╫Й}?y36╗З╝PЙщЕxЇєdЩ№бц░▀¤√щO_}зОл└Lе√м║KI╘O█єЇo;SOL╛э▓41ЄуGўьz╙╢я°_$oг ╗, ╢┐GЖNъЛMь╕╦╙фсd&+║л├ХQкE│p▒и╓▌ГиЄРЎХ╩Iб╬Og╙╝вЭжпYр1щl╕xб¤Щ┐╡я└LPЎчeumзi┐{P`─7╛ы< Ў<╢╪Hы:85∙Л║┴fт~┴єў╧├ю2Э╝3c▓ Щ-ш5▌УйXа╚Вz┤&╕■48╢k┼_╚Э.~ ї&■=√СЙ┌ў╗"M^q╛эюЦФUЦ№╚<ЩЗ'─1i XЗ'Ж?НнMГGЮ)╥*ЪЛ .FИУEЗуlRъ╫`ёx█0M╞iEЯM{═pq╡iaТ>$oоo<·шН═╓Ї>█бNаГ:╔4╫" р√╧,[ВRяїбва<Ўе*ю╘╛╠8╚Я└ю▓▐yuР:_чгrДЁЛHж ├a`b╟]╧_#▀╕0m╤Aydр╨hoрyж┬┼aРп╬╤ЦU─E ╨SСiс8hY√╬$█T-hW ШбШаАгЦЦ╛яTы`; яEа[┴з"Ъ╞q▌эF╝Д\╕]╫╝ЕЇKпа┼~ дмEОс╧╔╘/є░ VAщ ЭEa▄ш (#ИЇ┴╓]╦═Зf0тkF{CнБ;ЬщЖu╫ +лнк*)DР╦╖йwс╞╢ №┼▌¤fySЮ┐*тp{)єр┌чЭцОG░fR╣Г╞╙вю8С{Сv▌UV|f8}°;■Br╙vй─v'█ИВ\░НNr╤I№З !л╞xB▄ф B┐nA┬╓ї▓ВD┴╤#,B┬B{ёjЫ 6ГмЛm█√iЕ¤e(м["·┐ь▓ ╦ТЛ╜0NаЎчPБ)N8`TgЩфъ г╥░е гBK|├░лрKнПЬА`pSР╞xД44э2Гу│[ВyYКu*╖кКч╤w╠Ф·Ш]wL8тч░╠зWд▒└. яЮ<Х╥ЬЛОAр# У╫╕╝gЯ╩√з▌ єWШ%╬k] lдЛЛ PMe╒ ╥∙0@заSЙ1ь╨}ў╠ФДBRъ[J5┐ Rъ╪Qcwe═X_"Ц╖Ў├>+╬Хd4\╪1╙■O╗їh~!ЇМО╔┴°G╫G▐гo!WнUv▄g·CkЕ j3ШУk)═YЪ\╙╥х ╧ўw"(ЗС╓ Ър╧Z┬ о▄╞ї╦рЎj┼Ю█(Qgымє▄╫╦%Rm^В°▀╔wyv╚У┐└MВЩ?з:╡-№Снмo.ЇА1Q"7лк ч╨}Wн╫\┼Ш_├▓gZъТС╟╖lЕВ╝═Ю▀Пцb║UvЙ▓ў7"1jн∙HvtС┴}ЦВаX┴(╜Е|э;OCo( (╕ JЪT╫EБ╔ОQJюЇН}┤N╖рЙ]╬ д▌сJ┌Ыє√РWТ▀└уg6u}┼Б%д&q4Ёh√*]ОY+*сЙЕ°ю┴,о7)l╘PgVфыУ┼▒·А0o)═їMФ╕р3`'5~s+ZrS]=rS╢▄я╜▄PlVьлв╕Т╙ щ*╜▐╒▌SS╨с'▐╝>а,Є{ЭщцД ╩<╝`LQг╪lкїyшы#0╢o:>ъ"▒>?pn~╢bУ┼JЧРА┌Л.a5р?ШщEцHНR№0ЗЬечZО1VUkoВCЭqнЁу6зQ^┘ЦI╥{ЧхрGnRT M ╛ЕPя Ы√■V_▄E eз0%MвbxЗыр╟v╟╬qЭс╧єfF\■бuг┘!>д/╧╝9╜╜Р╬╟╘╫(┴┘|e/ЄП║18Ж╕#wд▄┘┤н{цС▀kЩK╚ii╝╦t█]ФKwQfь╣Т║ n-ф?v{.┴QyXХ/S9й2]¤^n╙иМ═к"w а┴╢М^к°оTR═ASЄTяUйбк}z${|∙Ўщ╦%g╤endstream endobj 129 0 obj << /Type /Page /Contents 130 0 R /Resources 128 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 135 0 R 136 0 R 137 0 R 138 0 R ] >> endobj 135 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [265.152 230.421 300.907 241.365] /Subtype /Link /A << /S /GoTo /D (cite.RChassell1999) >> >> endobj 136 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [305.118 230.421 327.036 241.365] /Subtype /Link /A << /S /GoTo /D (cite.RChassell1999) >> >> endobj 137 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [448.456 230.421 482.538 241.365] /Subtype /Link /A << /S /GoTo /D (cite.PGraham:1996) >> >> endobj 138 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [486.75 230.421 508.668 241.365] /Subtype /Link /A << /S /GoTo /D (cite.PGraham:1996) >> >> endobj 131 0 obj << /D [129 0 R /XYZ 97.768 692.105 null] >> endobj 132 0 obj << /D [129 0 R /XYZ 97.768 667.198 null] >> endobj 133 0 obj << /D [129 0 R /XYZ 97.768 479.113 null] >> endobj 134 0 obj << /D [129 0 R /XYZ 97.768 267.283 null] >> endobj 128 0 obj << /Font << /F41 57 0 R /F38 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 143 0 obj << /Length 2684 /Filter /FlateDecode >> stream x┌НYKПу╕╛╧пш[dан╒√Б=M3HВLщF░└flЩ╢╣-KО$wOч╫члeyьЩ═┼"Лd▒Xм╟WЇЯЯ>№Ї9нюъ░.╥╗зэ]]ЖeQ▌y&i~ў┤∙5ШЎv╡N╥(°w%-╖у`z?*╡фkWq|Эl7║╛╗'Z╕╨Жлueg&═▐ жЩь0J▀LЄ╒ q`╗Н2▐^М\ю▀ЩГї├Ю┼╢o█~Хф┴Ы▓ЦйG;╕^y╢юeУм┐=¤эз╧Y~Wср<-Л0╔▓╗H╬№uТ)K▌─E√ ў╫▓░J№Ёx╜:╤єЛY;╨▄Уu%a^Uwы╕ ы4nf№▒4дфд >}5ЗckI│yЇл8╪Js┌;%╛8VoЮЛzA9Ш▀∙ й 5сдcЖZК╦8,J▌ї╙уупП┐]KЦТ& Эd░▀5ЫgKЧl>▐bФеaФ╓ч3ТX_╝╕9Йы╧zъ6░и╔°├!Л┼№i kЁnЭTIXD^╜йиў╜Ы╠Wмиг@8Tu░╠с`Жoи░┼┴n√┴ ¤8Їdїпnce▄uУm[╖│▌д+htВGМ╥O═^GFYbNS0УkДМ√▒н1┤ъg\,ь╡3л$┬6╗ОFt>Ltq ╫БACn"╓e"W ╥┘ч╚Є╩Ууn|┐u┤еї▌т█оЩ√G,З>О{!┴Ў╘5,o│▒дglK╟╘в1 ═╬О?╙QUЇ·┘Мvsу█╛Ы▒jМ2╧╜ъ╤h·╢▄╜ZТм>ПёЭ@ЙУыvBС=╕щ9с▓°Rэ╠░[e╨*▌ L┬З,UЬЕ5"┴╥┐╕Ом.M+ou╘╝╕~"4=∙▀▄ Ї9╝ u┤├лk№"ЙWЧ-Є5iПнk╠sы√═╨П║PuЦСЧв#!▐┼╛/d╡╝ь∙YЎ╘╩,Мгф┬Б}Кїгс:╕х$▒аВ,!{А╨ЬЖk@т▄Z∙аiRЄyQ'4{8╡f▓>▌jCпЖ▌У г¤╧Й#лж-ШJи ╧:╟t╜ъЗ°n▄фў╒▄AS╞ы ║4РWw1D└v ─Х┴_I№,╠f├сЫ\!Uл╨ФCвAqВ╛g▒╤!gд/`aщHF у█iш[э1╫°дH╗w╩ырcпёj╕▒тmяuu9╒Єьz╟HЫ╓ э╗┤гу╙jZ╤└JmF °DlТТ ар°м>(▐ТG▓╔?ьдYЇЕrt<ЮО╟~Ш┬k╜WeШ%▒wD cXqс╨Я(gШnD║e№└sЛях;╪COжFэYvЭ# I┤пф╙Эх┼▌gu 7wXиы╓t~JKмZ|й[1m└╪АВгWgхd<рK&ы█r│Д{┴░` |Ь).b;!4$]D"AaЛ┌╤t╙L|п х╢╥_Ш.иov╨Е╝AЭА<─╞Ъю^ZM№aйsуБхLСDi<├:е█d▐NФG7└.rrT$3▐┘їv:▐@╗9Z?D═eШFs@ №x├├kьдNЬЖHфщ┴bщшЕdИDqjЇ▀`9ўr▐ бУX?>oйjЫг*g╨э╞¤B5jnKЩ▀Кк░М/нMНЖЄбk ЕВЗ╒Й┼█▒Ч╓Б*Я╬╟═ щГP╛01БЖ$СUЮ├йыf$щ<∙М{|┼Ш$▌iKтm) j║°Г└ёЙ"-3пиb╙Вy╝7ъdQG}щ╟I╓\РкЄ╒Il·ц─рSс3HУ_FЩЖ╙П╬3aPГп=KS═iФD┬8АmИFШ ▀УJ╡╝&╜ГJ╛╢█п(м7Т_+═m,Г▀ф$б╕Gш@N╡ю╧Д╞`Ы~'╡Ец▓└·hч┘ Цp6]:W9╘- [¤qpЪж+╔\Ї╝єM╜TsV-q^VКYА Ыч\Zk.н.si5█*НИЙв5J▓P·╢oйЁ╞NўR╪Їз %ЩяУ·wг65WBе} Вїe╝┐!╝!McпЇХД╔MDLД}╢!╨╠-d_{╥▄┴зц┘Cв-╣MЯL7╤ЦcxА│у╠K├0н╪Z3Эц▒єО■Ждз^H[_b╜┼]j└i=C*Ш=иЎ№@їЬОы┼┼БшЭD&╔o-╕▐┬А│▐╟╔·Э<ш╩%╙`°я│зa]fМвє д╕Л├!Ь─¤xjЗ9fєФ'>eЖ[в` Б╗$>(╣B9S╣ЯB'%√$╠jz ▓ZЁX№╞┴№ж 1╧┴: У├▀ЛW°Gиc~ГКу№┬в~с ╛Ёя ╓1r╞тйЖ#E╞jK&O+TmиЙ^╘╧S¤HИгt─!S ╡┘╒3q~¤C√`6┌Т└╩йЭ▄╤П8aЗЧ#в<Р> endobj 147 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [177.235 104.892 184.209 115.836] /Subtype /Link /A << /S /GoTo /D (figure.1) >> >> endobj 144 0 obj << /D [142 0 R /XYZ 97.768 692.105 null] >> endobj 145 0 obj << /D [142 0 R /XYZ 97.768 443.248 null] >> endobj 146 0 obj << /D [142 0 R /XYZ 97.768 356.947 null] >> endobj 141 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 151 0 obj << /Length 2274 /Filter /FlateDecode >> stream x┌uXKУ█6╛√W╠-Te─с[dnО╦▐r*╔ж8╕iє╣O╠r╖p╨ i╖}╧∙^╗ vNBnэw╕ю░╪╩ф█╬П▌Ыкm (Q6oSЄ∙█єВZ╗мъ~ЦоЙd╒"n(╡ LзєК╬х2y}aь>зTГL.Х╣и!/eжz╦вм╬eН┐A[ц0йьРO▐6Cп ▒кЪєDл█~╟О+&Г~)LЦР╔░ю·Yc╧F╛╡kАQz░{Je╒╜иЖlЇjХo█┌.Ь НнF`Ю&?┌;eэВ,rо╒P╩ИэDГ╔=║╫Ш\б╙]щ+ж╖D6єzU7C╒╧ЬzЭm_iуюЎQ8 "#k╗5o/╟к╤┼w5щ─4ЗкоЖWЩ╪n!J.3╟┤cЯы}▐ф│0Я┤╡]}5Г╛щoXЙuqЩ║UЯ┬&М╕мсQАw_ ▄э}╧Cэ~ЦуЪn\XоўЫВш╒`ЦX<п5Г B!Аr╣МР?9│с+ v\√)'БJN&тTёДjЩYМВ р*-ўз ЄPРsФj9]ь▄ье╘ц;9┘ иЩгўА ПTPdHz▄шrC(_%ЯE]BMнЪєИ╢H╓~В╨и╫ +)╗ЫгР╤UїВ╓╚Я·&В 7+бєi6=╘>pўfnР╢╫°'n8_░┘y┴╨з!я∙ я╖~ nOн╫9(є┴Хя╧#Ъ]yr7Й╖8Ч┬ u%И_К&%╟┌Ю[ФьїVцKlз@л▓╢┼3╤<Ую8&УВ`MКСЇ┌─ce\f0 ВW║^ЛoHФЦ╢╪н_фж0ЬmЄю3?О▀єчQ┌·ч[W°nфO]▀╦Y°¤зьшЎ¤ч╣Й,M"Х╒щ%ё'╦√їЮИC0їЯЯ┘л╧№ П{яv7╦|╗ўV█-jzG┘[>▒ыeУLо4╛є▌а Qt√б╙Н}╫~JG3ьНмЙеiA┘╪-Д¤н=рї┬>C8XA╪┐ a╘╩4▌Ъё░ЄЇс╟эЇ╡ ш╖8O=┌■H~FИЬ?>~∙╒В▄ў┴3▌а╝┤'йд-╔t]°ИvпЁIъ┤╡О▀N\юж╬иЬУ╝M╠TO╘`Е╠┘p╙hза═x>╧kЇ■■[Р2x─K▌т▀DВ∙ @k№╕ 6НВ╕ЦсM▒ю√IШє╢─▌vвё6╬IЫ2о0v>w║ ╣R;=ЪН═ЛЄбф╬OГЁpєФI:°i{JH@}ш+═?<А ]┼aQНrM╜╩ъ╘сЛ╤)Ч+є╒L┬и╤УржЪё*чЯК ╔ЪФ*i)ц╘fМ█ч╧╓NgK╡a(╞= 2~!Е¤ ╩╓пXPB?НMN▀─|ИuУ31{cS┌f╝>6w4w~├aцq┬Э ю$а└\х}╦п М/c=TЛМ┘lЇ┘аu* JTБJВ0~)+{Z╛h┌F х°jeр └Э╞жDУЧПГ=dїB4K╣t0с■oQyоk=E~Шм╖ШК√л°Щ+√Х╫┘Ъr|ХяЪЩХ¤╤ #█гЗR=L1╓К▒№&Мdмs╓Ц5ўОa▓Ў?╖│┘|╡└Л▌Рк:z?щ█bв┐√°Єю ╔)Нendstream endobj 150 0 obj << /Type /Page /Contents 151 0 R /Resources 149 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 153 0 R 154 0 R ] >> endobj 153 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 658.062 514.476 668.194] /Subtype/Link/A<> >> endobj 154 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 640.13 176.971 650.262] /Subtype/Link/A<> >> endobj 152 0 obj << /D [150 0 R /XYZ 97.768 692.105 null] >> endobj 148 0 obj << /D [150 0 R /XYZ 265.639 632.697 null] >> endobj 14 0 obj << /D [150 0 R /XYZ 97.768 331.746 null] >> endobj 149 0 obj << /Font << /F45 63 0 R /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 2223 /Filter /FlateDecode >> stream x┌Х╦Оф╢ё╛_1ЁI ╕╒в▐Є═kь ─╪'╝9░%NЛ╢дР╥Ў╢┐>Uмb┐╫@3"Лd╜Я¤■х▌цc^<5qSfO/пOMWe¤TЦI\4щ~П·yЮ~╪lЗC,iО│n]|Ро╫├JD╗yb╒-Ыn< fФЭ█(ч`╫n^їn▒╩mV y∙√SЄ┤U▄dДєuцїj]$Q;ZZ╕°Пi╖ZgiZЭH■T┐AЄЩK.╬$їpEЕ└╖ЫПY}V Jл╕n ПшгG▓Zзuе?ЧU¤kU'├┤1ЛЫнЬy▀лp√ачЮV└РЪэф╨╤в═hpЪь8Y}┬є:Z\фС╝╕L╦N╗╔╚ук,вx╡╬E¤c`,Ї┘┘╛▌;ЇP▀+jVvпA═и ::(№Vш?Й╞┼t^Ьв┼vALў=ьrЭ▓ zP ╥│ЇАЦўЮ>bндEЇe%КHYз╓_tзF`┐╚3╧>bЧЇi=Фw ГЄБИN╒╬zD%Бх╟W·Т·уЁ Kт$I¤Е\~Х√╔аXtwШэhошaZц═╕╠ЁО∙кtN╗Yнв=╗AБу5 дY$2Юx#бSNк╒╥ш?&i╕¤▌╝3A>╟F▒ "ПЫ<┐Т№├є3ие╠#╖L╙h╤q7ўК|·К╩Ф{mО┤ Ь╔3░IЁ вШ∙ї,@в┬Xy╫"¤!╣_VыRD┐┴ ▐▌Ц(у┤к∙оGЯ▒═O@T╨R`s ;{М ▐^V│Їг  L\Ю╨╝GQ~√ &- *НiuP╞Ьt▓ЎКНqТ╒Са║╝ъ2─bmх▄Ў┤Дpm!ўh0№░├0?~╛╫OЪ╞U^▒╠/лL▀└6пюTФfq^╛NB ¤█Л·╦ЎL@╩ц╦?│╓ё пtЯ╞M▀єYВ№ї.яё└Л<╪¤RкY:ЄQP╦ПЯ~в┼)ё№sUBи<╧Т ь╧(EЦ┴-ГЮч▐О╦о'гдш╧isх╧╜▐ї■цSLЬBЗэ▒Ў╬-"┘j┤М!OB─MQpВ╧К8o╚╨Y \Й$IвПшoJ╬Л]Й:RюЖB+'╣╒F╧О╓лкС╟eQУЖП├М▄В q├wVдl█Sgзр.е'<┴(╟7ШG▐ОЭКxLЮ╟вnВэz╛ ъ╪┴sИъ╜┬Г░Y║7&╩%Эъhyшс╢bМ84·╦╨╪-rЗ╠╠ЛP№Ц╓╫╢<ёс#p* EXY фОN(}█╬a╠╙шuBЖFм╥ШpшAi┤lМ2Ж▒7;Ў+Т_В/┌-АуH`Н╓Ш+х╓<кБhЧJАНБкц(╜M┘А ФY$Чy▄Г∙ZвЗgdR┼8чС_╨╢S╓╣м∙ал)цgm ДЕЗ╩╤Lgиaятяйъ╫╧iZ┬ГсБ\нСP╜юЪ *ъ8yea╢J3*i]бп м╚╛┴2ПнзН/;Ё"N╤ dФA';ы}Н ~ХjъO*╨БkнЮ╪р'U└WGучыСBэU▓хкzЩCpЛ▒ф╝=иZВ/Зї5Ы╛D Р█ў┤Z\└▄S|O5─YIЩY─urдo)═╪╛нўшwQ %сr╠б╘д1xЇU(Ею2K╩(┼O╣~─ 'V(╖р:АЩ шБ<р╧L4дЎрбш╨═R╬H╨к]Ьфа╠╖╕╣╙ ╘_шЬВ░·ї^ы<Б\^д╫]Y`{ъ █$r9▄H·Ш╤Л+Т.LЛо╧Х╓№еЖж┬:=Я╬)░┬4┌/f╓k lc·R ]4k╛╖иYpї 3Ф'{ ╔ъСш9 K∙_ИE,п▓p┴С'фI'euнV┤O>фз°ЭK]hЗ$жH8)▐є#░╚еБ▄wЭ2афяю╣╩╦Xд'Л1йOг;╛╖╠·ЇU/Бв╧╖Гo E▓▀ЩMл:~ёБ[№у▄УCвН ў▌щu^ECF║ЮHи;їбг┴Ь0ЕQў^ЬCШ&╧s/╫,.YгЯ╩=╠Oх4Т√ТЗЙЖ╩Ўv┌|8Тє%+╜{sнФ├х╚╠W|▀╦-╘Xэzк╕╡2╞Гс4╜шUс>^г╒┼д~■ё `─┼u╖ А╨N┴Rо╨y}╙Х!nшМVМq╦╨{T╣5мWЇBИgVq╬║Я│чуф╛╚B9MK┤НеUяёB╖ц.5N?i@!ЯB Jy╘─┼║C xч├/F■Щ /(-з╘Ц!ИЪ#ЙТ@╚& u╦ПАw╟╝є[▀· Е║ўтY°Э*утДЛХ╙╗LVcЩ╕yъ _Ё)юц╩EтD┌пс:╣rЖoщу╞ХпШ}ЇK$и MiК|╧\Х0ЙШZN8■║ I╟РN╤O'╨VаэG▌ЖS▀лV╔∙w╛* 0░аю╗╖▌7▄┐єПМуЧ▐an╥┼Ф)Ўсб4Б.┤,`┌нb┴?gЦxЄю├╦╗ ┌─Йendstream endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 612 792] /Parent 69 0 R /Annots [ 159 0 R 160 0 R 161 0 R 162 0 R 165 0 R ] >> endobj 159 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 658.062 514.476 668.194] /Subtype/Link/A<> >> endobj 160 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 640.13 183.447 650.262] /Subtype/Link/A<> >> endobj 161 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [213.604 640.13 514.476 650.262] /Subtype/Link/A<> >> endobj 162 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 622.197 267.133 632.329] /Subtype/Link/A<> >> endobj 165 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [140.783 324.2 147.756 335.143] /Subtype /Link /A << /S /GoTo /D (figure.2) >> >> endobj 158 0 obj << /D [156 0 R /XYZ 97.768 692.105 null] >> endobj 163 0 obj << /D [156 0 R /XYZ 138.153 614.765 null] >> endobj 18 0 obj << /D [156 0 R /XYZ 97.768 460.439 null] >> endobj 164 0 obj << /D [156 0 R /XYZ 97.768 432.516 null] >> endobj 155 0 obj << /Font << /F45 63 0 R /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 168 0 obj << /Length 2370 /Filter /FlateDecode >> stream x┌╡XKУ╖╛ыWь-C╫;яЗS9ldй*)Wв╫Uо▓|└╬АфXєанЩ_Я~aH.)┼Чvз╤hН~~р▀Я▐<╝O│╗JUyrў┤╜л Uфх]ЮЗ*лА╙№ьЭ;| ЁЁЄЄвЇа╗гkkл^┤▌╖├* vnФiцЗf|║Q7Ў┴X г·a█юц╔╪З╒пO ╝ я╓QбкDЎl╗▒■╝^н│0░┌к]╗EйЗўIy╥Ц─Е*лМЦ╝з▌Vы4OВф√╒║HКр▌░зZШї╪┤├щ4░NНЮлVы ╬x┌ЛРЯр╤▐ЁОi╨Zц╕╜vLщоcХ└<%иФгJqYк2IA5Tщ├╟┐╜V;╬U┤И└y╬Їfp▓?[╟'╬`<+з;Pяъмuе@ЧЖ√сёщёoНv┌7ш▐\_V*О№ёу┴╡р┤s№╪╘HвLоЙФ╒о╡█гg$╥33{ЮжvУ1├=╨It~╗Їl╗f■▓К╩└╜^9ЩF╘xь╫k╤Ї№z╧рфqЖ]cp┌H√#┼█ u4]7от,xYхYал]MиКи°┐┼.Иpр6ж╒oЗ▌ЯН▄8лВ"7Й+Є┼·∙╕F#┬LfV· Щzv-и7<3nyнцa=Ў=xЗyЯ┬0юМBПTх╚нч╔О╙┘╕ь╨щ┌╚*┐│цб(Б┬2q3 У,WUVHh╜█l~┘№z}ў$UeюуяyЗ┴╝EЗm═─nOкHХqtaS║OExЁ└╘KыЎH┼и%2,dwgШ■╝К─bGЩ4┐╧fи═▓ /хЫ!л╡^pp"4▓МS▀║nЬФ**c╣╔w┐╗╛kЬF╖яJglG!^yЧr2нRv М│;╠в:Ь4c╡ Ш▓Bеqra▓Го?ыЭс┤╪Н>UЪv2╡ыОТ8г|ў"╢p·╣╗qу(ЕъМo▌╕T@▄╝p&∙ZfСJЁpл0MIx╙▓w Ў7№▒╟┴щ?0rCЎЄ┌╛эЇ─r~╣║EЖё╖ў<Жdb╢╞za9х]пk╦тn;ЩfЗ1 {эїМ3╡аН┐М9 UяхfPС╙ЇХ&и*3iCTZwь ЎЭ╕*В╖РлФl0ё?=▐ч${ПГ2╨Ц^а─ё┤ч@пДntdf dь█ P._ю%ВъLД╡ +├рЕЮП╝У=Ш║▌ё╬╫ЕНMbh K4&FЛ┌#т№№Е"╕c█2,и╙OBцйсСПR▐-█Рa╔x0├·yВТdyтSШЕфfШ\1ГьъOb яe`GF l╢4'ШK°╙v─╪~┤╠╨ЧKyДЦё9СCз;7єЖ·у#¤▀аxжq7щ╛gEи$Q<К╡uV╛╗в╕T1 бo┬оTЕ╤ ╘Е√2ъBjЎо╗┘ск\ХЩпjХ*[┤ЄPЛ7НNRPK└2U├,d}Ш$Н¤Ц[w;@x@МЬ╢8?иJU{╜Ц┬V{э Имqj▒LАП╠ДgжЙ3Сj _pkdх )0ЙNx5Б7НП¤)Ят8i╪┤'аS╠Ё< t-АN╘<ПДzЬ a╚S╬ж(ў=Чh▓-M√╜yD┼ , ╖ЪUв╥┬{╝EщыШИTU"Вy╧R║└╔Р№гУ│╣C╤S¤┐╨ЦЬ│E╚бkО╠gИr▒#П▓\w╠Р6э;cY_]XhI└░R№ФБ▌3─╡╠х═Б╪Ёз╙├nц╓┬ТX7 а!K=C╘JА╒^Ы)╦╬ A└╙йPН╟s^фБЇ╒┴Д╕№▀01YаЖ╪Ўуъ{r^!'щ\РL▒J╩шв~~ДЁ0Сч]'HИ─єша"▐АзпыRT▀D°┌єXSCu7рдВоЇэpMЛMЇoа▓Ш'adшosmўLЕ < zK┐КW╔Zb╡z╥[jщ8╪z=рх┴ПП~╖06-*е∙хйi╤SИqЛ╠Б═У·|.wIB|Ўж6УLЁ°ВхА%]>;=yР╦╡юИя?,@Иz№ЫP0@цб╔┘АК▒8^eНЮъ╜м╩╤║╫Рс01Єiс]ъa╡┴В`H9jи!6╘╬HIу╔CgNc┴Дщ╬!;ФoПс█еZ┴я}її╨h╦ё√НV^4Щ═8SЫй═║г,·Bп&85кЄр├░█с¤гх1}/╨ъ,Хqi°RИЪ┤ОqЄ╔╪HИ ∙ МYdZPзъ0Н ° K ЄЭ▒Є¤Bя}К!d╝Lнs°N$e╨вxОЦ+:Я√ЁUU╞2г┴Ч°ж┤╠Р2Н:─)lTИP╘ЧHJй/0N}7ЩГ?!°¤ЕА ·БЭ╫5╡╝·3єmп;╤┼j√▓=e8ьщнЕ╝ZZЦ[8ы> endobj 170 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 658.062 514.476 668.194] /Subtype/Link/A<> >> endobj 171 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 640.13 182.949 650.262] /Subtype/Link/A<> >> endobj 173 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 555.652 514.476 565.783] /Subtype/Link/A<> >> endobj 174 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [96.772 537.719 170.994 547.851] /Subtype/Link/A<> >> endobj 176 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [408.207 369.56 415.181 380.503] /Subtype /Link /A << /S /GoTo /D (figure.3) >> >> endobj 178 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [124.85 283.258 131.824 294.202] /Subtype /Link /A << /S /GoTo /D (figure.4) >> >> endobj 169 0 obj << /D [167 0 R /XYZ 97.768 692.105 null] >> endobj 172 0 obj << /D [167 0 R /XYZ 143.489 632.697 null] >> endobj 175 0 obj << /D [167 0 R /XYZ 137.394 530.287 null] >> endobj 177 0 obj << /D [167 0 R /XYZ 97.768 338.053 null] >> endobj 179 0 obj << /D [167 0 R /XYZ 97.768 215.886 null] >> endobj 166 0 obj << /Font << /F45 63 0 R /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 183 0 obj << /Length 2431 /Filter /FlateDecode >> stream x┌ЕYIПы╕╛┐_╤╖╚└УF√ВЬ&@72AВ7hwNy9╨m+╤т!еющ?╡QЦl?╠┼"ЛKл╛ZH ээ╦O/I∙TUЮ<╜Як"(ЄЄ)╧К N▓з╖ц?Ю▐┼ЩўО?кЫ╒╘О├╬П╙╘ыЇd╣5Э56o╢┌0Iяв╠√t=Oz3/їЮ╕guэvM╝ё╚─zlЇ_▒Щ{нР┤1гЦ╩┤V┼vv▌╓▒O<▌┤7┬┴О│1zЮє╨JK ═ю┐o x Я№ик$жCэ▀Ь[█`чзiх}ъ]фсжU!╗W9╔╦н╓ЄўЭNo┌яaыdM┬╕ё ╥Yp╪┼б7С╙РЖЮL O└:эИ╟[Ж5oZx!X>&┤жQ╛N╠Лк пN╥QЦ╫йНR*ЬDеўvж#e▒ВэD╕Quvdё ╪бaКТЕJ&ий>▀ouдГ╤Мє╘BUГъ>нcн&бr╖ГжLmпE╥Ч╓tЯ╗ЇКBgRе/╖ Ш"ю-%╣:tn╗4Ё ╛РO┼]2ЪБВзбї(+m╜К{╚yЙ{8╪╠fє╞▌!ЬеWd,█*╥p┴ZC╕R,╬Bт╪╒!п:ї>▓[qMй$Yа┴ёЁlx─Ж╩БRК6▄ t▒#ЁU▐┘Э╪ВwКв*$╡╧√¤=┌|7iЫdє╗▌у*▌▐╫c·Аю┘ФIР╟╣╠Vа2 ░1XКCW\%АЦ┘j&rБАf4УP ыл)и╖│,╗"╛JgаТ'ЎЁЇ─fИЫ∙ ├:▀Mє "$·dлУ¤e]╦)┘~У·Э┬ ╪Hт3З9W╦┴м╦8aНD╪·ЄсЗ╘вЦG\▒qЕ*╬Ydx ╧,sхтгbу|g\ї▐r,╟ъA┬75ёЫ▐gЖМkPv*fn▄Ц╦v╚,]Е"$_л ьq!░Щ.pц│Q(BъU∙┴ГS╣ЪоЇ▄ЇxЬ;nF┬UцЬ Ню!┴жRкgRЙ┬w╥їyhЫ╡ь$╤╛Bн0Ў▓КВ.Ш,╣fWюY┼MW3j '&8НЪФ█НжmЁа(╪╗LПЎg─вeцБ╪ °дjM╜яqЬ╘ЭV4R&╔КО·iц╥oгI┘Дт|[;vb?ь▓{!}РЪ6ГrVVЙZ╥u*'аЎn╒гJ#TИ&А╦wЎ№9ЭР╨│уljisад░ %╔.╔╝M$Е▓.с/╝пeвd▓╨у╕ ╛ЩЕ|ЕI]pщF└─h>Щ°Гl^л∙u7з)]Fйlm);VfLлkA▒▄(▄йэMЩ▓║RДЫ+Е╛╢э[кz▒у░d=qp╕лX┬MйЄ ЮA>_@>оk8 ╖)6└wУ^б/щїa∙ТWAЪЦо*C ╙Кm┬╜╤арщвЗДХ [7Й╦я"ZE"ш,j"y),A├╠Г+TDЖ╡Е+eБвЬМъщ>У├]д%э├@▀Ю╬7бriщn m2+╠ц^Г)мЫ┴*гЕк>ЛУ└╝%ЖЧюn]b╛ю]kйRyonВьw-┘▄Ajюl ─шн╦╫|sжz╦л /AожV╖╒u7rmMaЇз`∙°▌evQ¤SоAЕўМ▒█ ·▀ Г╕oy╓ў0 ў▄<*Аы'вК├,HCЗаД _┬Є%^X▐╦u$sБ╞ЮщМ$d▒╦3zЙM3a╥ a■Hb x√u\─zц5и┼$°WтА@ЧtSЕ№В№|`7║Еj[ў~г╜T╨╩└:.маJJW╝ДюЪ\╚· УфB^ms( 'ъ┐┌b-h^уС*eйn╨Lr=┬─цв┬ лY5]▀├оБьы═╓FwгjЎnr^FЁКГ╗)т┼╒pШ╟_aх╟╚№;▀╤у╘{iщ&нчП╨ANп?А]жAШoтм╕KЬRю└я+Ъ▒ЮёоB<┴йT/,▌]г Н сЎ┌№аlNр┬Х╣█+█ўФШE╥╕Z;нp 0|f┬s%AФl╦[~╠ИєU(┼gh╝J▀!эШ'O╘s┼LшkY8Н~{ВЎzсhи@gК╙=6▄_(╩2И┬ш╧tТЖA╝шdkТА"[ОўJ╠$ЯN.QF\7║xo]a▓y]║{¤┼Q~░─Цю║i┤Lц@T║@t}-к╝їлOло╙8+` КхAyUТ'+ЙX░H╒╣7'РБ▀nщyКKi~ХY?Щ╝P[оj-╠шо╓Z╥)╓ZEт¤21ёF│╕Д.=▄>Cкь0]rжsilАbmй$hУ∙╨╖┬BЮЛh¤ъ╕Ъл°y}ph▐F1Л)y)-ЄШО7ИV0ЩТгтЗ▒Н║ё!м°Ї╢єы/╪┤ ╟М ·gюїхЯ;?П╜├oфэ╒:A\мЧА╣\▌╙╗ Ё"1\▀ый╤h╛jЯN№■ЖЖФkMЪрёфq╘ _iyа╡╦Я|▀┴ г√▀`░\Аа╛ ╕w'▐ЄГ2ф BJ°Є№ЎхHЮуТendstream endobj 182 0 obj << /Type /Page /Contents 183 0 R /Resources 181 0 R /MediaBox [0 0 612 792] /Parent 180 0 R >> endobj 184 0 obj << /D [182 0 R /XYZ 97.768 692.105 null] >> endobj 185 0 obj << /D [182 0 R /XYZ 97.768 532.912 null] >> endobj 186 0 obj << /D [182 0 R /XYZ 97.768 339.014 null] >> endobj 187 0 obj << /D [182 0 R /XYZ 97.768 270.645 null] >> endobj 188 0 obj << /D [182 0 R /XYZ 97.768 202.277 null] >> endobj 181 0 obj << /Font << /F38 52 0 R /F45 63 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 191 0 obj << /Length 2096 /Filter /FlateDecode >> stream x┌Е╔▓█6Єюп╨Ск▓8$╕ЙG█I\ЮЧS~╧зq I(sВЇЛЄїщ езк\░ш}Г▐?┐∙╫o╔~SЖeЮlЮПЫ▓Л|┐╔│"TI╢yо Lg=mw*ЛВкп я`UYЁsgБi·┴╘ ЮЭэN╝¤╩╦8wvi╠]mF╪YЁ┤▌jG┐┐o x■7╔PДeБ"─EЦi╣ЙИ√╖╗\▀р7Ж{■ь"oЬЗкЁgC╞зё┐ЛK*╡▀ьfQBч>Ї Єи'█w[8Р║╖ё>шЭ├я<°╝НГ╣Щь╨Ў#oМЭ╬fф#'╙БФB╞▌╙╒Эnv( ш(ьb░aвHОЛCЦ*O$нrсБ7Ш╩ъ╞■En`Z°(g╓ьЁ╢УG$nwIЦ╧g├(д╪╔л╕_H\-Б*▌ёц`DКmБ}°l█ГбP╣H┤b╧Щ#╞▌ў(RХ5ДeТ(V 7`:+█лyёKг| ╞мЭмqoYЕ├VA╨N■╢urY╓ГntЗW=Э├х#}░НЭ<жчт н*ьyy▒Ш>╕uwТ-№╡ЪЛчU╢gSВЛ7vЬ╗ ├Ч|СА/╢I╪╙yj.|аъчб╔ёэ1в╢; }/2вfВГ/╞t№}├\wDа╕ └,▐|-■Q╬В@@cН°BmОДЫл,▄Мц=єЗц╒"aN■@LЬX╚ X─ОжF и"° ∙PД/Lu ∙+\ЕЎJ╖<цqшЭaМи├ ЦЧIX╢¤Э┬Ьl]П·ьЛл█╒~╝╫у,Е9а┤dП|9>c┤│dкь=р█╟'Ж"K╨1U*°╥ёБЙ2p= ▄Ю┴SиkY▄▄▀  б}Ноз3▀▒+zП╝HAкT╔U╓ХЇUєf4ке@э─+ч7l╪цУAGE╔╩QАуЬc┌їjРдk РвєR░√a[C@НVB╔И/ЦГ▌W^|И╛}а]c T0ЎН┴┌VЯ║SНлЪ╪_~┘жQЁОqм?А▀┴Ї{ўЦ┴/gK╤гG*`Ца╢·qтN╣&C╓¤kБЛL{4/ў#╟▀ф6X┐ЖЇz╫∙а└К█[,Т*╧е░чP:Lw(Ю╘¤DЎЕфЛ╔ ░п-U┌гMWIЭ╖Э?'З░и└ХQ2╓((RMЄu╞f▌2Q└ы┌Є:╣№%L╓_ЯЮ0Р╩рlЪ 5Ёж║ аaь1║~┌ЪмИ ═'p0┴fNз╪*╕Eл нв+R Зї╨г╟=aы╟ЮбR╨╛ЯOg9ЙЦаЧ; ╒g№жr{5╦k7}П▓ИW{ЭеxhтNНC╘[^zтВ┤┬qО╫ПO@,f Н4ан№7=ШЛвЫБш B▓▒╟ Y ЗЛ рesiї└▀┐╪#Р┬ ├ссФЦбЄГ╤3|L ¤:▒╒$#╨°▒6F▀эШф+9┘E─╬яg&t:о7к2HRn]dBbщ╓pц 3)ГK╝]шШVr>&э~╚▀щ IP═∙fЩ~@ОЧ-D╡Аэ&#√Йr▓]╖жtД╡▒Э?e╕╒>╞MЦ╧╕─йЛ[V┤·▓╨gi╓ё╢зT─Б>Э0]5Ц═Яh3-Ъю`*=х" ·yd(┌║└ш╬сpИw╣▀ХJl%│╗ хцИх/ЄU╙/в╗┌тШ"ЧтUцо▓c5╖L\№ZE▌рЙ╨=v4о┴лс`╬млчBцi*ЁоoШи\╛ТБBrhL+d. Ёж║ф<┘fюмL{╣zUJEОоBє╨ыQ$╒<═=и~Ё4бgЙВ╛├Е7Н┼yг54!ЖB&Ня╞v@м*.азlqXdрAИВўiШКр╣│Ь│4╢еъ╩█щ╓Ё┼uЦ`ЭRpТг%НИ2Г0╦^╗пЪGч╦Z╦6цМoKФў&к▌╠ЇrLqP√2щиo├vI▄hI▄H7 Ъ^╫╦CC╝1юо║J°╟╩∙бя@zйМ╪?ре√═q┼=5X?/╧╔$▌ЯuuЖфvМг>ИЫ/╪DшaJёРз TСЎQ╜U√8, %ўУ░жб 9Д?Ш■87╝зЬ$Е4─┤^:*ЦЮЇM╡\VзШ рhЪё▐∙\▄Ё├┘Ц▌Щ~vНпЛI-\<Зо┌_У √Ц-$ч╞Ыs7╤O°у═%Ь▓HA█Gн╖╥├Є■ЙсY╧C5ЮDж47Ъ╝z2;JvskF ЗЮАя20Юць%Шv|Ї┼4═-Д >┴] яВS'╪оfрd▄$ X-iП'n╝s[╪ЙгcЎ╕▄<в╗JАЯ_и$aqТ1с:[∙8Пу░╠2шYШЦ╠) HEQЁi[bКв╚П-┐єЯ(иGЬтик4╠│=Qх ",√╛╕╖уИ6АUG~FвU$╒ц╧бщ!I·QР╡Ю4_уў ═│Сд;мь ┴sУgлыел▄Ёq╦S┐}BgO▒╒ї"╖W?м▌w│Tzw+as ЖЄу@є╪О1▀ЭёЯШ┬╕▐¤=г СY┼╬дў8D╠Є?VЁ╤fv72С4d4ф╧├iu)Л N ═оЄГАф]уCюцПК╗█и( У<█ьЄ вм ┌%b▐№·№цo/gклendstream endobj 190 0 obj << /Type /Page /Contents 191 0 R /Resources 189 0 R /MediaBox [0 0 612 792] /Parent 180 0 R >> endobj 192 0 obj << /D [190 0 R /XYZ 97.768 692.105 null] >> endobj 193 0 obj << /D [190 0 R /XYZ 97.768 640.508 null] >> endobj 194 0 obj << /D [190 0 R /XYZ 97.768 429.066 null] >> endobj 195 0 obj << /D [190 0 R /XYZ 97.768 306.511 null] >> endobj 22 0 obj << /D [190 0 R /XYZ 97.768 220.21 null] >> endobj 189 0 obj << /Font << /F38 52 0 R /F41 57 0 R >> /ProcSet [ /PDF /Text ] >> endobj 198 0 obj << /Length 2581 /Filter /FlateDecode >> stream x┌НY[П█╢~╧п╪GX+вю┬yJЫ═┴-╘Ь=}Рe┘&"KК(m▓ ╛sг.Ц╖╔ЛEЗC╬Е▀ щЯЮ▐╝¤к╗╠═трющxЧ%nзwqФ╕~▌=■rы╛ь6Aтl?vХ:MQ│┘~ш№▄\.CнЛ╝╫Mэn■~·хэЗ Эдй╨sУ(╝єH╨╟НКЬ╝°ЬЯJЩ▀ЯєЮ[Г)▒йdJ▓є·░нt-Н9nФBДФw╥шЖЪчч":пэдc┘щж├═▌mэЖ╢*q│└зm╡Э╒╢зqЪТщ╨╕фЕ э7╛ч х7░H▌ДЮscБr╛ъ■╠\╝hШd(чРw+║znВ^╝L3Ї#▒9.$ДN╦╢bjWtW})3√цj=▐▐╕╖(r╚!`{V6╕щГlЇAцPдЯ:u#qJfЭТнЬТ-Ьъ ї2С▒К8(eт p(█ж┬╖ЦIт4n╜╞╜п^nи├vў#╧йЇEУq░S4M[vSTB ║Y.ж>ьv└ЬеNБ;ё3Q)д.R■З.Ж 6h╒пЖG▀┐р╞ ╜╚{ Rч]0√√╝╧yшс[q╬ыS ,К)аR▀M┼Ьш=бвCЮїAЦnъr√Хм∙┬Ь▒нН▀Щ╛|°PoЁ ШСвдzaн▀Fп#сыYd╣╘9u1Й╚ Ssю▓▓╨7eўМ[╡бaЛ БНmlESўiI╪Р0Z@Ц╞8GвМf6╬яo°ЧГв┬З╒┤|y1hPа·АLyy█И╪g╤└╤Хfиz├ЭГ5M╠ xСє┤ рhх╡):▌Z>^lэEL{▐D╬Лал╚▓╕Йж╒n╨&+├╫юK@Г$,O%яN╪OeCe1ЛчЇу╛╕╨ы·─ЭcЩУ║╩1пF°оЗ╨0=ю┤НG@1▄УГ[ЁЕF]j\^9Ў\аyЦ1─3│8d0{╗дН`ЖKНсNrЫОN╪ ЄP jhvx▐ф8ъIИUДД╨▀ Эм~ c╧∙iшЄ╙Ф╡Vv!? =┐bДСЗTB~дTCВ╕pG╫<ЪswЯўМGс╡╣ёд·[ 9╙z═1═▒g╩еAКАХ▒╕2юдЮёш¤|aўУ :╢Аїм_В$rу4Ц·└B┴<0┤|hнъ▀sc╧vФ┼d Ё Л]/╚╓√Уvёыja8 ~ТИаGИ╖+╚▀ы"╦w│L яZ\4╣б┴ZNтFйн╒и░Bаa?aШk#╔5ЗhуЮЪNаФ╒Л]Х-╧яяX$аe!┬П&Е"ч~ы╦┌p╬I2^╛ЬNАЗЦBWV∙7Ы▀IЙM─ЁepрcЙ╡╧x*E(F|╫Ь║№┬¤╜ЁI└c йл|_Х7pЙ╜F█ЙYИlf▒8tЖ·╚х╙╟Jy6Ж)√Жкp.a} F'=`h{шР┌└5Э/ Є∙BV2(Е;`█ ШyR░T╖aУ└·,є╘Д╬dМ╔є╥Ї%╖E'зкЛт'МюRИЯШт╟Л▌$│ЗEГ▐э■^ЗTрPо ╫х╫r▄l╝3░Шw╖E╩ї╦З╡Ш)e│√▓b,└Є ▌с]Uёа8-ЩЫ8╢╓L╕Ю═mA#Тi┘^[▀╦\uuИ┴ЯРжўМВgЖY∙У9Х─FФ═ьИEzMўЩ{╩R^рPY╔ [ШН╥F╖LтиK#c:┤╩ї╕чА╨uQ й ▄лeТЄg╒Д-╘Ь_iП&АЮBа┌▌│D$p1╬1╧н╝m╦╝3▄б┬╟&ZД2ё Л>^▒┤уQ┼╩N╚РTъqa2NТr█lєuМO ╜╘yдЬ`O24■TКЬTшZ┬▒─л┴ИyБt{с6|q;X{[┌╤\о Б╘╖;@eКЛ┌Щдуф%2р·ГщN#"▒╨Ж┐√n\ohoи·м═@Лf!ФPжнЄ├=╛Щrм█ЮаwьЪ ╖╞0ГЎзZ├ЦU^ШЫЪя1Ь┼сc╡Д&еiГЙЪ╥4Pn\жB*7Ё√оm+Yь7╕HоХ╞Д│|╢▐└w тG{Ж1BЯёD+╕]эЁ'оl|Э\"Jц╗iвnу$:╧8═╬жы┘▌НзIє┬ПцМ╡▐¤ |Л|W%▀┼╔ qу(Эj \з+┴U¤Lр°ЄC)j╢Ї√q]dnРXY┐R!ёIККuР║~d ЖЯ∙╛/р$А▌╛u╖хўкщiG^f■р·э┐Я╣?Ы└ў░jйGyн╔╩НЇиXх╟ЭЪОтщJЎО?тrЎнї╣7>&м<А'т4√БМХОEрЛiйч7JвЕ5оr╝g╙ \5M~)Щ4%/▒сАЙдA█sЫЧ║╟X.╕{╓зsеOИtVИ═^╚▄#&lMЩcСSЬEj~╜Щ┘тQееqЦyс╒(їбP╡─4Ў#^PR╕VTжa╩╥,HбЛVк8▌╥NыИ|<gП5&M╕Ф°вв═х?А▄a┤╕#3▌ЕЛжуG╦╙¤(/s2Q╚j╝╧lEЗ╣є╜оtП╣╪у0─oWn═░┐b{сdL╝РBсfШLщ╤cHД╧eиz-яe╪Ч┤╣ф╚К пk9ЎP8=QbG╥м]" °*ЁЩ╤Nсs▄Т╣ы╛ю▌р╗б?╓j╢■Зд-╧l╙ые√$· %P Fъa(Ю╓=п"WJ1?Н▄M$=═9f[√╥JIЁ┌Їл─$ўЕ@─ ;НWЎ╫3▌4ЎP╧╠Н<лчТW9У^╞э█Ў^▐╠sюЄу 4Vou▒░ў╬Є█WєЮk8Л╜|∙╕Щш√<п-°. Жc- єМК└1╜╦*e3╟'Ke_╬}хOПv n\ЖnЬ╠г╚'ыкWТYРFsытЪ¤╣kЖУ,√╕▒█╣▄∙а;╙hf#╫:БЮЫМ╟тUd aщpЮ5dэТЧТ┌HзТ░C- )ЕГ╖╠-pГ╞┌J═xб╚[F+M)Ж Бь.?#яJ@йjц╙SЄMiТф╪TOc| ЗЖс+)0HiиlсНрECЎЄZ& ╥└  ;Ў┌Z╢ї√яь∙_М°П╥Єйt∙_╛9uцzF█qыfР▒└┘щ═ш0{MПф5▌"?8ввpкУи7пЙР═▐Чя|*L╕│ВKадHIEхс╨ЫЗз7 4/Y█endstream endobj 197 0 obj << /Type /Page /Contents 198 0 R /Resources 196 0 R /MediaBox [0 0 612 792] /Parent 180 0 R >> endobj 199 0 obj << /D [197 0 R /XYZ 97.768 692.105 null] >> endobj 200 0 obj << /D [197 0 R /XYZ 97.768 667.198 null] >> endobj 201 0 obj << /D [197 0 R /XYZ 97.768 282.024 null] >> endobj 196 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 204 0 obj << /Length 2352 /Filter /FlateDecode >> stream x┌НXKУу6╛╧пшг\╒VЇв╟╝жТн┌Jj╗ўФ═Б-╙6╖%╥л╟ЇЇ■·H╦Ц&3ЗnГ ВфЗПx■Ё▌╟╝~hтж╠ЮПMWe¤PК*╬rёЁ|°#Ъ╬j╖╧У2e╧╥╧╜lG_wiй]*вwTT╤и■7+╙*■.¤я└cчQHz╙╙Щэ==╤`kHёoг?╟╗}Q╒╤/hМ╛O└╞@R+y─·aЗWjiC#$5/vЧЙшM ╟╣█¤∙№ПЗфaЯVqУgnЕъа'mN╨7╦#evE}╥Г5╜2)е9РаG·╜ vRэдX}lO∙┬AuЄ¤n4xЭ╓╤╔█ыЦTэYvЭ2'┼ЖэС~чС=*о&{ ч эp│Р▄-д╡▄Ш6 MЛ┬EОУ"╤^╘ 'm═╚}┌┴О╗4тцЫ6┌л1F√▀},╥+8`▓<ЛEBУ¤j&░╒Nз№D0Аяig ж╛w Я╨nфmЙЗlХhлNтви┴$Ъ╥А?Ю╛·У·-)╥8/+▀▌lJdE\Ф▐╫Чў #Y▄д┘╖█╨~ыяш%ЕВєЯ5┌ь▌├ОЦq#Чч|TГ╢.╥шeЧ%╤|▄e%кI7╠╞|а!сx Йa^▄бO╕1ю╚─¤С┴Ь╟уи)О╦4Rр'MТ°hLг╬╢▓#╤Є7╔~и▐NКTнэ/3L┐ЫxАCО│& : Ў╛чrC ix`дц╦;¤ум█TМДЗ╘╥|1єQ:;OдЩт;+К╕A5Yъ>╟$¤8pGў╛+EЇИvK╖]ыUАЬъV-Т╕L<┬▄j MЛJ▄░Щг─мp(@!sзЗ °@<Н╩p└vшbС3Ф&ъьО7++\e╤,V *`? °С:ъЙ jn╖╓LГэ:┌jPЇє╚]^TЁ╠Д╧Ц╜Ф╘Dъ'\2gmTLT■|Ж ╓Фwuек╚°%hя╘RGД√Т$k╡ctT"БВPGН╥эч ╡НЪCа~%,╔ x,Ж╥H:wъХ╗bЁ╟Cх░╡охп╣leа╥А└W┘d░J╡▒╚AНs╟╪Е▒.МПшдlЩ╫5°и{▌сВj;/+ /ртA*P╛гzm0ОW3<ТюКwQ8┬ rШох∙o╥чРO6b>-тж(nV·х(H═2А' F;/ма№%э╛Ии▌!╚■;Ы@╕E \┴4A{:а·IПwЛуРJ#On╗Оy° ╫ 5a√садQpSSДЦ \ ∙MА╩Ц+r>Я┬gTи"dВ.д%╖{▐йЪиУц4├┌└+╨╥оИ▄_¤ьзр┤нь╘ФVЁ¤шiД∙уЦ-PЬy9k$  ╚}BЁОwй╚Yu╞;$%¤5╦H╙╕┬з".┌н<╬w√4Бф9╡ ║П║c< юR*╟╕Wi╕\Ц╪Лp Цвv╜Здр,Б╠L┬7Dэ!Дшд╟╔н╘)▄Х*╗ў╤ЕОХэлt9╢╝V╥╧ЛЪ(╠@n╧V╖Э!=]'░|║5E▐ggаЭэpшШгE╜sZ.╟▐Э5ш*8ГЭ╜1╩▓Q╥╠yo┌╙:Ў│мt(q╖┤$OЄж:дUЮС╟╥Ьгз╣УCўN}ц╦A║|┐/w|Л/vШ№j┤ъ─ЭхiРiАJk**░l"╬ЎI┬╨И^I3.i┴,+C▀C╨С▀щV▀:Оk;юA+Г1oC┌╞d╒╕6┼оngя/W|+№У▌,∙ СГЩUёОХ┌▀б═Х▐▀╬╓Gc╟│╖їД}їpШыпLпНчzдЫЎы╡ЗXЮЛ/W╦Ц,╣▀1qeWЪ║╝~.Ў2#╝ф@mUyJ{KЭ▒Ги C#║ z└ал╩:4╙H▀\5JАж─z┤Iг_╕Ц╝Ж*зPЮюq!╦c▌ ю"═я╫Й*╖╬╥UИQ М╝о}┴\╫T╒╓ю┤▒fS╘ї4√Т{fEbЪ╗УыLЧЛАьVЖЭt╧v4╛t█СЯШХTрїп H╪ЫАв└КЦЖ0}о iЙO,WWїEОIRGт╩4f°m┼,НP7o ┐e:┼├qg[║╡oB^А▒OpI\RN∙ш>nДч█9\:!▄Ш"AъЙcЬC|щ∙аї9Ше┌ у5└BСSг/dCшdлtыN1╥SA║▐Х,PH├iчFе┌─eсыщ┐╔╢Є8╔}@>ТE▐╗*d_>ЛЖrХР0.жC╓>д".So|Фуz·┤ЙУ╞{╔╝2XПbК╘яL ╘МScв┴╒rцF.wq┼@Т└'Ц9$"Ц~▌┬╩┘кRє╧GАї╩▌╫╜/┴n▌о*XX╩Э)3├g}:wЁ7ё|xД°┤фи9/Ииxs▒т╚йкoўюХЖHEг┬┴n┴й(у╝╝л·К8мЇ╝'Ъe╞П·q(>ср 8ку─3ыWБ┌∙ Y_ПwlЩ7╤oЇТ`_щц╡ж├ш┴░DО┼Мщ4╗TGs\1╗8lU=a▀╘┴W%╦Ёл╓w и:{ ў╠y╛ Xy└д┌G&Т ■ЖAj8cR^3 Й▌g▒jмП{╕b0є√b DЇR▐У/┬&U╛&U'схk;Jъ╕.╖ВфСТ╬Аа░╫DДU(Є2j-ъ6юи═FфЦM,▓o`WтоVл╕╪Б▀ЮYjщ┼qxєJтT▄F▒╤с┘R°"OФФ╒╔ u║и▐`Дп▐▄ыУ{рzц╗BY╬@I2Ў q╫WтIЙT┌/w#lbЎ╘Q?\ЎxЭ*Ф─х э┤9@╛2т╘-▀лЭь'}╥.їxу▄o╜Є┬у:єcДf╙Ж╡W║ЖH|й#na─= J╓W 0t╚╪p╛-tf╡┌BG6рhЄoв▌8}┼╨┼E▌фQ▌;xЯ╞Ю ш\?ь (їJ┌╘4┼o~~■Ё√`гendstream endobj 203 0 obj << /Type /Page /Contents 204 0 R /Resources 202 0 R /MediaBox [0 0 612 792] /Parent 180 0 R >> endobj 205 0 obj << /D [203 0 R /XYZ 97.768 692.105 null] >> endobj 206 0 obj << /D [203 0 R /XYZ 97.768 604.643 null] >> endobj 26 0 obj << /D [203 0 R /XYZ 97.768 428.678 null] >> endobj 207 0 obj << /D [203 0 R /XYZ 97.768 314.73 null] >> endobj 202 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 210 0 obj << /Length 2341 /Filter /FlateDecode >> stream x┌ХX╔Тф╢╜╧WЇ═ьИщў%|╥╚39bBЗnЗ▓(╒EЫKЩ з╒яЧ XмeЎе H&Й\^&Ёщх├_ТЄб┌UyЄЁrxИвxWDёCЮ╗8╔^Ъ_Г_Жю¤ё)╬У`, тр░ ї▄ОГР ¤EБ}М▓@∙NУuNЖнУГ╡НmД6ПBs╦╛ogб№ХEЁ№°ФЕ┴П№√Lд2╪Ы╣>╩В╙4╓Р╝{|J╥2°e>┌щ;·ДкПю>Юм~├Ъ╟▀^■ЎЁе╗╝╩Ё_ьк$цГ^oЮ╤I╞╫╔Ї1Kb^╠ф;Ь▌°КA\fhdЁЗ▄нЫ█AWьу0XПqpв(рЖIЁП#лMBk:╕U╔эрw`єb╘Ыa└╥4 ■_U╔бЪ!╣kЖ<▀иЫFWъТiШ╔╩W│╠coц╢6З H╦й13ыОЙkЗZYIG ╠zє.вОЖ6°FЯФqo┘$¤O6^╓8щ?ё╩ВЙ╓>╜Mэ<√5{Хы] ЗзM░▄G\Х∙ИГOрТ4═ВЯ∙`ЪжеИ√HЮ╩┼▄┤ЎО81wХJ.`н│fкП|╠|ККtЯ№░╟ЮЫ╛Z]"AЕБ°ї7XUЧЎ ют┤║8л─▐y╞a┼m8√Я┼sл^еi▌й3яbы*xkчг|и╟┴┘zЩ[КА╒M°░╔;!0XD3щГДл╥Ї"с~F═с"є9МSB╕e1┘гH .ТЁ╓┌ ЭьДd└QДСgЬЭuЛQў▓p6ТР&╔J ╓Z:╘>P Ц)TЇ{Г_!Sve┴ё┴▒╫RLz\9S╠юя(]═ьG дE0Ы╜P─┴Lv^жA╞╫@VТ &Cк[Щ╖╩9┐ЯDs╛Аbh╡qG┼┼YмH╜ър!╗ Ъq#░║Е Р■╥RPLыW3 ъж╟,гфHЄ4x!<║M▒ёф▒8╤9E ╞■3 у┴*D∙╗t·жXЇЫ$К1ъerгV╧n|┼`│|k╟EўБ┼Я▄ w ЫШЭ┤щьl╡ ы■~4Уйg:╠ўv~8┬дЭяЭЧ┬^░D]л╟/▌пLTyи>Д/a%&ф■ЯC╜$' 7б^ТC╘`є▐р╔┴DС▀A┬n#iзЯ▐O+PєV ╝0Шi;│я.ёRrЦ:|юM}/│┼/МЗyuУб∙Z╨У4]сХ'╙2ЁИ· бкbPП¤iс└ж┘┬░a╖Lў╢к|∙йЁ ╥ФjkVEjh░■ўзqЪ ў╜D▐█┌,О╠ZTч(I┬ЇИ╥K к<9ЩMе╙в62gлТ╨яЛєG!╢QZ2М8U~Gy&Ж┴иr$╝08[О╖]ЖБ@П▌zSnZ╬kШЯЄ╧R╙█*Gд│й┴ижжI*▐дц┐ї#eНWэдqIn Ж═n4рЪ°*╚▀П0uR>┴∙vщжJЛWBю╡*ЙX*tWЛФР╪-▌,D╬ЬtЕp·кжф*sm╣"YЫИ┤з░@99Н¤╔▌е№нБ┤MЁсD-└рN8раz0╝е╛ААЁ∙∙∙!HЧёэЗ/itюЁ┴Ш─╗,╞OкeЯy ■╫g]│╜ф∙V┼R^в|▓╩НЗ∙Н ├M╚еъ4б╘ЎN_═─ио╬╦~:y ┐О├мK┬сGб╢D?bК╨s'╘Лд=38∙7Гме╘T╓7Н Аъ┐╡PmNf▀vэ╝vC@щl┘╘K яф_@}$N,нeBvnd┤╢╡┌S{╙╜;лrmt╤^?k├·ол┌▐>Qk╡Ї┌}ДlуTЛН╒╙їZrп°o A▐═ыIцRзь)╢╘ўы┼╩jгKжж└т╥F╘d+tёю2XdцcТ╕MФа╦JPNчс.ё╔┐~┬┌▀n--wiT*▀G.ц─аНщу@ввє:iЗкKntаТ╣+ЄЄЎ╦ынQ╣C╜P-─МЁ╕У0дSlG█Ў╧ %Х?-└rСЛВ/эDжЭщHq▒╡x▌√0Ы▀e▄к╚лзv/╛H╥>жю ∙чиА<;И'луЄй%├╘Ь9Z╠фH]БzTО▄┌a°■Р$╘°╧╪[r<▌_▓e╬E╣з"4N$ .aZmr{@ЯTE|nУh"8RDВ#┼╣Сnd╩╫▌B:`№Ш^;х$>Ьз│ЦEN=╨DЎЙЛBэ#Ыmc·,i╡┤ _C╝ЖнзY╞z╚┬З+n%*ш║XI·Ъц|с▌b▌∙¤CTB╙[кЪZ┤┐┤wп┬лл√KеЛ-╣╤jн╒зКr5ЕЁeyХС▒Y ╢FA║ёmъon┤У╬тE╖▌+;?2Ё5YЯ╡■╟b]щХ, жoq№" юTэ"█ЕUq]Yrх^PbХu╞∙╓[Л╚ТЫWСUai0'(┘j┼ТX3Юwfx]p9б╡Є)M9ЪД┌vБЙ╚W;LЇ∙дG╪ZQ.x╔uy;┐ю╔нНЪ F ~╖<Ьё╖zМЛЮфлg8zGТ╦#_И║┼7"ЇЎи╫┤Ь╨r√Вв╜}rKBYrїV┬OдЄ╙кdE■▐╞О еcX·╜ })╟К ЪNf{╗>,^йoЫ?╙у ┐мM·x(И┬KЕpy─,MЁ/цЖSЗU·кУ4╩J/иoЇєхxя"щЭIбR╩^тqДn4═УЧйVBO!Й╗°╨:~Н┼Есэ╪r@тыUP'Т╡╪[3(ЕнЕ -¤Itе G!ЄkЪ2rc║Ufл╟Zd>nCч;.kFыЖ?=F0ФтЇz]/|дВzу#E∙│OЛDпЗ■╔ГЦ{SW┴hN1iЭ э╜йt¤┘>·tTlWяиЇx2v║В╥■╬ЩмЬўїU,Ё╥ЗцЁlе,<ч8Й@╟╢+ ▄дУdЦ,'Кщ╦З╧/■ ┬hИКendstream endobj 209 0 obj << /Type /Page /Contents 210 0 R /Resources 208 0 R /MediaBox [0 0 612 792] /Parent 180 0 R >> endobj 211 0 obj << /D [209 0 R /XYZ 97.768 692.105 null] >> endobj 212 0 obj << /D [209 0 R /XYZ 97.768 391.492 null] >> endobj 213 0 obj << /D [209 0 R /XYZ 97.768 213.485 null] >> endobj 208 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 216 0 obj << /Length 2426 /Filter /FlateDecode >> stream x┌НXYs9~╧пЁ█┤кмN▀ъо}r╓N&│qv╩rjзj│┤║-q╥ЗкП8Ю_┐ъ░ф═╛H ╚°Є▌¤Ы╖яУЁ"L№8╔.ю/КЕ┐╚ЄЛ,]°QЬ^▄Ч ЎТ┘< В└√╒c╫?╧цQx▌г№▀,Ч│ ▄ ЎЎ}Ь_~С┼$$╕ШG╣% OKцqЪzvа ╠{ШEБ7┘zv╫╩ McV├%ш<Є╞M%╠к┤гm╫Єс0 ╜чaм>v╜,z┌╪╒F╚;Pж/e┴r4u▌Х 4 Г▌fFV▄Ъ╒ДЎуfъЕє~Bей-═h▒╢С9с┬/тИ═y_╒u7Л o╪╪->К ╧Т╘8Ё┬в№┘k +А8Зйz╧▒ √Вв,ЎкvЦ▐w█wmS╡г╠▓тШ\В╣ M─с▌2Е#flлv>tS┐R╔╚╦?л╒8╚ИУ╦Ъ]w╒!■мHG║╞EYцХЖ=KЙ╬╗├m*Е╛¤N?Ь\Ш q■СНт√ч╩Їq{╫▌D┬ЄЕў╬Мь│|■вЖQм°ЮqфЗQqфвў╜i╔╡Є├О#;┤8─-∙.JЙQёщэЦeеK+3N}┼e*└╔Ў╦ bRПl░6`Dt.q╢УGХц┼▐╫Ж┬т╗╒с▓a╠$▓1екє8б>AЩS▄>К,l╦бЕ ЇКуz┼С√д~к╡о?\E*║Е▒Чи╝C-┴vZВD№s┤Zq8Г]╖Цle8┴░_╒We▄ Лqb╧╕,>Sh╣╝3а╕Jє8╒╩щ; оВ╨╪║-tя┌3` ╛·н█└к░@ФcWб4ЇЙ№ЁЯZ┴ЗHP}з┤(Eц{╘╦aBX└√ЬCЇЕщйУZ{:╨√YОNд■▀╗юЫоЦ8унжv┼*C╕ы╡№жЗЖ╙╒ ╧юБ#Р┌Wф│я╢яЄ4╗Eт`!бVD9Ъd*@чsЄ5ХN<Ш┴оДt▓Y╧╨GrхэУкQЕб╜ДЩnqс-пxN#▄Хtxz_╥1(a╦.Є9Ї8фоN^- йW╦R^Di\─▐Х Ы/╠╗nlke└Y√cмZ>т8|$zдprШ╢█оeЁЗ┬╤<┐zъ╖жещ$°вUqБЦи╕№@║ЎпpД|°i╙Я╬Ш╒жЖ6иГd~Кd▄pgQ╒╩4Х╨Gи° Щ╕бvW:\▓╝№'U В z_8я▓шl╚№hс┌Uw╖¤Э/К}TGрDS]│?GВЯ├sФ╢nБJT─G.▌!ЗФ ║о ж#┴=P|╩╘Э╜К7[iва╒Вa4┘kE═!Z∙YШ{k╫юvП]D╠╜R|═pЭЪ╤ ЩTы7оcК╡ГrkЭр┌5t╥═i ╩╫К∙Щ@Уli░├▀(K]КМэ╣ф}\hз1}o═Zя│S╪WЫ▐┬╗БВ▄ЦБ~Qбr/х ╡аыЦ╔НО▐·2 keЬ zЩBУИ╩#╥є╜▓╢EГn╗s╒╙96r╚╘Т╚╡`d№тЄэz╕\-бф|/nos┤п▐< ∙$Nзцп*wьN(tк╛PўЫобўijjщ!▄эПў┼i!iя╦sЁщЁД|тк╤И╩М┴9<>!SЭPш░KчMx╣╙╘m╫Wzк|чQ(╙ХЛГR╧└}╝├I▐йдл}╫J(цG▒yj╚юКtщ.└╒TЫ╛~Цл─|6ЯNoЪ=i╕оєг" б╬яgЁЖp┴]йЦ'▓2?И:{?ЛC╩╫¤9йюВкнieHпш(╜фbТ─Ё0ЬБьxЦсvи)-Е╫╡╗YБ!P_Z√C(v▄2ыр"Ц╩ЫQиip"ёQ["╣ц╢▌N:лЕ `▓ЫFЪ}нIЄиWЭЇоюС,▄sq╧(ч╡m+ЩB(AKЇru+хj? f\йmЄ@╘F'Щ:ЛеNu)Л┌n▄я4╡ИЮQ╖V'┘O"kя%zй/UZ╛╘D▓qр7╖╚ъrш8vло& Л9ы&vя4рJrБ╩Еє┤с"ъ░R╔;╗╒,W кН┴╪Ы╤ R °вyЎGnF втn█R[kyC ·╣5 ўo4Ёа√╙╤V°_Г4╕╛╛┴_(╙╬F╜-К[щ3БВ№Н19▓Б4й╤F;^CХЫ├╗d~x8s8 ╟qФ╦Д бAxЄИ2yl╛╬ФхЁc[Ъ№м] 2?═■╧;+u+┼.ычiТJsеpЎ5'шzя║▓▌Э3╣Єх P3[├mKд8ёП▌+ Lq╗wx№╢A°╨Лг%_╓,biz┼щ┬╜ЮrZ] ╡{G]р■P█J▀kх═4█▀┬yБ╤Ю6еt7║фP▐╛А~▄хWХ╙р%$╗Ф~эЇ№┬╠╜1ЁУ-╣6╚┼╡pcсе┤ВЗ.─М▐иш│w,_>,eф№:лДvўJJ┘╡░(Pщ_^▒Cўъ B░╫щvj╤ 3■╟+Х{9█╛░;ц0B{√Wеў5w╔слЕyи╡a U~NВщё╗`∙aL3onю▀№уU$endstream endobj 215 0 obj << /Type /Page /Contents 216 0 R /Resources 214 0 R /MediaBox [0 0 612 792] /Parent 219 0 R /Annots [ 218 0 R ] >> endobj 218 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[1 0 0] /Rect [257.029 105.788 264.003 116.732] /Subtype /Link /A << /S /GoTo /D (table.1) >> >> endobj 217 0 obj << /D [215 0 R /XYZ 97.768 692.105 null] >> endobj 30 0 obj << /D [215 0 R /XYZ 97.768 667.198 null] >> endobj 214 0 obj << /Font << /F41 57 0 R /F38 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 223 0 obj << /Length 1967 /Filter /FlateDecode >> stream x┌═XMЧу┤▌чWdїОs Кe[╢лЮaz`0╨щy░Ё8Jт╙ОlgЪц╫sK%члЭi`zёN/"ыгtuлък╘rьуOОeаDв┬q╟"чЫ╤яг_~є╟ЛС?~3ЄEи╙ё=┌╛РZП7гP%BгП┐╦╤|ЇуH:S╙▐╓toь┼эhvжуXш$▀.╟2 DРаCе" х°vёЛўєD·╛g▓fЄ█эЫ╤л█╜┴=6Й(КЯ ▌┴▄#|AЛ8Н╟q ?I,╛∙tS/╠d°Z&▐№╩}ЯГUR─КV┬╫┴╙`e"БG ВХi(·x┌JФК0╢2 C%┬8╞Са\pEFBБ=▓╘йЮLБ0Є>Lbх 9ЩЖЇїлп№╫▀┐╩ў^m▓╝¤Ь█якт╫Ь╧цЯaЮ$ЖАc*е╨8'█╒>,∙Z┼gж&╥╗`эj╬ │(║вZ]╢,O╧Ж8<▒~к▌╕╖Э╪Н.┌Э¤ЇФ∙iт'ър)XUчv└я╟щ}Яu∙·2 ъмH░J╟ юьЖ╟2ЇО║ °▓▒A▄C йdM, ЖzДФ$├й>|$╠'ZЩЎШж*╓X9,AI$Р~cKq:Z▄╣╖&╗ы█]╓mWЇc─рл∙№гd@!гP=█1цЯ├ўЕ╜UСQмq|╗5MFэє╨vfГУ╚▐ЄоФюuХХ<|╜лr■.║ЗЛзЛФИ¤ е╜Gа.jп б|▌'[rТlJ°  ┘8┐d┌Hц╞~BB}[┤[ъ;╧бвър Ё; HFРМfX╥3`Тф&■жl═■7Йh│EM√▄╖ 5 ╙╨Ыf╩╓╪nр\Ы╞|╔ы╬Ц|ХФ@!Fи#Ї]╫┐Б8√.╦ЭbЕAzж:@ъP╛▌bm5Q^╢╬║h╚∙Ъ~>hv╩Woчї/zБ║╩{ў·▒ГЛХО╚ЫK5WддФ~оЪы╚\ЯZш8фЪ+Aд╞Hб}жыvТ·^Ў╛4 X:╕_CюъцБ;│j┴Нл*7mЗГ╫НS┬zщиЬ╧щА│ы'ЛDИкNq∙ %$)D.КьОt┴∙иC_╓U^юZH п┤E╦¤Ц(j┤¤ЕС╣╜Б|║V°1 э╔VM╢┘@Щ┼ъ{▀╨╞▒м,]ь╤╖Ў║╡с╞о5 O╔ы═╢4Эы╧ыкkъТЗШ# ╖9YoWmv`С┬;у┘жжлБЖў√ех8 ╕є~] ўЯц@D╤у▀╨k╖ЁБ╔ ▓i╖ЄNvФ┬щИ,ъYИ3gfQє═Еж[╪├я:{gПCЇ0'Їъ]З9ВКр─{aЄ ▄ё░ыНЫ{_tыв8[ |п═6╘bOЎ^у!SС\|(Ъ║┌ tP;@╥R╒─Щ3Фэ9Э╤╕YДА√╧╖ Ў9╧d├4ОЗ\╛▐├@ЬFW4╣┘v─дю9╥╩mБ╖║ю(-м┤>╕!є√╬P║SF∙▒Л<9MХ|┐F▒╟1гиЄ╞d8╪Пр k█▀Є╝}ьJпtKєЇfS№щФУ╗ЪGZ Ох├Аsа╨ЬЩ┼bgC'Ў=C╤РсЦ┐mВSу,∙йл┼┤ю┴Ж9}2=hф$*╘xoEQ3/tжZ7┼В#╗э╢n:ЮVУл] q■╙XЩUл]╢z┤ЧUТПf─uЫхw┤V H,╓с╔й╕в╣1K ░r╧=%л7Hчм▒@BяJ╨oDЩ┬▒╨PTS0╟Йўж^W<э;7эх:█╝7Mы&╕є└LY2{Сw#╕Лo╙ЄоЗG7RД0.{┘░─╩9/№╓rF`V▌й .!ЮЇ*╥: 7фа}Nbщл>'эЧ╙ ─n:9azc╒ЮXцPAу+лю|▀╗a ╛FрЁЦ█5╜ ё,QЙ√╥Л$(ж·К.┌E{OИ3k╢їWB4u}╫╬^╓е▒Кж╜ь,Ы╣█╖9ТvW░HЭжВП'UКr5jэєёЬч╥А=З▀▐s▐@=О╠s░/є #Nо╨"▓╚1:╡ОAЕ∙zWА√|┘LI{]Fc╬?ч╬}Lb Gе#8v╛m┴ ┼Ы■w"%оЦж╠V─ЖЎ╜я]ek╖°├Dї▌ч╬¤i,▐{╟ЄHе╢гП7 Пъ8┴┐=ygq; Х╫.┌У√▀╕e_╙90д╦8Bх▄│>?ь\/P░ўпўЬxLVJп▄Ё"ОB (╡Б ED╔rD╚MН├SН]╕╛╩rрHЙ▓oм'тИМ╪╥bя▐▌╘EO'б▒Oщ╟г▀а╕▒F;√4H8└Цar8Д▐uc █Ь╫╦╬▓`o_ъ╣&$їоZ╕"ВЕUY рz╕ZЛ╦Ш,-a*R'2ЫeхvЭЙU╡u│ЪсwfшDS-┤'BЛЯTRї░/║мл?B9╔>ЇЭ{В>┌ ?╪ўаu┴─;┬aДw5k╝М·w╟_ы Т╔endstream endobj 222 0 obj << /Type /Page /Contents 223 0 R /Resources 221 0 R /MediaBox [0 0 612 792] /Parent 219 0 R /Annots [ 228 0 R 229 0 R ] >> endobj 228 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [488.573 124.558 514.476 135.427] /Subtype/Link/A<> >> endobj 229 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 107.149 397.146 117.47] /Subtype/Link/A<> >> endobj 224 0 obj << /D [222 0 R /XYZ 97.768 692.105 null] >> endobj 220 0 obj << /D [222 0 R /XYZ 263.462 497.838 null] >> endobj 34 0 obj << /D [222 0 R /XYZ 97.768 457.823 null] >> endobj 38 0 obj << /D [222 0 R /XYZ 97.768 309.863 null] >> endobj 225 0 obj << /D [222 0 R /XYZ 97.768 258.918 null] >> endobj 113 0 obj << /D [222 0 R /XYZ 72.862 259.119 null] >> endobj 115 0 obj << /D [222 0 R /XYZ 72.862 215.283 null] >> endobj 114 0 obj << /D [222 0 R /XYZ 72.862 171.447 null] >> endobj 139 0 obj << /D [222 0 R /XYZ 72.862 145.545 null] >> endobj 221 0 obj << /Font << /F38 52 0 R /F41 57 0 R /F62 227 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 232 0 obj << /Length 2054 /Filter /FlateDecode >> stream x┌НX[s█╢~╧пЁSK═XЁъЩ╬┼Йзqъэц╠ЬЇв`Й5Ej▓к }w▒аDYLч╝ .Л▌┼╖▀.Ї■ё▌ьF&)K#yё°|С╞,ОТЛ(МЩРс┼уъ▐ВMж╥╜ющк* }^╫ї ЎOU+╩Tї\7+¤6I|OfйЫ O╝5Ы№ё°yvЙуa< Щ╛=g╛█ХЕv╗z°▐║Щ╚╪╙╞uEG▄Uy┘нКjM╦оыэоkЯMnс╠╨S╗MС:whдєyр╬єBzЯ┴╝zSсъЛйМS╞╣╝ШЄШеR╪u▀Pгв╘(∙u2бя¤DMVWцТ║єn▌ЩЦ·kчГp L▓ шч7m╗╗Ъ═Ў√=[WлЫї╠а~к┴█Яi<К~Эe<КXт╚S╥ ┘Ц#^Ч,хюч-с√▄╔СТ%ёйЛьv%н╜m╘FmGЬ&LИИ╛fw┤а▒E╘` Kavч сЗтИ∙▐Cгл╢╚5э√д╩ЄЄpЩQo▓МЩМГ]E╛Q}Сд▐=гЎУ.zЇCЖxHРD¤ЕсТlз╒K▀oс╛ Ьnо@°н╥4STнnЮ-Fr7Ї]ИШz[UїРДп]Sп╡5юи╗КЖ┼%]╙:┼ъж* zEъ█ШA│D╫x╙@86`hJя s╛╣D╒ ░WE[7А·sl·Qф▄·╨L└rо5н!Iї3╢Б╫n4uА╦Ж.Їя╨╓╩"_Х┤■█$^▌╝ШM╜гEЦ`ц°л)Цс{]лЭДГUщ.╠й4МцsИФ{▀¤╨ Р]УKЦ00Ki╚ВЁKvыу$фЫ ▌гI┬SULDш¤Е^╫Н)Zr▒╧8ЖєЙY┐░HCЯЕб─╞═иЦdчш ╜юsяўId?+scє]а▄коFГ<ВюHФчEАBX2"аэЎpS9Sэь║оЮ5ДGо═ sAv═╞ЭC╤iд▀e┘WHСЯNe■╫Э+|X-фв oг ┌O└╝▐y@ЙXz│М╓р5Ў╤ЯЗш┬~ █√│╖kЗХЫV╘t█─R▐0ьа╙╓N┌<ё▓pГoЬ 9иTж[ўnцX3t3▓,qШ5c╨▒#~Е"=:VЖС╜Ё%╕!Т╔╦}┘╪БYHjи.╢и─JЧаМв0А:O`ё╧шKC▀╖M▌эЬЁп5ШP╝E╧S89=Жс─┼9еЯ'╜Em╨▌1Ё╥F╜(ъ┌д-тfсИЦo┴ОЄLЕ<@=pEуsjJUн;╡╓ЇEIАДyк╩WSШУ#"((и&I#RBNэQ√г╖юKA╕) [в 5эcЎдзЧ┘:Г╬╡╔ыPПЇs=K╚╞jсДщiЕW"MБ∙#╔Г▒╝[ =~WЩb╜iЯ√,z]7;Чъ▓щC┘6VPе=*hu &$ш-tйХq╔1b■╔ЭУPнZ╕87ёm┬БЩчWЇuп┌MИЄЮ[╥╪?Qї~Ї▀╡9дB>m╟ъ ||( ▀лWm ╚Жv╦▓Х-+ ▐р№d,▀уьm▒\═╘ ╧~ф=Z¤tЫНч┴┼ VPЕ,сщ9╒ЎЕ,LO жmУOсx▀[ЪОхPхуv/│e╖6│╜."їV3єГ┬ М▐ЦVИ D╩ 8; √║ЕтvAл?шc║*ы▌вяАw▌Фц░│э6Вl>@┬oyЛA|АЕpлЯ_╬¤$l─Н8jA╬АRцOЭ╖╢ Р║00╕pn"С]╕Ъ│╧иЕL@g(ёс1QЧд╓╜jа└╔╪╗з2Л +EчЫ,Е№l╔rXbсYTb╣йC>├Щ{╨┬)tZ E╤;5оWU р@%чnc╢S└dк*Р∙aх<лg░8МNр╒з┴└SdF"EF 0ёЭV,H╕№MхЙCЦmqЛ╘Yvж']P*ЙЗЕQОй╖д] ╜л╤I╕Б╟,┬СВщ╡gИaЮ|жт╙>-Х┘@╨╢6╙┴╦H9Є╩хЄШО▐ДhР░ШЛsш-їТиao│|]╠@ц_Е▐ч5°бj ¤╟СнУ0LВИж╝╘┐p■Ov╦▀э/▌~YX▄Бj#(ЖGИё)КyТ2╠пg цids(!*'B0V╧4y▀╫Щй┤ufРОаXX╗йг─#МQаЕ1╚q│$█╙ЬJc0╞┼╞дє╞°=w│гGЄ╜CJЗ(√g.y╕ыXфQ╠З▒еС1─CQ;@№8Я╟PР%№╟tЮ0Щ$чH▒`GйlПP─;@42╜ъfлz_Х╡Z┴S┘Шюiп▌a%pGЧюя0aзk\╩жB:лгЙФВу▐·═Ц╝kЪ╔7├┤n+h▒ ¤QgЛG[╓Wр╪Ю^¤gОХ@yi|n│Гаnлё▒Ь o~x(P▓k╕╝Аw ╝нa═T╨_0>ЬPьєp$ВьS╔"N▓╠╔*и╫БV·?Т╦с_46\лцuЕ}■№ N╗v¤зм/a■╒pzpqИ┼^Ь U╞Vчw▀¤йЬ endstream endobj 231 0 obj << /Type /Page /Contents 232 0 R /Resources 230 0 R /MediaBox [0 0 612 792] /Parent 219 0 R /Annots [ 234 0 R 235 0 R 237 0 R 238 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 246 0 R 247 0 R 248 0 R ] >> endobj 234 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [273.38 610.869 514.476 621.19] /Subtype/Link/A<> >> endobj 235 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 593.066 132.638 603.258] /Subtype/Link/A<> >> endobj 237 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [428.797 504.742 514.476 515.586] /Subtype/Link/A<> >> endobj 238 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 487.462 305.988 497.654] /Subtype/Link/A<> >> endobj 240 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [416.842 460.807 514.476 471.751] /Subtype/Link/A<> >> endobj 241 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 442.874 234.257 453.818] /Subtype/Link/A<> >> endobj 242 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [446.73 329.4 514.476 340.269] /Subtype/Link/A<> >> endobj 243 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 311.99 324.418 322.311] /Subtype/Link/A<> >> endobj 244 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [328.641 285.465 480.571 296.408] /Subtype/Link/A<> >> endobj 246 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [255.447 223.696 514.476 234.64] /Subtype/Link/A<> >> endobj 247 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [106.735 207.796 288.055 216.518] /Subtype/Link/A<> >> endobj 248 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [185.304 162.027 486.176 172.897] /Subtype/Link/A<> >> endobj 233 0 obj << /D [231 0 R /XYZ 97.768 692.105 null] >> endobj 122 0 obj << /D [231 0 R /XYZ 72.862 675.168 null] >> endobj 126 0 obj << /D [231 0 R /XYZ 72.862 631.333 null] >> endobj 140 0 obj << /D [231 0 R /XYZ 72.862 587.497 null] >> endobj 236 0 obj << /D [231 0 R /XYZ 72.862 561.594 null] >> endobj 239 0 obj << /D [231 0 R /XYZ 72.862 481.893 null] >> endobj 117 0 obj << /D [231 0 R /XYZ 72.862 420.125 null] >> endobj 116 0 obj << /D [231 0 R /XYZ 72.862 376.289 null] >> endobj 124 0 obj << /D [231 0 R /XYZ 72.862 350.386 null] >> endobj 118 0 obj << /D [231 0 R /XYZ 72.862 306.55 null] >> endobj 245 0 obj << /D [231 0 R /XYZ 72.862 280.648 null] >> endobj 112 0 obj << /D [231 0 R /XYZ 72.862 200.946 null] >> endobj 119 0 obj << /D [231 0 R /XYZ 72.862 139.178 null] >> endobj 230 0 obj << /Font << /F38 52 0 R /F62 227 0 R /F45 63 0 R /F13 84 0 R >> /ProcSet [ /PDF /Text ] >> endobj 251 0 obj << /Length 924 /Filter /FlateDecode >> stream x┌mUMo█8╜чW°┤аА5CR"%ццMУEГЇ╡╤v▒▌#╙6I(9n■}З^╦И/┬p8Ьyє°8·kuu}ЯW3Йе╚gл═LЦ╕╒LЁ│Ь╧Vы╤rTг║╡о╟┘<$о│9у `Ъa4╡j└QH4╪═x╚(A╩щыЛn┤t=¤ДичЯЬъuЇ▀Ey┬ЦqYJ *Н{AД╞rк@яИ:∙┼e╨И7▐╜vк5ulП,`,ъ,v7╤╨╜фO7^їГ▌uС╕oиi┴їGRРэЖ─ющ]┴тЯМХ╓=зM ]JyTW!p%Л3Єя}nыЬ╞8u╛eТ$Ї l√n щrиЄ┼╘;хаєЬH┤HQ!Еj╓6рЮM ∙А╩╜&+∙P╟CоQЭч }═аwxБ·?fZ─ш3ь¤5x{8=╛░рZ╣zМ┤N_y|╩Lаu`щ┼W╒НэуН√Н:i╨╨4й╨√юн▄(-0лОПj"ЯaYГ║jй ЯL w>G▒╒ZпсшЭa y╗tЮ.╦KФP/_[ШФЮФ}ЫtiP$DSйН╟Aё─ю6 0╜'X0y■>{╡╒╟┴КPЖх9Юж ?ж:eПТ┘wkШўЁЖlыqа~┤n▄Es╤jчGgX°!o▌дД┐.¤┤╛f└b2-йФ, Ш ЪЖ.╝r╛ *№▐╒▌ъъ7бe∙Сendstream endobj 250 0 obj << /Type /Page /Contents 251 0 R /Resources 249 0 R /MediaBox [0 0 612 792] /Parent 219 0 R /Annots [ 253 0 R ] >> endobj 253 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [236.477 584.344 363.999 595.288] /Subtype/Link/A<> >> endobj 252 0 obj << /D [250 0 R /XYZ 97.768 692.105 null] >> endobj 120 0 obj << /D [250 0 R /XYZ 72.862 675.168 null] >> endobj 125 0 obj << /D [250 0 R /XYZ 72.862 649.265 null] >> endobj 127 0 obj << /D [250 0 R /XYZ 72.862 605.43 null] >> endobj 121 0 obj << /D [250 0 R /XYZ 72.862 579.527 null] >> endobj 123 0 obj << /D [250 0 R /XYZ 72.862 535.691 null] >> endobj 249 0 obj << /Font << /F38 52 0 R /F62 227 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 256 0 obj << /Length 1113 /Filter /FlateDecode >> stream x┌╡VKoу6╛чW°(M=-╣ЧMЛ,┌вшac,Plzа%┌&*ЙкHEё■·╬pиН╜N{ы!сh8├∙цэwwыПY╝К3Цf┼jwXU╢)╩UСoXТцл]є%xгШsgТ├ √F╜n├(НyЁ°ЇFI╬ГO╥шi у2ие!Цющ┤'I─/╜Х Т╜┤сЯ╗_ЭхКUEКЖ∙*JJЦdЩ│∙Ы░╥X╨+лрsцT М╥=#▌┤|╙▌dМW%<БкД Ї)СюН╜m╧Ю▀ ЩєtzeaФ%EЁ╗DяfТxAФrDk■ }аx╚*cU-Z║D¤Ч8JsЯU╞┤{zхуIЎ╡я╙йзв╕з╧Лf Жл$Ў^Aя▓кЧН┐8╙)z╨эsз'?~·№─И·иF╫с8"╬Г▄~ Z ╛║YSйВyp┘)їЛ┴bцA╘╨╣М_ф╕u╢в%>└▀uс\T═v¤"╞їЕ4╜╙ъ#╠ЕЫp_ЧЇa COOДzVm{(Пn░KzЇaЁ╖┬`╧!╛1zб∙д ═ОT>D╧IТ╛МК│<╧|т?b┐ЬnXС/%/eМ&5ФH Я┴О┐ёuU№oсо5Э╨╖л ZЯ&,чДфбiФЕ─╣ЫЄ8h Т║Ю░кЕ}+─р|V-▒xшIQbA╛0Э1O) о└Q─═<╛L.` гДV╖■C└<'╠▓ФW|ц9 дНQоW▐ЮW-╗'нДє$c▄НДi╪.┐Г╛╜нgиnА\╪╞)спg╣МХЕC%+Pэ▀▐Д@║X%<БЭЧCяd Лл┬!М7xwў╕╗√УОпendstream endobj 255 0 obj << /Type /Page /Contents 256 0 R /Resources 254 0 R /MediaBox [0 0 612 792] /Parent 219 0 R /Annots [ 259 0 R 260 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R ] >> endobj 259 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [157.453 589.973 458.325 600.916] /Subtype/Link/A<> >> endobj 260 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 1] /Rect [215.357 572.04 415.108 582.984] /Subtype/Link/A<> >> endobj 262 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [416.701 467.806 471.459 478.819] /Subtype /Link /A << /S /GoTo /D (cite.RMHHS:2001) >> >> endobj 263 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [474.953 467.806 496.87 478.819] /Subtype /Link /A << /S /GoTo /D (cite.RMHHS:2001) >> >> endobj 264 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [342.897 449.873 384.541 460.817] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:dsc:2001) >> >> endobj 265 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [388.038 449.873 414.379 460.817] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:dsc:2001) >> >> endobj 266 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [268.085 431.94 309.729 442.884] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:philasugi:2001) >> >> endobj 267 0 obj << /Type /Annot /Border[0 0 1]/H/I/C[0 1 0] /Rect [313.109 431.94 340.008 442.884] /Subtype /Link /A << /S /GoTo /D (cite.heiberger:philasugi:2001) >> >> endobj 257 0 obj << /D [255 0 R /XYZ 97.768 692.105 null] >> endobj 42 0 obj << /D [255 0 R /XYZ 97.768 667.198 null] >> endobj 258 0 obj << /D [255 0 R /XYZ 97.768 644.005 null] >> endobj 261 0 obj << /D [255 0 R /XYZ 97.768 487.511 null] >> endobj 254 0 obj << /Font << /F41 57 0 R /F38 52 0 R /F45 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 268 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro 129/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 227 0 obj << /Type /Font /Subtype /Type1 /Encoding 268 0 R /BaseFont /Times-Italic >> endobj 269 0 obj << /Type /Encoding /Differences [ 0 /minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft 129/.notdef 161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus 171/.notdef 173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade 197/.notdef] >> endobj 83 0 obj << /Length1 775 /Length2 650 /Length3 532 /Length 1210 /Filter /FlateDecode >> stream x┌SU ╓uL╔OJu╦╧+╤5╘3┤RpЎ О4W0╘3рRUu.JM,╔╠╧sI,I╡R0┤┤4Tp,MW04U00╖22┤25тRUp╬/и,╩L╧(Q╨p╓)2Wp╠M-╩LN╠SЁM,╔H═ЪСЬШгЬЯЬЩZRйзрШУг╥QмФZЬZTЦЪв╟ehиРТЩ\вРФЪЮЩ╟еrРg^Z╛В9D8е┤&UЦZT tФВ╨СЪ @'жфчхT*дджqщ√хэJ║ДОB7▄н4'╟/1d<(Р0дs3s*б Єs JKRЛ|єSRЛЄ╨ХЖзB▄цЫЪТYЪЛ.ыYТШУЩьШЧЮУкаkhвg`l С╚,v╦мHM ╚,I╬PHK╠)NЛзцеа;z`Зш;Е╕·°EjCb,РШЩWRYРк`АP ц"°└0*╩мPИ6╨300*B+═.╫╝ф№Ф╠╝t#S3Е─вв─J.аQFжж ╒Ж Щy)й й@ыыххЧ╡(CжV!-┐И йЖ╞ ·╔ЩE╔9й╔а8+╔ra·╞╔)┐вZШЄt-M  НLН╠-МjQЖцeЦжz║(ШXB<Ь\ZTФЪWNE└РВё╙2БбЫЪZСЪ╠uєZ~▓uK╓Їmm+ы\_X┼к╧∙є─┌Ч7┘DьиЫЭЩRl:/P1╜d╔лЕП╢Ў╧╛(сХl=U╕hЛdп_O▄ЧE┬k╢v-X1б┴t┐▐Н`ё╩цоi╝ ┤╒_y. Ы1зїС┤╒■в╟│:Хun~Qо?┴3/хЕS╘т}▀я]у╥ Ъде$e~s√]F1ё╩╗╧/z╩эO]┘3 ╤╞є╜EQТЮ¤^ ЯYь^╢Q╣э°gэ┼╫ЇI\▌фўLш╨!~ч│╓y?hKDgъVля;о╔ў■╬O¤йw_d▄уцf|№f╟чgВ√╕■81╟·`╢йОЙєъ№┤╕5q╣ныХъ-█a╖ъ▓KЇж_jС╗ХV^,Хu■ ўъПМY│uU~5╝Шg!'╛Ї╔┤фm,ж╫ч░м?н╛▐╨└їZ╪Ч─╔О3жw╠║#huьєєВл╖=xсб─жп╘d'z░я┘SA =┘ёПНєLчй{╡щ] МsзПk+$оh┤>█f▓зs│╪║Ы6F╞∙вЯШ█з ╩Z╝═ю є╛#_x╧qk╔tN┌╙Я┤┐u╙╟&│+Х╤b╗6▄щфьR√=-─%<Фы╔T│╡-gZ№Oи╝}·Jд╚╓╟пy│О▌MПт┤nо╢r┌c╘єэ╙▀Л√_х▀ЩuЁ·бM&ЧЭОTэ цy,ЄЕє 7O~╓╓гF-ьлдм8LoИк(╬ Р╓Yь▀<Э┘╠┼p╔L#юOТЧкuЯфzn@!р5`X, ЛJЄsЛ▓╣LРЩYendstream endobj 84 0 obj << /Type /Font /Subtype /Type1 /Encoding 269 0 R /FirstChar 13 /LastChar 13 /Widths 270 0 R /BaseFont /BTELNY+CMSY7 /FontDescriptor 82 0 R >> endobj 82 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /BTELNY+CMSY7 /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [-15 -951 1252 782] /Flags 4 /CharSet (/circlecopyrt) /FontFile 83 0 R >> endobj 270 0 obj [1139 ] endobj 63 0 obj << /Type /Font /Subtype /Type1 /Encoding 268 0 R /BaseFont /Courier >> endobj 59 0 obj << /Length1 773 /Length2 733 /Length3 532 /Length 1294 /Filter /FlateDecode >> stream x┌эRkPSGmuи5ZA╤Bг7@МJє╕Де&5Є4╝е>.ўn╚Еф^╕╣БDЖЗв вQСV|D╘ О°*н"╤▒*B-Z─╥йTF╘Z|UлвК╙иу╢┐:▌¤│▀Ю│g╧Юo∙╝иhбзТсКdДИ кЁшD?АИ$>_ECФ!(r6╩└@А╚хPШR" @$Pъ╦сХnбЙжкж9H■@aА4Бб$G4░к╤F@╞" ╜h'М@НР╬Д╕ИГ '0$├ВфИЖ╘дЦ■Г█╕)¤5Ф i#k LeMNмEЬ"їАC-GA▒wA╓╔┐ajи°У^БЄОР▐ВQб╖№Eа щ&╥ Ь┬!Mе╞├Aoс'LЖбиЪAїж SЇ_СD*у┬ ё(В┴t@ЛъНp`Т°P+lzF─1ъ░Р╚pя┴о`Q(A21Цt$o╚5Єжf3в 3HТИ$Д%▓єїj╤Р╗BHМ┬ 2°╚№J╙иЕ#aе|d2РНВ─б@3kX,")Ж=╪drАЦв9ОжJБ5▓I╞4╢':╚y√1J%e╬·б▄7 R9ЁЁ╦∙;/Ц$2LP=╚$I2°\╠D╙Рd■Ы╙ыZK░┘BhЖзнХ┬ВVжЦ-м╩ ┘¤у>'ё╚▐╞Гw┌FЬN░чn#ЁЬhY∙^ Sqw╫НЪuїni-ює▒а/\щ#Y#╓.ю■╥ї@Mё╬= ЄeзDЧг▌,┼Ы>xх-╕ло╧И█l[ucbр)·ц╓╒ЮЯ┤u{ц5О.╟o+ю>┘╙▐:j▄t═╞щ\ ╢╜#о╜√бЫхZ╫еЧy# ╩У4╡KeW╞7╔Z╒╧ю┴ЙY.╛╟G╦пXХй^1┴▌Ъrai ┐f│B╖nC╚/ё№╛░y█╦>VТu/╗{┴}ЄгK4▄░Yк3УГ3&∙ФT)Вg╫lыТ H^║ EqEKЄL74їt╟╟HL╡ √6/├╗ы░tUWЕ╦тї╥Ї▐хЎWх3Юt╛У╜vЗ░4╥ыRI╜d^NЗЫэ■}MBCnиOЇ·╧Лл▀3Ў^RЯ╦и^т╦Ч:╫▌м╝х>╗й╪dП┤Ш╬Ь2жe┬w¤▒╬╤═▒LPTuom├s┐Ўї╒VЄф╢зЙ?=p╩hО9╘АyЕ:п█_╛щўoх|[▌л:ч╣/тvп*j╞Ф#╫gё GЁD╫пV№б═Ю0╒Ї═┼Е бегКК/lН╒ЄХЮ /Л╞Я▀▀%H¤z╦ е-,и^ръТъЄЇС>?д2┐Ёп╦Ф▐╫9╙:╖fЯы▐х?Ы=ЕнЛN┤▄█<╢a╓═dMn╧зН╘o°Б▀єп╢цы√K╜█п│█<║=╖xи_zЯ╪ї$Б"═▓*уў▄4╫Ё)╣╟kуye▄1l{ХhR╨tкFs╛ Wu&[█ЪЙ;┬Э╟ь╛ЄSЇqЄ╞N▒>╧╓65╡Э{VW░ж9wM▄╬kЧ чЄxKх√y¤ЎгP`╧│d╒sc:гЇщ╜s├Vrkэ┐$5╝%╖8=╙ъ╬F═╪╙VWqнТ88  №'0=DiЖ2аtчO!Ц┼╟endstream endobj 60 0 obj << /Type /Font /Subtype /Type1 /Encoding 269 0 R /FirstChar 3 /LastChar 3 /Widths 271 0 R /BaseFont /TILEOM+CMSY6 /FontDescriptor 58 0 R >> endobj 58 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /TILEOM+CMSY6 /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [-4 -948 1329 786] /Flags 4 /CharSet (/asteriskmath) /FontFile 59 0 R >> endobj 271 0 obj [639 ] endobj 57 0 obj << /Type /Font /Subtype /Type1 /Encoding 268 0 R /BaseFont /Times-Bold >> endobj 54 0 obj << /Length1 774 /Length2 713 /Length3 532 /Length 1270 /Filter /FlateDecode >> stream x┌эRkPW-:╩РXEEcеХ HЛbТ▌─%$В╩├МAAЮ╦юMXHv├fГIдв-ИкmнвМн,┼:TQQиП5V─т╡вїE[u░DDэъ8┼ЯэпNя¤s┐{╬=ў▄є]?яШxq(╔дA5CsbTВк@xT№в АJБЯ_8 qОbшЬГ*А*Х(5ыКDбТ╔T(OсМ╤╩R║t°ЗOqТ ╘YК└iЕsщ╨└k╕─39лДъї ╬y┬та ▓┘РФPР┴Б4игhБ╘iHCkа╪&═╞ЧP6dM╝)р╧ЫЬxЛ$CынАДZБ4ЪсяВ╝У├╘`q╡YпП╞ NygHп┴╕Б╥[ "0гЩГ,ИbH╚╥Гйя├oQРд╠Ж┴иЖ├їJыЇИ╤щDО ФIMY CqD:╨тzь▀З49╪ Я^┐щ╝╕╪д╚y]э╟bpКцмFРWф■}Uє▒Фд Ay"?_о║kM0$EыА 8╦тV┬K╔0 м@EУ╨аЕ7,Х╨ ╟|29@╦░gSх@КЫ°д(S&▀Уt'(x¤1aaМeЕXО▒Т╫E╤ (╩Ь┐i*╦ 5C$x/afYHs¤ЯИъeне°p!┤@B╨▐╩3╓dl=°╤7╣sv7WУ║=i┌{╖▌╡1й6╖Д"sт▒╥XoWvя╦5ПЛ2/LИ$f|6Ц=Ё╓ЖшїK║┐[U│nWyRq╓ ╣/▓цп√№═чя▌╙╧Z°┼О╡7.?чХў╕г╜┼зк·Ш№▌ ШAдFN~√Ььь3Gаlxmeр╧о╦kЁ╤╫Oi▄Зь{─▐дmъ0щ╨╝ц-■sНC№|Я^Н╖-РL;sщбйя(▌Q╦эїK╜tл╤СцбЬuvi*╪PS@Ў█╝чл~╪27Y}╖%а L°Їж=╣гфб-їПп]Д кД╫пЗ╘╒A│ыРq=Т╪╬·╝qDAЭ#8G)▀\_я│<ы▄┘нЇ─-0\1▌?-*¤▐|L8v╓дEХ% ЛиоєН┼├DCЩN{cIC╗в>yЗ░░0rQFбоfЁЬ]4■nv[]Esф╤їX\|d┐r¤╫3вй\(Xf┤OЇ=крЇ┼√^HїъЩ#+'b&╒Eя_ф╥Оeь│>4tЄ·╢У?▐Щщв+ЯUXu║∙╤Йf╤mУ6їPп╡┼mr$ЩRг%нc╩[╢i╝.z}8 LkВ╡╞№'yM╫2Bь!с┘вЄЭ3У^▄Yъ╬фовcь-KdЫ>╚>ДXЎ/Ыk╗·]/╖ўщv╜*yфСє5[=яИ░┐6фTShrз(r╛П[╖√J▀7F┌жн>yглL\$я^C╫╞d/╢▌┌g]2щ╖g'°l┼пfV°ўZv╥hUb╫є$ЎО [ЕЧ*▓иА╟Л╢▐юв░mзЖ8┤К?Qt~Г█СъBф┴   BqЦc 8Ы)°=│╛╪endstream endobj 55 0 obj << /Type /Font /Subtype /Type1 /Encoding 269 0 R /FirstChar 3 /LastChar 3 /Widths 272 0 R /BaseFont /KRQXJK+CMSY8 /FontDescriptor 53 0 R >> endobj 53 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /KRQXJK+CMSY8 /ItalicAngle -14 /StemV 89 /XHeight 431 /FontBBox [-30 -955 1185 779] /Flags 4 /CharSet (/asteriskmath) /FontFile 54 0 R >> endobj 272 0 obj [531 ] endobj 52 0 obj << /Type /Font /Subtype /Type1 /Encoding 268 0 R /BaseFont /Times-Roman >> endobj 69 0 obj << /Type /Pages /Count 6 /Parent 273 0 R /Kids [46 0 R 71 0 R 129 0 R 142 0 R 150 0 R 156 0 R] >> endobj 180 0 obj << /Type /Pages /Count 6 /Parent 273 0 R /Kids [167 0 R 182 0 R 190 0 R 197 0 R 203 0 R 209 0 R] >> endobj 219 0 obj << /Type /Pages /Count 5 /Parent 273 0 R /Kids [215 0 R 222 0 R 231 0 R 250 0 R 255 0 R] >> endobj 273 0 obj << /Type /Pages /Count 17 /Kids [69 0 R 180 0 R 219 0 R] >> endobj 274 0 obj << /Type /Outlines /First 7 0 R /Last 43 0 R /Count 7 >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 274 0 R /Prev 39 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 274 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 274 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 274 0 R /Prev 15 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 15 0 R /Prev 23 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 274 0 R /Prev 11 0 R /Next 31 0 R /First 19 0 R /Last 27 0 R /Count -3 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 274 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 274 0 R /Next 11 0 R >> endobj 275 0 obj << /Names [(Doc-Start) 50 0 R (cite.BUGS) 124 0 R (cite.BecRCW88) 113 0 R (cite.ChaJ98) 115 0 R (cite.ChaJH92) 114 0 R (cite.Cook:Weisberg:1999) 122 0 R (cite.DTLang:2000) 125 0 R (cite.ESS) 112 0 R (cite.GNU-Emacs) 126 0 R (cite.PGraham:1996) 140 0 R (cite.R) 118 0 R (cite.RChassell1999) 139 0 R (cite.RMHHS:2001) 245 0 R (cite.SAS:8) 119 0 R (cite.Splus) 116 0 R (cite.Stata:7.0) 120 0 R (cite.Tier90) 121 0 R (cite.XEmacs) 127 0 R (cite.heiberger:dsc:2001) 236 0 R (cite.heiberger:philasugi:2001) 239 0 R (cite.ihak:gent:1996) 117 0 R (cite.youn:fald:mcfa:1992) 123 0 R (figure.1) 148 0 R (figure.2) 163 0 R (figure.3) 172 0 R (figure.4) 175 0 R (page.1) 49 0 R (page.10) 199 0 R (page.11) 205 0 R (page.12) 211 0 R (page.13) 217 0 R (page.14) 224 0 R (page.15) 233 0 R (page.16) 252 0 R (page.17) 257 0 R (page.2) 73 0 R (page.3) 131 0 R (page.4) 144 0 R (page.5) 152 0 R (page.6) 158 0 R (page.7) 169 0 R (page.8) 184 0 R (page.9) 192 0 R (section*.1) 132 0 R (section*.10) 186 0 R (section*.11) 187 0 R (section*.12) 188 0 R (section*.13) 193 0 R (section*.14) 194 0 R (section*.15) 195 0 R (section*.16) 200 0 R (section*.17) 201 0 R (section*.18) 206 0 R (section*.19) 207 0 R (section*.2) 133 0 R (section*.20) 212 0 R (section*.21) 213 0 R (section*.22) 225 0 R (section*.23) 258 0 R (section*.24) 261 0 R (section*.3) 134 0 R (section*.4) 145 0 R (section*.5) 146 0 R (section*.6) 164 0 R (section*.7) 177 0 R (section*.8) 179 0 R (section*.9) 185 0 R (section.1) 6 0 R (section.2) 10 0 R (section.3) 14 0 R (section.4) 30 0 R (section.5) 34 0 R (section.7.1) 38 0 R (section.A) 42 0 R (subsection.3.1) 18 0 R (subsection.3.2) 22 0 R (subsection.3.3) 26 0 R (table.1) 220 0 R] /Limits [(Doc-Start) (table.1)] >> endobj 276 0 obj << /Kids [275 0 R] >> endobj 277 0 obj << /Dests 276 0 R >> endobj 278 0 obj << /Type /Catalog /Pages 273 0 R /Outlines 274 0 R /Names 277 0 R /PageMode /UseOutlines /URI<> /ViewerPreferences<<>> /OpenAction 45 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) >> endobj 279 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.10b)/Keywords() /CreationDate (D:20031110163600) >> endobj xref 0 280 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000051 00000 f 0000000009 00000 n 0000013240 00000 n 0000073226 00000 n 0000000054 00000 n 0000000084 00000 n 0000013298 00000 n 0000073140 00000 n 0000000129 00000 n 0000000153 00000 n 0000023491 00000 n 0000073015 00000 n 0000000199 00000 n 0000000235 00000 n 0000027279 00000 n 0000072941 00000 n 0000000286 00000 n 0000000330 00000 n 0000037261 00000 n 0000072854 00000 n 0000000381 00000 n 0000000423 00000 n 0000043120 00000 n 0000072780 00000 n 0000000474 00000 n 0000000515 00000 n 0000048995 00000 n 0000072692 00000 n 0000000561 00000 n 0000000594 00000 n 0000051847 00000 n 0000072604 00000 n 0000000640 00000 n 0000000669 00000 n 0000051907 00000 n 0000072516 00000 n 0000000717 00000 n 0000000746 00000 n 0000062550 00000 n 0000072441 00000 n 0000000792 00000 n 0000000850 00000 n 0000003449 00000 n 0000004772 00000 n 0000000900 00000 n 0000004654 00000 n 0000004713 00000 n 0000000056 00000 f 0000071859 00000 n 0000071627 00000 n 0000070083 00000 n 0000071471 00000 n 0000000062 00000 f 0000069993 00000 n 0000069762 00000 n 0000068194 00000 n 0000069606 00000 n 0000003611 00000 n 0000000226 00000 f 0000068107 00000 n 0000003788 00000 n 0000003957 00000 n 0000004125 00000 n 0000004296 00000 n 0000004476 00000 n 0000071950 00000 n 0000013357 00000 n 0000007378 00000 n 0000004890 00000 n 0000013181 00000 n 0000007755 00000 n 0000007905 00000 n 0000008055 00000 n 0000008210 00000 n 0000008365 00000 n 0000008519 00000 n 0000008673 00000 n 0000008826 00000 n 0000067874 00000 n 0000066388 00000 n 0000067716 00000 n 0000008979 00000 n 0000009131 00000 n 0000009280 00000 n 0000009431 00000 n 0000009591 00000 n 0000009751 00000 n 0000009898 00000 n 0000010045 00000 n 0000010196 00000 n 0000010347 00000 n 0000010499 00000 n 0000010654 00000 n 0000010810 00000 n 0000010963 00000 n 0000011116 00000 n 0000011281 00000 n 0000011446 00000 n 0000011611 00000 n 0000011778 00000 n 0000011945 00000 n 0000012097 00000 n 0000012249 00000 n 0000012406 00000 n 0000012564 00000 n 0000012720 00000 n 0000012876 00000 n 0000013028 00000 n 0000057744 00000 n 0000052028 00000 n 0000052150 00000 n 0000052089 00000 n 0000057501 00000 n 0000057440 00000 n 0000057623 00000 n 0000057805 00000 n 0000059340 00000 n 0000059522 00000 n 0000057135 00000 n 0000059583 00000 n 0000057562 00000 n 0000059401 00000 n 0000057196 00000 n 0000059462 00000 n 0000017025 00000 n 0000015985 00000 n 0000013451 00000 n 0000016781 00000 n 0000016842 00000 n 0000016903 00000 n 0000016964 00000 n 0000016140 00000 n 0000016301 00000 n 0000016462 00000 n 0000016622 00000 n 0000052211 00000 n 0000057257 00000 n 0000020337 00000 n 0000019872 00000 n 0000017108 00000 n 0000020154 00000 n 0000020215 00000 n 0000020276 00000 n 0000020003 00000 n 0000023429 00000 n 0000023551 00000 n 0000022786 00000 n 0000020432 00000 n 0000023368 00000 n 0000022925 00000 n 0000023147 00000 n 0000027400 00000 n 0000025949 00000 n 0000023646 00000 n 0000027156 00000 n 0000026112 00000 n 0000026335 00000 n 0000026557 00000 n 0000026782 00000 n 0000027217 00000 n 0000027339 00000 n 0000027007 00000 n 0000031611 00000 n 0000029945 00000 n 0000027495 00000 n 0000031304 00000 n 0000030117 00000 n 0000030340 00000 n 0000031365 00000 n 0000030562 00000 n 0000030783 00000 n 0000031427 00000 n 0000031004 00000 n 0000031489 00000 n 0000031154 00000 n 0000031550 00000 n 0000072064 00000 n 0000034634 00000 n 0000034217 00000 n 0000031706 00000 n 0000034329 00000 n 0000034390 00000 n 0000034451 00000 n 0000034512 00000 n 0000034573 00000 n 0000037320 00000 n 0000036905 00000 n 0000034729 00000 n 0000037017 00000 n 0000037078 00000 n 0000037139 00000 n 0000037200 00000 n 0000040359 00000 n 0000040064 00000 n 0000037403 00000 n 0000040176 00000 n 0000040237 00000 n 0000040298 00000 n 0000043240 00000 n 0000042886 00000 n 0000040454 00000 n 0000042998 00000 n 0000043059 00000 n 0000043180 00000 n 0000046051 00000 n 0000045756 00000 n 0000043335 00000 n 0000045868 00000 n 0000045929 00000 n 0000045990 00000 n 0000049055 00000 n 0000048652 00000 n 0000046146 00000 n 0000048934 00000 n 0000048784 00000 n 0000072181 00000 n 0000051785 00000 n 0000052272 00000 n 0000051185 00000 n 0000049138 00000 n 0000051724 00000 n 0000051967 00000 n 0000000000 00000 f 0000064638 00000 n 0000051325 00000 n 0000051525 00000 n 0000057866 00000 n 0000054514 00000 n 0000052380 00000 n 0000057074 00000 n 0000054734 00000 n 0000054924 00000 n 0000057318 00000 n 0000055116 00000 n 0000055311 00000 n 0000057379 00000 n 0000055506 00000 n 0000055691 00000 n 0000055876 00000 n 0000056068 00000 n 0000056262 00000 n 0000057683 00000 n 0000056435 00000 n 0000056655 00000 n 0000056876 00000 n 0000059644 00000 n 0000058978 00000 n 0000057974 00000 n 0000059279 00000 n 0000059110 00000 n 0000062732 00000 n 0000060933 00000 n 0000059740 00000 n 0000062489 00000 n 0000062610 00000 n 0000061121 00000 n 0000061319 00000 n 0000062671 00000 n 0000061500 00000 n 0000061658 00000 n 0000061815 00000 n 0000061981 00000 n 0000062147 00000 n 0000062318 00000 n 0000062827 00000 n 0000064731 00000 n 0000068082 00000 n 0000069969 00000 n 0000071835 00000 n 0000072290 00000 n 0000072367 00000 n 0000073298 00000 n 0000075039 00000 n 0000075078 00000 n 0000075116 00000 n 0000075342 00000 n trailer << /Size 280 /Root 278 0 R /Info 279 0 R >> startxref 75497 %%EOF ess/doc/font-incor-s.gif0000664000175000017500000003233112423756516013513 0ustar eddeddGIF87avў?? / ///?? 0000?0???@?`@@/@@0@@?PP?`P o/oo?@@@@O@OPOPPPP_P____`_``OooOpp@ppOOooP``_oo_```oo`oooppppАoАp0ААPППPРР`ЯЯ`ЯЯoААpААРРpппo0OЯ┐АААПППРРРЯЯЯаааппп░░░┐┐┐╧╧П▀▀П╨╨Р▀▀Р▀▀ЯррРяяЯ└└а╨╨░яяаяяпЁЁп  прр┐ЁЁ░ЁЁ┐  ┐╧╧╧▀▀▀ЁЁ└  └  ╧  ╨  ▀ррр  р  яЁЁЁ   !∙,v@ йH░а┴Г*\╚░б├З#JЬH▒в┼Л3j▄╚▒г╟П CКI▓д╔У(Sк\╔▓%BT╝ Т#Ц,W▓4Aт$ )R░T"eЙР5У*]╩┤й╙зPгJЭJ╡к╒лX│j▌╩╡л╫п`├КK╢м┘│h╙к]╦╢н█╖pу6їBeж▌╗xg▓@7п_╗{kЎ¤ы7p╜0e╥d·г▒ПжzёurО╔Ц-'╒,ШrgмЪC{╞|┘sщ╣жOoN¤y)gзШGУV··їj╣╕sы▐═╗╖я▀└Г N╝°╓┴Дёю Аps─Вы▐@Эz^├Иc╬ДJ▌╕ўяр├Л O╛╝∙єш╙л_П6╗bчxЯ√}.?╣¤√Aъч╒П┐ t √▀}·ёG`|Ша]╓MgрL&°`Б"( ц╖рЖvшсЗ Ж(тИ$ЦhтЙ(житК,╢штЛюеМ4╓hуН8циcюшуП@)фРDiфСH▐%гb▒5щфУPF)хФTViхХXfйхЦ\vщхЧ`Ж)цШdЦiцЩhжйцЪl╢щцЫp╞)чЬtВ9cМ╧-9f╒їY]l~·∙%_QRшУДЄЩ(ЯM.zиД::YдУ6ъддР6К)жZrzйеА&jhеМ:ъйзПBiкдгТ·йФм^╙║(_и┬ккT╢Ъ)вS╞zыдвж╩им┬[ч▒╚&ль▓╠6ыь│o▐_аДэх▐ЮоЮ:,ЧБ■йи╖}╩ъ-всj┌н╣Бк*(╣у▓█nзхКл+дрО .░я╥{nи√в╦щ║∙ж+я╝▀FJpп·\0┴3╝о┐│╓kp─ётko╛ + э╞wьё╟ Зь1,ФlЄ╔(зМrЮЙa+Є╦0╟,є╠4╫lє═8чмє╬i!╙╧> Ї╨BДЮ>ємЇ╥L7эЇ╙PG-ї╘TgY4╤X_m 4╥Uwэї╫`З-Ў╪dЧН│╓Yз╜u╦IЫэЎ█p╟-ў▄t╫╜4┌xлн╫vўэў▀А.°рГчmx╓G│¤кнd╓ъjХжтj,┬╝V╛эх┌J^шуЦo┘m┼X:.║цЫwNyщ╡:╛лЧЫN╬∙хж[┘·Шк├·yэацъ9щ╝Я╛°ыочю9ю║w■пЁ┼√N°▀З7tт3▐.¤эГB-ёobП№╬┌Ы┘=ьМC<¤°фЧo■∙ш■√Є▒Г┐~я _║Єь√э№¤╨3Y ■№ўя   рШюз╖ах╧ei┌Ф·╠їнБJb°тЧ╗Xu1T jb╙Ш+8╗ЧQПБЇ╫╦+┬Є╦a│▌Я0x┬╠мЕяk_ЧT'?┌ЁЖ√#`є╪╢ЖяЗ╜ЫХе|еи╪En{л^жj╫A$╓Y4LцЖ╕╛ГёuMLтбШhл╘YПv_─б╟ИCРЗdLг╫╚╞6║qcf4уtВ╘ёОv┤гcxм╤u╩M^Tв(M)▄(ъЛ"╨c▀▄&?A9SрЙsЬ√фШ7╦й╧NТ│TъМ!C+iRЄйЇиH K√у╥&їйOjи.O ╒кZХgK┼OSп╩╒оzїл`╦ъ}╢ ╓▓ЪїмhХЩXэC╓┤║їнpНkЬ╓Ъ Ь╢╩їоx═л^пD╫j▒ б7-б№tе▒=╬ыИ9EьзZе╜╚Э╙tЗMb`╔ї+ў}oUРmcЛХ┼ rTдь▓lMщG┴`Q╤▓ЫeЛBЪbS▒4uь9YYzсj│░ємEЗ[фuVФ┐хVjy╒[lrK▓Ы+юgЕX┌VЖЙV╓ф#нL╗─ON╓╡vzЗьЪ0f ^╞╛;0╨Yь_¤/ 3║щbМЕх X╣▐[=_zW|ш5яy3И┴╦╢w╛цШx %1║╫bъ /{х▐Ж1XГЎ=п Лз_Є╢kБхЕ!y5╝0 ClИ▐/И╟+;єw╝.1|у╗кЇ ╛P▓&Faaт ╓┼+naЕS,┴-її/▄▌лРЗLф╖■╕0╜hСЧ╠ф&Wu#I~йУзLх*│єЭ╖rФЭjх.{∙╦▒<Єu╢м*Ф∙╠fN3Ъ╫мц6Я┘lО│Ыч,ч:╙∙╬v╬3Юўмч>є∙╧~4а-шB·╨ЖN4вншF3·╤ОО4д'-щJS·╥Ц╬4ж7нщNs·╙Ю5иGнg2]+o6АкW╜j5│·╒а3Ьўы2╫z╬╖╛╡зu▌f^█┌╠│юs░йаыaє┌╫└Оє░ХНfd√┘┘дО╢изэцe╗Ъ╒┬VuЮW]gkw[█wЖvб╜Эf_/ЫЯ▄╟оv│├═n=;╓м╛6╝═-hqл║▄╒Юw▒їнn|╗;▄ўV6┐S=oy├█р░F°лoВ▄с З°┬%▐p`▄тзxл5pМ?▄у∙─E^q-ш{▀'∙╞U~oSєР┌oЖ╣┤g■lЪ█\ц8┐9в╔Эє5є|╤т&Ї╧{■шаЭшH╫y╥ЧоЇж3¤щN ┤╦з цк[¤ъbМ Ш ВМїо{¤ы╒о1╖ Ў▓Ы¤ь+{4╔ОЎ╢╗¤эQ#Щ╩цNўж▓чюx╧╗▐ў╬ў╛√¤яА╝▀O═ ╕аd*H╝ "УГ h 8АmXуЪ┌╪ж4╢╣№i4?∙╒pF4иaJl`Cy╬лж5ияМцA/°╓╗■ї░П╜ьg_фhХ/╥ЙР| ГЬъ0иA╨9 ЩrВ╗дА РJФnS∙╘w▐єЧwщЫЇъ│^ЇйЙ>ФЪ╧|чw▀√┤┐°╟O■ЄЫ №╢+ю+ Аш░┐&зNТ№чO ·█ ■°╧┐■ў╧ ■√  Ё─6┬ RАЇ!~RА╪#a Ш ╕А░B!и!(╛'! °╚А B-hА╚Б!ш°АhА XВ$hВБ}"В#А6xГ8ШГ:╕Г<°!H╙Г@ДB8ДDXДFxДHШДGBu┘2?ГДapУQє╡,U=hRЕ╒Q2ГЕp╫Е╤вvxjйтB°t]╚TаK┌RгRж╘ДS─QYNLtM╪uЗ╬еQП╡Z╤еZк┼I╕cЗ\шЕД╚&bж lЗu LшЙQмi3(┌,-*FU╕МР╔Л╩BвК3Y┐YM▌3г╣OЇHЩ╔Iд+)Я>uЬFкд 4ЯFФх)аKКЦх8Тёе,∙Ц╛Чi [A╩еYЪЕ/╣;Ёйв▄Ид╓Шд╫xж6ЕЬVzдц°П_шГ zV )Hw*вz(ЩнШзАdв┤и╧вгUйзЖzиv#wu╖и&SзИ·иРкT┌RОйЦzйP│T ╪TP╫йQчйа·йвкд:кжZкиzккЪкм║ко┌кТ6ulCmGp│nйЦl─?6tпuGЧl╝ л╜·tш╓o1gм║ъsrfo╠&kЦЎл░╩л╨zi╙jr▌╞f╒ ipм─Жk■6мр*мтоЫ &л3"s┘ u╙ЪnыЖн╜цjэЪмя┌м┬fg╕Км┐6о·:h╨Жl┼FпЄzмюzн° п╘Кg╓╞оєj░ёЪпBWп7Ч░╬:▒ Ks╥╩g┴╞н√║▒ф╩▒бjоКс▒;▓"[▓${▓&Ы▓(╗▓*█▓,√▓D▓RЖй4[│JгйъЧб6╗│<[3╥и│=┤B;2УъВHЦМЪ┤J╗┤L█┤N√┤P╡R;╡T[╡V{╡XЫ╡Z╗╡\█╡^√╡`╢b;╢d[╢f{╢hЫ╢j{╡иДn√╢p╖r;╖t[╖vK#H├#02p~А╕В;╕Д[╕Ж{╕VAж─иzб├█╖P'0╣u┤(`ЁXАGр╧Gz╪z╪g│qzжлz▄чyк+║м√}Яы|ЩWz▓Л╕┤[╗╢{╗╕[╕щ╟Vы'ГЯЭюGйОЫ╖LA;p╝:└╨9р0║╘}М╦}Цз|╙█Я'р'║л'╗╥╟|гw║╫Ч║╣{╛шЫ╛ъ╗╛ъ▒╗u╒╗║╝Ч!┐ЧБд9╝l├p]@жз╫з}о[╛иў┐цЛyоK╛│╫√║▐g└ь┴<┴\┴b╤{ HЪ╠1А╝G┐Ўk┐Й Г┐3┬а:╨?░╔g┴,▄┬.№┬0├oсN╦5,7,|?x╖<▄├>№├@─B<─D▓├є▒Вh┤%╥-x"Y╞В ┬─1╪В 8Г$B┼єС┼I№!Rь╗їБ─0h![L─d\╞f|╞Ch─√▒В)╪─%Hи─ЎВ(╚Бm╝ HГ4x╟&╚╞┐з╟,| ш╞*8╚═╤ X\!)╟u\Г<В─ ,БЄ╗o\╚ГМ╞ШЬ╔Ъ╝╔Bв╞b╝╟Н№┼ ╚╟<в┼qL╚Й№ВХ╝╩МмБZ БА\╩v<╦XГЗь╚°q╟(╪╚ЧЬ╦cL╚╜м ┤ ╩╕╠╔╞|╠╚Ь╠"ет╔╩▄╠wЫ╩╬═╥<═ШмУC{═╪Ьг┴а╘╡81zW▀Ь═т3ДjЧлCЖnJ7eиОm╬▓й╕WиЬ1у╬уЬT,╔c&б▌Ь;ЎdЖ^ZдЪ╥ПrкеL║ЮчD[ ьХ┤╚ПшЇMC║ЬУщD?╒═А(УjZ╧^V╬┤╧cШжцyдЇшд╟┘Ы¤м9Э┼Ыо╙Ыq·;!m╨т╧╗5О─щ; Z*Н╤Ntж╤\vuЇМ╙>]5u9│?=╘D═%A╜╙EЭ╘J=%G╜╘N¤╘Q╥╘P=╒S-╒T}╒Jm╒X╜╒?н╒\¤╒уь╒`=╓C+╓d}╓;+╓╝╡Уя\ж0 H=М╖Ш3 yг·2aь ж■TМcж╬╬Н╒ЪqэЯvmu j▌╓7z*├TвU[┬ЙZm\┌г{Э╬╝Y┤┼Z└r[СН]ФЭ╪вBОХтеg╔ЖьиОМї╨r"┌b║╪ Ц[p┘╪иэ╤PКЦЩ═9T╪_v╪ГЭ╪X╙зy╙сtе┌дЮ`█oэгЧ╜╥щ R"нЪП╪┴-ИC╔Уr¤Ы@кН╟°▄╚¤Уo°Ю#эvR═ЧlY╥╫hbw▌]Л%иwШbvXшmDО╔0╫`9,;▀х╜О7F▀║=B)дc,Ц_р.╪¤t▀"ф]є}з~ъ▄о┘╙╜b_9V*&╩▌Xg╓┤∙рPСP├сQйсh=тЦ*т$~тЗjт┤э╓Аcг[hCx.╛ЮSЪ╫(юL*.О╟m[ЁC┌э┘ж├-╤▌─С╖-еь 9щ╚уэуaкфT┌е ¤▀.]у)uу)*╫э╜ж?N╨cF┘=ф]ф╨8г=>Щ[Ю<]╛▌PЮу.хDхU■╫0И88kЮ▄чс╒-уl╬Ln╛ч~ЮЯ·}>&█йХ^шДшb2шЧdшМ■vИ&ЭЩХw.гИ╤ ∙в┘█╡-█ЦmхН>КП&їIшmHШдЭ╥[∙фl┌ф4Щ▌┼ сХnч┬э▌z■щЬъ_ВЧЮ)жQ╬Y&Yък■дY▐ъжtЦЯыoаэШу╢▐Й╕ю%г╛ш4^H╘N╪Ы>эpЭч╠▐ьЫи╙rвшX╔эт~u▐>юц>Ых>OютAМЙэЩЮМ╛эБЪ█┌ющчюИщnЪz`╞И.ВЕд┬зНI1=Жb$F▐Ей<гШi.ыюоцў╛К∙ЮЫ∙иТaJ╥╩Чcю┘╦╔с1U┌_яp*Єёo∙7ёп╫o*SгЭY├╨Ы¤ЄeY[С%ф1Йьяоь╦nя&OИ(ЯЄФ^эMгєFy=+кщ=ЄE{{@ЫЇN_К? чр~аOяєKЯ│j▌эМЇ _╨O▐oNыqйKMТGT_ї]їF┐ъуЄйYX█HЇ*ЇA▌█═╒д╞╔┌╠ ЬъэeTh_Иjц┬╛ф3▀▌h~є┬eёu?еЯ°ИПў░nJ║nЯ°^8°Дя@Ж╣aШ.Ёi╪р~¤╫с╥∙є∙ ╛Ш▄эъJDЎЇiаАП∙iї╝█ЇAысВ~ХS5√┤пЇtК√l>ї╛ √mз∙╞Я№╟o√я +№╩ №eЗ№╨?¤X'¤╘¤_f¤╪┐¤Tж¤▄ ¤Kц¤р?■{%■ф■rUю│>Їфй,u.7опїGг] Ї■ЮО ЧЮ,▐╬гсEр@ DШP`AЕ ╜0tбDГ 6┤°╨с╞Еf╝╕фHО-RY2e╚Т=&ФH▓т─Ц09Ю4∙▒ц╠Ь=y▓Ї∙╥цNЬA]К╘┘1)╤еBН>U 4ъOзSП]iUj╓ЭCiVХк▓i╪▒dпj═╚UмW┤eй╛5{6nWГT╝┴ЫWя^╛yY└√╫.^нVЛvMK╖pL╢P╗E Sfc├З┐RЦ█Q-X╣Й/Cvu№t3f╤Я├╡\┘┤g╥ЩSwn╠5эhВйYЗ.l┌їM▌▓)√╓╜╓qV┌_чОЎїэ╙Ч'_ р8Є╠еЯ▄W╗Ў┐Бdo^№xЄх═ЯзО╖zЎэ▌┐З_■|жЇэ▀╟Я_┐°тъ√є▀/╝ь╢#╨/└В ьо d░AД0B 'д░B /─0C 7ф╨╝ $░;┐S░COD1EWd▒E_Д1FЫ√DюLР░wф▒G2H!З$▓╚ГDЄ.%УdrI'╜╧H)зд▓J+п─2K-7м╤F╛D╠q┴-╟$│L3╧D3M5Yь╥K╜└$Q╟5чд│N;я─3O4█─K:?C─1N1ї$┤PCE4QEёу╙═б,qQI'е┤RK/еУ 6х┤SO?ї4╨ь┤аВTSKEїTUSeuUW[ЕїUYcеuV[k┼їV]sхuW_{ЎWaГ%vXcЛEЎXeУevYgЫЕЎYiг═еvZkл┼ЎZm│хv[o╗ў╫є ┼ы[R ╓]╒ ╖]ssew]t▀е╫]{пЭUЎх╖▀|OэWЛxY x`U Ж╡рY mсzён╒ap¤▌7V~╧еu_АяM╡тГ]uШ]ЖцШdУKF∙dТ╟qTw%■цR╒Хy┌С╛ф ЎШ Нg▐ШсСїЕ╫╘Ъ#°hХSf┌hYуЕYiеЙ~Z╪йo┌шЭA■╕╒Ю^5gдq═zтtю°aи╫}:▀ЯЧЖ╗i╣уж{nTY │▐▓ы~uяД}╢XlМЭжhЛ╣ЬтпУ]Ьo╗O.█э┬╤╞·pb#пVf┴яЫ`п7╓o░K╞9c╦╗ЎVq~╟ж№ъ╟_w№р═ Ьu{йчYuЭЩy─▒v=ўшя╖?{mwY Ыж■°?╨АDрШ@.╨Б+3╣В╨@ >╨В─р5ШAn╨Гс╣┼┐Ha╩Д'Da U╕B 5╩MpК e8C╓╨Ж7фHг№$@InЗ?bЕ8D=i TGD" KHD&6╤ЙOДтМь2%╩)КW─b╡╕EF)и/;<╨Н|╚E2Ц╤МgDгB\ше*:╩НoДcх8G:╓╤Оw─cї╕G>Ў╤Пd 9HB╥РЗDd"╣HFЄ 1AiДd$%9IJ$LН─d&5╣INv╥УЯe(E9JRЦ╥ФзDе├ФV╢╥ХпДe,e9KZ╓╥Ц╖─e.u╣K^Ў╥Ч┐f0Е9Lb╙Ш╟Df2Х╣Lf6╙Щ╧Дf4е9MjV╙Ъ╫╠БY)Б! W░┬└iДр/X@░╣Nv╢╙ЭяДg<х9Oz╓╙Юў─g>їщL/P┴Я h@¤∙Ч~ ╘а № + zPГ&4Ы-S+A P` X J@%$Б EРB╢Е└Х iе@`й╥ХzaЦiйA^КY┬tжпtИBТЦ╥▓з:┼йKc∙╙}╒и GEjRХ║Tж6╒й╟ьзгJйЪФзT}бU╡∙J L _¤ъ :└Бь└D░N*╘Ъ■t 1ekJу╩SбХоkm+^їT╗5и7Хы^ujW╖╬їйЗElb╗X╞6╓▒ИНjV# F╩HбX ївYя░rлпм└D╗lрX@╓┐╬Фе2╒kak┘╫└▐╒╢п5l^m█Z┴Є╢╗╜mn√Xт╫╕╟EnrХл▄╚▓▒ X #_┬ш╨цfЦЗzУV!КЧXЄ└╗вэ,╨RЯ║Tж▓н-po┘S▄╓╢╜Г}kz╒;_┌·╢шї+oЧ╗_■Ў╫┐ ▓pАЛY]M╡O█ЩоU l▌шZЎблД%^АД)р▓╛┴═oNч╗a√▓uзЄMпЖA╠a╣т╢░юнАU╝b╖╪┼/FъВ5Y;╕║┬оГ?█╩шЕ╬эИ▀K^║zШ╜q%j|K╠╫╫5╚°1Сє╦с$╞W╞rЦ╡╝e.ч▓╣ФmЁИ& цS│ЬэSt║cVvyщ@║6└єНfhkз█▄n7├Ч oКл█уy╚E■Iv█фЩХ°╞я=o~х/W9╞яєШ;№фy─х╚┬┘шN\│,┐╣═ОrЭч№█Bwv▒;~p|п№ш#Зz╘е>uк╫▒ф3з╣╬ЛОuА;Jщ4╖°╬onЇФП=▄a/;╥ЭОєвЛ╗ы'z╓┴.p┤Ч¤эg?∙╫a╛ўкў▌я╝╟п■Ё?Ьь>╗┴ёЮw┬ў|щp▀l┬yNxБ╟{▀mзvсыэ°ыю╜Ё@ўz╫єMvН_█Є`М╝тЩtЕ7▄цБЗ}ьe?{RЮЎ╖┐¤ыq┐{▐ў▐ўz┤¤яЕ?|т▀°╟з }ЁС┐|ц7▀∙╧З>к├TIъW▀·╫'╘┼╙Fьw▀√▀?Х╓╪gQ-С%)Б╚┬п? 'Eэ_№хЯжё╕№VМ ·чRЯ4й"Мё?Ї@Ў└ИАП▄┐ A└∙c@LYгhу>Я╨┐Їh Ї+И┬0ъ №┐Ї;ЙыXИ┘р@╔└└Ш│╙ШМ┌А┐╝@\A°╙@╬PAт╨@┤┴мИ$AЖЁ┐ь@№┴─┴At,B"ЬН#╝┴l└'─!╥╝╛И└єКМО╥X ╠╕@дH┴╖` ф ў ╞(├0├ \Пъ╚B╢XB║ШО■°┬са 3d├ц-l (╘├jIгAc┴T┬!ДC ╡P├мО@─E╠├Ъп░├лHDEЬCу┬╣а4│шA'LУам<▄─й░├Q 4▄├TФб· ╢√ФгPC,4─н C▓@─Y─┼1дp├:ДЛ▄╕┼G| QмE1,FGD┼6фERTD├ UД╞b┼─№╗┬ЄP╞SE<№─_ Ф╪╞╪@┴pдE_,├│HBo─ Ф╟№┬v╠┴CL╟ ДGnD╟ytF╘H?s<┼z╞5М╞А<Фi▄О*▄╟еX└ъKHБd╚Ж╝!LГТHWt╚qЬ╚К┤╚,jТМ|ТН4Р║╚П╔Рф"Н$IОЇвщ╔ФT╔ХвТt╔'#ЦФ╔ЩдIz╔Ы╤|Lc ┼]\FH─GєXHЎ#ОЁИ═1 └╤ DPD┬шx═ЫЁ─БAь═B╣═c,Т`tJ╘D╔╚@у╘E ╨ПlдHl$П┌╠П▄МьЇ@чф╬ДD─э╚ ▒╬\|╬щ$OlOф╬ЭTNЭ ─ lD┌t╬▄▄M l┐┘┤О▀ N√t┴єф@·<ПФ4!ДE№MwЙ"┘T~╞RE▐[ОU4╬┌]╢р^nО_цZ╜\U%fцPWYЛъ ▌кИ_HfUАLYYM╪├Хf fиv>(Й╝П_fTVfМ-d!уP╓X╞Нцu6]В№├хдПFЮч-ж┌√x┌/vf'╓g·ат2Ўч─h*ўДg√╨тkОшМNфЙ■ТКшЛжgНiцш╜и┬СFщФОПТ╬.ШUщЧЖщЭ`iqщШ╢щЫFИЩЎОЪ╪ЖОZЎщNчРъzf\\fш~╞щЩ╒щG)т[ЕшЕЎiЕ6j[-ъб╛]чхчГ^jжЎ"UЄh j╨}┴^м╓#▄?Xю@N^]v|U═\█╡]╓╡R]юъкmъУыg}╟╧°Vc dЎRа.\╤Eфнne(ъ╗═╝kфkв^╒р╚▌wl/ЎфuLыcФkS─eснb╞ОY╟цщыZ╘ц│~e░Их═ж╒┴╓╨&XK▀┼э╠$°эзжР ╡▀¤mPХ] нT&LfтFkуFnтv_Mю│%ь E╧с<фN╛m╠╠mБ╓кцj"¤Ст╢─▌6█иоn╧╝nў╝6YЇяї╢РЄжQЎЖяМvя╬Мя·Цц∙╛X√цРЦaИ╘я╞■ъ8╥ы ▐o■> &p▄p8Ё╜ЦjДVl+ё^ >И■╞┤Wpл{l╚NWNъ3cюV7.h╫p╔─яcup└}█у^P ^eFр:fBю▌`>╤Яb·н╘╩їmp╢TВЮaOq╚\q╠eэKЎfъХZt╞j╙frяОm├.Лw¤E"╟Ё╣>Є┼┴LЄ QkM&T┘№S┘xюs┌vX%VsъXk.Є яr$_Ё7jpи╛r&wmл╓l╢fр)Зэ╠ЎєLЖ 8▀ЄAЭs┬№r0 ц╓N╖оRd-чкОHo]l▄n■▌/ё`цa#OЇ┴\ЇьюnЧ!B юД░ЁВ>ЇI u┼uR╟чg!*]Е@хїWч╦XчuV┐ш] ї║Їu^7ЁЧєaяї:wг;WЎg╖┘bЗЎimfпк╥жЎlOLi╫Ўn┐KLnўЎpЗuk╧*lўsgKpGўu'vrw.sgўx┐JuЧўz'Kz╖ў|Яww'?x╫ўяI|°Б/JБ'°ГчIГG°ЕЧIЕg°З IЗЗ°Й╖HЙяю<■`дЦb&"М▀mО'єё°у∙Їё;-yas∙XЇqf╪ ╤ю\Fб3oИeСШ▀gё6Y<ЧmоuР/ЯМ хПСсыА▀-·ND_M·нOДeQ'Tя╧Oгч╓>жёлЗ_н' ╟у▐м·мяcбя Vb3╫_п7▀ ьq№u═и╟Pї·√e√▀M╒√▄{┌фёею░]nmSМч_3╘S░Ч═ў$√уvq7Pдз▌ЇLrfоkЭ\╣ g( ╘╡эF█И^■ы╥м}o=Y▓╓s╔╬soЭZIоф╕h`@ўk╔нe*5gыИd=п lнєmb=¤TНCDЮф4Чy▄Os-E■9-fїи|W╜|єM∙*ЯtцП■═ЧeCн■ёїQФ╫S╤ч~к_х╫oы╒Шq╘╛ф=ї_9ю▀╫B┤їэ/_M╩lF╝_|tї└g·D^,р ┬Д2$(░с├Ед8▒вDЖnдшСг┼М"5~ьш┼д╔У W~lщСКЧ 2g╥мis& 2s┬Ф тHЗ.БТ4$╥вJЧ 5ЪФiSзQ>=·sdJзG│B┼╪Тk╘░ZO║▄8uьWиfн^%█╡-█╡[ЗВM Ўэ─ОT=▐uыїoU┐p╡ЮE;Ш. ╤╖З ╝o`╣l╤ю█╪▓у┼vюyєєчЬ;xvШW2ц▓r. 8+ь╔Ч Янм╤╡╨╝%∙ож┌╫"ю╫Б╒w№Ы)kуЙSз5Ио@▌[У/Я■|vЁ┴┴гS№сpл┘їо_▌{vэ╬e77m;rwщч├╖хn∙qРЄ_┐╧╕_▒z╖хGРgаИУNAЁSЬ9° ДJ8!ЕПU8▀Еj╕!Зz°!И▌Е8"Й%ЪxтГVивГ,в8PБ(ЪВд1°"О9ъH_З.ю°#РA ∙гПCy$ТсТc5YbМ2ЖЦрВ>%y%ЦYj╣%Ч]z∙% ШaК9&ЩcE)еM4┬V┘`Щm║∙&Ьq╩9'Эu┌ygРgвIУЪ6ZЙ'аБ :(бЕz(вЙ.дчЮгНVЪвСJ:)еХZz)жС2┌hЯРf·)ибК:*йеЪJ╪Jйк║*Х~▓y*м▒╩:+н╡┌ЪdГ╣╞┤ло╜Є╩ыг7▐:,▒┼{,▓─┬aз┬&√,┤╤J;-╡mn║g│V╗-╖▌z√-╕^Лf╢пЖ{.║щк╗n▒уJY.╗ё╩;/╜ї╩ика┴k/┐¤·√/└F^Л╨Б √|0┬ +╝pg 6ЪfлЮ2<1┼[\п╗2|1╟{№q▓▒│ Ы|2╩)c╩*╦м+Z╚є╠2kAє═6у╝│╬=╫№s╬@є,┤╧A=Ї╤E#╜┤╥M¤t╥P3-╡╙Q[=ї╒Uc╜╡╓]S¤u╓`s-╢╫aЫ=Ў┘eг╜╢┌mУ¤v┌p│-╖█q█=ў▌uу╜╖▐}╙¤w▐Ає-╕▀Б█Mс╦A■┤Гю8фЕG╛°уТ[N∙фХc~╣цЭg■9чаo>║чбЫN║шег~║ънз■:ы1#^гgпўэT▀√ъ╜'mЁ╣s╜{ь┼√╬╗ы27n|▄┴/╖є ЧGП№ф╙+-<єl_╡є1?Я|═▀Sс<∙DO}Ўщп>°эгO∙ьk·Ю√┘╪3■╛√ъ/п╗Їу ?√╪?д∙Oy<;Я═А4ц Б фЎx4√оАы▌■мfAўQpi4`╧─W╝█Y0Г43a Ш┐ о░ЕtacX│°╣ v"Z∙вF>▐СпД█є▐Ў&─Ыo|тsH└оэюГ`ыЮa╚┬.ЗV  п8╝лEqhY╠█ √G┬-ЗFSаї~╓Cнu1Еш г=°└ї5ёЙeсe(┼=RQП} =s╝6╨Н╫SЮё╛XBЬm0О:вЛ ┘┴┬╤РЕ─Э╧╛°G>╨Й√╙дЩ@N Ф╩#%ўдW╩ЭQpГЛ|дл°;│ЙТt╡Ьа╘вG╟H▓1Ч▄$0¤(╠<ЖБdГ∙─жЛ╡df°xЙ╚Щy╥Сц;г▀ЪйLNц1МЇ╗хiyH╗Й▓ТbЛт+з9KFfRТ╠Dх│fN╧RЕ▓<б ▒╔┐~Ь├ф&@╖)╨b эШ2┘х@п9╢OЖ│б Де=ёиO\жmЮ[Lh@ЩW╬uJФЭ╘Th╣╥xЄнТ▀+р Qx╥Рj/lжTЭJ58NVv╙ель(AsZLМЄTз93hРч╧Э╬tФ▒lчC├╟@"FЯ=)%Ыч┴_UЪ%*QSjM"оTН(Х)у╛*╟╬=╙б╡кSЫ QI▐/Х,L'E╜ш┐zVkр╠▌Pпк╫Юbuп ъ_╩╫МZ╘зГ=l┘Є·FШFо░}+d +┘╟N╓пФ╜мe3 T─bVАВн,g3;╖╧ЦМ╨тр┤ ┌S┬3олэьkE█╨╥ЎпJls+[▌╓Ц╖o│¤нoГ╗█сЎЦ╕└5оp∙╢┘у╖╣╠}nrбЛ▄щ:7║╓еоtл╗Gакм╗▐¤.xыDЕёТ╖╝ц=яyIжнЁ▓╖╜ю}пРD6#їЪ ╛Ў╜/~є[!∙ъЛ╛·¤/А,`К ь #K▄Амр╖Ч┐S╚B0Г#,с _╠┴7┘Е3мс ╙лe^ Д9,тУ╕[ш=1К╔ы▀│╕┼.VЦ├╞з┐╕╞6╛1и, ▒у╕╟>■1б Ьа■Є╚F>2Т╦дуЪ`8╔N~2ФП┤ф9╩V╛2ЦIЇс-╙W╞^■2Ш├,ц1У╣╠f>3Ъ╙мц5│╣═n~3Ьу,ч9╙╣╬v╛3Юємч=cЛ╦~■3а-шA║╨Ж>4вншE3║╤О~4д#-щIS║╥Ц╛4ж3нщMs║╙Д;ess/doc/currfeat.texi0000664000175000017500000000313012423756516013207 0ustar eddedd@itemize @bullet @item Languages Supported: @itemize @bullet @item S family (R and S+ AKA S-PLUS) @item SAS @item OpenBUGS/JAGS @item Stata @c @item XLispStat including Arc and ViSta @item Julia @end itemize @item Editing source code (S family, SAS, OpenBUGS/JAGS, Stata, Julia) @itemize @bullet @item Syntactic indentation and highlighting of source code @item Partial evaluation of code @item Loading and error-checking of code @item Source code revision maintenance @item Batch execution (SAS, OpenBUGS/JAGS) @item Use of imenu to provide links to appropriate functions @end itemize @item Interacting with the process (S family, SAS, Stata, Julia) @itemize @bullet @item Command-line editing @item Searchable Command history @item Command-line completion of S family object names and file names @item Quick access to object lists and search lists @item Transcript recording @item Interface to the help system @end itemize @item Transcript manipulation (S family, Stata) @itemize @bullet @item Recording and saving transcript files @item Manipulating and editing saved transcripts @item Re-evaluating commands from transcript files @end itemize @item Interaction with Help Pages and other Documentation (R) @itemize @bullet @item Fast Navigation @item Sending Examples to running ESS process. @item Fast Transfer to Further Help Pages @end itemize @item Help File Editing (R) @itemize @bullet @item Syntactic indentation and highlighting of source code. @item Sending Examples to running ESS process. @item Previewing @end itemize @end itemize ess/doc/Makefile0000664000175000017500000001013012516226622012130 0ustar eddedd### Makefile - for DOCUMENTATION (./doc) of ESS distribution. ### ## Before making changes here, please take a look at Makeconf include ../Makeconf # program to convert .texi{nfo} to .html #MM: use makeinfo (i.e. MAKEHTML from above) which is more #-- standardized than texi2html which exists in #MM at least two widely differing versions (TeX vs GNU): #MM TEXI2HTML = LANG=C texi2html -verbose -iso #MM SPLITCHAP = -split_chapter -menu -glossary ## TEXI2PDF = LANG=C texi2dvi --pdf # To obtain sorted indices run: "texindex ess.??". #### no user servicable parts beyond this point #### TEXISRC = announc.texi authors.texi bugrept.texi bugs.texi bugs-ms.texi \ credits.texi currfeat.texi ess.texi ess-defs.texi getting.texi \ help-s.texi help-sas.texi inst_svn.texi installation.texi \ license.texi mailing.texi onewfeat.texi news.texi onews.texi \ newfeat.texi readme.texi requires.texi stabilty.texi help-bugs.texi \ help-jags.texi allnews.texi Makefile ../Makeconf ../VERSION ESSINFONODE1='* ESS: (ess).' ESSINFONODE2=' Emacs Speaks Statistics' ESSINFONODE3=' (S/S+/R, SAS, BUGS, Stata, XLisp-Stat).' ### Targets -- PDFs = ess.pdf readme.pdf refcard/refcard.pdf TXTs = ../README ../ANNOUNCE ../NEWS ../ONEWS all : info text html pdf docs : info text html info : info/ess.info text : $(TXTs) html : html/ess.html html/readme.html html/news.html pdf : $(PDFs) ess.pdf : $(TEXISRC); $(TEXI2PDF) ess.texi readme.pdf : $(TEXISRC); $(TEXI2PDF) readme.texi cleanaux: -@rm -f *.aux *.cp *.cps *.fn *.fns *.ky *.kys *.log *.out \ *.pg *.pgs *.tmp *.toc *.tp *.vr *.vrs ## this shall remove *exactly* those things that are *not* in version control: clean: cleanaux -@rm -f $(TXTs) $(PDFs) info/*.info* html/* ## this removes also things in VC (svn, when they are remade by "make"): distclean : clean # -@rm -f $(PDFs) ../README: $(TEXISRC) -$(MAKETXT) readme.texi \ | perl -pe 'last if /^Concept Index/;' > $@ # | perl -pe 'last if /^Concept Index/; print "For INSTALLATION, see way below.\n\n" if /^\s*ESS grew out of/' \ ../ANNOUNCE: $(TEXISRC) -$(MAKETXT) announc.texi \ | perl -pe 'last if /^Concept Index/;' > $@ README.Microsoft : README.Microsoft.texi $(MAKETXT) README.Microsoft.texi \ | perl -pe 'last if /^Concept Index/;' > $@ ../NEWS: Makefile ess-defs.texi newfeat.texi news.texi -$(MAKETXT) news.texi > $@ ../ONEWS: Makefile ess-defs.texi onewfeat.texi onews.texi -$(MAKETXT) onews.texi > $@ ### File Dependencies info/ess.info: $(TEXISRC) ../VERSION @echo "making Info documentation..." -$(MAKEINFO) ess.texi mv -f ess.info info/ install: install-info install-other-docs install-info : info/ess.info -$(INSTALLDIR) $(INFODIR) $(INSTALL) info/ess.info $(INFODIR) test -f $(INFODIR)/dir || $(INSTALL) dir.txt $(INFODIR)/dir grep $(ESSINFONODE1) $(INFODIR)/dir || \ (echo >> $(INFODIR)/dir; echo 'Emacs' >> $(INFODIR)/dir; \ echo $(ESSINFONODE1) $(ESSINFONODE2) >> $(INFODIR)/dir; \ echo $(ESSINFONODE3) >> $(INFODIR)/dir) install-other-docs: pdf html -$(INSTALLDIR) $(DOCDIR) $(INSTALL) ess.pdf readme.pdf $(DOCDIR) $(INSTALL) html/ess.html html/readme.html html/news.html $(DOCDIR) $(INSTALL) refcard/refcard.pdf $(DOCDIR) uninstall : -cd $(DOCDIR) && $(UNINSTALL) ess.pdf readme.pdf README ANNOUNCE -cd $(DOCDIR) && $(UNINSTALL) ess.html readme.html news.html -cd $(DOCDIR) && $(UNINSTALL) refcard.pdf ## TO DO: ess_toc.html & readme_toc.html should be merged into index.html html/ess.html: $(TEXISRC) @echo "making HTML documentation..." mkdir -p html -$(MAKEHTML) html/ess.html ess.texi #MM $(TEXI2HTML) $(SPLITCHAP) ess.texi #MM test -d ess && cp -p ess/ess_toc.html html/index.html || cp -p ess_toc.html html/index.html #MM test -d ess && mv -f ess/*.html html || mv -f *.html html html/readme.html: $(TEXISRC) -$(MAKEHTML) html/readme.html --no-validate readme.texi ## ^^^^^^^^^^^^^ (design bug: "FIXME" in ess.texi) #MM $(TEXI2HTML) readme.texi # mv -f readme.html html html/news.html: $(TEXISRC) mkdir -p html -$(MAKEHTML) html/news.html allnews.texi refcard/refcard.pdf: refcard/refcard.tex (cd refcard ; pdflatex refcard) ess/Makeconf0000664000175000017500000001107112632537307011402 0ustar eddedd####======= Common Declarations for *all* ESS -*-Makefile-*-s ========== ## To install ESS for all users on your unix system: ## 1. Edit Section 1 and 2 below ## 2. Execute: gmake install ## Section 1 ## Installation variables for your emacs variant ## ## Variable Description ## EMACS use emacs for GNU Emacs, xemacs for XEmacs ## EMACSBATCH emacs/xemacs command for compiling elisp files ## SITELISP Destination of site-lisp; but some variants have no site-lisp ## LISPDIR Destination of compiled elisp files ## INFODIR Destination of info files ## ETCDIR Destination of script and icon files ## PREFIX(DESTDIR) Directory prepended to SITELISP, INFODIR, DOCDIR & ETCDIR ## Specify either PREFIX or DESTDIR to over-ride /usr DESTDIR=/usr PREFIX=$(DESTDIR) ##__ GNU Emacs __ EMACS=emacs SITELISP=$(PREFIX)/share/emacs/site-lisp LISPDIR=$(SITELISP)/ess INFODIR=$(PREFIX)/share/info ETCDIR =$(PREFIX)/share/emacs/etc/ess ##__ XEmacs __ #EMACS=$(PREFIX)/bin/xemacs #SITELISP=$(PREFIX)/share/xemacs/site-packages/lisp #LISPDIR=$(SITELISP)/ess #INFODIR=$(PREFIX)/share/xemacs/site-packages/info #ETCDIR =$(PREFIX)/share/xemacs/site-packages/etc/ess ##__ GNU Emacs __ for Mac OS X with NeXTstep (Cocoa or GNUstep) # PREFIX=/Applications/Emacs.app/Contents/Resources # EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs # SITELISP=$(PREFIX)/site-lisp # LISPDIR=$(SITELISP)/ess # INFODIR=/usr/local/info # ETCDIR =$(PREFIX)/etc/ess ##__ Aquamacs __ (donated by Dan Knoepfle, Mar 26, 2011) # PREFIX=/Applications/Aquamacs.app/Contents/Resources/lisp/aquamacs/edit-modes # EMACS=/Applications/Aquamacs.app/Contents/MacOS/Aquamacs # SITELISP=/Applications/Aquamacs.app/Contents/Resources/lisp # LISPDIR=$(PREFIX)/ess-mode/lisp # INFODIR=/Applications/Aquamacs.app/Contents/Resources/info # ETCDIR=$(PREFIX)/ess-mode/etc ## the following command is the same for recent versions of both Emacs and XEmacs EMACSBATCH = $(EMACS) -batch -no-site-file -no-init-file ## Section 2 ## Installation variables for your unix variant ## ## Variable Description ## SHELL Bourne shell or XPG4 compliant shell ## MAKEINFO program to convert .texi{nfo} to .info ## MAKEHTML program to convert .texi{nfo} to .html ## MAKETXT program to convert .texi{nfo} to .txt ## INSTALLDIR to create directories, if necessary ## INSTALL to copy files, file copying commands expect 2 args: ## 1st) source-file & 2nd) target-directory ## UNINSTALL deletes all arguments ## DOCDIR Destination of other doc files ## DOWNLOAD Download internet file to stdout SHELL = /bin/sh MAKEINFO = LC_ALL=C LANG=en makeinfo # new: MAKEHTML .html .texi {necessary to build 'Index'} MAKEHTML = $(MAKEINFO) --html --no-split --css-include=atouchofstyle.css -o ## ^^^^^^^^^^ today's bandwidth is fast #MAKETXT = $(MAKEINFO) --no-validate --no-headers --no-split -o - MAKETXT = $(MAKEINFO) --no-validate --plaintext --no-split -o - INSTALLDIR = mkdir -p #INSTALLDIR = install -d INSTALL = cp -p #INSTALL = install UNINSTALL = rm -f DOCDIR=$(PREFIX)/share/doc/ess DOWNLOAD = wget -O - ##DOWNLOAD = curl ## Section 3 ## For ESS developers only, not part of installation procedure ## ## Variable Description ## ESSVERSION set to the contents of VERSION ## ESSDIR ess- prepended to ESSVERSION ## ESSVERSIONTAG repository tags cannot contain .'s (no longer used) ## GNUTAR the name of GNU tar to support the z option ## SVN_URL SVN repository URL (repo retired) ## UPLOAD_DIR Martin's upload directory ## ESS_HOMEPAGE Martin's svn co https://svn.r-project.org/ESS-web/trunk ## # $(shell) is a GNU-ism which we would like to workaround to be UNIX make friendly ESSVERSION=$(shell cat ./VERSION 2> /dev/null || cat ../VERSION) #F: but the following use of `..` *FAILS* #F: ESSVERSION=`cat ./VERSION 2> /dev/null || cat ../VERSION` #ESSVERSIONTAG=ESS-$(shell sed 's/\./-/g' VERSION) ## SVN repo retired ## Currently only works when run in top ess/ directory; not in etc/ or lisp/ : # ESSfromSVN=$(shell test -d .svn && echo 'yes') # ifeq ($(ESSfromSVN),yes) # ESSVERSIONsvn=$(shell svn up && echo "`date +%y-%m`-r`svnversion`") # else # ESSVERSIONsvn=$(shell echo "`date +%y-%m`_not_svn") # endif # ESSVERSIONTAG=$(ESSVERSIONsvn) ESSDIR=ess-$(ESSVERSION) GNUTAR=tar # SVN_URL = https://svn.r-project.org/ESS UPLOAD_DIR = /u/maechler/emacs/ess-WWW/downloads/ess ESS_HOMEPAGE = /u/maechler/emacs/ESS-web .SUFFIXES: .i3 .m3 .nw .tex .dvi .html .c .h .el .elc ess/ChangeLog0000664000175000017500000063243112632537307011517 0ustar eddedd2015-12-11 ESS Maintainers * Version 15.09-2 released. 2015-10-26 ESS Maintainers * Version 15.09-1 released. 2015-09-24 ESS Maintainers * Version 15.09 released. 2015-04-23 ESS Maintainers * Version 15.03-1 released. 2015-03-31 ESS Maintainers * Version 15.03 released. 2015-01-31 Rodney Sparapani * Makefiles are now UNIX and GNU make friendly. 2014-09-13 ESS Maintainers * Version 14.09 released. 2013-12-10 Rodney Sparapani * Makeconf (SITELISP): tersely documenting SITELISP and incorporating into comments for emacs variants * Makeconf (INFODIR): updating INFODIR for Mac OS X 2013-12-07 ESS Maintainers * Version 13.09-1 released. 2013-09-27 ESS Maintainers * Version 13.09 released. 2013-05-14 ESS Maintainers * Version 13.05 released. 2013-01-14 Rodney Sparapani * Makeconf (INFODIR): on Mac OS X, this directory does not fall under Emacs.app as previously indicated; it is actually the same as you might expect on UNIX/Linux, i.e. /usr/local/info 2013-01-12 ESS Maintainers * Version 12.09-2 released. 2012-12-21 ESS Maintainers * Version 12.09-1 released. 2012-09-24 ESS Maintainers * Version 12.09 released. 2012-06-07 ESS Maintainers * Version 12.04-4 released. 2012-06-01 ESS Maintainers * Version 12.04-3 released. 2012-05-11 ESS Maintainers * Version 12.04-2 released. 2012-05-07 Rodney Sparapani * Makeconf;Makefile;*/Makefile (uninstall): first attempt at uninstall target; please test 2012-04-05 ESS Maintainers * Version 12.04 released. 2012-03-30 ESS Maintainers * Version 12.03 released. New numbering scheme. 2012-03-11 Vitalie Spinu * doc/ess.texi (Styles): added C-c . to the docs. (Help): added description of i, v, w, q, k keys. (Object names): added TAB completion in ess-mode. (Other edit buffer commands): TAB completion adjusted. 2012-03-13 Vitalie Spinu * doc/newfeat.texi: New emacs 24 completion. M-TAB and breaking change emphasis. 2012-02-29 Vitalie Spinu * doc/refcard/refcard.tex: added new features and removed deprecated bindings. 2012-02-26 Vitalie Spinu * doc/ess.texi: rearranged, renamed and completed with several new chapters and sections to reflect newly added features (``Completion'', ``Developing with ESS'', ``ESS tracebug'', ``ESS developer'', ``ESS ElDoc'', ``IDO Comppletion'' and ``Evaluating Code''). First chapters are all about S and R, no special distinctions is necessary in the section names. ESS is defector 80% R, and docs are reflecting that. 2012-02-25 Vitalie Spinu * doc/newfeat.texi: completed documenting changes. 2011-12-13 Vitalie Spinu * etc/R-ESS-bugs.R (`swank:quit-inspector`): added swanky functions. 2011-12-12 Vitalie Spinu * etc/ess-developer.R: R side of ess-developer.el 2011-11-24 Vitalie Spinu * etc/R-ESS-bugs.el ("\n\n\n"): double prompt bug (5)) 2011-11-11 Vitalie Spinu (spinuvit@gmail.com) * etc/R-ESS-bugs.el: added this file for tracking R-bugs from the lisp side. 2011-07-30 ESS Maintainers * Version 5.14 released. 2011-06-20 Henning Redestig * etc/ess-roxy-tests.R (trickyInArgsComments): small examples I used to try out ess-roxy 2011-05-03 Rodney Sparapani * doc/unixlike.texi (Unix installation): * Makeconf (LISPDIR): Installing everything into site-lisp is sloppy; better to create an ess sub-directory and install there. 2011-04-26 Rodney Sparapani * doc/help-sas.texi (ESS(SAS)--TAB key): removing all references to uncommenting ess-site.el code since we moved away from that several years ago, however, the vestiges still linger (OK, but isn't that what vestiges do?) 2011-03-07 Stephen Eglen * doc/help-s.texi (ESS(S)--Editing files): Document calling R-mode directly. 2011-03-01 Stephen Eglen * doc/ess.texi (Debugging R): New node. 2011-02-28 Rodney Sparapani * doc/requires.texi: update BUGS info and include texi2dvi WARNING 2011-02-03 ESS Maintainers * Version 5.13 released. 2010-12-15 Dirk Eddelbuettel * etc/pkg-Maintainers (Debian): updated 2010-11-09 Rodney Sparapani * doc/announc.texi (Announce): \ * doc/currfeat.texi (Current Features): \ * doc/requires.texi (Requirements): \ * doc/stabilty.texi (Stability): \ Minor tweaks to bring it slightly more up-to-date. 2010-11-08 ESS Maintainers * Version 5.12 released. 2010-08-13 Stephen Eglen * doc/ess.texi (Org): New section describing interaction with Org mode, contributed by Dan Davison and Eric Schulte. 2010-07-13 ESS Maintainers * Version 5.11 released. 2010-06-08 ESS Maintainers * Version 5.10 released. 2010-05-21 ESS Maintainers * Version 5.9.1 released. 2010-05-21 ESS Maintainers * Version 5.9 released. 2010-04-25 Henning Redestig * doc/ess.texi (Roxygen): added documentation for ess-roxy 2010-04-08 Rodney Sparapani * doc/ess.texi (Top): Cosmetic change to see if the web page is updating like it should 2010-03-03 ESS Maintainers * Version 5.8 released. 2009-12-07 ESS Maintainers * Version 5.7.1 released. 2009-12-07 ESS Maintainers * Version 5.7 released. 2009-12-04 ESS Maintainers * Version 5.6 released. 2009-11-22 Stephen Eglen * doc/help-s.texi (iESS(S)--Inferior ESS processes): Add documentation about how exec-path determines which directories are searched to find R versions. 2009-10-07 ESS Maintainers * Version 5.5 released. 2009-10-02 Martin Maechler * doc/{windows|unixlike}.texi: fix *wrong* e-mail for ess-help 2009-06-08 ESS Maintainers * Version 5.4 released. 2009-05-27 Rodney Sparapani * Makefile (downloads): new target for creation of .tgz and .zip only 2009-04-22 Stephen Eglen * doc/ess.texi (TAGS): Describe R CMD rtags. (TAGS): Expand on documentation, thanks to feedback from Martin. 2009-03-05 Rodney Sparapani * doc/newfeat.texi, doc/help-bugs.tex, doc/help-jags.texi: ESS[BUGS] and ESS[JAGS]: typing = now results in <- 2009-02-23 Rodney Sparapani * Makeconf: update LISPDIR, INFODIR, ETCDIR for XEmacs. Use the modern default /usr/local/share/xemacs rather than the deprecated /usr/local/lib/xemacs. Also, default to the site-packages subdirectory rather than xemacs-packages, this allows you more freedom to update the SUMO packages without touching your ESS installation and vice versa. 2009-01-23 ESS Maintainers * Version 5.3.11 released. 2009-01-21 Rodney Sparapani * Makefile (all install clean distclean): @for loop throws away exit code, probably due to cd .. which always returns 0; @for no longer used 2009-01-13 Rodney Sparapani * doc/windows.texi and doc/unixlike.texi (Installation): replace fake double quotes in examples with real double quotes 2009-01-12 Rodney Sparapani * doc/Makefile, doc/ess.texi, doc/readme.texi, doc/windows.texi, doc/unixlike.texi (Installation): new simplified installation instructions for Windows and Unix/Unix-like including Mac OS X (major changes now complete) 2009-01-07 Rodney Sparapani * doc/Makefile (TEXISRC): add help-jags.texi to list * doc/help-jags.texi (ESS(JAGS)--Log files): the "log" of the run is now .jog (like BUGS which is .bog); .out created too many problems since the BOA output files have that extension as well (ESS(JAGS)--Model files): adding 2 new local variables: ess-jags-burnin and ess-jags-update. ESS[BUGS] has similar variables, but the modern defaults are an order of magnitude bigger, so it seemed like creating new variables was warranted 2008-12-17 Rodney Sparapani * doc/windows.texi (Microsoft Windows installation): this file will replace the Windows portion of inst_tar.texi 2008-12-15 Rodney Sparapani * doc/Makefile (install-other-docs): fixing yet another bug related to DOCDIR, was there no testing at all before foisting this on us? 2008-12-09 Rodney Sparapani * Makeconf and doc/Makefile (DOCDIR): belatedly document and defensively create 2008-12-03 Rodney Sparapani * Makeconf and doc/readme.texi (README re-organization): Add TOC for plaintext format only, requires re-defining MAKETXT accordingly. 2008-12-02 Rodney Sparapani * doc/readme.texi and doc/Makefile (README re-organization): re-arrange so that installation information comes in the 4/5th sections rather than much further down (7/8th); also massaged wording in the intro which no longer requires as much perl (which I never really understood since I don't speak perl; shall we stick to what we all know: e-lisp/make/texi/not perl/etc.) 2008-11-14 Stephen Eglen * doc/ess.texi (Indenting): Describe roxygen 2008-07-28 ESS Maintainers * Version 5.3.8 released. 2008-04-10 ESS Maintainers * Version 5.3.7 released. 2007-09-13 ESS Maintainers * Version 5.3.6 released. 2007-08-15 ESS Maintainers * Version 5.3.5 released. 2007-07-20 Stephen Eglen * doc/help-s.texi (iESS(S)--Inferior ESS processes): Document R-newest. 2007-04-26 ESS Maintainers * Version 5.3.4 released. 2006-12-16 Martin Maechler * doc/ess.texi (Help): do look up the 's *' bindings and mention differences R <-> S(-plus) 2006-09-26 ESS Maintainers * Version 5.3.3 released. 2006-09-19 ESS Maintainers * Version 5.3.2 released. 2006-06-03 ESS Maintainers * Version 5.3.1 released. 2006-04-07 ESS Maintainers * Version 5.3.0 released. 2006-04-07 Martin Maechler * doc/refcard/refcard.tex: update for ESS 5.3.0 2006-02-09 Anthony Rossini * doc/newfeat.texi: documentation for @code{ess-use-inferior-program-name-in-buffer-name}, 2006-02-07 ESS Maintainers * Version 5.2.12 released. 2006-01-06 Stephen Eglen * doc/ess.texi (Help with emacs): New section, referring people to Emacswiki and FAQs. 2005-11-14 ESS Maintainers * Version 5.2.11 released. 2005-09-09 ESS Maintainers * Version 5.2.10 released. 2005-08-30 ESS Maintainers * Version 5.2.9 released. 2005-05-12 ESS Maintainers * Version 5.2.8 released. 2005-04-18 ESS Maintainers * Version 5.2.7 released. 2005-03-14 ESS Maintainers * Version 5.2.6 released. 2005-02-01 ESS Maintainers * Version 5.2.5 released. 2005-01-06 ESS Maintainers * Version 5.2.4 released. 2004-12-31 Stephen Eglen * doc/inst_tar.texi (Unix installation): Remove note regarding GNU Make, as this is relevant only for developers, and so does not need to be in the user's guide [the shorter the installation instructions, the better!] 2004-12-29 Stephen Eglen * doc/newfeat.texi: Mention changes to completion. * doc/inst_tar.texi (Unix installation): Comment out optional step about creating database files for slow computers; delete later. * doc/ess.texi (Completion details): Comment out note about slow completion on old systems; delete later. (Imenu): Add note about imenu regexps. 2004-10-27 Martin Maechler * doc/ess.texi: added Debian patches from Camm Maguire * lisp/* : dito for six files 2004-09-21 ESS Maintainers * Version 5.2.3 released. 2004-07-27 Martin Maechler * Moved from CVS to Subversion 2004-07-08 ESS Maintainers * Version 5.2.2 released. 2004-06-28 ESS Maintainers * Version 5.2.1 released. 2004-05-22 Stephen Eglen * doc/ess.texi (Interactive ESS): At the start of the chapter on iESS, introduce a few general terms before getting into specifics. 2004-05-17 Stephen Eglen * doc/ess.texi: Few typos; add brief description of Imenu and document the 'l' key when viewing help files. 2004-05-05 Stephen Eglen * doc/ess.texi (winjava): Put empty lines around example to get proper formatting. 2004-05-04 Stephen Eglen * doc/help-s.texi (ESS-help--assistance with viewing help): Refer to Help chapter. * doc/ess.texi (Multiple ESS processes): ess-request-a-process not bound to C-c C-k. Commented out some doc for ess-plain-first-buffername. (System dependent): Change of section name from "Other variables ..." to "Variables ...". 2004-04-28 Stephen Eglen * doc/ess.texi: Document winjava, inferior-ess-own-frame and ess-help-own-frame. 2004-02-22 Stephen Eglen * doc/bugrept.texi: Describe how to make a *Backtrace* buffer. 2004-02-19 Stephen Eglen * doc/ess.texi (ESS processes on Remote Computers): add brief notes on how to get a ssh buffer. Note that URL currently spills into right margin in ess.pdf; anyway to prevent that? 2002-11-29 Stephen Eglen * doc/ess-defs.texi: New file to provide macros for formatting R, S, SPLUS. * doc/ess.texi: Quite a few updates to the documentation: Include ess-defs.texi for @Sl macro. Add Stephen to author list. Remove bold from ESS/S. Remove Variable and command index (had just two entries). Use "X window system" or "X11" rather than "X-windows" (see `man X'). Add section on editor=emacsclient. Change "more historic"->"older" Correct exit() entry in the variable and command index. Remove multiple references to Emacs/XEmacs differences in .emacs/init.el for init file. 2002-08-07 Martin Maechler * VERSION: new version -- Makefile did not commit (aarggh).. * lisp/Makefile, Makefile: more Makefile tweaks: lisp/ess-cust.el with proper version number must be committed (in time before tagging etc) * lisp/ess-cust.el: new version -- Makefile did not commit (aarggh).. * info/ess.info-3, info/ess.info-4, info/ess.info-1, info/ess.info, info/ess.info-2: Updating info for new version * ANNOUNCE, README: Updating README, ANNOUNCE for new version * doc/newfeat.texi: prepare for release of 5.1.23 (with *correct* version number)! * Makefile: dist: also update lisp/ess-cust.el rel : also `tag' 2002-08-06 rsparapa * info/ess.info-1: Updating info for new version * ANNOUNCE, doc/authors.texi, doc/getting.texi, doc/inst_cvs.texi, doc/newfeat.texi, doc/requires.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4, README: docs: I was trying to create a PDF version of ANNOUNCE with texi2dvi and dvipdf (is there a better way?). And, certain functions like @email and @code betray unsightly behavior. I replaced @email with @uref:mailto and @code with @display. You may note that a better translation of @code would be @example, but @example misbehaves as well. @display doesn't make a difference for info or HTML, but it does for PDF. However, there doesn't appear to be an alternative for the moment. Another bug, is texi2html ignores the @enumerate argument (besides mishandling @macro statements). Oh joy! 2002-08-05 rsparapa * ANNOUNCE, doc/announc.texi, doc/Makefile, doc/readme.texi, README, info/ess.info-1: docs: some final minor changes to docs before release. Also, attempted to address Martin's concern in doc/Makefile with respect to install. Now, you can differentiate between making in the doc directory and installing elsewhere as the documentation indicates. The target install has returned for info files only. 2002-08-02 rsparapa * doc/dir, doc/help-sas.texi, doc/Makefile, info/ess.info-1, info/ess.info, README, info/ess.info-2: info: Rich's comment made me realize that we may also need to "install" the dir file. So, I changed the Makefile to: $(INFODIR)/ess.info: $(TEXISRC) @echo "making Info documentation..." $(MAKEINFO) ess.texi $(INSTALL) ess.info* $(INFODIR) test -f $(INFODIR)/dir || $(INSTALL) dir $(INFODIR) I suppose that a more sophisticated approach could be taken, but this is probably good enough for now. I believe that all issues that I was working on are now complete. I'm going on vacation on 8/7 and then to JSM the following week, but I should have e-mail and internet access the whole time. Did someone once say "Release early and release often"? 2002-08-01 rsparapa * info/dir: dir: I discovered what the problem is with @direntry and GNU Emacs 21. Apparently, the functionality differs between XEmacs and Emacs. Under XEmacs, the @direntry has precedence over the dir file. Emacs appears to be just the opposite. So, I edited the dir file by hand. Not sure where this file comes from. info/emacs does not create this file in a directory that doesn't already have one. The file doesn't seem to be created by makeinfo and thats where the problem lies. There is no synchronization between @direntry and dir once dir has been created (however that happens). The best solution at present is to keep the two in synch by hand. Which really isn't that big of a deal since we are only talking about one line being identical in dir and ess.texi * doc/ediff-sas.gif, doc/ess-demo.jpg, doc/ess-intro.pdf, doc/ess-intro.tex, doc/font-cor-s.gif, doc/font-cor-s.jpg, doc/font-incor-s.gif, doc/font-incor-s.jpg, doc/hilock-sas.gif, doc/Makefile, README, fontlock-test/baseball.sas, info/ess.info, info/ess.info-1, info/ess.info-2, info/ess.info-3, info/ess.info-4: docs: committing files based on recent discussion 2002-07-31 rsparapa * doc/ess.texi, README: HTML docs: a few tweaks to the texinfo to create a reasonable HTML table of contents * doc/ess.texi, README: doc bug: I was testing out the info docs and I realized that the "Detailed Node List" and the actual nodes for Installation were different. In this case, it would lead you to believe that there weren't any relevant topics in the Installation section because you see the "Detailed" list first, but there's nothing on it. I suppose you could carefully check each "Detailed" vs. actual node combination, but that would be time-consuming and prone to failure. And, I also realized that nobody would want a 100 item list when they can drill-down from a 10 item list anyways. So, I was lazy and just commented out the entire "Detailed Node List". * ANNOUNCE, doc/Makefile, README, doc/announc.texi, doc/authors.texi, doc/credits.texi, doc/ess.texi, doc/help-sas.texi, doc/inst_tar.texi, doc/readme.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4: more doc changes: Where should I begin? I realized that having info files might not be helpful if you didn't already have ESS installed. So, I decided to create HTML docs and put them @ software.biostat.washington.edu:/ess/doc/html But, texi2html doesn't work with version.texi. After pulling my hair out, I decided to read the documentation. Guess what? texi2html doesn't support @macro commands. So, instead of @essver{}, I replaced those references by @include ../VERSION which seems to work. Of course, this was after I re-did the doc/Makefile thinking there was something wrong in there. The HTML docs are now on the net. And, lots of other "improvements" to the docs. * doc/ess.texi, info/ess.info, README, info/ess.info-1, info/ess.info-2, info/ess.info-3, info/ess.info-4: info: running some long SAS jobs, ZZZZZzzzzZZZZZ... Meanwhile, re-wrote parts of the intro and re-arranged some of the documentation categories; boy is that fun. NOT! Promoted "Help for the S family" and "Help for SAS" to main categories so you don't have to poke around so long. One bugaboo that remains with GNU Emacs 21.1-21.3 is the @direntry which is set to: * ESS: (ess). Emacs Speaks Statistics (S/S+/R, SAS, BUGS, Stata, XLisp-Stat). but, Emacs sadly reports: ESS Version 5.x.y (was: S-mode). This works fine on XEmacs 21.4.8 and I'm using texinfo 4.2 * lisp/ess-utils.el: ess-kermit-get, ess-kermit-send I had to replace (shell) with ess-sas-goto-shell; maybe we should generalize ess-sas-goto-shell and ess-sas-shell-buffer in ess-utils.el too 2002-07-30 rsparapa * lisp/Makefile: lisp/Makefile: essa-sas.el should not be compiled since it is required by essl-sas.el and therefore, already compiled * lisp/Makefile: lisp/Makefile: fixed a bug testing whether a directory is . 2002-07-29 rsparapa * doc/ess.texi, doc/help-sas.texi, info/ess.info, info/ess.info-1, info/ess.info-3, README, info/ess.info-4: Help for SAS: more updates and fixes; now ready for release 2002-07-27 rsparapa * doc/Makefile, Makefile: Makefile: changed target info to the more descriptive and appropriate docs 2002-07-26 rsparapa * doc/ess.texi, doc/help-sas.texi: ESS[SAS] info documentation: lots of minor changes that should make it a better intro as well as a more complete and correct manual * doc/Makefile, lisp/Makefile, Makeconf, Makefile: more Makefile mods: made INSTALL comments more explicit and removed install as the target from main Makefile, it was only present in the lisp Makefile in any case * Makefile: main Makefile: realclean target deleted; doc and lisp Makefile's don't have it anyway; ESSVERSIONDIR changed to ESSDIR * Makeconf: Makeconf: made 2 comments more explanatory * doc/Makefile, Makeconf, Makefile, doc/newfeat.texi: more Makefile/Makeconf improvements: I think this should do it for the next release. Enjoy! * info/ess.info-1, info/ess.info: Updating info for new version * ANNOUNCE, README: Updating README, ANNOUNCE for new version * Makeconf, README, doc/Makefile, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4, lisp/Makefile: more Makefile changes: Apparently, we had two different methods for replacing old version numbers with new ones. For some reason, the old method based on perl stopped working. So, we created a new method based on @essver{}. However, the old version targets and dependencies remained. I have no idea what kind of weirdness resulted from that. Just in case, I'm removing the old method. 2002-07-25 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-sleep-for now defaults to 5 seconds on Windows only (which was where the problem was initially) * lisp/essa-sas.el: ESS[SAS]: fixed bug in ess-sas-submit-sh for Kermit file transfers; noticed that ess-kermit- functions call (shell) when it probably should be ess-sas-goto-shell 2002-07-24 rsparapa * doc/Makefile, fontlock-test/baseball.sas, Makeconf, Makefile, VERSION: Makefile happy-land: I think I finally figured this maze out. We'll see when we try to release 5.1.21 * lisp/ess-utils.el: ess-utils.el: fixed a bug in ess-save-and-set-local-variables; more exhaustive testing later tonight * lisp/essa-sas.el: ESS[SAS]: ess-save-and-set-local-variables is now called from ess-sas-submit-sh, ess-sas-submit-windows and ess-sas-submit-mac rather than save-buffer which formerly appeared in ess-sas-submit. Not, sure what to do with ess-sas-submit-iESS, but it should not be called in ess-sas-submit-region. Also, now called in ess-sas-data-view so you can take advantage of the recently added ess-sas-data-view-fsview-statement buffer-local variable. * lisp/ess-utils.el: ess-utils.el: added 2 new functions ess-search-except: searches forward for a regexp, stores as match 1 and optionally, ignores results that also match a second regexp parameter, and optionally, searches backward for a third non-nil parameter ess-save-and-set-local-variables: if a buffer is modified, save the buffer and if Local Variables are defined, update them with revert returning t if buffer was modified and nil otherwise * lisp/essa-sas.el: ESS[SAS], ess-sas-data-view: Now, I'm adding features just for myself. I've always wanted the capability to add a PROC FSVIEW statement to an ess-sas-data-view call, but I just never got around to it. You can configure it with the string ess-sas-data-view-fsview-statement. Also, you can now change the PROC FSVIEW command itself with ess-sas-data-view-fsview-command and I renamed ess-sas-data-view-options to ess-sas-data-view-submit-options to make it more clear what it does (i.e. so you don't confuse -options with -fsview-command). * Makeconf, doc/Makefile, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, Makefile, info/ess.info-4, lisp/Makefile: Makeconf/Makefile tweaking: still need to re-organize doc Makefile which is currently in the main Makefile and the doc Makefile 2002-07-23 rsparapa * Makeconf: Makeconf: minor improvements in anticipation of a more important role for this method of installing ESS * lisp/make-regexp.el: make-regexp.el: timing functions removed due to name collisions with Gnus 2002-07-22 rsparapa * lisp/essa-sas.el: ESS[SAS]: extended ess-sas-goto-shell to take an optional argument if non-nil, then set-buffer rather than switch. This new call replaces code chunks in ess-sas-submit-region, ess-sas-data-view and ess-sas-graph-view. Furthermore, this behavior is what was intended in nearly all (ess-sas-goto-shell) calls and I have replaced them all with (ess-sas-goto-shell t); except for the key-bindings for F8/F3 and the code that deals with kermit file transfers which require the old behavior. Have only tested on XEmacs and 'sh, so YMMV. * lisp/essa-sas.el: ESS[SAS]: ess-sas-goto-shell resurrected! Our recent discussion with respect to each SAS program, perhaps, needing it's own ess-sas-submit-method brought me back to ancient discussions of asynchronous shell buffer names. Emacs and XEmacs named them differently. Our solution was to use & for 'sh and start for 'ms-dos to make synchronous processes asynchronous. However, this made ess-sas-goto-shell unnecessary since the buffer was always *shell*. Now, I added the variable ess-sas-shell-buffer which is buffer-local and defaults to *shell*. If you set this to something else, then you will get another shell buffer. And, ess-sas-goto-shell will take you to whichever one you need. So, we are back to the original function. I also moved the add-hook call to the shell creation step since it seemed like over-kill to call it every time you did ess-sas-submit-sh. Is this enough explanation or am I boring you? 2002-07-19 rsparapa * lisp/essa-sas.el: ESS[SAS]: tweaks to -> ess-sas-submit-mac for JSM presentation * lisp/essa-sas.el: ESS[SAS]: ess-sas-submit-method needs to be buffer-local so that ess-sas-submit can submit different buffers in different ways with the Local Variables trick 2002-07-16 rsparapa * lisp/ess-utils.el: ess-utils.el: added ess-kermit- functions; now, it's really ready for testing * lisp/ess-cust.el: ess-cust.el: added ess-kermit- variables * lisp/essa-sas.el: ESS[SAS]: moved ess-kermit- variables to ess-cust.el and ess-kermit- functions to ess-utils.el * lisp/ess-cust.el: ess-cust.el: applied Stephen's patch; also changed more :types from "string" to 'string; finally, fixed custom-ize for SAS; it always worked if you specified 'ess-sas for the group, but never worked if you specified 'ess; this was because defgroup defined 'ess-SAS rather than 'ess-sas; and, now I understand what :prefix does; we discussed this previously and nobody knew (the documentation doesn't say either); :prefix is the beginning of the variable name that the custom-ize buffer doesn't show you; therefore, it seems that :prefix should be "ess-" for 'ess-sas; I think this is what it always was, but now I know this is right; only tested this on XEmacs 21.4.8 which is nearly bullet-proof; please test on buggier versions of (x)emacs 2002-07-11 rsparapa * lisp/essa-sas.el: ess-search-except, ess-sas-data-view, ess-sas-graph-view: improvements to all; simplification of the latter -view's with ess-search-except and other minor changes * lisp/essa-sas.el: ess-search-except: I forgot to include the bloody example of it's use; now see ess-sas-data-view. * lisp/essa-sas.el: ess-search-except: I believe it does what we want now. Sorry, to make this a multi-stage commit, but I can think in SAS, not elisp yet :o) * lisp/essa-sas.el: ess-search-except: I had some free time and I decided to write a function to perform the complex searches that are necessary for ess-sas-data-view. I suppose a function like this would be valuable for ess-sas-graph-view and for other packages as well. After a bit more testing, I'll put it some place more appropriate. I suppose we don't have alot of time left before 5.2.0 * lisp/essa-sas.el: ess-sas-data-view: the code will make your head hurt, but the search for a permanent SAS data just got a little smarter. After it finds a tentative candidate in a forward search, it checks if it is a work./first./last. If so, then it backward searches. I suppose a better approach would be to write an ess-search function that takes arguments for regexp, direction, and exceptions to ignore. I don't have time right now, but let's add it to the TODO. 2002-07-02 rsparapa * doc/ess.texi: updated copyright to 2002. Deep thought: does everything need a person to copyright it? Wouldn't it be better to have something like: Copyright (C) 2002 ESS Developers? 2002-06-24 rsparapa * lisp/essa-sas.el: ess-sas-data-view: Now ignoring WORK datasets since there is no way to open them anyway. It would be nice if this function (as well as ess-sas-graph-view) could also be accessable via the mouse. Any hints as to how to do it would be appreciated. Currently, you have to move the point manually or re-type the dataset/graph that you want to view. Just clicking on a dataset/graph would be easier. 2002-06-24 Martin Maechler * lisp/essdsp6w.el, lisp/essd-r.el, lisp/essd-s3.el, lisp/essd-s4.el, lisp/essd-sp3.el, lisp/essd-sp4.el, lisp/essd-sp5.el, lisp/essd-sp6.el: activate imenu for S+modes, using the ess-[SR]-use-imenu variable (in R and S+) 2002-06-20 rsparapa * lisp/ess-emcs.el, lisp/ess-inf.el, lisp/ess-menu.el, lisp/ess-mode.el, lisp/ess-mous.el, lisp/ess-trns.el, lisp/noweb-mode.el: all ess-running-xemacs have now been replaced with (featurep 'xemacs) * VERSION: VERSION: 5.2.0 2002-06-19 rsparapa * lisp/ess-emcs.el: ess-emcs.el: (featurep 'xemacs) has been implemented according to Rich's suggestion; however, ess-running-xemacs is rather pervasive among numerous other ESS lisp files; I don't have time to go into every file and change them all; but, this will certainly be the recommended route to take with ESS 6 2002-06-19 rmh * lisp/essdsp6w.el, lisp/ess-emcs.el, lisp/essd-sp4.el, lisp/ess-site.el: w32-short-file-name win32-short-file-name 2002-06-19 rsparapa * README, ANNOUNCE: Updating README, ANNOUNCE for new version 2002-06-18 rsparapa * doc/ess.texi, doc/inst_tar.texi: Unix Installation: massive changes; I really don't understand points 7 and 8, but I assume the XEmacs parts of 8 will change once 5.2.0 is an "official" XEmacs package; I suggest similar changes be made to Microsoft Windows Installation, but I made none. Enjoy! 2002-06-18 Martin Maechler * lisp/essd-r.el: allow prompt "Browse[1]> " -- i.e. add "[]" to valid prompt chars (but not as first one!) 2002-06-18 rsparapa * lisp/essa-sas.el: ess-kermit-get: last bug-fix ; it's about as user-friendly as I can imagine at the moment 2002-06-17 rsparapa * doc/help-sas.texi, doc/inst_tar.texi, doc/newfeat.texi, doc/requires.texi: doc: minor improvements * doc/currfeat.texi, doc/newfeat.texi: doc: a few minor changes in preparation for the 5.2.0 release * lisp/essa-sas.el: ESS[SAS]: fixed a newly introduced bug in ess-kermit-get; synchronized ess-kermit-send with ess-kermit-get; replaced equal with string-equal (do we need to do this globally?); I'd like to do a little bit more testing before 5.2.0; I'll try to get it done tonight * lisp/essa-sas.el: ESS[SAS]: changes for more user friendly kermit file transfers; ess-kermit-prefix default is now # which should be os-independent; former defaults, : or ], could be problematic and were based on ange-ftp/efs/tramp (an unnecessary restriction it turns out); when ess-sas-goto is passed the suffix "log" or "lst" ess-kermit-get is called if the file starts with ess-kermit-prefix; other extensions could be dangerous since you might have altered the local copy whereas .log and .lst files are only being modified by the SAS batch job; as long as the integrity of the .sas program is maintained .log and .lst can always be retrieved if an unwanted transfer overwrites them 2002-06-04 rsparapa * lisp/ess-utils.el: ess-utils: explanatory comment on the recent change in ess-revert-wisely 2002-05-28 rmh * doc/ess.texi, doc/help-sas.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4: M-x SAS does not work with MS Windows 2002-05-28 rsparapa * Makefile: Makefile: made compile the default; also fixed problem with make all 2002-05-27 Martin Maechler * doc/README.SPLUS4WIN: 5.1.21, not *.20 (is this not yet integrated in *.texi ?) 2002-05-21 rmh * doc/dir, info/dir: dir file needed in same directory as *.info* files * doc/ess.texi, doc/help-sas.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4, README: improve documentation for ess-remote 2002-05-20 rsparapa * Makefile: Makefile: commented out a stray reference to info in the doc directory * ANNOUNCE, README: Updating README, ANNOUNCE for new version 2002-05-17 rmh * doc/ess.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4: document ess-remote, S+elsewhere, ess-elsewhere * doc/ess.texi, doc/help-s.texi, doc/inst_tar.texi, info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4, README: add reference to ~/.xemacs/init.el as the Xemacs alternate for the Gnu emacs file .emacs 2002-05-16 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-sas-data-view; oops that was not right. now fixed. dataset names may end in macro variables, but libraries must not 2002-05-14 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-sas-data-view will now recognize a permanent SAS dataset name that ends in a macro variable. You will be prompted with the portion of the name up to, but not including the macro variable, since it wouldn't be valid otherwise. You will need to complete the dataset name. You cannot use a macro variable for the library since &libname.dataname is macro concatenation. 2002-05-13 rsparapa * lisp/essa-sas.el: ESS[SAS] doc-strings: updated doc-strings for ess-sas-submit-method * doc/help-sas.texi: ESS[SAS] help: ess-sas-submit-method discussed, with respect to both local and remote SAS batch jobs including Kermit 2002-05-12 rmh * info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4: repair trailing garbage by removing [] from node names * doc/ess.texi, doc/help-sas.texi, doc/help-s.texi: @node lines cannot contain []. I replaced them with () in the node lines and left them at [] in the section heads and in the body of the text. 2002-05-10 rsparapa * doc/help-sas.texi: ESS[SAS] help: discussion of ess-sas-submit-command etc. But, still need to discuss ess-sas-submit-method and kermit too. 2002-05-10 rmh * doc/ess.texi: Thank you Martin, I was starting do essentially the same thing to ess.texi. Now I don't have to. I did one extra step. We had an empty chapter in the dvi that I commented out. @comment @chapter Help for Statistical Packages Then I promoted both S and SAS to chapter status. @chapter Help for the S family @chapter Help for SAS There is a fundamental problem in both help-s.texi and help-sas.texi. Make the ess.dvi and then look at the S and SAS chapters. Both chapters have a trailing piece of the node-name as the last line in each section. I tried several ways to make that go away with no success. Can you figure out what is going on and fix it? Thanks 2002-05-10 Martin Maechler * doc/ess.texi, doc/inst_tar.texi: comment empty chapter; update nodes and menus (in Emacs) and hand fix 2002-05-10 rmh * lisp/essd-els.el: gnuclient doesn't work across tcpip (or at least I don't yet know how), so I removed it from inferior-ess-language-start for ess-remote. * lisp/essdsp6w.el, lisp/essl-s.el: S-Plus 6 help() function uses pager=options()$help.pager I modified inferior-S-language-start in essl-s.el to always define options()$help.pager to have the same value as options()$pager. Only S-Plus 6 uses this new value. The way the statement is constructed, it does not get used for R and it generates a harmless extra component to the options() in earlier versions of S-Plus. 2002-05-10 rsparapa * doc/getting.texi, doc/newfeat.texi: doc: updates for next release 2002-05-10 rmh * lisp/essd-sas.el: put ess-eval-line-and-step-invisibly on C-c i on sas-mode-local-map * lisp/essd-els.el: ess-remote for SAS needs shell-mode * lisp/ess-inf.el: ess-eval-line-and-step-invisibly is needed for ess-remote to work with sas * lisp/essd-els.el: ess-remote now works for "sas -stdio" 2002-05-09 rsparapa * doc/announc.texi: ANNOUNCE: missed a reference to @essver{} 2002-05-08 Martin Maechler * lisp/ChangeLog, lisp/ess-trns.el: clean-region fix for new menu function 2002-05-07 Martin Maechler * doc/Makefile: better Makefile fixes; add "pdf" target * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.info-4, doc/Makefile: Makefile fixes; ess.info* only in ../info * doc/requires.texi: @footnote properly * doc/help-s.texi: some @item s fixed --- do NOT use manual "-" for items! * doc/requires.texi: minor typo in footnote * doc/Makefile: run pdftex twice 2002-05-07 rsparapa * README: Updating README, ANNOUNCE for new version 2002-05-06 rmh * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.info-4, doc/help-s.texi: @display * Makefile: add ess.info-4 2002-05-05 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-kermit-send incorporated into ess-sas-submit-sh kermit is almost as transparent as tramp and ange-ftp/EFS just execute ess-sas-submit like any other file 2002-05-05 rmh * lisp/ess-trns.el: install Thomas Baumann repair to ess-transcript-clean-region 2002-05-04 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-sas-submit-sh now works with local copies of kermit transfer files. just need some documentation. 2002-05-03 rsparapa * lisp/essa-sas.el: ESS[SAS]: ess-kermit-send now works although I haven't tested it completely. still need to fix ess-sas-submit-sh * lisp/essa-sas.el: ESS[SAS]: updated ess-kermit-get per the latest proposal; created a variable ess-kermit-prefix which is customize-able that can be used to specify the files that are recognized as local kermit copies of remote files. : is the default and the only other value that is recommended is ] also, created ess-kermit-remote-directory which is buffer local and the default is customize-able; currently $HOME when you run ess-kermit-get you can reset this variable and ess-kermit-get is now documented haven't fixed ess-kermit-send, but it should be trivial also note, that if you have just done an ess-kermit-send then ess-sas-submit-sh should work as long as we handle the cd command appropriately, i.e. "cd ." 2002-05-02 rmh * lisp/essd-els.el: change SAS to SAS-customize-alist * lisp/essd-els.el: add &optional proc-name to ess-remote 2002-05-01 rmh * lisp/essd-els.el: ess-remote First draft of what I consider the right way to do what we have previously called S+elsewhere and ESS-elsewhere. Please test this. Start a telnet or other protocol to a remote computer, start S or R (or maybe something else), M-x ess-remote, and tell it which dialect. You are now talking to an inferior-ess process. I added all the *-customize-alist to ess-select-alist-dialect. I added only sp6 to the dialects we prompt for, but all will be recognized. Rodney, dialect "sas" points to S+elsewhere-customize-alist rather than to SAS-customize-alist. If this works then ess-add-ess-process should be moved from essa-sas.el to ess-inf.el * lisp/essdsp6w.el, lisp/ess-site.el: tweaks to S+6 for S-Plus 6.1 for Windows beta 1 Delay time is now a user variable ess-S+6-startup-delay. No delay time for S+6-existing. We verify the version of S-Plus 6 and hide and make read-only the file we check. ESS now prompts for the correct directory. 2002-04-29 rmh * lisp/essdsp6w.el: S-Plus 6.1 beta for Windows works correctly with ESS. 6.0 didn't work correctly. I modified M-x S+6 to "Verify that `inferior-S+6-program-name' points to S-Plus 6. Start normally for S-Plus 6.1. Inform the user to start S-Plus 6.0 from the icon and than connect to it with `S+6-existing'. Give an error message if `inferior-S+6-program-name' doesn't point to S-Plus 6." S-Plus 6.1 starts up exceedingly slowly. I changed the delay time in M-x S+6-initiate to 60 seconds (double what we needed for M-x S+4). The is the delay needed for my 300MHz machine. I will make this a variable so the users can customize it for their speed. 2002-04-27 Martin Maechler * lisp/ess-trns.el: ..-DO-clean-region; added to Menu; see ChangeLog * lisp/essd-sp6.el: ess-setup-directory-fun etc from Jeff Mincy 2002-04-26 Martin Maechler * lisp/ess-cust.el: version number was lost -- bug in perl in Makefile ??? * doc/Makefile: ess.info -> ../info * lisp/ess-cust.el: new ess-directory-function and ess-history-directory stuff from Jeff Mincy * lisp/ess-site.el: wrap file-name-as-directory around ess-lisp-dir... [from Jeff Mincy] 2002-04-25 rossini * lisp/essd-r.el: we don't want the semantic stuff "live" yet! * lisp/essd-r.el, lisp/r.bnf, lisp/sas.bnf, lisp/semantic-r.el, lisp/semantic-sas.el: These files are the start of semantic.el support. Useful for using the CEDET tools (cedet.sourceforge.net), including ECB. Definitely worth a bit of time, but they get awfully confusing. 2002-04-21 rmh * lisp/essa-sas.el: simplify ess-sas-toggle-sas-log-mode for legibility, no change in what it does, see email for details. 2002-04-17 rmh * doc/ess.info-4, doc/Makefile: we now have ess.info-4 * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.texi, doc/help-sas.texi, doc/help-s.texi, doc/inst_tar.texi, doc/Makefile: I fixed up help-sas, installed help-s, fixed up some style issues, cleaned up cross references to empty pages. All occurences of @essver MUST have braces @essver{} or else the remainder of the source line is treated as a comment. The doc/Makefile doesn't depend on the *.texi files. I attempted to change it to $(ESSINFODIR)/ess.info: *.texi but that doesn't work. So I used $(ESSINFODIR)/ess.info: ess.texi help-sas.texi inst_tar.texi The @display requires everything to be left justified. Otherwise the indentations are interpreted as hard spaces. Why are some lines in @display and others in @example? They look the same. This is inst_tar.texi, lines 29-36 @example gunzip ess-@essver{}.tar.gz tar vxf ess-@essver{}.tar @end example @display (or: @code{gunzip < ess-@essver{}.tar.gz | tar vxf -} ). (or using GNU tar: @code{tar zvxf ess-@essver{}.tar.gz}). @end display I added the control-function keys to help-sas.texi I fixed the help menu pointers to the empty operating system nodes. As long as I am doing info, I fixed up help-s.texi and installed it. It compiles correctly. It still needs to be read carefully to make sure it is coherent. I think the various doc/README* files now need to be regenerated from the appropriate *.texi files. 2002-04-16 rsparapa * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/Makefile: Updating docs for new version * README: Updating README, ANNOUNCE for new version * doc/readme.texi: Updating docs for new version * README: Updating README, ANNOUNCE for new version * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.texi, doc/inst_tar.texi, doc/readme.texi: Updating docs for new version * README: Updating README, ANNOUNCE for new version * doc/inst_tar.texi: doc: added one @display that I forgot earlier 2002-04-16 rmh * doc/help-sas.texi: make last line less than 80 columns * doc/help-sas.texi: typos and introduce filetype-2 earlier * doc/help-s.texi, doc/readme.texi: @essver and s-plus 6 references 2002-04-16 rsparapa * Makefile: Makefile(xemacs-links): updated to reflect the new location of info files which makes a very logical connection in this case as well. * info/ess.info-1, info/ess.info, info/ess.info-2, info/ess.info-3, info/ess.info-4: info: need a directory with nothing else in it for a concise display and this seemed like a logical choice 2002-04-15 rsparapa * README: Updating README, ANNOUNCE for new version * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/help-sas.texi, doc/inst_tar.texi, VERSION: 5.1.21: more doc changes for release * ANNOUNCE, README: Updating README, ANNOUNCE for new version * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.texi, doc/help-sas.texi, doc/inst_tar.texi, doc/Makefile, doc/readme.texi, lisp/ess-emcs.el, Makefile: 5.1.21: lots of changes for 5.1.21 release * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/getting.texi, doc/help-sas.texi, doc/requires.texi: doc: many changes addressing Rich's concerns (please see rsparapa discussion if you are interested). Before 5.1.21 can be released, we need to figure out how to get texinfo to generate the proper version number in all documents. 2002-04-12 rsparapa * doc/newfeat.texi, lisp/essl-sas.el: ESS[SAS]: corrected font-locking for in: operator * doc/announc.texi, doc/help-sas.texi, doc/newfeat.texi: doc: changes for 5.1.21 release * doc/ess.info, doc/ess.info-1, doc/ess.info-3, doc/help-sas.texi: doc: First attempt at creating info documentation for SAS. It is basically README.SAS with a few additions/corrections. Fine for this release, but could use alot of work. * lisp/essa-sas.el: ESS[SAS]: F12 (graph view) now defined for all locales 2002-04-10 rsparapa * lisp/essl-sas.el: ESS[SAS]: estimate and contrast keywords are now highlighted 2002-04-09 rsparapa * doc/announc.texi, doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3, doc/ess.texi, doc/help-s.texi: doc: first attempt at creating user manual with texinfo. I thought that I could just mimic help-s.texi. However, help-s.texi appears to be a basket case. It has no @menu statements. This made it impossible for me to makeinfo. So, instead I created help-sas.texi from scratch based on README.SAS. Note that the @menu commands will cause problems if they contain : so I've been using --. Also note that makeinfo appears to create working info pages, but texi2dvi does not create documents correctly. It's a shame since they are very nice, except for garbage which appears to be mangled next, previous, and up. This will cause us alot of problems if we want to maintain one source and produce .info, .html and .pdf (I actually only tried viewing with xdvi, but I suspect the problem exists with other formats, but I pray not). 2002-04-04 hornik * lisp/essddr.el: Add '\docType'. 2002-03-27 rossini * xemacs/README: files and build/export for xemacs package 2002-03-22 rsparapa * lisp/essa-sas.el, lisp/essl-sas.el: ESS[SAS]: added font-lock support for legacy COMMENT...; style comments 2002-03-19 rsparapa * lisp/essa-sas.el: ESS[SAS]: Somehow managed to have to two functionally identical versions of ess-sas-file-path; now only one. 2002-03-18 rsparapa * doc/requires.texi: doc: added "custom" link 2002-03-17 rsparapa * doc/requires.texi: doc: noted that certain geriatric versions of emacs are no longer supported 2002-03-12 rmh * lisp/essd-r.el, lisp/ess-inf.el: make C-c C-q work with R I checked it on windows with rw1041. Please verify the repair for unix. essd-inf.el I modified ess-quit to treat R as a special case because R asks the question "Save workspace image? [y/n/c]: ". essd-r.el I modified inferior-ess-exit-command and added inferior-ess-exit-prompt 2002-03-03 rmh * lisp/ess-iw32.el: ess-command on windows. fix last week only needed if buf is t. 2002-02-27 rmh * lisp/Makefile: add mouseme.el to lisp/Makefile 2002-02-27 rsparapa * lisp/essa-sas.el: ESS[SAS]: GSASFILE viewing for Emacs 21.1; I figured out how to view image files in Emacs 21.1. But, apparently it only works for Unix at the moment. You have to turn on the minor mode auto-image-file-mode. Then opening a .jpg or .jpeg file will display it in a buffer. It is supposed to work with .gif files, but it doesn't for me; so I'm only activating this feature for JPEG. 2002-02-26 rsparapa * lisp/ess-emcs.el: lisp(ess-emcs.el): added a function to display graphical images per the XEmacs documentation (for 21.4 and higher) * lisp/essa-sas.el: ESS[SAS]: viewing GSASFILEs; XEmacs supports .gif and .jpg natively. So, on XEmacs, those formats are displayed in an empty buffer. Otherwise, graphics are handled as before (with an image viewer program). 2002-02-26 rmh * lisp/ess-iw32.el: The repair of the C-c C-l problem reported by S.McClatchie and Bj┬Ф┬й├Мrn-Helge Mevik required a change to ess-command in ess-iw32.el. I believe the problem was limited to Windows machines and first appeared in 5.1.19 when I added ess-command to ess-iw32.el. The temporary buffer buf was not associated with an ESS process. Now it is. This is a consequence of how I created a windows version of ess-command. Part of loading a file is checking whether the new file would overwrite any old S language objects. This in turn requires running search() which uses ess-command. The temporary buffer created to hold the results of the search was not associated with an ESS process. Therefore when ess-command checks whether it is running under Windows, it finds instead that it is in the tbuffer which is not connected with an ESS process so it can't decide and quits. Since the original buffer that the user was trying to load was correctly connected to an ESS process, the user is justifiably confused. The repair is done at the most central point, at the ess-command for windows. 2002-02-25 rsparapa * lisp/Makefile: lisp Makefile: added ess-mous.el, but have not tested it 2002-02-20 rsparapa * lisp/essa-sas.el: ESS[SAS]: added a missing F11 key definition and new functionality for F12; pressing F12 searches for a GSASFILE definition, otherwise defaults to SAS program name and opens the image file in an image viewer application available on that OS (defaults to the CDE sdtimage for Unix and kodakimg for MS) 2002-02-20 rsparapa * Makefile: Makefile: Oops. We don't want tag to depend on rel. For tagging we have to rely on the user to do the appropriate thing. 2002-02-19 rossini * lisp/ess-cust.el: edited ess-source-directory doc string to include my favorite setting. It's amazing what you find when you start looking... 2002-02-19 rsparapa * Makefile: Makefile: after make rel goes flawlessly; do a make tag; you might want to wait a few days just to be sure since the tag must be unique and we don't want micro number escalation 2002-02-19 rsparapa * doc/currfeat.texi: Current Features: deleted SPSS 2002-02-13 rsparapa * Makefile: Makefile: Removed the JCGS paper from the distributions and fixed some problems. First of all, zip will update a .zip if it already exists. I found no way to change this behavior. Also, gzip will prompt you before overwriting a .gz. So, I just delete the files if they already exist with a test && rm || true. Also, tar would occasionally give me an error about symbolic links. So, I did a mv instead of an ln -s. * doc/ess.info-1: Updating docs for new version 2002-02-07 rsparapa * Makefile: Makefile: updated for new repository 2002-02-07 rsparapa * doc/ess.info-1, doc/ess.info, doc/ess.info-2, doc/ess.info-3: Updating docs for new version * ANNOUNCE, README: Updating README, ANNOUNCE for new version * lisp/essa-sas.el: ESS[SAS]: last change before 5.1.20; forgot to add C-TAB to the globalization for PC keys * doc/announc.texi, doc/credits.texi, doc/inst_cvs.texi, doc/inst_tar.texi, doc/mailing.texi, doc/newfeat.texi, doc/readme.texi, doc/stabilty.texi: Doc changes for pending ESS-5.1.20 release. 2002-01-31 rsparapa * lisp/essl-sas.el: ESS[SAS]: mult-line comments of the /* */ variety are always fontified correctly because they are handled by grammar rather than regular expressions. OTOH, * ; and %* ; comments have only worked in the past on single line comments. This is particularly annoying in SAS-log-mode since a single-line comment will often be flowed and not fontified correctly. There is no solution TIKO for the multiple line problem so I changed the regular expression to just fontify the first line which will at least allow you to recognize that a comment is beginning which is better than the way it was before. * lisp/essl-sas.el: ESS[SAS]: improved macro statements syntax highlighting, i.e. you have more freedom of placement than you do for SAS statements in general 2002-01-28 Martin Maechler * lisp/ess-help.el: doc string * lisp/ess-utils.el: comment * doc/newfeat.texi, lisp/ChangeLog, lisp/essddr.el: C-c C-f (finally!) 2002-01-24 rsparapa * lisp/essl-bug.el: ESS[BUGS]: working, but no elsewhere yet 2002-01-23 rsparapa * lisp/essl-bug.el: ESS[BUGS]: let's schedule elsewhere for the next release * lisp/essa-sas.el: ESS[SAS]: should be good to go for the next release; will test tomorrow * lisp/essa-sas.el: ESS[SAS]: a uniform interface for batch elsewhere may be a bit too ambitious at this time * lisp/essa-sas.el: ESS[SAS]: a few adjustments * lisp/essa-sas.el, lisp/ess-batch.el, lisp/essl-bug.el: ESS-elsewhere: moving towards a common codebase for batch ESS-elsewhere 2002-01-21 rmh * lisp/essdsp6w.el: change *ddeclient ESS* to '(ddeESS [S+6])' * lisp/essd-sp4.el: 1. change strings from *ddeclient ESS* to '(ddeESS [S+4])' 2. There is a weird error in this version that I don't understand. The environment variable PATH gets the value of MANPATH. I cannot figure out why. It is MANPATH for me on two machines so far, I don't know if that is related to my personal list of environment variables or something else. The fix I installed here works on my machine, I hope it works on others. I did attempt a generalization, but that didn't work for me. * lisp/ess-site.el: change default to (fset 'S 'S+6) etc. * lisp/ess-inf.el: remove commented out .in.ESS. This was replaced with options()$STERM yesterday. 2002-01-20 rmh * doc/ess.info, doc/ess.info-2, doc/ess.info-3: matches ess.texi from a few minutes ago. * doc/ess.info-1, doc/ess.texi, doc/inst_tar.texi, doc/newfeat.texi, lisp/ess-site.el: 1. In ess-site.el section 2.1 I made two changes. For the item a I want an opinion. a. I changed the default in this section from S-Plus 4,5,3 to S-Plus 6 for all three of those operating systems? Is there still a need to distinguish linux from other unixen? b. I added (fset 'Sqpe 'Sqpe+6) for Windows 2. I edited inst_tar.texi to match. 3. While in inst_tar.texi I added to the SAS discussion and fixed up the installation section to xref the Unix and MS sections to each other. 4. The current ess.texi and ess.info-2 have only the unix information. I deleted the whole installation section from ess.texi and replaced it with @include inst_cvs.texi 5. Tony, please fix up inst_cvs.texi once the anonymous cvs server in washington is working. 6. Rodney, please put Macintosh instructions into inst_cvs.texi. 7. I promised Terry Therneau that I would comment on indentation and fancy comments in the *info*. I did so in ess.texi. While there I added Rodney to the author list. 8. I added the STERM discussion to ess.texi. 9. I started to add the pager and editor discussion to ess.texi and realized that I can't until the "@node Edit buffer" section is completely rewritten. I may do this, but not tonight. This entire section describes the behavior pattern that we do not encourage. It describes the "S objects are real" philosophy deprecated in the README.S file. The revision can leave that in, but must have a section based on the "Source code is real" philosophy. * lisp/ess-cust.el, lisp/essd-els.el, lisp/essd-r.el, lisp/essd-s3.el, lisp/essd-s4.el, lisp/essd-sp3.el, lisp/essd-sp4.el, lisp/essd-sp5.el, lisp/essd-sp6.el, lisp/essdsp6w.el: I installed options("STERM") in the rest of the S language essd*.el files. I documented it in ess.texi and in newfeat.texi. STERM has the value "iESS" for all except S+4 and S+6 for Windows. In those two situations it has value "ddeESS". Suggestions for non-ESS values are in the ess.texi. I also installed options("editor") and options("pager"). Default definitions are in ess-cust.el Windows Unix Macintosh R-pager nil nil nil R-editor gnuclient emacsclient nil S-pager gnuclientw emacsclient nil S-editor gnuclient emacsclient nil When the ESS value is nil, then nothing gets sent to the S language process. ess-cust defcustomed all new variables essd-r revised from last week a. R-editor and R-pager b. defun R-transcript and fset r-transcript c. moved R-mode to follow R essd-s3 a. I changed two (setq-default ess-customize-alist S3-customize-alist) to use setq. b. moved S3-mode to follow S3 essd-s4 essd-sp3 essd-sp5 essd-sp6 essd-sp4 essdsp6w essd-els I made it match, but it needs rethinking. The right plan is something along the lines of a. telnet to the remote, b. start remote ess process, c. `ess-add-ess-process' 2002-01-18 rsparapa * lisp/essa-sas.el: ESS[SAS]: automated ess-sas-suffix-regexp and commented out ess-sas-smart-backtab 2002-01-17 rmh * lisp/tmpfile: I got a newer version of cygwin. Now PCL-CVS works from the office. I will check from home later. * lisp/tmpfile: test commit with PCL-CVS 2002-01-16 rmh * lisp/essa-sas.el, lisp/ess-mous.el: Tony, what is `ordinary-insertion-filter' in `essl-sta.el'. doing in the middle of `ess-command' in ess-inf.el? Rodney, please look at the cvs log ess-mous.el There are several questions and comments about ess-processes in the Jan 14 log that overlap what you are doing in essa-sas.el essa-sas.el: I finally understand why we have been having trouble communicating about S+elsewhere. `ess-add-ess-process' is a much simpler functional equivalent to the kludge in `S+elsewhere' and `ESS-elsewhere'. I revised the doc-string to make it more accurate and also simplified the function while I was there. ess-mous.el: I got rid of the end-of-line-problem I was having. 2002-01-16 rsparapa * lisp/essl-sas.el: ESS[SAS]: fixed bug in PROC syntax highlighting; updated doc-string for sas-program 2002-01-16 Martin Maechler * lisp/ChangeLog, lisp/ess-menu.el: improved imenu-expression from Stephen E 2002-01-16 rsparapa * lisp/essl-bug.el: ess-revert definition removed, call to ess-revert replaced by ess-revert-wisely * lisp/essa-sas.el: SAS on Mac now accepts ess-sas-submit-command-options like the others * lisp/essl-sas.el: sas-program defaults to sas except on Mac where it is the AppleScript equivalent * lisp/ess-utils.el: added ess-revert-wisely 2002-01-15 rsparapa * lisp/essa-sas.el: ESS[SAS]: tweak to local variable recognition in ess-sas-submit 2002-01-15 rmh * lisp/essl-sas.el: force SAS-listing-mode * lisp/essl-sas.el: force minor-mode * lisp/essa-sas.el, lisp/essl-sas.el: The ess-sas-toggle-log-sas-mode I posted yesterday didn't quite work. It go hung because the log and LOG options stepped on each other's toes. So I put it all into a single if statement, renamed it to ess-sas-toggle-sas-log-mode, made it refer to SAS-log-mode, and redefined SAS-log-mode to agree with current usage. 2002-01-15 Martin Maechler * lisp/ChangeLog, lisp/essl-s.el: add-log (Changelog) 2002-01-15 rmh * lisp/essa-sas.el: I finally read the latest essa-sas.el 1. I found ess-sas-toggle-sas-mode several months ago and started to use it. I like it. Now that I have read it closely I revised it and renamed it. ;;; this version of ess-sas-toggle-log-sas-mode ;;; 1. can be included in .emacs as ;;; (ess-sas-toggle-log-sas-mode t) ;;; because it doesn't need to find a .log file. ;;; 2. works if there is already an association for .log files. ;;; 3. restores the old association when SAS-mode is deleted. ;;; 4. works with the file it has, doesn't kill it and get a fresh copy. ;;; This matters for large log files and slow telephone connections. ;;; 5. I changed its name to be more descriptive. 2. How is kermit used by ESS? I see definititions for ess-kermit-command ess-kermit-get ess-kermit-send, but do not see any places they are used. I think these three items should be separated into a new ess-kermit.el rather than buried in essa-sas.el. Are they restricted to ess in any way? Might they be better as a new kermit.el? 3. You hardwired the `txt' extension into ess-sas-file-path. That should be sensitive to the value of ess-sas-suffix-1 and ess-sas-suffix-2. 4. ess-sas-submit-mac is the only ess-sas-submit* that does not have ess-sas-submit-command-options. I don't understand ess-sas-submit-command-options. Why is it buffer-local? I think it should depend on the host and the version of sas, not on the myfile.sas command file. Am I misunderstanding what is going on? 5. ess-revert-wisely in essa-sas.el and ess-revert in essl-bug.el are identical. This suggests that the ess-revert name should be used and moved to ess-utils.el * lisp/ChangeLog, lisp/ess-inf.el, lisp/ess-mode.el, lisp/ess-mous.el, lisp/ess-trns.el: ess-mous is ready for testing. ess-mous.el: put ess-mous on submenu of C-mouse-3 for ess-transript-mode, inferior-ess-mode, ess-mode This feature is still beta. ess-inf.el: ess-ddeclient-p. now depends on ess-local-process-name get-ess-process. I changed error message to say buffer is not associated with an ESS process (instead of saying that no ESS process is running) inferior-ess-mode-menu. Added "What is this? (beta)" ess-trns.el: ess-transcript-mode-menu. Added "What is this? (beta)" ess-mode.el: ess-mode-menu. Added "What is this? (beta)" ChangeLog: ess-mous changes. I tested it on windows for R, S+4, and Sqpe+4. I am having line-ending problems with Sqpe+4 but otherwise it looks ok. Please look at it. I found a problem which I am unsure how to solve. The variable `ess-current-process-name' in the `*R*' buffer can have the value "S+4". All I have to do is open an S+4 process and an R process, then C-c C-s the file.s buffer to S+4 and then switch to the R process. I think, but am willing to hear arguments against it, that anytime an inferior-ess-mode buffer is made current, then it should automatically reset `ess-current-process-name' to refer to itself. I'm not sure how to do that. This is explicitly not a buffer-local variable. Is there a hook that gets called when we change into a buffer, either by C-x b or by clicking? 2002-01-14 rsparapa * lisp/essa-sas.el: ESS[SAS]: if Local Variables are defined, a revert is necessary to update them if changed; anybody know a better way? 2002-01-14 rsparapa * lisp/essl-sas.el: ESS[SAS]: some minor changes/corrections to customize variables * lisp/essa-sas.el: ESS[SAS]: ess-sas-submit-command and ess-sas-submit-command-options are buffer-local with appropriate adjustments in the ess-sas-submit- methods 2002-01-11 rmh * lisp/essd-r.el: STERM only. Keep S-pager S-editor variables, but initialized to nil 2002-01-11 rsparapa * lisp/essa-sas.el: ess-revert-wisely: vc-revert-buffer acting strangely in Emacs 21.1; commented out until workaround is found * lisp/essa-sas.el: ESS-elsewhere: ess-kermit-get works and it is no longer ESS[SAS] specific other than the location of the defun 2002-01-11 rmh * lisp/ChangeLog, lisp/essd-r.el, lisp/ess-inf.el: STERM pager editor 2002-01-10 rmh * doc/newfeat.texi: add mouse-me 2002-01-10 rsparapa * lisp/essa-sas.el: ESS-elsewhere: ess-sas-submit really, really works now with ess-kermit-send 2002-01-10 Martin Maechler * lisp/ChangeLog, lisp/ess-help.el: ess-help-bogous-..buffer fix 2002-01-10 rsparapa * lisp/essa-sas.el: ESS-elsewhere: kermit transfer really works with ssh, but not telnet; YMMV 2002-01-10 rsparapa * lisp/essa-sas.el: ESS-elsewhere: ok, nearly working; more debugging of ess-kermit-get and ess-kermit-send * lisp/essa-sas.el: ESS-elsewhere: first working version that uses kermit as the transfer protocol 2002-01-09 rmh * lisp/essdsp6w.el: changed a stray sp4 to sp6 2002-01-09 rsparapa * lisp/essa-sas.el: ESS-elsewhere: debugging kermit method * lisp/essa-sas.el: ESS-elsewhere: re-defined ess-sas-submit-method to make it more useful; also re-defuned ess-sas-data-view * lisp/essa-sas.el: ESS-elsewhere: first attempt to get it to work with kermit when tramp is unavailable * lisp/essa-sas.el: ESS[SAS]: removed some debugging 2002-01-09 rmh * lisp/ess-mous.el: ess-mous keys * lisp/ess-cust.el, lisp/essd-sp4.el, lisp/essdsp6w.el, lisp/ess-site.el: splus6 for windows bug and embedded blanks in splus[46] 2002-01-08 rsparapa * lisp/essa-sas.el: ESS[SAS]: put (save-match-data) around searches in ess-sas-goto and ess-sas-data-view * lisp/essa-sas.el: ESS-elsewhere: tweaked dependencies of * lisp/essa-sas.el: ESS-elsewhere: changed dependencies from w32-dos-shell-semantics to ess-sas-submit-method; a convenient way to set ess-sas-submit-pre-command and ess-sas-submit-post-command; now using ess-microsoft-p rather than system-type as well 2002-01-08 rossini * ChangeLog: moved repository, checking CVS commit stuff. 2002-01-08 ess * lisp/essa-sas.el: ESS-elsewhere: adjusted ess-sas-submit-method, ess-sas-data-view-options, ess-sas-submit-post-command, ess-sas-submit-pre-command * lisp/essl-sas.el: ESS[SAS]: changed doc-string of sas-pre-run-hook * lisp/essl-sas.el: ESS[SAS]: changed doc-string of sas-program * lisp/essl-sas.el: ESS[SAS]: reverted default of sas-program to sas * lisp/essa-sas.el: ESS[SAS]: changed doc-string for ess-sas-tab-stop-alist * lisp/essa-sas.el: ESS[SAS]: changed doc-strings for ess-sas-goto and ess-sas-file * lisp/essa-sas.el: ESS[SAS]: 1 fix to ess-sas-file-goto; ESS-elsewhere for SAS batch is fully functional!; at least for me; YMMV * lisp/essa-sas.el: ESS[SAS]: 1 fix to ess-sas-file-path 2002-01-08 A.J. Rossini * moved repository to U Washington. 2001-08-10 ESS Maintainers * Version 5.1.19 released. 2000-10-17 ESS Maintainers * Version 5.1.18 released. 2000-10-17 A.J. Rossini * doc/ess.info, doc/ess.info-1, doc/ess.info-2, doc/ess.info-3: upgrade to 5.1.18 and rebuild doc * doc/readme.texi, doc/announc.texi: upgrade to 5.1.18 * doc/README.SPLUS4WIN, lisp/ess-cust.el: upgraded to 5.1.18 2000-10-11 maechler * lisp/ChangeLog, lisp/essl-s.el, doc/newfeat.texi: ess-smart-underscore 2000-10-10 A.J. Rossini * doc/inst_tar.texi: fixed documentation for XLispStat under windows. * doc/authors.texi: fixed Rodney's homepage pointer. * VERSION: upgrade version to 5.1.18 * doc/ess.info-1: Updating docs for new version [make dist] * ANNOUNCE, README: Updating README, ANNOUNCE for new version [make dist] * lisp/ChangeLog: small changes. This log is incomplete. * ChangeLog: updated change log. * doc/README.SPLUS4WIN, doc/ess.info, doc/ess.info-1: Misc changes * doc/inst_tar.texi: @enumerate can't have a @bullet. * doc/newfeat.texi: added 5.1.17 new features * doc/announc.texi: update for 5.1.17 * doc/README.SAS: Merged Rich's comments/changes. * doc/inst_tar.texi: added Rich H's README changes. * doc/mailing.texi: itemize the "flat text list". * doc/readme.texi: Small changes. * doc/authors.texi: added Rodney to authors list. * doc/stabilty.texi: comment re: some versions better than others. 2000-10-10 ESS Maintainers * Version 5.1.17 released. 2000-10-10 ESS Maintainers * Version 5.1.17 released. 2000-10-10 ESS Maintainers * Version 5.1.17 released. 2000-10-10 ESS Maintainers * Version 5.1.17 released. 2000-10-10 A.J. Rossini * doc/README.SPLUS4WIN, doc/ess.info, doc/ess.info-1: Misc changes * doc/inst_tar.texi: @enumerate can't have a @bullet. * doc/newfeat.texi: added 5.1.17 new features * doc/announc.texi: update for 5.1.17 * doc/README.SAS: Merged Rich's comments/changes. * doc/inst_tar.texi: added Rich H's README changes. * doc/mailing.texi: itemize the "flat text list". * doc/readme.texi: Small changes. * doc/authors.texi: added Rodney to authors list. * doc/stabilty.texi: comment re: some versions better than others. 2000-10-09 A.J. Rossini * lisp/ess-vars.el: Merged with changes in another location. 2000-10-09 maechler * lisp/ChangeLog, lisp/essl-s.el: new (ess-fix-miscellaneous) & (ess-toggle-underscore) 2000-10-08 A.J. Rossini * Makefile.in: autoconf precursor to Makefile 2000-10-07 A.J. Rossini * lisp/ess-vars.el: ess-vars is obsoleted. 2000-10-06 maechler * lisp/essl-s.el: 2 comments 2000-10-04 maechler * lisp/ChangeLog, lisp/ess-cust.el, lisp/ess-inf.el, lisp/ess-mode.el, lisp/ess-vars.el, lisp/essl-s.el: ess-S-assign and redefine "_" in ..MM-keys 2000-09-14 A.J. Rossini * lisp/ess-inf.el: ess-proc-name: need to ensure ALL concat args are strings (or at least, are not numbers). Thanks to WDMcCoy for reporting this. 2000-09-10 A.J. Rossini * DEBIAN/control, DEBIAN/md5sums, DEBIAN/postinst, DEBIAN/prerm: Copied from ESS 5.1.13 debian package * LDA/ex1.nw: Newer example * LDA/README: Initial Documentation 2000-09-05 ess * lisp/essa-sas.el: A few enhancements (ess-sleep-for/re-defining ess-sas-submit-command: see documentation) and bug-fixes for Win 95/NT. 2000-09-05 A.J. Rossini * lisp/ess-site.el: rearranged for coherency. * lisp/ess-menu.el: added C example. * lisp/ess-menu.el: 1st pass at S and XLS menus. Not integrated yet 2000-09-04 A.J. Rossini * lisp/ess-inf.el, lisp/essd-r.el, lisp/essd-sp3.el: Changes suggested by Ed Kademan * lisp/ess-inf.el: cleaning up docs and reunderstanding inferior-ess/ess-multi * lisp/ess-inf.el: comment on R handling for exit. 2000-09-03 A.J. Rossini * lisp/ess-inf.el: cleaning and correcting comments. Some ancient comments removed. * lisp/ess-comp.el: removed extraneous comments * lisp/ess-comp.el: now, the byte-compile fun is really removed. ess-message now has doc-string in "right" place. * lisp/ess-comp.el: cleaned up code. Removed extraneous comments, and the byte-compiler fun. * lisp/Makefile, lisp/ess-comp.el, lisp/ess-cust.el, lisp/ess-dump.el, lisp/ess-font-lock.el, lisp/ess-inf.el, lisp/ess-site.el, lisp/ess-vars.el, lisp/ess.el: refactoring code for cleaning, in process of debugging * lisp/19.29/README: backwards compatibility. * configure.in: merged with W3, added languages. Need to set languages. * aclocal.m4: new version from 4.0pre.46 * configure.in: somewhat complete. Needs redundant work later. * configure.in: Starting to do autoconf. Looking at W3 and R for examples. 2000-08-27 A.J. Rossini * lisp/ess-site.el: Documentation and cleaning. 2000-08-17 maechler * lisp/ChangeLog, lisp/essd-r.el: no spurious windows warning anymore 2000-08-09 maechler * lisp/ChangeLog, lisp/ess-help.el: help: inherit syntax-table ==> "h" in help : "default prompt"! 2000-07-13 A.J. Rossini * doc/newfeat.texi: set up for 5.1.15--17 * VERSION: upgraded version. * README: Updating README, ANNOUNCE for new version [make dist] * doc/ess.info-1: slightly new doc * lisp/ess-comp.el, lisp/ess-site.el: documentation and code cleanup * lisp/19.29/README: backwards compat doc 2000-07-13 ESS Maintainers * Version 5.1.16 released. 2000-06-30 ESS Maintainers * Version 5.1.14 released. 2000-06-30 A.J. Rossini * ChangeLog, VERSION, lisp/ess-inf.el, lisp/essd-arc.el, lisp/essd-vst.el: XLS fixes not quite right. No startfile if non existant * doc/ess.info-1: Updating docs for new version [make dist] * Makefile: wrong doc/docs. * Makefile: doc or docs? * ANNOUNCE, README: Updating README, ANNOUNCE for new version [make dist] * lisp/essa-sas.el, lisp/essd-els.el, lisp/essl-sas.el, lisp/essnt204.el: RMH/RS changes for SAS, ESS-elsewhere, NT Emacs 20.4 * lisp/ess-site.el: merged RMH/RS's changes for SAS. * VERSION: upgrade version * doc/README.Microsoft: not ready to generate this on the fly, yet. * doc/README.SPLUS4WIN, doc/announc.texi, doc/ess.info, doc/ess.info-1, doc/inst_tar.texi, doc/newfeat.texi, doc/readme.texi: docs updated to 5.1.14, cleaned up. * doc/newfeat.texi: added 5.1.14 stuff. * lisp/ess-cust.el: added ViSta/ARC support * lisp/ess-inf.el: added flags/checks for XLS systems. Might help for others * lisp/essd-arc.el: first version of ARC mode * lisp/Makefile: added essd-arc.el to targets. * lisp/ess-site.el: documentation. ViSta and ARC added. * lisp/essd-vst.el: now it actually might work. * lisp/ess-vars.el: added Arc, Vista. cleaned up code. a bit of documentation. 2000-06-30 maechler * etc/ess-s4.S, etc/ess-sp3.S: comments 1999-11-22 ess * VERSION, lisp/ess-vars.el: Updated to 5.1.11 1999-11-17 ess * lisp/essddr.el: 'bold isn't defined in XEmacs. Using reference-face instead of Rd-bold-face. 1999-11-16 ess * Makefile, etc/replace-version-numbers, lisp/ess-vars.el: Fixed small version update errors * ANNOUNCE, Makefile, README, doc/README.SPLUS4WIN, doc/announc.texi, doc/inst_tar.texi, doc/readme.texi, lisp/Makefile, lisp/ess-help.el, lisp/ess-site.el, lisp/essd-els.el, lisp/make-regexp.el, lisp/noweb-mode.el: updated version numbers * doc/newfeat.texi: cleaned up NTEmacs requirements. * lisp/essl-sta.el: added local variables for editing and indexing. * lisp/essl-sta.el: added Brendan's suggested function. * doc/inst_tar.texi: added change to doc, that "make" is done by "make install" * doc/ESS_intro.tex: Martin suggested a small fix. * doc/ESS_intro.tex: Another bit of documentation * doc/announc.texi: shortened header -- this is for announc, after all! * doc/announc.texi: moved license to the end, New Features to the beginning. * doc/newfeat.texi: added new features for 5.1.11. * doc/README.SPLUS4WIN: comment at the beginning about new reading material. * doc/README.SPLUS4WIN: added David Brahm's HELP INSTRUCTIONS for the license manager. * lisp/essl-sta.el: added make-regexp to ESS, and finished integrating Brendan's code. Need to test it now! * lisp/make-regexp.el: needed for Stata-mode extensions * lisp/essl-sta.el: added Brendan Halpin's corrections. * lisp/ess-inf.el: concat needs number-to-string conversion. * lisp/essd-omg.el: Omegahat fixes (for commandline flags) 1999-11-11 ess * lisp/noweb-mode.el: C-c C-n shouldn't be TeX-normalmode, since it is too close to submit-line with ESS! (overwrite). * lisp/essd-omg.el: Use prefix for setting Omegahat arguments. 1999-11-10 ess * lisp/ChangeLog: fixed up to now. * lisp/essl-omg.el: S- becomes OMG- Comments redone (to use //, ///, and //// for levels of indentation) OMG-syntax started, variable defined, needs to be fixed. * lisp/essd-omg.el: further Omegahat dialect changes (use OMG syntax, which needs fixing!) 1999-11-05 maechler * lisp/ChangeLog, lisp/ess.el, lisp/noweb-mode.el: functionp definition if necessary * lisp/noweb-mode.el: functionp for emacs-19.34 1999-11-04 ess * lisp/essd-els.el: fixed paren error. * ANNOUNCE, Makefile, README, VERSION, doc/README.SPLUS4WIN, doc/announc.texi, doc/ess.texi, doc/inst_tar.texi, doc/readme.texi, etc/replace-version-numbers, lisp/Makefile, lisp/ess-site.el, lisp/ess-vars.el, lisp/essd-sas.el: Changed version numbers * ChangeLog: 5.1.10 released. * doc/newfeat.texi: added 5.1.10 stuff. 1999-11-03 ess * doc/README.elsewhere, lisp/Makefile, lisp/ess-inf.el, lisp/ess-site.el, lisp/ess-vars.el, lisp/essd-sp5.el: Changes for ESS-elsewhere. * lisp/essd-els.el: added a generic ESS-elsewhere function. 1999-11-03 Anthony Rossini * fixed Stata again, added ESS-elsewhere. * Release 5.1.10 Tue Sep 14 17:00:19 1999 A.J. Rossini * Release 5.1.9 * added stata mode fixes, noweb/literate data analysis fixes. 1999-09-01 Martin Maechler * Finally upgraded version number to 5.1.9 (for pre-release) after fixing etc/replace-version-numbers 1999-07-23 Martin Maechler * Release 5.1.8 1999-04-05 A.J. Rossini * Makefile, doc/Makefile, doc/README.SPLUS4WIN, doc/inst_tar.texi, doc/readme.texi, doc/requires.texi, lisp/ess-site.el, lisp/ess-vars.el: text from 5.1.7 to 5.1.8 * lisp/ : -->>> lisp/ChangeLog <<<<< * ANNOUNCE, README, doc/ajr-talk.tex, doc/ess.texi, lisp/ChangeLog: doc updates * ChangeLog: *** empty log message *** * doc/README.SPLUS4WIN, doc/announc.texi, Makefile, doc/Makefile, doc/inst_tar.texi, doc/readme.texi, doc/requires.texi, lisp/ess-site.el, lisp/ess-vars.el: 5.1.6 to 5.1.7 changes for possible release * ChangeLog: more stuff. 1999-04-05 A.J. Rossini * doc/README.SPLUS4WIN, doc/announc.texi, Makefile, doc/Makefile, doc/inst_tar.texi, doc/readme.texi, doc/requires.texi, lisp/ess-site.el, lisp/ess-vars.el: 5.1.6 to 5.1.7 changes for possible release * ChangeLog: more stuff. Fri Apr 2 10:10:35 1999 A.J. Rossini * doc/getting.texi: fixed links. Wed Mar 31 14:08:39 1999 A.J. Rossini * Makefile (ESSVERSION): updated * Makefile (ESSVERSIONMSDOS): updated * Makefile (ESSVERSIONTAG): new variable, use it. * Makefile (dist): fixed to export both zip and gzip files. 1999-03-17 A.J. Rossini * ANNOUNCE, README, doc/Makefile, doc/README.SPLUS4WIN, doc/announc.texi, doc/inst_tar.texi, doc/readme.texi, doc/requires.texi: version number update * lisp/essd-r.el, Makefile, doc/README.Microsoft, doc/README.SPLUS4COMMAND, lisp/ess-site.el, lisp/ess-vars.el: RMH's changes 1999-03-17 maechler * doc/README: README explaining a bit about ./doc/ directory 1999-03-16 A.J. Rossini * Makefile: *** empty log message *** * Makefile: for dist target, use export, not co. * lisp/essd-r32-sh-dos.el, lisp/essd-sp4com.el: MS Dos stuff for R, S+4.x * ChangeLog, Makefile, doc/announc.texi, doc/inst_tar.texi, doc/readme.texi, doc/requires.texi, lisp/ChangeLog: Prep for 5.1.4 * lisp/essd-sp4.el, lisp/ess-iw32.el: RMH changes. * doc/README.SPLUS4COMMAND: New file * doc/README.SPLUS4WIN: added RMH's mods. * lisp/ess-site.el: Merged RMH's work. * lisp/ess-vars.el: incremented. * lisp/ess-inf.el: RMH's changes. 1999-03-16 maechler * lisp/ChangeLog: mini change "foobar.Sout-45" * lisp/ess-site.el: auto-mode-alist: "foobar.Sout-4.5" also turns on S-transcript-mode 1999-03-16 A.J. Rossini * lisp/essd-sp4.el, lisp/ess-iw32.el: RMH changes. * doc/README.SPLUS4COMMAND: New file * doc/README.SPLUS4WIN: added RMH's mods. * lisp/ess-site.el: Merged RMH's work. * lisp/ess-vars.el: incremented. * lisp/ess-inf.el: RMH's changes. 1999-03-16 maechler * lisp/ChangeLog: mini change "foobar.Sout-45" * lisp/ess-site.el: auto-mode-alist: "foobar.Sout-4.5" also turns on S-transcript-mode 1999-03-15 A.J. Rossini * lisp/ess-vars.el: RMH - 15Mar1999. Added inferior-S+4-editor-pager-command. * lisp/essd-r32.el: 15Mar1999 version. * lisp/essd-r.el: added `R-microsoft', which is the "right-thing" to do under Microsoft Windows 32-bit platforms. Need to merge this with `R'. 1999-03-09 maechler * lisp/ess-help.el: add `inferior-ess-help-command' to doc string 1999-03-08 A.J. Rossini * lisp/ess-inf.el: add stata to deal with input properly. 1999-03-05 A.J. Rossini * ANNOUNCE, ChangeLog, Makefile, README: top level stuff, sigh! * doc/announc.texi, doc/authors.texi, doc/bugs.texi, doc/inst_tar.texi, doc/requires.texi: Cleaned up text. * doc/requires.texi: cleaned/formatted up requirements * doc/currfeat.texi: pretty-printing. * lisp/essd-sta.el: new command for help: turn off more, and continue. * lisp/ess-help.el: stata hates ess-nuke-help-bs, since it (stata) is clean. * lisp/ess-inf.el: fixed command sender for stata. more like R than like XLS. * lisp/essl-sta.el: more help file corrections. * lisp/ess-inf.el: STA same as XLS/SAS. * lisp/essd-sta.el: ess-*-lastvalue-command needed to be fixed! * lisp/essl-sta.el: stat help regex is evil * lisp/essl-sta.el: whitespace cleanup. * lisp/essl-sta.el: double var defs. whoops! * lisp/essl-sta.el (ess-help-STA-sec-regex): fixed section header grabbing. * lisp/essd-sta.el: need to manually turn off paging, I think... * lisp/essl-sta.el: help section regex not quite right. * lisp/ess-help.el: Stata is like XLS and SAS wrt help. * lisp/essd-sta.el: fixed help facility. * lisp/essl-sta.el: added help section regexs * lisp/essd-sta.el: make descirption "same as" objects. * lisp/essd-sta.el: secondary prompt identical to primary prompt. * lisp/essd-sta.el: redid help so that no paging is present. * doc/ess.texi: cleared up the bug report section. * doc/bugrept.texi: combined multiple sources (ess.texi and README). * doc/credits.texi: moved content from ess.texi here, for piecemeal editing and reuse. * doc/ess.texi: added placeholders for README.OS files and README.StatPackage files, to be migrated here. * doc/announc.texi, doc/authors.texi, doc/bugrept.texi, doc/currfeat.texi, doc/getting.texi, doc/inst_cvs.texi, doc/inst_tar.texi, doc/license.texi, doc/mailing.texi, doc/newfeat.texi, doc/readme.texi, doc/requires.texi, doc/stabilty.texi: Migrating all documentation into texinfo format, including ../README and ../ANNOUNCE * doc/ess.texi: removed README, cleaning out duplicate texinfo code. * doc/ess.texi: moved README text into sub-texinfo files. (to be called by readme.texi and announc.texi for documentation construction). 1999-03-05 A.J. Rossini * doc/announc.texi, doc/authors.texi, doc/bugs.texi, doc/inst_tar.texi, doc/requires.texi: Cleaned up text. * doc/requires.texi: cleaned/formatted up requirements * doc/currfeat.texi: pretty-printing. * lisp/essd-sta.el: new command for help: turn off more, and continue. * lisp/ess-help.el: stata hates ess-nuke-help-bs, since it (stata) is clean. * lisp/ess-inf.el: fixed command sender for stata. more like R than like XLS. * lisp/essl-sta.el: more help file corrections. * lisp/ess-inf.el: STA same as XLS/SAS. * lisp/essd-sta.el: ess-*-lastvalue-command needed to be fixed! * lisp/essl-sta.el: stat help regex is evil * lisp/essl-sta.el: whitespace cleanup. * lisp/essl-sta.el: double var defs. whoops! * lisp/essl-sta.el (ess-help-STA-sec-regex): fixed section header grabbing. * lisp/essd-sta.el: need to manually turn off paging, I think... * lisp/essl-sta.el: help section regex not quite right. * lisp/ess-help.el: Stata is like XLS and SAS wrt help. * lisp/essd-sta.el: fixed help facility. * lisp/essl-sta.el: added help section regexs * lisp/essd-sta.el: make descirption "same as" objects. * lisp/essd-sta.el: secondary prompt identical to primary prompt. * lisp/essd-sta.el: redid help so that no paging is present. * doc/ess.texi: cleared up the bug report section. * doc/bugrept.texi: combined multiple sources (ess.texi and README). * doc/credits.texi: moved content from ess.texi here, for piecemeal editing and reuse. * doc/ess.texi: added placeholders for README.OS files and README.StatPackage files, to be migrated here. * doc/announc.texi, doc/authors.texi, doc/bugrept.texi, doc/currfeat.texi, doc/getting.texi, doc/inst_cvs.texi, doc/inst_tar.texi, doc/license.texi, doc/mailing.texi, doc/newfeat.texi, doc/readme.texi, doc/requires.texi, doc/stabilty.texi: Migrating all documentation into texinfo format, including ../README and ../ANNOUNCE * doc/ess.texi: removed README, cleaning out duplicate texinfo code. * doc/ess.texi: moved README text into sub-texinfo files. (to be called by readme.texi and announc.texi for documentation construction). 1999-03-04 A.J. Rossini * lisp/essd-sta.el: let stata have command line options just like R. * lisp/essd-sta.el: by default, provide login screen just like splus/r do. * lisp/essd-sta.el: fixed help. * lisp/essd-sta.el: added stata's prompt * lisp/ess-vars.el: added inferior stata program variable. * lisp/essd-sta.el: speling error, nil -> 'nil. * lisp/essl-sta.el: reversed variable alist ordering. * lisp/essd-sta.el: commented out ESS-help for Stata, for compiling, initial testing. * lisp/essl-sta.el: added STA-syntax-table, but it's wrong (for Splus). * lisp/essl-sta.el: moved STA-editing-alist to beginning. * lisp/essl-sta.el: added an STA-editing-alist variable, BUT it looks like Splus, :-(. Needs to be edited a bit! * doc/ess.texi: included README in texinfo file. Now, need to extract README from it. * lisp/essd-s_2b4.el: RMH's patches, Mar 3 1999 * lisp/essd-sp4.el: updated using RMH's patches. 1999-03-03 A.J. Rossini * lisp/ChangeLog: updated lisp directory changelog. * ChangeLog: updated changelog file. * lisp/Makefile: updated version information converted s+3 to sp3. * lisp/ess-vars.el: updated version information. * doc/README.Microsoft: Added ess-bugs.cmts to this file. * lisp/ess-iw32-load-file.el, lisp/essd-s+3.el, lisp/essd-s+4.el, lisp/essd-s+5.el, lisp/essd-s_2b4-msdos-existing.el, lisp/essd-s_2b4-msdos.el: Tidied up ess-iw32*.el files. * lisp/ess-iw32.el: copied all changes from ess-iw32-load-file.el here. * lisp/ess-iw32-load-file.el: fixed. * doc/README.Microsoft: Combination of 2 of RMH's text/help files. * lisp/essd-s_2b4.el: essd-s_2b4-msdos*.el were not needed. Contents moved into base file. * doc/README.SPLUS4WIN: Changed history of Splus 4.5 stuff; added new information for using Splus 4.5 and R under Windows NT. * doc/TODO: moved from mailbox to TODO list. * lisp/ess-iw32-load-file.el, lisp/ess-iw32.el, lisp/essd-r32.el, lisp/essd-s_2b4-msdos-existing.el, lisp/essd-s_2b4-msdos.el, lisp/essd-s_2b4.el, lisp/msdos.el: RMH's changes, up to March 2nd 1999-03-03 A.J. Rossini * lisp/Makefile: updated version information converted s+3 to sp3. * lisp/ess-vars.el: updated version information. * doc/README.Microsoft: Added ess-bugs.cmts to this file. * lisp/ess-iw32-load-file.el, lisp/essd-s+3.el, lisp/essd-s+4.el, lisp/essd-s+5.el, lisp/essd-s_2b4-msdos-existing.el, lisp/essd-s_2b4-msdos.el: Tidied up ess-iw32*.el files. * lisp/ess-iw32.el: copied all changes from ess-iw32-load-file.el here. * lisp/ess-iw32-load-file.el: fixed. * doc/README.Microsoft: Combination of 2 of RMH's text/help files. * lisp/essd-s_2b4.el: essd-s_2b4-msdos*.el were not needed. Contents moved into base file. * doc/README.SPLUS4WIN: Changed history of Splus 4.5 stuff; added new information for using Splus 4.5 and R under Windows NT. * doc/TODO: moved from mailbox to TODO list. * lisp/ess-iw32-load-file.el, lisp/ess-iw32.el, lisp/essd-r32.el, lisp/essd-s_2b4-msdos-existing.el, lisp/essd-s_2b4-msdos.el, lisp/essd-s_2b4.el, lisp/msdos.el: RMH's changes, up to March 2nd 1999-02-24 A.J. Rossini * lisp/ess-iw32.el: temp val left in distribution. whoops (RMH). 1999-02-22 A.J. Rossini * lisp/essd-els.el, lisp/essd-s3.el, lisp/essd-s4.el, lisp/essd-sta.el, lisp/ess-site.el, lisp/essd-sp4.el, lisp/essd-sp5.el, lisp/essd-sp3.el: Removed s+# to sp# for S-PLUS commands 1999-02-12 Martin Maechler * lisp/Makefile: emacs, not "19.34" 1999-02-11 Martin Maechler * doc/README.SPLUS4WIN: added pointer to NTEmacs. * README, ANNOUNCE: corrected documentation for R, added pointer to NTEmacs 1999-02-10 Martin Maechler * etc/other/Tags/Lubinsky-S-tags/desc: reformated material. * README: set up for 5.1.2 release * Makefile: Set up for 5.1.2 release * ANNOUNCE: set up for 5.1.2 release * doc/rmh-essi121098-msw32.tex: rmh-essi121098-msw32.tex is obsolete. * lisp/essd-sas.el: added RMH's new fixes for the 5.1.2 version. * doc/README.S: RMH's documentation additions for Splus 4.5 * doc/README.SAS: RMH's doc additions for 5.1.2 * doc/README.SPLUS4WIN: Includes RMH's changes for Splus 4.5 documentation * etc/other/Tags/README: cleaned text. * ANNOUNCE, README: updating for 5.1.2 1999-02-02 Martin Maechler * lisp/ess-inf.el: (last commit was with unsaved file) * lisp/ChangeLog, lisp/ess-inf.el: fix regex for "help(..);" also work for "?" with R-input-sender 1999-01-13 Martin Maechler * lisp/Makefile: added ess-debug essd-s+4 ess-iw32 * lisp/ess-iw32.el: RMH`s workaround for ess-inf.el ess-setq-values-default (instead of ..-local) 1999-01-12 Martin Maechler * lisp/ess-inf.el: still "-default", not "local" * lisp/ess-inf.el, lisp/ess.el: more dribble output * lisp/ess.el: add dribble-info about comint-process-echoes 1999-01-11 Martin Maechler * lisp/ess-site.el: minor comments only * lisp/essd-sq4.el: removed [RMH] * lisp/ess-site.el: RMH changes (Dec 28) * lisp/ess-trns.el: RMH added some ess-inf..-prompt.. * lisp/ess-vars.el: RMH added S+4 & dde (& removed some "ess-external") * lisp/essd-els.el: RMH added S+elsewhere-mode * lisp/ess-iw32.el, lisp/essd-s+4.el: new from Rich Dec 28 * lisp/ess-inf.el: 2 lines for S+4 1999-01-04 Martin Maechler * lisp/essddr.el: R CMD Rd2txt 1998-12-18 A.J. Rossini * ANNOUNCE, README: Updating Announce/Readme. Need to merge announce to readme, and just subset out the relevant section for Announce. 1998-12-17 Kurt Hornik * lisp/ess-vars.el: Match R `require(' in ess-change-sp-regexp. * lisp/Makefile: Add `essd-els.el' to SOURCES. 1998-12-16 Martin Maechler * ChangeLog: ess.texi * doc/ess.texi: 5.0 -> 5.1.x * doc/ess.texi: MM: (CVS) Date also for info * doc/ess.texi: MM: (CVS) Date added * doc/ess.texi: added '$Date: 2004/07/08 15:03:06 $'; 5.0 -> 5.1.x Mon Dec 14 20:23:55 1998 A.J. Rossini * README: added 5.1.x comments, updated to current state of affairs. * etc/other/Tags/README: stuff for emacs text mode for editing. * etc/other/Tags/README: Information on tagging for Emacs/VI and ESS. * etc/other/Tags/Lubinsky-S-tags/README, etc/other/Tags/Lubinsky-S-tags/desc, etc/other/Tags/Lubinsky-S-tags/etags.c: Modifications to gnu tag programs for S * lisp/ess-mode.el: fixed copyright and header information * lisp/ess-site.el: commented out SHOME definition. Fri Dec 11 19:51:18 1998 A.J. Rossini * lisp/ess-vars.el: fixed copyright, rossini's email address. * lisp/ess-iw32.el: fixed rossini's email address, headers, copyright. * lisp/essd-els.el, lisp/essd-s+4.el: fixed rossini's email address. * lisp/essd-sq4.el: fixed copyright and header attributions. * lisp/essd-els.el: fixed header files and copyright. * lisp/essd-s+4.el: added changes to copyright and header docs. * etc/other/S-spread/gradexmp.s, etc/other/S-spread/sprd-emc.s, etc/other/S-spread/sprd-grd.s, etc/other/S-spread/sprd-int.el, etc/other/S-spread/sprd-spr.s, etc/other/S-spread/sprd-txt.s, etc/other/S-spread/sprd3d.how, etc/other/S-spread/README, etc/other/S-spread/S-spread.el, etc/other/S-spread/asaprc.ps: RMH's S-spread, Oct 1997 version * doc/rmh-essi121098-msw32.tex: Adding Rich's documentation for Windows stuff. * lisp/ess-vars.el: Merged RMH's changes. * lisp/ess-iw32.el, lisp/essd-els.el, lisp/essd-s+4.el, lisp/essd-sq4.el: New files for ESS for Splus/MSW/NT/98/95 New files for remote-ESS on Unix. * lisp/ess-site.el: Added RMH's changes for Microsoft Windows and Splus. Mon Nov 30 17:37:57 1998 Kurt Hornik * lisp/Makefile: Add essd-s+5.el to SOURCES (as it gets required in ess-site). Mon Nov 23 20:03:17 1998 A.J. Rossini * lisp/ChangeLog: *** empty log message *** Fri Nov 20 20:57:33 1998 A.J. Rossini * lisp/ess-vars.el: ess-help-w3-url-prefix points to pyrite. * lisp/ess-vars.el: removed spurrious comment about generic function, in front of a variable. * lisp/essd-s+5.el: trimmed out old S4 stuff. Mon Nov 16 17:29:25 1998 Martin Maechler * lisp/ess-inf.el: do not need comint echo anymore.. Sat Nov 14 00:23:19 1998 A.J. Rossini * Makefile, lisp/ChangeLog, ChangeLog: whitespace editing. * doc/Makefile: added info target. removed spurrious ess.info/ess.texi target. Fri Nov 13 23:47:27 1998 A.J. Rossini * Makefile: added comment re: export vs checkout for "dist" target. * lisp/ess-site.el: added sample entry for S+5. * lisp/ChangeLog: *** empty log message *** * lisp/ess-site.el: added suffix for StatSci's script files. Thu Nov 12 17:27:30 1998 Martin Maechler * lisp/essd-r.el, lisp/essd-s+3.el, lisp/essd-s+5.el, lisp/essd-s3.el: newline in dribble buff * lisp/ess-inf.el: more details in prompt for ess-get-dir; more dribble; WHITE SPACE * lisp/ess.el: slightly better dribble output * lisp/essd-s4.el: drop doubled comments * lisp/ess-vars.el: . Wed Nov 11 15:54:34 1998 Martin Maechler * Makefile: -X CVS * lisp/essd-s+5.el: omit .Smode() extras; new "S+" instead of "S+3" * lisp/essl-s.el: new "S+" instead of "S+3" * lisp/ess-inf.el: comint-echo : OFF for S+5 * lisp/essd-s3.el: comments only * lisp/essd-s+3.el: comment out ess-mode-edit * lisp/Makefile, lisp/ess-vars.el: new version numbers * lisp/essd-s+5.el: several more s4 -> s+5 changes; still not ok * lisp/essd-s+3.el: transpose to defs * lisp/ess-vars.el: require s+5 Tue Nov 10 17:45:11 1998 Martin Maechler * lisp/ess-site.el: s+5 is now distributed * lisp/essd-s+5.el: provide typo fixed Mon Nov 9 23:50:26 1998 A.J. Rossini * ChangeLog: *** empty log message *** * Makefile: uses scp to put the tar file where it belongs. * Makefile, lisp/ChangeLog, lisp/Makefile, lisp/ess-site.el: New material for Makefiles * lisp/essl-sta.el: removed possible problems from stata mode. * ChangeLog: *** empty log message *** * Makefile: added new top-level dist target. * lisp/essd-s+5.el: This is for Splus5, based on S4. * lisp/ess-web.nw: last change, sigh. * lisp/ess-web.nw: emacs lisp mode is wrong, sigh. * lisp/ess-web.nw: Contains interface code between Noweb and ESS * lisp/ChangeLog: added stata-dialect/lang to makefile * lisp/Makefile: added Stata stuff. Thu Sep 24 23:32:14 1998 A.J. Rossini * lisp/ChangeLog: more stuff. * lisp/essd-sta.el: should be sta, not stt * lisp/ChangeLog: update for ess-site. * lisp/ess-site.el: added stata mode, which is now STA (ref: Thomas Lumley) Thu Sep 17 09:11:51 1998 Martin Maechler * lisp/ChangeLog, lisp/ess-utils.el: several small things Fri Sep 11 14:25:59 1998 Martin Maechler * lisp/ChangeLog: . * lisp/Makefile, lisp/ess-inf.el, lisp/ess-mode.el, lisp/ess-utils.el, lisp/ess.el: Adaptions to new ess-utils * lisp/essl-s.el: LOTS in "pretty edit source" * lisp/essd-r.el: new function (R-fix-T-F) Thu Sep 10 06:15:55 1998 Kurt Hornik * lisp/essddr.el: Change old `ess-doc' to `essddr'. Expand Rd-mode-abbrev-table (abbrevs). Change Rd-indent-level default to 4. Add a preliminary Rd-mode menu. Add a preliminary Rd-submit-bug-report(). * lisp/ess-vars.el: Change ess-mode-font-lock-keyword so that assignment function declarations are also fontified correctly (hopefully ...). * doc/Makefile: Get rid of old LISPDIR code. * Makefile: Use `$(MAKE)' instead of `make'. Wed Sep 9 23:49:12 1998 A.J. Rossini * lisp/ChangeLog: new stuff. * lisp/essd-sta.el: modified for stata commands. What is quit? * lisp/essl-sta.el: Small mods. * lisp/essd-sta.el: Added first pass at a stata file. * lisp/Makefile: BATCHFLAGS should be --no-init-file, not --no-init-fil Wed Sep 9 08:45:26 1998 Martin Maechler * lisp/essl-s.el: minor (save-recursion..) -- Committing from Shell to see permissions Tue Sep 8 21:18:33 1998 Martin Maechler * lisp/essl-s.el: more things for (ess-dump-to-src), (ess-fix-comments),.... ess-MM-fix-src * lisp/ess-mode.el: add optional quiet argument to (set-ess-style) * lisp/ess-mode.el: only white space * lisp/ChangeLog: .. * lisp/essl-s.el: added "&optional dont-ask" argument to ess-dump-to-src, ess-fix-comments,.... ess-MM-fix-src Mon Sep 7 16:27:37 1998 Martin Maechler * lisp/ChangeLog: .. * lisp/essl-s.el: 4 digit year in ess-time-string! * doc/README.SAS: Added paragraph about ess-sas-sh / PATH problems at very end -- for RMH Wed Aug 26 12:18:54 1998 Martin Maechler * lisp/ChangeLog, lisp/essl-s.el: font-lock: "." as word constituent Mon Aug 24 12:50:45 1998 Martin Maechler * ANNOUNCE, README, doc/ess.texi: stat.ethz short for www.stat.math.ethz Thu Aug 20 06:48:48 1998 Martin Maechler * lisp/ChangeLog: .. * lisp/essddr.el: Expanded Rd-section-names and Rd-keywords [following Kurt's suggestion] Tue Aug 18 08:44:54 1998 Martin Maechler * lisp/essd-s+3.el, lisp/essd-r.el, lisp/ChangeLog: "--no-readline" for R; S+3-dialect-name for S-plus Fri Aug 14 16:32:23 1998 Martin Maechler * lisp/ess-vars.el, lisp/Makefile: calling new version "pre5.1" * lisp/essl-s.el: "ease:" replaced by "ess-"; fixed some comments Mon Apr 27 07:53:02 1998 Martin Maechler * lisp/essl-s.el: improved ess-num-var-round Fri Apr 17 12:29:46 1998 Martin Maechler * lisp/essd-sas.el: ../etc/ is place for sas-sh-command * etc/function-outline.S, lisp/essl-s.el: function-outline-file now in ../etc/ * Makefile, doc/Makefile, lisp/Makefile: Makefiles separated; new for ./doc Mon Apr 6 20:35:04 1998 A.J. Rossini * lisp/ChangeLog: Storing updates. * lisp/ess-comp.el, lisp/ess-inf.el, lisp/ess-site.el, lisp/ess-vars.el: See ChangeLog for more details. Not tagged. Tue Dec 16 00:17:44 1997 A.J. Rossini * lisp/ChangeLog: *** empty log message *** * lisp/essd-s4.el (S4-mode): New function, use it. Wed Dec 10 15:36:29 1997 A.J. Rossini * lisp/ChangeLog, lisp/essd-xls.el: XLS-mode is now the mode-name symbol. (instead of ess-mode). This is required for noweb-mode to work nicely. ChangeLog documented to reflect this fact. Tue Dec 9 22:55:40 1997 A.J. Rossini * lisp/ChangeLog: *** empty log message *** * lisp/essd-r.el: removed non-necessary autoload for a non-existant function (was intended for start-args, but never was written or used). * lisp/essl-sta.el: Changed essl-sta.el to not use stat.el in the documentation comments. * lisp/ChangeLog: *** empty log message *** * lisp/essddr.el: one too many parens. * lisp/essddr.el: added commented out face. DB's error doesn't exist for me, though. Fri Dec 5 15:13:59 1997 A.J. Rossini * lisp/ChangeLog: *** empty log message *** * lisp/ChangeLog: ChangeLog file install * lisp/ess-site.el: added comments about Emacs 20.2 errors. Fri Dec 5 14:46:38 1997 ess * Makefile: Added top-level Makefile. Needs definitions, though. * etc/ess-s+3.S, etc/ess-s4.S: Initial revision 1998-12-14 A.J. Rossini * README : updated to 5.1.x Tue Dec 2 08:49:07 1997 Anthony Rossini * Makefile: info isn't a valid target, and cleaned up doc targets. (KH). Mon Dec 1 16:55:17 1997 Anthony Rossini * ess.el: removed blank lines. Mon Dec 1 16:51:46 1997 Anthony Rossini * ess.texi: small edit. Mon Dec 1 16:48:14 1997 Anthony Rossini * ess.texi: changed wording around ess-plain-first-buffername (RMH). Mon Dec 1 16:42:47 1997 Anthony Rossini * Makefile: new branch (5.1.1.1). Mon Dec 1 16:36:13 1997 Anthony Rossini * Makefile: Batchflags are user serviceable. Mon Dec 1 10:59:29 1997 Anthony Rossini * RELEASED: version 5.0. Mon Dec 1 10:45:55 1997 Anthony Rossini * README.SAS: added noise about ess-sas-sh-command stupidity that AJR has personally experienced. Sun Nov 30 13:44:55 1997 Anthony Rossini * Makefile: comments for indexing. Sun Nov 30 13:41:00 1997 Anthony Rossini * ess.texi: more fixes. Many more to go. Sun Nov 30 12:38:26 1997 Anthony Rossini * README.SAS: added more information. Sun Nov 30 12:15:19 1997 Anthony Rossini * essl-lsp.el: small typo in comments. Sun Nov 30 12:14:33 1997 Anthony Rossini * Makefile: added revision, added other changes. Sun Nov 30 12:12:26 1997 Anthony Rossini * README.SAS: new material on autoexec.sas added. Sun Nov 30 12:09:30 1997 Anthony Rossini * essl-s.el (S-editing-alist): need indent-line-function defined. (RMH). Sun Nov 30 12:08:24 1997 Anthony Rossini * essl-sas.el: removed sas-indent-region. Sun Nov 30 12:07:05 1997 Anthony Rossini * essl-sas.el (SAS-editing-alist): need indent-line-function (RMH). Sun Nov 30 12:06:00 1997 Anthony Rossini * ess-mode.el (ess-mode): fixed doc string. (RMH). Sun Nov 30 12:03:34 1997 Anthony Rossini * essd-sas.el: useless comments removed. Sun Nov 30 12:03:10 1997 Anthony Rossini * essd-sas.el: useless comments removed. (RMH). Sun Nov 30 12:02:58 1997 Anthony Rossini * essd-sas.el (inferior-SAS-args-temp): docstring, explaining stupidity of this variable Sun Nov 30 12:00:24 1997 Anthony Rossini * ess-sas-sh-command: better shell scripting (RMH). Wed Nov 26 16:33:10 1997 Anthony Rossini * RELEASED: 5.0-gettingcloser. Wed Nov 26 16:10:02 1997 Anthony Rossini * Makefile (dist): do the right thing w/ README. Wed Nov 26 16:05:20 1997 Anthony Rossini * ess-sas-sh-command: more information. cleaned up for current essd-sas.el arg passing. Wed Nov 26 15:51:04 1997 Anthony Rossini * essd-sas.el: modified args to try to have "one set" for SAS process (2nd is for redirect). Wed Nov 26 15:43:10 1997 Anthony Rossini * essd-sas.el: renamed and reordered inferior-SAS-args... Wed Nov 26 14:29:40 1997 Anthony Rossini * ess-sas-sh-command: added more documentation on I/O. Wed Nov 26 14:01:23 1997 Anthony Rossini * ess-inf.el: cleaned up comments. Wed Nov 26 13:58:42 1997 Anthony Rossini * ess-sas-sh-command: cleaned up comments. Wed Nov 26 11:01:36 1997 Anthony Rossini * essddr.el: switch-to-S to switch-to-ESS. Wed Nov 26 11:01:07 1997 Anthony Rossini * essddr.el (Rd-mode-map): switch-to-S is now switch-to-ESS. Wed Nov 26 11:00:06 1997 Anthony Rossini * ess-mode.el (ess-mode): added "indent-region" binding to doc-string. Wed Nov 26 10:52:11 1997 Anthony Rossini * ess-trns.el (ess-transcript-mode-map): added 2 lines for consistency. (RMH) Wed Nov 26 10:51:29 1997 Anthony Rossini * ess-trns.el: ispell-checked. File name / header name mismatch corrected. (AJR) Wed Nov 26 10:49:58 1997 Anthony Rossini * ess-inf.el: ispell checked, typos fixed (RMH/AJR). Wed Nov 26 10:42:58 1997 Anthony Rossini * essl-sas.el (SAS-editing-alist): function definitions are useless. Remove. Wed Nov 26 10:37:44 1997 Anthony Rossini * essl-s.el (S-editing-alist): removed function definitions. They don't work. Wed Nov 26 10:29:00 1997 Anthony Rossini * ess-site.el: ispell-checked (AJR/RMH) Tue Nov 25 15:37:37 1997 Anthony Rossini * Doc/TODO: Real dump suggested programming fix. * README.S: Real dump user correction. Tue Nov 25 15:37:00 1997 Anthony Rossini * README.S : Real Dump user correction Tue Nov 25 13:06:38 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): Make sure that silly moves like "ess-dialect=S" are not cause for a bailout. (AJR). Tue Nov 25 12:38:21 1997 Anthony Rossini * README.S: changes for font-lock "Dump" problem. (RMH) Tue Nov 25 12:36:48 1997 Anthony Rossini * Makefile: chmod 444 ess.info* ess.dvi on release (RMH) Tue Nov 25 08:53:54 1997 Anthony Rossini * RELEASED: 5.0-honestlylastpre. * README.S: added comment re: \" and fontlock. Tue Nov 25 08:50:56 1997 Anthony Rossini * Doc/TODO: removed SAS tabbing, added S dumping (RMH). Tue Nov 25 08:49:18 1997 Anthony Rossini * essd-sas.el (SAS-mode): construct a sas-mode-local-map, from ess-mode-map, for modifying the tab key. Tue Nov 25 08:24:42 1997 Anthony Rossini * ess-mode.el (ess-mode): removed white space, spurrious comment. Mon Nov 24 12:14:38 1997 Anthony Rossini * Doc/TODO: SAS indent fixes. Mon Nov 24 11:33:00 1997 Anthony Rossini * README: fixed Kurt's address. Mon Nov 24 11:32:13 1997 Anthony Rossini * ess-mode.el: put back functions; see 10:48 change. Mon Nov 24 10:58:12 1997 Anthony Rossini * essl-s.el: ess to S. Mon Nov 24 10:50:51 1997 Anthony Rossini * essl-s.el: inadvertent placement of ess-indent-line function. Mon Nov 24 10:50:19 1997 Anthony Rossini * essl-s.el (S-editing-alist): inadvertent placement of indent-line-function. Mon Nov 24 10:48:19 1997 Anthony Rossini * ess-mode.el: commented out some language specific functions. Moved to essl-s.el Mon Nov 24 10:45:21 1997 Anthony Rossini * essl-s.el: new functions; S for ESS. Use them. Mon Nov 24 10:43:36 1997 Anthony Rossini * essl-s.el (S-comment-indent): * essl-s.el (S-indent-line): * essl-s.el (S-calculate-indent): new functions; used to be ess-*. Mon Nov 24 10:39:41 1997 Anthony Rossini * essl-sas.el: removed some lisp-isms. Mon Nov 24 10:36:48 1997 Anthony Rossini * essl-sas.el (sas-indent-region): New function. Use it. Mon Nov 24 10:25:07 1997 Anthony Rossini * essd-s4.el (S4-customize-alist): ess-object-name-db-file is "ess-s4-namedb.el". (RMH) Mon Nov 24 10:18:42 1997 Anthony Rossini * README.SAS: 2 typos (RMH). Mon Nov 24 10:17:46 1997 Anthony Rossini * ess-mode.el: added ess-quit autoload. Mon Nov 24 10:16:40 1997 Anthony Rossini * ess-inf.el (ess-quit): since now possible to call from ess-mode, make sure that we are connected to a process. Mon Nov 24 10:01:33 1997 Anthony Rossini * ess-vars.el (ess-mode-font-lock-keywords): finish off line. Mon Nov 24 09:59:39 1997 Anthony Rossini * Doc/TODO: quotes need fixing (RMH). Mon Nov 24 09:55:43 1997 Anthony Rossini * ess-mode.el (ess-mode-map): added ess-quit. (RMH). Mon Nov 24 09:48:15 1997 Anthony Rossini * essd-sas.el (SAS-customize-alist): inferior-ess-exit-command should be `endsas;\n'. (RMH). Sat Nov 22 19:16:40 1997 Anthony Rossini * Doc/README-19.28: new version of file (RMH). Fri Nov 21 17:37:26 1997 Anthony Rossini * Doc/TODO: added 2 more from RMH, with comments. Fri Nov 21 17:31:50 1997 Anthony Rossini * ess-site.el: fixed comments to reflect reality (RMH). Fri Nov 21 17:05:05 1997 Anthony Rossini * ess-trns.el: ess-mode -> ESS. (RMH) ess-mode-map -> ess-transcript-mode-map Fri Nov 21 17:02:45 1997 Anthony Rossini * Makefile (DISTSCRIPTS): commented out. (RMH) * Makefile (dist-doc): commented out. Will do by hand for 5.0. (RMH) * Makefile: Added comments for structure of Makefile. (RMH) Fri Nov 21 10:26:53 1997 Anthony Rossini * Doc/TODO: incr version. Fri Nov 21 10:26:25 1997 Anthony Rossini * Doc/TODO: added dir directions for info. Fri Nov 21 10:22:17 1997 Anthony Rossini * Doc/rmh-talk.tex: removed trailing \\. Fri Nov 21 10:19:50 1997 Anthony Rossini * Makefile (dist): ess.dvi and ess.info need to be up to date. Thu Nov 20 18:38:51 1997 Anthony Rossini * essl-sta.el: * essl-sas.el: * essl-s.el: * essl-lsp.el: * essddr.el: * essd-xls.el: * essd-vst.el: * essd-sas.el: * essd-s4.el: * essd-s3.el: * essd-s+3.el: incr version. * essd-r.el: incr version, comments. * ess.texi: small edits, incr version * ess.el: ess-mode is ESS. incr version * ess-vars.el: incr version, added comments. Thu Nov 20 18:21:01 1997 Anthony Rossini * ess-site.el: part of ESS; comments. Thu Nov 20 18:20:12 1997 Anthony Rossini * Makefile: incr, edits. Thu Nov 20 18:19:24 1997 Anthony Rossini * Makefile: errors. Thu Nov 20 18:17:13 1997 Anthony Rossini * COPYING: trying. Thu Nov 20 18:15:01 1997 Anthony Rossini * ess-trns.el: added copyright, incr version. Thu Nov 20 18:12:06 1997 Anthony Rossini * ess-mode.el: edited copyright. incr version. Thu Nov 20 18:11:02 1997 Anthony Rossini * README: removed silly university locations. incr version. Thu Nov 20 18:09:00 1997 Anthony Rossini * ess-inf.el: added copyright, edited comments, incr version. Thu Nov 20 18:07:51 1997 Anthony Rossini * ess-help.el: edited comments, incr version. Thu Nov 20 18:03:09 1997 Anthony Rossini * ess-debug.el: edit, end, upgraded version. Thu Nov 20 18:00:55 1997 Anthony Rossini * ess-comp.el: removed log file, edited comments, upgrade to 4. Thu Nov 20 16:41:51 1997 Anthony Rossini * RELEASED: 5.0-verylastpre. * ess-inf.el: fixed menus. Thu Nov 20 16:40:29 1997 Anthony Rossini * ess-trns.el: fixed menus. Thu Nov 20 16:38:35 1997 Anthony Rossini * ess-mode.el: formatting. extra ). Thu Nov 20 16:37:23 1997 Anthony Rossini * ess-mode.el: cleaned up menus. removed useless comments. Thu Nov 20 16:29:15 1997 Anthony Rossini * ess-mode.el: fixed goto-info stuff. Thu Nov 20 16:13:43 1997 Anthony Rossini * ess-help.el (ess-goto-info): ess isn't ess-mode. Split window, not other-window. Thu Nov 20 10:04:28 1997 Anthony Rossini * README: added comments on help file editing. Thu Nov 20 10:01:47 1997 Anthony Rossini * Doc/TODO: added inferior-ess rewrite. Thu Nov 20 09:54:51 1997 Anthony Rossini * README.XLispStat: Splus removed, XLispStat added. Thu Nov 20 09:53:48 1997 Anthony Rossini * README.S: retitled the FAQ. Thu Nov 20 09:52:57 1997 Anthony Rossini * README: changes (RMH). Thu Nov 20 09:46:20 1997 Anthony Rossini * ess.texi: archive is on Franz. Thu Nov 20 09:43:47 1997 Anthony Rossini * README: more comments about dir. Thu Nov 20 09:41:53 1997 Anthony Rossini * Makefile: "it" to "they". Thu Nov 20 09:40:44 1997 Anthony Rossini * Makefile: put dir back into the Docs. Thu Nov 20 09:38:54 1997 Anthony Rossini * Doc/TODO: truns :-). Thu Nov 20 09:38:12 1997 Anthony Rossini * Doc/ajr-talk.tex: added typoout for fonts. Thu Nov 20 09:35:28 1997 Anthony Rossini * Doc/rmh-talk.tex: fixed my typo, line wrap. Thu Nov 20 09:33:16 1997 Anthony Rossini * Doc/README.additions: added essdd*.el Thu Nov 20 09:22:02 1997 Anthony Rossini * Doc/TODO: added new for fix to About. Thu Nov 20 09:19:52 1997 Anthony Rossini * ess-trns.el (ess-transcript-mode-menu): * ess-inf.el (inferior-ess-mode-menu): * ess-mode.el (ess-mode-menu): removed About from menu, for now. Wed Nov 19 12:24:22 1997 Anthony Rossini * RELEASED 5.0, lastpre. * Makefile: removed veryclean. unnecessary target. Fixed dist-doc target. Wed Nov 19 12:21:38 1997 Anthony Rossini * Doc/rmh-talk.tex: no changes. Wed Nov 19 12:21:02 1997 Anthony Rossini * Doc/ajr-talk.tex: final version. Not best, but we've got docs provided. Wed Nov 19 12:03:03 1997 Anthony Rossini * Doc/ajr-talk.tex: use the ugly version Wed Nov 19 12:01:53 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): never take name from a running process buffer. Wed Nov 19 11:56:09 1997 Anthony Rossini * essd-xls.el: added transcript mode. Wed Nov 19 11:43:24 1997 Anthony Rossini * ess-mode.el (ess-mode-menu): bug in "About". Wed Nov 19 11:25:01 1997 Anthony Rossini * README: database creation works. Wed Nov 19 11:20:28 1997 Anthony Rossini * ess-inf.el (ess-create-object-name-db): use temporary name for ess-object-name-db; since we make it buffer local to accomodate different languages, need to handle it carefully. In particular, might be better to make buffer local upon demand, rather than always buffer local. But lots of considerations, here. Wed Nov 19 11:14:10 1997 Anthony Rossini * ess-inf.el (ess-create-object-name-db): added *ESS* messages. Wed Nov 19 10:56:47 1997 Anthony Rossini * ess.el (ess-load-object-name-db-file): no warning when object database name fails to exist; the code is still there. Wed Nov 19 10:55:38 1997 Anthony Rossini * essd-s+3.el: setq-default to setq * essd-r.el: setq, not setq default. Wed Nov 19 10:52:28 1997 Anthony Rossini * README: added statement about object-name db being broken. Wed Nov 19 10:33:47 1997 Anthony Rossini * essd-s+3.el (S+3-transcript-mode): make interactive. Wed Nov 19 10:32:28 1997 Anthony Rossini * ess-site.el (s-transcript-mode): make interactive. Wed Nov 19 10:31:54 1997 Anthony Rossini * essd-r.el (r-transcript-mode): make interactive. Tue Nov 18 17:38:56 1997 Anthony Rossini * essddr.el: updated to 0.1.7. (KH) Tue Nov 18 17:37:11 1997 Anthony Rossini * ess-inf.el: ess-create-object-name-db, format Tue Nov 18 17:21:37 1997 Anthony Rossini * essd-s+3.el (S+3-customize-alist): changed var name for consistency. Tue Nov 18 17:20:21 1997 Anthony Rossini * essd-r.el (R-customize-alist): use R-help-sec-keys-alist. Tue Nov 18 17:19:23 1997 Anthony Rossini * ess-vars.el: removed spurrious variable. Tue Nov 18 17:18:29 1997 Anthony Rossini * ess-vars.el: removed ess--help-S-sec-keys-alist; second def! Tue Nov 18 17:14:33 1997 Anthony Rossini * essl-s.el (ess-help-*-sec-keys-alist): renamed to *-help-sec-keys-alist. defvars to defconst. Tue Nov 18 17:03:40 1997 Anthony Rossini * ess-inf.el (inferior-ess): removed "switch-to" logic in inferior-ess. Now should strictly start-up a buffer. Tue Nov 18 16:58:06 1997 Anthony Rossini * Makefile: added warnings for set-keymap-parent; XEmacs, non-Emacs. Tue Nov 18 16:52:52 1997 Anthony Rossini * essl-s.el: added Martin's fix to documentation. Mon Nov 17 09:59:20 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode-menu): reinstalled info connection. Mon Nov 17 09:58:37 1997 Anthony Rossini * ess-mode.el: reinstalled info connection. Mon Nov 17 09:25:24 1997 Anthony Rossini * Doc/rmh-talk.tex: added updates. (RMH) Mon Nov 17 09:09:09 1997 Anthony Rossini * README.S: fixed grammar. Mon Nov 17 09:05:50 1997 Anthony Rossini * README/ess.texi: R uses ess-r-namedb.el. (RMH) Mon Nov 17 09:04:41 1997 Anthony Rossini * README/ess.texi: changed phrasing for creating object database files. (RMH) Mon Nov 17 09:00:38 1997 Anthony Rossini * ess-inf.el (inferior-ess): doc string edited. Wrong comments removed (RMH). Mon Nov 17 08:57:54 1997 Anthony Rossini * Makefile: fixed documentation dependencies (RMH) Mon Nov 17 08:56:41 1997 Anthony Rossini * ess.el: fixed Lisp-Dir-Entry; franz.stat.wisc.edu, not ftp.math.sc.edu. (RMH). Mon Nov 17 08:54:59 1997 Anthony Rossini * Doc/ajr-talk.tex: added comments for changing font usage (RMH). Fri Nov 14 17:44:14 1997 Anthony Rossini * README: added more of an introduction and "history" statement. * README.S: added a small "FAQ" at the end. * Doc/TODO: Added last of the SAS things to do for 5.2 or 5.4. Fri Nov 14 17:27:27 1997 Anthony Rossini * README: more comments. Fri Nov 14 16:59:05 1997 Anthony Rossini * Doc/TODO: added SAS fontlock, graphics. R Help Fri Nov 14 13:49:40 1997 Anthony Rossini * README.XLispStat: fixed small typos. Fri Nov 14 11:24:05 1997 Anthony Rossini * Makefile (DOCS): reordered variable. Added info/dvi files. Fri Nov 14 11:22:03 1997 Anthony Rossini * ess.el: more comment work. * ess.el: verified using lisp-mnt.el; standard package formatting. Fri Nov 14 11:06:18 1997 Anthony Rossini * Makefile (clean): don't remove .dvi or .info* * Makefile (veryclean): new target, for removing what clean used to remove Fri Nov 14 10:13:49 1997 Anthony Rossini * Makefile: version to 5.0 Fri Nov 14 10:13:40 1997 Anthony Rossini * Makefile (VERSION): version to 5.0 Fri Nov 14 10:13:24 1997 Anthony Rossini * ess-vars.el: version to 5.0 Fri Nov 14 10:13:04 1997 Anthony Rossini * ess-vars.el (ess-version): version to 5.0. Fri Nov 14 10:12:34 1997 Anthony Rossini * README.S: added notes for starting R with prefix arguments. Fri Nov 14 09:59:25 1997 Anthony Rossini * ess.texi: added @itemize markers. Thu Nov 13 21:45:27 1997 Anthony Rossini * Release: 5.0-pre5 * Makefile (VERSION): incremented. * ess-vars.el (ess-version): incremented. Thu Nov 13 21:40:12 1997 Anthony Rossini * essd-sas.el: works again. shooze... Thu Nov 13 20:51:36 1997 Anthony Rossini * ess.el (ess-load-object-name-db-file): don't bomb if file doesn't exist.. Thu Nov 13 20:31:21 1997 Anthony Rossini * ess-inf.el: back to initial, except for new unused, commented out, variable) Thu Nov 13 20:28:06 1997 Anthony Rossini * ess-inf.el: New temp variables for when we rewrite the initialization routines; NEED TO DO THIS FOR 5.2!!! LOGIC HAS CHANGED, FOR THE "SIMPLER"! * ess-inf.el: doesn't work. This is a mess. * ess-inf.el (inferior-ess): use language instead of dialect for "*language*" and "*language:1*" buffer names; old version commented out. Thu Nov 13 20:11:10 1997 Anthony Rossini * ess-vars.el (ess-plain-first-buffername): use it. Thu Nov 13 20:07:42 1997 Anthony Rossini * ess-inf.el: forgot ")". Thu Nov 13 20:06:12 1997 Anthony Rossini * essd-sas.el: fixed R then SAS buffer name problem. Thu Nov 13 19:56:57 1997 Anthony Rossini * ess-site.el: added commented example for ess-plain-first-buffername. TRUE by default, i.e. for "novice" mode. Thu Nov 13 19:54:23 1997 Anthony Rossini * ess-vars.el: moved database loading to ess-mode and inferior-ess-mode; removed old comments. Thu Nov 13 19:52:31 1997 Anthony Rossini * ess-inf.el (ess-proc-name): If ess-plain-first-buffername is true, don't add "process number" to the first process. Thu Nov 13 19:35:59 1997 Anthony Rossini * ess.el (ess-load-object-name-db-file): new function, use it. Thu Nov 13 19:35:27 1997 Anthony Rossini * ess-inf.el: C-c tab is ess-complete-object-name. Thu Nov 13 19:34:48 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode-map): C-c TAB is ess-complete-object-name, same as in ess-mode. Thu Nov 13 19:27:55 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): load object-name db file if exists. Thu Nov 13 19:19:37 1997 Anthony Rossini * ess-mode.el (ess-mode): load object-name db file if exists. Thu Nov 13 19:17:59 1997 Anthony Rossini * ess.texi: bare-bones description of how to create object-name databases. Thu Nov 13 19:09:07 1997 Anthony Rossini * README: added notes for database creation Thu Nov 13 10:16:12 1997 Anthony Rossini * README.XLispStat : XLispStat isn't a trademark. Thu Nov 13 09:59:05 1997 Anthony Rossini * Makefile (ess.elc): fixed action * Makefile (ess-vars.elc): fixed action Thu Nov 13 09:58:42 1997 Anthony Rossini * ess-vars.el: removed ancient comments. Thu Nov 13 09:58:23 1997 Anthony Rossini * README.S: added means for using second philosophy. Thu Nov 13 09:51:19 1997 Anthony Rossini * README.S: fixed line break. Thu Nov 13 09:40:56 1997 Anthony Rossini * Doc/ajr-talk.tex: added location of talk. Thu Nov 13 09:39:52 1997 Anthony Rossini * Doc/rmh-talk.tex: pointed to FRANZ. added comment about where given. 1998-11-13 A.J. Rossini * doc/Makefile: added "info" target. Removed spurrious ess.info/ess.texi dependency, i.e. the first. Thu Nov 13 08:54:40 1997 Anthony Rossini * Makefile (dist-doc): new target. Use it * Makefile (ESS-doc): new target. Use it. Wed Nov 12 17:32:49 1997 Anthony Rossini * Doc/ajr-talk.tex: de latex-2-html'd. Wed Nov 12 17:26:25 1997 Anthony Rossini * ess-inf.el: args passes all the way through. Wed Nov 12 16:30:34 1997 Anthony Rossini * essd-r.el: added prefix to R. Wed Nov 12 15:15:06 1997 Anthony Rossini * README: added stata comment, site-init.el Wed Nov 12 15:12:25 1997 Anthony Rossini * ess.texi: added installation (from README). Use @file{} for file names. Wed Nov 12 14:56:41 1997 Anthony Rossini * Makefile: added warning messages for ignorable errors. Wed Nov 12 14:43:07 1997 Anthony Rossini * ess-inf.el: can't seem to remove last byte compiler error. Wed Nov 12 14:30:00 1997 Anthony Rossini * ess-trns.el: * ess-help.el: added compile requires to remove byte-compiler warnings. Wed Nov 12 14:21:33 1997 Anthony Rossini * essddr.el: paren balance. whoops. Wed Nov 12 14:20:41 1997 Anthony Rossini * essddr.el: added "require 'ess-help" to solve byte compiler errors. Wed Nov 12 14:16:37 1997 Anthony Rossini * essd-sas.el: require 'shell to fix byte-compile errors. Wed Nov 12 02:45:44 1997 Anthony Rossini * Release: 5.0-pre4 * ess-vars.el: updated version number for release * Makefile: Updated version number for release Wed Nov 12 02:27:16 1997 Anthony Rossini * essd-sas.el: seems to work, now. Tue Nov 11 19:20:50 1997 Anthony Rossini * essd-sas.el: might need comint. Tue Nov 11 19:09:18 1997 Anthony Rossini * README.XLispStat: fixed small errors. Tue Nov 11 19:04:51 1997 Anthony Rossini * README.XLispStat : bad key-seq "C-c C-f" isn't find-file. Tue Nov 11 19:01:22 1997 Anthony Rossini * README.S: merged rewrite (RMH) Tue Nov 11 16:49:41 1997 Anthony Rossini * essd-sas.el: format cleaning. Tue Nov 11 16:42:28 1997 Anthony Rossini * essd-sas.el: ess-SAS-pre-run-hook now called from SAS, not inferior-ess. Tue Nov 11 16:34:38 1997 Anthony Rossini * essl-sta.el: wrong header! Tue Nov 11 16:32:51 1997 Anthony Rossini * ess.texi: added to New Features. Tue Nov 11 16:30:26 1997 Anthony Rossini * README: small typos. Distributed from Wisconsin. Tue Nov 11 16:27:21 1997 Anthony Rossini * README: added Splus 3.4. Removed "futures". Tue Nov 11 16:25:59 1997 Anthony Rossini * ess-vars.el: inferior S -> inferior ESS Tue Nov 11 16:24:38 1997 Anthony Rossini * ess-site.el: small doc changes (RMH). Tue Nov 11 16:21:34 1997 Anthony Rossini * README.S: edited how to find key-sequences (RMH) Tue Nov 11 16:19:51 1997 Anthony Rossini * ess-inf.el: removed comint symbols. (RMH). Need to read comint docs (AJR). Tue Nov 11 16:19:00 1997 Anthony Rossini * Makefile: small typos corrected. Tue Nov 11 16:04:26 1997 Anthony Rossini * ess-inf.el (ess-read-object-name): use ess-read-object-name-dump. * ess-inf.el (ess-read-object-name-default): reverted back to old behavior. * ess-inf.el (ess-read-object-name-dump): new function. Use it. Tue Nov 11 15:56:03 1997 Anthony Rossini * ess.texi: XLisp-Stat, uniformly. Tue Nov 11 15:51:48 1997 Anthony Rossini * ess.texi: fixed titles (no @_{} commands). Updated menus. (MM) Tue Nov 11 15:38:52 1997 Anthony Rossini * README.XLispStat: removed "S(tm)". * README.SAS: major overhaul (RMH). * README.S: removed "S(tm)". Tue Nov 11 10:02:44 1997 Anthony Rossini * ess-inf.el (ess-read-object-name-default): new version (KH). Tue Nov 11 10:00:54 1997 Anthony Rossini * ess-site.el ((assoc "\\.[rR]\\'" auto-mode-alist)): added man format again for R internal man pages. Mon Nov 10 23:17:28 1997 Anthony Rossini * Makefile: added latex/tex for talks on ESS 5.0. Mon Nov 10 23:02:36 1997 Anthony Rossini * Releasing 5.0-pre3. * essd-sas.el: changes made. Watch out. * ess-vars.el (ess-version): 5.0-pre3 * Makefile (VERSION): 5.0-pre3 Mon Nov 10 22:58:39 1997 Anthony Rossini * ess-mode.el: more S to ESS Mon Nov 10 22:52:55 1997 Anthony Rossini * ess-inf.el: more S/ESS fixes (RMH) Mon Nov 10 22:49:31 1997 Anthony Rossini * README.SAS: typo Mon Nov 10 22:43:59 1997 Anthony Rossini * ess-inf.el (ess-read-object-name-default): handle defaults better. Mon Nov 10 22:34:11 1997 Anthony Rossini * README.S: typo. Mon Nov 10 17:28:28 1997 Anthony Rossini * README.SAS: added some suggestions by RMH. Mon Nov 10 17:26:11 1997 Anthony Rossini * README.S: edited as suggested by RMH. Mon Nov 10 17:17:21 1997 Anthony Rossini * README.S: stuff. Mon Nov 10 17:16:21 1997 Anthony Rossini * README: changed mode/revision. Mon Nov 10 17:14:53 1997 Anthony Rossini * README: fixes (RMH) Mon Nov 10 17:04:38 1997 Anthony Rossini * ess-trns.el (ess-transcript-mode): * ess-help.el (ess-help-mode): * ess-inf.el (inferior-ess-mode): * ess-mode.el (ess-mode): keep tabs out of the code. Mon Nov 10 16:48:00 1997 Anthony Rossini * ess.texi: @code -> @email when appropriate. Mon Nov 10 15:58:23 1997 Anthony Rossini * ess.texi: added most, approx 300, of MM's changes. A very few differences, though. Mon Nov 10 15:05:45 1997 Anthony Rossini * ess-vars.el: S -> ESS (MM) Mon Nov 10 15:02:32 1997 Anthony Rossini * ess-trns.el: S -> ESS (MM) Mon Nov 10 14:59:39 1997 Anthony Rossini * ess-mode.el: S -> ESS (MM). Mon Nov 10 14:51:30 1997 Anthony Rossini * ess-inf.el: S -> ESS (MM). Mon Nov 10 14:41:30 1997 Anthony Rossini * ess-help.el: removed comment re: S.el. * ess-help.el: updated docs and functions, S -> ESS (MM) Mon Nov 10 14:34:35 1997 Anthony Rossini * Makefile (MAKEHTML): change target (MM) * Makefile (clean): more to clean (MM) * Makefile (dvi): new target. Use it (MM) Sun Nov 9 16:30:38 1997 Anthony Rossini * Doc/TODO: cleaned out my email of TODO problems, except for SAS). Sun Nov 9 16:24:39 1997 Anthony Rossini * Doc/TODO: updated for what has been accomplished by this stage, for 5.0. Sun Nov 9 15:32:34 1997 Anthony Rossini * essl-sta.el: cleaned up errors via lets. Sun Nov 9 15:26:33 1997 Anthony Rossini * essl-sas.el: removing unusable commands. Sun Nov 9 15:08:56 1997 Anthony Rossini * ess-vars.el (no-doc): new variable. use it for autoload documentation. Sun Nov 9 15:08:13 1997 Anthony Rossini * Makefile: ess-vars/ess/ess-site dependencies cleared up. Sun Nov 9 15:02:29 1997 Anthony Rossini * essd-sas.el: changed documentation for autoloads. Sun Nov 9 14:56:32 1997 Anthony Rossini * essl-sas.el: one too many ")" (in editing sas-narrow-to-page). Sun Nov 9 14:48:55 1997 Anthony Rossini * ess-site.el: cleaned up. Sun Nov 9 14:44:06 1997 Anthony Rossini * ess-comp.el: cleaned up. Sun Nov 9 14:38:29 1997 Anthony Rossini * essl-sta.el: cleaned up format. Sun Nov 9 14:33:18 1997 Anthony Rossini * essd-sas.el: cleaned up byte-compiler warnings and lisp. Sun Nov 9 14:32:54 1997 Anthony Rossini * essl-sas.el: need the right name at top. * essl-sas.el: cleaned up byte-compiler warnings. Sun Nov 9 14:17:36 1997 Anthony Rossini * Makefile: cleaned dependencies for essd-*.el Sun Nov 9 14:00:56 1997 Anthony Rossini * ess-vars.el (ess-version): upgrade to 5.0 * Makefile: upgrade version to 5.0 1998-11-09 A.J. Rossini * Makefile (dist): new top-level target. (dist): uses scp to put it where it belongs. Fri Nov 7 19:43:11 1997 Anthony Rossini * Released 5.0-pre2. * Makefile (dist): copy makefile into the appropriate place. Fri Nov 7 19:41:02 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): fixed process name synch problem. Fri Nov 7 19:18:57 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): set explicit-shell-file-name to "/bin/sh" to aviod prompt evilness. Fri Nov 7 18:33:29 1997 Anthony Rossini * Doc/TODO: SAS problems. Fri Nov 7 18:28:40 1997 Anthony Rossini * ess-inf.el (inferior-R-input-sender): patch to avoid problems with R, for "help()" (MM). Fri Nov 7 18:17:54 1997 Anthony Rossini * ess-site.el: added comments re: TT commenting/editing styles. Fri Nov 7 18:10:25 1997 Anthony Rossini * ess-mode.el: indentation. Fri Nov 7 14:42:45 1997 Anthony Rossini * ess-mode.el: changes for TT (RMH). Fri Nov 7 14:31:35 1997 Anthony Rossini * essl-sas.el (sas-require-confirmation): doc string edit. Fri Nov 7 14:30:33 1997 Anthony Rossini * ess-vars.el (ess-transcript-minor-mode): * ess-vars.el (ess-listing-minor-mode): new variables. Use. (RMH) Fri Nov 7 14:29:49 1997 Anthony Rossini * essl-sas.el: fixes for multiple SAS processes. (RMH) Fri Nov 7 13:53:16 1997 Anthony Rossini * essd-sas.el: changes for SAS mode (RMH-2Nov). Fri Nov 7 13:47:31 1997 Anthony Rossini * ess-vars.el: patches for Terry Thernau's suggested indentation (RMH) Fri Nov 7 13:37:41 1997 Anthony Rossini * README.XLispStat: new file. read it. * README.SAS: New file. Read it. * README.S: revision, not version. Fri Nov 7 11:41:01 1997 Anthony Rossini * README.S: added gen'l features, id -> version. Fri Nov 7 09:23:55 1997 Anthony Rossini * README.S: New file. Include it. Fri Nov 7 09:20:30 1997 Anthony Rossini * README: pointer to README.S, README.SAS, and README.XLispStat Fri Nov 7 09:17:52 1997 Anthony Rossini * README: changes to mailing list and WWW documentation location (MM). Thu Nov 6 10:42:10 1997 Anthony Rossini * Makefile (DOCS): added README.LANGUAGE files to the Makefile. Need to fill them in. Wed Oct 29 14:08:52 1997 Anthony Rossini * README: rearranged, as suggested by Don Cram. (DC). Mon Oct 27 14:50:18 1997 Anthony Rossini * ess.texi: readded "New Features" section. Mon Oct 27 13:05:13 1997 Anthony Rossini * ess.texi: started editing section 1. In particular, @b{S} refers to a generic statistical process, at this point. Mon Oct 27 10:44:44 1997 Anthony Rossini * ess.texi (Local Variables): TeX-master ought to be ess.texi. Whoops. Mon Oct 27 10:25:49 1997 Anthony Rossini * Doc/TODO: added RMH's SAS suggestions. Mon Oct 27 10:22:17 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): removed interactive call. * essd-sas.el (ess-SAS-pre-run-hook): make sure buffer name of any running *shell* buffers is unique for changes. Mon Oct 27 10:03:34 1997 Anthony Rossini * Makefile (SOURCES): removed ess-debug from distributed sources. Mon Oct 27 09:01:24 1997 Anthony Rossini * Makefile (dist): Doc should not be writable, again. Fri Oct 24 16:31:12 1997 Anthony Rossini * Makefile (install): -ne should be !=, since doing string, not integer, comparison. (KH) Fri Oct 24 12:25:40 1997 Anthony Rossini * ess-vars.el (ess-version): * Makefile (VERSION): 5.0-pre2 * ess-site.el ((assoc "\\.[rR]\\'" auto-mode-alist)): changes for R, 0.50 vs. 0.60. Fri Oct 24 08:56:26 1997 Anthony Rossini * ESS-5.0-pre1 released. Fri Oct 24 08:55:10 1997 Anthony Rossini * ess-vars.el (ess-version): * Makefile (VERSION): updated version name to 5.0-pre1, skipping beta-17. Fri Oct 24 08:51:27 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): We need to make sure that no shells are currently running. put back the stuff removed 1.5 hours ago. Cleaned up variable usage using let. Fri Oct 24 08:13:58 1997 Anthony Rossini * essl-sas.el (SAS-log-mode): fundamental mode, with read-only. Same as listing mode, pretty much. Fri Oct 24 08:11:41 1997 Anthony Rossini * essl-sas.el (set-sas-file-buffer): sasl-mode isn't real, anymore. Fri Oct 24 08:07:48 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): after accepting process input, sleep-for to allow the rest of the input to appear! Else, we don't read the correct tty. Alternative: would have to grep for tty, and figure out if we mean BSD or SYSV style unix. Bleach. Fri Oct 24 07:21:33 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): removed ess-sas-shell-buffer-name stuff. Necessary? Fri Oct 24 07:21:16 1997 Anthony Rossini * ess-sas-sh-command: use /bin/sh Fri Oct 24 07:20:56 1997 Anthony Rossini * Makefile (dist): make sure scripts are executable before packaging. Thu Oct 23 17:24:23 1997 Anthony Rossini * essd-sas.el (ess-sas-shell-buffer-name-flag): use it. * essd-sas.el (ess-sas-shell-buffer-name): use it. Thu Oct 23 17:20:42 1997 Anthony Rossini * essd-sas.el (ess-SAS-pre-run-hook): removed 'interactive' call. Should only be run from a run-hooks call? * essd-sas.el (ess-SAS-pre-run-hook): ess-shell-buffer-name-p should be ess-shell-buffer-name-flag; -p and p suffices are reserved for functions, -flag reserved for variables. Thu Oct 23 13:17:28 1997 Anthony Rossini * ess-inf.el (ess-eval-line-and-next-line, ess-eval-line, ess-eval-function, ess-eval-buffer): ess-force-buffer-current Thu Oct 23 09:08:24 1997 Anthony Rossini * Makefile (install): test lispdir to see if needs install (MM). Thu Oct 23 09:07:42 1997 Anthony Rossini * essl-sas.el (ess-transcript-mode): should be autoloaded. Thu Oct 23 09:01:45 1997 Anthony Rossini * ess-site.el (s-transcript-mode): generic. Moved here. Thu Oct 23 09:00:02 1997 Anthony Rossini * essd-r.el (r-transcript-mode): moved here. Thu Oct 23 08:57:04 1997 Anthony Rossini * Makefile (AUXFILES): added SCRIPTS * Makefile (SCRIPTS): new variable, use it. Thu Oct 23 08:52:27 1997 Anthony Rossini * ess-inf.el (ess-eval-visibly): DOCSTRING lied; text -> text-withtabs. Thu Oct 23 08:30:21 1997 Anthony Rossini * Makefile (dist): remove write permission from ChangeLog for distribution. Thu Oct 23 08:23:52 1997 Anthony Rossini * Makefile (DOCS): new variable. Use it. Thu Oct 23 08:22:09 1997 Anthony Rossini * Makefile (SOURCES): Need to include ess-debug, ess-comp. Wed Oct 22 15:53:46 1997 Anthony Rossini * ess-vars.el (ess-version): updated version number (17) * Makefile (VERSION): updated version number (17) * beta 16 released. Wed Oct 22 15:10:26 1997 Anthony Rossini * Makefile (dist): dist target now works; being too ambitious resulted in the loss of below. 1997-10-22 Anthony Rossini * WHOOPS. Stupid mistake, lost 2 days of ChangeLog activity. Mon Oct 20 14:20:51 1997 Anthony Rossini * ess-help.el (ess-display-help-on-object): set the customization variables properly. Thu Oct 16 14:25:59 1997 Anthony Rossini * essd-sas.el (ess-mode): added autoload. * essd-s+3.el: editing of spaces. * Makefile (SOURCES): changed edd-doc appropairately.i Fri Oct 10 12:05:40 1997 Anthony Rossini * beta 15 released. * ess-trns.el (ess-transcript-mode): start up in read-only mode. Wed Oct 8 14:50:03 1997 Anthony Rossini * ess-inf.el (ess-proc-name): takes stringname for buffer; was ess-dialect. Use it. Wed Oct 8 13:56:51 1997 Anthony Rossini * essd-s4.el (S4-customize-alist): inferior-ess-*-command variables must end in "\n". * essd-s+3.el (S+3-customize-alist): inferior-ess-*-command variables must end in "\n". Wed Oct 8 08:50:58 1997 Anthony Rossini * ess-vars.el (inferior-ess-names-command): add "\n" to end of names(%s) command (KH). Wed Oct 8 05:36:04 1997 Anthony Rossini * ess-debug.el: new file for debugging and development. Use it. Tue Oct 7 15:46:59 1997 Anthony Rossini * ess-site.el: commented out debug-on-error. Tue Oct 7 15:42:49 1997 Anthony Rossini * ess-inf.el (ess-get-words-from-vector): don't concat "\n", since we might have multi-line commands. Make them do it in the command definition (KH). Tue Oct 7 13:21:57 1997 Anthony Rossini * Makefile (SOURCES): add ess-doc.el Thu Oct 2 08:52:58 1997 Anthony Rossini * Makefile (install): create INFODIR and LISPDIR as well as parents before installing. Thu Oct 2 08:42:46 1997 Anthony Rossini * ess-inf.el (ess-multi): removed ess-pre-run-hook execution; it should only happen in inferior-ess. Thu Oct 2 01:12:22 1997 Anthony Rossini * essl-s.el (r-transcript-mode, s-transcript-mode): new functions. Use it, and fset it. Thu Oct 2 01:12:07 1997 Anthony Rossini * ess-trns.el (ess-transcript-mode): added alist parameter. Use it. Thu Oct 2 00:35:30 1997 Anthony Rossini * ess-vars.el (ess-function-pattern): tied the non-quoted function name to either the beginning of a line or a space, instead of beginning of a word. Wed Oct 1 21:50:59 1997 Anthony Rossini * essl-s.el (S-syntax-table): modified . to be "_" (KH). Wed Oct 1 21:46:51 1997 Anthony Rossini * ess-inf.el: Require ess-site, not just ess, so that language specific stuff will be loaded. Wed Oct 1 21:45:47 1997 Anthony Rossini * ess-trns.el: Require ess-site, not just ess, so that language specific stuff will be loaded. Tue Sep 16 16:15:37 1997 Anthony Rossini * essl-sas.el (SAS-editing-alist): * essl-lsp.el (Lisp-editing-alist): * essl-s.el (S-editing-alist): ess-keep-dump-files NEEDS to be 'ask. Wed Sep 10 13:48:41 1997 Anthony Rossini * ess-help.el (ess-submit-bug-report): ess-program-name doesn't exist. Wed Sep 10 13:44:52 1997 Anthony Rossini * essl-sas.el: can't require sas here. Wed Sep 10 13:33:57 1997 Anthony Rossini * essl-sas.el: added Tom Cook's sas-data code. Not integrated yet. Wed Sep 10 09:42:30 1997 Anthony Rossini * Makefile (html/ess_toc.html): Use explicit file "index.html", since some servers/browsers have different defaults. (MM). Wed Sep 10 09:40:04 1997 Anthony Rossini * ess-site.el ((assoc "\\.[rR]\\'" auto-mode-alist)): change check for setting auto-mode-alist (MM). Tue Sep 9 16:35:21 1997 Anthony Rossini * ess-mode.el: removed code which generated a second "ess-mode" menu. Tue Sep 9 16:23:56 1997 Anthony Rossini * ess-mode.el (ess-mode): mode name: ess-language, not ess-dialect. Tue Sep 9 16:22:41 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): mode name: iESS [ess-dialect:proc] Tue Sep 9 10:39:35 1997 Anthony Rossini * essd-[r][s+3].el (*-customize-alist): lastvalue command renamed as ".ess.lvsave". Tue Sep 9 09:59:04 1997 Anthony Rossini * ess-inf.el: what is (fset 'run-s (fset 'run-S (symbol-function 'S))) for?? Tue Sep 9 09:15:24 1997 Anthony Rossini * ess-vars.el (ess-version): incremented * Makefile (VERSION): incremented Tue Sep 9 09:01:59 1997 Anthony Rossini * RELEASING beta 13 Tue Sep 9 09:01:02 1997 Anthony Rossini * Makefile (all): ess -> ESS Tue Sep 9 08:29:48 1997 Anthony Rossini * essd-r.el (R-customize-alist): needs syntax table for inferior processes. Mon Sep 8 15:22:18 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): need to fix syntax table. Mon Sep 8 14:28:57 1997 Anthony Rossini * essl-sas.el (sas-indent-line): renamed from indent-sas-statement. Mon Sep 8 14:08:24 1997 Anthony Rossini * ess-mode.el (ess-mode): add one more debugging statement. Mon Sep 8 13:23:20 1997 Anthony Rossini * ess-vars.el: moved syntax table code to essl-s.el. Mon Sep 8 13:07:48 1997 Anthony Rossini * ess-vars.el (ess-version): updated. * Makefile: Updated version number Mon Sep 8 12:25:09 1997 Anthony Rossini * ess-help.el (ess-find-help-file): doesn't search for completions, with SAS or XLS. Fine, since there isn't a really good way to build the list [SAS] or it isn't coded yet [XLS]. Mon Sep 8 12:24:42 1997 Anthony Rossini * ess-help.el (ess-display-help-on-object): uses process name as part of the buffer. Mon Sep 8 12:23:24 1997 Anthony Rossini * ess-vars.el: removed inferior-ess-save-lastvalue-command and inferior-ess-retr-lastvalue-command, not needed. Mon Sep 8 09:01:18 1997 Anthony Rossini * essl-sas.el: moved SAS language related autoloads and fsets from ess.el to here. Mon Sep 8 08:59:13 1997 Anthony Rossini * essl-s.el: moved S language related autoloads and fsets from ess.el to here. Mon Sep 8 08:51:01 1997 Anthony Rossini * essd-sas.el (SAS-customize-alist): use ess-local-customize-alist. Mon Sep 8 08:46:32 1997 Anthony Rossini * essd-r.el (R-customize-alist): use ess-local-customize-alist. Mon Sep 8 08:45:43 1997 Anthony Rossini * essd-s+3.el (S+3-customize-alist): use ess-local-customize-alist. Mon Sep 8 08:45:00 1997 Anthony Rossini * essd-s4.el (S4-customize-alist): use ess-local-customize-alist. Mon Sep 8 08:42:48 1997 Anthony Rossini * essd-s3.el (S3-customize-alist): use ess-local-customize-alist. Mon Sep 8 08:41:35 1997 Anthony Rossini * ess-vars.el (ess-local-customize-alist): new variable. use it. Mon Sep 8 08:35:42 1997 Anthony Rossini * ess-site.el: code to remove .[sS] from auto-mode-alist commented out. Need a version which works with Emacs. Fri Sep 5 14:20:18 1997 Anthony Rossini * ess-mode.el (ess-eval-map): define it. New keysequence: C-c C-e ... for evaluation of code. Fri Sep 5 14:19:43 1997 Anthony Rossini * ess-vars.el (ess-eval-map): new variable. use it. Wed Sep 3 12:54:46 1997 Anthony Rossini * ess-trns.el: removed log section. Wed Sep 3 12:30:57 1997 Anthony Rossini * ess-mode.el (ess-find-dump-file-other-window): changed error to message, so that dumping non-existant R objects would work. Wed Sep 3 12:29:45 1997 Anthony Rossini * ess-help.el (ess-submit-bug-report): fixed to use ess-bugs, and to include *ESS* buffer contents. Wed Sep 3 12:27:35 1997 Anthony Rossini * essd-s4.el: rolled in John Chamber's s4-modeadds.el Wed Sep 3 11:48:24 1997 Anthony Rossini * essd-s4.el (S4-customize-alist): added inferior-ess-search-list-command from the ess-xtras. Wed Sep 3 11:11:37 1997 Anthony Rossini * ess-site.el ((assoc "\\.q" auto-mode-alist)): removed '$'. (RMH). Wed Sep 3 10:42:13 1997 Anthony Rossini * ess.texi : applied Martin's updates. Wed Sep 3 10:37:39 1997 Anthony Rossini * Makefile: applied Martin's patch, ESS -> ess, for texinfo stuff. Tue Sep 2 16:36:59 1997 Anthony Rossini * essd-*.el (ess-dump-filename-template): use it, with ess-suffix. Tue Sep 2 16:19:41 1997 Anthony Rossini * ess-vars.el (ess-delete-dump-files): changed default value to nil. Better safe than sorry. Tue Sep 2 16:05:04 1997 Anthony Rossini * essd-*.el (*-customize-alist): ess-suffix. Use it. Tue Sep 2 15:44:02 1997 Anthony Rossini * essl-s.el: moved "general" variables from essd-s?.el, essd-r.el. There, should only be modifications to the standard S customizations. Avoids conflict with not loading certain customization variables. Tue Sep 2 13:23:01 1997 Anthony Rossini * Makefile (LASTVERSION): version set to 12. Tue Sep 2 10:22:11 1997 Anthony Rossini * ess-vars.el (ess-version): Version 11 released; set to 12. Mon Sep 1 17:16:42 1997 Anthony Rossini * essd-r.el (R-mode): setq-default the customize alist. Mon Sep 1 16:59:57 1997 Anthony Rossini * essd-s+3.el (S+3-mode): need to set ess-customize-alist. Mon Sep 1 16:15:10 1997 Anthony Rossini * ess-vars.el (ess-mode-font-lock-keywords): redid the assign fontlocking. Mon Sep 1 15:53:54 1997 Anthony Rossini * ess-vars.el (ess-mode-editing-alist): renamed. Use it. Mon Sep 1 15:48:43 1997 Anthony Rossini * ess-inf.el (inferior-ess): corrected doc string. Mon Sep 1 14:54:44 1997 Anthony Rossini * essl-sas.el: added sas config variables here. Mon Sep 1 14:21:08 1997 Anthony Rossini * essd-sas.el (SAS): works. Mon Sep 1 14:20:45 1997 Anthony Rossini * essd-sas.el (SAS-mode): fixed and "modernized". Mon Sep 1 14:16:16 1997 Anthony Rossini * ess.el (SAS-transcript-mode): load it. Mon Sep 1 14:16:07 1997 Anthony Rossini * ess.el (SAS-mode): load it. Mon Sep 1 14:12:33 1997 Anthony Rossini * ess-site.el (auto-mode-alist): XLS is recognized. SAS is recognized. Fri Aug 29 13:41:22 1997 Anthony Rossini * ess-inf.el (inferior-ess-make-comint): use inferior-ess-start-file, inferior-ess-start-args. Fri Aug 29 13:24:12 1997 Anthony Rossini * essd-sas.el (inferior-SAS-args): new variable. Use it. Fri Aug 29 13:11:56 1997 Anthony Rossini * ess-vars.el (ess-dribble-buffer): now defaults to *ESS*. (RMH/MM). Fri Aug 29 13:09:04 1997 Anthony Rossini * essd-sas.el (SAS-customize-alist): fixed primary prompt (RMH). Thu Aug 28 10:21:41 1997 Anthony Rossini * ess-mode.el (ess-check-modifications): reformat. Thu Aug 28 09:03:53 1997 Anthony Rossini * ess.el: moved ess-site autoloads here. Thu Aug 28 09:02:57 1997 Anthony Rossini * ess-help.el (ess-find-help-file): autoloaded ess-get-object-list at the beginning of ess-help; byte-compiler error. Wed Aug 27 14:33:56 1997 Anthony Rossini * ess-mode.el (ess-mode): needed to set buffer local variables AFTER they are killed. Whoops. Wed Aug 27 14:27:44 1997 Anthony Rossini * ess-mode.el (ess-mode): type changed to dialect. Wed Aug 27 11:55:07 1997 Anthony Rossini * ess-inf.el (ess-proc-name): changed the process name to be returned. Now is the form: ess-dialect : ess-process-number. Tue Aug 26 18:49:31 1997 Anthony Rossini * ess-version-running -> ess-dialect Tue Aug 26 18:49:18 1997 Anthony Rossini * ess-proc-prefix -> ess-language Tue Aug 26 17:58:11 1997 Anthony Rossini * ess-site.el: added SAS site init (from Cook's mode) (TC) Tue Aug 26 17:50:57 1997 Anthony Rossini * essl-sas.el: new file. SAS language editing mode (Cook's mode). Use it. (TC) Tue Aug 26 17:48:47 1997 Anthony Rossini * essl-s.el : new file. S language editing mode. Use it. S specific stuff from ess-mode. Mon Aug 25 16:53:10 1997 Anthony Rossini * ess-help.el (ess-find-help-file): added hack to complete non-S stuff. (KH) Mon Aug 25 16:42:46 1997 Anthony Rossini * essd-r.el (R-customize-alist): made the name quoted. Mon Aug 18 15:27:41 1997 Maechler * essd-r.el (R-customize-alist): sorted * essd-s4.el: * essd-s3.el (S3-customize-alist): not Splus; no 'Optional/Required Arg' * essd-s+3.el (S+3-customize-alist): switched some lower/upper case: more important things on lower case; now compatible to R Mon Aug 25 16:35:29 1997 Anthony Rossini * ess-site.el auto-mode-alist: Use \\' instead of $ [faster (?)], standard; Add ...src/library/[A-z]*/funs/.. for R source editing. (MM). Mon Aug 25 11:02:37 1997 Anthony Rossini * ess-site.el (inferior-ess-font-lock-input): added setq of this variable as a customization example (RMH). Mon Aug 25 10:35:09 1997 Anthony Rossini * ess-comp.el: removed (require 'cl). This is semi-evil, if we can only avoid it. Fri Aug 22 17:01:56 1997 Anthony Rossini * ess-vars.el (inferior-ess-font-lock-prompt-p): New variable. Need to use it. Customize in ess-site. Fri Aug 22 16:56:35 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): mode name is now "iESS", as per discussion. Fri Aug 22 16:54:19 1997 Anthony Rossini * ess-vars.el (ess-object-name-db-file-loaded): use it to determine which languages/versions have been loaded. Fri Aug 22 16:48:55 1997 Anthony Rossini * essd-r.el (R-customize-alist): added ess-object-name-db to alist. Fri Aug 22 16:47:57 1997 Anthony Rossini * essd-s+3.el (S+3-customize-alist): added ess-object-name-db to alist. Fri Aug 22 16:41:49 1997 Anthony Rossini * essd-xls.el (XLS-customize-alist): added ess-object-name-db to alist. Fri Aug 22 16:40:31 1997 Anthony Rossini * essd-xls.el (XLS-mode): moved from ess-mode.el Fri Aug 22 15:58:54 1997 Anthony Rossini * essd-s+3.el (S-mode): moved from ess-mode.el Fri Aug 22 15:58:07 1997 Anthony Rossini * essd-r.el (R-mode): moved from ess-mode.el Fri Aug 22 15:50:25 1997 Anthony Rossini * essd-s+3.el: removed commented out font-lock patterns. (RMH) Fri Aug 22 15:49:56 1997 Anthony Rossini * essd-s3.el: removed commented out font-lock patterns. (RMH) Fri Aug 22 15:48:59 1997 Anthony Rossini * ess-vars.el (essd-S-inferior-font-lock-keywords): added RMH's error patterns. Fri Aug 22 12:28:42 1997 Anthony Rossini * essd-sas.el: new file (RMH). Fri Aug 22 12:18:30 1997 Anthony Rossini * ess-vars.el (ess-function-pattern): New pattern, thanks to Stephen C. Pope . Fri Aug 22 11:59:32 1997 Anthony Rossini * Makefile (ESS.info): fixed text output (KH) Fri Aug 22 11:59:13 1997 Anthony Rossini * Makefile (html/ESS_toc.html): fixed text output (KH) Fri Aug 22 11:55:33 1997 Anthony Rossini * ess-vars.el (inferior-ess-save-lastvalue-command): new defvar for variable. (KH) Fri Aug 22 11:55:07 1997 Anthony Rossini * ess-vars.el (inferior-ess-retr-lastvalue-command): new defvar for variable. (KH) Fri Aug 22 11:54:27 1997 Anthony Rossini * ess-vars.el (S-plus): removed variable Fri Aug 22 11:51:22 1997 Anthony Rossini * essd-xls.el (XLS-customize-alist): inferior-ess-start-file ("~/.ess-R"). inferior-ess-start-args. Use it. Fri Aug 22 11:43:49 1997 Anthony Rossini * essd-s+3.el (S+3-customize-alist): inferior-ess-start-file ("~/.ess-R"). inferior-ess-start-args. Use it. Fri Aug 22 11:42:34 1997 Anthony Rossini * essd-r.el (R-customize-alist): inferior-ess-start-file ("~/.ess-R"). inferior-ess-start-args. Use it. Fri Aug 22 11:06:34 1997 Anthony Rossini * ess.texi: renamed, from ESS.texi. Changed header. Added info-directory stuff (KH). Fri Aug 22 11:04:02 1997 Anthony Rossini * ess.el: installed new, non CL versions of ess-setq-vars, ess-setq-vars-default. (KH) Fri Aug 22 10:58:05 1997 Anthony Rossini * ess-xtra.el: ESS-version -> ess-version (KH) Fri Aug 22 10:57:13 1997 Anthony Rossini * ess-vars.el (ess-version): incremented. ESS-version -> ess-version. (AJR) Fri Aug 22 10:56:11 1997 Anthony Rossini * ess-inf.el (inferior-ess-mode): ESS-version -> ess-version (KH) Fri Aug 22 10:56:11 1997 Anthony Rossini * STARTED : ESS-4.9-b11. All DOCUMENTATION NOW IN `ChangeLog'. Tue Jul 29 07:14:01 1997 Anthony Rossini * ess-vars.el: transcript fontlock vars now here. Mon Jul 28 09:57:57 1997 Anthony Rossini * ess-site.el: explanatory comments for dialect customization. Mon Jul 28 09:55:58 1997 Anthony Rossini * ess-vars.el: added defvars for ess-site things below. Still need to add to essd-*.el's! * ess-site.el: more customizations for the executable names. Need to move defvars to ess-vars. * README: edited authors again. * Makefile: S-mode -> ESS. * Makefile: updated version number. * ess-site.el: moved/uncommented essd-s?.el * essd-s3.el: provide the right package! * Makefile: S-mode -> ESS. * ess-site.el: reformat. * ess-site.el: fixed typo. * ess.el: made ess-setq-vars* clean. No ugly hacks! cleaned up authorship. * Makefile: updated version number. * ess.el (ess-setq-vars-default): made nice. * ess.el (ess-setq-vars): made nice. 1997-07-25 Anthony Rossini * ess-mode.el (ess-mode-map): newline/return mapped to 'newline-and-indent, by popular demand. * General : variable definitions in ess now moved to ess-vars. ess now only contains useful code for distinguishing between processes. 1997-07-01 Anthony Rossini * ess-inf.el (inferior-ess): removed make-local-variables which should've been handled in ess.el (ess-multi): same as above. (ess.el): fixed same. (ess-execute): removed make-local-variable 'ess-local-process-name (ess-force-buffer-current): removed make-local-variable 'ess-local-process-name (inferior-ess): let (done 0), for constructing inferior-ess-procname. * ess-site.el: added RMH's new docs, `ess-keep-dump-files'. * ess-inf.el (ess-quit): doc string edited. * ess-mode.el (ess-check-source): RMH's solution. 1997-06-16 Anthony Rossini * Makefile: trans->trns. Idea is to keep file names at the 8+3 length for archaic OSs... Sun Jun 15 04:39:09 1997 Anthony Rossini * NOTE: SEE RCS Log files for program updates. All language/dialect specific code attempted to be moved to essd files (d=dialect :-).. need more movement, though... * ess.el: Documentation update. Wed May 21 14:47:17 1997 Anthony Rossini * S-mode has now become ess-mode. (Emacs Speaks Statistics). Thu Apr 24 18:10:32 1997 Anthony Rossini * TODO: (MM) word wrap mistake. * S-help.el (S-help-mode-map): (MM) Patch to bind ^M to next-line. Whoops. (AJR) changed to \C-m. Wed Apr 23 09:29:53 1997 Anthony Rossini * S.el (S-mode-version): incremented. * S-help.el (S-display-help-on-object): (MM) S-help-sec-regex, S-help-sec-keys-alist take correct values (see yesterday's log for inferior-S-help-command). Need to do similar with inferior-S-help-command hack! * S.el : (MM) S-help-sec-regex, S-help-sec-keys-alist buffer-local. Tue Apr 22 19:19:47 1997 Anthony Rossini * S-mode-4.9-b5 : released. * S-help.el (S-display-help-on-object): Added curr-help-command (since inferior-S-help-command is buffer-local, need to get BEFORE switching buffers). * S-site.el (S,R,XLS): setq-default to setq. (R): "cat" -> inferior-S-pager. Buffer local? (XLS): cleaned up. (S-XLS-shortcut-post-run-hook): new function. (S-XLS-shortcut-pre-run-hook): new function. (R): cleaned up. (S-R-shortcut-post-run-hook): new function. (S-R-shortcut-pre-run-hook): new function. (S): cleaned up. (S-S-shortcut-post-run-hook): new function. (S-S-shortcut-pre-run-hook): new function. * S-inf.el (inferior-S): removed useless make-local-variables * S.el : declared many variables via make-variable-buffer-local. * S-site.el : removed useless make-local-variables... * S-inf.el (S-multi): setq -> setq-default, for inferior-S-prompt. * buffer-local stuff moved to S.el. Mon Apr 21 21:35:22 1997 Anthony Rossini * S-mode-4.9-b4 : released. * S-site.el (XLS): wrong help; syntax confusion :-). * S-inf.el (inferior-S): moved the setting of the history file. * S.el: inferior-S-program should be global? Sun Apr 20 12:30:36 1997 Anthony Rossini * S-inf.el: moved S-force-buffer-current here, from S-mode. * S.el: (S-version-running): buffer-local. (inferior-S-program): buffer-local. (inferior-S-secondary-prompt): buffer-local. (inferior-S-primary-prompt): buffer-local. * S-site.el (S-transcript-mode): change autoload to point at S-trans. Fri Apr 18 12:01:59 1997 Anthony Rossini * S-site.el: removed stupid comments, rearranged autoloads sensibly. * S-inf.el: Moved `eval-*' commands here from S-mode. Edited autoloads appropriately (must be a better way to deal with the bytecompiler and file/function synchronization!) * S-mode.el: Moved `eval-*' commands to S-inf. Thu Apr 17 12:58:34 1997 Anthony Rossini * S.el (S-mode-font-lock-keywords): changed ("<-" . font-lock-reference-face) to ("< * S-trans.el: removed byte-compiler errors. * S-mode.el (S-indent-exp): commented out, in "let", restart and last-sexp. * S-inf.el (S-eval-visibly): See: "Terrible Kludge". This code needs to be "done right (tm)". Last byte-compile problem... :-(. (S-get-process-variable): removed let (not needed?) (S-set-process-variable): removed let (not needed?) * S.el: run-hooks 'S-mode-load-hook before provide 'S. (S-mode-version): update the version. * S-help.el: added autoloads for bytecompile (need to find a cleaner way). Tue Apr 8 06:32:20 1997 Anthony Rossini * S-mode-4.9-b3 RELEASED. * S-site.el (R): use the previously defined variable. (S): use the previously defined variable. (XLS): use the previously defined variable. * S.el (inferior-S-program): changed definition. (inferior-S-program-name): new. (inferior-R-program-name): new. (inferior-XLS-program-name): new. (inferior-S4-program-name): new. * General: put back GNU. But need to check this! * General: removed "FSF GNU" from all files. It's not kosher. Mon Apr 7 07:52:49 1997 Anthony Rossini * S-inf.el (get-S-process): moved to prevent byte-compiler warnings. * S.el: moved user/sys vars from S-mode.el/S-inf/S-help (font-lock): added require. * S-help.el: moved user/sys vars to S.el. * S-site.el: removed (require 'font-lock). * S-mode.el: moved user/sys vars to S.el. * S-inf.el: moved requires and eval-when-compile requires. * S-site.el: moved XLS, R, S here from S-inf. Added local vars at end. Edited commented-out documentation. * S-inf.el: moved XLS, R, S to S-site (XLS, R, S): S0 -> inferior-S (inferior-S): Renamed from S0. * S.el: Documentation cleaned, modified. Old news moved to NEWS files. (S-mode-version): variable updated (wasn't, before. Whoops!) * S-mode-4.9-b2 RELEASED * S.el : removed autoloads (and duplicates) for the modes and inferior processes (which were and are in S-site). * S.el : Commentary: deferred installation instructions to README and S-site. Removed comint stuff, since present in 19.x emacsen. * S.el (S-local-process-name): variable, not a constant. * S-site.el: Added R-mode autoload. * README: query-rep'd "4.8" to "4.9". * S-mode.el (S-mode-map): S-parse-errors binding changed to C-c` Sun Apr 6 14:23:45 1997 Anthony Rossini * S-inf.el (inferior-S-make-comint): S-inf-pager -> inferior-S-pager. * S-site.el (XLS): added XLS autoload. * S-inf.el (inferior-S-make-comint): replaced with Kurt's version (I need to verify this). (inferior-S-pager): New variable. Fri Apr 4 10:38:26 1997 Anthony Rossini * S-mode-4.9-b1 RELEASED * S-site.el: added R as an autoload. * S-inf.el (inferior-S-mode): Added a switch (based on S-proc-prefix) for using inferior-S-input-sender or inferior-R-input-sender. * S-inf.el (inferior-R-input-sender): added (thanks to KH). * S-mode.el (S-eval-paragraph): added. (from S-extras). * S-extras.el: removed S-eval-paragraph * Makefile: More in line with GNU standards. Still WRONG, though. Thu Apr 3 14:38:09 1997 Anthony Rossini * S-help.el: Support for W3 viewing of R files is included. It works (but could be better). Removed until 5.0 :-). * S.el (S-proc-prefix): Moved before S-history-file definition, which now depends on it. * S-help.el (S-submit-bug-report): send to rossini@stat.sc.edu * S-inf.el (inferior-S-mode-map): C-x` should be C-c` (S-parse-errors). Major modes NEVER use C-x prefixes! (inferior-S-mode-map): C-c C-a masks a useful function in comint. Need to find a second prefix for "hotkeys". * S-inf.el (S-object-name-db-file): added variable. (S-create-object-name-db): Use S-object-name-db. * S-inf.el (inferior-S-mode): Changed comint-completion-addsuffix definition, and made buffer-local (thanks: Kurt Hornik). * All_files : S-filenames-map is final name. (-p for functions. Bozo...). * S-inf.el (inferior-S-font-lock-keywords): changed variable name from S-inf-font-lock-keywords. (inferior-S-mode): changed variable name to inferior-S-font-lock-keywords from S-inf-font-lock-keywords. * S-modeadds.el (S-mode-load-hook): changed name of S-inf-filenames-map to S-filenames-map-p * S-inf.el (S-dir-modtime): changed name of S-inf-filenames-map to S-filenames-map-p (S-object-names): changed name of S-inf-filenames-map to S-filenames-map-p * S-mode.el (S-check-modifications): changed name of S-inf-filenames-map to S-filenames-map-p * S-inf.el: removed S-inf-filenames-map defvar. * S.el: Moved S-inf-filenames-map defvar here, renamed as S-filenames-map-p. Wed Apr 2 09:38:47 1997 Anthony Rossini * TODO: updated ALL conversations and reasonings. * Makefile: removed extraneous commented-out parts. Changed Prefloads, default Emacs, compilation flags, and infodir location. * S-mode.el (S-dump-object): added indent-region (thanks: Peter Dalgaard, ). * S-mode.el : changed default for S-else-offset to 0 (thanks: Peter Dalgaard, ). Mon Mar 10 11:30:23 1997 Anthony Rossini * General : moved the rest of the easymenu startup code here * General : edited Makefile for easier XEmacs distribution * S-site.el : added example Splus call (thanks: Claudia Yastremiz ) Fri Mar 7 17:42:36 1997 Anthony Rossini * S-trans.el : For easymenu menus, moved code from S-menu here. * S-mode.el : For easymenu menus, moved code from S-menu here. * S-inf.el : For easymenu menus, moved code from S-menu here. * Added code from Kurt H. Mon Feb 10 11:14:42 1997 Anthony Rossini * S-help.el : added/checked some of Martin's older patches (most in the 4.8.6 series). * Makefile (patch): added $(GZCAT) (normally zcat, but sometimes it's gzcat, if sys admins are GNU-suspicious). * S-mode.el: XEmacs compatibility, maintaining Emacs compatibility. * S-inf.el: See above. * S-trans.el: See above. * S-menu.el: added easymenu support, XEmacs menu hooks. Mon Oct 14 16:24:14 1996 Local * S-inf.el: inferior-S-program -- only new if S <--> R Tue Jun 25 08:53:12 1996 Martin Maechler * S-inf.el: (defun R ...); renamed 'S to 'S0; S, R both call S0 after setting variables. * S.el: added autoloads for 'R and 'R-mode. defconst for S-help-S... and S-help-R used in S-inf. * S-site.el: same autoloads * S-help.el : S-help-sec-regex,etc: defconst for S- and R- versions moved to S.el, since used in S-inf * S-mode.el (R-mode): added S-force-buffer-current: optional 2nd arg. 'force' Mon Dec 4 1995 -- Wed May 29 1996 Martin Maechler * S.el: Fixed the syntax-table entry which broke 'beg.-of-function'. New variable S-proc-prefix (for using "R" and "S" simultaneously). * S-inf.el: S-synchronize-evals -> NIL (finally!). S-proc-name : Use new variable S-proc-prefix instead of hardwired "S"; the same for other places. S-execute-search: Use new variable inferior-S-search-list-command Switched binding of C-c C-k to S-force-buffer-current. Fixed LONG-STANDING bug in S-eval-region (when >= 2 S-processes) now using (get-S-process ...) instead of hardwired "S". * S-help.el: added S-eval-line-and-next-line to key bindings. Changed binding of request-a-process to C-c C-k as in other S-modes. New configurable variable S-help-sec-regex (for R help) * Makefile: texi, not texinfo; support for non-GNU tar; minor.. Mon Dec 4 1995 -- Wed May 29 1996 Martin Maechler * S.el: Fixed the syntax-table entry which broke 'beg.-of-function'. New variable S-proc-prefix (for using "R" and "S" simultaneously). * S-inf.el: S-synchronize-evals -> NIL (finally!). S-proc-name : Use new variable S-proc-prefix instead of hardwired "S"; the same for other places. S-execute-search: Use new variable inferior-S-search-list-command Switched binding of C-c C-k to S-force-buffer-current. Fixed LONG-STANDING bug in S-eval-region (when >= 2 S-processes) now using (get-S-process ...) instead of hardwired "S". * S-help.el: added S-eval-line-and-next-line to key bindings. Changed binding of request-a-process to C-c C-k as in other S-modes. New configurable variable S-help-sec-regex (for R help) * Makefile: texi, not texinfo; support for non-GNU tar; minor.. Wed Dec 13 17:27:53 1995 David M Smith * S-inf.el (S-search-list): Would return nil if S-search-list was nil and the search path had not changed (which could happen, apparently) Mon Dec 4 10:21:52 1995 David M Smith * S.el: New syntax table. * S-trans.el: New bindings. * S-mode.texi: Updates for 4.8 * S-mode.el: Autoload and bind S-list-object-completions. S-request-a-process moved to C-c C-k. S-force-buffer-current: new function * S-menu.el: Many updates. * S-inf.el: S-object-list: docstring update S-directory is now used as the default S directory. The current buffers default directory is used if it is nil. get-S-process: better error message. inferior-S-mode: Use comint-input-filter-functions instead of the deprecated comint-input-sentinel. Don't anchor paragraph regexps. S-list-object-completions: new function S-modtime-gt: bugfix S-complete-filename: don't use comint-last-inout-start * S-help.el: Make autoloads from S-inf.el. * Makefile: Deleted useless SCRATCH vbl. Use S-mode.texi, not S-mode.texinfo. Thu Nov 30 13:10:17 1995 David M Smith * Makefile: Version update Mon Nov 13 14:46:13 1995 David M Smith * S.el (S-mode-syntax-table): Made syntax table independent of c-mode-syntax-table * S-mode.el (S-check-modifications): Changed regexp to allow `w' and `_' class syntax in object names Wed Aug 23 16:37:10 1995 David M Smith * S-inf.el (S-complete-filename): Checked form the beginning of the *last* command to determine if we should complete a filename. History expansions work now. Mon Aug 21 15:35:29 1995 David M Smith * S-menu.el (S-transcript-mode-menu): New menu (S-inferior-S-mode-menu): Lotsa updates. * S-trans.el (S-transcript-copy-command): Renamed from S-transcript-copy-commmand (mmm). Also switches to the S process. (S-trans-font-lock-keywords): strings keep other highlighting Lots of autoloads for S-mode.el stuff * S-help.el: Autoloads for stuff in S-mode.el Tue Aug 8 11:06:43 1995 David M Smith * S-mode.el (S-dump-object-into-edit-buffer): Run a lambda S-source-directory in the process buffer (S-dump-object-into-edit-buffer): As for process if none attached * S-inf.el (S): Use default-directory only if S-directory is nil. * S.el (S-directory): Doc update * S-inf.el (S-modtime-gt): Fixed to give correct results (inferior-S-mode): Add S-search-path-tracker to comint-input-filter-functions, not comint-input-sentinel. Tue Aug 1 16:13:14 1995 David M Smith * S-inf.el (inferior-S-mode): Don't anchor paragraph-start and paragraph-separate with "^" (for 19.29). Tue Aug 1 14:44:32 1995 David M Smith * S-mode.el (S-eval-region): Make sure S-local-process-name is set. * S-inf.el (get-S-process): Better error message when no processes are running. * S-mode.el (S-eval-region): Make sure S-inf is loaded Thu Jul 27 16:43:01 1995 David M Smith * S-inf.el (S-list-object-completions): New function (inferior-S-mode-map): Bind it to M-? Tue Jul 25 16:07:10 1995 David Smith * Version 4.7 released. * Makefile (info): New target (install): Ignore errors in second cp in case LISPDIR==. (clean): Junk all the tex crap, too (VERSION): New variable (distrib): Use it (AUXFILES): Include ChangeLog (distrib): Make sure Makefile is writeable * S-inf.el (S-execute-screen-options): Added documentation. (S-multi): Use S-post-run-hook * S.el (S-keep-dump-files): Expanded documentation. (S-delete-dump-files): Expanded documentation. (S-post-run-hook): New variable. Mon Jul 24 11:58:22 1995 David M Smith * S.el: Default for S-keep-dump-files is 'check * S-mode.el (S-mode): Make S-keep-dump-files buffer-local. (S-load-file): Meaningful values of S-keep-dump-files are nil, check, ask and anything else. (S-dump-object): If S-keep-dump-files is 'check, don't ask for confirmation when loading. * S-mode.el (S-dump-object-into-edit-buffer): Bug-fix; you can now create the Src directory if it doesn't exist. * S-site.el (window-system): Only add turn-on-font-lock to mode hooks if window-system is non-nil. Also add to S-transcript-mode-hook. Thu Jul 20 12:21:43 1995 David M Smith * S-inf.el (S-inf-font-lock-keywords): Strings in input don't de-fontify anymore. Wed Jun 28 12:15:57 1995 David M Smith * S-mode.texinfo: Updated e-mail addresses, and used @@ instead of @. * S-mode.el (S-mode): Use S-mode-font-lock-keywords, not S-inf-font-lock-keywords Mon Jun 26 12:14:10 1995 David M Smith * Version 4.6 released * TODO, S-mode.texinfo, NEWS, Makefile: Update for 4.6 Mon Jun 26 12:09:55 1995 David M Smith * S-trans.el: Font-lock support. * README: Update for 4.6 * S.el: Version update: 4.6 S-local-process-name added. * S-site.el: Deleted hilit19 patterns (font-lock patterns are now in the individual source files). S-site should now be much more lightweight to load. Used add-to-list for the load-path. .s for S-mode files in auto-mode-alist by default. * S-mode.el: Font-lock support. Fri Jun 23 13:56:54 1995 David M Smith * S-inf.el: Doesn't call comint-output-filter-functions in S-eval-visibly any more (and so works in 19.29). Font-lock support. Bound M-RET to S-transcript-send-command-and-move. Wed Oct 26 12:37:15 1994 David M Smith * S-mode.el (S-check-modifications): Fixed a bug which occurred when the object name could not be found. Tue Oct 25 16:28:54 1994 David M Smith * S-inf.el: Moved S-local-process name to S.el. (S-eval-visibly): Bugfix involving comint-last-output-end Wed Jun 1 11:03:34 1994 David M. Smith (maa036@mathssun5) * Version 4.5 released. * Makefile: Update to distrib target * Makefile: Bugfix with info install * README: Update for 4.5 * NEWS: *** empty log message *** Wed Jun 1 10:29:30 1994 David M. Smith (maa036@mathssun5) * S-menu.el: Bugfix Mon May 30 16:34:53 1994 David M. Smith (maa036@mathssun5) * S-site.el: Major revision. * README: More detail in INSTALL section. * TODO: Initial revision * S.el: Version number update: 4.5 * Makefile: Bugfix in SOURCES * Makefile: added S-mode.texinfo to AUXFILES * Makefile, NEWS, README: Initial revision Fri May 27 17:18:50 1994 David M. Smith (maa036@mathssun5) * S-mode.el, S-trans.el: Binding changes * S-help.el: Binding change * S.el: Define S-help as an alias for S-display-help-on-object. * S-inf.el: S-view-at-bottom: deleted function and keybinding Changed bindings of S-display-help-on-object and S-execute. * S-menu.el: Many modifications to S-inferior-S-mode-menu, including incorporation of the old hotkey menu. * S.el: Autoload for S-load-file. * S-help.el: S-submit-bug-report: new function * S.el: Added autoloads for S-dump-object-into-edit-buffer and S-parse-errors. * S.el: Added an autoload for S-submit-bug-report * S-mode.el: Added a provide call. Can't imagine why it wasn't there before. * S-mode.texinfo: Initial revision Fri May 13 09:57:00 1994 David M. Smith (maa036@mathssun5) * S.el: Version number update: 4.4 * S-inf.el: bugfix * S-inf.el: S-compiled-dir: new function S-object-names: support it * S-inf.el: Support for S-object-name-db. S-object-names: modified S-get-words-from-vector: new function S-create-object-name-db: new command Wed May 11 14:18:27 1994 David M. Smith (maa036@mathssun5) * S-trans.el: Defined S-transcript-send-command-and-move * S-menu.el: Dunno. Fri Apr 29 14:30:55 1994 David M. Smith (maa036@mathssun5) * S-mode.el: S-continued-statement-p: minor bugfix. Removed the (bolp) test; I don't know why it was there but it caused top-level statements to be indented. S-insert-local-variables: removed (obsolete) * S-mode.el: S-dump-object-into-edit-buffer: rewrite. Implemented S-delete-dump-files. S-dump-object: new function S-find-dump-file-other-window: new function * S.el: New option S-delete-dump-files * S.el: Version number change (4.3) Thu Apr 28 12:58:41 1994 David M. Smith (maa036@mathssun5) * S-mode.el: Definition and implementation of S-mode-silently-save. Fri Apr 22 14:40:56 1994 David M. Smith (maa036@mathssun5) * splitup2/S-inf.el (S-get-directory): Cause an error if an invalid directory is specified. Wed Mar 16 14:19:31 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-inf.el (inferior-S-primary-prompt): prompts are optionally followed by one space. (S-complete-object-name): No longer runs indent-for-tab-command (S-after-pathname-p): deleted (S-complete-filename): New function (inferior-S-mode): Better completion support, thanks to the new comint. Wed Feb 23 15:50:28 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-inf.el (S-search-list): Bugfix where relative pathnames in search list were expanded in wrong directory Fri Feb 18 19:27:10 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-mode.el (S-check-modifications): Don't cause an error if the source file has been deleted. Tue Feb 15 12:11:42 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-inf.el (S-temp-buffer-p): Deleted. There is no longer any dependence on this variable: S-local-process-name suffices. (S-local-variables-string): Deleted. File extensions should be good enough for setting the mode. (S-cleanup): Simplified. Doesn't delete files. * splitup2/S-help.el (S-help-mode): Make S-local-process-name local. * splitup2/S-mode.el (S-mode): make S-local-process-name permanent-local. (S-insert-function-templates): deleted, S-function-template has this functionality now. (S-function-template): May be nil or a string. Point is placed after first open. (S-dump-object-into-edit-buffer): If S-keep-dump-files is nil, don't delete files, but don't make backups either. Mon Feb 14 14:53:17 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-mode.el (S-check-modifications): New function (S-load-file): Rewrite. Only ask for a filename if the current buffer is not in S-mode. Always offer to save. * splitup2/S-inf.el (S-inf-filenames-map): New variable (S-object-names): Use it (S-extract-onames-from-alist): Supply directory name (S-get-modtime-list): Supply directory name for quicker completions (S-object-modtime): New function (S-modtime-gt): New function Fri Feb 11 14:49:29 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-mode.el (S-mode): Set parse-sexp-ignore-comments to t; there are no longer any limitations with this in elisp. Wed Feb 9 13:25:12 1994 David M. Smith (maa036@mathssun5.lancs.ac.uk) * splitup2/S-trans.el (S-transcript-send-command-and-move): New function (S-transcript-send-command): Doesn't move any more. * splitup2/S-inf.el (S-eval-visibly): Call comint-output-filter-functions Wed Jan 26 11:15:46 1994 David Smith (maa507@mathssun5.lancs.ac.uk) * S.el (S-search-list): Caches result in S-search-list (S-execute-objects): Use it (S-search-list ): Now just a cache. Don't access directly Completions are now calculated on demand; as a result the first completion in a session will take a long time. The results are cached, however, so remaining completions should be fast. Sun Jan 23 17:56:46 1994 David Smith (maa507@mathssun5.lancs.ac.uk) * S.el (S): If S-ask-for-S-directory is unset, set default-directory to S-directory. Wed Jan 19 16:16:10 1994 David Smith (maa507@mathssun5.lancs.ac.uk) * S-site.el: Added (cond (window-system ...)) calls so that all users (even those without window systems) can safely require this file. Thu Jan 6 15:15:53 1994 David Smith (dsmith@spam.maths.adelaide.edu.au) Version 4.1alpha released to wingra * S.el: deleted S-set-display and associated variables. Fri Dec 24 11:56:00 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-command): Rewrite. Now uses a new filter to redirect output to the buffer; comint never sees the output. This filter could feasibly be accomodated to detect the prompt itself; allowing for an "in the background" implementation of S-command. (S-process-sentinel): Reports date; useful if you have run many S sessions in one transcript file. Thu Dec 16 12:47:38 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-multi): Ask for transcript file, maybe (S-ask-about-transfile): new variable (S-get-directory): replaces S-set-directory Wed Dec 15 12:10:11 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-loop-timeout): Increased Mon Dec 13 10:11:25 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-command): Avoids calling comint-output-filter-functions until the last minute. (S-complete-object-name): Complete rewrite of completion routines. Completion should now be accurate in every situation: the only way to make it wrong is to use assign() to assign into a dataframe not at position 1. Uses objects() to make listings, so you don't get .Data, .Help etc. Should now be able to make this work for DOS users. (S-object-list): New buffer-local vbl; cache of completions Thu Dec 9 12:08:09 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-process-sentinel): Can now see message after q() Tue Nov 16 09:25:41 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-mode): kill-all-local-variables (S-insert-local-variables): Use ### instead of # in local variables section. Mon Nov 15 10:31:02 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (inferior-S-mode): Changed comint-after-partial-pathname-command to comint-after-partial-filename-command (new comint) Sun Nov 14 17:18:55 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el: Version 4.00alpha. Made available for FTP, and announced on the S-mode mailing list Fri Nov 12 12:36:06 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-transcript-mode): Created. (S-execute-screen-options): Added. Thu Nov 11 12:30:06 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-find-help-file): More intuitive defaults when requesting help generated by S-read-helpobj-name-default. (S-eval-visibly): Doesn't wait for prompt after the last line of text has been sent. (inferior-S-send-input): Big improvement in the handling of multi-line inputs. Users should use LFD (not RET) to continue incomplete commands. Should automate this. Thu Oct 7 14:45:00 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (inferior-S-mode): Few mods to make it work with the new comint. Mon Sep 27 11:21:56 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (inferior-S-get-old-input): Now separates multi-line commands by newlines instead of spaces. This produces messier output, but avoids S's 255 char line limit for commands. Sun Sep 26 17:38:59 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-kill-buffer-function): Added to kill-buffer-hook in the process buffer. Fri Sep 17 11:23:36 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-display-temp-buffer): Uses temp-buffer-show-function instead of popper. (inferior-S-mode): Fixed a typo of paragraph-separate appearing as paragraph-start. Wed Sep 15 11:47:51 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el: Converted old E18 variables (buffer-flush-undo, comment-indent-hook) to E19 versions. Removed the require for comint-extra -- now contained in the new comint.el. Removed autoload for comint-isearch -- that's the user's decision. (inferior-S-prompt): Now generated from inferior-S-primary-prompt and (new variable) inferior-S-secondary-prompt Tue Sep 14 09:33:03 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-multi): Makes use of Simon Marshall's new comint.el. New variable S-history-file for saving histories. Calls comint-read-input-ring. Sets the sentinel. (S-process-sentinel): Created. Automatically saves the history ring if the S process dies. Sun Sep 12 18:53:40 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el: (S-multi). Now always switches to the buffer associated with process N, if available. (inferior-S-make-comint): New calling procedure; bufname is the literal buffer name (no *'s are added); procname is the process name to use. Tue Sep 7 16:20:11 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (inferior-S-mode-map): Unbound comint-[mp]search input, and comint-isearch, as I haven't tested them yet. (inferior-S-mode): replaced input-ring-size with comint-input-ring-size (Vivek Khera ). * comint-extra.el: Added comint-msearch* and comint-psearch*, commented out in the E19 distribution of comint.el * comint-isearch.el: Back in the distribution Fri Sep 3 16:20:28 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (S-mode): Replaced the documentation string, and removed the code which set it explicitly. Doing this was breaking the byte compiler. Version 3.63 Wed Aug 25 17:36:57 1993 David Smith (dsmith@spam.maths.adelaide.edu.au) * S.el (inferior-S-send-input): Added a hook: S-send-input-hook, so that I could do nice things with highlighting. This will probably disappear or change. Sat Aug 14 14:48:11 1993 David Smith (dsmith@spam) * S.el (S-extract-onames-from-alist): Modified so that S-complete-object-name will work in the minibuffer (e.g. through command S-execute.) * S.el: Restructured the entire S.el file into meaningful sections. The file now uses Outline mode. * S.el: Tek mode is no longer supported. Moved all Tek-related variables and functions to S-tek.el, and commented out any code references to them. * S-tek.el: This file is no longer supported. Moved all Tek-related functions and variables in S.el to the end of this file. Wed Aug 4 16:35:24 1993 David Smith (dsmith@spam) * S.el (S-complete-object-name): Fixed regexp so that completion over lists works properly. Thu Jul 22 12:25:46 1993 David Smith (maa507@mathssun4) * S.el: Uses s-menu instead of s-simple-menus. * s-menu.el: Totally rehacked from s-simple-menus.el to use easymenu.el, to take advantage of Emacs 19 menus. * S.el: Rehacked the multiple process code so that local variables are used to store process-specific variables. I really don't know why I didn't do this in the first place. As a result multiple processes actually seem to work, now. (S-request-a-process): Now enters initial input Sun Jul 18 12:15:27 1993 David Smith (maa507@mathssun4) * S.el: Created this change log file, and moved the change log from S.el here. The following is from the original Changelog section of S.el Release 2.1 on October 14, 1991 to statlib@stat.cmu.edu, and to the elisp archives at OSU (brennan@dg-rtp.dg.com (Dave Brennan)) and announced on internet.s-news, netnews.gnu.emacs.sources, & andrew.programs.S ------------------------------------------------------- Jul 26 1991 Frank Ritter * added S-mode-load-hook & S-pre-run-hook and testing by neilc@research.att.com Jul 9 1991 Frank Ritter * Changed S-command to use a register rather than the kill ring. * Better file header, comments now at 60 col so mailers wont' eat them. * Better S-extract-word-name. * Added S-mode-version variable * Changed syntax table to read |#; appropriately Wed Nov 28 11:03:50 1990 Ed Kademan (kademan at hermes) * Make the S-mode-syntax-table a slightly modified version of the c-mode-syntax-table instead of a version of the one for lisp. Sat Nov 10 12:41:52 1990 Ed Kademan (kademan at hermes) * Made run-S and run-s commands synonymous with the function S. Fri Oct 19 12:41:52 1990 Ed Kademan (kademan at hermes) * Made S-directory a user modifiable variable. S will run from that directory. Thu Oct 18 12:41:52 1990 Ed Kademan (kademan at hermes) * Added function S-nuke-help-bs to clean up nroff style text in the S help buffer. This function is a modification of nuke-nroff-bs from man.el. ------------------------------------------------------- Unnumbered version released dated Thu Jun 14 09:56:56 CDT 1990 Fri Jan 17 1992 Dave Smith (dsmith@stats.adelaide.edu.au) * Help mode for reading files. When asking for an object to run help on, completion is over those help files that exist. * Added object name completion, and made S-get-object-list efficient enough to make it worthwile. * Error parsing for loaded files * Better customization of file-names, with sensible defaults * Sensible buffer names for object buffers * Corrected definition for `.' in syntax table * Improved (and simplified) S-read-object-name-default * Included pager='cat' to default help-command specification * Added a call to run-hook for S-pre-run-hook * Changed keymaps to conform with GNU guidelines (i.e. no \C-letter bindings) * S-command has a new third argument, visible Tue May 27 1992 Dave Smith (dsmith@stats.adelaide.edu.au) * now copes with dynamically changing prompts (reported by Doug Bates) Thu May 29 1992 Dave Smith (dsmith@stats.adelaide.edu.au) * Added S-execute, modified S-execute-* to use it. Mon Jun 22 1992 dsmith * Added S-mode editing commands written by Ken'ichi Shibayama (shiba@isac.co.jp). A big win. * Removed the redundant argument to S-switch-to-end-of-S * S-function-pattern improved * added S-eval-visibly, S-eval-visibly-p and modified S-eval-* to use them * added S-eval-line-and-next-line * eval commands can now echo in the process buffer * added S-kill-output and S-view-at-bottom * added a binding for comint-isearch and autoloaded it * added S-execute-in-tb. S-parse-errors now takes prefix arg. Thu Jun 25 1992 dsmith * Moved some doctrings to comments (Frank Ritter) * The Tek stuff now lives in a separate file (Frank Ritter) * Fiddly C-c ESC M-. bindings in S mode and Help mode moved to C-c M-. bindings (Martin Maechler) * S-execute-objects now uses variable inferior-S-objects-command whose value depends on S version. (Ken'ichi Shibayama) * Symbols given uniform prefixes: S- or inferior-S- (Frank Ritter) -- Version 3.41 released to Statlib and Emacs Archive -- Tue Jul 7 11:56:59 CST 1992 dsmith * S-execute-attach now updates the internal search list. This is a manifestation of a general bug: S-command doesn't call S-search-path-tracker Wed Jul 29 09:38:54 CST 1992 kenichi * Several fixes to indenting code. New variable S-else-offset. Indentation of code not within braces. expression() indentation. Correct handling of in-line comments. Fri Aug 7 10:52:06 CST 1992 dsmith * S-execute now uses S-mode-minibuffer-map. * Setting indentation variables in .emacs now has some effect. * Files retrieved by S-dump-object-into-scratch are now automatically placed in S-mode. Fri Jul 28 1992 R.D.Ball added multi-S to allow multiple S sessions run by ESC-x S or with numeric prefix arg e.g. ESC-2 ESC-x S The current S process is determined by S-process-name, this is modified by typing a return into a non-current S process buffer. Variables S-process-name-list, S-current-process-name and functions update-S-process-name-list, get-S-process to replace (get-process "*S*"), and checks for existence of process, buffer in inferior-S-mode made function S-eval-line-and-next-line keep to the bottom of the S process buffer so user can see results when working interactiveley To do this an optional arg eob was added to S-eval-visibly To go to bottom of window it was necessary to use switch-to-buffer-other-window, but this only when eob is t. Additionally, if S-eval-visibly-at-end is t the functions S-eval-region etc. also display results at the end of the current process buffer. Default directory for starting S is now the current directory for the current buffer. (Set S-use-current-directory to nil to avoid this). Sat Sep 19 18:35:10 CST 1992 dmsith * Modified Rod's multi-S code so that it works properly. S-process-name-list is now an alist whose CARs are the process names and whose CDRs is an alist of variable . value pairs specific to particular processes (so e.g. completion works properly for each buffer.) The function S-get-process-specific-vbls does the work, and any process-specific variables should be mentioned here. S-mode buffers know which process they should evaluate into. * New command S-request-a-process which should be bound to a key. Wed Nov 4 dsmith * S-load-file now informs you if S gave a warning during load. Also, the S-errors buffer is displayed using popper, if available * C-x ` is now also bound in S-mode. * Installed Frank's menus Wed Nov 18 dsmith * Bound M-TAB and M-? to comint completion functions in inf-S-mode and S-mode * In the process buffer, a paragraph is a promwpt, a command and its output, to make the paragraph functions useful * Multiple S sessions in a process buffer are delimited by ^L, to make the page functions useful * In process buffer mode line, name of process is shown in [..] (in case buffer name is changed.) In edit buffers, the name if the process the buffer belongs to is shown in []'s Wed Nov 21 dsmith * Nuked S-make-function, since it is now obsolete * Added S-clean-region * M-TAB in S-mode now completes *files*, not objects. Object completion has moved to C-c TAB. * Bound k in the help buffer to 'kill-buffer. * Local variables are added to files accessed with C-c C-d, if needed. * Fixed incorrect use of 'save-buffer in several places. * Bound C-c C-p to 'S-request-a-process * Replaced S-beginning-of-function and S-end-of-function to DMS's versions, since Frank's don't work with the new function regexp. * New variable S-synchronize-evals (Martin Maechler) * Changed default of S-eval-visibly-p to t. Wed May 12 dmith * Change definition of S-dumped-missing-re to cope with 3.1 ess/LDA/0000775000175000017500000000000012423756516010337 5ustar eddeddess/LDA/ex1.nw0000664000175000017500000000134612423756516011406 0ustar eddedd\documentclass{article} \usepackage{noweb} \begin{document} For example, plotting 20 pairs of $N(0,1)$ random variates can be looked at via the two following chunks. <>= ;; -*- mode: xlispstat -*- (def test (normal-rand 20)) (def test2 (normal-rand 20)) (plot test test2) @ The below code demonstrates that there isn't much difference between Lisp and the S language (as implemented through the dialect, R). <>= ## -*- mode: R -*- test <- rnorm(20) test2 <- rnorm(20) plot(test,test2) @ Finally, we could show how to do this in Stata or SAS, as follows: <>= gen test = normal(20) gen test2 = normal(20) plot test,test2 @ \end{document} ess/LDA/README0000664000175000017500000000114512423756516011220 0ustar eddeddTest Literate Data Analysis is a concept that takes Literate Programming and implements it for data analysis. We envision it as a means to record for future use, the trials and tribulations of data analysis which are helpful for future statisticians, and to provide examples of expert analyses (including mistakes and the roads less and not taken). This directory contains work on a tech report for ESS and literate data analysis, as well as examples of literary styles and applications. Files: - ex1.nw : trivial example of the use of multiple code modes - ex2.nw : - lda-ess.tex (.pdf, .ps) : Tech Report ess/mkinstalldirs0000664000175000017500000000121112423756516012535 0ustar eddedd#!/bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Last modified: 1994-03-25 # Public domain errstatus=0 for file in ${1+"$@"} ; do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d in ${1+"$@"} ; do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || errstatus=$? fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here ess/.dir-locals.el0000664000175000017500000000062012423756516012366 0ustar eddedd;;; Directory Local Variables ;;; See Info node `(emacs) Directory Variables' for more information. ((emacs-lisp-mode ;; (coding . utf-8-unix) ;; emacs 24.3.5 gives "Coding cannot be specified by dir-locals" (indent-tabs-mode) (whitespace-style face tabs spaces trailing lines space-before-tab::space newline indentation::space empty space-after-tab::space space-mark tab-mark newline-mark))) ess/README.md0000664000175000017500000000045412521654611011211 0ustar eddedd[![MELPA Stable](http://stable.melpa.org/packages/ess-badge.svg)](http://stable.melpa.org/#/ess) [![MELPA](http://melpa.org/packages/ess-badge.svg)](http://melpa.org/#/ess) # ESS Git development branch of Emacs Speaks Statistics: ESS. For more info, see our web page at http://ess.r-project.org/ ess/COPYING0000664000175000017500000004273312423756516011003 0ustar eddedd GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy of the GNU General Public License is available at http://www.r-project.org/Licenses/ Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ess/RPM.spec.in0000664000175000017500000000753012423756516011663 0ustar eddedd# This is an RPM spec file that specifies how to package # ESS for Fedora Core Linux and, possibly, similar systems. %define name emacs-ess %define version @@VERSION@@ %define release 1.tgm Summary: Emacs Speaks Statistics add-on package for Emacs Name: %{name} Version: %{version} Release: %{release} Copyright: GPL Group: Applications/Editors Source: http://ESS.R-project.org/downloads/ess/ess-%{version}.tgz URL: http://ESS.R-project.org/ Packager: Detlef Steuer <.........de> BuildRoot: %{_tmppath}/%{name}-root Prefix: %{_prefix} BuildArchitectures: noarch BuildRequires: emacs Requires: emacs %description This package provides Emacs Speaks Statistics (ESS), which provides Emacs-based front ends for popular statistics packages. ESS provides an intelligent, consistent interface between the user and the software. ESS interfaces with S-PLUS, R, SAS, BUGS and other statistical analysis packages under the Unix, Microsoft Windows, and Apple Mac OS operating systems. ESS is a package for the GNU Emacs and XEmacs text editors whose features ESS uses to streamline the creation and use of statistical software. ESS knows the syntax and grammar of statistical analysis packages and provides consistent display and editing features based on that knowledge. ESS assists in interactive and batch execution of statements written in these statistical analysis languages. %prep %setup -n ess-%{version} ( cd doc && chmod u+w html info ) # fix perms to ensure builddir can be deleted %build make # create an init file that is loaded when a user starts up emacs to # tell emacs to autoload our package's Emacs code when needed cat > %{name}-init.el <<"EOF" ;;; Set up %{name} for Emacs. ;;; ;;; This file is automatically loaded by emacs's site-start.el ;;; when you start a new emacs session. (require 'ess-site) EOF # create a README.RPM file to document any quirks of this package cat > README.RPM < EOF %install %{__rm} -rf ${RPM_BUILD_ROOT} INITDIR=${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/site-start.d PKGLISP=${RPM_BUILD_ROOT}%{_datadir}/emacs/site-lisp/%{name}-%{version} INFODIR=${RPM_BUILD_ROOT}%{_infodir} %{__install} -D %{name}-init.el $INITDIR/%{name}-init.el %{__install} -d $PKGLISP %{__install} -d $INFODIR %{__make} install \ PREFIX=${RPM_BUILD_ROOT}%{_prefix} \ LISPDIR=$PKGLISP \ INFODIR=$INFODIR %{__rm} -f $INFODIR/dir # don't package but instead update in pre and post %{__cp} -a etc $PKGLISP # tuck ess's /etc into lisp dir for easy transport # Uncomment to print the README file after install. # # %post # echo # cat %{_defaultdocdir}/%{name}-%{version}/README.RPM # echo %clean %{__rm} -rf ${RPM_BUILD_ROOT} %files %defattr(-,root,root) %doc README README.RPM ANNOUNCE COPYING VERSION ChangeLog doc %dir %{_datadir}/emacs/site-lisp/%{name}-%{version} %{_datadir}/emacs/site-lisp/%{name}-%{version}/* %{_datadir}/emacs/site-lisp/site-start.d/* %{_infodir}/*.gz %post [ -f /usr/share/info/ess.info.gz ] && \ /sbin/install-info /usr/share/info/ess.info.gz /usr/share/info/dir || : %preun if [ $1 = 0 ]; then [ -f /usr/share/info/ess.info.gz ] && \ /sbin/install-info --delete /usr/share/info/ess.info.gz \ /usr/share/info/dir || : fi %changelog * Fri Oct 15 2004 Tom Moertel 5.2.3-1.tgm - Updated to ESS 5.2.3. * Fri Aug 27 2004 Tom Moertel 5.2.2-3.tgm - Updated ESS URL. - Fixed Summary. * Fri Aug 27 2004 Tom Moertel 5.2.2-2.tgm - Fixed bug: Forgot to include ESS's etc/ directory. * Thu Aug 26 2004 Tom Moertel 5.2.2-1.tgm - Initial build. ess/fontlock-test/0000775000175000017500000000000012423756516012533 5ustar eddeddess/fontlock-test/elem.sas0000664000175000017500000000025412423756516014166 0ustar eddedd/* comment */; data test; a=1; run; Title 'Baseball Hitters Data'; /* Formats to specify the coding of some of the variables */; /* Recode position to short list */ ess/fontlock-test/testing.sas0000664000175000017500000000172712423756516014727 0ustar eddedd/* */ /* * ; */ * bad(news) ; /* abort; array; */ data onelevel; data two.level; data onelevel(keep=pt rename=(pt=patient)); data two.level(keep=pt rename=(pt=patient)); attrib; by; cards; cards4; delete; dm; else do; else if something then something; do; do over; drop; drop=; end; endsas; error; file; filename; footnote; footnote1; footnote10; format; go to; goto; else if; if; if something then something; if something then something do; else; else do; informat; input; keep; keep=; label; length; libname; link; lostcard; options; goptions; output; put; rename; rename=(; retain; return; skip; stop; title; title1; title10; where shhh; where=(; id; tables; window; x; class; model; var; %include; %Include; select; Select; SELECT; select(; data; Data; data=; set; merge; modify; update; run; out=; proc any data=onelevel out=two.level; proc any data=onelevel(where=(something)) out=two.level(where=(something)); when(; else do; then do; do until(; do while(; %_episode(; ess/fontlock-test/baseball.sas0000664000175000017500000007242312423756516015020 0ustar eddedd/* The BASEBALL Data Set: Baseball Data */ /* The BASEBALL data set contains variables that measure batting and fielding performance for 322 regular and substitute hitters in the 1986 year, their career performance statistics, and their salary at the start of the 1987 season. NAME: hitter's name ATBAT: times at bat HITS: hits HOMER: home runs RUNS: runs RBI: runs batted in WALKS: walks YEARS: years in the major leagues ATBATC: career times at bat HITSC: career hits HOMERC: career home runs RUNSC: career runs scored RBIC: career runs batted in POSITION: player's position PUTOUTS: put outs ASSISTS: assists ERRORS: errors SALARY: annual salary, expressed in units of $1,000 BATAVG: batting average, calculated as 1,000*(HITS/ATBAT) BATAVGC: career batting average, calculated as 1,000*(HITSC/ATBATC) */ Title 'Baseball Hitters Data'; /* Formats to specify the coding of some of the variables */ proc format; value $league 'N' ='National' 'A' ='American'; value $team 'ATL'='Atlanta ' 'BAL'='Baltimore ' 'BOS'='Boston ' 'CAL'='California ' 'CHA'='Chicago A ' 'CHN'='Chicago N ' 'CIN'='Cincinnati ' 'CLE'='Cleveland ' 'DET'='Detroit ' 'HOU'='Houston ' 'KC '='Kansas City ' 'LA '='Los Angeles ' 'MIL'='Milwaukee ' 'MIN'='Minnesota ' 'MON'='Montreal ' 'NYA'='New York A ' 'NYN'='New York N ' 'OAK'='Oakland ' 'PHI'='Philadelphia ' 'PIT'='Pittsburgh ' 'SD '='San Diego ' 'SEA'='Seattle ' 'SF '='San Francisco' 'STL'='St. Louis ' 'TEX'='Texas ' 'TOR'='Toronto '; value $posfmt '1B' = 'First Base' '2B' = 'Second Base' 'SS' = 'Short Stop' '3B' = 'Third Base' 'RF' = 'Right Field' 'CF' = 'Center Field' 'LF' = 'Left Field' 'C ' = 'Catcher' 'DH' = 'Designated Hitter' 'OF' = 'Outfield' 'UT' = 'Utility' 'OS' = 'Outfield & Short Stop' '3S' = 'Third Base & Short Stop' '13' = 'First & Third Base' '3O' = 'Third Base & Outfield' 'O1' = 'Outfield & First Base' 'S3' = 'Short Stop & Third Base' '32' = 'Third & Second Base' 'DO' = 'Designated Hitter & Outfield' 'OD' = 'Outfield & Designated Hitter' 'CD' = 'Catcher & Designated Hitter' 'CS' = 'Catcher & Short Stop' '23' = 'Second & Third Base' '1O' = 'First Base and Outfield' '2S' = 'Second Base and Short Stop'; /* Recode position to short list */ value $pos 'CS','CD' ='C ' 'OS','O1','OD' ='OF' 'CF','RF','LF' ='OF' '1O','13' ='1B' '2S','23' ='2B' 'DO' ='DH' 'S3' ='SS' '32','3S','3O' ='3B' ; data baseball; input name $1-14 league $15 team $16-18 position $19-20 atbat 3. hits 3. homer 3. runs 3. rbi 3. walks 3. years 3. atbatc 5. hitsc 4. homerc 4. runsc 4. rbic 4. walksc 4. putouts 4. assists 3. errors 3. salary 4.; batavg = round(1000 * (hits / atbat)); batavgc= round(1000 * (hitsc/ atbatc)); label name = "Hitter's name" atbat = 'Times at Bat' hits = 'Hits' homer = 'Home Runs' runs = 'Runs' rbi = 'Runs Batted In' walks = 'Walks' years = 'Years in the Major Leagues' atbatc = 'Career Times at Bat' hitsc = 'Career Hits' homerc = 'Career Home Runs' runsc = 'Career Runs Scored' rbic = 'Career Runs Batted In' position= 'Position(s)' putouts = 'Put Outs' assists = 'Assists' errors = 'Errors' salary = 'Salary (in 1000$)' batavg = 'Batting Average' batavgc = 'Career Batting Average'; cards; Andy Allanson ACLEC 293 66 1 30 29 14 1 293 66 1 30 29 14 446 33 20 . Alan Ashby NHOUC 315 81 7 24 38 39 14 3449 835 69 321 414 375 632 43 10 475 Alvin Davis ASEA1B479130 18 66 72 76 3 1624 457 63 224 266 263 880 82 14 480 Andre Dawson NMONRF496141 20 65 78 37 11 56281575 225 828 838 354 200 11 3 500 A Galarraga NMON1B321 87 10 39 42 30 2 396 101 12 48 46 33 805 40 4 92 A Griffin AOAKSS594169 4 74 51 35 11 44081133 19 501 336 194 282421 25 750 Al Newman NMON2B185 37 1 23 8 21 2 214 42 1 30 9 24 76127 7 70 A Salazar AKC SS298 73 0 24 24 7 3 509 108 0 41 37 12 121283 9 100 Andres Thomas NATLSS323 81 6 26 32 8 2 341 86 6 32 34 8 143290 19 75 A Thornton ACLEDH401 92 17 49 66 65 13 52061332 253 784 890 866 0 0 01100 Alan Trammell ADETSS574159 21107 75 59 10 46311300 90 702 504 488 238445 22 517 Alex Trevino NLA C 202 53 4 31 26 27 9 1876 467 15 192 186 161 304 45 11 513 A Van.Slyke NSTLRF418113 13 48 61 47 4 1512 392 41 205 204 203 211 11 7 550 Alan Wiggins ABAL2B239 60 0 30 11 22 6 1941 510 4 309 103 207 121151 6 700 Bill Almon NPITUT196 43 7 29 27 30 13 3231 825 36 376 290 238 80 45 8 240 Billy Beane AMINOF183 39 3 20 15 11 3 201 42 3 20 16 11 118 0 0 . Buddy Bell NCIN3B568158 20 89 75 73 15 80682273 1771045 993 732 105290 10 775 B Biancalana AKC SS190 46 2 24 8 15 5 479 102 5 65 23 39 102177 16 175 Bruce Bochte AOAK1B407104 6 57 43 65 12 52331478 100 643 658 653 912 88 9 . Bruce Bochy NSD C 127 32 8 16 22 14 8 727 180 24 67 82 56 202 22 2 135 Barry Bonds NPITCF413 92 16 72 48 65 1 413 92 16 72 48 65 280 9 5 100 Bobby Bonilla ACHAO1426109 3 55 43 62 1 426 109 3 55 43 62 361 22 2 115 Bob Boone ACALC 22 10 1 4 2 1 6 84 26 2 9 9 3 812 84 11 . Bob Brenly NSF C 472116 16 60 62 74 6 1924 489 67 242 251 240 518 55 3 600 Bill Buckner ABOS1B629168 18 73102 40 18 84242464 16410081072 4021067157 14 777 Brett Butler ACLECF587163 4 92 51 70 6 2695 747 17 442 198 317 434 9 3 765 Bob Dernier NCHNCF324 73 4 32 18 22 7 1931 491 13 291 108 180 222 3 3 708 Bo Diaz NCINC 474129 10 50 56 40 10 2331 604 61 246 327 166 732 83 13 750 Bill Doran NHOU2B550152 6 92 37 81 5 2308 633 32 349 182 308 262329 16 625 Brian Downing ACALLF513137 20 90 95 90 14 52011382 166 763 734 784 267 5 3 900 Bobby Grich ACAL2B313 84 9 42 30 39 17 68901833 2241033 8641087 127221 7 . Billy Hatcher NHOUCF419108 6 55 36 22 3 591 149 8 80 46 31 226 7 4 110 Bob Horner NATL1B517141 27 70 87 52 9 3571 994 215 545 652 3371378102 8 . Brook Jacoby ACLE3B583168 17 83 80 56 5 1646 452 44 219 208 136 109292 25 613 Bob Kearney ASEAC 204 49 6 23 25 12 7 1309 308 27 126 132 66 419 46 5 300 Bill Madlock NLA 3B379106 10 38 60 30 14 62071906 146 859 803 571 72170 24 850 Bobby Meacham ANYASS161 36 0 19 10 17 4 1053 244 3 156 86 107 70149 12 . Bob Melvin NSF C 268 60 5 24 25 15 2 350 78 5 34 29 18 442 59 6 90 Ben Oglivie AMILDH346 98 5 31 53 30 16 59131615 235 784 901 560 0 0 0 . Bip Roberts NSD 2B241 61 1 34 12 14 1 241 61 1 34 12 14 166172 10 . B Robidoux AMIL1B181 41 1 15 21 33 2 232 50 4 20 29 45 326 29 5 68 Bill Russell NLA UT216 54 0 21 18 15 18 73181926 46 796 627 483 103 84 5 . Billy Sample NATLOF200 57 6 23 14 14 9 2516 684 46 371 230 195 69 1 1 . B Schroeder AMILUT217 46 7 32 19 9 4 694 160 32 86 76 32 307 25 1 180 Butch Wynegar ANYAC 194 40 7 19 29 30 11 41831069 64 486 493 608 325 22 2 . Chris Bando ACLEC 254 68 2 28 26 22 6 999 236 21 108 117 118 359 30 4 305 Chris Brown NSF 3B416132 7 57 49 33 3 932 273 24 113 121 80 73177 18 215 C Castillo ACLEOD205 57 8 34 32 9 5 756 192 32 117 107 51 58 4 4 248 Cecil Cooper AMIL1B542140 12 46 75 41 16 70992130 235 9871089 431 697 61 9 . Chili Davis NSF RF526146 13 71 70 84 6 2648 715 77 352 342 289 303 9 9 815 Carlton Fisk ACHAC 457101 14 42 63 22 17 65211767 2811003 977 619 389 39 4 875 Curt Ford NSTLOF214 53 2 30 29 23 2 226 59 2 32 32 27 109 7 3 70 Cliff Johnson ATORDH 19 7 0 1 2 1 4 41 13 1 3 4 4 0 0 0 . C Lansford AOAK3B591168 19 80 72 39 9 44781307 113 634 563 319 67147 41200 Chet Lemon ADETCF403101 12 45 53 39 12 51501429 166 747 666 526 316 6 5 675 C Maldonado NSF OF405102 18 49 85 20 6 950 231 29 99 138 64 161 10 3 415 C Martinez NSD O1244 58 9 28 25 35 4 1335 333 49 164 179 194 142 14 2 340 Charlie Moore AMILC 235 61 3 24 39 21 14 39261029 35 441 401 333 425 43 4 . C Reynolds NHOUSS313 78 6 32 41 12 12 3742 968 35 409 321 170 106206 7 417 Cal Ripken ABALSS627177 25 98 81 70 6 3210 927 133 529 472 313 240482 131350 Cory Snyder ACLEOS416113 24 58 69 16 1 416 113 24 58 69 16 203 70 10 90 Chris Speier NCHN3S155 44 6 21 23 15 16 66311634 98 698 661 777 53 88 3 275 C Wilkerson ATEX2S236 56 0 27 15 11 4 1115 270 1 116 64 57 125199 13 230 Dave Anderson NLA 3S216 53 1 31 15 22 4 926 210 9 118 69 114 73152 11 225 Doug Baker AOAKOF 24 3 0 1 0 2 3 159 28 0 20 12 9 80 4 0 . Don Baylor ABOSDH585139 31 93 94 62 17 75461982 31511411179 727 0 0 0 950 D Bilardello NMONC 191 37 4 12 17 14 4 773 163 16 61 74 52 391 38 8 . Daryl Boston ACHACF199 53 5 29 22 21 3 514 120 8 57 40 39 152 3 5 75 Darnell Coles ADET3B521142 20 67 86 45 4 815 205 22 99 103 78 107242 23 105 Dave Collins ADETLF419113 1 44 27 44 12 44841231 32 612 344 422 211 2 1 . D Concepcion NCINUT311 81 3 42 30 26 17 82472198 100 950 909 690 153223 10 320 D Daulton NPHIC 138 31 8 18 21 38 3 244 53 12 33 32 55 244 21 4 . Doug DeCinces ACAL3B512131 26 69 96 52 14 53471397 221 712 815 548 119216 12 850 Darrell Evans ADET1B507122 29 78 85 91 18 77611947 347117511521380 808108 2 535 Dwight Evans ABOSRF529137 26 86 97 97 15 66611785 2911082 949 989 280 10 5 933 Damaso Garcia ATOR2B424119 6 57 46 13 9 36511046 32 461 301 112 224286 8 850 Dan Gladden NSF CF351 97 4 55 29 39 4 1258 353 16 196 110 117 226 7 3 210 Danny Heep NNYNOF195 55 5 24 33 30 8 1313 338 25 144 149 153 83 2 1 . D Henderson ASEAOF388103 15 59 47 39 6 2174 555 80 285 274 186 182 9 4 325 Donnie Hill AOAK23339 96 4 37 29 23 4 1064 290 11 123 108 55 104213 9 275 Dave Kingman AOAKDH561118 35 70 94 33 16 66771575 442 9011210 608 463 32 8 . Davey Lopes NCHN3O255 70 7 49 35 43 15 63111661 1541019 608 820 51 54 8 450 Don Mattingly ANYA1B677238 31117113 53 5 2223 737 93 349 401 1711377100 61975 Darryl Motley AKC RF227 46 7 23 20 12 5 1325 324 44 156 158 67 92 2 2 . Dale Murphy NATLCF614163 29 89 83 75 11 50171388 266 813 822 617 303 6 61900 Dwayne Murphy AOAKCF329 83 9 50 39 56 9 3828 948 145 575 528 635 276 6 2 600 Dave Parker NCINRF637174 31 89116 56 14 67272024 247 9781093 495 278 9 91042 Dan Pasqua ANYALF280 82 16 44 45 47 2 428 113 25 61 70 63 148 4 2 110 D Porter ATEXCD155 41 12 21 29 22 16 54091338 181 746 805 875 165 9 1 260 D Schofield ACALSS458114 13 67 57 48 4 1350 298 28 160 123 122 246389 18 475 Don Slaught ATEXC 314 83 13 39 46 16 5 1457 405 28 156 159 76 533 40 4 432 D Strawberry NNYNRF475123 27 76 93 72 4 1810 471 108 292 343 267 226 10 61220 Dale Sveum AMIL3B317 78 7 35 35 32 1 317 78 7 35 35 32 45122 26 70 D Tartabull ASEARF511138 25 76 96 61 3 592 164 28 87 110 71 157 7 8 145 Dickie Thon NHOUSS278 69 3 24 21 29 8 2079 565 32 258 192 162 142210 10 . Denny Walling NHOU3B382119 13 54 58 36 12 2133 594 41 287 294 227 59156 9 595 Dave Winfield ANYARF565148 24 90104 77 14 72872083 30511351234 791 292 9 51861 Enos Cabell NLA 1B277 71 2 27 29 14 15 59521647 60 753 596 259 360 32 5 . Eric Davis NCINLF415115 27 97 71 68 3 711 184 45 156 119 99 274 2 7 300 Eddie Milner NCINCF424110 15 70 47 36 7 2130 544 38 335 174 258 292 6 3 490 Eddie Murray ABAL1B495151 17 61 84 78 10 56241679 275 8841015 7091045 88 132460 Ernest Riles AMILSS524132 9 69 47 54 2 972 260 14 123 92 90 212327 20 . Ed Romero ABOSSS233 49 2 41 23 18 8 1350 336 7 166 122 106 102132 10 375 Ernie Whitt ATORC 395106 16 48 56 35 10 2303 571 86 266 323 248 709 41 7 . Fred Lynn ABALCF397114 23 67 67 53 13 55891632 241 906 926 716 244 2 4 . Floyd Rayford ABAL3B210 37 8 15 19 15 6 994 244 36 107 114 53 40115 15 . F Stubbs NLA LF420 95 23 55 58 37 3 646 139 31 77 77 61 206 10 7 . Frank White AKC 2B566154 22 76 84 43 14 61001583 131 743 693 300 316439 10 750 George Bell ATORLF641198 31101108 41 5 2129 610 92 297 319 117 269 17 101175 Glenn Braggs AMILLF215 51 4 19 18 11 1 215 51 4 19 18 11 116 5 12 70 George Brett AKC 3B441128 16 70 73 80 14 66752095 20910721050 695 97218 161500 Greg Brock NLA 1B325 76 16 33 52 37 5 1506 351 71 195 219 214 726 87 3 385 Gary Carter NNYNC 490125 24 81105 62 13 60631646 271 847 999 680 869 62 81926 Glenn Davis NHOU1B574152 31 91101 64 3 985 260 53 148 173 951253111 11 215 George Foster NNYNLF284 64 14 30 42 24 18 70231925 348 9861239 666 96 4 4 . Gary Gaetti AMIN3B596171 34 91108 52 6 2862 728 107 361 401 224 118334 21 900 Greg Gagne AMINSS472118 12 63 54 30 4 793 187 14 102 80 50 228377 26 155 G Hendrick ACALOF283 77 14 45 47 26 16 68401910 259 9151067 546 144 6 5 700 Glenn Hubbard NATL2B408 94 4 42 36 66 9 3573 866 59 429 365 410 282487 19 535 Garth Iorg ATOR32327 85 3 30 44 20 8 2140 568 16 216 208 93 91185 12 363 Gary Matthews NCHNLF370 96 21 49 46 60 15 69861972 2311070 955 921 137 5 9 733 Graig Nettles NSD 3B354 77 16 36 55 41 20 87162172 384117212671057 83174 16 200 Gary Pettis ACALCF539139 5 93 58 69 5 1469 369 12 247 126 198 462 9 7 400 Gary Redus NPHILF340 84 11 62 33 47 5 1516 376 42 284 141 219 185 8 4 400 G Templeton NSD SS510126 2 42 44 35 11 55621578 44 703 519 256 207358 20 738 Gorman Thomas ASEADH315 59 16 45 36 58 13 46771051 268 681 782 697 0 0 0 . Greg Walker ACHA1B282 78 13 37 51 29 5 1649 453 73 211 280 138 670 57 5 500 Gary Ward ATEXLF380120 5 54 51 31 8 3118 900 92 444 419 240 237 8 1 600 Glenn Wilson NPHIRF584158 15 70 84 42 5 2358 636 58 265 316 134 331 20 4 663 Harold Baines ACHARF570169 21 72 88 38 7 37541077 140 492 589 263 295 15 5 950 Hubie Brooks NMONSS306104 14 50 58 25 7 2954 822 55 313 377 187 116222 15 750 H Johnson NNYN3S220 54 10 30 39 31 5 1185 299 40 145 154 128 50136 20 298 Hal McRae AKC DH278 70 7 22 37 18 18 71862081 190 9351088 643 0 0 0 325 H Reynolds ASEA2B445 99 1 46 24 29 4 618 129 1 72 31 48 278415 16 88 Harry Spilman NSF 1B143 39 5 18 30 15 9 639 151 16 80 97 61 138 15 1 175 H Winningham NMONOF185 40 4 23 11 18 3 524 125 7 58 37 47 97 2 2 90 J Barfield ATORRF589170 40107108 69 6 2325 634 128 371 376 238 368 20 31238 Juan Beniquez ABALUT343103 6 48 36 40 15 43381193 70 581 421 325 211 56 13 430 Juan Bonilla ABAL2B284 69 1 33 18 25 5 1407 361 6 139 98 111 122140 5 . J Cangelosi ACHALF438103 2 65 32 71 2 440 103 2 67 32 71 276 7 9 100 Jose Canseco AOAKLF600144 33 85117 65 2 696 173 38 101 130 69 319 4 14 165 Joe Carter ACLERF663200 29108121 32 4 1447 404 57 210 222 68 241 8 6 250 Jack Clark NSTL1B232 55 9 34 23 45 12 44051213 194 702 705 625 623 35 31300 Jose Cruz NHOULF479133 10 48 72 55 17 74722147 153 9801032 854 237 5 4 773 Julio Cruz ACHA2B209 45 0 38 19 42 10 3859 916 23 557 279 478 132205 5 . Jody Davis NCHNC 528132 21 61 74 41 6 2641 671 97 273 383 226 885105 81008 Jim Dwyer ABALDO160 39 8 18 31 22 14 2128 543 56 304 268 298 33 3 0 275 Julio Franco ACLESS599183 10 80 74 32 5 2482 715 27 330 326 158 231374 18 775 Jim Gantner AMIL2B497136 7 58 38 26 11 38711066 40 450 367 241 304347 10 850 Johnny Grubb ADETDH210 70 13 32 51 28 15 40401130 97 544 462 551 0 0 0 365 J Hairston ACHAUT225 61 5 32 26 26 11 1568 408 25 202 185 257 132 9 0 . Jack Howell ACAL3B151 41 4 26 21 19 2 288 68 9 45 39 35 28 56 2 95 John Kruk NSD LF278 86 4 33 38 45 1 278 86 4 33 38 45 102 4 2 110 J Leonard NSF LF341 95 6 48 42 20 10 2964 808 81 379 428 221 158 4 5 100 Jim Morrison NPIT3B537147 23 58 88 47 10 2744 730 97 302 351 174 92257 20 278 John Moses ASEACF399102 3 56 34 34 5 670 167 4 89 48 54 211 9 3 80 J Mumphrey NCHNOF309 94 5 37 32 26 13 46181330 57 616 522 436 161 3 3 600 Joe Orsulak NPITRF401100 2 60 19 28 4 876 238 2 126 44 55 193 11 4 . Jorge Orta AKC DH336 93 9 35 46 23 15 57791610 128 730 741 497 0 0 0 . Jim Presley ASEA3B616163 27 83107 32 3 1437 377 65 181 227 82 110308 15 200 Jamie Quirk AKC CS219 47 8 24 26 17 12 1188 286 23 100 125 63 260 58 4 . Johnny Ray NPIT2B579174 7 67 78 58 6 3053 880 32 366 337 218 280479 5 657 Jeff Reed AMINC 165 39 2 13 9 16 3 196 44 2 18 10 18 332 19 2 75 Jim Rice ABOSLF618200 20 98110 62 13 71272163 35111041289 564 330 16 82413 Jerry Royster NSD UT257 66 5 31 26 32 14 3910 979 33 518 324 382 87166 14 250 John Russell NPHIC 315 76 13 35 60 25 3 630 151 24 68 94 55 498 39 13 155 Juan Samuel NPHI2B591157 16 90 78 26 4 2020 541 52 310 226 91 290440 25 640 John Shelby ABALOF404 92 11 54 49 18 6 1354 325 30 188 135 63 222 5 5 300 Joel Skinner ACHAC 315 73 5 23 37 16 4 450 108 6 38 46 28 227 15 3 110 Jeff Stone NPHIOF249 69 6 32 19 20 4 702 209 10 97 48 44 103 8 2 . Jim Sundberg AKC C 429 91 12 41 42 57 13 55901397 83 578 579 644 686 46 4 825 Jim Traber ABALUT212 54 13 28 44 18 2 233 59 13 31 46 20 243 23 5 . Jose Uribe NSF SS453101 3 46 43 61 3 948 218 6 96 72 91 249444 16 195 Jerry Willard AOAKC 161 43 4 17 26 22 3 707 179 21 77 99 76 300 12 2 . J Youngblood NSF OF184 47 5 20 28 18 11 3327 890 74 419 382 304 49 2 0 450 Kevin Bass NHOURF591184 20 83 79 38 5 1689 462 40 219 195 82 303 12 5 630 Kal Daniels NCINOF181 58 6 34 23 22 1 181 58 6 34 23 22 88 0 3 87 Kirk Gibson ADETRF441118 28 84 86 68 8 2723 750 126 433 420 309 190 2 21300 Ken Griffey ANYAOF490150 21 69 58 35 14 61261839 121 983 707 600 96 5 31000 K Hernandez NNYN1B551171 13 94 83 94 13 60901840 128 969 900 9171199149 51800 Kent Hrbek AMIN1B550147 29 85 91 71 6 2816 815 117 405 474 3191218104 101310 Ken Landreaux NLA OF283 74 4 34 29 22 10 39191062 85 505 456 283 145 5 7 738 K McReynolds NSD CF560161 26 89 96 66 4 1789 470 65 233 260 155 332 9 8 625 K Mitchell NNYNOS328 91 12 51 43 33 2 342 94 12 51 44 33 145 59 8 125 K Moreland NCHNRF586159 12 72 79 53 9 3082 880 83 363 477 295 181 13 41043 Ken Oberkfell NATL3B503136 5 62 48 83 10 3423 970 20 408 303 414 65258 8 725 Ken Phelps ASEADH344 85 24 69 64 88 7 911 214 64 150 156 187 0 0 0 300 Kirby Puckett AMINCF680223 31119 96 34 3 1928 587 35 262 201 91 429 8 6 365 K Stillwell NCINSS279 64 0 31 26 30 1 279 64 0 31 26 30 107205 16 75 Leon Durham NCHN1B484127 20 66 65 67 7 3006 844 116 436 458 3771231 80 71183 Len Dykstra NNYNCF431127 8 77 45 58 2 667 187 9 117 64 88 283 8 3 203 Larry Herndon ADETOF283 70 8 33 37 27 12 44791222 94 557 483 307 156 2 2 225 Lee Lacy ABALRF491141 11 77 47 37 15 42911240 84 615 430 340 239 8 2 525 Len Matuszek NLA O1199 52 9 26 28 21 6 805 191 30 113 119 87 235 22 5 265 Lloyd Moseby ATORCF589149 21 89 86 64 7 3558 928 102 513 471 351 371 6 6 788 Lance Parrish ADETC 327 84 22 53 62 38 10 42731123 212 577 700 334 483 48 6 800 Larry Parrish ATEXDH464128 28 67 94 52 13 58291552 210 740 840 452 0 0 0 588 Luis Rivera NMONSS166 34 0 20 13 17 1 166 34 0 20 13 17 64119 9 . Larry Sheets ABALDH338 92 18 42 60 21 3 682 185 36 88 112 50 0 0 0 145 Lonnie Smith AKC LF508146 8 80 44 46 9 3148 915 41 571 289 326 245 5 9 . Lou Whitaker ADET2B584157 20 95 73 63 10 47041320 93 724 522 576 276421 11 420 Mike Aldrete NSF 1O216 54 2 27 25 33 1 216 54 2 27 25 33 317 36 1 75 Marty Barrett ABOS2B625179 4 94 60 65 5 1696 476 12 216 163 166 303450 14 575 Mike Brown NPITOF243 53 4 18 26 27 4 853 228 23 101 110 76 107 3 3 . Mike Davis AOAKRF489131 19 77 55 34 7 2051 549 62 300 263 153 310 9 9 780 Mike Diaz NPITO1209 56 12 22 36 19 2 216 58 12 24 37 19 201 6 3 90 M Duncan NLA SS407 93 8 47 30 30 2 969 230 14 121 69 68 172317 25 150 Mike Easler ANYADH490148 14 64 78 49 13 34001000 113 445 491 301 0 0 0 700 M Fitzgerald NMONC 209 59 6 20 37 27 4 884 209 14 66 106 92 415 35 3 . Mel Hall ACLELF442131 18 68 77 33 6 1416 398 47 210 203 136 233 7 7 550 M Hatcher AMINUT317 88 3 40 32 19 8 2543 715 28 269 270 118 220 16 4 . Mike Heath NSTLC 288 65 8 30 36 27 9 2815 698 55 315 325 189 259 30 10 650 Mike Kingery AKC OF209 54 3 25 14 12 1 209 54 3 25 14 12 102 6 3 68 M LaValliere NSTLC 303 71 3 18 30 36 3 344 76 3 20 36 45 468 47 6 100 Mike Marshall NLA RF330 77 19 47 53 27 6 1928 516 90 247 288 161 149 8 6 670 M Pagliarulo ANYA3B504120 28 71 71 54 3 1085 259 54 150 167 114 103283 19 175 Mark Salas AMINC 258 60 8 28 33 18 3 638 170 17 80 75 36 358 32 8 137 Mike Schmidt NPHI3B 20 1 0 0 0 0 2 41 9 2 6 7 4 78220 62127 Mike Scioscia NLA C 374 94 5 36 26 62 7 1968 519 26 181 199 288 756 64 15 875 M Tettleton AOAKC 211 43 10 26 35 39 3 498 116 14 59 55 78 463 32 8 120 Milt Thompson NPHICF299 75 6 38 23 26 3 580 160 8 71 33 44 212 1 2 140 Mitch Webster NMONCF576167 8 89 49 57 4 822 232 19 132 83 79 325 12 8 210 Mookie Wilson NNYNOF381110 9 61 45 32 7 3015 834 40 451 249 168 228 7 5 800 Marvell Wynne NSD OF288 76 7 34 37 15 4 1644 408 16 198 120 113 203 3 3 240 Mike Young ABALLF369 93 9 43 42 49 5 1258 323 54 181 177 157 149 1 6 350 Nick Esasky NCIN1B330 76 12 35 41 47 4 1367 326 55 167 198 167 512 30 5 . Ozzie Guillen ACHASS547137 2 58 47 12 2 1038 271 3 129 80 24 261459 22 175 O McDowell ATEXCF572152 18105 49 65 2 978 249 36 168 91 101 325 13 3 200 Omar Moreno NATLRF359 84 4 46 27 21 12 49921257 37 699 386 387 151 8 5 . Ozzie Smith NSTLSS514144 0 67 54 79 9 47391169 13 583 374 528 229453 151940 Ozzie Virgil NATLC 359 80 15 45 48 63 7 1493 359 61 176 202 175 682 93 13 700 Phil Bradley ASEALF526163 12 88 50 77 4 1556 470 38 245 167 174 250 11 1 750 Phil Garner NHOU3B313 83 9 43 41 30 14 58851543 104 751 714 535 58141 23 450 P Incaviglia ATEXRF540135 30 82 88 55 1 540 135 30 82 88 55 157 6 14 172 Paul Molitor AMIL3B437123 9 62 55 40 9 41391203 79 676 390 364 82170 151260 Pete O'Brien ATEX1B551160 23 86 90 87 5 2235 602 75 278 328 2731224115 11 . Pete Rose NCIN1B237 52 0 15 25 30 24140534256 160216513141566 523 43 6 750 Pat Sheridan ADETOF236 56 6 41 19 21 5 1257 329 24 166 125 105 172 1 4 190 Pat Tabler ACLE1B473154 6 61 48 29 6 1966 566 29 250 252 178 846 84 9 580 R Belliard NPITSS309 72 0 33 31 26 5 354 82 0 41 32 26 117269 12 130 Rick Burleson ACALUT271 77 5 35 29 33 12 49331358 48 630 435 403 62 90 3 450 Randy Bush AMINLF357 96 7 50 45 39 5 1394 344 43 178 192 136 167 2 4 300 Rick Cerone AMILC 216 56 4 22 18 15 12 2796 665 43 266 304 198 391 44 4 250 Ron Cey NCHN3B256 70 13 42 36 44 16 70581845 312 9651128 990 41118 81050 Rob Deer AMILRF466108 33 75 86 72 3 652 142 44 102 109 102 286 8 8 215 Rick Dempsey ABALC 327 68 13 42 29 45 18 3949 939 78 438 380 466 659 53 7 400 Rich Gedman ABOSC 462119 16 49 65 37 7 2131 583 69 244 288 150 866 65 6 . Ron Hassey ANYAC 341110 9 45 49 46 9 2331 658 50 249 322 274 251 9 4 560 R Henderson ANYACF608160 28130 74 89 8 40711182 103 862 417 708 426 4 61670 R Jackson ACALDH419101 18 65 58 92 20 95282510 548150916591342 0 0 0 488 Ricky Jones ACALRF 33 6 0 2 4 7 1 33 6 0 2 4 7 205 5 4 . Ron Kittle ACHADH376 82 21 42 60 35 5 1770 408 115 238 299 157 0 0 0 425 Ray Knight NNYN3B486145 11 51 76 40 11 39671102 67 410 497 284 88204 16 500 Randy Kutcher NSF OF186 44 7 28 16 11 1 186 44 7 28 16 11 99 3 1 . Rudy Law AKC OF307 80 1 42 36 29 7 2421 656 18 379 198 184 145 2 2 . Rick Leach ATORDO246 76 5 35 39 13 6 912 234 12 102 96 80 44 0 1 250 Rick Manning AMILOF205 52 8 31 27 17 12 51341323 56 643 445 459 155 3 2 400 R Mulliniks ATOR3B348 90 11 50 45 43 10 2288 614 43 295 273 269 60176 6 450 Ron Oester NCIN2B523135 8 52 44 52 9 3368 895 39 377 284 296 367475 19 750 Rey Quinones ABOSSS312 68 2 32 22 24 1 312 68 2 32 22 24 86150 15 70 R Ramirez NATLS3496119 8 57 33 21 7 3358 882 36 365 280 165 155371 29 875 Ronn Reynolds NPITLF126 27 3 8 10 5 4 239 49 3 16 13 14 190 2 9 190 Ron Roenicke NPHIOF275 68 5 42 42 61 6 961 238 16 128 104 172 181 3 2 191 Ryne Sandberg NCHN2B627178 14 68 76 46 6 3146 902 74 494 345 242 309492 5 740 R Santana NNYNSS394 86 1 38 28 36 4 1089 267 3 94 71 76 203369 16 250 Rick Schu NPHI3B208 57 8 32 25 18 3 653 170 17 98 54 62 42 94 13 140 Ruben Sierra ATEXOF382101 16 50 55 22 1 382 101 16 50 55 22 200 7 6 98 Roy Smalley AMINDH459113 20 59 57 68 12 53481369 155 713 660 735 0 0 0 740 R Thompson NSF 2B549149 7 73 47 42 1 549 149 7 73 47 42 255450 17 140 Rob Wilfong ACAL2B288 63 3 25 33 16 10 2682 667 38 315 259 204 135257 7 342 R Williams NLA CF303 84 4 35 32 23 2 312 87 4 39 32 23 179 5 3 . Robin Yount AMILCF522163 9 82 46 62 13 70372019 1531043 827 535 352 9 11000 Steve Balboni AKC 1B512117 29 54 88 43 6 1750 412 100 204 276 1551236 98 18 100 Scott Bradley ASEAC 220 66 5 20 28 13 3 290 80 5 27 31 15 281 21 3 90 Sid Bream NPIT1B522140 16 73 77 60 4 730 185 22 93 106 861320166 17 200 S Buechele ATEX3B461112 18 54 54 35 2 680 160 24 76 75 49 111226 11 135 S Dunston NCHNSS581145 17 66 68 21 2 831 210 21 106 86 40 320465 32 155 S Fletcher ATEXSS530159 3 82 50 47 6 1619 426 11 218 149 163 196354 15 475 Steve Garvey NSD 1B557142 21 58 81 23 18 87592583 27111381299 4781160 53 71450 Steve Jeltz NPHISS439 96 0 44 36 65 4 711 148 1 68 56 99 229406 22 150 S Lombardozzi AMIN2B453103 8 53 33 52 2 507 123 8 63 39 58 289407 6 105 Spike Owen ASEASS528122 1 67 45 51 4 1716 403 12 211 146 155 209372 17 350 Steve Sax NLA 2B633210 6 91 56 59 6 3070 872 19 420 230 274 367432 16 90 Tony Armas ABOSCF 16 2 0 1 0 0 2 28 4 0 1 0 0 247 4 8 . T Bernazard ACLE2B562169 17 88 73 53 8 3181 841 61 450 342 373 351442 17 530 Tom Brookens ADETUT281 76 3 42 25 20 8 2658 657 48 324 300 179 106144 7 342 Tom Brunansky AMINRF593152 23 69 75 53 6 2765 686 133 369 384 321 315 10 6 940 T Fernandez ATORSS687213 10 91 65 27 4 1518 448 15 196 137 89 294445 13 350 Tim Flannery NSD 2B368103 3 48 28 54 8 1897 493 9 207 162 198 209246 3 327 Tom Foley NMONUT263 70 1 26 23 30 4 888 220 9 83 82 86 81147 4 250 Tony Gwynn NSD RF642211 14107 59 52 5 2364 770 27 352 230 193 337 19 4 740 Terry Harper NATLOF265 68 8 26 30 29 7 1337 339 32 135 163 128 92 5 3 425 Toby Harrah ATEX2B289 63 7 36 41 44 17 74021954 1951115 9191153 166211 7 . Tommy Herr NSTL2B559141 2 48 61 73 8 3162 874 16 421 349 359 352414 9 925 Tim Hulett ACHA3B520120 17 53 44 21 4 927 227 22 106 80 52 70144 11 185 Terry Kennedy NSD C 19 4 1 2 3 1 1 19 4 1 2 3 1 692 70 8 920 Tito Landrum NSTLOF205 43 2 24 17 20 7 854 219 12 105 99 71 131 6 1 287 Tim Laudner AMINC 193 47 10 21 29 24 6 1136 256 42 129 139 106 299 13 5 245 Tom O'Malley ABAL3B181 46 1 19 18 17 5 937 238 9 88 95 104 37 98 9 . Tom Paciorek ATEXUT213 61 4 17 22 3 17 40611145 83 488 491 244 178 45 4 235 Tony Pena NPITC 510147 10 56 52 53 7 2872 821 63 307 340 174 810 99 181150 T Pendleton NSTL3B578138 1 56 59 34 3 1399 357 7 149 161 87 133371 20 160 Tony Perez NCIN1B200 51 2 14 29 25 23 97782732 37912721652 925 398 29 7 . Tony Phillips AOAK2B441113 5 76 52 76 5 1546 397 17 226 149 191 160290 11 425 Terry Puhl NHOUOF172 42 3 17 14 15 10 40861150 57 579 363 406 65 0 0 900 Tim Raines NMONLF580194 9 91 62 78 8 33721028 48 604 314 469 270 13 6 . Ted Simmons NATLUT127 32 4 14 25 12 19 83962402 24210481348 819 167 18 6 500 Tim Teufel NNYN2B279 69 4 35 31 32 4 1359 355 31 180 148 158 133173 9 278 Tim Wallach NMON3B480112 18 50 71 44 7 3031 771 110 338 406 239 94270 16 750 Vince Coleman NSTLLF600139 0 94 29 60 2 1236 309 1 201 69 110 300 12 9 160 Von Hayes NPHI1B610186 19107 98 74 6 2728 753 69 399 366 2861182 96 131300 Vance Law NMON2B360 81 5 37 44 37 7 2268 566 41 279 257 246 170284 3 525 Wally Backman NNYN2B387124 1 67 27 36 7 1775 506 6 272 125 194 186290 17 550 Wade Boggs ABOS3B580207 8107 71105 5 2778 978 32 474 322 417 121267 191600 Will Clark NSF 1B408117 11 66 41 34 1 408 117 11 66 41 34 942 72 11 120 Wally Joyner ACAL1B593172 22 82100 57 1 593 172 22 82 100 571222139 15 165 W Krenchicki NMON13221 53 2 21 23 22 8 1063 283 15 107 124 106 325 58 6 . Willie McGee NSTLCF497127 7 65 48 37 5 2703 806 32 379 311 138 325 9 3 700 W Randolph ANYA2B492136 5 76 50 94 12 55111511 39 897 451 875 313381 20 875 W Tolleson ACHA3B475126 3 61 43 52 6 1700 433 7 217 93 146 37113 7 385 Willie Upshaw ATOR1B573144 9 85 60 78 8 3198 857 97 470 420 3321314131 12 960 Willie Wilson AKC CF631170 9 77 44 31 11 49081457 30 775 357 249 408 4 31000 ; ess/fontlock-test/runif.Rcxx0000664000175000017500000000116612423756516014530 0ustar eddedd## -*- mode: poly-r+c++; -*- require(RcppEigen) # cxxfunction not supported # require(inline) ## runifXd <- cxxfunction(signature(arg1="integer"), plugin='RcppEigen', ## includes=' ## RNGScope scope; ## using namespace Eigen; ## inline VectorXd runifXd(int size, double a=0., double b=1.) { ## return as(runif(size, a, b)); ## }', ## body='return wrap(runifXd(as(arg1)));') cppFunction(' NumericVector runifXd(int size, double a=0., double b=1.) { return runif(size, a, b);}', depends='RcppEigen', includes=' RNGScope scope; using namespace Eigen;') runifXd(3) ess/ess-autoloads.el0000664000175000017500000000466212423756516013054 0ustar eddedd;;; ess-autoloads.el --- Emacs Speaks Statistics: statistical programming within Emacs ;; Copyright (C) 2012 Donald E. Curtis ;; Copyright (C) 2014 The ESS Core Team ;; Original Author: Donald E. Curtis ;; Created: March 5, 2012 ;; Maintainers: ESS-core ;; Keywords: autoload, startup, configuration, package.el ;; Summary: essential autoloads for ESS ;; This file is part of ESS ;; This file is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This file is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; A copy of the GNU General Public License is available at ;; http://www.r-project.org/Licenses/ ;; ;; In short: you may use this code any way you like, as long as you ;; don't charge money for it, remove this notice, or hold anyone liable ;; for its results. ;;; Commentary: ;;; This file is just a wrapper so that ESS will be more `package.el' ;;; friendly. This is just a list of functions that require loading ;;; of ESS through `ess-site'. ;;; Code: ;;*;; Requires and autoloads ;;;===================================================== ;;; (when (boundp 'load-path) (add-to-list 'load-path (file-name-as-directory (expand-file-name "lisp" (file-name-directory load-file-name))))) (autoload 'R "ess-site" "Call 'R', the 'GNU S' system from the R Foundation. Optional prefix (C-u) allows to set command line arguments, such as --vsize. This should be OS agnostic. If you have certain command line arguments that should always be passed to R, put them in the variable `inferior-R-args'." t) (autoload 'S "ess-site" "Call 'S'." t) ; Local variables section ;;; This file is automatically placed in Outline minor mode. ;;; The file is structured as follows: ;;; Chapters: ^L ; ;;; Sections: ;;*;; ;;; Subsections: ;;;*;;; ;;; Components: defuns, defvars, defconsts ;;; Random code beginning with a ;;;;* comment ;;; Local variables: ;;; mode: emacs-lisp ;;; mode: outline-minor ;;; outline-regexp: "\^L\\|\\`;\\|;;\\*\\|;;;\\*\\|(def[cvu]\\|(setq\\|;;;;\\*" ;;; End: ;;; ess-autoloads.el ends here ess/Makefile0000664000175000017500000001212212632537307011372 0ustar eddedd## Top Level Makefile ## Before making changes here, please take a look at Makeconf include ./Makeconf ETC_FILES = # etc/SVN-REVISION etc/ESSR-VERSION ## This is the default target, i.e. 'make' and 'make all' are the same. all install uninstall: $(ETC_FILES) cd etc; $(MAKE) $@ cd lisp; $(MAKE) $@ cd doc; $(MAKE) $@ lisp: $(ETC_FILES) cd lisp; $(MAKE) .PHONY: test test: cd test; $(EMACS) --script run-tests generate-indent-cases: cd test; $(EMACS) --script generate-indent-cases ## the rest of the targets are for ESS developer's use only : # VERSION: # @echo "$(ESSVERSION)" > $@ ## Hmm, this is a bit brittle ... but for distribution, there's no problem ## no longer: using git! # etc/SVN-REVISION etc/SVN-REVISION-tmp: VERSION lisp/*.el doc/*.texi doc/Makefile etc/Makefile lisp/Makefile Makefile Makeconf # (LC_ALL=C TZ=GMT svn info || $(ECHO) "Revision: unknown") 2> /dev/null \ # | sed -n -e '/^Revision/p' -e '/^Last Changed Date/'p \ # | cut -d' ' -f1,2,3,4 > $@-tmp # if [ -s $@-tmp ]; then mv $@-tmp $@ ; elif [ ! -f $@ ]; then echo 'not available' > $@ ; fi # etc/ESSR-VERSION: etc/ESSR/DESCRIPTION # sed -n '/^Version: */{ s///; s/ *$$//p }' $< > $@ ## --- PRE-release --- # new target to create .tgz and .zip files only # run in the foreground so you can accept the certificate # for real men # GNUTAR=gtar make downloads downloads: all RPM.spec cleanup-dist @echo "**********************************************************" @echo "** Making distribution of ESS for release $(ESSVERSION)," @echo "** from $(ESSDIR)" @echo "** (must have setup git / github with cached authentication, prior for security)" @echo "**********************************************************" @echo "** Exporting Files **" git clone git@github.com:emacs-ess/ESS.git $(ESSDIR)-git mkdir -p $(ESSDIR) (cd $(ESSDIR)-git; $(GNUTAR) cvf - --exclude=.git --exclude=.svn --no-wildcards .) | (cd $(ESSDIR); $(GNUTAR) xf - ) @echo "** Clean-up docs, Make docs, and Correct Write Permissions **" CLEANUP="user-* useR-* Why_* README.*"; \ cd $(ESSDIR)/doc; chmod -R u+w $$CLEANUP; rm -rf $$CLEANUP; \ $(MAKE) all cleanaux ; cd ../.. cd lisp; $(MAKE) ess-custom.el; cp ess-custom.el ../$(ESSDIR)/lisp/; cd .. cd lisp; $(MAKE) julia-mode.el; cp julia-mode.el ../$(ESSDIR)/lisp/; cd .. cp -p RPM.spec $(ESSDIR)/ chmod a-w $(ESSDIR)/lisp/*.el chmod u+w $(ESSDIR)/lisp/ess-site.el $(ESSDIR)/Make* $(ESSDIR)/*/Makefile touch $(ESSDIR)/etc/.IS.RELEASE # # Get (the first 12 hexdigits of) the git version into the release tarball: cut -c 1-12 $(ESSDIR)-git/.git/refs/heads/master > $(ESSDIR)/etc/git-ref @echo "** Creating .tgz file **" test -f $(ESSDIR).tgz && rm -rf $(ESSDIR).tgz || true $(GNUTAR) hcvofz $(ESSDIR).tgz $(ESSDIR) @echo "** Creating .zip file **" test -f $(ESSDIR).zip && rm -rf $(ESSDIR).zip || true zip -r $(ESSDIR).zip $(ESSDIR) dist: VERSION downloads grep -E 'defvar ess-(version|revision)' lisp/ess-custom.el \ $(ESSDIR)/lisp/ess-custom.el touch $@ .PHONY: cleanup-dist cleanup-rel dist cleanup-dist: @echo "** Cleaning up **" rm -f $(ESSDIR)/etc/.IS.RELEASE $(ESSDIR)/etc/git-ref (if [ -d $(ESSDIR) ] ; then \ chmod -R u+w $(ESSDIR) $(ESSDIR)-git && rm -rf $(ESSDIR) $(ESSDIR)-git; fi) ## should only be called manually (if at all): cleanup-rel: @rm -f $(ESSDIR)* ## @rm -f dist lisp/dist $(ESSDIR)* %.spec: %.spec.in VERSION sed 's/@@VERSION@@/$(ESSVERSION)/g' $< > $@ ## --- RELEASE --- ## NB: Typically use 'make -W VERSION ChangeLog' before 'make rel' <<--- MUST ## since ~~~~~~~~~~~~~~~~~~~~~~~~~ ## ChangeLog often ends up newer than VERSION ChangeLog: VERSION @echo "** Adding log-entry to ChangeLog file" mv ChangeLog ChangeLog.old (echo `date "+%Y-%m-%d "` \ " ESS Maintainers " ; \ echo; echo " * Version $(ESSVERSION) released."; echo; \ cat ChangeLog.old ) > ChangeLog @rm ChangeLog.old git commit -m 'Version $(ESSVERSION)' ChangeLog rel: ChangeLog dist tag homepage [ x$$USER = xmaechler ] || (echo 'must be maechler'; exit 1 ) @echo "** Placing .tgz and .zip files **" cp -p $(ESSDIR).tgz $(ESSDIR).zip $(UPLOAD_DIR) @echo "** Creating LATEST.IS. file **" rm -f $(UPLOAD_DIR)/LATEST.IS.* touch $(UPLOAD_DIR)/LATEST.IS.$(ESSDIR) @echo "If all is perfect, eventually call 'make cleanup-rel'" tag: @echo "** Tagging the release **" git tag -m'release tagging' v$(ESSVERSION) #svn cp -m'release tagging' $(SVN_URL)/trunk $(SVN_URL)/tags/$(ESSVERSION) @echo '** Pushing the v$(ESSVERSION) upstream ...' git push homepage: @echo "** Updating ESS Webpage **" [ x$$USER = xmaechler ] || (echo 'must be maechler'; exit 1 ) cd $(ESS_HOMEPAGE); ./update-VERSION $(ESSVERSION) ## TODO (when MM has GPG set up properly): add this to 'rel' .PHONY: buildrpm buildrpm: dist rpmbuild -ta --sign $(ESSDIR).tgz builddeb: dpkg-buildpackage -uc -us -rfakeroot -tc ## 'clean' shall remove *exactly* those things that are *not* in version control ## 'distclean' removes also things in VC (svn, when they are remade by "make"): clean distclean: cleanup-dist cd etc; $(MAKE) $@ cd lisp; $(MAKE) $@ cd doc; $(MAKE) $@ # rm -f etc/SVN-REVISION*