statcheck/0000755000176200001440000000000014363505732012233 5ustar liggesusersstatcheck/NAMESPACE0000644000176200001440000000170514350273527013455 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(identify,statcheck) S3method(plot,statcheck) S3method(summary,statcheck) export(checkHTML) export(checkHTMLdir) export(checkPDF) export(checkPDFdir) export(checkdir) export(statcheck) export(statcheckReport) importFrom(ggplot2,aes) importFrom(ggplot2,annotate) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) importFrom(ggplot2,facet_grid) importFrom(ggplot2,geom_abline) importFrom(ggplot2,geom_hline) importFrom(ggplot2,geom_point) importFrom(ggplot2,geom_vline) importFrom(ggplot2,ggplot) importFrom(ggplot2,scale_color_manual) importFrom(ggplot2,scale_x_continuous) importFrom(ggplot2,scale_y_continuous) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(graphics,abline) importFrom(graphics,legend) importFrom(graphics,par) importFrom(graphics,plot.default) importFrom(graphics,points) importFrom(graphics,text) importFrom(rlang,.data) statcheck/README.md0000644000176200001440000000665614362533741013527 0ustar liggesusers # statcheck [![](https://www.r-pkg.org/badges/version/statcheck?color=green)](https://cran.r-project.org/package=statcheck) [![](http://cranlogs.r-pkg.org/badges/grand-total/statcheck?color=green)](https://cran.r-project.org/package=statcheck) [![](https://img.shields.io/badge/devel%20version-1.4.0-yellow.svg)](https://github.com/MicheleNuijten/statcheck) ## What is statcheck? `statcheck` is a “spellchecker” for statistics. It checks whether your *p*-values match their accompanying test statistic and degrees of freedom. `statcheck` searches for null-hypothesis significance test (NHST) in APA style (e.g., *t*(28) = 2.2, *p* \< .05). It recalculates the p-value using the reported test statistic and degrees of freedom. If the reported and computed p-values don’t match, `statcheck` will flag the result as an error. ![](man/figures/infograph.png) ## What can I use statcheck for? `statcheck` is mainly useful for: 1. **Self-checks**: you can use `statcheck` to make sure your manuscript doesn’t contain copy-paste errors or other inconsistencies before you submit it to a journal. 2. **Peer review**: editors and reviewers can use `statcheck` to check submitted manuscripts for statistical inconsistencies. They can ask authors for a correction or clarification before publishing a manuscript. 3. **Research**: `statcheck` can be used to automatically extract statistical test results from articles that can then be analyzed. You can for instance investigate whether you can predict statistical inconsistencies (see e.g., [Nuijten et al., 2017](https://doi.org/10.1525/collabra.102)), or use it to analyze p-value distributions (see e.g., [Hartgerink et al., 2016](https://peerj.com/articles/1935/)). ## How does statcheck work? The algorithm behind `statcheck` consists of four basic steps: 1. **Convert** pdf and html articles to plain text files. 2. **Search** the text for instances of NHST results. Specifically, `statcheck` can recognize *t*-tests, *F*-tests, correlations, *z*-tests, $\chi^2$ -tests, and Q-tests (from meta-analyses) if they are reported completely (test statistic, degrees of freedom, and *p*-value) and in APA style. 3. **Recompute** the *p*-value using the reported test statistic and degrees of freedom. 4. **Compare** the reported and recomputed *p*-value. If the reported *p*-value does not match the computed one, the result is marked as an *inconsistency* (`Error` in the output). If the reported *p*-value is significant and the computed is not, or vice versa, the result is marked as a *gross inconsistency* (`DecisionError` in the output). `statcheck` takes into account correct rounding of the test statistic, and has the option to take into account one-tailed testing. See the [manual](http://rpubs.com/michelenuijten/statcheckmanual) for details. ## Installation and use For detailed information about installing and using `statcheck`, see the [manual on RPubs](http://rpubs.com/michelenuijten/statcheckmanual). [statcheck.io](http://statcheck.io/) is a web-based interface for statcheck. statcheck/man/0000755000176200001440000000000014362536723013011 5ustar liggesusersstatcheck/man/identify.statcheck.Rd0000644000176200001440000000252614350273527017065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/identify.statcheck.R \name{identify.statcheck} \alias{identify.statcheck} \title{Identify specific points in a statcheck plot.} \usage{ \method{identify}{statcheck}(x, alpha = 0.05, ...) } \arguments{ \item{x}{A statcheck object. See \code{\link{statcheck}}.} \item{alpha}{assumed level of significance in the scanned texts. Defaults to .05.} \item{...}{arguments to be passed to methods, such as graphical parameters (see \code{\link{par}}).} } \description{ With this function you can simply point and click on the datapoints in the plot to see the corresponding statcheck details, such as the paper from which the data came and the exact statistical results. } \examples{ \dontrun{ # First we need a statcheck object # Here, we create one by running statcheck on some raw text txt <- "This test is consistent t(28) = 0.2, p = .84, but this one is inconsistent: F(2, 28) = 4.2, p = .01. This final test is even a gross/decision inconsistency: z = 1.23, p = .03" result <- statcheck(txt) # Now, we can run identify.statcheck(), or shorter, simply identify(): identify(result) # Further instructions: # click on one or multiple points of interest # press Esc # a dataframe with information on the selected points will appear } } statcheck/man/summary.statcheck.Rd0000644000176200001440000000167014350273527016746 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.statcheck.R \name{summary.statcheck} \alias{summary.statcheck} \title{Summary method for statcheck} \usage{ \method{summary}{statcheck}(object, ...) } \arguments{ \item{object}{a \code{statcheck} object.} \item{...}{additional arguments affecting the summary produced.} } \value{ A data frame containing for each source of statistics: \describe{ \item{source}{Name of the file/origin of which the statistics are extracted} \item{nr_p_values}{The number of extracted reported p values per article} \item{nr_errors}{The number of errors per article} \item{nr_decision_errors}{The number of decision errors per article} } } \description{ Gives the summaries for a \code{statcheck} object. } \examples{ txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" stat <- statcheck(txt) summary(stat) } statcheck/man/statcheckReport.Rd0000644000176200001440000000365314350273527016451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/statcheckReport.R \name{statcheckReport} \alias{statcheckReport} \title{Generate HTML report for statcheck output} \usage{ statcheckReport(statcheckOutput, outputFileName, outputDir) } \arguments{ \item{statcheckOutput}{statcheck output of one of the following functions: \code{\link{statcheck}}, \code{\link{checkPDFdir}}, \code{\link{checkPDF}}, \code{\link{checkHTMLdir}}, \code{\link{checkHTML}}, or \code{\link{checkdir}}.} \item{outputFileName}{String specifying the file name under which you want to save the generated HTML report. The extension ".html" is automatically added, so doesn't need to be specified in this argument.} \item{outputDir}{String specifying the directory in which you want to save the generated HTML report.} } \value{ An HTML report, saved in the directory specified in the argument "outputDir". } \description{ This function uses R Markdown to generate a nicely formatted HTML report of \code{\link{statcheck}} output. } \details{ This function temporarily saves the inserted \code{statcheck} output as an .RData file in the "output" folder in the statcheck package directory. This file is then called by the .Rmd template that is saved in the folder "rmd", also in the statcheck package directory. After the HTML report is generated, the .RData file is removed again. } \examples{ \dontrun{ # first generate statcheck output, for instance by using the statcheck() function txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" stat <- statcheck(txt) # next, use this output to generate a nice HTML report of the results statcheckReport(stat, outputFileName="statcheckHTMLReport", outputDir="C:/mydocuments/results") # you can now find your HTML report in the folder # "C:/mydocuments/results" under the name "statcheckHTMLReport.html". } } statcheck/man/checkfiles.Rd0000644000176200001440000000134014350273527015373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/checkHTML.R, R/checkPDF.R, R/doc-checkfiles.R \name{checkHTML} \alias{checkHTML} \alias{checkPDF} \alias{checkfiles} \title{Extract statistics from PDF/HTML articles and recalculate p-values} \usage{ checkHTML(files, ...) checkPDF(files, ...) } \arguments{ \item{files}{Vector of strings containing file paths to HTML files to check.} \item{...}{Arguments sent to \code{statcheck}.} } \value{ A statcheck data frame with the extracted statistics. See \code{\link{statcheck}} for details. } \description{ These functions search for NHST results in PDF and/or HTML articles and send the extracted statistics to \code{statcheck}. } statcheck/man/statcheck-package.Rd0000644000176200001440000001262214362536723016645 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/statcheck-package.R \docType{package} \name{statcheck-package} \alias{statcheck-package} \alias{_PACKAGE} \alias{{statcheck}-package} \title{statcheck: Extract statistics from articles and recompute p-values} \description{ The package \code{statcheck} can extract Null Hypothesis Significance Test (NHST) results from articles (or plain text) and recomputes p-values to check whether a reported NHST result is internally consistent or not. } \details{ \code{statcheck} can be used for multiple purposes, including: \itemize{ \item \strong{Self-checks}: you can use statcheck to make sure your manuscript doesn't contain copy-paste errors or other inconsistencies before you submit it to a journal. \item \strong{Peer review}: editors and reviewers can use statcheck to check submitted manuscripts for statistical inconsistencies. They can ask authors for a correction or clarification before publishing a manuscript. \item \strong{Research}: statcheck can be used to automatically extract statistical test results from articles that can then be analyzed. You can for instance investigate whether you can predict statistical inconsistencies (see e.g., Nuijten et al., 2017 ), or use it to analyze p-value distributions (see e.g., Hartgerink et al., 2016 ). } } \section{Using statcheck on a string of text}{ The most basic usage of \code{statcheck} is to directly extract NHST results and check for inconsistencies in a string of text. See \code{\link{statcheck}} for details and an example of how to do this. } \section{Using statcheck on an article}{ Another option is to run \code{statcheck} on an article (PDF or HTML). This is a useful option if you want to check for inconsistencies in a single article (e.g., as a final check before you submit it). Depending on whether you want to check an article in HTML or PDF, you can use \code{\link{checkHTML}} or \code{\link{checkPDF}}, respectively. Note: it is recommended to check articles in HTML, as converting PDF files to plain text sometimes results in some conversion errors. } \section{Using statcheck on a folder of articles}{ Finally, it is possible to run \code{statcheck} on an entire folder of articles. This is often useful for meta-research. To do so, you can use \code{\link{checkPDFdir}} to check all PDF articles in a folder, \code{\link{checkHTMLdir}} to check all PDF articles in a folder, and \code{\link{checkdir}} to check both PDF and HTML articles in a folder. } \section{Accuracy of the algorithm in detecting inconsistencies}{ It is important to note that \code{statcheck} is not perfect. Its performance in detecting NHST results depends on the type-setting and reporting style of an article and can vary widely. However, \code{statcheck} performs well in classifying the retrieved statistics in different consistency categories. We found that statcheck’s sensitivity (true positive rate) and specificity (true negative rate) were high: between 85.3% and 100%, and between 96.0% and 100%, respectively, depending on the assumptions and settings. The overall accuracy of statcheck ranged from 96.2% to 99.9%. More details on the validity study can be found in \href{https://psyarxiv.com/tcxaj/}{Nuijten et al., 2017}. } \section{Manual}{ Details on what statcheck can and cannot do, and how to install the package and the necessary program Xpdf can be found in the \href{https://rpubs.com/michelenuijten/statcheckmanual}{online manual}. } \section{Web app}{ \code{statcheck} is also available as a free, online web app at \url{http://statcheck.io}. } \references{ Hartgerink, C. H. J., Van Aert, R. C. M., Nuijten, M. B., Wicherts, J. M., Van Assen, M. A. L. M. (2016). Distributions of p-values smaller than .05 in psychology: What is going on? \emph{PeerJ}, \emph{4}, e1935. doi: 10.7717/peerj.1935 Nuijten, M. B., Borghuis, J., Veldkamp, C. L. S., Dominguez-Alvarez, L., Van Assen, M. A. L. M., & Wicherts, J. M. (2017). Journal data sharing policies and statistical reporting inconsistencies in psychology. \emph{Collabra: Psychology}, \emph{3}(1), 1-22. doi: 10.1525/collabra.102. Nuijten, M. B., Van Assen, M. A. L. M., Hartgerink, C. H. J., Epskamp, S., & Wicherts, J. M. (2017). The validity of the tool "statcheck" in discovering statistical reporting inconsistencies. \emph{Preprint retrieved from https://psyarxiv.com/tcxaj/.} } \author{ \strong{Maintainer}: Michele B. Nuijten \email{m.b.nuijten@uvt.nl} (\href{https://orcid.org/0000-0002-1468-8585}{ORCID}) Authors: \itemize{ \item Sacha Epskamp \email{mail@sachaepskamp.com} (\href{https://orcid.org/0000-0003-4884-8118}{ORCID}) } Other contributors: \itemize{ \item Willem Sleegers (\href{https://orcid.org/0000-0001-9058-3817}{ORCID}) [contributor] \item Sean Rife (\href{https://orcid.org/0000-0002-6748-0841}{ORCID}) [contributor] \item John Sakaluk (\href{https://orcid.org/0000-0002-2515-9822}{ORCID}) [contributor] \item Paul van der Laken (\href{https://orcid.org/0000-0002-0404-9114}{ORCID}) [contributor] \item Chris Hartgerink (\href{https://orcid.org/0000-0003-1050-6809}{ORCID}) [contributor] \item Steve Haroz (\href{https://orcid.org/0000-0002-2725-9173}{ORCID}) [contributor] } } \keyword{internal} statcheck/man/plot.statcheck.Rd0000644000176200001440000000400214350273527016217 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.statcheck.R \name{plot.statcheck} \alias{plot.statcheck} \title{Plot method for statcheck} \usage{ \method{plot}{statcheck}(x, alpha = 0.05, APAstyle = TRUE, group = NULL, ...) } \arguments{ \item{x}{A statcheck object. See \code{\link{statcheck}}.} \item{alpha}{assumed level of significance in the scanned texts. Defaults to .05.} \item{APAstyle}{If TRUE, prints plot in APA style.} \item{group}{Indicate grouping variable to facet plot. Only works when \code{APAstyle==TRUE}} \item{...}{arguments to be passed to methods, such as graphical parameters (see \code{\link{par}}).} } \description{ Function for plotting of \code{statcheck} objects. Reported p values are plotted against recalculated p values, which allows the user to easily spot if articles contain miscalculations of statistical results. } \details{ If APAstyle = FALSE, inconsistencies between the reported and the recalculated p value are indicated with an orange dot. Recalculations of the p value that render a previously non significant result (p >= .5) as significant (p < .05), and vice versa, are considered decision errors, and are indicated with a red dot. Exactly reported p values (i.e. p = ..., as opposed to p < ... or p > ...) are indicated with a diamond. } \section{Acknowledgements}{ Many thanks to John Sakaluk who adapted the plot code to create graphs in APA style. } \examples{ # First we need a statcheck object # Here, we create one by running statcheck on some raw text txt <- "This test is consistent t(28) = 0.2, p = .84, but this one is inconsistent: F(2, 28) = 4.2, p = .01. This final test is even a gross/decision inconsistency: z = 1.23, p = .03" result <- statcheck(txt) # We can then plot the statcheck object 'result' by simply calling plot() on # "result". R will know what kind of plot to make, because "result" is of # class "statcheck" plot(result) } \seealso{ \code{\link{statcheck}} } statcheck/man/figures/0000755000176200001440000000000014362533741014452 5ustar liggesusersstatcheck/man/figures/overview_functions.pdf0000644000176200001440000101102014362533741021076 0ustar liggesusers%PDF-1.7 % 1 0 obj <>/Metadata 2316 0 R/ViewerPreferences 2317 0 R>> endobj 2 0 obj <> endobj 3 0 obj <>/Font<>/Pattern<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 33 0 R 41 0 R] /MediaBox[ 0 0 1280.04 960] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream xZYo#7~4#L2.l6E2 C3ڲWR:-el=8/-UX,AWۛ|#^}Z۷^|XGZ|hT=ƣG.._~y|-W_W_^#CۂnPMܽ}wm [^)>֭/3le}{hA55nי}JqIi&wLi}]l+L`G㈄>}קEmSybJ#euޓlO6q>I1* Rm ݆H~Ӑ)+8!o4 UhP R%{53'٧xo(zz wm0)tk>h|?PB}ӯtk\ ¯̩mW.S( [^Hs i)_c}%!:+ax _)Ë8 $nHN˜ Y̖4|"ص&HEeԾ#Z$0S g!gHxL h6`ڳي=\/qMaf>dz zThΐ@NwX|J\=R φpC86AnKn/kP2TmIm|p~3&-(w$3]XD',ڧpcc8wTSd)舊 t+kd& T [H&,t9HL@2  sua_rJC`M:- fxEX'Xj'9/5D/#y]8z1.XB; %yxAfh&Aج˜㑘. n l ٞI& 9S63 =p}`o𫟋=Ob)I03]ȮB ?ye?8~<m>ZN Zqq rOTNP=ّrVIg?O+2χ1Wf{χ RNfk%OMY.2ΐ[4dMnm>Ӵ5pqa5縀jn 7.&ൂ,Sj]aIK,CeTAt^(|P[2" sua؉s\ax{. Ng爷P[أ>3nȯ)[;ftj5/|n E H密 :S8 Ekn~Cjts~6(NJ΁?,\98NE 5+tzJm¢ Snqck70KEFF@ ZdtYT0ZDփrE4Ԑv@k|ykD(m=>ՅGȡr=D:dmie,.0Њ ZUоTcg-yXMԂ xizRj>yCCz4E 1ê%PTD'́0hyUp|(݈hSj@j9G9tԚq$`fGPUnu+sNQx|ɖ (1}BǮ`1KRe\I7w4lXH@XPYMװ:VlSʹա樰2hoZ\8d;=pUl B> ґH+fdMxX¨ n/B]H 9!ˍh|zâ)7Dz|E6..[\=oB݇(m L~6.ZglǖҞqi*]UQg;Uz饉tGUlSO|QU4 ez-Rp:`g|:A*q7dd7S?yX~!NS'4qQlp9A endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <>>> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>>> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <>>> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <>>> endobj 33 0 obj <>/F 4/Dest[ 34 0 R/XYZ 0 960 0] /StructParent 1>> endobj 34 0 obj <>/Font<>/Pattern<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 70 0 R 90 0 R] /MediaBox[ 0 0 1280.04 960] /Contents 51 0 R/Group<>/Tabs/S/StructParents 3>> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <>>> endobj 41 0 obj <>/F 4/Dest[ 42 0 R/XYZ 0 960 0] /StructParent 2>> endobj 42 0 obj <>/Font<>/Pattern<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 111 0 R 119 0 R 121 0 R] /MediaBox[ 0 0 1280.04 960] /Contents 92 0 R/Group<>/Tabs/S/StructParents 6>> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <>>> endobj 49 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> stream x[Yo~Џ Y${ AجXH4n}`usÚȬfY7I~r^Lo[Y:=7bvq?NOqoz:y⻗c_03pcd{ ]ϡ[WzS:s } !hk~zc>'ڒs%G,f2om+$\E}w0 35[YA̯>\}ͮnY;)k-&Lhڋ ܼHkLC];_ru}bQ5vU )u׳˳w;=b.ϗm7sC3K{mt QUy'6ab 3y4#(_Ϯp,.[oox|!M_H9NI|O}RiCg'^#,$t8?\WvPG؊Jfp0zdؼuV34Glw[L-3pֆK] %U>ȾqPUUkb*>PŻs8q78͊⮥.}q0D-gmS-_FDv=iF>'afJ9MI9LbY㩤|aS{zM3gd!NJSt>ND )MMƺ\c]`?+aBH.~!ǫ413j%_ U1\o!h X_ wôCS`3w`9 ;,,y/o_q,:8roQ|YT[CfIA0Z 5Ik!>mX *aRGN,I8W72urk3b`3bsӲ[q̡4p<LHg.#LĽ7;*{R*F M|]ҹvvcJ-X,,ٍ <ҟUK9zxr)ӾY:ק]hYQ$Z4F#^*_mɨۛǖfTi~4oޘlHkSPQºC~+!Fp='E:C4T2}o`3&(C&ͪ/1#0֠l'Xz @҉ F0u CXa,o3!ePɗ(CKgdv!ɍXXXhYaNK8d z(2.\=E!\9 rnQŊ.T s ` U<.Q1WCʑ_/mdfAݘuB[0l.`xB=C".6ɎŁJY`ip:zԱ SU0iXWʰ͘P:ӘpsdU_t=i !(adQd m#G*MEVjPv4:Rw̡RVG?BiU4\9zq;R[ 3?~ 6a92ud?|Rp,n|@m5lR8ά?sav9_ٛ3*m]Aӗmvv|7w endstream endobj 52 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <>>> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <>>> endobj 64 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <>>> endobj 70 0 obj <>/F 4/Dest[ 71 0 R/XYZ 0 960 0] /StructParent 4>> endobj 71 0 obj <>/Font<>/Pattern<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 1280.04 960] /Contents 141 0 R/Group<>/Tabs/S/StructParents 10>> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <>>> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <>>> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <>>> endobj 90 0 obj <>/F 4/Dest[ 91 0 R/XYZ 0 960 0] /StructParent 5>> endobj 91 0 obj <>/Font<>/Pattern<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 1280.04 960] /Contents 172 0 R/Group<>/Tabs/S/StructParents 11>> endobj 92 0 obj <> stream x\KoG  z?Ay# !Y"'$[Ggg&`_&XfH֓_<~>33cvps~gOy^N`5>nQ<_gW4O|ŷ_OϿh}LB3<М>20M`TӘP`X:t}~bF AXz&gј%4wy{;EXdft1қ ?|s~ӾO^ݶOy?>ԭjr̊}5tqx4"1V'N$Ο.^z=zz?Ͼz[1ݓo^ׯiD-kG;0`ƚ )#smO"=%;4FXzF2KDu}B| >$_߂~r]tϗv9%ۜS\cV2$đ32ڸׯq^|=$dn>i1+N ̖o6viS48F &#RcBͬ,eJIy()Ɏ1(@:\nZnt *pY%YPYR23lu x8<-g:4) yLZ!+L7d_5a21BQc "% ˣAJL 4pcHN7[p'LμoV0^P;S<ݞw6O9vs˜9P]eFt[ay9 ApAڍ(nIiZEL +bbM{t}p|5hg1g^[#[SU8**?޳3{3?EE15U BҘVzXşbRjeŌ7A.:{8"Qw)e9U>VKkp03,(672=і%}Y ko[{э!^ #ɵ4ןvn0?ʩ]:M'VPh:3,Dŭ.DF3Ne\4)wI4ן.d& o:~OC:CG|K#/M#'4Z-N lbDuRh(4jLgDX4q8핕oY=I)[IzN'Y2xY6W#dK\]Ic) 'hEd,!CIQ$葩+̻f+!la+ȫ6xײCg"'35BUTXX{|4U%պZ o:~nݒl>TI|Kͪ#h?@ QWM14aBNc$بbW"]+ eyW>!V/dH M6R\Db2a0sf#Vѥgڬ4e( jO}i$Y`'( q"#CVǓϤ53ac}ldmPf:9dDLp"푨U:b''s'gX2Q4TI։W` BGxJVN4E+F# #3 (k"{9n42B d]"y/rDrM#u{vu֖`+*SVRTa1 !^WE:xU2Qux[FO඙ ,[DYM,R44)C1sxN MB*) D@pV7"TA( 8K86W.Eq3>gL[I|-yUte Dh|ĉoM8HRM2Fi[@m!.k.3B%a(j戮HT8Ps* ѕ}_6o ^R pHٸ6.u@**? gFj,kv.nX-n0# JA\|ánn=1F6;HRlNgD7ɤdaGlR̺X^ѫ!S:'S5*"\.RHz9/4;DNVEح0BK,^p"4ojP0@}j S3ɀP`EcvnjPE8pw#2@P;,5 ,"7wE;BpP(M,vKsl;b#é Vbe-ru0җ4lvp< ,6kA)ԢfqPȇ*t ]v(1ݗgf>*Wr͉dZ.e@6b}elL+YZRC]@lzq[!ES <mrwZ7pKe;L7mlhJW4ة7>aLovܭ ʛl+I/)EB1MLsfl m5h%R#+f15U#i.գc1&sT-Bi`ADpj.x յ;޼JZldD$ftS-)]A|bN2TC wABݕ[KYCF\ŏy͌hQVoIriIQᐍ/igv{nt鳔Y+AC7){d٣;M6d>['i58;K-]r)*جXX?Db;7s: I,Iv uBdZ04tXٴT#Kv}_q퀜c6r6\Ñ_1jrOB A{дlWV x&Z4#o3xvS7mJ%‰; tV QZ?%T@χNą̒O*t-@\{iy_qFﵙ?]#WIZSYt7{돱'hwEWL;O'j'ٚԂ([8z""[儼C1hDE ]B c9J4KN*~kYV%\r|d_k' zS`gޤ\l#mQ:،ѯAZ27#겷RPBt^a5a҂V%*7g~S:8r&L`N#NU:USd{8g EM`NK= GkIi1С6ٲIF:k>.<~BZqw6!}ܒxDYu@!-+m@x$&}cօJul#щ&s첌=$=k؊WM$2C}!lelݼ[];M?F1<L*hLT_MRڀ} }ڊZqnlO"[WF#{ "QPߑ0~}`?=a)LᬳA9Tњ>+ hɹFPl( APBoIRاd N'wvqxkMN4U#sNBnN/Jm* r"g|gۄX&pB%&AT:^䫓uJPhtsgz \wn>U;fmT< 7?WR=Dld ɤ*0%S!*s^Q@E4~)&G!jqK~"o+"2oQ{GK VƔv"DcUxN1Qو~2D]&K.|b-'V1DmH=Q}dPW8+~&:[8@;]L@?D\dk%aPF];_L#Z]0[;klf_\_z|;9roi WywڋK/.1}}Э>|Lİ/1sK_ endstream endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <>>> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <>>> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <>>> endobj 111 0 obj <>/F 4/Dest[ 112 0 R/XYZ 0 960 0] /StructParent 7>> endobj 112 0 obj <>/XObject<>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 1280.04 960] /Contents 191 0 R/Group<>/Tabs/S/StructParents 12>> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <>>> endobj 119 0 obj <>/F 4/Dest[ 120 0 R/XYZ 0 960 0] /StructParent 8>> endobj 120 0 obj <>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 1280.04 960] /Contents 195 0 R/Group<>/Tabs/S/StructParents 13>> endobj 121 0 obj <>/F 4/Dest[ 122 0 R/XYZ 0 960 0] /StructParent 9>> endobj 122 0 obj <>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 1280.04 960] /Contents 206 0 R/Group<>/Tabs/S/StructParents 14>> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <>>> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <>>> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <>>> endobj 141 0 obj <> stream xYo7 n] D :ilݹHar(HJ>uͷgH0qYߏj<:}uff<vU  B@-{ͳϙx=} eqף5TFr%[ϖ5!XSpkGZ(|7y?y?pR.I:b Bs)H"X:RUCGDs\EBHɽLRP8R-jlQ >+ , _V5Od{=5/lQh:`.T ֱ\l&͔xCH0v ;`'C6t*L8; TWbiIKsXaysB)=W>#T mDB܇!͐fo`UXh:W<{2- XV4{L(.[Pg9FAOM("[MvCMRj(YQΠ.h@jpH||sbv6r?K7.ÉB-jc^Mۉ7xn 3Arz$/|bљ о@Vx];Y:"b ŵOm.pmon"u4B"z'!)\>ח;U)5:Q\ք !%qZ酠`d%.g'QiT8HqZ6 $BtPg ꐪEP"SBBH5eT1k_na |QF !Y4fkg͵3™P@%]uf""ke1Zz6e5Ƴmy3NKFœUXV"P~m:zu%ˀuAKB!B("%]%">s$e >d6#S˅Ֆ b8bD UfD jL|i1CRC.tR`֢BF V#0)S mo00Js"O50ozԕY%ttFTHFΰѺSLY,]jd -BAoYIG72-v QĥZ$ dC 0ip ]dI)ڄ$LatBӛуN:B6,"x7މ2iEЪsa%]R\>ZZbquI/ـ^YiȘ28D y b<ᨅŖ IJafsto0mBHEavPdFv!:/<Ћ[̃qJrY.W㬶.y2eA줣GxuX`C[W Tt ډ.U Bp+㋎F q/ endstream endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <>>> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <>>> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <>>> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <>>> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <> endobj 171 0 obj <>>> endobj 172 0 obj <> stream xZ[[7~7 `.3_&M.Z3}Hp4ؙ'i~I93~ȼ%|O$/}vz!?I!)F)tKgR泋/xwϔxWWҸ_gK]\,?|'7߈߽]|z3 {9hjN52 Lz_[v;Cp*xb̂Y5Й[0Ƙ5ʕ\09XWٓXe˛ծq{'ݳ^.ycT 9eϯt[4ġ`M@#@1j^ba,-nkWqUϫ~'B5p*6:dP7 c@qo8i@%yculf`362d>d͟hjMG<ƁW$5~}}֯,~YNl}'"/u#}m+бIQ\@ 5 hJ8hK3"k7QQIƤxq|fYܾ_ŇWbzT7F,Zy_j;lionOK%돛iAkbAg0uĀKZ .W냧rKj28Z}a3V5NE? -:k4ic '*C18 ĵ`tgU@ԙ[88?)kno 3J&<K fl9 m̏bFjw HJE[LEȪl_5??Nz),dȏ8L?8SШ݄"Ȧ4 el;;M Ue 9CG2h7H\(ND"GpW1& &"Z];_P=rBdO@ خgNjum1\Q[@.O"`UK+όY+ V5?܂͠1SY9C/-fBKJrn3ҝRRR`omCfO3ȆX^uk")ѳ;p;)(& "քYIHj:jr8Bȓ?f4Y6gS9Uclyf tV) 5̝Pq{m!UEZR2\46ܜcS@y¤J6`&` 1/tRS~ m.WZ,QL4PL9U9LHOR3ARQzyj #O .:u"8{ATè":#FD,'"BVZuJ 勻z~B{w`Jq1%Y[^*7)^Du'֑~ _l _AA$v1$3 endstream endobj 173 0 obj <> endobj 174 0 obj <> endobj 175 0 obj <> endobj 176 0 obj <> endobj 177 0 obj <> endobj 178 0 obj <>>> endobj 179 0 obj <> endobj 180 0 obj <> endobj 181 0 obj <> endobj 182 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <>>> endobj 185 0 obj <> endobj 186 0 obj <> endobj 187 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 190 0 obj <>>> endobj 191 0 obj <> stream x\[o7~Ǚ>5IE 6.V)"Kᐣ!g1=- :>\(Jzd0D1B q%F?Ay8ts|31xŧoN6?l0:: ՛ WHRRI,+&#{S'wkufG4EonQ.7&.7|(;Ѹq.=FQⓡo18EJfd3Kpx,C?|JU!8G0R/' $8N"ET% x7?WqF^)TkVIՌ~R?{C$n~RzAJRF\/YɈOu8Ǘ;|)}/wPG'kp ֻI[|Kŗ;~GI @tbMPq3lPк bVxVNг⪪}y`ccJ 5%xXtNȨNә2]'Fu}u#'0 5QcTdԎD}##+1 4iQjdT} -awm}=d\\dZI +RfXZ003pT򘉋J90$k~ \5zG5ߕGxؕ:G%Ž<\``4k N Ƭ陾+uq Ӭ5:C0x:\C<;M6ll2l(%]Nit\$6JM5?Dw74-@(uDJ';f茭s}iP,Os>?aiqt6fI:adB~H|<`5}0hvٴtY]OurƩkcs \+u86GO%Vplk~ˆF\4^#B~>Nv8TˊC|U;pfZc \K%X"k~Z) .= /=}YT*rzɨd*[5If`lNoԆNpi]s:uR ai9:ƅV=K3^:3NE `G4nX%%ͭ/ͅUmg˲n/ S5mEM$ˀȡZr͉4(r?JY\67hy_RVSQïWN/Vo8[ D[@j#^Enf#"zI\WƑ^fvWU²nĈ6uҜZ}vH"]NxB2 ̕O$1`2 endstream endobj 192 0 obj <> stream xwTuswd^WdRZjMN^HG*br q+P +ٲno zz\/1yyy4iRVz-''' ggFÆ =nK. 2ԴA'O޹s5$$$ܾ}Ë/ԩӫH't>H? CBBO$@_effPJԮ'??X̙37Vӧ(?nccӯ_?͛+V8ec*4AX`}^5kꚘ0yyyuya)>kJ1z)33SD:t.o4͑#GJz>+رcK/t֭{ j֬)/^СCeDݒӰaCy_tWTT駟8p5f̘-Z=/n˖-NNN\  |7E]m5jT @{:uJܾ}[K.AOG %11T}ֳgO=>y{{KWȻx񢕕] 33Ν;!Zmƍ`p-Z!]-]\\+ٝ?^:Dԭ[w߾}`@nGIWhoI&`@j֬?HWhBGGdzgJA ^t6ZdIݥ+ _^Bedd޽{W:--- %3iҤ1cHWصkt<;v4kL/88UV\L}v |hjj&@%&&!R}7ot=#]u%|zɓ'&::Z:ZM66m,YҵkW hp?2RPP`oo!PV- ,hBa۶m͚5KW@7~:ЩSCК5kJW@ZsJӦMk 蒜 (zĉofaatt̜9s']@Oo~͚5=iiifff ]tҒcQQ2'O:tt׽{ HW@W%%%Ka7oh4YYY!aF?~t/]IJݻfffܛ/kڴitҠAO.]}6!tMLLRRRC' 0c :{ԩw᧾s֬Ytה)S+o(==]:w1?~,=g͜9S4hWᢌܽ{Ԕ c<[tt4ѡL 8kc<[߾}+|hnn+\;v>''G:o^+Zjm߾]:ӓ'OlmmO<)YiӦ ׀HMMR˗C֯_/] 6Lx/ZXX%t2^j["-HW(C 6ܸqt,j6G.\P&]]]+iӦs`4͕+WCҤIUVIW(e4it_^JxСCD ۭ[7 #;;ɉAVZu޽!Jqz-]ѣGmmmӥC3gXZZ&''K%=d %;p *tZff]XXt2et8f%v $ <:';; J9::!a}JѣG?~,8p.--M:(e&Lڵtlee֐!@˫Y C77)SHWe%**֭[!ŋ6lXPP k֪U+77W:SDDDh4um[ZZ#r@o;wJ;=Z(?.\077G_~~~tP֮]mp!++X@@+Cw]333UWv/R:0\5jXrt )66ʊ{Rڵk7uT @ɓ'_.7oޜ999qSc<^ZRSSC-2y H￷stuz1}"@EDD!6o޼tϢH:^ժU5kt߿okk$h''իWK&>>yŊ!n{ݖ-[C^VoܹsC]ru331cHի/Ҝ9sCݣr3d@=x@+@W=|P폂C]u=yI-**f!h4˗/Att#{rĉJ*q!P~QFI!$$_ MJJJz[p*U?^:O999;v[.{OUPPPvJznĉvvv׮]ˣGRk׮-AضmyHHt-MLLCrGGDZcr 7ؿt`?~ܪUJ26mڠA^ٳgWXqΝ!@y۾}̙3CԩS666-@yHJJڵ˹s[)++kaaa-@ꫯ*W<~OqAGGǾ}>~X(}QQQ5bCh#F-@IKK;v-^+H]q5k֮]̙3- )((P+*Ux{{s6nܨ^ƍnM֯_ )_hѴiӆ .]iʪbŊjUW hWFcWsvԐa^ pGScN8QjW ϟŋ/]T j^PlܸQYC͆jV_jBQG׮]=<2d&\M=jV_Qj7oMe*l޽:vٳg|} IJJRS6(k999j }ZGDD?~\6jj5ǪUԎCm7fϞ=}whF}'S۶m7n,]hРA+'7775p=cy-ZաM*TAR*U_+3g:G I-N:%]?ݻ}{ҥK7|ӭ[g|15 endstream endobj 193 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> stream x[Ko# i^4ߏ@#`]$q^S|te`%ȪX?}Y_\g0NrNpIoy~Q,STf%$4/  ppG; F~s2ZvҠЗ2~>4͸TX;p(I Տh#v RڻCIkڬry_?v-Yqq)If `)&6grPe|"s{(J+%|O&NQo?%5ϔ>\u"~-vqyznX ~M q~u&LK^3dJZw\ *jf {F q.[X+_xYFrjYu*OQk>aVo>xz*ml!VI (DNcM 2rZ~ȩʑ WoЫv:y?pQѬ*1 bb S_h99=S^{SF{48.;VPQHRբ|.A7D:VX5pcgZa`̑mY=pY">,Wg9pSc,c!*4ZVBt8ht ^|yĪ 1EC1(F-()X<7_5EJ)*iλF--}ynik`Mh&V"^ucGxy)f\wْu&9)<~3D <ỗ3,Y6\ڀklGk|'xA/6~GVs` vd,BUF"?5==Q~F0 <6MO}|8w&Xmʧ;z1\U/kbW&O痫3 ;H#~ivԱbͩb@ɦE(UmMq h,*MOI ,Phfb/Y@N IG&z*èx9RN,:jUkTɃε\+ p) UiZvmuTRNt{ 3 o U'$sGRG1~M>nrS7њ9Wӫq_!8LVd ycaL=HGأZYWqZRs!Uí"!HQr}Q.?JZ%GE=Q(>\e %դBaL0Q|Ok8 JBQ }p(\א¶_A2b!X8 Om tW+jep$f[/KXc[MaGXZ!viK [W[1$.%2ʫ B]LN;53S69Li)'JϐbT1IeX6nR,ԣci7m* q`Fc\lasX; /`^R}&?cseX 5>[^(8 4緹z&>7~RI8ٮzͅݶ1Ul&X<ϨfJMk4ӮUQm` D\z&B:z&#JlڧݧvS0QpV-~ZG ݓ{yxwotB~!/<\?)> endobj 197 0 obj [ 198 0 R] endobj 198 0 obj <> endobj 199 0 obj <> endobj 200 0 obj <> endobj 201 0 obj <> endobj 202 0 obj [ 203 0 R] endobj 203 0 obj <> endobj 204 0 obj <> endobj 205 0 obj <> endobj 206 0 obj <> stream x[Ko0Cزv {H`9,+F,c/au%9x<&*b~ruB>rN=1(c;9…f>;&3Nn0Ùԯ|\bv)4Ւ8橗D1 P@M'I`Lq(jK92F7e,c8DNhWA̼60;i@ȇ02p?}fj*UW$rEaw\`Ǝpȥ;䊄#ՆVg#agܒfOzM>|lwi N!p>ZAK? ÚrvkPiERmTof)OߛZ4jq4Kx"˿gM}#as)Ru0mrPe|6s{(J+%|O"Zן_gvx؏:j-vq۱ SÙz)VLڋ |zWL)}W+h!.JfɄӽXwJDck θ د[|(#tT`o^'@s+DŠvs /d4ڃ}XGjkܹ[-:'}ˠ` =1?paa`88ևG#!^{  }!*4YTBt0it9⯍^|@͆ ey #Z#WO_t5*&SHIλF--7><7ܴrLU+nA4 ]`X` Q1`n7r\ujpxX9،$ '8 #}i7CYz,4b#a~]- G\g6D1__+N2/Krsfjsryhв)q震!0DGwYel:Qq(wZ&wEq{sϵ3A蚕98F ,,98F8c1p4͍g:Yp~q,8G? αm65T;a 7.+"ᨅڛ#rE{cu+QP_z]XrޟwL9@UJ:[boHȻ.&]^UhVt@kmij:MW\DЬ⫳UhVT@5+TT/q@&z(,@ 5|݇ԒeaThR\{VIFٽFowuvWeIcJc+} ݟbU!m+)%S-o ha_{YR~Sc܇S7jt9;s񪓫Riܥ.:Jɀ`&q1G ?jUyZВ* T Ñሳƈ(K]~%3FEpL,8G?Kq JUn2q9jUS"~#/P;H8lb+4_WxznPǩ Φc[Fp__),0iFj  IbL.Xjj]xf B=`RǞ l(Xu: yœ_e樜vQ-~SGkvV${Q<x4iƽ"x90HaMq6{}N?\lb#Uԙ3AW]Z\ah|V5gTjr&k4ӮT›ƕR%~ٰb'E^}ɈRi]|IpV耲~YGe{+y|)~Izty 8WcwwU7yc__t)ub?\x4\?Cv endstream endobj 207 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 210 0 obj <> endobj 211 0 obj <> endobj 212 0 obj <> endobj 213 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 216 0 obj <> endobj 225 0 obj <> stream x]m#q f,q|]>b<=O;;=;>CUKԨYJvQ7*,~eS\&>er9߅<-~+OǧKb;N0I )%2)Ҝ"f!`PVθV9w7sI0cPYd s8T@le 3y na@La)xwSJ) Ή pH2\p2!Cyq!HFFP>Mw<'byPAa)Z2Wb{0ݘ`cLE3;P΅'rNEbGs~Yp \FXwV#Q JMA:L]'ap=S-TJ DBԊDB)F@56FH_- aDerz<R8\Zjfb2W SQ3ef0LygPG.3+2$0ʉ=5ᛓ0'LQ^ԬRHG^) %Q"pc(IG&p.$Qs0*Џ"s9G?Bfl \nL3Z 0~DKMc-`ލ@ֳ82]5\(Ȭpa|5wpD/@Nj#P(`05<Л#`k 8,+%0E敞7Rzz)ĂDhMGF4FGkH/!l ϬeB`jQ$Gs1׊gQћb1B)Vr?̫IyB-.i5LYJ8V',z@籜Ӆ AOFM LEaLQҡLWKtpP;fPGJhf%M>cY3%aA13H \+gޫb0bD933-1*Z1 scW uc-,]-r-Rdܦgfb:2 P2@ZA(eˆJp.I;C F&m2r!֑,Y!+΅#N4i}sI5ͼIQǣZNL ιV<9tF<%$3՚3IUl֪̲kϘ(diI=5ZKt2RKi0 B[AwQ[ja IᆱXw߿{~}zO7|s57_>/^/wtP̡px{7/۞/ϻu62(8Ǜ"ozz_?r/FɅw̿%=WZŸr C3g ^ܾmoMfڽ6GmPs¨ >+M.)9o9SpY ^mFԨCߨCKiԋ{{xYIL0ei,Eew89TO3!p<'(1mu̜Fa^)_6S=&1.ž34gP4"ԀE78 .'(5dbGLnC3Q4>ɰUfh~{~/vp;XK߂e$XmZԱe&it<'?^^Z [MMn|lѴz_R;ܓZ1~~(#~nä~~ UJ]Tw? `q&Ϧ$s_[$"dKr w J і0L&ӹ+X{RzH;LWmtvϟ6 h19@Q*}:؂i:IfE]l)1Ab>޿{{g6m&'J0VKZOKuD9Ed(*ۇǻJ~sb֏ww>&pӐn7D*(C1)Fm #3q`f؆uց802sGfng#3FfnᑙWPچ6iC7>?"nZ 8K)2Z4i~1D{肮_Fo<޿>|~i7],gPTn,uw]\Wօ_ Xs5XY:)s=O#NS9甞SzN9VUȱm&+ӫ{}køe%'֔Èp'}pqq~Lfw%ytСd{7jG1N03V;KOwǽTׯ˧%oG`߀~O00뺭~qiD5w݋tX ?Io x_V?] ޯn^vQgxݽ6:o>yA̸ToYk?GU&^ os22,O(כSd"-è a)?~PW2;+6fjŋL3E1S ̴{a'9v|͠v袽ejIdb2F<1rnqq经_to週M ^]ӊ]0jkCgMγ]&#s<д%/FlI6<ۗ{ ׇi@qZ6GZ1i |v7_Fw/_>鮽†bXsr#iKܦstdwIՉ׎x-JvkM/Q|{g=ex#D7> AbAK_Vml nڦþU*Z{FPK3˴וUۀlx8 gRq8fhSaUxY7 Xt?A׻#Æf֨a]#݆l\ t#VnJ (ی,VH_Fyϻifr*/a.atraj#%,aݴaf֨a>^999jc !vU~ ꬈UmۯBjԑgB  Ob m.m:H)aGG|_Q2_myPL~6ұkI I+C6ú4-Ќ"aR3젙fArѰa셅d1|dH m/- ;[;<{Fy;N\}f+8su=WAbA7QMž쥋b8H-kHk;d&43^Zv3Lxs_G )*WK1sdqZط:JQ:X:N ʕgnX.P>:_ޫ3@s˨YzMgL\9qsg *A3˹5 3V04waݖF-mFgNĹ4F+wt~u‚W ϵwpwtxfv8YwzeDg,zQ~ȥ福sD?Xvw2xˁ7Wˢaޒ72!)j h:cKX~Y_GeyA6}4~KhF I7R{ko$i:ʱiym@@0ϻ/D8h'Ӻ8uq2d F*2V 7&ٺmx;K(#SwhjgaFb{drN=282uہvoXùlva e2fA4n[8)'ŀ5rc|G#Mج(kw`;~\4Z+q7ʈ@7S?cɌ'fNoVWbgu劧b'?<ъf(B1cTEMåx,ͬbuҥ烶ej4C`ꂌ2keZYJU䥃Ô&//tL5ݸ5F)V+ io~]%}XB5CB=tOOOODHieZoߞ:#dvdI #1%Q:@>w6tF~uKF+eMTbtTę(S3kԊHv\q!!7x[W'&FOLܸA.~eV?)o#oϓ0J7bˍF35B'_zTT{˖ӒqOt~C;]F{^u[㺁nݮ6Zw6_][ekg]_noBOsui=QFsui=QFsui=QF}KkNkf& z݄upsOE>}Y +^_ڎvt++_\ { 5;͛i]3+[XG\ <1?Al}0ٳͲgwe0; ˀ`, 4MtbG6ȍz|K7=i3JGj[M&m[+vSKj2:}_5o2Lh.@F*䄁hkxRixv/jJ]D;}^4$$ظ%HtҚQ5fizv3RhHAkT靈3vsDEMn_@N_ x`>z{~xY_nR=#hn'HI2@E"C]Ólj퇝δeԼ~ɎpJ1Շ %; 2mPn2}~ 臟O7egpN,WT,,7ߘjSA,먥fEvǟ^)AOwu[WD$0Qzs@MQ Im?:YD'fKm#<ܘoI1Il/㿒v3.M R , $J0o#ٯKa#KmFQ0:20L`BL#S;505t EˁS;au5huLן1a"\r};o ᒶ -mUus}w.+7ZݮӚY嚶v+~k$i i9/!%%O&#$O4ŷAZn,UUj{UgSmCmǤgt.UU1@> endstream endobj 732 0 obj <> stream x]mq a{!+0 1eB yjx5FB'ں٩ꚪꧪffKp˺Z..xY,q 9,ﺤB^r)q]ꊿ_jqyqD1,EWVEp$@U\q$ bY\ү<^!'AN"aBS!ƪK@1a@ r`,+s 0S1h鳐=/#-l_+),4w KXXq *(e \u]4AA`R"X?B^GT\F@rM<Hr%PHD* "ƈ8 {}*Yb㤂źdH&5"|@@|NuE10+.; %RB*( pLtJuyI'VT ":PArTɂЫG^1*RNYӯ u3PVA`JD^DzJΘ21Wi#W cVFB9`tLEkDBPΑp eшU1 ]]~jV50o%A"`ULuU*ܚ Ʃ P~ 2)SaQ~?{J ƊG1/+X_%#Hኘu!UA"X_vbxR%ŘB1rP=D "jİ 'XlpWGle`#/M&+yE%C(CRӀ^G8IR@i9Rq ]KO^†xމNTUx & Jy#q<.aZ90h!+(&0D|ŹNUdFBy^"ؓ8}zRkda&t(raEl 3OX)SO@ {a xL6!귙#1B|fa|E&$X"LPG 򘢂 0%1aAR]洈1o5y/nLX\)P2%(1+Hә0~0lA乴`%PbH @qF;.1VRJ*h]J] 縅 <3*`!cCq:%+yLW|j(8R aE1S5!<|y䍼J_@$ϋDyxWI !nH,IOf5hT#@!Ct ]:`[PG-U)L+rGZFFV˹)Ncb8b $Y8b /eK$a4Ɲc 9Zҍ #•0bZ@XXHj\JXA -WnxE:40 HjHG 3}h+H&܊pF ,tsѠVIj Ac Erg#$e?* N=O4 ,H I&VXS_!XKWu=)a[txj5! ~W ќ'h\J2hã7Hk: *,THS*:Fab,ʆVHduF $:+$ idHFaf?׺.o\<_\?_xo^ܾ?~o^~w{wW.K?`G1po?MR<. V$}H nO^7(9Q߯:.h5^GH"gI{I{~7Z6 uOW?ބ 9$%92p,-e>=pEҋՈ2h,-r 5̰RkXgp5s Ɉ9Z*MK+àC٢@pϖ>}FqhHbmjܱТ5HNH#ރT轢%Y|4`n>h=cq1ih<ho>GXPLdط4da}"},'aC T=:(Gy1[{lWQ8{p$=h3?eklyXȧ1-|w?k)#Iimwd:aN0 %bGG9!>8>?>spkT)Akcl`v׭k>m`p Jk Z4] x,kԙdKa[ߏ3[9fy2l{o˲l+왮ޥgg[a=dL,Yi7R}vOz,vtDvjkdgkv 5&ډ31v^vMnvCJS;3XpK̦fpƔ{ևr=e8ٔ= ֜ao#71֜}meMw@"5',D1m ;f _o^}UZ.ܗ? =kqG9=t'\=SM|xcAvref3X]ܝkڍl0XHttIH6BM_=c ;G'39:;]YwS7/^߼{_?ͯFd'Hr7fӬt'+JhYu}u}e{:J_}ٲ] 7lǨdlrS1H^/iwiiOHۤ_n݅!iؒۼ-m^4/m[Jgudo?O_//˛x,^T+EM,j6ϓΖ?56]Z[^UZI˾G FXbbu44ܳ@ݾ6mawcdfFLڳJ4 MfgC3vԵ=O]áw 4KͶ:jKX1o #5rYbo3-lLHҵ=FfYoo_>_޾~}' =NJ~5g׎H7oZ ӷ 6ŒCz¹=)6diwmH Ymȭ虶g} mq0Q~0d-GgͻYhzjk'|i5 363W8 ň@Ԝ&Hщiļ7Mb&t K0L1X_mS.itm6Ӟ\9~F.즎Rib?* ;Azְ=^ ^ 毾и=zN_d܈.9tϱ7Y*|y#wyɌ4ȳ]^_ۯVk˕O\-ٲi4ff~w_M1\/7e[zL-rL ge6"pKvg|S?W {!m$NdY}DdY-2-ROWWW+ˀ)]Ne@^*>DCX[ψ''/Y^}R>)kOty_@t.Yd钥KX+s}yýCQ[bS;bfcȸ;Gy܏w̶\{ޖi9M /3[k k܉[q76hy{kY8g6glM9Hi弽W3MMa0 43raJ)(0d~u{[Hȝ8N2:6 ?{ʣuɎdq YfdqfݵF~OܰL Km%9g]妻86ӴqfM5mٴ7ٴqi)FUvzjFoZ2>O.v<>3<0}4\yqS}gyMayt^u6p%qfM|%>Y:ѫ Ng#z{;{uZ^w}}}B8)3Oe]Y3Rg~Z?aT<Ƶe'zϕF/,KǠav ׻w/\^޽p{zYOb؞e~})m!*mGbm,crO*poI:՛O8SتtSc ͖3u^ֶo o>y]zzaی)w'.hyzFp{v/lf̻y^{$f\K~~f:?Hwx<-2Elsn]n\]>bLz1vhQg:0Nohl=Z!e:筞gzxVfoƵe? /?/)#Wߴ}M;7|ߴX~ڮ[~mq/ endstream endobj 842 0 obj <> endobj 847 0 obj <> endobj 849 0 obj <> endobj 851 0 obj <> endobj 853 0 obj <> endobj 855 0 obj <> endobj 860 0 obj <> endobj 862 0 obj <> endobj 864 0 obj <> endobj 869 0 obj <> endobj 874 0 obj <> endobj 879 0 obj <> endobj 881 0 obj <> endobj 883 0 obj <> endobj 885 0 obj <> endobj 1250 0 obj <> stream x]߯q?mKrf.Z$Ud Kt8@͒{m]qȳ5n8{9ΏCrR^e I-ږDaJ%D"yIk!K֘J- Ey]򆱨,9'da0NJ x~u9*o2$mLXKIpHO&z()vD,+8g0na*Q_~uՏxŰ,: a(QYl˦ʹ%n&Z$\%RʔQ0  EDfKdSK)J)tQjC͕_f}ڗ%m;vaIU q)KJ;.AGT'6۶VP @)gSxܴG1nКu &2m!h])6n6FQ GMd ʎaT eWDcZ 1ƅWxPTA<o>CԐqQ]:#34oDd6glڀdζ734k`$$\B f+v-HTK}hED2KXhTJio`I@BLfX 5sA<)r:5p@j`| Ɩt$G'#6K'82(xh,"`pAsby$R놜eA*!+ 2H P r "椄PB4D P"`h%'hKBw,DPFD0lNFI퐱 J3ۼ HOUhm1-"| * fr BR޲ŕ/ nyM^1 T_Ąה m@XYbIaRD՞y&fWImiZ@WObH 3fbi5дr5mP@3!'62dss aU&>oB2^ ="# )iiBj 7Pq 4Ca̲MHv$}TS&NSBUv!9v'2Mmn!DHÎ赩1_!I}Iדu>H5{3.XH[I"d[&UY&Vj&oKCZ,Tm º@dZ fR ˊKNM| @$h`msUBj} PB3J*LH1_]m f,ŖLI6 E RاڍVݖoA.jM'$OYIV-+խtgY[w%>|4W!,5QH;coV4 6ΰ:>4ܓ#retPdhL; P1[[0$. P!$m'AjRI>"dz@v:΀0m1pD¡k3Bl!e 7ȧ 0`\%ْudֱireDt.(` )"G&[Ƅ} @5##ծ)ڂo( 6c!fB3b`Cmg `T@]l _I@1U(+"r%@^ݭuInLfMHĦ`ZV){`!!",h]V^}!-+F+h!-.VWJG!:jn2H8hTFv"Q2 "Ț@Ӕ Jf@D 8JҨ)R]l A8i? Ҕ?` U`{%QC+Rb tCı #WfEsD`&v !NHhn\TM5Yr2[[eqXqb[q_P$JH`mikS38V) ey~._>G_ݼy?<kywǏZoW?vxd5u{Q3Wwn=}ǏK&&|`?+bׯ\<^XLp]UavbN` k+A(fh%rɍpbU*o^\Hl(ؿ%}XJ=;6T/j-ֹlRB^׹#Mu@7ޜwוt5@F~nn^{-?<}oSI~`Un9ͲZ4wsiN?h;#EإDq2oz Ze!C,<)_=P"ˬg^}峿VH9u׬$emDkh}ݻ7:N! 7"Ϋ?/7oo7Ooϟ-=sz`'f"vՓ,]=jjQzv5QwALM"N6V{ݧ es d^Si&P?]ųi O u!L؎c;n=r G2c%}G( kcqW!CQ U`K]4`Z[:b7*ђq$S:k=s??).~:8Du/KxW; (]w SKxqfK=3;tݠiX|<c]}.qGlu]OH3{eTvi\[ppl:s9D0[ݻ=mJexvNkRPCetN:6i8:6pEGpR*fԈ9ekhm6ӖNY\G ~m?L?뙓yy@AsN_S){Z]G6jÍ| [#B#\,-p\dS,ަsFA:8D|?k송yh@;E7y-2>;/HGUkn%řS9"v'0 Gz\;)tuk"Ɓ[r~bDkҩcݰY{GnGM!n8:On--l;H4H4HDE<[p iъHɯ̺wũ=sԝ*q}Z;cksZj)-Ϯ9w9Ls{|6-4o5onf߽|ϞxWwWn+*VTHTha]n+ޙY#m}ѓ覧y)n+My|\fCqݳI5p+i:Ռ꼻bH~!onn5/ْ?0ݦ:n Tx*#soқ~ճWoWW/ϯ^_S\}}՟#;Yu3?BnQnN5u] =J87:swVȭQeGw"ry o^c/eͯ6@wѻNpHid' 66t/(K{QKpeEni^/ng=:{jbjwDv*r+\g}G{.Łe#wGn xO$M>3SȭQrPO^nFqaaS,n!W&ᮝ~^4ͷc):E#JS [9kнEש]x\"CS#:Մ.mhh%ejWPj+A pԉ^RoGB%.*q[Uqh:L{kGDS[\Р|1|vş5tV6!>|elBҶ7n䔄>H-*r+B4u@=]=_=uWQQv휧5:T[#9jVa[ ȭP et32[W;t,FnIC,TAՍ"ZZaPw3oQezAf! ga^ v$vo:AbPUĮgoȃ2 e^g2X~mf5T\UզDŽz=_]'{]\~%#vKF|{+3[2A(L|!=ĭ [M٭q85Rnz_/=P＀-T"@=So_an^"&YWz]huuUJ6/>*SdoRo̓"E$*"[DA(L m\_U[tj^'{ͻaMCwiarC5!P-v7Mfj}p9Du1#eFX?#u 3'/p&IWz]AYŽX#̓#'{y7~%7t_&q @Azݰ]] MZE=ezѼ{|Wi @Azݰ]]pOZEqsTMCkwnA-'z{ݧ-wNdr9qĽ3V[:j_cL endstream endobj 1326 0 obj <> endobj 1328 0 obj <> endobj 1334 0 obj <> endobj 1336 0 obj <> endobj 1341 0 obj <> endobj 1346 0 obj <> endobj 1505 0 obj <> endobj 1507 0 obj <> endobj 1512 0 obj <> endobj 1514 0 obj <> endobj 1519 0 obj <> endobj 1524 0 obj <> endobj 1657 0 obj <> endobj 1659 0 obj <> endobj 1664 0 obj <> endobj 1666 0 obj <> endobj 1671 0 obj <> endobj 1676 0 obj <> endobj 1768 0 obj <> stream x]]7n} ?Ux-E@o'E/^xwc knpFrcX]zHGWr͕Ȟۼ$(OJoȓH-;S|jem w'-y`( Fg#ZRr(r'Hi,r&gsP% }*hTw2n>PDV|B)pЎu uk_[gu {)U̹-*Ծ@YǯɳTɏ2Px8;6jgЏ"|=|ݢ %oQ[C%Z )JDH9P-&"Yѭ p v~C3O*ǥ[+Nɜh ⱉ&dYB3p4ҕpU;'X-E|jh#di4"& 7Un"=f_)/^tFq^2KMQI]IZ동73\ $@'覓'pFIALtZîD .\"QtsAb8HJڛ^EigkB pO0!`Kq?Dk0 NtE0lnBsmq)ZM,®~HR3"q38 tָ$YHrBkIH Yd_Gf[5QF_ ?BRt',S 0* IQULf\ep8GodZRX7<ɃZ OC !!qg዆xDxQdBaC} ף Bd0ٓ nVMDY4l9H@F:]2bB>}Т!T[g SV A1Ϧ5}:B2 0z$'rlɟ~zvos9Kn(weN.ܽ)^_nO~z˿Ni[|=J~ikqA>z0ݡc S[{[ uL߫c)ߌ۵%:x6eHkӭ7#_MYUנ[S\33u8~J3kH KTirE”B[--&m U["1ww,,(|L\Vs~j)j$&tjUaVUɁVU#t XwqMZuVIECOA UO鋖rnPmI2zoZ3]TDk:dʹ@o["NEopM:6u][UkTpBb[9ڮOȬl+O"[ȸ̰4 {l=h}Poc::4nDյV9?Oya0Dޚ~wEps9mԜet{ARsXl~> > Erg2~NN˘W4bl/AVF`IZ }5?t [OE;Z]ԯA66[ pjMMM-"ΪGsὟ[\xW5ҢɻFջ.jpzQ>^NN2QnJԯknH lf) !T[H~niFR9-Hj6ǀFJ6X(g[Z϶˨ٖ6RS7b-&j]ЖUeȖ]Sk խ0D^E 4)TW,#*ڸ{\C'zW4= 56 C׾:S#4XpyL Xff^lMwE^m_PO}3lO_~~Cg;]rپx|k34n7s_!ZLnIЯj0-PK=5Ԏj0"~>jajjn y\ ϗtMs RZ3DU/9~i.I^K ɍ0SJ0UU+K梾 Gkcix){AuX骵[r?ᾎ.u,݇I$s<8VcLG+{2[OgȽZMSKg0"~X޽LXk[rAA-I#߈tS;$[xu"^vBvzeV+{N>ͶH?N;m# XrD+ j԰or '::;Yr G)ޟ/َssuj29su!Hs] S]Ř Xˮgg.,P̸`RC5=`IajT ] CWCfAË#4663+)aeڛKw^hGݜy<ۢr$S<.ZVNMK2r:'x83V;#߿206l}m:7֗=sNqOm8|LĤ/ywqɊhG…SP*VUyBAՔ˖j-\V X_8{k1׫tF?!ӄ4)v€v |Vo?Yп\$_$$20ΝzOҩBJ߳ݻiɷ /HxͯN]aUհP,0"ΪߜIӍE&ũgʤ85Bͤ3)e]dRIqLS3),i-]FOv9m`(&6@pcZ~w82[]ƽv|u^ "ٚ_jXܧW,՛(:/r%^͕xS빒%zA\e,iCF k >wN-5?_+_j6gWIg8I3/5~:ޒꙙ5^j :7|x%h)PݤX+հ+xa{5T-0"~ _VÞ<ȉjf|Pjś_)j}(H>oPC COKj`>v5] GE6Rɩaȣ?N30TcP!T_)- _2q\2\jb7p?o˨($ֺ߯:My Mj g9"[l7e-2`٢wV򦌐W3Bk,Ԍ5Z7$=g{«y|:X|mt7I RMӸY`0Dpf|ԅT3$ܵ endstream endobj 1817 0 obj <> endobj 1819 0 obj <> endobj 1825 0 obj <> endobj 1827 0 obj <> endobj 1832 0 obj <> endobj 1837 0 obj <> endobj 1998 0 obj <> endobj 2000 0 obj <> endobj 2005 0 obj <> endobj 2007 0 obj <> endobj 2012 0 obj <> endobj 2017 0 obj <> endobj 2144 0 obj <> endobj 2146 0 obj <> endobj 2151 0 obj <> endobj 2153 0 obj <> endobj 2158 0 obj <> endobj 2163 0 obj <> endobj 2288 0 obj <> stream xKof$;@`D2Q@BWD"LW3!Ɇ]uT4CiZr[,YRbY/5 Xѭ1iЅԏV|b ϪݖgvWÛ_ox{~zy9]~|7; v?<7,[Kӟ_0+U7 xp/t<߷Uc՛7-u0  ;Mc,UP#B.AE IB6]@8l_|W7s>X~p_G|=yny#督o<{?[2G?z^Npn>r.t~o}eQJD&!Khk" qv777gpڽ9\N?o,;z%]^76uֶllΦUӯ=cݒiڽX\ia:F߯//O|s]tqt}_8~8{q8F-=?Mii~Lwiog}u{RqKV!z/|kR,n:Z6x\ ZD[E K%BjhJ֟ʯiGn_b<18fʴ$PRs\iGOFOFOf`( zpV)TrxEʆ]}qF9 b@m-  }ČH }>CQJX12Q1"OLlXJ&VtsbF`Ō@XW "U]$k3zqH'z8z!9DL`q38浊mj5g&f̐32fAۗ˛7 C3̀ad p3f@̀/V 8fe@ʀ2ʀ'C H!U 2 e@)Qp~!BU@2jzB,T aB$-U W@F aB-Q0&*0V +U L*TR!T= RB:+U`TQ *U`R c* U@S*B1S6Ѣ\* ~*T *`UR _gVXq^ 8lM/qaF7k%h`dcc6B.ƿ]p lO1j[څ$"Ҝ9m5͸fp laAC0(eLZBn!a2din w%09-!h>LhΥb 쮲xMKԪ-:l7-oZ1+?GP57UTǛ xSn*ٍ},J.HoGNRm;2J *-*M$TvA=T*HKYl&ͩS5Gi,㓰Reh.drTuTJ7Sf*LUU4GR fT䘪NQeY*e ˂;YT LɿUe`z(vKp Be.`Ny ̩~J]]А;ۋ|> stream x{{\e93E"37o(7RQQA4AD1sӼdJ2Kim+3Kime̾[vݢv7<3p |3II:}ɑ|sh&}IP8M0vizn)zS>ZO*z_ مDUĉH{VӕG[*i`.m1i"F; } GC.x&ZשU+<X|4N%9i >tN>Fe"v8ĭqb52 HJ:=H,P`œ.č Po2ʼO-e~̗ )"k_۵~mKq;=U`u~҈aԧM}D2y(ǭrw@߂Ms1^ E}Vw>?աɛ4 [n X=oQV ;(6ևVt4j3;a˒zz !w>Wh( ~{ew&hVi/ eCJZʏ(&ʄO%£ \\j6ٯuo_YHkYzoxmKb(R/?R,kXu8N}4^-)-*A>X2i)ނ%N8 lĬ+0> ,zU䃙MFs&d_q2l#xm*BE(-r17A.S]ZlQrn][>dg}Ĺ9G^e.GS=c_ wL\>Fo >JCr*`p Cpd{w kjypnxp+˓zv>ͅ [ŊP8KH'ʷ6 ̐u p'ɊOЭ'h2V[HX-A.:S: ;cw>tRU<LVRѻ/@.Ovƺ }=+ \)| dI_Yҁ)77;~K"߯?7~"lN2%6{(UpԠ|G•,xZ9%a ?.EWxt gʫ8^oy}u]Yowxg ow6K卾]rlNy7"\ kKxTSq&p9۬?6:p`ܗg4X /̄u좏aC< e F >?_qC [O.̷ibm9{eY cc9G1\Jc`bP6'{reg-4:͂,Bs"I<5 FaXevvj~搚v5,;vp&sDR/v} >E6Tx Nhƀ =4Z&뮔cj6MWm(qNTmk ?mjӿ+|8.}BS ?Kw X".U'=H~OY}D71r蒫h&M*TʌMfM¢'sիZ]|M3*˘j(UMU\Ӭ{k:,޲zot_k jf?ɟ J#FaYyG~PBj>Jq7y7vT%B q |uH#m' lpn:ZNn!}]۳wg6Հ*Qhi*ܥUVa;~Zi!O ypZBʧ2|ZHִfq|  vwtsOzITO=TSB( W ഽ؛unJlAt7W鍆$exKRQE#$~tg00̓ͽ͙tsaN2GY",VK%bXt%픞iTUF uʯ ʉw [&OV"J&*i0A*La(aAΒf1,V72SG܉[ Y&A9c B)o+(zi~l~D^E?TB'1$z6L,^tߢKOHPEi$g4RkkU,&uo . ߞZyQG6EN"[J6\c3$'!H(D&J@]}/Yj(2z2*,1ޘf {P֟HOP~4&.'K748R;=FR :M}k{1CoT¥9{qm'B6S {A…^e6Òa1Lz],SۭZcB霖ט^MXA==LǹB EԢz`*Xx6B%z0ss='Lz1ʘi\G4Jb6Uۥ}y'Fw]FKiF>?G Q&&i(f= JAp.v~F,յ#u TH[An:Bo;Jx%{>-?W$WӴ?_40ou#l U8wgp>+"CcKk[[cxCaUH?OPI -l <`[n8qh'4v\?ۺk[S۷m<8&O9*yIXH.~`""Vgkxoi6mKc1\p>H}KLk$}ñܝ(\u|/oU|OG trqWGIqZ#m"| ^mWݪg}1z~D&- rb3[j}w[Qۼm/l6g`74k\NvX%}38$unX| Lـ:0o.ocC l!SxğſTx2;;S]]D}I32m6m51n{5ҧ#.i<1񲞧]K;-hŻ+H1["RQ(6:.OQ"J!=UB/Tq' ]#iKbm7yu!Pޣ8Lm.M&v4_w_.PQ-\*A!r oģ ٙG(嗱t8\r s)o*^j k}C,=ϓ{Br/llҵQC'DNmyt>V>LFȵKZ_lFm$5 @Dp魘dR59d OUpqo\ޢ+ hjpv^/bM [2%p_R]%ni=QafBNrPg$ZHjD7ɴSO1܅ k{]lxWkk%M.@kN!=nqoWӠ{檯(S_sF&CVAKΦBhg7T q5ͦkP7 ZAl'NX*҇tBK_MH<~0[OJ)_''[xO_  )z<@C}I~2s3w+LLh`ByMfY& ѻ#e35WKGAwUfq;}_ ʲ.XU:@s;IKΎEzYKDw5kRv.0[#V dֈ8향ElKOz+|QgY/miŇ/d9[Tx"1NZ]J^km@Kܹ7o iQ>f3 5ǜ*xh+yAY=Y驓r\D9EovV`r:}&S`*  hOi+R9~o wX^fɡ -Wv|K+# nك͜F1g(LK\|\KlV|9<8f0{;z;CWZĒ:4bpV,[f;r,efsjG@רȁEs 9U SYkG'nۣ3(<.kARA9S:1{|XTZ#լ`Tm/uJk%*-av~?ҾΩ{5vL6aYar\@F* B@0.mAq)"2-X\pp^_(*[ !Q)-$ι 3 ސs737sN~"CQe܆'Obj4fsa.DDUpHŲݝP䗟Xf"Fp%ܬwF˟݀($8Fo}2j 3g Vsq~pr7-nF bqnc dBvr9=hD7E.(Q| k;n%0U d3D>]nYP,etó7< ~-BVt(K"'ۘZzN>F| ӎ-'f7MmF՘F?S(~r:5t9ׇ@wjPz6( CXٺ&^8c2ob!!5( 6vнSݶ*$$'+dO8"'b&]ݰ#&Q}2&@;4X>$k5J d֬&͡RkEmBRҭH΍)H!v܂*¡@VlJ!=Px)MpT,B>kźθƢ2CZMbIMdw$@WULGԛW8)XyPEs""E~}¡m2~ p^!.qn6 -~bġ+X;Ag,ؐ`d2SfGpxuG?s9T|\Byl w_pA|qfq+da 0UM4B-٘/㚐lO!rJvǓ5 RF_re8`op >eDH, œNzt!RM v(xez P(+>*1(t\xvInKyB%U B_QjFN%#.1ȑk; M29C#n [kaK;{xc)eyI(,$rdOzuىُmXаy-]G:^I`GgsS~ۀ((0 U%Xɚ:]H~-p1 ֦_RתϕO[W2bNa-\S ef)Ŕ7Y5=J6zt drW."%H.GBL [ul[M8'HěRzujS*ʂHE`=%v0]> s3HEV`bZZ8Ayem؇S<* G/Ģ igDԙ.up:L$N BcvV^TfWX'.})e8lQtW|RCxy3_v:HK:R=dsL^w}UjD&MB/-ȶ{HĸKd03 \@FZad3T8\#Kby'BF`nާ=spKmeUtN, s} 6Ҋl.N>(O'4.{@ɧ[_p% Ut`*A\6!b F.Q##ɍe B|!%y$։쟔iriT$5 |[sJqI#p '<;i"ܧ>۴=GQ1 ި/4sq6~~?Z 4˜)tp u,dY%ؘȲ5+a<ρ`G"`8UY ё h"QT=^ J(F >>q75:[MԤ td2bLGMM^`/TFwDQ5DU!FAs'ͫY!= Ho/qj:R"}ĽkW*6K|sw|"ppf7in!ZkPaʯ\[(`iLMX9|)N["_B)u*2=Ngg?9A,1HAl5;g 2nMب( IZd-$08$Ç:kWt=X$ rk2 . U =l[F =P#8svZ%w{sN0{ @Iǯ"-|ΆWUM>圥l9swU-10p] sY` )=˿Z>嫗; x.8 Z! v?}-^|/ mȶ$d[gO IE_ٗj^=x}4RǼ8ap#qvΆ_Y 56d!]MDHkk5fӝd͝L80VGQ:X#Yy(rKa.=qkCe\_vX\Z\V(/U+D+%`K)\z T.#piUx#8~/P3+7xv3/3&ۤҽg988am6 Hj7l1>bj#x(9#1"R08<,\!|4=c3"/׍ =-E> #tN\إ I|D)А=\ _>6\V6`y?Z~d[asGfSeBji̝Lxd63@a/V1bea:44HV)"?^yE {OH門jg311GCl^>a~@sl:jr[y:ju")1It̕ՇٗakDžAjOkIy.d`@n)YK=]C (HtKMR ]KN|_>at <,΀_"9mQ7}>y#d 0Z<ܱ{>W[~qW_sCݼwe)F_;;=Mj<ꋵc#yHqpdKhbq=&5lQY)|\v|Mxl@ٮ _=Sv\(9®_sk= !fe G9F;@`!)BOR eB(ZMW%"ȉ]T,ҧVwNu>̾C0T^8=- D"jh$d=J}6bUA;^x'glxw)=x^V\%_<~O^͸vFį4 P AS;phV3yc/S@sT0 $r}rD|@}"Bk9yab=jd|hlm2WxnA!R[O`0@ep4'tMZ}oǯ.遛wtww_l ٦%ˈS1Wۈb21#G CCcq~n=qOh랠p_s_˽ڳѾݳKKx󺏢_]~?2Z<~:%yit@"%9jNJ}4AU> SmґnI! @ ؇e"Lx3-Z9'W mhX~wժ.vkm܈!UK|橻1Kef5;Ku͛$'d25V5BUuAdUA^\rR m "[T iޯZ66߶FRD(P+.ix U0CKcoR)4;@QPAZ <6Dqj<يۭOݳhY)Wx\,؆q܇]:u?+Fކ,3 O'͗  WQƮOIϩrkؒc]}Vh0[F |:s.Uu1" ~79Xg5%Ц#7t0t$DLaƪ"!e_CRsZ5`8b+q_@Jqz}4@YYw]\'S4J.c#&JT7ElF1:tK_jqU3&jeo]/{ǟ~wٞ~㍻C~HCmIάF '}b[@P<7Zu[o!_|z M5uO/nV.{ [ 4o82hޡ6+)!pJci{Ue]'Os* t,E T߬H>fA~ n)T;VM|LDo8|̼ jMpTߜ/*|9ܦ/^B`(j<(Uy(^p!H 蓭Bv%zRݒɬ$JHlsU.<*̕LW0$6DB AzdxdfnFicʆB dA` (-!)J0@^Lmm}&dyij2y\}F\jtKb2b3±X$LUUlFf3!ID?I/ĉ*I"-T*$L-H%0B0PjJv;a4cY!̥]QD|f CpE#7-m7&R[8ęiFb5qbix˽<;RZ-U5ipgY+Sw ;<|-r.7X`K{\UI5Ȕr[2e([;UU誎Uzr_FN)|8<SW:edH80 k԰ZS6I)# Sѡj}\N YmC ((+6^҇w}; vjbwjVQmqyVTէ:^7zvi ]kίrt6TJMhC) ƵkpIakAqW+^]^>8IǑ_bdMp..Mvzu%brrnQE遛 Gᣅr6akʘATVWIV`JT*:0q dnDKÃrz od~8p[QۅIPve,`.Nr{hio5v7`l݊Rټ:Vzfí4w{]:if`k?s(ig|wS$v_9@[Y:@" 1<[m]ruMbxD]k' 1ε\_!^m`t&`m'zCU- yZp)2)(sQ5^ uS'掂[_!߉I]-2 YvfI͜dKiNfTyF[&Ĺsnx\Y_$6ƀ"gL:;$܈++vѸ!t ӠNV(yZ}*~]@q']]|vgw|=k>x&2gaPSj6G+N!! ue!%~C鿩 0F?;L}fe]Rw.jS:\VN{e Q$Fӕh-4b K&c,WH!Oz'ygyyIsB#Dʮoc(nks3xtxI5Ms[nneyGnxONB:uTkddFԆȚj[F ^ݬ^4090ɇ7| C-1[@QҎ:m^ qc :*b fV\N]PL ;:_E9h렼,7`75vnV`5th9pmE\ڤ4(@kTZۙ5M!)cXp = mԈ'h} xSEY$mlMfkhoҔڴiKHZ ʖ6iH/KUWVe-n(, " Ȫ(*ܛ4->_=3s9g93w$/dzsz r)%%H"IHx~,4fK,X{ID?-IޥKۨ)UxYd+4J} 9c]er"m(r륮!g,uN|4*/)'7-+/96\|t BoDz?2#59»y`g{յx)$=!lF°W3$HaaC (p! EvThVE0^Rq GHf$j5K$aX"3 v67zN WԣBhAa!:Mx1 dÅiz>qF>zFN} O\?-zN:3 >F^h#V7{zάǒ@$6KR<E84(©G!1$9,TP" KK" ^$3CdRxM Gx0NGȬ(Cr./ dq YP7IƓ+=  2 \1  [>G쑰KlxTFfƜ\*QE0  + Tc"b30vށR|ב#kQ#T!tTӰ=B@+yϐ @wIiiwH0rZSɜ(Kн)=`&3 ˴řbq:76Mzfnn}j,<> 78#I<?2 y C#2b9Mb "r]1=!!u,[`bZ\dJB)2\U DJp\3D"B:ׇA8EzGkZJԧ,N799JeRzzRpn+0.N18˥lLKqp GtoT.I!uFI2H 'w/xT jY`=W)"ᅵJch CpT"HSx>?ÿ#QO+2M+SfѦk4Kif/޳XJ2R22DkSU%))CR*R VK(R! ?1\ DBijE\裣3IORðx;x%xf[&nq%v;*3u :1vPi63ݿ96h saT쀡Q]S3bsd4Sd`%TyjJ#&+2rpʤZX44ޡ )F}?vQ KMOOT4b>p322?|(C!<< Qo(gZ諘諯=Ww{r^}1 u:r̮fj25*ւdj4 ̯G C~kIV_ |d$(<3S (`($6dmFR-$In,ԥt f sH@ &vۥ <,hmpMp ger,?N_ՅopRˈ҈ROAۢޏ^kKLHL8KSV{R_K}/ԗR_K}/ԗR_K?įR_K}/ԗaoCM\)*A1f030aVdXƜ~F2#iŲi.0HhKa&FH0+J6p&EXE0|D`k@g1X1 ?Ls A>Cp0 E0FWtH)!p(R0C tH)!"cyK-Bph@}Sk N',Պ`1EK#(XP>4E3.'!V!yNEp#x-9s F`Z4X6jf s?/ցQ<F:h)  5^lj@nE|JAڰvPS;q@ !]i`7h!ܓX&lLx nKq-`HGfP [~HiD BP-ւ4SF@$/,5մ,+}Qxڱ~N[=oC6 5mE9As%P}+sg[\AV#ͧ楲<+r?&0QoIv$˯l(j8 l'F5f/zyo(EoA Pِ@IFR4HÑ$%ŕׯi6sfCiExnzF#h7@Se F\,/j> ֖A͝疚F j{nՎO(陃B[;vd˷Y;-Yٳzq (SxOuhR kk[$~+_PxxhA܁ڳ厒RgaU/蜒aTpӱrM #lNzfG7u}PkT< WkW"QwQe[EP+ֽR\#^lJXBa=K~|~ӖVWxJMwk?GjgNZ3(cve,hX;wT" |+Q(PĹڙVnVnƔZQ檞k3KߊԉS^D+j+FUX (Ձ҄j@ "P[jnOB3U֡RW8 䕠<Ÿ@eXWZo16 Q  ѮZLFPS~ 5^%E5~ {rUFqVJ&@n-=?~>KhN eH8*G%X[ ό/@2SV"J@;%K1NJA [AAꖪqӭ?#V!AUgԌWL J[JRQ3eD@B ΄rSCX|tnDB%j6T 4!9zZ,a ~ )AKqNjNj.>BQ3}^ N _fw |5BKjfQrnaty.kw9Ӊ0ٛjLY >VﱵUn)tڼdo \C@d&/jdqR0v5;6k+J84NY;lpYw9D=t@nRhw6[cov# $(^[ (ju;.,q\`(y 6(&i9=5 qUB 쌛MQ:*ftuu) ׄ vZHK/-g e&ꀚby(U`BJ0b,IC,WQ_sd3Lvv̕]L`?[u5ro|?8ՎdֲČZFL a#YZ&˩a2XlY[\N&5iѓRDNpmOs|dYS|$ :~9IYP>p[Q?j=;n]|φYs)+׾WfHG zFXk>˜'?m͖%lɕ,*~aL\%>Af>?0_97Ay꣝[ۑ/_r .<-]qtWW( ZbSXL&RNnf{z &>֠`Mh4Z$̺ongޡFu|zԲllx~Ҷ7شhG^޵mb!uts 8C3 ƺOxvط?9I;ٶ3썽K3/\\Ś'D%FZ1uW{MG^HޛPŌ/KS_NĶ]`gvLr1K+ ]兢 WޜX;gѼm6GusO53}[eg뽉.D~?2K3/ML~0rTf@Z! ]{y9ـ/ʊZGB/E%8MImZCϲYruu̜99YFVklKSO;Wʲ[^=Xxxr 10b`|Gì?ݟAkIW v_^22.,ff'*M=>YqᆲMնc9/y_sƽ$n}pԓ^8v`av\Ҝ3f^p-reQkM tȰJvXpUdӎT7өo>e bX'K7^KVR}$1W Ox,Fjj5xk㩁R3ε rMӟ;/}W}uI׹]/״ egP0X.Rk"m֡{;ESw^Vbn1m*|)6xP0)gN~4} ?B8H|oK9`cʒy~]MK?49Wn);{n"W M2% vsY,`3HA^"pXQyr$a;&=soyO%n5僻^^S:J8FVSB9,2vbC9ZjRn BgK 0RTvẒ{F0|}nӚ/u _O%Tۓښ~D-[W_O2۾nؒoOo?cx%sU<Ϧ:rP#ssSU _<9qq:j [˞,ܺ<٦{}_?"_1"Dp4'hI}Gxov,O^|ǦJGH#fypDۈpOɿ$~{qg~dC]^X[~׎+#'է\|ai.={[:/Woȸ?cw/ZwR8!$K6n\_t›:Ӟ FExN!?l(U-Pv*nsW8֔(8SƢ-#l[-?\zdj5k+] ?5cFt\rvoߏ}4U=w[77UIߴӿEB'uGnffۍO4A_DESÖy)Tn9es[Lis@D5^Bcu ^fk6NZ'|eڛDs;^V :5^Ūhʏ b7`xg SSJ_ ~n.5O.zP\~G `oswCڣ^{SsƲ Ϻ*7\\C:t9ze~y?*"tcβ7nCM,L.((5pd`"g nOAw+bs*|]OA[G,SB*.(IW=MaNj/UL8cp_prLNMmPzgR%)o6NA6~lǮ9+[e˧X>zrŶJp %ͽ_N1iؽd%+2.вʎL̋1Iݴ}꺧^oL3|l?qt^?l$QsxZr:tlnt0*TE=+";3o/9ʶQKî^7f߯eEk]=uJ]|86(l>$póK_x8}N[9E"~sLe}|꿙ma̴ <}) G7^jZ.gzҢE󫪔~yL_]{OB+mV(}ן 21xw~inDۋs7+-4Rzȵ3Kb.^zh쿕:T,[pְeA&FFƩ]qa DL,h<*|ِy ېYV@X-:w=UOn0 dV)+iz@*5!E hu3K#C]^ꔵ墅^u^115YНuiWΕf(gk~1_—jt~gz|lG^rtoiM2 zԨnY`ĩ\*g{mlweʢjGXq=)_?ШjjOO> stream x}j0E -EK0$EͪtaKcWPB% $8̽㙠j5hqL(z.P`Ʃ^ɽth$ ^& C%9Lqj@bRֆYo@h :f8۶b5_"ǎ# LCs )vWOW:10P;<$Mdq?y5L)޻[վ5CHdPBbһNtvGY)3TH7M;G.k9Je endstream endobj 2309 0 obj <> stream x}|T;n6eM#e aIN@$ )HI&$ z Q,ޱ7ŮUZ^v!3݁xwf33gf,&. "DK>!{`ؙy9W?v16ǎ} Pjne]}s\IdZtkgnu3@@ Ȗ5vŌ[oJFD ̪i ?E!^Ypo/k)3T~Tnymw5a2oPi3 A=2Ne驕kS';2Q_XPcנ:śڀ2םȯ& X;-9'g'-*\۸z:yk[MKNxm1SzX;]^A{r{/-THӶP)jc 5p8uҮӴ/VT3Z1jMP3?"ݓ-hȩMݴ5E[OӞVü&nEBi7UЁi|:w53]c^OW۷d/-jS~.VC+ܩޏ.w't%MӞ'i/uߢbSZcS0G[?\@ 0'.1G3f} e골RAv*wQ 」@῅3`X9}]N}=O>FpSkQvȇ4HDEj|iERWrK+F(J VL=DاX8VqݐL5-T%=t򋻎jm]b{4}MЈ@h! YB,d! YB}>gL#|)?g>c,d! YB,d! YBq&N[! YB,d! YB,d! cZ`H 1St=Jo-O,d! YB,d! YB,d! YB,d! ɭ?! lzߑƄRlԑRMi BIi3(tGS=Cߗ@珧E:P~8P%4Ge2#J~үѽBݧO4囆 (q721Ta"Ɖr1EԊbX*V 2q.vSifM&d6YLa"KE("Ѹ~cZ4uF:5Z}eNꥴl}H*7rm8nDk5&H3*ѯ?2cɻyqŌ_S~E ͟7vYg͜QS=})'KǍ3̢Q#G /,6ԓ;3ݻuLN"#­aIu+pV~S{Ĉ2m(j[҃3)ᒞ#%5w*p/]͢1]0hC2 tp$wE_tVCAE>5FFj"wƈHH(w]2DBR0Q#M^֯gTV eX~K?̈-LnN+Օ}~􂆆 ,WwO7w~?ˍ`E%G. z*KRv0!_iBB/=]fMG__㴋;*k2gIʜzsz;]ުY0O~ӫfIip|Oe=Q-vø.yfU y~ gv *2طkr4S&oY૞wV81?g|t WՔɻҍ+зcJ²aVOsen*ě{`dq|A,!U8Hy#d.pJ63Vpi_MҲA]]5&9`Sc0jX \41\.&4s׸ܘCq>79-.*.w;8KJۤ8?S~JGJhyYu[p#}$9*-PHzʎFasEeYen,wlgnVJ/Z-v.tqVPR?i+5==7a4ķڱR^;DQ0hX[\P/.(4U +kAU|LBMQMYWϥK[c9$dd5`Oc{4!<l(aF,1͢1iD* GI?CeVp=h徦(B|%I,L9IZοUe*A0W#={ZlGk#ä?Wso0|NfM+GkM!]--ұ&>xnQ(7\JdݰUeX* #Bx0JuzC*̵J!Q_/˒.3֫O#܃LiΔ.ks66 6cI\), -r#sd<2?,"oʬ1f얞i@@HC9挰2n,khQf V kl ~62Lq3c딍6"!oY׏ǝ*[&aQwl -wW2'9vbRYñݬzmj;q/N-J>rU Qژ, xh8X>2Y Mge'-$Zi#xt̶YG8 f3"Z̕ZLUDWoFIG?f\4U.tLv,h(lGԪ䟗&$օA 8WEGSQKOw`5]3pNuWG8ϸrR 8R4Ɲ'_@8UXOR,kI9Ȕ%>O2{$׃Y吵]~=FC0 #Oԏ>t>:>hW{ ~:5W?ޅ&= U i" D}A T+3>;QK;[xz*qJUbXJTb˕XR%(XEJ,PNJSbJQ,%f+1KJPFj%DJLSbS$%ʕ(S§D%&(UTJ(Q8%*1FJD%+QDJ)1LJxUbg(1Xӕ@%rD%)W>JV=VݕD)U.JtV"S %:)VJp*A4%+P"U%HRJ$(DJؕQ"Z QJD*DV%”(aV¤PB(qXCJA%~V_J?Q^(*_+دėJ]/\)*+W%>Rb*+%S]%Qm%RM%Pu%^SU%^Qe%^Rb/*+*O+O*G?++[ǔxTGإJTéj*LLLӘr)44ii'Sei};g {Lrw86[7I@o0ט^eze.^vLqgaLO1=ɴ\ N=δ1{vbz!L\rdδ).jd3=~-L ~-(0yw1tL1ʴv3GFλz똮 pj+8ʟ.˘.ei#\"N50]tJк@tLge:'5L*w6@b5hW_δi)L8B.XqɹLLsbf15L\i:S%S4)ܲL/c͝rRL%LŁh\ A^al AN1@ Agr"Q HN`@PA a(?H 2yr|gpjp t:Ӡ@rA>P@l9e%{bezbfջ1eqӘr.L22r:19fG\ԁ1gr02S@TPR> Ԏ))))+r;;clLQ\2KF3df.ibΤ1 &LwJrv}|?OG{|o 8~K/ρEt~= 1W#?>G/wwmsoz9aunt -2/my砟~vilSY'm3{Pψ8iٍǀGG8wE-t>PbNvmC^|Dpn\?rsKj5{{;#;܆:7Eq}3M7 ub] 5UPrĻ,b҈K"f:7F8n:=y[;6gw sgn.ywxN]6`L{bXODZDcCIuj]cRD1?emʥ)zLKɚ'k˜>L:Iڣ۹鉲oFܫWg;wfaLIt&j_' $ ݊2DPD_3QiVQJqx).[.|QKʌI'_*16naE񾀾iSڰ"[&)˚hɢ, M%#bbZb4O [K50iŦ50&ys#FjܼBOdIx*ަ.Ze U&dʟE%F~ոh"b\7G77yhSvp.pPUJ`X,E,`60 jj T4`*0 Lʁ2L&^8`,0 `8P@0  x\`p08 r@z=ld].@g :n#'H H$$@ ؁ Q@$V f4: ! 3/'?oo~K߀πOOoooo//{gg'='ǁc#.a!`' ۀ& 4~`+p?     lnnnnn\\\ \l.. z`UX_` /ֿX_` /ֿX_,{ { { { { { { { ֿXk_` }/־Xkއ˭nѢEfҒ? mReE=NA]G.8=Ko߼;<dx[ h6G\TuboWhnQQצ ?ġELkc߆|w3TNh2M Di̡ZK< +a{1RXHi -ūzQ0%% 崂VٴVߗUYikh-9t<:m _M]xD5Et1%tI6p%]EWӵ7Ѝx1t ̻ [ %swS1U55.31Y =>#N]eWǍF#%ձޓ&[.GU۠Ybdo;N܋ =wAM`mGi ^Gukż7)@M wAA͆No G<;!z3Qڍ  z>N?AFZS4vyz^'k?*Fo +O(Ciw13R"mjeYO!Jq܂.'yGK 'EJ G}2ˡwͳ5k._.S 4"N)hؾ=1?=Q@4r c%!<1&Ͷ#55׽e;YtߖCڛ}q?#{cfztxRm;jQ{Gm?ݲV͕=ᵹ-lc-$fڛ7 az*c_} 3DiK>E[Ν!5&f1kΰ1GZfְ.u,-nXlZb85.]bZlء?g>g=xn9}rn'fX;$vz 1vSd=5,.6KC9֡$SFtzVsMv1MSleMGq.E6SozXF>"#ams1=Yd7զg6nj35Ӛj^=YhK1$TvbBM[Sf&x=r+ks*/tXͺi=v lE}c",{r\tBΎ;_:>>sv:C33-߈o!2]GNV'-7]'cT|)>c0>G`?M h` D;Efrיzh0Fm.6˒ZŰUQz~}I؄xcP.p7w*k$q7o;4o@{Yl:s_7{~R8f zBϻVy9ث^usWXOxx+ޅΥ6 V)vg3Ef%Eg[qgP7eBt;;nl;w=FZ̸v:jRa[d@%8 1mj; J=FL6+h36ٌMp1"LqV$k#!k=|V}|\=p/kCRWg:x+>8^WcMp&wLbD 0#1~0[ٌ7V9io3'P)#7ilI:{OS={Oa Dޑ(FGK̲";o2蚺 Ϛ"`MF&FYM*Ehe*r'%rK 6/1ؼ`+SxLIb NWj)"LĶ0JpET$u&tLM/a*JpćczmU=xkxl{YKf`zyCh=#z$'66#dN"!; FDTܷ"]ݞyK:/LNe'aqv)vz}͍Kzc?bݧOly< '|4HѺTD$<^dY)IVpڗUMtfY%KeyJe'8$^B$$4$lP(-0,afti'.tZZZ_yӴ@7 $;+Yv։IW|ow CopÁZn]g ~]j]Ԋ `<͋C!CHW1;D֓>2w`49I'h'ixc0 ##Vku _Qt ]֡}#!_活1Z߯.dCt 0^) W* DB*[ڱU4~wvhii[ wHNK<^#Xnו7N9%Kd3d'bkQ$:=^Hd5?O63ko8ؠl NڐwzE !,)`ѸSx*˰xAZ xҤ4v螻lq~-\W%X^^ !3<+ @ [OaW׀TRrW'vO K\weǟyucɶL AJN6n&Ư$~æ/O'n9H[CsU-.1i}G;<ҞHvWA#ؼFq7*727z+7|v$ d`Y|Ō;4f(Q 3#Iq䀄"8ƍec(sHU8B"˫"FĪg}w,|7oNV7~ͣ<:9}΃\ƣu M8ïڱ㉅+=P  <&51<3ka/nvÃhQ?ᩱ1_!^:+de˪_k._ Lō`ʍWRZra+bWQwI5dR\t:}8'IU4*_2YU)S1Z5pB25 TKTVl b~ 8o6ؠrrS 3Aі`QZǬ:uEii3;Or`Ɂl8, AY( <4d`UJe}MrA';)rZ|f-##?O +eŷ䬌yFE8H.Y%ܘXZ 6j0,Ab "' ne_74Ё׸{2Naypp;rЯyp%xf{` j%0/:" WBR7EՌdG9(|WHlyɎoܓ4pq5k~h:KGzٿW/rR00 ].%@BRG^9#V(RO%(^~ MV| c@Lzia= ]j-jY%4%=YʮOVVI4peZ;0MrQ1QgL-MRk$ypGW-IwA|`d:v2 j5stJY@^ }LX_y|J`Yl8N c5%hgW\7!=%e#X 1{GZS|\9we!MUx]4攦bG`q Ji!M|[B)uCaWaSo ,C|4kօoUxkMkSzGm&wAWiZVSxCUKeK;&1l#* |3_B`>u>!Hd,aciT-JY9$]fuF@f-nwֻAj*xZ>&Xi !B8VfZl_Lׇ"wr GRx0f=DpKR")sK`l0z*5$Ct`^!SY%f24b4n| /ū%|&01aK2bmWzTmt^@gykLJi`$rdWԄ%Y)0}%LTޑxp5 \AxTǩrgOԎt .9Z>R.Ikl$`;8Ug ܫ)QoM3Q#C:38Q,"צ;`heY7}Xh:D鋔`1ֺ-yW,`-}_fYR*/W9= .7wZad-|TNU72&ժ(|~Jah:ӣbjAnJ֓$Z\鍚U!'pZc7p56FVj&C#]J;84fXڵjP6/]y@<\w1= WPpq%PΞs5Hv.U-'u:sk{>t -硂pGo{ޣ/<=MjD@@b v<"`{hͷiBI$lO*+^$B5ģK^W*Ug-Wzݭޓݝ/mBvM"lrdv0]#vRC'z :^AAN5pM#|0؆ѼfJ j`eT>q}1j#mxp;'^vrRhrRLFc'vǠ שbzϦ`<{C|(ؗ;G ̐?ƬU~cn!|ƿ>VfG'M[z=2ph+rgKrۉ=ym^'vWyg_ņPakr+L 5JDb4|oFTb_`хR.oJ%~˧I* dO1bGhZL-llNg7}eg٫$:vU--k/|7p5ÙJcՄ\NKY%`Gpޒi{O]Mk$4R%:pҁu# P\qw6@cų( @%\#kqK.^&m6"nk3.N:?0)H ((4QPm{7+J%kߒS]akڀ^ o4/΀ȥZ'F3~L "JZ{E|'?Zf B*u|7@HZ)XR.ׁO~N$Y3Wz|W {;WP1Up,HFL2cƈLvx}p~ Z᤹BG{~T V TG w$Νj>Xc1f '^ 7)<\,Q8 yaYOS ЌR>"V`e k*5Ҡ7{|l!RF}??y b ZdUP–:\ID5g\.!2RqeG_2DSHuwBk:;%W%*U*:0o;rqz}"e'k[F*Zu&@uZ'$ ƾ0+ӆ34Di" w!ICH!bB:&蘈NcbA@?(U-,AkaGddPOVQh#OA{Ga%Ujd ,}1$ܱML$?I(SSnL@> ^žu5'>\<\agaCa*bj3qr-94"!"bD!ޅM bd'<"|V q8]ᄖ"DZ"A]B__&Xd')5K8[e{P>m QE#Д) N"˅hLБ)iNҨ)^_ nRfpXs4ngGh{E3BKN hfhjjͼZKBj9jnτ觩6nÎ"]~Y#T?֫zYqcn<ct>\XEl,T$jzd(+plfUӱ"_o^ԏL9~YL _N -C(-)@:DC""ȀT"dT% vbaA* z܃Cn-x,Z.Dɲv>Gg3>9<#cӍȋw'kס{?TfbOPda8o BuPӟ+J˯庯vGwYFLX;dh׍懋9w]Y-i d^e9Żjq4>\uE^-V~r,e:ȏ!%VGCNGȤPBg(~r;{u~BJ@kJV =)E.>h0~ S&W0Y2gY] dWGo|f_ʗ).y,cSp*QMc8**P,r9Se8K\P|EM4| ug\~->dl_W|BcKAoU ?]Il<`AOk2L g|k1Z1hKQs H+%Y(FmASPGڼYɫ <MVKiXC$t0k+͍T*Tl{ ½@"YfU4/R^;W!tzC i8 I,''D+^sadna]?F ?O C.{-=)Znc+*Ė{'*x @CYҦ#}NlC)d,xss:Kf\MM: ЫaVU6J'4 {_6q/T@Aʈ;hm{`9UrM mr`("ſt;}#iVϞ޻:n%.; 4Riv2f75c߹fݟ}.Dl:Q[ ӱsچ@vC%i:ÇD2O;-5\-Bfk ]=x'AxϽSpS~T8Dj'oI M2ΟE>4PV¡y_Ab~Bzb^iɃbWSWf$(), nvsPnU c[A,,:kla6}im]ragԂ5Ӯ 4Xz '%{kgş۟U5$&'70'4 Ne8kQ)Lt_) cOQ7d%jrrFQ]^#\R};98*ݺuwUuWU/ڥd%Rklyw,Y-Ev$$;&  ȶHc02y%A x[[խ,;,KU]˭s=so:&ZtŁO nv:UM% 3YFUX`Rl%}c9Mx4 )s<-i21 _OisZ> D'+gA}/URHS@RўBPTZ@]{M2U7j8;r ֐k8xtR۲%x Bw Hփ-^K}G)ԇ8"&FrA#֥"*JgˍP\oxL w>ۡK@UkŽ9uF#f0ƕE]ّ,RF`mX[+ck员0HL+T*Uϧ>_S0XVWȃ!NPuρw”{vx(3zmgTc4%hj00H%g-໙KoW'ZjѦU.hPU/Y'TjWgr*w*^I7m}uRz@dmE-ӝWYϷose{}5TGz1.\Gh9g~}[Wg}cД :{n5otݹ,~:Δ:-&k&k\Yr}8lԂ\ځQڎ+:Vt\^^+ :M&z*f]rdt}}ֈ :}wBMRWYkӿ-JF?ux͇tZmY [;ܥpi\פoL5T()I+j4iU\Ƅ R<7b-0h!45Ԣ-y&O䊋g:4 ,nƒOA{#6g]s{xyO`+W|`[3#O_W?)=L`< T&;=<6SL ݟ5 :K{PeP**ƣCJOC׺2o<6yn ޯ[8%BV-yK)|!nHyS :7 ͪ@,|5ZQ*$dDisĨsCfY+s(GA#_jomݖ5u G#TT涚w˛E<8_t ȘAKSjT75O.JhO:LьvtfzuWOPP5-"ut9Sf^Xk[j1Yy^,Ǫ!Ot_[w=~I*b UvOh'3IᴦҚHk"iMq`nLχ ^㼽PNgQ".q/syqh/ã)t{ ϫpܯɌO{ʳolv=4ADL#o8{z4w1n]096o->Wyv@Q~!e.jKZ )-/n-w1۰|((t ʼεQDÅ(Op5᪔"y@]XL!]3 |U&!%L/#?!X|U(=Ll<˔ϗTOAJw4$:jPA.A80G|#\Zq>!*٧JIIݓuziR238t|I Z{C46k =@@R3U u"֪Zis! RBV"$$Y#nǒDZB+͍(WsDEh1y%=AYn_$}IUWfoZ*^yӨ^ *ƫ2Hjiae}Lj0?qjCq=+bb{ck]7M9pMC**&oB٭cJʿ5b 94:WMw97~/Vn}|ʭɔ:խA佟 PǓvь_԰Wm7ur0t{1-]sN>r`4nqVՈ YֈlYVML3Q(CFиc3Z*R@[]6Ff*j [2IΙ=V⽈6 ul .ʌC!,WѸ,&W{8ffQP`_WSQ$J48+#8;%`9~͒kܾ=br>?ڶ<fhR\Wyv)cK%aV*%!.L~Zg^}ʓlՏr hvd_c;WGn"WGC @*ϸNގ~F6mk] 㭹|+֗ALq $JB A;"AG qATgm`pͼAT0 A~ /iO&p+(ra  >r&u%fˈ;>:H,]DD^ް@ho$g >YG}6pAXDQ[rO?.A uH=ҼW~ȗ5^¿WA"idhEhĂ 1?@ AtAg-60*idhKxIm^@ tX!wKcA-JAjԢjQdC(ko%l?|bw%Hs3Y5fA`|JT$%E sAjbնԒ$UZ} OPyj'z?''$iº2n 2>2LmhO5Nz$OQFWý_n' ϟI9YOK"N" 3\:3B (qˎ$a%J@=*f ֑#"kK)R4$@[=3%ü+\lj1X:w ӗ@UYPU+UUT[~_?)BoT(xrҜw{fPK"0t[c \O,Fb9] c!U,M"V:NQQA!%Nr8TL-&2n.kwg"eLjam !Tu >I8BR*%Z-1TsఋbՑw Lw$-BV+̖I2#XM G9jab(h!_ QD.gDh'>6(Gol{@m;ȀL>Cf2Dbq5UycfV'mDExqvHd2@4xC0ѭCWŗZ =UKy/NX3ͦ=&r1sCmmwI&&5&=m+(%!Va-Dh%v`Zq4> 3՞M;f0S% ՞.1gDAnY]6eS  OC&p$İjuILö6njH?Hv%PaI?}}Ѿ@Lߴ$%Iv~tNzC'k^d+>Yk'ħCK jVYIIB;hj.k*,:KtFR=1^gl',s&9:hߵ{uްAF<Vw2*Y9ip^*qZnP%9SMt8]TOju/V?@ (w:"ݝ\ 9>HD%b *{ٱ;gR0z#SڐV#T3%2]8'7}̺e[vm9n22G.‘<6p*OW]$&"nN7 $ÉВ۪+m,"K\Qs>8)o 8 "&\4 ؉5؞h!(Be=D Gif¤́y&?Qw tR9Ys3c:y5 TUkb݁b3^=Z*+e,fgIؔB56Us`Y16Qx`bm}A䏶L-G@lzNMO2]W&s؏_EQ*ԯ0~c>G//6 >B G)o৴sHzN |TJD*WveɗWwe%j{^al vmn9c,xf<8\W.IGŽT{XT,)G2 ]2;HBM^%HYWîRBekqk]䍔|$+{3 3⠇8GNMgRӡfҗgLgsy|գ}b#In8mBQG< e׵oPHk[a .(W?5H׆Ta?%* |9"*au:)^/":3z Ʌ劶V%?Ft-DCbIgIP%k>!m=Fq>*/b P+0u1/MgQrQl`~ 4gv/*vK+B?g9BoO2o\Me*gW`Eiy۱lM8e% NUVtg:p&7ْlJثte=P{s3ť,ں/G£ ):ljNbsPoc8a{d&1u^s,'ۘizbN>jM#Z}D^&c:SeYTH`ҘŪ3rAŷG:bjK[x Q&3t6j_+Z)O@;E[ F+ @9ßTDdŸ,B>065^;t`0]YM۫ML 4~TSL/CMT-GM,l1`$;L:exG[R'zZϚZw/]0ߢ[Ejsl{ '[9sLt;oeRV1 Xh@>Z_s.)m9VQr(4kx选3lZ L/<%HH@G/9o%Nr|qoVd \ꮡnO( v"0Y =A=ow`7%c ;(^O- uyhPg?.YD0~ɟL=S{%\y mɢӒ'ԓ[S%Xn1/S,⮍kyFY_zj\1fg ,=C؞ "͛LB/I]VC/ҧr@%Sk'Uae@_V%Q{gl72u{;+,Nm ɲ8 XyVl fӠXއ'=+V0Ь%±u{Ak8CLpf]UV|4?qR. ~[Sg yR@Q)%rm R+ڳriJ'v#?@ٜ&$ozY%/ȴWJZ$I+D*z4k{& 0K̨k"+C;/́Gg>ss'a>9\1#0[%$?۴W{ aqm̦VK<ͮ:RYwShۺ/@ ^YO$Y-I؝_|9 :Fh ?R ~%{ρA΁Gxlqp+uf:-]C\YJ0W[ZeWJؽ"G_倖;}|deCF3"Z |0 qK uW;@$Mϲ a~I5g Tc^_Ur1Q}I*A`y`o޳{r\[M*ז*cdkEŸ$4Dg1QQ^CPCh#79*VZjށdy:ma;lӛ ΄ߟt ߟpr^4`*)7ϻS`4<8E-lSB!̝ޛ Xb =h}:ākZO +n2kx!`P"^On0coD1f0L? q Ë»oכpr3度:! ܄ky!g< 6}ӖPlT2!ahqZd;xG2iKHЄ /.1jhP ΑG.ps^꾄бE^F1@q0@\O{PmӗAdK\iH ex"E| `J6"!OiKUD@3~d3k/~bmv"L y#fYB]S/54` <r=gps=~w2SGG\,+g3}+B*d\E@}by멢LEG%F>/1˥I3>7Xٵ}>xKI _JĂ0w:4*U NH;1LySwWfL}GKp(_bToPk)4I4zJ`n.~;q ]@DN•~sbu 0yfEZi޴@eM /:S?s2ǠzWO=cbW6BOb8[q'lݳu *56x4nIjG=Z7Cv,ДC{MOfW;9UH>/gN_08~Ư}J$KCL;o 'n 9\=c.aȸxxxŲ#0+f9kZ %bԃ!Rc&v.tU*xG嬸 f畫<*Eq*S{#s߅ZCsܱatf,}衱iOnh{rr*y˱-[ǑOWub oH3,su| ʼn4of+UF5ӱ:Q{$v%`2Pd(~i@vmy$So ȍt'= ERX!o>?Dnr9db3;h?Nͬ9$Hg+2XE-«"͒V^ղEX-xN4\6F`hq7vYZԌ^rk˺fEE)fN9l]+P(EBo[< t.ldiHϑ%%˸s~Nv a{A=QBg/j:4$' +Ce4҆Ans-s~c0`~ *Rd }-@v㑨JgՋw SwKj=W%",K4$9psxigk+sy]zsExz-:XAWʵЯV,.oTjߚvcVA9޽CݷCwlg>gRg9ma%dpx쁾'|C-K$Q:AS-Bp< &@4č'W͑}%4Αk.Bf=k;le]Hܴ-P'u٢e_TNՋ$gZ|&c%;/de=`˭m|psrZuӎёnW03߳>3w &Gn4̲$Fs{ٵjgohtH1A5-w!:<>+Z#Γ}Йm`RV_j5Ex3uƬ\E2eު(y{&;wˌ;et>F6}x{:U7l׬ѲZvn,Cv7~S|Oe]Uj:؋[ t@:ϗB!] $TꞦ5a KEx.fPjwXt.Y6AY7ש亾z Gސмi3nf>Bw{&;=zG?>zC''Y,^7s,=_!zc ޾>̳^UWU}T}wCnI:ò%[mY$`0> IpB_@% f~$!x2Y5'Ėj%Z?^*w|zchlT~Ip&6q2]*_8>Z}OĮ{z'7ZdsG+,Wﻗ|es!%GRxXpcQZYazҵ,udp1NR)f{s6L:.a!%]Iin@>(J])X.![Ql1FVo"X=K T …]ֈxQɕmJ'l|6XzyFu'CL !K At vg|3QJӠ\B ]qftUê%$- n+,=к}#<%VгAa3h;ĬYeth.\fp>Ii,bʱgy(@Be׏AO=!H~n$@JGrp.RB >a#fSh'U2bH/|q y&@U;NcrJy,I ڢ20BM8QrV\ժ\*lxijd`",x}R}? Q9;ZE|}x9XЀZ9aqu6\wb77LY[M:xzKp.lԋ2&u g n(h)T 0RYzslH4ȥA( iyv y]QN| E ^Hs-CK Fhۡ9%/dd ޮV@G5ᵀoPQFxdgnF.@DKho'2ƦKGu; ((W4Z9v(Ls<8nv#po  8KdΕ*j,yjfwZXuPօ9Æ=lmʅ1.Ĕ#y ԶtY{rt!XkRy ={`Qr{לn۲0&At()*ղTtޡV+_uCڛnHJEuc7717x&x3!ܐd؜wxq.QWzB cw63U8][YʕيMCwXҧpz1:өc+ ͋U4,MkݴivmbwMvUW< u5w'e&jj e7-ٞ5\DHɹ) b|)aoʀFc}i>v"cJ}#OJs%x$Z^3U;Umײy>P D)ĺlsgޅ =ֺD'eXP waIZ04P4F@jGΑIY㶕u[Yy+?/|Rh!z!C!Scŏ!%RyvY(eMKeЀh`~p ml`}`ic/S*MB_ŕ~x>Hv;/m{dUtbx 7{B ͯvYY*8(>Z`?y, 2쨊.ԣH`!W2LivWԐZxyFIiYTv &[—D&A!) JM6U䣄@a Đ6BHO OҥPq|㡑е䡡 ZrT}CDAG!%TZklUO'@xKT%)zTj^+Wl\\oǻ/Gt-j3 ̖g㞑N2ZgqH=[H'=/g'{h~=HBTY)mm.@ر˼<1dl8<EjD L!՗ q@!keMJp<Ի͇Q~"EAIB ?f?DH'w0K*MRwk>$ZwtmYu(_˺ãZTH89D"{zNͼMsDe̵[ʴm 2}yq-G<]e[w|ibd*ʨ2nC0h{o3eV޾ARRŅű IL!M(fV?q[=NYq6t ;:;%Qq/e«[=z^}i顑qyc7m -}hp߆Wl XL Mف|zn\a @s+-9 &}]ܚu(=p0fo~S)ZѐλrBKČh"wF~ f8y'XCr_N({fLNT=~v?pFR͘Hݼ!mhdm[{ .R﻾ԩBWpxO#Ѯ-N&H켸Fζom@B"gdڠ ,7 H}| ?O<3ivU|HWXWyh(&6ZuJΝ3V e[*Rixs4+ N0^cqa`7o&q lj\׽G KiVIDUt2@ sP'tb֢X9qC75:|t%J@@9?6eZΆA)w/]͟,1"]}9N_銞 ug/lxT;"VW&]B c`6^9pNe3X(@~|k@!QNĔ\SD1>=M BvC zjY8pZ^ G q߲fUXݣGэnct:Z2#֙Ζ ]+lAKU 8c]^qvqzق>) ϗͤڿ㒳'n_T%N?GbԘ!g~l1#; 8;oLN]?➶SCJ9Jf%NTQ%AUJtT_@{_Gg/a$ӱySK`|oEᢄ)bJ5^;| ǸS dg>8ْ0 52Tq)9/WUM6,6KPŅkwccX陽3rS'hCڴ#_G?qsǧFڱ{xcoݲXQHQpmn3p@%;  p<|^O(0yܪG7iI]9; eϠGp$GX"pҵ Q!Ofl(ɕ 7LZ^) KBi^t9.@{?Uv`  ~Y BV^񊡴h5h9{{S <"u{0LBQkfl򊙊rKuJs70" 'ҍ2[}xl+k.=o[;R Z-PR0c^pq£jWjeW$p @,VOvLTHP"s$ŒO^(Z` &6.d 'x|>p[B)XꀃN,9, >dTYkL| K8.X*d (ć«.?.ʞ@\҈](_-eR-/Z~5". K~8H~G͉= "aAaAaᖖ--x3EqT >;r͘y0?mg6wZ4S^5E}\œ&]>#<uڜc z5*Ya1[N9{L" 9T{beG;7@IKVh8[A\N8wljPqA1܎!ʦSh [(7A&ߞ<ȏ㡢<vQ db25&j"DUvӐ%" SPLљ%:T K4oXKt!s]fJQk bC /C+[=a4VYg" ` @n-|-Gķx7{E·?-߲ Y$2꫉'U{aX Be0/ 7dŝ?*uo*-ݺh.u*6cƻ7cUk=S]ؚEMR,j5FF"O..mp]*m0B)ٶ*6N/xc0;xHi 8PkYJqpS-O@)QkVS%N"TXű6SiV+gycOWl]ں`۹hb‘l7| ~OtCi hQӝm¨;0 Z"5e2ى >S}ThW$"ᇄ\қ}}FVgFd(A *'Vخm?Bx*׉ ˖w4NcV+DAhVhZ:lJ z>93*нl%BΛ R^mGgN*TjOˤ҉L&[9D&tzRTf Z)B *Vo(kFI"LiBPL Ď$c'.G)n) ch?>qLIЗSj8v6׷4X7/S)4ր1Tۼ0uwFmMf5lLw PΞ+HM D"5UmxNHtEuJ{ڛslYczFBK~E*{W~Ttɝj1vOdž;o%բ].-q9r*݅7{l9s))Cy0j &d~?x E&RygK^BaF͆0o؉?N223iy!kY|baqN+W+6{7ߟ MoK CyeN7v89pT`iwE&S$I]z#@@ǧ\ tXG0u/7&uS _Oq{/'ƣ9`%9y+}9Oe^KV;뗛J RY:oȻ=̓S:)VՍLZK]9qnḯhV$bT>eYR3߻hū_89^Hb'mlgqeYȒ85Jiʣ3 )m ]LI.4&/~OH4 Y|14TGvtBV(ӿ\:峨K|Zx۲J[^\q}_=YrKvu ~_ߧß ll8Co+]pǾ5M AA㊸F&HYSH@%lF_@N7BCq`1z`zJ[1c'L9YڛjbSV-i\2]Im_= ]RW^þrmwTٶm/ݴT5+V:gAϞU\T67nmfeY5v{6ت_% \'qOlr}baѨ֞&r&|,|LSa 0oah4]UU} <'dϘf/xޖf5_-83yIتW U'k!CZuJ2u??5CoxGӽ7[W No\[i}AMk'R8ݚߒpT*ֶu^`˶,է=YW(6s+Mb5Bm+ԍɞ,9>vr;ŻJNn;rMEk60iFMv[4'[گk ʛW6/FR.46lkC=-Zw|Ђ {^h6f,wYZ֦UEuK7̑ܗ=YVBXTScoe_S^^m-6卧//[Q_|Cbkj7{>6}%GA?i9-lm ۖCu wM&=iZ497l陈?235*Nwt;zo 9$WU|"䔤UK լ""\KnYU&ݜCfv[u2Ek+ u6Qo}u嶦߬Xn[uM,[-SIK]{C[ Atӌ[N2.+ agȹ97#16dg-M|im{{Ŵ4ýyE>Z{yCEϾWZŜn[gُߵags>$3r$ڽũd0}Պ/x~՜,[E.+S[ b`}R \t'ݤI%6wϲ;#ֵ Z^Qhh߆ƞeK,j6-uxv\Yl9^[6:kμ v{:kܗr [8JѪ ȑCtIۤ@ٶB7 ޝ]7^~΁M-7vMevv:nGvܼ+Rg_ѴlY׭j-[bgچ &I $m9>r>ҾI6i BIn+6Adw7^:yYnP]ܴnPu#ME bl]g/ZU]3n(˭\ېޞV 8Ip(LGiz GտZÞuݛk-R*M\ϘOjI`;\f7 sV̇w uڷ`ny9=KJ:o׾5FϹN3|Ko|EhTvFtҤ"}rk}7Ntn^~iѯ3QQ>uLM/)2%BeL3K*d3ڼ)j=qd?f>3^}-^o]J]Β˲eZ(}R>*(]Boũ(.NUkiee'c#N5Sj2=STwp5֌/׾{x# Ҵ ;olf~o6l<)oͯlٷ{*SnBKZRWItZ7[lmo >mL7TÔnj _:;fAwvvyW[׏n"Їw==_}k>p;P8030;0;gg)]-c {f:1T6w^m)h> 0(?P j8ऴNs4aɧs0Z'gǾ5vvcρ^ؿ._?yW\}J.ъs'@?LQR:*9a">F')JQR(ET(E)JQR]@{sA(ŕן-B }7\җ(=(E)JQR(E)JQLk"}Y,rUߖ˪1jή\$kê:n&$1lN]{岉[ifNmy.R.6N. "g_.ƨ9rYЮ_:.+V.9elbJ岉-iZ1^.29ICHW23+3=23+0=&陕Y陕Y陕Y9l2?sVs (༜ q.1.VB\~Eՠ@׏qn}aZs#ӸNF1<1%;EW4N%!d֒6pt}81Vº.CxCmMNAp ڽQ=){G[]T TLM*ڝm¨Q5 mvt굙nk-OIH+0(֋ H0Jx)o ?$dx\t I W^GQF)B}T縬)5B15JꧫUBqj0Lzd[x)&00d% * R2IWeWQCԋmٙ@$ҲSYL/=SߔemQHa&\!$UW5襳[~l*.­?GM|'RlX)Wg*L{<$H|&vX&#TS1[&fZa% J\'k5qg(wdkbq/LѫKOAp'+cG)ekJl0-/u{$^)R9%yV f{2 Ї)wE^o\;:PۍݲtMBG.چ +v}v=gC4upv/2Ch:ށnnǑhى:)oY׃YKhb+*@;^'xwQ~D~~-%uR΄g+$5Һ0n落=Cv*YF{|ݠ8*'A'&VV3(vYgm7Q1KR4DDm(֘'?[v()RF+ R[jٖUwSOl@C:2dk&H#MEj 1¸(;eK_u' k 8#6YZSAuXDj + k$'{'"a{Fk:=#!ϴ=Rh`*"^ p[+_~/8!uZ&Rh38 KD>cy.$1,*S!G"NBi? I kP=Y {rz&]C5i3ǡ ivkܕp(m H$n 5L CZ Hߔ p/ }^8髑SQi .!J"0mS-zA803h0EC<=Io$v#G)**M  ՗bN#cn5,LOx McQ훂ǥ)* JҲ(Hf,@PL5P* JB$rF~_5=S< p`>RF=&35eÉA4N&#Oiy,@,Zq!k*e_kAϨUגZ-F^'*f$TzFMF> 7n`dW{w ~`(직q` E~/o|`` {} C>`  Ow` ݰ& v17eMJ`ǀ=ǀ} `/d= -@^쫀}#o0ؿ? `i@Yۀ}/OQ`?'~`3|  S{.{5f`w {o;3~???"jv1 $hv+{ y>`S5` _ |0WyH g~`&? ?M`?+d %[};}`4O%`K?e⼸7{d%`/&`}oOi`_^-@[`w{o{M`_;'!Gk}e`?uJ|E4kbx^to7Gn`1`@Ci3Q3A1s^BhIu|\>:c}'>AXk̜ g:;L9Ύ#:#3K׀ըyg'רd mב!Dg#:S9;ȁA͑h˜VϜ;-*q=ӢwZTNK+洌[0BV-pTswNEsK^u[-IM?9SGkԺI$}27z9>;@z 4(;Ӄ];F^F\vىWGkռl;} Ϝ&]l .J]wD^;rhF3cHF(I )Dٛ5o >Cyv8VkMi2ʬU3LI0[HЩI(:uNkls9VD 8Ǻ7cH 77A1 '­C=*𼀲y i"oPK .R`T*ޠ!WxZ=^[h핕3t::y}'3788Wi9vD Dߠ NŹT .PW8jG j Fސ67<7?qt7vxA%I ?FTGF|\RyB0_RW0jx#0a@TKǁq -n"ر.7Rr(yޘV,(Ghz8#/Xx`c0![нmycB80MxHzԑ.mP   Z9g?Qyrsd[tZ,M!((#!F(%?1h2$OXV=K՘I\9gN'^GShsHW 56ģyu9v"ǎPԤM:nyS:#3ct ) r ZG jP Yң(҂MĮ]N\ Mo3"()J ʡ(s 9{\2p-n Ĺ||Ź5Źu\(g+~5,έMND1XXtp*D#̂Й@`1h1z$ 181 8dygrsFÔ)'!Ty %t"gKCydV j<$@A["l[uiA1( aaF51-ϗCTx*SW?_'̿ݪCr$gY?: (yYYik0! DU#4P9 e`dlJ֒O5ʹ k$%6Bd8F 0$q2F÷R{0h&F8X=nse״o>֚(a_ܷ|+S"6O&gXt3Ƅآ'; +툫r_fX[bule_`j|S]G*0נR#jh0[b>iRX<׺Ӻ ޚJn/1#\}k$Ч%֐|}H͉8T2j=cKPKzםU퇞\$Gd8UAbA1~"lM}ZKj`Rl D2,>7X Y+k`̡Pn@/O'O+V _6{y@R߷J#4AR<PF+> ; ] +p?DRHJ2m`/g t6VtK;YcPADgT&`ԽJ{@j;g_ W!I-n##Tg^5(/ &3t_Lh.%;\"-Զz׫/^y,VB'lIBXst5Do\fi z%.@ޥ2jMhG*woΑ!vg|C$. J婖!uMOeĿy;W(vy0Q W۸Md  04e>?#;o4}M לh;BLc }|*( %`_ Cʽ;\%N1%bO̗d_<؟suzWꐠ!Fݞ6]*ٱt+ϵ= ׉cr[Wt)<5fѾ"6Q Uxh j@puOEn^GoWl۪+)T b@WP#J(8ɺ:J(:H$. #(+Crls=!HAA\@;4`~ @^P@~"(ŝda`gt$ʃ{Of9c桃~1=efIA:_M*BXU,Yf%wbӺΰk YZ|9{JѐA\ oIQ_8T%W }S7*-08+iG{#DӵѪ{B3&Q34Yl=/]J{T֖N'èl:'2 }|Zf/ӔHs&u3#:_OWoga0g2]%[k=;[ms\wxw˭<+N3Hߴt0z‰UW4=*:pmR+^e>c˯U=(BUfne&g)UBy?cJd9d6L)TL{]LiGMcI<壭=US#=FEV7suatHDH2^?D:%h3c ~Ø(ОӮj0- S'vT>AWuC_Ѝ 4?H8h ~m.!`@@1 r`@T6G%QILW;,2ˢ8/;_p͓~%W^5@TxIWx4cxA97. hn gN ]Zs> 1#)jƵ&rɠ6>5Nޖ|=Cnq֫#{JΰscVV9C%̙12*Ny=4M^.Iɪ=}H}AQ]~{뷖۷݋ lzS{\/d~S%!?o>b~+DMڎ'P({ke7=WS Ê+҃ٞy}l ƴNq?No3/PG߷E "6}JIZxdvA*@ Gk)w犀҆U\# 9J@}BF;w @}xk#>+dFxrwn6rһ{W>9,LYS8apéޥ9z&u5o,}~Y$[,}oz2A4,5^LmBҮI\ᳰ6!.a$88:@E6POd&Z24*fe`)|>"`hJ}}33~ vsv F1lR{_'+IH[5W~#>@_/MQ8ܝ)@mp~˴xj\uO=N!aL]r]&M;ry eǏ=٭jts?rqSQ;ЊEpUپ޶ |zլ5jo  jm`4m-]~UFψ:0;{\O/|[D0R1 ~?(|Ryᣚ MXB ϾaVx;3F1/ ~H/?Ν3 wN~o%[+0!P8eL'R޸ ؎ $kaB-j%0syݏVQQׂF;SFg ,gftsV: <Ɣs18:ޜ{ٲ U3J/nUj:Smz7_ޅBn]ƬH.HsB5PNٖs#"xq/E~Yܝ126V>+ujo{үǦh"z(.3(>ΧTg[FD䉘UǕ-]`Wv~KC]φ"uVsx7 E? QeuQi6qvχ#yQM|7b,@ ( X "жYtb}oA{>1 Uh yho_`c FW6_+/܌"af:'.FJUUP9"JBumke-0/LO1Oda/x-)(@[KnIqߐt%>~LE#~a;m3+qU.JޭKKw2g0:qº8V(=ⴜhp;R뢲2 ^7LK6fBXկ\eHTP}ʙFZR=|[DjOS^dzOx{:AA6oշtZ̙ߵu;D^&Oϻ/4TSᇩg\m\mw!:+/VƜ>;z=Σ{!w{x6M.m6]Bd@RuM>[U\ O *&^[z&3.dxB^!D$Ms endstream endobj 2310 0 obj [ 0[ 507] 3[ 226] 18[ 533] 24[ 615] 28[ 488] 38[ 459] 47[ 252] 62[ 420] 90[ 543] 94[ 459] 104[ 642] 116[ 890] 258[ 479] 271[ 525 423] 282[ 525] 286[ 498] 296[ 305] 336[ 471] 346[ 525] 349[ 230] 364[ 455] 367[ 230] 373[ 799 525] 381[ 527] 393[ 525] 396[ 349] 400[ 391] 410[ 335] 437[ 525] 448[ 452 715] 454[ 433 453] 853[ 250] 855[ 268 252 690] 882[ 306] 890[ 498] 894[ 303 303] 1004[ 507 507 507] 1008[ 507 507 507] 1012[ 507 507] 1089[ 498] 1092[ 498 498] ] endobj 2311 0 obj [ 226 0 0 0 0 0 0 0 303 303 0 0 250 306 252 0 507 507 507 0 507 507 507 0 507 507 268 0 498 498 498 0 0 0 0 533 615 488 459 0 0 252 0 0 420 0 0 0 0 0 543 459 0 642 0 890 0 0 0 0 0 0 0 498 0 479 525 423 525 498 305 471 525 230 0 455 230 799 525 527 525 0 349 391 335 525 452 715 433 453] endobj 2312 0 obj <> stream x]͊0OcPL B-xd=g P$$Sc7fkLI`7kΔ&ˡAeahL?eOfQ7x wisgkzk`33TS^; B,7}_bEhAv\gܯz9L}:V*IH5)EGTDե)Ge1Lض/@H*HgtO 4GGR(CtORP]|Vm=Y9pNa6|#vk endstream endobj 2313 0 obj <> stream x \T> 0 3A bf45ӌw73̞V'7+{>kxn{o?KkgG/4֪75v#6|| 2vBf]G Sz0}N OӸd^CV2ya㭗n^'L_vaJ^Wu弹 zMs7yώ,]X(>zlAC/rUxw4㰬 zJ;|4rK}$n1 K@Ě'W\Q%(nQbDx\T(I  ~HU'X,`8!;|*z^-{&B WMOODHm\WWտ]M+ aŸ344x&k[鳶Wۡn/~-̏_6Yf?9 ySCnsOx),U܋_0/$xV9ߨAē0/~*S0ՖlX"%}՛fr]=ĊKO~_/~_{?gus_/~_/~/?/~_/~_/~_/~_/~_/~_x=_`}CI-މAb h((@wzH;C 2jNhYp̃fʲv{X&% d?_u7@1N//?IL$u5~ߜUa>: jrxQM aP M ,Ųd6MbElm`٭,eU é ӂ7~ B5o6YD<_:$St ]"8~l+ ;Rl} _,bLe3OG);yR}vqcTUY1tDpGC HOK qFC^Q IY,.{K[+*yڈ>M˸, r1K,9㔒*) !0$=RfZ-lRM_Uj:j^ =&㱆,b 2WRl]aѬIOvoxJkgØ|#$ ݺD[Yck\M]Y)>^-rK%e}+-i6t`ZCxnKlJmbY[.c+ZJYv$JRXKa3X-m:ogQ C w/Wv8`&\j(mi&782S]Bߝ9sz7XT5~DVMa`%MollnRj\Rq4Z֞pxj\yPk @ ur_5W4Lrer,em oZSr@~GfLM>gXL.G=Z\gjp|=ʵpl.GXXg rXK`KN-bc&.J~`BY":_O .|>)l>msVר4w(R\~*|Z;c;Kᓋ6M|#-.g6[뭸x`T'϶oKQ~\ aTSr'YqJvew-Z57n5|pJ{e,ZhIy[cwմvm^YCKoZfP7$:ni*XUmIz=%VOT`Y_[0=v[por#OXx4ryn|Ѭs% w0m6;m$9d 1ne&>=[8\: \uX;:\ZKۋɮv. 08|Ojk> LțtxuLETRޯr#6ykF8x]rz=.HK-}-`r_Xi: N\&\]ӺYr6ZNm*켣`kl⣠]ΡF`BYL)H*z>݊Y,m ON{Df%{/DVq3A H*lzr^N]+}\Z' ̪*/o[[RaKol͟kb-dU0ui|IO_`OFm\SNes[[(^jfq.p^)fmHb&4.D=*(81Tq .ILއUG5||c)>]`pEBdr2EZ xϺ"g805mb6Ԣ @_bA$,CnB=z 5]Ob ZK[E ְ` (ݱ'wl*Gwlc%|C8JO*I_ |N)cՈO(1#9mDOx7»TJM+-›7 ^#Jx2%rEA _ #dKCxAEIx&cr.6wL.QV#-1و?z Op/~7a3.;Sӷnn&DpDpZF5髨•6Tr:Ze5KݦՄUK+ Z  溣. &OEh!$ 4 Tys A:9'00PCGKC&&TF* rB0PBNp C C EBwd!0O# $rل,"sGf`*tB!0BH&$;b0"`uG(BēB#̄M"D"0!z!c0H0=AG45@PQIP$H2!tNN~&DQ }Oc!%|M'K >"N8>!|/@|D>;>=ewwoJMEx{;Lx5*{2%!‹Tj/?u Pg맨' OwS.jz'1h;Mhn]mG魄G[}=x;q;l >wXĽ{aTd3IE۩mJB*D6qUDpt-H%!\A\E%7$CWCݡ".wXXPKj6Ѡ+>ԍ{)Oj'ƹQQ]PE݊ԇQꃨޏz꽨ލ.;5-qނz3M7ހ zPEݨnjԫP7W '0c+!q̗B/s . &OB6p A|Ba !4E& B!wt0AKԄʭStLF+/Q@QC껨WԷP>uwT܎VQ|/,!,&,"FJ( B1aa( 9J-vݷOÝPEȗ hǓg5q1jhBaPAI('J xrB#̄M"D0#ې]'QOG''Q@w8ߢ~)?PzԏQ?="APgQC}3pw>u;m|. r,B02Lh"L'L#4S S%L&L"&ZB&!BNH#RɄ$`I$X D  {^Tg7Q@=:k2KݨkE[ebFwi*-++V8/ٲ©]1xE Q„xŖP.Xx2,tYZعdbv1-huֶi=*ֶ6.lz Zwh;WnlB1_V wJ>τl>?1Λ]n51_bsޖαs]9OU{\a j}saWuu{0Z8l6| ĬΖ-332[393S3sNr܌I[&93`NZ焌-5αcc^Q9*Y9(wqX*hm03 y1Gc&2h1/]⢮+j["HuW 󌫌Ba|QftM]AۂıASIۂض'_N (hpfd􎑙zqHX?V/^g}FNCT^1ΞRƫZU ^5YmabW.>?|*PZաrb] ꨙRwsvƮogˆZW(u9\R2Os7K\!{=`) Z,X /Sea+`xE.9 I= 8ZB ZbEU:?p!UBȩS \{)x^`-< -VX K-mYzq?(!{Oq{cS vj\ԂAk(yڛ^qTug~̃ K`),a\+a a=\XW k`#\ n&n[6p';ύr.Ϲ?#{>00FxmdVlZy)nۆ\n;p(ݝv!wly܏3lK8s<+ %xwǒXQɹ-ƺ3N(-0gي1ފSVl2SHQ=v lc1uTkq- />ʿ|W0\ғ"܆8Zc$~>wkLLCQˇיZܙhv  ج XZ &*)/68{s62*qv"wn\sh NeFޝvbc7cs칱z}\=)'V1hJHuf{„M-Ƈ  y8[~@b04]K&4(.M10,7uukmT EBy!곲"235BӎlN7 1&Jޣ; Vatv" kDfVv2.&Gѝ9998Ý9\ fsqЏ[;7oV($f5N&cp#Hkβ%fRp\VBBV\QfݬO$$ˢcKǥMIQ}|ިZV9I}un~p. (J Z=.U,C)FÐaL]ip;(+!:m10tDt"Z~:S q9`qjO, ?9"fUbDDx8hOۻآ9f0,91`V764f9)C̹!s4E%$h45X|hOHOraJm:>XxKK.߽\왝.Q6{RQ۳jj&A"$CcI:CaG֎=f C[-n\YTf$.B{Ĭl[x8⒒UQ1&Eb <( F+ ЛRӳCTZ6FiL28%ڈp-M&)DU~_G > -$Ψ3$`ȃHH#:gy;,ffNnwffg ilvjL)_|+|>GKlG$J9br^*ؿ0uȂ"@K,_8axBreI:K2D]]cGjLSKFOZ3!)gf$|2Jg{3J~&bY&\?튙PY[_x)ፍcSRbYՇ!bauB \:8.^gOt~%9]i¸'b:zC]j<Ʉ:4ؙ|`F W]I>;sP9#F:aQo% /լ, P-IMFgu=Ɣ97h[QGXBn;vh&1)p)l7#؜4w}<LdY쳢`J5WcǧR Sy``z.P1מν~!JCZ=66( q`feQ \4# iϚ ]]|2}zgqWQ۽%BUs\XU>'k⒑q%=*2Ά- OI_ jo{{襓iqI|gMZU3Һ4MXbttb:93&ʦ҇mWyshoVpw2a`Uǿ^ulCx^CǔޥD=3w MƧó'FdC+;|ihai͞{Ӟ:;kC Uء14^ulچ;̻ܵP\+Bzqv!⣮@Op {ߍRq KsFT_Ac!]raR |hu|&27.3@Ŏ$\u>S0_-#$5kEbM?d$?IM}p_Hn| S<5eY1TPlI =o h3M tGFm}\jQ֤`f|$/X)iB"kPZJQ Kq1R¡f!3i[yJ+͒D=*OMxxDn=<L:r@BBz:Jp\tQQjgJ}{#c=BC̡s^Wa7~\" NMnI*< )Vx4[G +_7Y3E֎l;f*˟Y_4rbiXS娙!~׍Wrm5/:nAS9/9h*>}x.3=*0r`׆~Bq5lŇ;}ppSV5/?f]%N,iH|2 !!S7Jv'Px(ϟϹ?lCq }o[1>xpD!:_6PN5$%No{{[Tg)} tgg]GwU}G}[}I-%ԭòĶ,;cDZc+>c#H dۇ(w 00 y{d`a7/ `XB$U%Kx~Jw_JHKTv?Ҹ<.Kf{iw4B1{t_i'h5`A.~y/ >Oehvc9OmvlI~_Nh74L> `w:Nx#(diJ aGsA2r &`#mhpBh7ij]N3hmy:`}`DXś*lqFQm , ЕWŪ*,b8d-pFgBesI)WeKxDxSnˮ^Vwn6R_sN%=eP?#.բ->Lhva XcDS>|mOз:?Mk4H4n,ݐkM?ٷV3FFۆѭ?n1k.en;Uj\*wVᾰ汩,{6LK+o ͞C%spRWgO|pQ7B yc[qH٘e^tԱ '"=]3sR_qǷ/O]؇xxC3 ^kWH2p%xmu $i.EAҬV#I 9|{9z8>mU0)18x C%hk73rwed:{g- 2YUOtcyvZ1$f}KZLQD"\p{?ŵ._Tx!wρ8QDf21+ ɰGge0j;ϗWU]ilR0\H/\H_;} biM#x c,)ѕ||;s@#[} ߱{urBwGJ.a!p؏$?0Mq%4$D&#ېMsgY:֣E @3nMظ4@!yW!qkXvx":dfHSZ[ߕBGHp }2(S*Söls\怽|N> _^ŴD@EzdORkYlX5`~x("Xѫo=-|ĤQ ?st>UM1BNQ,E@Nd I׏"'x`gvm:Zzq <~g*'xhdžPʞtV1Z U?ũYF4Ce[ɲ!Ib| L?^XHư WI!a?BHrQ@֎?ig3L{R0!yK F hQZM6SljKd3OgFŖ 1s88y{'.dtRX,@&9GO'jKK x r,]̒BWrPޭTPΥԵ԰CXIQ8g軂@?T*i/R\?w^ /k0è ^K2@H> 1٨MLĎAѽ-Aa0{҉!T!Qw[:m 3  =]+#D=2@"w)P>9D }t& *A)'jdLs:W\Xlon U|j/QZa(+gxMn Z.]fHoխe-YM˵Mn)Uаۼ:ej1~u@pĺiK^d AL8yHz9, zSc 5MSvGΣkJJ^a˿xFWt?p.2{I_24t{ǿRw8dZ 36mt9Q׷v6@Hhe`׺߿&J1ΐ^E|qkjw\kR=)'7vm_hY 4o;:{&S'+NR?" )Ƭ9T[:Z*F|Cb.OþP3Kg, zt%[^]& FUIcE"q#]eĆVXD'Εai?\jXO+`Nm rǯ\w͕i\Cڕv$ \[h{WZM/q^ y{MNɣ 24DPIVaHJirmF՗ВESͦúQ ЦߞeКUlCUaoW#͊H8QBHZI[BNWH<>u l bDqǶ}\~ p.H^KFb R"k+2t6_Eϟ8zP3':_\SS}y z ;_x`dG|3m<4 c?(k /zŝy$[fl<:ZR #axAMI} J_x6 +_*F51:p[=EWS!#dcS[>!&42lXKG_9 l(mvߙvO\pjVbʼn;#pc G;+q7T.EFw æ/7P~ͿqȰ V-4MpQ_BW.8S4ˇ_~{\0V#Vcs/łla8u0-M=@Ε&1pE7Y o%C#RUĀ ; DѰȴ863QCl}BZr~Y tzаw Jm$ ,`)&RZdzOmOm]x) J(&=)ZPGX3XfEe Z-m+^ Zxyxΰ掖ndD~EA{cqPnn@/;qXqfn_~w{ x![vx(yP[k!kaȆwjrp\yVcXtN5+L(Ɍ=Qꔿ Z ؕW@@*ELQ}mRuJkה)ivGך i7i"i9-iɧ^}ʜSȎO} XdgHIQ홞ޣ­cP-: oDjGRtT8bWhn|=M$(oQ ~c7ež7~~uWww?@{]kzakѨ:< :RxW8EJN W隿gs>%-O(͖TM /5}3=r:1M)m[h͚82iadX4 ޒ5ƓɽeG6bκ)fCY+;Y;-`^-,-6t;MrZQ*Mro"1ʮ( IBu_\!Whߔ+] *5"s+ʚѯ!l^s#{\ I$)7o嬰߻͂XJ56H\p` h;+ݜuvLAʬ]p{*=!D43*;t&iT&C@̨`ͩ3* V& oQ5 $D"^gJDSf)_.,\y[▹"`))&۵RT}PeN$I9pvGIm߃P$C0cI V^LAd3.w!`nBӣT#g$z5xzPy9кUGs  VjMjI?n5Q$@bP &,~RNƀ0Q4n(=p^=ư0'RLQV $PNrͣ7FPbeYvjAǍ?BA@sneϣϔX`;SNVB5*(Qi5Rom5aJEOȀ#?q] X, A'GeF$aFZQZ%!Y !+N <'p9͋Їc S _!t5Wru/Ɛ6RʖDvu4e-RBDIaot`iN^_ ˿Cÿ-NXO#yl5WIHbEaZ4-9'fYYu1n}ˇ#]>׵P p>w<˿'3h"ag-@r^E鋩 >{4\5XxAo|E(۳aZObylD< H /;foo[^``0ODOqx˗n t w$$]gц \V./'+F3K)9^x eK۪{7˻ywY,qlı%8$,ɶY%NbŸ(- H&8 R\H0M;LϽ=YvLgw9Y:u9">'%5;A$1x$'4#څc `$:du4vḱQXY__Y\eNDװwxÚ(KPוa>8a\9P1Y8܃M[L=XˢU-8%E(]񏜩蘹\DUN~8üٞH֝A 5kmMҭ_uw56ek yrI^!U9\\[SXRc-/q ֎n^LD%ڍ֋c}\ʌU+3sJ2`\+: jرyEa-gZ,eHጽWmKMGkTLs!gΎ_VamBi%F+ʌ)9۱,]{ch'Y"GנkѮh^viqyxxFE,F)9[)*9>fyy0 &K.7^yQNF0\p&&&S*gB`KewJ]~8e$yRqnnq(Q Zˆʮj}wr[+YLzR@f6gE$X,[[2 s1U .jUkKcNy90C[Dr_WVj󲒳Il(H/К6ujvQrRQ~vtB^6&y5nMM NҨc߂xhobFqk6pmDY#^K]P' o =S3 bfK%ddՖW;+w{sR2rsڔTs}o23z[U罵i Zej^IwzvC¢jLGnk׬]b($;y8&ge򢖊 [{>Z{qkMk믬R)SSRk4_mU7^?xߚb2Aөc,64tm]ݔqGMk*gSiv e78;>߻*PZ,{z!-+z'yiP*ҭQ(Y^q:_/]%,;碢41_bmFqy9YYss\~vVdDm%ҟTGt _R7J--RWUEEbQ,R܆d_''_Q;yڍ~1rWW uțZ-hM>X_:Z[q,-uw5*)l:Xkwb7[Y#Q ûόee;gfٔ[s+Kd2V~6ׇx>i,+-eLee&>8-]f;f}0wCKoJKVm֝FcLs2hOE 8b$AЪ˗k3|&La4{ea3W$9=>k_9Oƛvey9WebUx8V+Ui2 J3JmWiT2mXWŕb/[{YVB%9T[yuxT$BU k~}S(!D쵤d*$zE8.&B}H?H{dgqp*s"}l,~XQFqEYRݑY#}: $P^)$EJ5:җ̌(XUPXQQAex[!p2E 6L;-Fn ol=ߧ.*/nQvI=%}(qFhE6YYҗ {dZ >y|IO?!p D1)'s+VK$/䗗pf,HT"!579X@}/j՞W?JY'sT94+IVZ07:Kh5BETgqv$^Ծъ8%(D2*ᙘIXbxӘGbH>'Oߓ&f+D Iiٺe,5UIgL6Uc?db\-41hz FjuIN`iqgS4ME9I*.ڀ$nO|u{?)*5Hl:=";A!Z$N$*}0qx0@:XMjGǏ ZAǣ Je`>b ]o)v7 |bTkAX yM}F8zxķsqEkdz dGH$ƈUo!<|&ci\$uXy҃`p(J6#x .KRn##hiszAgxz&- ;_`>Gk6N;Iq )^C4l_R%;4Ht}R:Bd'i)Js5EWsnSd)ԷgI qUB Z8~!uvAKid^ZECd {-TtUGf^B\ag޹x?㪮! u^^zi;pε-^ ꂓr"QP?pJx,;_-4tHF KeVq]d>/ Yy]G#ra(44 .Z=|f?\4|y%6b)64/g_@,B۱\|wkΟ{=E$7y-;ea>r]5Kt~Qu|x\)-?_5;C=we\I u/wP,k a Y%a]/̥KjO i'F8 ⤞q!pws/[w/Riw rAgcäY.~&KՔVXv/.QRNWWh[zaf㠊ZH7aF ?^@"CMqT۠Ըđ>6ZDuN+ -u0H ׆kf~OH` YU3( k7GkAv3c #%>’:@BzxtNLѶ8B`Vʇ1Z歪%>h"hW?;9G3뉥{gқFX}8s+o J)kHsQj:vңѨ#.+|TJXu#D %w2d/E/d'ñ "d5w5B7>/'WgH$|+5*V x\mAcjn83;M}NOטɵƼCAw9738,hzjs&ou4`=]sk]nx\;;9 wwrC\ks;=gp:9`p:87΀a3hs:wa6n A)~WgtǸWp N.O?֠sfz w \`~|SADz~ 8D@ n˹}6{sy 5 )`ty^W?LA4pnCRN+= rC>$H؃^0hd TN~C(*Z /7bA !{PSrAhdeC6J]{RZFF;HZ !eI)( (Ȫ"(tXqxGÈktlJ, Y.U9Z0Oz&XOn(n K%vbtBN q>?>D`1+(L缽P<)6RK0ea&e倭56+`llGۓ`{aآrV+0` ؞l/S#7f3da5nm ؾ؞lwۯZVf!60l _l[ `= o۟ Q!Įlk`lOۏoEXVmbD~Ht7kgfL.ArO.CrS:y939 &Y$M/r+N賉'~9\3'O>y$HgETL׸TӺQI%>,G(,i1*={ JӾd`3,RTc N.^.>~4T'SFI^__ :|F@2r1,bd~Y3"#8p@.7T3yzTw43B"@&H2\p'*. |2YVB6HBj>4$*FAI|ILMOXFZvOLLDj%p{Ĺ9D<D .pD1ꘙէn\ O=#Hh͢)٠#",ety_MX3>wtN sT?R򲻊ջ>xH>]Gx܏7%rHw@u?l]G875|{wݖz殦rxc1XY?nalٳ{C1a1\%Ngc{.+SC9b1q">/ >'k>򧎭85vaLqq@Mu~/oh 5@I(8$`1^!”Hd #n136 }#{S5`ddd)NE$qoXmT "EE R$܇^so; ^qS}ϴ<[r_1~㙤_|3Sk>|÷_+?;Onj\gw~]:> y9䫝Zδ>`]{d`l*?|)'^1k9wmMǟ{g_Y*9nxp(o՗_yxw_Oy;5Loצ?=t~oQǑ>==~]NV,<'NefVV\[]Sqtw|uȰdOs!(tV-/4\g#e}VƎtu|D^Sv/X ?pr~%H,T TF|BE8V/r8{'f{f_G] 57T m=srsaMdk'@H^&TzbBZ tHG H &u E wup͇9s3s93i[$+!T(슳\;?IcƨEh;KJ(DsC,Fյ<6"sXԧ-ch"o|vQj+*0ޒzv.ܠBh~"ԾK.5}з;[L pܛ ><ԝMH҄oU4u-dP Pn8nɬMڏTv3dܮsUgmQu+40$Tӑ(WP4P$ %$mE%e$E%22'2R0'[8\JOr'?"-],NKrxuW1^DiQ@fmX @.@Ԅ@$`p&ƀADdLoZ;yr |^.n|EӧMVENW m= iI6t2Mjбt:7`j9%d'"ĴlI}l@aSc 5aȬXsV]2n߆1R˥ܝ#G٦#v͈uQAd8ƨNvjO!?>d|x|›'bGqsѠ]f){! 7-YS[\ڑ^;*cpnAlgCaϵ} Ywȓv?P ln9͝ԶΨw&EܗrpQ0YOѶsjSڵ0  '͙G?:!;׷ ^O텑_jŒc47Fψs C`;l\$!͞RQ&EZqe"ƫv8򧍔bPoMCwwyjovTvqpE$ \Jś;Wn = {7F3A誛4#̺4?.At/ Vk" 4IR#z9z$x2W>;lτ6uGU{Fw\$g[/ުM ROl]Pagׇ̯R*?p\臮RT! eipt*H <O@ ^4SxkDʎ({3FOڂ3*@Ow7I[[8!{G}!?K}Ӑ ВQFa ݛŘ)ǡBTFIgrwybh}KgJ=?CP@xed+*q~5i(4u@d11:To}MrՊX7O} t@81eK$5il }NҮ ܣ OS0-3OggD-}h"֜X6b+J"} xl//S>ib'.1fƸQy$`eo;R`JT gox= svC-T1/kFh>wqDȃ#]he :Bp5CGN敢3!2/%^,xNp)'CP̛ŮK }R9pj2-U~ r0겅 C]eesgn/WF29;\}*³5{E|B6sKޥevtG}j4?]z>@ak,ӻ X3jTF-;[35]UmǘtPIL8<ϧ2; ˫0nqx*2xcRp71􏈱u{Zk{\~SvKaVW; b&Ln]л !P@sb8|H?22p@J;4Nag,_&g>抖zв chu$<4Rfrп_C&Bx|؈aȲLKYy Ly ␯C nϺ0i-{U(\GY2lyY'pC>z" gmbW\V{'L8|eӈ(ژ|G~腕oBpPC6Ի!QnikR؂CT cd5J|+ PW(z,+XSqDK%۫wr"k\R[eQ7ߦ)91qhracTbX] ^~㩲gN)]^O"uywwt?'שg_L g"x2/9"P"?s/P>xT1wDHFB EO>G->X@ܹ3S{GY$ LN#?$[ExBeH[_Kb.h$0 y NMH伷foپ+ϋq*s^ K3eF;sg@ҔR5;ڈozըQxw}#T^cpܵHu}aꄫ,Zl# ʿMʓ fcbNuRY^VjI[[HJE,)[HAaA銲HM .nT_xtb4Tr!V8rS;TOZNWznf.rINԊ.(jt")=Z+MZ'&{N`k[ +IèRaR`gWS(4i8qy jǤdqL( XV21ŇeaN:͗Ykwۑ9Se"v}LS]3noI UЛk݌ 0l֤ܕeI7e = CR`H OӁ?ndwSèyŏv8Xؑ^'T7ur7TmP.0S8[(@mXo$S. =mu-v!V1cFbyN-BE>&QHfQFZ[$jCi&BYD\?ga$۬&*>,aru*8)[DрfAmޒî%~OKs ji+KL8xJ}ie䃛1Fz@䲸)| 軅SpĹ!k 7q 3/o:^zK`UdJ[9^  '?#2̈D'͘,J!~ )foL #|,H9NCt|E]Uʐ2𤢺V2Nws7`=}ں}^? S)j.G+721]CT|=I Ѩz=oAʪ25g6O*Nbxff3b6-%U> J1 }jXEghʚ<0{iGUb+#gD'}-'0i{=;LB`npW"[hiB(1)l B]_Of : endstream endobj 2314 0 obj [ 0[ 507] 3[ 226] 18[ 529] 24[ 630] 28[ 488] 47[ 267] 62[ 423] 90[ 563] 100[ 495] 104[ 653] 258[ 494] 272[ 418] 286[ 503] 296[ 316] 336[ 474] 346[ 537] 349[ 246] 367[ 246] 374[ 537] 381[ 538] 393[ 537] 396[ 355] 400[ 399] 410[ 347] 449[ 745] 455[ 474] 855[ 276] 857[ 711] 882[ 306] 920[ 705] 1089[ 498] ] endobj 2315 0 obj [ 226 0 0 0 0 0 0 0 0 0 0 0 0 306 0 0 0 0 0 0 0 0 0 0 0 0 276 0 0 498 0 0 0 0 0 529 0 0 0 0 0 267 0 0 423 0 0 0 0 0 0 0 0 653 0 0 0 0 0 0 0 0 0 0 0 494 0 418 0 503 316 474 537 246 0 0 246 0 537 538 537 0 0 399 347 0 0 745 0 474] endobj 2316 0 obj <> stream Microsoft® PowerPoint® for Microsoft 365 PowerPoint PresentationMichèle Nuijten Microsoft® PowerPoint® for Microsoft 3652023-01-20T14:31:36+01:002023-01-20T14:31:36+01:00 uuid:80F4730B-69BA-47BD-882A-4D2C1645A587uuid:80F4730B-69BA-47BD-882A-4D2C1645A587 endstream endobj 2317 0 obj <> endobj 2318 0 obj <<0B73F480BA69BD47882A4D2C1645A587>] /Filter/FlateDecode/Length 4667>> stream x5weJFdo22M Q;W{uǷ{ιuz9MT_nҤ,_h:Т=qW/\wZ-S}a][Z{xЫ.)WvQXwQŷ>HauaPa87Mo:!}덜,l|Lag~ Ĵ®1 v;{  {L0p;W4^޿9;xMVo ne0n9' )bxaoze 0*QwwFwx\8fRai߅cÌq`^/>-9/n-.~8psw8Ym007777c Gu/?9S\|S{+ Oy&Ϳo :V4d̅t>eUa34E0Fs̋ycAhVh6X Q?XKa,.X(X],Xc%;D7հ:腵A_lua}l-16fb[lalG?;av.aw=a >C'\e8a(A80#qő8p1`4Nq8p&N8a<&,L9q&B\8|Leb.UWb:7z\kqMf܂[q/=w!܇xQ_|#~R"M=]_ OSף FQèa0j5FբQh\/`FE#u(^0*6F"nh<,E #u(^0U6F #hc0E"|_2EL_02F Qèhd0F#_/jm`F #u_0E#Hd/E"#Q`/E"xQx? uH]/QRFxQ`D1JŋE #gh\d05E#ѿH]T4R(Fѿad0(S*ZM_d0Eֈb/݌(FxH]/5E)xQÈiT-nF)Ѹa.2|FꢍQa3mE"_36F #n(^/ŋ6F#(^D12QDF Qèa0j5F Ѹbd0LM߫Í[W];\ɪ ӤKU07|9@kBh ڣڢ:3A',%8肮X Kb,ŪX`e5a 聞X } b!6 aSl 6 [`K=övD쎝v.{b a/Z8} ~8C1 }r:FVw@i;`Ubc_!ժ աՀjlcua8ƖkٍձjV8Oc 8a\m˰Ɩ8'ږ-VO7VV4VU箍սp&81 <ɸ`*`.ŸWr\Kq5•q57F܀qn-wN܁{:x!DžԻ>g_+Ի ~'[Q7?v?68ZFh#h45z\G#`mt:ٍGQm7ZFSx4Ga-GQߨo6zGǢm8F}Qبo$9 e$G#Qߨo7F̑Xd7zFv#݈p9F̑md7"e.CSFv#‘o+`md7"ٍnѲB}e FXqQ8b16FeňbDP m6FXq*NxxE#u`2ŋExQ(^2ŋE)xQ(^2ŋE)#=ѿ_/E#_d0E#ѿxH]/2QEZ0j5E QH]0j5E"H];mEѿH]/2QD"|bH]/2QEsc/RW #enwES:jo/a.̍y0?Cs̋X-ڠ5B+,hXb1,$` Xb9*VXc5t5ka^El 6B_l6Öry?@lS]=F6kivU#[|sjGصsƖ]3`ږ[ c썽0Cc_ PQ-(pő80q,0'$p*N83p:,L٘Is0<b\ q.eq.U:\kpnM ܌q>܋{0ƒxQ|/ >gk|o ~Dj;~ïSƃo?om-iZXij<-6i׶"Hkt,Fh4X!m3BFSnd7(l6RMWh45 [& ٍFShjd)nFh4XQ{7iޖABZn6*Z Fh#e th+G Vhc+a{g$2,#b6FeD{D1W ݌nF"#(W$2FEQ(e2r] |F"#ѿHd3`F>#|Q(e2JY (F"4X'_Zk-:X f45-?@jJEQLm"ӈi.mآm4.1G}hj45݌Fh#u0|FaQhj45q|FLm61Fo#Өv6ዴFEQѨoT4*Fh_45FaHk6j1w5M=g5eӈpd7z[SPUk4E3̋y079Z%D ,%m =ڡ3A'tXaQt2X]<òX +bUP+^5&Տii׫qZVC5 k,Qy^cgƪBOme]ae-`})6[b ?l`']+aoA}/~a?F QCpa8q4‘8818'Ds1ti' 8 gb2&a"4q!.TLE\2\qĵ^܈pn-wN܁q7Sa<cx <x f`&^śx>ûA1ӯS[XƇj[nilX}O1o%Oc˷_;z~F=?+~ +C|FamT4FhQm1RiFL#YmT4FZ#HkT 9FaQhq+6z-#[B>#e\XݡQ(e"+$2,dE#ѿ{+T4|F"QèaT4*DFEf3`F#hjD1E#HdT4*RzRLE*Ck7j +RFa3ƖJ#Qmq1FL3e@cFSѸhj45MFS01F#m4.1nF7g;zFEm3MnF7#ft3z|FLhj45FE#QѨhT4FS#hj45MF>#֨a45[hx45M(F#Hkt:b1Gv(lt,*l2JY b62XQ27VE /bn QPƕת-s"c>4ǂhZ%ڢ ZW_}k:[嗿vU⦷_mzGwlU~Yօo"7[gTam4? endstream endobj xref 0 2319 0000000217 65535 f 0000000017 00000 n 0000000188 00000 n 0000000296 00000 n 0000000676 00000 n 0000003093 00000 n 0000003146 00000 n 0000003199 00000 n 0000003376 00000 n 0000003622 00000 n 0000003765 00000 n 0000003870 00000 n 0000003975 00000 n 0000004080 00000 n 0000004185 00000 n 0000004343 00000 n 0000004487 00000 n 0000004592 00000 n 0000004697 00000 n 0000004802 00000 n 0000004907 00000 n 0000005065 00000 n 0000005209 00000 n 0000005314 00000 n 0000005419 00000 n 0000005524 00000 n 0000005629 00000 n 0000005785 00000 n 0000005929 00000 n 0000006034 00000 n 0000006139 00000 n 0000006244 00000 n 0000006349 00000 n 0000006503 00000 n 0000006633 00000 n 0000007015 00000 n 0000007159 00000 n 0000007264 00000 n 0000007369 00000 n 0000007474 00000 n 0000007579 00000 n 0000007737 00000 n 0000007867 00000 n 0000008282 00000 n 0000008426 00000 n 0000008531 00000 n 0000008636 00000 n 0000008741 00000 n 0000008846 00000 n 0000009004 00000 n 0000009176 00000 n 0000009418 00000 n 0000012589 00000 n 0000012733 00000 n 0000012838 00000 n 0000012943 00000 n 0000013048 00000 n 0000013153 00000 n 0000013312 00000 n 0000013456 00000 n 0000013561 00000 n 0000013666 00000 n 0000013771 00000 n 0000013876 00000 n 0000014035 00000 n 0000014179 00000 n 0000014284 00000 n 0000014389 00000 n 0000014494 00000 n 0000014599 00000 n 0000014755 00000 n 0000014885 00000 n 0000015244 00000 n 0000015388 00000 n 0000015493 00000 n 0000015598 00000 n 0000015703 00000 n 0000015808 00000 n 0000015964 00000 n 0000016108 00000 n 0000016213 00000 n 0000016318 00000 n 0000016423 00000 n 0000016528 00000 n 0000016684 00000 n 0000016828 00000 n 0000016933 00000 n 0000017038 00000 n 0000017143 00000 n 0000017248 00000 n 0000017402 00000 n 0000017532 00000 n 0000017865 00000 n 0000022694 00000 n 0000022838 00000 n 0000022943 00000 n 0000023048 00000 n 0000023153 00000 n 0000023258 00000 n 0000023416 00000 n 0000023564 00000 n 0000023670 00000 n 0000023776 00000 n 0000023882 00000 n 0000023988 00000 n 0000024145 00000 n 0000024294 00000 n 0000024400 00000 n 0000024506 00000 n 0000024612 00000 n 0000024718 00000 n 0000024879 00000 n 0000025011 00000 n 0000025334 00000 n 0000025483 00000 n 0000025589 00000 n 0000025695 00000 n 0000025801 00000 n 0000025907 00000 n 0000026068 00000 n 0000026200 00000 n 0000026516 00000 n 0000026648 00000 n 0000026964 00000 n 0000027113 00000 n 0000027219 00000 n 0000027325 00000 n 0000027431 00000 n 0000027537 00000 n 0000027695 00000 n 0000027844 00000 n 0000027950 00000 n 0000028056 00000 n 0000028162 00000 n 0000028268 00000 n 0000028428 00000 n 0000028577 00000 n 0000028683 00000 n 0000028789 00000 n 0000028895 00000 n 0000029001 00000 n 0000029161 00000 n 0000031159 00000 n 0000031308 00000 n 0000031414 00000 n 0000031520 00000 n 0000031626 00000 n 0000031732 00000 n 0000031891 00000 n 0000032040 00000 n 0000032146 00000 n 0000032252 00000 n 0000032358 00000 n 0000032464 00000 n 0000032620 00000 n 0000032769 00000 n 0000032875 00000 n 0000032981 00000 n 0000033087 00000 n 0000033193 00000 n 0000033352 00000 n 0000033501 00000 n 0000033607 00000 n 0000033713 00000 n 0000033819 00000 n 0000033925 00000 n 0000034085 00000 n 0000034234 00000 n 0000034340 00000 n 0000034446 00000 n 0000034552 00000 n 0000034658 00000 n 0000034819 00000 n 0000037197 00000 n 0000037346 00000 n 0000037452 00000 n 0000037558 00000 n 0000037664 00000 n 0000037770 00000 n 0000037931 00000 n 0000038080 00000 n 0000038186 00000 n 0000038292 00000 n 0000038398 00000 n 0000038504 00000 n 0000038665 00000 n 0000038814 00000 n 0000038920 00000 n 0000039026 00000 n 0000039132 00000 n 0000039238 00000 n 0000039399 00000 n 0000042149 00000 n 0000050376 00000 n 0000050555 00000 n 0000050803 00000 n 0000053272 00000 n 0000053408 00000 n 0000053440 00000 n 0000053605 00000 n 0000053680 00000 n 0000053923 00000 n 0000054064 00000 n 0000054096 00000 n 0000054266 00000 n 0000054341 00000 n 0000054589 00000 n 0000057107 00000 n 0000057466 00000 n 0000057532 00000 n 0000057627 00000 n 0000057736 00000 n 0000057845 00000 n 0000057954 00000 n 0000058063 00000 n 0000058173 00000 n 0000058283 00000 n 0000000218 65535 f 0000000219 65535 f 0000000220 65535 f 0000000221 65535 f 0000000222 65535 f 0000000223 65535 f 0000000224 65535 f 0000000225 65535 f 0000000226 65535 f 0000000227 65535 f 0000000228 65535 f 0000000229 65535 f 0000000230 65535 f 0000000231 65535 f 0000000232 65535 f 0000000233 65535 f 0000000234 65535 f 0000000235 65535 f 0000000236 65535 f 0000000237 65535 f 0000000238 65535 f 0000000239 65535 f 0000000240 65535 f 0000000241 65535 f 0000000242 65535 f 0000000243 65535 f 0000000244 65535 f 0000000245 65535 f 0000000246 65535 f 0000000247 65535 f 0000000248 65535 f 0000000249 65535 f 0000000250 65535 f 0000000251 65535 f 0000000252 65535 f 0000000253 65535 f 0000000254 65535 f 0000000255 65535 f 0000000256 65535 f 0000000257 65535 f 0000000258 65535 f 0000000259 65535 f 0000000260 65535 f 0000000261 65535 f 0000000262 65535 f 0000000263 65535 f 0000000264 65535 f 0000000265 65535 f 0000000266 65535 f 0000000267 65535 f 0000000268 65535 f 0000000269 65535 f 0000000270 65535 f 0000000271 65535 f 0000000272 65535 f 0000000273 65535 f 0000000274 65535 f 0000000275 65535 f 0000000276 65535 f 0000000277 65535 f 0000000278 65535 f 0000000279 65535 f 0000000280 65535 f 0000000281 65535 f 0000000282 65535 f 0000000283 65535 f 0000000284 65535 f 0000000285 65535 f 0000000286 65535 f 0000000287 65535 f 0000000288 65535 f 0000000289 65535 f 0000000290 65535 f 0000000291 65535 f 0000000292 65535 f 0000000293 65535 f 0000000294 65535 f 0000000295 65535 f 0000000296 65535 f 0000000297 65535 f 0000000298 65535 f 0000000299 65535 f 0000000300 65535 f 0000000301 65535 f 0000000302 65535 f 0000000303 65535 f 0000000304 65535 f 0000000305 65535 f 0000000306 65535 f 0000000307 65535 f 0000000308 65535 f 0000000309 65535 f 0000000310 65535 f 0000000311 65535 f 0000000312 65535 f 0000000313 65535 f 0000000314 65535 f 0000000315 65535 f 0000000316 65535 f 0000000317 65535 f 0000000318 65535 f 0000000319 65535 f 0000000320 65535 f 0000000321 65535 f 0000000322 65535 f 0000000323 65535 f 0000000324 65535 f 0000000325 65535 f 0000000326 65535 f 0000000327 65535 f 0000000328 65535 f 0000000329 65535 f 0000000330 65535 f 0000000331 65535 f 0000000332 65535 f 0000000333 65535 f 0000000334 65535 f 0000000335 65535 f 0000000336 65535 f 0000000337 65535 f 0000000338 65535 f 0000000339 65535 f 0000000340 65535 f 0000000341 65535 f 0000000342 65535 f 0000000343 65535 f 0000000344 65535 f 0000000345 65535 f 0000000346 65535 f 0000000347 65535 f 0000000348 65535 f 0000000349 65535 f 0000000350 65535 f 0000000351 65535 f 0000000352 65535 f 0000000353 65535 f 0000000354 65535 f 0000000355 65535 f 0000000356 65535 f 0000000357 65535 f 0000000358 65535 f 0000000359 65535 f 0000000360 65535 f 0000000361 65535 f 0000000362 65535 f 0000000363 65535 f 0000000364 65535 f 0000000365 65535 f 0000000366 65535 f 0000000367 65535 f 0000000368 65535 f 0000000369 65535 f 0000000370 65535 f 0000000371 65535 f 0000000372 65535 f 0000000373 65535 f 0000000374 65535 f 0000000375 65535 f 0000000376 65535 f 0000000377 65535 f 0000000378 65535 f 0000000379 65535 f 0000000380 65535 f 0000000381 65535 f 0000000382 65535 f 0000000383 65535 f 0000000384 65535 f 0000000385 65535 f 0000000386 65535 f 0000000387 65535 f 0000000388 65535 f 0000000389 65535 f 0000000390 65535 f 0000000391 65535 f 0000000392 65535 f 0000000393 65535 f 0000000394 65535 f 0000000395 65535 f 0000000396 65535 f 0000000397 65535 f 0000000398 65535 f 0000000399 65535 f 0000000400 65535 f 0000000401 65535 f 0000000402 65535 f 0000000403 65535 f 0000000404 65535 f 0000000405 65535 f 0000000406 65535 f 0000000407 65535 f 0000000408 65535 f 0000000409 65535 f 0000000410 65535 f 0000000411 65535 f 0000000412 65535 f 0000000413 65535 f 0000000414 65535 f 0000000415 65535 f 0000000416 65535 f 0000000417 65535 f 0000000418 65535 f 0000000419 65535 f 0000000420 65535 f 0000000421 65535 f 0000000422 65535 f 0000000423 65535 f 0000000424 65535 f 0000000425 65535 f 0000000426 65535 f 0000000427 65535 f 0000000428 65535 f 0000000429 65535 f 0000000430 65535 f 0000000431 65535 f 0000000432 65535 f 0000000433 65535 f 0000000434 65535 f 0000000435 65535 f 0000000436 65535 f 0000000437 65535 f 0000000438 65535 f 0000000439 65535 f 0000000440 65535 f 0000000441 65535 f 0000000442 65535 f 0000000443 65535 f 0000000444 65535 f 0000000445 65535 f 0000000446 65535 f 0000000447 65535 f 0000000448 65535 f 0000000449 65535 f 0000000450 65535 f 0000000451 65535 f 0000000452 65535 f 0000000453 65535 f 0000000454 65535 f 0000000455 65535 f 0000000456 65535 f 0000000457 65535 f 0000000458 65535 f 0000000459 65535 f 0000000460 65535 f 0000000461 65535 f 0000000462 65535 f 0000000463 65535 f 0000000464 65535 f 0000000465 65535 f 0000000466 65535 f 0000000467 65535 f 0000000468 65535 f 0000000469 65535 f 0000000470 65535 f 0000000471 65535 f 0000000472 65535 f 0000000473 65535 f 0000000474 65535 f 0000000475 65535 f 0000000476 65535 f 0000000477 65535 f 0000000478 65535 f 0000000479 65535 f 0000000480 65535 f 0000000481 65535 f 0000000482 65535 f 0000000483 65535 f 0000000484 65535 f 0000000485 65535 f 0000000486 65535 f 0000000487 65535 f 0000000488 65535 f 0000000489 65535 f 0000000490 65535 f 0000000491 65535 f 0000000492 65535 f 0000000493 65535 f 0000000494 65535 f 0000000495 65535 f 0000000496 65535 f 0000000497 65535 f 0000000498 65535 f 0000000499 65535 f 0000000500 65535 f 0000000501 65535 f 0000000502 65535 f 0000000503 65535 f 0000000504 65535 f 0000000505 65535 f 0000000506 65535 f 0000000507 65535 f 0000000508 65535 f 0000000509 65535 f 0000000510 65535 f 0000000511 65535 f 0000000512 65535 f 0000000513 65535 f 0000000514 65535 f 0000000515 65535 f 0000000516 65535 f 0000000517 65535 f 0000000518 65535 f 0000000519 65535 f 0000000520 65535 f 0000000521 65535 f 0000000522 65535 f 0000000523 65535 f 0000000524 65535 f 0000000525 65535 f 0000000526 65535 f 0000000527 65535 f 0000000528 65535 f 0000000529 65535 f 0000000530 65535 f 0000000531 65535 f 0000000532 65535 f 0000000533 65535 f 0000000534 65535 f 0000000535 65535 f 0000000536 65535 f 0000000537 65535 f 0000000538 65535 f 0000000539 65535 f 0000000540 65535 f 0000000541 65535 f 0000000542 65535 f 0000000543 65535 f 0000000544 65535 f 0000000545 65535 f 0000000546 65535 f 0000000547 65535 f 0000000548 65535 f 0000000549 65535 f 0000000550 65535 f 0000000551 65535 f 0000000552 65535 f 0000000553 65535 f 0000000554 65535 f 0000000555 65535 f 0000000556 65535 f 0000000557 65535 f 0000000558 65535 f 0000000559 65535 f 0000000560 65535 f 0000000561 65535 f 0000000562 65535 f 0000000563 65535 f 0000000564 65535 f 0000000565 65535 f 0000000566 65535 f 0000000567 65535 f 0000000568 65535 f 0000000569 65535 f 0000000570 65535 f 0000000571 65535 f 0000000572 65535 f 0000000573 65535 f 0000000574 65535 f 0000000575 65535 f 0000000576 65535 f 0000000577 65535 f 0000000578 65535 f 0000000579 65535 f 0000000580 65535 f 0000000581 65535 f 0000000582 65535 f 0000000583 65535 f 0000000584 65535 f 0000000585 65535 f 0000000586 65535 f 0000000587 65535 f 0000000588 65535 f 0000000589 65535 f 0000000590 65535 f 0000000591 65535 f 0000000592 65535 f 0000000593 65535 f 0000000594 65535 f 0000000595 65535 f 0000000596 65535 f 0000000597 65535 f 0000000598 65535 f 0000000599 65535 f 0000000600 65535 f 0000000601 65535 f 0000000602 65535 f 0000000603 65535 f 0000000604 65535 f 0000000605 65535 f 0000000606 65535 f 0000000607 65535 f 0000000608 65535 f 0000000609 65535 f 0000000610 65535 f 0000000611 65535 f 0000000612 65535 f 0000000613 65535 f 0000000614 65535 f 0000000615 65535 f 0000000616 65535 f 0000000617 65535 f 0000000618 65535 f 0000000619 65535 f 0000000620 65535 f 0000000621 65535 f 0000000622 65535 f 0000000623 65535 f 0000000624 65535 f 0000000625 65535 f 0000000626 65535 f 0000000627 65535 f 0000000628 65535 f 0000000629 65535 f 0000000630 65535 f 0000000631 65535 f 0000000632 65535 f 0000000633 65535 f 0000000634 65535 f 0000000635 65535 f 0000000636 65535 f 0000000637 65535 f 0000000638 65535 f 0000000639 65535 f 0000000640 65535 f 0000000641 65535 f 0000000642 65535 f 0000000643 65535 f 0000000644 65535 f 0000000645 65535 f 0000000646 65535 f 0000000647 65535 f 0000000648 65535 f 0000000649 65535 f 0000000650 65535 f 0000000651 65535 f 0000000652 65535 f 0000000653 65535 f 0000000654 65535 f 0000000655 65535 f 0000000656 65535 f 0000000657 65535 f 0000000658 65535 f 0000000659 65535 f 0000000660 65535 f 0000000661 65535 f 0000000662 65535 f 0000000663 65535 f 0000000664 65535 f 0000000665 65535 f 0000000666 65535 f 0000000667 65535 f 0000000668 65535 f 0000000669 65535 f 0000000670 65535 f 0000000671 65535 f 0000000672 65535 f 0000000673 65535 f 0000000674 65535 f 0000000675 65535 f 0000000676 65535 f 0000000677 65535 f 0000000678 65535 f 0000000679 65535 f 0000000680 65535 f 0000000681 65535 f 0000000682 65535 f 0000000683 65535 f 0000000684 65535 f 0000000685 65535 f 0000000686 65535 f 0000000687 65535 f 0000000688 65535 f 0000000689 65535 f 0000000690 65535 f 0000000691 65535 f 0000000692 65535 f 0000000693 65535 f 0000000694 65535 f 0000000695 65535 f 0000000696 65535 f 0000000697 65535 f 0000000698 65535 f 0000000699 65535 f 0000000700 65535 f 0000000701 65535 f 0000000702 65535 f 0000000703 65535 f 0000000704 65535 f 0000000705 65535 f 0000000706 65535 f 0000000707 65535 f 0000000708 65535 f 0000000709 65535 f 0000000710 65535 f 0000000711 65535 f 0000000712 65535 f 0000000713 65535 f 0000000714 65535 f 0000000715 65535 f 0000000716 65535 f 0000000717 65535 f 0000000718 65535 f 0000000719 65535 f 0000000720 65535 f 0000000721 65535 f 0000000722 65535 f 0000000723 65535 f 0000000724 65535 f 0000000725 65535 f 0000000726 65535 f 0000000727 65535 f 0000000728 65535 f 0000000729 65535 f 0000000730 65535 f 0000000731 65535 f 0000000732 65535 f 0000000733 65535 f 0000000734 65535 f 0000000735 65535 f 0000000736 65535 f 0000000737 65535 f 0000000738 65535 f 0000000739 65535 f 0000000740 65535 f 0000000741 65535 f 0000000742 65535 f 0000000743 65535 f 0000000744 65535 f 0000000745 65535 f 0000000746 65535 f 0000000747 65535 f 0000000748 65535 f 0000000749 65535 f 0000000750 65535 f 0000000751 65535 f 0000000752 65535 f 0000000753 65535 f 0000000754 65535 f 0000000755 65535 f 0000000756 65535 f 0000000757 65535 f 0000000758 65535 f 0000000759 65535 f 0000000760 65535 f 0000000761 65535 f 0000000762 65535 f 0000000763 65535 f 0000000764 65535 f 0000000765 65535 f 0000000766 65535 f 0000000767 65535 f 0000000768 65535 f 0000000769 65535 f 0000000770 65535 f 0000000771 65535 f 0000000772 65535 f 0000000773 65535 f 0000000774 65535 f 0000000775 65535 f 0000000776 65535 f 0000000777 65535 f 0000000778 65535 f 0000000779 65535 f 0000000780 65535 f 0000000781 65535 f 0000000782 65535 f 0000000783 65535 f 0000000784 65535 f 0000000785 65535 f 0000000786 65535 f 0000000787 65535 f 0000000788 65535 f 0000000789 65535 f 0000000790 65535 f 0000000791 65535 f 0000000792 65535 f 0000000793 65535 f 0000000794 65535 f 0000000795 65535 f 0000000796 65535 f 0000000797 65535 f 0000000798 65535 f 0000000799 65535 f 0000000800 65535 f 0000000801 65535 f 0000000802 65535 f 0000000803 65535 f 0000000804 65535 f 0000000805 65535 f 0000000806 65535 f 0000000807 65535 f 0000000808 65535 f 0000000809 65535 f 0000000810 65535 f 0000000811 65535 f 0000000812 65535 f 0000000813 65535 f 0000000814 65535 f 0000000815 65535 f 0000000816 65535 f 0000000817 65535 f 0000000818 65535 f 0000000819 65535 f 0000000820 65535 f 0000000821 65535 f 0000000822 65535 f 0000000823 65535 f 0000000824 65535 f 0000000825 65535 f 0000000826 65535 f 0000000827 65535 f 0000000828 65535 f 0000000829 65535 f 0000000830 65535 f 0000000831 65535 f 0000000832 65535 f 0000000833 65535 f 0000000834 65535 f 0000000835 65535 f 0000000836 65535 f 0000000837 65535 f 0000000838 65535 f 0000000839 65535 f 0000000840 65535 f 0000000841 65535 f 0000000843 65535 f 0000071839 00000 n 0000000844 65535 f 0000000845 65535 f 0000000846 65535 f 0000000848 65535 f 0000071885 00000 n 0000000850 65535 f 0000071931 00000 n 0000000852 65535 f 0000071977 00000 n 0000000854 65535 f 0000072023 00000 n 0000000856 65535 f 0000072069 00000 n 0000000857 65535 f 0000000858 65535 f 0000000859 65535 f 0000000861 65535 f 0000072115 00000 n 0000000863 65535 f 0000072161 00000 n 0000000865 65535 f 0000072207 00000 n 0000000866 65535 f 0000000867 65535 f 0000000868 65535 f 0000000870 65535 f 0000072253 00000 n 0000000871 65535 f 0000000872 65535 f 0000000873 65535 f 0000000875 65535 f 0000072299 00000 n 0000000876 65535 f 0000000877 65535 f 0000000878 65535 f 0000000880 65535 f 0000072345 00000 n 0000000882 65535 f 0000072391 00000 n 0000000884 65535 f 0000072437 00000 n 0000000886 65535 f 0000072483 00000 n 0000000887 65535 f 0000000888 65535 f 0000000889 65535 f 0000000890 65535 f 0000000891 65535 f 0000000892 65535 f 0000000893 65535 f 0000000894 65535 f 0000000895 65535 f 0000000896 65535 f 0000000897 65535 f 0000000898 65535 f 0000000899 65535 f 0000000900 65535 f 0000000901 65535 f 0000000902 65535 f 0000000903 65535 f 0000000904 65535 f 0000000905 65535 f 0000000906 65535 f 0000000907 65535 f 0000000908 65535 f 0000000909 65535 f 0000000910 65535 f 0000000911 65535 f 0000000912 65535 f 0000000913 65535 f 0000000914 65535 f 0000000915 65535 f 0000000916 65535 f 0000000917 65535 f 0000000918 65535 f 0000000919 65535 f 0000000920 65535 f 0000000921 65535 f 0000000922 65535 f 0000000923 65535 f 0000000924 65535 f 0000000925 65535 f 0000000926 65535 f 0000000927 65535 f 0000000928 65535 f 0000000929 65535 f 0000000930 65535 f 0000000931 65535 f 0000000932 65535 f 0000000933 65535 f 0000000934 65535 f 0000000935 65535 f 0000000936 65535 f 0000000937 65535 f 0000000938 65535 f 0000000939 65535 f 0000000940 65535 f 0000000941 65535 f 0000000942 65535 f 0000000943 65535 f 0000000944 65535 f 0000000945 65535 f 0000000946 65535 f 0000000947 65535 f 0000000948 65535 f 0000000949 65535 f 0000000950 65535 f 0000000951 65535 f 0000000952 65535 f 0000000953 65535 f 0000000954 65535 f 0000000955 65535 f 0000000956 65535 f 0000000957 65535 f 0000000958 65535 f 0000000959 65535 f 0000000960 65535 f 0000000961 65535 f 0000000962 65535 f 0000000963 65535 f 0000000964 65535 f 0000000965 65535 f 0000000966 65535 f 0000000967 65535 f 0000000968 65535 f 0000000969 65535 f 0000000970 65535 f 0000000971 65535 f 0000000972 65535 f 0000000973 65535 f 0000000974 65535 f 0000000975 65535 f 0000000976 65535 f 0000000977 65535 f 0000000978 65535 f 0000000979 65535 f 0000000980 65535 f 0000000981 65535 f 0000000982 65535 f 0000000983 65535 f 0000000984 65535 f 0000000985 65535 f 0000000986 65535 f 0000000987 65535 f 0000000988 65535 f 0000000989 65535 f 0000000990 65535 f 0000000991 65535 f 0000000992 65535 f 0000000993 65535 f 0000000994 65535 f 0000000995 65535 f 0000000996 65535 f 0000000997 65535 f 0000000998 65535 f 0000000999 65535 f 0000001000 65535 f 0000001001 65535 f 0000001002 65535 f 0000001003 65535 f 0000001004 65535 f 0000001005 65535 f 0000001006 65535 f 0000001007 65535 f 0000001008 65535 f 0000001009 65535 f 0000001010 65535 f 0000001011 65535 f 0000001012 65535 f 0000001013 65535 f 0000001014 65535 f 0000001015 65535 f 0000001016 65535 f 0000001017 65535 f 0000001018 65535 f 0000001019 65535 f 0000001020 65535 f 0000001021 65535 f 0000001022 65535 f 0000001023 65535 f 0000001024 65535 f 0000001025 65535 f 0000001026 65535 f 0000001027 65535 f 0000001028 65535 f 0000001029 65535 f 0000001030 65535 f 0000001031 65535 f 0000001032 65535 f 0000001033 65535 f 0000001034 65535 f 0000001035 65535 f 0000001036 65535 f 0000001037 65535 f 0000001038 65535 f 0000001039 65535 f 0000001040 65535 f 0000001041 65535 f 0000001042 65535 f 0000001043 65535 f 0000001044 65535 f 0000001045 65535 f 0000001046 65535 f 0000001047 65535 f 0000001048 65535 f 0000001049 65535 f 0000001050 65535 f 0000001051 65535 f 0000001052 65535 f 0000001053 65535 f 0000001054 65535 f 0000001055 65535 f 0000001056 65535 f 0000001057 65535 f 0000001058 65535 f 0000001059 65535 f 0000001060 65535 f 0000001061 65535 f 0000001062 65535 f 0000001063 65535 f 0000001064 65535 f 0000001065 65535 f 0000001066 65535 f 0000001067 65535 f 0000001068 65535 f 0000001069 65535 f 0000001070 65535 f 0000001071 65535 f 0000001072 65535 f 0000001073 65535 f 0000001074 65535 f 0000001075 65535 f 0000001076 65535 f 0000001077 65535 f 0000001078 65535 f 0000001079 65535 f 0000001080 65535 f 0000001081 65535 f 0000001082 65535 f 0000001083 65535 f 0000001084 65535 f 0000001085 65535 f 0000001086 65535 f 0000001087 65535 f 0000001088 65535 f 0000001089 65535 f 0000001090 65535 f 0000001091 65535 f 0000001092 65535 f 0000001093 65535 f 0000001094 65535 f 0000001095 65535 f 0000001096 65535 f 0000001097 65535 f 0000001098 65535 f 0000001099 65535 f 0000001100 65535 f 0000001101 65535 f 0000001102 65535 f 0000001103 65535 f 0000001104 65535 f 0000001105 65535 f 0000001106 65535 f 0000001107 65535 f 0000001108 65535 f 0000001109 65535 f 0000001110 65535 f 0000001111 65535 f 0000001112 65535 f 0000001113 65535 f 0000001114 65535 f 0000001115 65535 f 0000001116 65535 f 0000001117 65535 f 0000001118 65535 f 0000001119 65535 f 0000001120 65535 f 0000001121 65535 f 0000001122 65535 f 0000001123 65535 f 0000001124 65535 f 0000001125 65535 f 0000001126 65535 f 0000001127 65535 f 0000001128 65535 f 0000001129 65535 f 0000001130 65535 f 0000001131 65535 f 0000001132 65535 f 0000001133 65535 f 0000001134 65535 f 0000001135 65535 f 0000001136 65535 f 0000001137 65535 f 0000001138 65535 f 0000001139 65535 f 0000001140 65535 f 0000001141 65535 f 0000001142 65535 f 0000001143 65535 f 0000001144 65535 f 0000001145 65535 f 0000001146 65535 f 0000001147 65535 f 0000001148 65535 f 0000001149 65535 f 0000001150 65535 f 0000001151 65535 f 0000001152 65535 f 0000001153 65535 f 0000001154 65535 f 0000001155 65535 f 0000001156 65535 f 0000001157 65535 f 0000001158 65535 f 0000001159 65535 f 0000001160 65535 f 0000001161 65535 f 0000001162 65535 f 0000001163 65535 f 0000001164 65535 f 0000001165 65535 f 0000001166 65535 f 0000001167 65535 f 0000001168 65535 f 0000001169 65535 f 0000001170 65535 f 0000001171 65535 f 0000001172 65535 f 0000001173 65535 f 0000001174 65535 f 0000001175 65535 f 0000001176 65535 f 0000001177 65535 f 0000001178 65535 f 0000001179 65535 f 0000001180 65535 f 0000001181 65535 f 0000001182 65535 f 0000001183 65535 f 0000001184 65535 f 0000001185 65535 f 0000001186 65535 f 0000001187 65535 f 0000001188 65535 f 0000001189 65535 f 0000001190 65535 f 0000001191 65535 f 0000001192 65535 f 0000001193 65535 f 0000001194 65535 f 0000001195 65535 f 0000001196 65535 f 0000001197 65535 f 0000001198 65535 f 0000001199 65535 f 0000001200 65535 f 0000001201 65535 f 0000001202 65535 f 0000001203 65535 f 0000001204 65535 f 0000001205 65535 f 0000001206 65535 f 0000001207 65535 f 0000001208 65535 f 0000001209 65535 f 0000001210 65535 f 0000001211 65535 f 0000001212 65535 f 0000001213 65535 f 0000001214 65535 f 0000001215 65535 f 0000001216 65535 f 0000001217 65535 f 0000001218 65535 f 0000001219 65535 f 0000001220 65535 f 0000001221 65535 f 0000001222 65535 f 0000001223 65535 f 0000001224 65535 f 0000001225 65535 f 0000001226 65535 f 0000001227 65535 f 0000001228 65535 f 0000001229 65535 f 0000001230 65535 f 0000001231 65535 f 0000001232 65535 f 0000001233 65535 f 0000001234 65535 f 0000001235 65535 f 0000001236 65535 f 0000001237 65535 f 0000001238 65535 f 0000001239 65535 f 0000001240 65535 f 0000001241 65535 f 0000001242 65535 f 0000001243 65535 f 0000001244 65535 f 0000001245 65535 f 0000001246 65535 f 0000001247 65535 f 0000001248 65535 f 0000001249 65535 f 0000001250 65535 f 0000001251 65535 f 0000001252 65535 f 0000001253 65535 f 0000001254 65535 f 0000001255 65535 f 0000001256 65535 f 0000001257 65535 f 0000001258 65535 f 0000001259 65535 f 0000001260 65535 f 0000001261 65535 f 0000001262 65535 f 0000001263 65535 f 0000001264 65535 f 0000001265 65535 f 0000001266 65535 f 0000001267 65535 f 0000001268 65535 f 0000001269 65535 f 0000001270 65535 f 0000001271 65535 f 0000001272 65535 f 0000001273 65535 f 0000001274 65535 f 0000001275 65535 f 0000001276 65535 f 0000001277 65535 f 0000001278 65535 f 0000001279 65535 f 0000001280 65535 f 0000001281 65535 f 0000001282 65535 f 0000001283 65535 f 0000001284 65535 f 0000001285 65535 f 0000001286 65535 f 0000001287 65535 f 0000001288 65535 f 0000001289 65535 f 0000001290 65535 f 0000001291 65535 f 0000001292 65535 f 0000001293 65535 f 0000001294 65535 f 0000001295 65535 f 0000001296 65535 f 0000001297 65535 f 0000001298 65535 f 0000001299 65535 f 0000001300 65535 f 0000001301 65535 f 0000001302 65535 f 0000001303 65535 f 0000001304 65535 f 0000001305 65535 f 0000001306 65535 f 0000001307 65535 f 0000001308 65535 f 0000001309 65535 f 0000001310 65535 f 0000001311 65535 f 0000001312 65535 f 0000001313 65535 f 0000001314 65535 f 0000001315 65535 f 0000001316 65535 f 0000001317 65535 f 0000001318 65535 f 0000001319 65535 f 0000001320 65535 f 0000001321 65535 f 0000001322 65535 f 0000001323 65535 f 0000001324 65535 f 0000001325 65535 f 0000001327 65535 f 0000079216 00000 n 0000001329 65535 f 0000079263 00000 n 0000001330 65535 f 0000001331 65535 f 0000001332 65535 f 0000001333 65535 f 0000001335 65535 f 0000079310 00000 n 0000001337 65535 f 0000079357 00000 n 0000001338 65535 f 0000001339 65535 f 0000001340 65535 f 0000001342 65535 f 0000079404 00000 n 0000001343 65535 f 0000001344 65535 f 0000001345 65535 f 0000001347 65535 f 0000079451 00000 n 0000001348 65535 f 0000001349 65535 f 0000001350 65535 f 0000001351 65535 f 0000001352 65535 f 0000001353 65535 f 0000001354 65535 f 0000001355 65535 f 0000001356 65535 f 0000001357 65535 f 0000001358 65535 f 0000001359 65535 f 0000001360 65535 f 0000001361 65535 f 0000001362 65535 f 0000001363 65535 f 0000001364 65535 f 0000001365 65535 f 0000001366 65535 f 0000001367 65535 f 0000001368 65535 f 0000001369 65535 f 0000001370 65535 f 0000001371 65535 f 0000001372 65535 f 0000001373 65535 f 0000001374 65535 f 0000001375 65535 f 0000001376 65535 f 0000001377 65535 f 0000001378 65535 f 0000001379 65535 f 0000001380 65535 f 0000001381 65535 f 0000001382 65535 f 0000001383 65535 f 0000001384 65535 f 0000001385 65535 f 0000001386 65535 f 0000001387 65535 f 0000001388 65535 f 0000001389 65535 f 0000001390 65535 f 0000001391 65535 f 0000001392 65535 f 0000001393 65535 f 0000001394 65535 f 0000001395 65535 f 0000001396 65535 f 0000001397 65535 f 0000001398 65535 f 0000001399 65535 f 0000001400 65535 f 0000001401 65535 f 0000001402 65535 f 0000001403 65535 f 0000001404 65535 f 0000001405 65535 f 0000001406 65535 f 0000001407 65535 f 0000001408 65535 f 0000001409 65535 f 0000001410 65535 f 0000001411 65535 f 0000001412 65535 f 0000001413 65535 f 0000001414 65535 f 0000001415 65535 f 0000001416 65535 f 0000001417 65535 f 0000001418 65535 f 0000001419 65535 f 0000001420 65535 f 0000001421 65535 f 0000001422 65535 f 0000001423 65535 f 0000001424 65535 f 0000001425 65535 f 0000001426 65535 f 0000001427 65535 f 0000001428 65535 f 0000001429 65535 f 0000001430 65535 f 0000001431 65535 f 0000001432 65535 f 0000001433 65535 f 0000001434 65535 f 0000001435 65535 f 0000001436 65535 f 0000001437 65535 f 0000001438 65535 f 0000001439 65535 f 0000001440 65535 f 0000001441 65535 f 0000001442 65535 f 0000001443 65535 f 0000001444 65535 f 0000001445 65535 f 0000001446 65535 f 0000001447 65535 f 0000001448 65535 f 0000001449 65535 f 0000001450 65535 f 0000001451 65535 f 0000001452 65535 f 0000001453 65535 f 0000001454 65535 f 0000001455 65535 f 0000001456 65535 f 0000001457 65535 f 0000001458 65535 f 0000001459 65535 f 0000001460 65535 f 0000001461 65535 f 0000001462 65535 f 0000001463 65535 f 0000001464 65535 f 0000001465 65535 f 0000001466 65535 f 0000001467 65535 f 0000001468 65535 f 0000001469 65535 f 0000001470 65535 f 0000001471 65535 f 0000001472 65535 f 0000001473 65535 f 0000001474 65535 f 0000001475 65535 f 0000001476 65535 f 0000001477 65535 f 0000001478 65535 f 0000001479 65535 f 0000001480 65535 f 0000001481 65535 f 0000001482 65535 f 0000001483 65535 f 0000001484 65535 f 0000001485 65535 f 0000001486 65535 f 0000001487 65535 f 0000001488 65535 f 0000001489 65535 f 0000001490 65535 f 0000001491 65535 f 0000001492 65535 f 0000001493 65535 f 0000001494 65535 f 0000001495 65535 f 0000001496 65535 f 0000001497 65535 f 0000001498 65535 f 0000001499 65535 f 0000001500 65535 f 0000001501 65535 f 0000001502 65535 f 0000001503 65535 f 0000001504 65535 f 0000001506 65535 f 0000079498 00000 n 0000001508 65535 f 0000079545 00000 n 0000001509 65535 f 0000001510 65535 f 0000001511 65535 f 0000001513 65535 f 0000079592 00000 n 0000001515 65535 f 0000079639 00000 n 0000001516 65535 f 0000001517 65535 f 0000001518 65535 f 0000001520 65535 f 0000079686 00000 n 0000001521 65535 f 0000001522 65535 f 0000001523 65535 f 0000001525 65535 f 0000079733 00000 n 0000001526 65535 f 0000001527 65535 f 0000001528 65535 f 0000001529 65535 f 0000001530 65535 f 0000001531 65535 f 0000001532 65535 f 0000001533 65535 f 0000001534 65535 f 0000001535 65535 f 0000001536 65535 f 0000001537 65535 f 0000001538 65535 f 0000001539 65535 f 0000001540 65535 f 0000001541 65535 f 0000001542 65535 f 0000001543 65535 f 0000001544 65535 f 0000001545 65535 f 0000001546 65535 f 0000001547 65535 f 0000001548 65535 f 0000001549 65535 f 0000001550 65535 f 0000001551 65535 f 0000001552 65535 f 0000001553 65535 f 0000001554 65535 f 0000001555 65535 f 0000001556 65535 f 0000001557 65535 f 0000001558 65535 f 0000001559 65535 f 0000001560 65535 f 0000001561 65535 f 0000001562 65535 f 0000001563 65535 f 0000001564 65535 f 0000001565 65535 f 0000001566 65535 f 0000001567 65535 f 0000001568 65535 f 0000001569 65535 f 0000001570 65535 f 0000001571 65535 f 0000001572 65535 f 0000001573 65535 f 0000001574 65535 f 0000001575 65535 f 0000001576 65535 f 0000001577 65535 f 0000001578 65535 f 0000001579 65535 f 0000001580 65535 f 0000001581 65535 f 0000001582 65535 f 0000001583 65535 f 0000001584 65535 f 0000001585 65535 f 0000001586 65535 f 0000001587 65535 f 0000001588 65535 f 0000001589 65535 f 0000001590 65535 f 0000001591 65535 f 0000001592 65535 f 0000001593 65535 f 0000001594 65535 f 0000001595 65535 f 0000001596 65535 f 0000001597 65535 f 0000001598 65535 f 0000001599 65535 f 0000001600 65535 f 0000001601 65535 f 0000001602 65535 f 0000001603 65535 f 0000001604 65535 f 0000001605 65535 f 0000001606 65535 f 0000001607 65535 f 0000001608 65535 f 0000001609 65535 f 0000001610 65535 f 0000001611 65535 f 0000001612 65535 f 0000001613 65535 f 0000001614 65535 f 0000001615 65535 f 0000001616 65535 f 0000001617 65535 f 0000001618 65535 f 0000001619 65535 f 0000001620 65535 f 0000001621 65535 f 0000001622 65535 f 0000001623 65535 f 0000001624 65535 f 0000001625 65535 f 0000001626 65535 f 0000001627 65535 f 0000001628 65535 f 0000001629 65535 f 0000001630 65535 f 0000001631 65535 f 0000001632 65535 f 0000001633 65535 f 0000001634 65535 f 0000001635 65535 f 0000001636 65535 f 0000001637 65535 f 0000001638 65535 f 0000001639 65535 f 0000001640 65535 f 0000001641 65535 f 0000001642 65535 f 0000001643 65535 f 0000001644 65535 f 0000001645 65535 f 0000001646 65535 f 0000001647 65535 f 0000001648 65535 f 0000001649 65535 f 0000001650 65535 f 0000001651 65535 f 0000001652 65535 f 0000001653 65535 f 0000001654 65535 f 0000001655 65535 f 0000001656 65535 f 0000001658 65535 f 0000079780 00000 n 0000001660 65535 f 0000079827 00000 n 0000001661 65535 f 0000001662 65535 f 0000001663 65535 f 0000001665 65535 f 0000079874 00000 n 0000001667 65535 f 0000079921 00000 n 0000001668 65535 f 0000001669 65535 f 0000001670 65535 f 0000001672 65535 f 0000079968 00000 n 0000001673 65535 f 0000001674 65535 f 0000001675 65535 f 0000001677 65535 f 0000080015 00000 n 0000001678 65535 f 0000001679 65535 f 0000001680 65535 f 0000001681 65535 f 0000001682 65535 f 0000001683 65535 f 0000001684 65535 f 0000001685 65535 f 0000001686 65535 f 0000001687 65535 f 0000001688 65535 f 0000001689 65535 f 0000001690 65535 f 0000001691 65535 f 0000001692 65535 f 0000001693 65535 f 0000001694 65535 f 0000001695 65535 f 0000001696 65535 f 0000001697 65535 f 0000001698 65535 f 0000001699 65535 f 0000001700 65535 f 0000001701 65535 f 0000001702 65535 f 0000001703 65535 f 0000001704 65535 f 0000001705 65535 f 0000001706 65535 f 0000001707 65535 f 0000001708 65535 f 0000001709 65535 f 0000001710 65535 f 0000001711 65535 f 0000001712 65535 f 0000001713 65535 f 0000001714 65535 f 0000001715 65535 f 0000001716 65535 f 0000001717 65535 f 0000001718 65535 f 0000001719 65535 f 0000001720 65535 f 0000001721 65535 f 0000001722 65535 f 0000001723 65535 f 0000001724 65535 f 0000001725 65535 f 0000001726 65535 f 0000001727 65535 f 0000001728 65535 f 0000001729 65535 f 0000001730 65535 f 0000001731 65535 f 0000001732 65535 f 0000001733 65535 f 0000001734 65535 f 0000001735 65535 f 0000001736 65535 f 0000001737 65535 f 0000001738 65535 f 0000001739 65535 f 0000001740 65535 f 0000001741 65535 f 0000001742 65535 f 0000001743 65535 f 0000001744 65535 f 0000001745 65535 f 0000001746 65535 f 0000001747 65535 f 0000001748 65535 f 0000001749 65535 f 0000001750 65535 f 0000001751 65535 f 0000001752 65535 f 0000001753 65535 f 0000001754 65535 f 0000001755 65535 f 0000001756 65535 f 0000001757 65535 f 0000001758 65535 f 0000001759 65535 f 0000001760 65535 f 0000001761 65535 f 0000001762 65535 f 0000001763 65535 f 0000001764 65535 f 0000001765 65535 f 0000001766 65535 f 0000001767 65535 f 0000001768 65535 f 0000001769 65535 f 0000001770 65535 f 0000001771 65535 f 0000001772 65535 f 0000001773 65535 f 0000001774 65535 f 0000001775 65535 f 0000001776 65535 f 0000001777 65535 f 0000001778 65535 f 0000001779 65535 f 0000001780 65535 f 0000001781 65535 f 0000001782 65535 f 0000001783 65535 f 0000001784 65535 f 0000001785 65535 f 0000001786 65535 f 0000001787 65535 f 0000001788 65535 f 0000001789 65535 f 0000001790 65535 f 0000001791 65535 f 0000001792 65535 f 0000001793 65535 f 0000001794 65535 f 0000001795 65535 f 0000001796 65535 f 0000001797 65535 f 0000001798 65535 f 0000001799 65535 f 0000001800 65535 f 0000001801 65535 f 0000001802 65535 f 0000001803 65535 f 0000001804 65535 f 0000001805 65535 f 0000001806 65535 f 0000001807 65535 f 0000001808 65535 f 0000001809 65535 f 0000001810 65535 f 0000001811 65535 f 0000001812 65535 f 0000001813 65535 f 0000001814 65535 f 0000001815 65535 f 0000001816 65535 f 0000001818 65535 f 0000086584 00000 n 0000001820 65535 f 0000086631 00000 n 0000001821 65535 f 0000001822 65535 f 0000001823 65535 f 0000001824 65535 f 0000001826 65535 f 0000086678 00000 n 0000001828 65535 f 0000086725 00000 n 0000001829 65535 f 0000001830 65535 f 0000001831 65535 f 0000001833 65535 f 0000086772 00000 n 0000001834 65535 f 0000001835 65535 f 0000001836 65535 f 0000001838 65535 f 0000086819 00000 n 0000001839 65535 f 0000001840 65535 f 0000001841 65535 f 0000001842 65535 f 0000001843 65535 f 0000001844 65535 f 0000001845 65535 f 0000001846 65535 f 0000001847 65535 f 0000001848 65535 f 0000001849 65535 f 0000001850 65535 f 0000001851 65535 f 0000001852 65535 f 0000001853 65535 f 0000001854 65535 f 0000001855 65535 f 0000001856 65535 f 0000001857 65535 f 0000001858 65535 f 0000001859 65535 f 0000001860 65535 f 0000001861 65535 f 0000001862 65535 f 0000001863 65535 f 0000001864 65535 f 0000001865 65535 f 0000001866 65535 f 0000001867 65535 f 0000001868 65535 f 0000001869 65535 f 0000001870 65535 f 0000001871 65535 f 0000001872 65535 f 0000001873 65535 f 0000001874 65535 f 0000001875 65535 f 0000001876 65535 f 0000001877 65535 f 0000001878 65535 f 0000001879 65535 f 0000001880 65535 f 0000001881 65535 f 0000001882 65535 f 0000001883 65535 f 0000001884 65535 f 0000001885 65535 f 0000001886 65535 f 0000001887 65535 f 0000001888 65535 f 0000001889 65535 f 0000001890 65535 f 0000001891 65535 f 0000001892 65535 f 0000001893 65535 f 0000001894 65535 f 0000001895 65535 f 0000001896 65535 f 0000001897 65535 f 0000001898 65535 f 0000001899 65535 f 0000001900 65535 f 0000001901 65535 f 0000001902 65535 f 0000001903 65535 f 0000001904 65535 f 0000001905 65535 f 0000001906 65535 f 0000001907 65535 f 0000001908 65535 f 0000001909 65535 f 0000001910 65535 f 0000001911 65535 f 0000001912 65535 f 0000001913 65535 f 0000001914 65535 f 0000001915 65535 f 0000001916 65535 f 0000001917 65535 f 0000001918 65535 f 0000001919 65535 f 0000001920 65535 f 0000001921 65535 f 0000001922 65535 f 0000001923 65535 f 0000001924 65535 f 0000001925 65535 f 0000001926 65535 f 0000001927 65535 f 0000001928 65535 f 0000001929 65535 f 0000001930 65535 f 0000001931 65535 f 0000001932 65535 f 0000001933 65535 f 0000001934 65535 f 0000001935 65535 f 0000001936 65535 f 0000001937 65535 f 0000001938 65535 f 0000001939 65535 f 0000001940 65535 f 0000001941 65535 f 0000001942 65535 f 0000001943 65535 f 0000001944 65535 f 0000001945 65535 f 0000001946 65535 f 0000001947 65535 f 0000001948 65535 f 0000001949 65535 f 0000001950 65535 f 0000001951 65535 f 0000001952 65535 f 0000001953 65535 f 0000001954 65535 f 0000001955 65535 f 0000001956 65535 f 0000001957 65535 f 0000001958 65535 f 0000001959 65535 f 0000001960 65535 f 0000001961 65535 f 0000001962 65535 f 0000001963 65535 f 0000001964 65535 f 0000001965 65535 f 0000001966 65535 f 0000001967 65535 f 0000001968 65535 f 0000001969 65535 f 0000001970 65535 f 0000001971 65535 f 0000001972 65535 f 0000001973 65535 f 0000001974 65535 f 0000001975 65535 f 0000001976 65535 f 0000001977 65535 f 0000001978 65535 f 0000001979 65535 f 0000001980 65535 f 0000001981 65535 f 0000001982 65535 f 0000001983 65535 f 0000001984 65535 f 0000001985 65535 f 0000001986 65535 f 0000001987 65535 f 0000001988 65535 f 0000001989 65535 f 0000001990 65535 f 0000001991 65535 f 0000001992 65535 f 0000001993 65535 f 0000001994 65535 f 0000001995 65535 f 0000001996 65535 f 0000001997 65535 f 0000001999 65535 f 0000086866 00000 n 0000002001 65535 f 0000086913 00000 n 0000002002 65535 f 0000002003 65535 f 0000002004 65535 f 0000002006 65535 f 0000086960 00000 n 0000002008 65535 f 0000087007 00000 n 0000002009 65535 f 0000002010 65535 f 0000002011 65535 f 0000002013 65535 f 0000087054 00000 n 0000002014 65535 f 0000002015 65535 f 0000002016 65535 f 0000002018 65535 f 0000087101 00000 n 0000002019 65535 f 0000002020 65535 f 0000002021 65535 f 0000002022 65535 f 0000002023 65535 f 0000002024 65535 f 0000002025 65535 f 0000002026 65535 f 0000002027 65535 f 0000002028 65535 f 0000002029 65535 f 0000002030 65535 f 0000002031 65535 f 0000002032 65535 f 0000002033 65535 f 0000002034 65535 f 0000002035 65535 f 0000002036 65535 f 0000002037 65535 f 0000002038 65535 f 0000002039 65535 f 0000002040 65535 f 0000002041 65535 f 0000002042 65535 f 0000002043 65535 f 0000002044 65535 f 0000002045 65535 f 0000002046 65535 f 0000002047 65535 f 0000002048 65535 f 0000002049 65535 f 0000002050 65535 f 0000002051 65535 f 0000002052 65535 f 0000002053 65535 f 0000002054 65535 f 0000002055 65535 f 0000002056 65535 f 0000002057 65535 f 0000002058 65535 f 0000002059 65535 f 0000002060 65535 f 0000002061 65535 f 0000002062 65535 f 0000002063 65535 f 0000002064 65535 f 0000002065 65535 f 0000002066 65535 f 0000002067 65535 f 0000002068 65535 f 0000002069 65535 f 0000002070 65535 f 0000002071 65535 f 0000002072 65535 f 0000002073 65535 f 0000002074 65535 f 0000002075 65535 f 0000002076 65535 f 0000002077 65535 f 0000002078 65535 f 0000002079 65535 f 0000002080 65535 f 0000002081 65535 f 0000002082 65535 f 0000002083 65535 f 0000002084 65535 f 0000002085 65535 f 0000002086 65535 f 0000002087 65535 f 0000002088 65535 f 0000002089 65535 f 0000002090 65535 f 0000002091 65535 f 0000002092 65535 f 0000002093 65535 f 0000002094 65535 f 0000002095 65535 f 0000002096 65535 f 0000002097 65535 f 0000002098 65535 f 0000002099 65535 f 0000002100 65535 f 0000002101 65535 f 0000002102 65535 f 0000002103 65535 f 0000002104 65535 f 0000002105 65535 f 0000002106 65535 f 0000002107 65535 f 0000002108 65535 f 0000002109 65535 f 0000002110 65535 f 0000002111 65535 f 0000002112 65535 f 0000002113 65535 f 0000002114 65535 f 0000002115 65535 f 0000002116 65535 f 0000002117 65535 f 0000002118 65535 f 0000002119 65535 f 0000002120 65535 f 0000002121 65535 f 0000002122 65535 f 0000002123 65535 f 0000002124 65535 f 0000002125 65535 f 0000002126 65535 f 0000002127 65535 f 0000002128 65535 f 0000002129 65535 f 0000002130 65535 f 0000002131 65535 f 0000002132 65535 f 0000002133 65535 f 0000002134 65535 f 0000002135 65535 f 0000002136 65535 f 0000002137 65535 f 0000002138 65535 f 0000002139 65535 f 0000002140 65535 f 0000002141 65535 f 0000002142 65535 f 0000002143 65535 f 0000002145 65535 f 0000087148 00000 n 0000002147 65535 f 0000087195 00000 n 0000002148 65535 f 0000002149 65535 f 0000002150 65535 f 0000002152 65535 f 0000087242 00000 n 0000002154 65535 f 0000087289 00000 n 0000002155 65535 f 0000002156 65535 f 0000002157 65535 f 0000002159 65535 f 0000087336 00000 n 0000002160 65535 f 0000002161 65535 f 0000002162 65535 f 0000002164 65535 f 0000087383 00000 n 0000002165 65535 f 0000002166 65535 f 0000002167 65535 f 0000002168 65535 f 0000002169 65535 f 0000002170 65535 f 0000002171 65535 f 0000002172 65535 f 0000002173 65535 f 0000002174 65535 f 0000002175 65535 f 0000002176 65535 f 0000002177 65535 f 0000002178 65535 f 0000002179 65535 f 0000002180 65535 f 0000002181 65535 f 0000002182 65535 f 0000002183 65535 f 0000002184 65535 f 0000002185 65535 f 0000002186 65535 f 0000002187 65535 f 0000002188 65535 f 0000002189 65535 f 0000002190 65535 f 0000002191 65535 f 0000002192 65535 f 0000002193 65535 f 0000002194 65535 f 0000002195 65535 f 0000002196 65535 f 0000002197 65535 f 0000002198 65535 f 0000002199 65535 f 0000002200 65535 f 0000002201 65535 f 0000002202 65535 f 0000002203 65535 f 0000002204 65535 f 0000002205 65535 f 0000002206 65535 f 0000002207 65535 f 0000002208 65535 f 0000002209 65535 f 0000002210 65535 f 0000002211 65535 f 0000002212 65535 f 0000002213 65535 f 0000002214 65535 f 0000002215 65535 f 0000002216 65535 f 0000002217 65535 f 0000002218 65535 f 0000002219 65535 f 0000002220 65535 f 0000002221 65535 f 0000002222 65535 f 0000002223 65535 f 0000002224 65535 f 0000002225 65535 f 0000002226 65535 f 0000002227 65535 f 0000002228 65535 f 0000002229 65535 f 0000002230 65535 f 0000002231 65535 f 0000002232 65535 f 0000002233 65535 f 0000002234 65535 f 0000002235 65535 f 0000002236 65535 f 0000002237 65535 f 0000002238 65535 f 0000002239 65535 f 0000002240 65535 f 0000002241 65535 f 0000002242 65535 f 0000002243 65535 f 0000002244 65535 f 0000002245 65535 f 0000002246 65535 f 0000002247 65535 f 0000002248 65535 f 0000002249 65535 f 0000002250 65535 f 0000002251 65535 f 0000002252 65535 f 0000002253 65535 f 0000002254 65535 f 0000002255 65535 f 0000002256 65535 f 0000002257 65535 f 0000002258 65535 f 0000002259 65535 f 0000002260 65535 f 0000002261 65535 f 0000002262 65535 f 0000002263 65535 f 0000002264 65535 f 0000002265 65535 f 0000002266 65535 f 0000002267 65535 f 0000002268 65535 f 0000002269 65535 f 0000002270 65535 f 0000002271 65535 f 0000002272 65535 f 0000002273 65535 f 0000002274 65535 f 0000002275 65535 f 0000002276 65535 f 0000002277 65535 f 0000002278 65535 f 0000002279 65535 f 0000002280 65535 f 0000002281 65535 f 0000002282 65535 f 0000002283 65535 f 0000002284 65535 f 0000002285 65535 f 0000002286 65535 f 0000002287 65535 f 0000002288 65535 f 0000002289 65535 f 0000002290 65535 f 0000002291 65535 f 0000002292 65535 f 0000002293 65535 f 0000002294 65535 f 0000002295 65535 f 0000002296 65535 f 0000002297 65535 f 0000002298 65535 f 0000002299 65535 f 0000002300 65535 f 0000002301 65535 f 0000002302 65535 f 0000002303 65535 f 0000002304 65535 f 0000002305 65535 f 0000000000 65535 f 0000089768 00000 n 0000090071 00000 n 0000120889 00000 n 0000121268 00000 n 0000176651 00000 n 0000177172 00000 n 0000177481 00000 n 0000177877 00000 n 0000211217 00000 n 0000211574 00000 n 0000211825 00000 n 0000215119 00000 n 0000215166 00000 n trailer <<0B73F480BA69BD47882A4D2C1645A587>] >> startxref 220040 %%EOF xref 0 0 trailer <<0B73F480BA69BD47882A4D2C1645A587>] /Prev 220040/XRefStm 215166>> startxref 266583 %%EOFstatcheck/man/figures/logo.jpg0000644000176200001440000012624014350273527016121 0ustar liggesusersJFIFC     C   " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((q/Xs S<>ʥvxߴk鏄:iWsy2yX[#zy~sC1SM+o<$Uj4ݴQ^EPEPEPEPEPEPEPEPEPEPEPEPEPEK v!wU`857ҜI.n?4|mA5N%_3U-|i _J|ׯIRk ^:UtŦ^ai*dn_ފ(>t(((((((((((((J+WxX%]ƨ(iUL-(Jӧ~GT.zoMz >.5I{vTac<Zx {+18:9ŨEW(QEQEQEQEQEQEQEQEQEQEQI@ E1XY~jvi_5N(-QU?ӓP\UY0nARąQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ E|3Nj4?V:ĶO8r+oM~ĸZU%MWM>g|]jqI>ʥ?vߴkg߈ w+}_RnxZ4! '.3_bpt%^sQ=(>P((((((((((((((((((((+$_GUW/?I^SG^|Fu~WK__aY+?K4OB5//PQE~~PQEQEQEQEQEQEQEQEQEQEQEQEQE|B]I?k">^5ψ t῏O~gÉ)i/Rc+IvIvh*qG+p(((((((((((((S?\Uv"3WO?}R $߲z f]TAWfM# >ÝȺꏧh@((((((((|&k9LEN &ݑbPI8tztqpkES!_ymV[ZQZ47"KwJ/)"Y3z4͏y(qfa[JVW{$z:KZvFMƽ]h@4WV1Փ4)C4!31cn=7 Ҋ(q,$t?omZ^8YVNmz6#/\>$jD7#+z}v@?7?fx}/k86=Nq' kF$e8 pg9a>2qt.T/*+#XmMǔ?oƺIWFWF 5Lv|<Կ?-Z5(TVEWyQEQEQEQEQEQEQEQEQEQEQEo/)!+Wx֗c il?*jgFcBFFpg.(f? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '=uO{ף*ׄx%_-"R'Wh7k?Ѝ} K/G_?Ŀ&zQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sGO!ȏפ s??G8o_} ZD2 }]'k:}]'k8c_>3c%3袊D(((((((((((((?W])v* Up?{7#^Bfp?Uٓp.(g? ( ( ( ( (ѓ=~Qݶ %!yv5t+U~Q~{ٵl z^OϢOsЭ 6=9DWBXd0i% 4Qpyg|m.[+\Z(}gk(.~Xkiv8UV1n=J:-η^%L<(j:ky=X^0ͱy^Zv[/ 5,:T[u(iEI5F.Njum#/ᾣyto!5i4<Qw}FUȻO){#ʑZF ]d֝5k Z|G^kcmdm4tֵ7G<}CZE_?j0-Wc+өkև eߙHyw?Wݿ= 2j&ҽFX_6/,GuG7uy(r2AԬ1턏Wb*n_©%g#hWpx4Wh::5}ZI-?|+񔵡%?:~'u<Ҕk<ƊOn]#q⇓|y`U+8LF\8?SէVU%h rcnPEcJJU)IK*Q,Yc1?Q^]?uu2sϦ ~fs ~_qrϵC#誚nmZŬ,M{պ2H>4Š(QEQEQEQEQEQEQEQEQEo/)!+Wx֗c jl*ZgF_BFFpg.(f? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '=uO{ף*ׄx%_-"R'Wh7k?Ѝ} K/G_?Ŀ&zQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sGO!ȏפ s??G8o_} ZD2 }]'k:}]'k8c_>3c%3袊D(((((((((((((?W])v* Up?{7#^Bfp?Uٓp.(g? ( ( ( ( (8]e}=^?_R9HF>MscVKdZ~w>OЊQE|%ד,0DJM>8&;3aQClt{U[( 2eYɯrYoF1߿~<^-aR~ͤ./: 4.Kʴ _G'{պ+ S˕C^WVU?}۠Q^QEQEQEQEQE%f"KWiX֣ONT*24]?tGvÿ\)V!=E{`Ze.9Gz4(I:go6yV˹'yVVu~aZL<:F} eh]wB{W?uǡ--wvN}ǽxOe}>tCj,<ϑ뷚8qX8bU֒gYԦմ.gqʷqkJqV5Ƭ6jEN/tQEjHQEQEQEQEQEQEQEQEo/)!+Wx֗c jl?*ZgFcBFFpg.(f? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '=uO{ף*ׄx%_-"R'Wh7k?Ѝ} K/G_?Ŀ&zQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sGO!ȏפ s??G8o_} ZD2 }]'k:}]'k8c_>3c%3袊D(((((((((((((?W])v* Up?{7#^Bfp?Uٓp.(g? ( ( ( ( mm噾jXoڇؼ;2ָTl֌=Hug\go#?袿%'&g (ln/mNIo*I]WY6ixŬ¢w^`ʱ'4lWGa5ķ-W_k28Z8<9?Ţk[yxNPpvQȲƮ2`rT60֩on\)W$sr}'kQEb ( ( ( ( ( ( ( Px.#Ybn¼^ Bf==?c^MxE*X`W|֝5^Gn<4xv Y)~s-~ڶwen|lG(0|MYǤ^tߗe/1R%P8-WgυQ@Q@Q@Q@Q@Q@Q@Q@Q@b~1N|A\u~z'i? gFcBil?*aKgy"ޟ>+c(((((((((((((JZ)(Z( ( ( ( '=uO{ף*ׄx%_-"R'Wh7k?Ѝ} K/G_?Ŀ&zQ_Q@Q@Q@Q@Q@Q@QIE-Q@Q@Q@Q@Q@sGO!ȏפ s??G8o_} ZD2 }]'k:}]'k8c_>3c%3袊D(((((((JZ(((((~3OEqUgaw_?K1W~˿8j?*owG S]7(w"ޟ>+s( )((8|fLwz5D-!Ya [FבgWvS YPf]S!\+ y}jo}S3?C `qSߧJݎ$FE}U . hAGXgRuQEuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PE%-Q@Q@Q@Q@Q@b~1N|A\u~z'i? gFcBjl*aKgy"ޟ>+c((((((((((((";DQpxL:2X'ܟJ;WM[AY.;sҼL5Oe}E|^[q dϭ]mH5:-EȱKۏҼcIOs/0Xso>-xw˞8?'fLQv{y63 53WN~VOi oQDh2W_O>*ES/?MejQE|a^Wl4yt{-*J$WQ]Lel Jͫw81**uwߑw5^B_N~W4Wf?/ך|L-ӂoB#d~_mj\"#Tp+ n?~g=%R/՟F֌kS7B6E}7_]g5"MNa68+(gI-?0?ְ}vwpa$C#Ҿ߉ti0:eH:{zW~kC1=)e{5jQE QEW7⵿? >[Ǖ ]+ڳx'؊\Rvg'RaF]&^ӿ_OV^5 =4K;L.F3ҼYa8z?%GR5^oQ@?NGHWn[?iAf :]]^#j;G5^B_h[`_x[>gzw _µ#DYxĖ:DZ5Ż>+̤/jOT4]8\R8Jz6˿ɊHCT>ΥP(((n!Ts#=IIy,|*[Rr?횞SW+v]Y`Fa>Jwz5i^7:03> }SW,Ѵ' >LP9c Uuǻ.漹s$X|/5]}< a$2sr?=c~-MCA5]|X&O߮甾_话bά͟KO.V(7`xHuMɟV)xG֚.&$#Һ u!V*t| Js7N]QEQE)v*_S?\U~z')? owG S^3^.נЫ&_][GӴmww2[BCP;w}I6{ 7koֿST2sUzݟef#2-%ݽ|Zׂ }|&_s䟈迉 ;dѴ{8ItL ׇbK19,NI\E;S|~'UsowLKk@ۢ?AǗf"v\KI Q_$t|[jMKYII_^+Q !Vhfv?ly}<? Hx/~/?(Yݣ?[_z#/i j6?lwhVw޿Cy]'+x[R6-p 19 pG ֔^q_5TLjr'tWͿ~7]Y[> k9HS+}OJFRk?=2moeW4-Q^Q@Q@}3$FI*$ׂ|Dyl|**ڌ˜5?Uc3 >ե躳|#/4 U [:¼fO8M9,!_:jxz׷/K3?J_lMWl:_{#< a$-z E[iCʼnbnjooWS SU)Ό*+5ыEVaEPſx:_SC_?W_ުgZ_䂽YWEЫke5_ _RȺꏦD((FBcxֹNh^sikj0rԀGOz3xcE-g3S^ѫpom$~p+Rվm;j;G5^B_h`_}ϿzZ{0eu>+ JVm._Memp̀[Vчk̞X2[쬗͟1Q0QnkQ_B|QEQEQEQEQER3ROjZ6x/Q'spDAn \ҕimsFXУ >~"_KkyOE@xv9ҊC* 4 (mc;˯ZêxI--$ⲋOBGZa0u= +~d~>RDh,5,F+µT|uN.趼ݿF|gZRNF{X^s5.MMm y4'&HI¹13IO~*U|?guoFVky:bWN' 4}:8;YOauʹ,9c8e#5M,Zݲ5Ge+Ht2<*I}Wu+{ȸ{|Pz{57_?}^>;-_}oQE~~RYrO+~&$5&Xݟ\׍bsE^NߙؚXXW=9 t[P3w't]D ŘI$ri(9?L +G҃[yv.2/?>OXlDUTR?ޏaVGtW{Ę҉B?WסW 7NlX|E,U5V»/?/>pV\m֞MHuS*g:^mi֒$EAUsዩ27O_AW9~28ׄ5{I&, QĬ:`cfWvcvWs诣/?Q y~Ro1Oyos#> P?Mz2CJcXk77ZĠ7XuP4]NLWep)z=v(B(z:Tp֐Y>j++in'b%.1P$_~(O Z) 4z-oMz7+s8e~srCRz4mE?>p4Q_WSQի+~ˇTAECZߎ/ :MLq%Go9ӝY(SWo4RbQ.'x|/0Vhju0!퟼J]3ou !#~m_SCU5|#0T-4/7Q@`kE}lvdԋ-OvKk[ݪQEW?f `ntO&C"-Њ|/K#]by2G'_5bLn9J<˺{Lj1,KOQ;MO Qܵg?ø5v?Àڬ }ԟy}TROc#AA_X|'CgWn c'zN3ڵO]ogqϷ1*;PY*}8WvptUJW/~^$,q_,ېHA"[F-`o$|a_+3z+~ &vXM2M|MoZ{`?lU8?y_f×gTWԺcOwKk?xHQWݨ'hmz=\Ǻ{<'i>OE-W\[IᕇB }skr|@T,[oǿ|]]?Qedmt?^S/~Gep%g|ϸ,",ṁĐ̂DaSiiمQLA^%OxKhS}!yq^\Go-nu){t1p眃^^gF# :T>'˯zUjld+b>_Q0[~/M>K_x?IY>\a_?|-?z_&o}|E}G oԿ40[~/M?grha_?ռeϗq3R oԿ4x/+?f ޥWhV>_˔W>KG3R/?|(|-?z_&f ޥW[_xw.s"CYgԵeܟJyy 7,0DF8 .|N4z5mMчxg ~ykmwŭK%F Y*袿!^&Uݳ\>F6 (uvalTS.$b޾ÚtVJ苩VbQ.hN+o :M$ڌL6ʈ{gWi '()"7548kU^Q_gb8INp}gMcoٓʳWdVګgxM| +~~Ok"cs"-Њ|'cX^LրQx\ҏ2>g.yW^&Լ%Ew-mrqʸ⾶_J6vjBy/ҾBtKjPiu]]pI=bzɉ?߽} Z.3x8/bO?/u=(˂(~1N|A\uv?x: Up?{O#f^WW?6kwd03<uoOMQE1QEW|t ̲w*Duoa־GPVf/$rYRkxZ{#8%̖/Ų~$EI$OSIEW| @|MqC&#? %}Z=ٿz<ֶ[k 1(D \'XB˿|7g_WO ~UB 0-WgEPEPEPEPEPEP^U_+0~Wa^++ڲ=/n^|˪GO2?ɟ>EQ|>([\2#tm(`Wȟ2JV78}y_`ߛ_X7^ܺ}EW؟QEbZo4ytN[ņ_/4B-֫IyDf\~S%ѮWcN[B}Gǀ_toں(V(QMY#ȫVy]QZQ@rʺ'=rz?SψҖ~)k+?K4OB5}IfFÅ%_=(((( p%ʹRHV|s}σ^]SGI.Rw<y۽}UMxDdu0UA9mƟ-M$}W#sJmNjz?>gj_+Ťt6'Q[[ꐿ2Oc~)ƐƱơ@UUW;(Vs+??O#sN$J1 j/_?e6BAHPSQE}VVGmŠ( ( 85 YmbYRF*5χmfӮAՏe(Oh kLi'V﷣ʾo>Dj:,&24'ϓ'|Mq6m:\k{{hRE،R=k:־w ۜ@#cJP}u~}ŸtKZ~;*(D?5 ( !ȏפ t5|B]I?~:pǧ3)ke$LzOu$LzOp4|gKgE8QEQEQEf[zpqM!~&RPEF.rQ՞'IChcO Xˆ /YO ~=M|Wub_կ5+/qu+JUa;*ۧ~cF;}B+gY x 9w%QJJuF5vGujСNUj;EjΏp5 M\*{S_T:=eGikE;Lm}>% j0jbrYu;GYW4+fUo'h-(O())h-7MricvsL(oa"jqRAy}5³ i@M|;!*}mYbpT'/~漎?7Λ.u)GE/}ڻZJZ 4iT^&UL((?W])v* Up?Q\GqgMn,k$q副~| mq댹ie`e{qvn -YmCqz[WWYQ t.v]# gVto+폅 ( l` =)P>9tis'G9??x}"ѯ4ۤF6z?5.]VV/IZ3̥w?tQE|տ\ Oaz|/źOum, mgu*(Z(Š(((((((((((MT EkHs܁N*e%Kd\#*P՞'I|Dd kq /YOoOkʹjw]1{ZW$Sij d؉Vqѥ:#JzիCNUj;EjΏ{8uMGpG=M}Oi6zVVZ6Q}cK8`*~Ŗ唲V{iV̪I eu ( ( (<;Qzv۔b9ϣ_9_ $R201}mawbE@Hn`:{c>2UN ?y[ݿO^G#ᆛM%>g>}4iT^"UL((WcJw o_?K1W~?6jx{O#f^WvK# ^83VQQ_r!Y|=^n[[gsZ~,]tKOQd1Gޑ*S_Ɨ<a$g9:Ė^}>IK1*iN;/ԡ׾&ծu-Bc5=(ɥ'6'vc*1VH+c6-t:|$58Uho<z2qiaN_dxCZ84:=F2~ݛdKWgg*O]Ȼ~>z+E(Y# IɹIݰ* ( ( ( ( ( ( /cEmG^n[zP״x#_JZEO,?oǕ%'|_揋(~L (P?( ( ( ( ( ( +3R6ڥ;O:rG  f#a 橊KJKդuS+kN~ׁ4O&_^߉?C?#o +}xK~$h /C? ϙ/@X}ZنVKY?&o_^߉?㧂g5. QS]X껣Jy~63h )9 16?u k37XSu*AD{o+xmtϓu|_tQE~~BQE|B]I?k">^5ψ t῏O~gÉ)i/Rc+IvIvh*qG+p((Hl|3c{w׵Wu/j1[`{M|Wt0KyiMøu ѻO,+#Pg &;}9k -MӐd$<-m("c(߅ugt^|:0EZE&+(((((((S?\Uv"3WO?}R $E-7LdNs̯M>%[J+k8E:OHxVTl-: X$0Ɗ;0*z(IY6ۻ (((h=-t߉ uO'Y,X)`y5GpG/x+ӿxl)i8D%|]lC5w _WE,dx(#B(((((((((((K!톍ae%/^N5|G6c"ОM|b Z}?|-O.+#@9_Z |B _ξ]49FMF~}mnAjGugz.+ŸR?kW"Z(H?1 ( ( ( ( ( ( (>-%;?qb/WO?} $_z/^+^,٬עUݒ— Eս?T}5TmVE/f[{X1Vf-yeu4:_(|j'uퟌq}~T-|I֒QluM=yV[?Q^}_O\_ ET=)/ + A~a6\? J:Ƴ誌_4]2fda-ljC@8/*op^࿌ȭo>|w|votA;WiMc8wMrKoo -||,Yk-&t3=uփXxKPnRQGc_e1ݤO'َUej{5hQE0QEW/?I^_W.+ާ'?/~)iҖ ?$Dq#_Wh7k8__>/ܡ%3(@(((* }6K㶷nye`ܚjz\) 7eQ(j]Hmlcyx9oK-/7Y9VM[37~4t=ÏO}V+ƼEk~(,.兩S\+6c睗eOy> wdbK1riQ^9Q@Q@Q@Q@}A/ȏy_|_P~#!_Qџ).~:(X? ( !ȏפ t5|B]I?~:pǧ3)ke$LzOu$LzOp4|gKgE8QEQEW?>"xl)~|-ouOUU')GGpW/%QE~n~z]8(((((((?W])v* Up?{/캁e1x{7#^B̟F}C;uoONE9QEQEQEW̿7?y_MW̿7?y_3_/ϩGQE)|M}_|M}_#,zՅQ_f|8WHcP/3",0s^_52hx**]Kƍex#}4Tb?}[OG Sk(X_ro-G?jwG5N@;?(b?}?ռϤtq:?ƾl0u V{>}4T?,܃[OG Sk(X_ro-G?jwG5N@;?(b?}?ռϤtq:?ƾl0u V{>}5?|uo B:Z/.b dw#?fo'_rJr\*Һ{#̟{j(+?׿lܯaϋ52_qT7{1^ެdQEq4|PIG$߈^?}_+~zE~1QO?$9c{E~EDžQ@Q@Q@Q@Q@Q@Q@b~1N|A\u~z'i? gFcB¶iyENsZeqP=FyX,Cyi=|_Ֆo hv\Fְ}Z(c*:^VKEQp+UERv#n־bpA#>W:PuG͚}<Q޿@_R>^θ,שkEW!EPEPEPEPEPEPEPEPEPEPW⯄#R}IkFxU7^\>uu4=^9רvz*?|)_w5pb^[9>\ikq7;jgaFʭz#AsjzEč-l y?e*xsQen|+t}MMyh'a8^Ѭ_|Ekxºc-ü|8#Y5Ҍj[ ƤTT|/yZYUm2f<a\]tkTUi;IסOMҪ}VƟo{i*m: #zjxG \Ihz)?2|׾W9~284k? prbeAt(DBOu]Erʹq_=u?)~gkWKHu~I%'$Dq#_a |W/ɞEWEPEPLd呂FY O1WTeq#˒o~/ʎ9%G.e뵈)I3L¾GB_?e?񿐯ϕo?T{Q_Q@sGO!ȏפ s??G8o_} ZD2 }]'k:}]'k8c_>3c%3袊D((+ψVZGIuǭ0C-IWM7,59揸:ɞ}EWgg~ηbm1Tq־ sZ$w*sȯӸ^t~h8SŢ+쏉 ( ( ( ( ( ( (>1%?_AWkJ~]+1U3/A^.נЫkٿe5Ovd09z~v((((elͿ:jelͿ:"|W}O >= o/O*_ׂI}ϏhBk oW4~A࿒_r3+/P??BkUx/ܿ /O*P??|gG^ %/>=?f'_rJ o/>&얥̞^o9$׵d'Uji<,=f_aJ2NofQ_l|(W><66bn I],o q?ʾ+i N}suq5!?pQE~h~zt-&Bq[J5|GXK8nZvOzXY+㋅N?aEW؟QEQEQEQEQEQEQE|[Jw 㫱%;?q^7~uH(;+> %ڐFBo=/6.I]*՝<ՑS1M7|#Ěj=ũmXcIA/Us=s-̩fT}4kuJ7~-L7v#jFN-J.dßZ|@:~K3rwCں᷏;Ii&$O_+Vtk){[pkܛ4YOk;ʞ[[Ö^_BQ_B|QEQEQEQEQEQEQEQEEsu Jy$`ԓJՍ]h?i-/Zi'q ױG"M0t`YNA<>2)Q7.n'+ ( (2E7Z\][H:0OW\|;#;4r2r1=+j .;ڨlv`A|`iʽk.ㇿ=-џ1QEA#CNK Wڕgd1xKu8aw?_y+6Շf޿m4ҩզ(Ou]Erʹq_=u?)~gkWKHu~I%'$Eq#_a \W/ɞEW!EPEP_8~>#+N?}_0J2> kZϨḩf0D#ƨv 07 rA_sko1(HP` ܋8rԩBN_O8zT% (0(( _A5j"O Vf#azp+ԍS-lӕjЧHo(E~ A}A/ȏy_|_P~#!_Qџ+.~:(X? ( !ȏפ t5|B]I?~:pǧ3)ke$LzOu$KzOp4|gKgE8QEQEW?7ϣkH) m)A/ZzƼ x:ZQX>[/˯֏B(((((((~3OEqUgaw_?K1W~˿8j?*owG S]7(w"ޟ>+s(((jo4ojo4og_/US_1+S#9%CF.9%CFMoYGYO? (p(((((((((((j_4iukir־?DŽ26bO>ב#6¼^5j{9>)`k=(eebX=%~,~*+SS}>x<_3PV̾Xa"E|M^}?|`^3 C__SEQEQEQEQEQIK@Q@Q@b~1N|A\u~z'i? (>"lDzDW=:s5N{5jŒJnj|+gwZh47W8hhZm+ok5*|/aLӢ[9?ݘ&+]K]f?3iUt e?+ _MKS7d(8{ҵ:ַ1,)I#azp0(:SߣL0bhmw_tWsk@ѠgҮI{YʸjfzQY=zxQI,+T>EԥƑvvQtk-:>Ge  ik䯆ovWڮ{aocW>ƃOԣ[.Q3_`3.9$.~EdM<^YE%-{QI@ ^Rx(}3EGyCuUo.ky#P1`E|_x[5<ˉAQ{* )B-qùUj㋪y4QE~f~m^2-n2]ѳ+Csk>d-yG󯫫ᅝW3+%WEGąs_bi"6zş{jF|^?HkGR;oB~ά&4u.mhavpH]g y[φ6-o$0g.4}JQ f8XϠ?ξ!C N58Y-SWqi}IE"e2E~~4-k36x)d OÿY|Cmc0:[v`Z637֨o.}u}V#佯h9Bzh:&$' 㗅[uis^>qA05!Sq R[^~ǔQ\jrhYQҾuz dR=O¾ P?_+hcՔw!̡vgqW<}(Ԣ8tΊC/4oml؎ѯ#()E39FPn2Vh(BJG?ۙumB+c9#rk:!J.uiNB}#h]UQp~;|MOkKo,XI[: _omv q+8[ }<Ӳ,XI,V'y?(BGB_?e?񿐯ϔo?T{Q_Q@asj 2ZOA}n/,6CVu# G5.Jf-YԬNԮ\mx&x1ZiٟЩ+fA.9{{NE|^-uF_'M)@zWbU|ag4Zw)"ȊC)#֝_:/lMέx|̲{*?ʨ8cG6LrۻN=Es}fT9>u}VxGȴC+ (>M𧊛RnE p=k˫_xBү rcta_x×tB?.dzfZu?_~PTj?~FeӑhX韂-5zkCp'ibIV {Oï2E+&fU?~Z)*1e)Z5ϧN݇W?J8z6}]σV/?8%}-EG B,N+`zjJ(?W])v* Up?{7#^Bfp?Uٓp.(g? ( ( ( G6G6xE_<5#?j(%?b;/T<=_)kT<=_)kuD~YşT+χ ( ( ( ( ( ( ( ( ( ( ( JZ(䯏^o+jLeB '/1qOxrJ b ^sjyW06=~Oe_A{o?_cpG] AE%N|-uzclp.tgc+)*rN>h8fA/_~TU ciRxx}V'}%nupK?/Rd3GqIܮ }~~rQE|[Jw 㫱%;?q^7~uH+ڿe|YעU?z/]/)z?][G4Q_Q@6uhta_w.B=63׳b+o ǚlWZRз^oz\*?mI~?Gdj rNy-bx$xFD%Y`AW'7אZ\HC:?Ĉ>"x}ebv%#ƾ4 ,JÞ%rYuk?q̨Z:N;?}EexcĖ^,mM>O2uSO5_Bq8~18J&QEdQ@Q@Q@Q@Q@ HeaA | UҢi9[, 6?eG4J,N 8 WeԳ\Kge\<5w|E{HdSyi¼"[Ix;^9) | +G~X,S%~#Q^y.+: YkF#y<dWMoDx_[%@+(xU%jud8*eJ)EDzdߴW\->ڦ\3|LO\&?\ h;UZud׫< ESf( |0q*E4Qd=[ZyqO<jY_K|#EѫE{WUe}l¯%5W]'1̨崽GEλPNFMp⻪JZaF5K^xQ'p+s))h:xQ/6_@㟼?^{_d]v2ŵ5;lk#{5ƛw5-,RH`w䗹-W꿮an0o߆R(tS~'x0:vs ar$A ڔF9uS<#H pWdqǒ5dkX,,*Qony&y夕1] ?Deܯa\ 0cZNeBZ,jCǒòhe@ )ܟQҽzl⡌L+ Ou&Pr:83:&H#?dp8By(}=㯃MKM7s EIil 5x5olY&\2MacoA>oָyViiXF,M2b+bըGX*kK9cCKGѯB+:KN(Os_O|57oP)uInOS]v[[0veQˡ;쿮ʬX0AI3L BGB_?e?񿐯ϕo?T{Q_Q@Q@$~o{LZjCF5uO|BĶcj_B|Y[\5-6GIE~G%ĺ{z_C<03 G]JQE|K'"7Y >ZoDc^5(?5Q]baHԒ])` 4;jsZpѰAP |5>!iM~UcF5Ϗ~Cq >ƿ)Zz~޿UP"?vnQEgExݣu2QUv-A{z,{5QZӭR95cR*bz/c+T/~1xH7HqWL+J'g,r]F+_Z/uI<۹$3Z(&ܝܒAE5Q[C%ć JYFD6Wd5 K]V6CS޺?j^+PaLSB?0)HĀ* (%6H>8(/w}e ;XRc5  +c0(S?\Uv"3WO?}R $߲z f]TAWfM# >ÝȺꏧh@(((+_ڛFC_ڛFC/~gc#ŨP|즾ѯP|즾ѯx[gSŠ(>+>0|]>|uWQA+hǨF^Ls#*.fv=|4' J^~߉TG5N@;Wyae}o?cjcv?(o0  S=:׈QGa?_Aϕ=Xz?uǯ~ -+{5N@; |}sò76ZH^\,H w3f.,^+֩ug+0N v=(O((((( ~"ao[=Q\Stŝ|EL-UZVwROm=A5G=?ɾʻ~ <ƾYs}>ĜG}&6t3k`}}z^yC0ڝEWΟJ>)d9H#i_/v/EfJ+juQw&jQYZTUAcl,?Ega񞠤I? 㨮crVY?yxъWo;R_2{?<5Z+'vw$QEMig>u2\HpD$۲i+?fzCے67$v^+Q=1NG^ )oE,qڨ V]#x1Yvc"8UQ>+c@(ߌ_SC_?W]/)!+U3/A^,٫עU_z/]/)z?][G4QE~~"QEQE|C|+Y&Du~M \DHpUA57Əx\76Nxɺ*Rx+3V ޫQE|9|>x跌<Z7Y#pYNA_@~[Vfs_}KY}oO3x(x _AIK_Q@Q@Q@Q@Q@Q@r2eG;H[Nɗ:kJhUi6Z T|ٓYә`!J?SW^<:u-"ӜnxNak(e!Gp8~+SkEOz_tj I4Oƛׂll+x\B*'=qnt,ŒΏǂl3kXZiAӢaхn#¸_{!ˋp{gŚOu]vA^K-aMZH[cV"Itp?_RG B#EEFׯ57zr'MEjPrYx͓࿂dm\#V>C dA,lUAfS_|g7ag=p2YO۬jGq4>!a迎O}/iam#1 Q ^(RjU3V"qCw_ JK[us=Ij(#N*VHU$7vŠ( * +}BKkcmxPЃSI՘iOٗOKf|'z^7/,1ѧLz Rcø&X~$f<-oީ.\[Kݧ'/՟ռA(M.z OΦ6soL}}3) 5F>7 >js'UUB*/=_gl7,՘+gP]eԐj ppV^GάOTw}̟n9#M?(U/[1( U{O ͦhlY[*@k(GV[FaGURKQ_D|QEQEW '$Zkc\u +ЧVΊZZH|Qz]Y"cԁ"ʱR0è=E~VN Zɿ,5X-s[Ni|'E}'ۛöd0 |b  5Z_am9_gZ~wN!fGos o>Fv迏_M鶺tb;Khmc15axb7͈?#V"Cw__i^ J[xG,^Ffkj+aӊ>&u%RNswoQEdQ@G=wPSF TPG/AךK%DnvFco^$3p/Il[y#ϽW4Wb )%c|C¥.u{^Yi嶐 Ȋӭuum vhֹυbxwO$)|Ngm~^|KE} O/[~m5j/H)\-R?0)30U&=ωD Tn.8Ҍ#hGWw/WӚ -+۳ y Z5)7O2q+BT'.0+ ( ( ( ߈|c-6GӚ;+g^EpcppQt*6zmLM&>7?o??*ȢwW<>l$~g B_i nC*5-},I9\ʢU$Ҷ (C l2V* JugO}S) y,dGCۭx24rVPk:n1}x_o R7S.K˱(=.߅\ҿ ?߅\ҿ ?/U?W[m>ޏh][+ ?][+ ?Z}?v߅\ҿ ?߅\ҿ ?U?Wn>ޏk/هDK+?][+ [ Y[[q%IyLi4xK1:N(((((((-⺅5'Z9aA(q<_~i6th'^7?>/; ;N5yߥ}I_70X#-; \s;; LwPKm 8)2?k6PMVܧf0k[&_b8VKO5Mz;/4WBV:<;`߈?b[֤:a:Sg+m77W]&"ey"7IdƟ`W>Ҵ}MO&O+BozoWqtV|v]R>sX?k<#AD;4>8d#p4cҺ:+0y^(kC13ihŠ(XŠ((~&|#njHi'tr PnFO+ITso_FiR]z|ύFOԾ|;E\sY-Dful^Em6kRn=FX#c(JQE}9EPEPY>(՗;.?2u{VjEJ ʜ6:aȎ%@$^U_Q8"'6/1jVp?>7?GKpȒGxR:WRU/??s3w}^xrYjز0O]EWR&|}ZG5lQEjdQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU[MNYtm~Uj.h;!Š(QEQEQEQEQEQEQEQEQEQQJ%4-Q^QEQEQEQEQEQEQEKVkkoJ"-^i|B,צן׫ DIET'ǽ|wʇiEk\pV;O$#QQE~+)JoNԒQR0?k݀t;81T_ikvvCH }5탧+ 7=TiQh<Т(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((BR 2" HgV˫(^H@ 2 xSC5WI-UgTx(|'uI-oOJaFThSV"rNYSt?PSG2?+l{kt] (.5 [B:82Qgki+ )yIR3cajW7dq lSU<#;Ӡz/rQ{?>/Sb$iQ_FpQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cMΜ0[VRtEJ/.9sAٞ;>AfwO>۴ьv:dƹ}oK)9e¿3̸FQnW_Gy|?vUEmj|~=bur#Q^*k[ˋ7$ hc)AEٖj, k 2\21ٶ&?B+e<{=>cCqtC[/5y5C_; DmT,GהQZ>0я̟=.zʵMe|Rl{~Q\x4K9~?fvЯa^$3G=YM6+]նwB)`r+HQK2Mrh62O bw't /6q-O¾/n9MrCW(;#H׻;~m7I,H:'[2ܛ Q|#Wcپ18XT}q^y -qp;݂cq^\׃m׭8#n1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1abZ;>1bR-@Gg;~0M'nСV @X `0 `+V @X `0 `+V @X `N:-ŤZ?v`pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pt0d%-` pjkku0AYǎLIth`+V @X `0 `+V @X `0 `+V @X `0 `+V @X `0 `+V @X g*6X 0@n44u=' [:ùb۔\A'l` X(m:! ֕?:iX4yl\c,ˑMe^7*xs2oδB+%kumo-޿ #וj0=3toӶ%ʹhY7ymmmR{6Pں!/CkݶtdϋGn.NZLܶck5$OhF_i'E'$&}$b3mLXV|gꛞe۠WIO'َ-R!ڼcoU8۳l|ѻXw_6Tkuæ6)Qͯ #%6=ó4Okz{M}xi^tֹo Hb|ly;Flb7_[bg9uޫihw :cnxi$<>vTQwwDĄ.-}۲h%թyR:{ZL=e0 @x&&l'ZWo{I+6/xYtB&qqްI Y ɡж KF@ yq/ئ'{ ZW撔:?80`'mfM\C'cmu], JKyV;e¢ GhK g,a4B]PbwvEN2ˁNwl^ieƞIq/J0n3)֒N,6ɡڦGoJԘ֝y>Ú_ "mڽ/~9XNH@B+f/Hjuny~VnN r~jqϠe1a’ xovr\TͲS.ts$ a{{zm3<*Ιҙ;iE"*ߖ$XBsduknG?R_Y4yeDG֮/@#VI*Yʱ}II}̕ MY$]<^Zʃ{M鄎*8gі*\I[Ud+=-L+$9+K߈+hfڻ;';+9sIթ>R ĎܺlNNsPWZVs:0`Www>-Dj߶((-{{Fxo-IȖx֒؏(4/͍2Vy4sSML$v=Ђu,hɐi=MwvQPZn ]['%w6PjY:=Wی9 k[zWS'72X'eղ3? 9岴$'knqt̘2{nςNzB}=*|JҪRakX]˛$USܹQZím<>Rm۶Tzb5͙lEeihr'WfsP7cm(cLR9djI%H ]hV:-S޳h9rpMcp;6x$mĶq0~[@K ^_k;Ꞌ3`j`|`ɺÿEPtgޱw-=/v;7ӑe&9#>Nkgje `0`l'<-^4yEݞI .νS&, v0қe=u,F'X's G?jwi;J,ay8,R_~qsC7 Z6s仗 swA}i%9[n,,TWn9 hs(G V9wC p5/9cc-QYimwKzrrDQʟeQ: Z6P%ꄬ446Ľ{DhOD&8g;+f/LuGum?](O~x{!BI,E=0+${pj.3 e=9;F䉦G)ٶK#=\ dvEDnp[=ۼ}N7o&X<8cwye#`l47/Ύv tBۺ\JBt$`jSJZ۴sK>siF=HJtG>i^yj3x1HCmnm27=1HMOt Yh\?/e ^ԁniUy,r X-gp?:-}-ӧהOK@M0|b|Ct3N³I\X.JZiiAm;ܚZ˗y!AWݝ%!Uާ<5SŜhpHKuQ/iYKZmmMr56Ғ?|pzgE[%9k_(j; ͞\~9kAn%<=d(PU%8VY?J{m'i?8T- Il -&_*k}R˃'}4[%$<0~@[ߥ$Wwi7N4.yRYC䇸ic;M,[vdNKt6"0TƢoi>VʣgdQ*6$dc]VR5 MI36]3nH7':8ql-Ғ,}?Oda<όq[o-ݔ==;I /xqifmp]FM>G'=nUm;e ~dxps. 7iO_(JyT6܃*e n:0feKG&:dSܹ:|}7U̿-uzD=˷-T\⪝ol)NTCAιUMt]{ጥ&^&ߕwCGeӒ \6^iS a{ʧm$sYMN[u #V/\H▼خ-ADS߶ _ߖqZVMi}Rw [kp:GGnFے_^rg M?Ordi޷0u`[`(X` 9[nϟ'@Jڟ}dO0Mȝ~=N0q䀄^wgA{>x>?#?2~sinO~v <w!uʇ?1ÿ9?A .0VszPaYngrsaZr/oN~v 75t=' L}S't8_[؛ [{}t @\`9sǛcPuB9,[v[˥mۙ g*6 O;C Zp&pfjy]~H'`70NS}Ûe:v#@X `0 `+V @X `0 `+V @X @eںr!ޯ}cym:E%#W cm xʧq_L_ 44]7='ڹk_s@;`NH Iu|;\=Б,_iFTT x/ow@z'Jb&߲: 0x4.P޿қ~g_0;}'^S! #I%VWW0I'ᓚ`%rȟ1_iǏ|@!m|2 f|O/¥C@~ =; ;_iu[d0YIK %C'.`i_B{TWIMT(d%-` p4tHț[ǽxjQj'J/¢@V GC+i |be +4(d%-` p4tH3._iN@V GC+i 1!JZ \ lw.3/C%A VxjOݹF'7,Z'@} +i cCI.q1p8$zүaI: YIK %L/,`i\ w>1!JZ0 ?۷/+nB YIK %՞+󨺢uvWOmZO@G@V GC+i #q1pW_i>jkk : \+ɸ8L- N'4(,LIpq/a@NO߶&/ ^~0vަz-7+D85hdf7J_ 0dS۷m#z .0dSI%D YbZ9 _IuH_9t<\ ΞUJVś~gRuN;XUI!JZRYx/X=,T]:'6-SSӧO曇z_:vG;_JooyӦMYIK %:".v-IE,7 __ǥ@V GC+i  Oߖ'4dJrE]Q0f 08:$XIKtP] ז-޸M_*Xu[zү#u22iӦ~0s1 r;d%-` p4tHҽxȜnoٮTcŞMӓΪiq?Omuw5gEfnŊ)߿m6eʔs疔 βe5c 8s裏>}~`p4tHЂ_ MN3΍\=o_t2ҷiӦ$[nFє)SzEIђYIK %:,fڝk<ljX~Y]8Dg>wuȑ:љ;wn={1íZ,+i cC@Gb`iٻO'de$ٳ'G}a!C跳SN9B -1!JZ/-U:$5-9_?+yXRNFƍ cȑq/ ;m11!JZA.EfkϦ|ƏthӁÿو_I:)..ob08:$XIK!3uj۱“o[|M޽o_ e׼)wyy,1{6MoxNfF]tzc(P݃9~[Ib%-` p4tHLgyli~G+whiG\c$-854_m۶weɒ/JZh`%-СI?(#"QY1LӒc9i{=ӼDϋquݻnxyx,JB;w̽PpN:$t7>Z+i cC@%xɱgOw^ 7 ?q=H_;wuEܩCCոpu |irhQ%A VT,wǽ~8q/N4'[}l2[IVj.> G(P8JJJ|rhQ%A VTùNe3VoJt1-p.$qiV%yNn钐u9S4.4c @QVVlJZh`%-A?f'zڏ'.?Ư(%d=iwv7Mƅ-[(PPrhE%A VVǖ%nBO Z}kϖٺ $tYY@Aҥ~o}"V GC+i k '9'o_Bgڝk<6`k|2N{H@o~08:$XIKtt3Vo xMƓlS]nxQgF\t ~][n1!JZ+w)/ /" okwm9=B`G+b%-` p4tHɎ1E}w:a6}0ҤAEGO7EъXIK %íW̓u5:Iy7Z/& .:zF.-VJZh`%-`w^$^O[e`ƥ?]Okx튌hPp(4 vo}"V*fė2|RsWӓ{cm$ Ɠxc=B`[?4*D7,9J@5#xIR;v~C=TP䣔T>VcnN@Fʊo;hʔ)۶mi9*;|s疖-[,#FuZ :DΚ5k;kp]j~F u HSIIIϞ=e2c\ŨQz3wI'I~Ⱥd:s{;w=̶mbҟ? LWґ*zI'M2E_:}^ \UUU:E'e2[?` KG`%-`.Hw` 7nfĈZħ#hJٯBJret[_1cvJ~rhE%A V&={67|>1K` 8=I'ԭH_)))q뫁 AD7ӊk׮_l~08:$XIK?%pG{ou#N?/1t\t4@YY܃L\j:%UT]tї a}pA>\_5n~08:$XIKcÆ {g>~ 7ܰtR@ȇ%|p7xcrM/| 7nԯt\t ȑ#U-))?eGBi1nӍIj)~>SN~fr3D'?ȯ[:yt=y Y KywXi]*cjӵkW}iԗl~08:$XIK/wy N>JP}׿j'3fX>+gϞ˯i,))'07ÊU򃾔RTBXŠAt7ي%d%8[rhE%A Vof>O?vB{gC/v2n!rѣ$޲29C ]@o" )g΁򺊪<^__\ǢuIIÝ+Τ&>Z+i cC1Z5y饗 |\s5 Y.:z%cXڵkܜ؀$̩Ď6K iZQsm۶9w1c\إK!铍dtF\pwa ֍po}"V GC+i cH]3ӮEƦMW_̠墣g(~:u*..WSP社jKBnM4eܮ_1I'$X;#Wmu.-VJZh`%-`  &pCYyV,v֭4Qݻ˧`0wK#P焮EъXIK %A8-/%dNꫩvJuݞ={]v{(%J bSDEъXIK %A8-/%;(?Kr6FNi9.'oT,aUg;_[wN~DL>Z+i cC16 %x=[t*yR_ @*# :xv?8u.-VJZh`%-`  i w]_JTEgN%v3GM!=BX}'tBNSLW)..~ܨ,Wt.-VJZh`%-`<UV7o<{u駟LI$ \pÆ ?~ڵkʁ"Sםj3l,ۀRk-1U_J}h4x!1bٗ]%T'WrG+vo}"V GC+i c<\ve_u)ȵ~W\qŒ%K<ToNym䗼2n;wc*I1%d+vo}"V GC+i c0رo'>#>wZ .O;4,=C0KNv>9vӯ}"V GC+i c$oذOG[lO"spEEŸq㮺o~"wqOo۹sgC!]+>D 凸''9Rf,W!6lضmx?ͮ,]>Z+i cC1UUUgu΃(\pa$yvp>St3D,!K,h]Y?^([nӁkY ~Edvk^ 8P7 eݹT$:}Tb^6p/_GV,t6Ax!?_ĝD:t \o>Z+i cC1 ׯҗ3 :6mڤOh9K/ ~WF ~r`نd;B-$ HLYG٬b۶m@ΓXt\;VJZh`%-`,w߭;ꨣ>O,2#;#=C;Ϟ=ow HϞ=%p7)w_% 6sdR"\x]2a7G :s"UHIG%SUn)x6I9]u0ъXIK %M9ƍWRRo/EzoƘ1c$"je9SGvp۷og82dƌFFsΕ, :|(9%0rBC.f1!JZO<# vj}{1^<}CRFFQg8DFNwE RmmV0C'ᓚ`%r0M0G{*d?Oѣsp9!;~i?6:t̜9S;%裏jW'|R;!z!3<ڛ5kZ89ҁ:%֗ߌN0g̘!qN{d# Cx\tD'H*yURNH= p¡H.:Hvں7'}-MR0 տ1rDc}[S.{qXk5X\[U $ ^zAv9ù C\tD M6odzW6ٚO}Un肊'% {wkU]]1dϪ?0iע- /m={׋I3ӹsg R]N0j1fHx;{7ZvU<OeO԰cn{VְڶĻyLιo4os{JomXy;w4V$XfD]/YH0g8yi.:HvF{})<;[7վ?t{o^&/脃Z[j,޼}6x$WgF5pO}SZu֍3p_N0X$ ;f5o/T״ul1x SL2dHݵҥ,gܹ C\tD ;?tom՗=ٶS׽Q[/$aMU[R蝹m;Slj\RR2|={j5@,vKTW E'@t.oKi1_gu%]2O^YVoLMYf=Ɇ5oo>xMUM~sjXa㻭C]:fcm\fcN9ʖmkke{S5=UUU;%|J6lѓN:I+=zȖ 2DX $/E'@t.ܲ_U?}Xni5[mRκpy5޻r~SEYæUSxsa㻕~vx2W#{ޞ./z7| ԼX_IvxW ޜа}ު~sYoS{W-(nIk޽mZ[g=:7կ}S⮼]S٫k*dwu޿f-#Ϯ?:թyjЭ[7 ƃ `O_yvg7|UV?rt@[^'/{W"ZTy.r.-TߧjsEkKvg'WWfs ]3ב1H^xK"Tj.3/E'@t.P5mnmtITQg=oO۳oNO\ҺWӬ.W5/#}/Z*vZW;-l'-㑁Ҷ?Sws^ٷz~_g[8gw޾?g?tf>'t%fȖ8O2E1pE'@t.h(Z=~ؾGΪuQy1n]|ӣgxk7|иtߺ#K.2k#w`Y{,pY|ݜW>_{LBGTvg}ߎ.ܯ3en} 8y ]9|gCKMŮ]\PGkNs|[|LnPh :DlakOjmzix݃}m]+} =qEc귳x#׽;z\5O}ݤEæ{gpr̛ܲf}ڒֆ򊼵̼|z.~쪿]{p$JJJ$>\qQQ A'@t.ܸ+k٫wMgY;Rv֖7P}ֿ?[^WfOwwׄ[ޱs5 Kx-{ߪώo+'^(S&t+RYmy)Q]i:pYr# ~j;k^}e_ے=}*wMUTՈ;FsvTNY=s+yw{MYl#GJ08p]Z!%E.:Hv^TSQӻF_S/vI=yM;ʪiSW5+;/֯_R5O߮?JDͫ|Ԑd݋'׌˪~G:jػ+;UՋ_SvlYfطk^ڰ}٪;Ajںk⭻B}a{1+F{J_zװumRuyՋ-~)Zj?v*|U~8i5?v;>ؽkCͮMw}{NJMJo{޽{]56lys=h}{1K/=|jd5k薹̼hRߢ}&%Id-H;s?R#Zh`%-` pP[Ywۿ~]ݿծ}pTX{wϛ)wPu wIdr}T'$Ʊ_Z6iF!?+i cC1i޽vMSk7m kvҩaxĈq.&< i{wmdT^\খ&o Ah(X`%-` p4tH0tf͚Ν;AK^kBw2)7> }=uQOJZh`%-` pX\uU}.#FБ4 <{R?O2?>s2kOm&08:$XIK\plq3f`.<Ӟ+rg^_knN>w>ݟF˸]6um&08:$XIK#OGNȵ{Wa{K.s4,;8݁䴱{=+S_|vB]pZecj 1%K}Ѻ 8L|V}2]WM? ,4ZM* IXIK %M?q衇j>,^X!w,XO}J?sj 4ӧǽXC 5ʪ>9?Gz3a)1\4ZM$ IXIK %M.++ڵ9-Z] ?㴾>_Wmۦ]+,y?jԨRgs\vםCFghHe0韄1!JZ`q9hx:ꨟy 8#\tEtӧOOt._.]|oyQo_}H3/M?¤@V GC+i cd'NC9dڴiz+V7>3)N g#zõS*yi,%&08:$XIK#\UU_g@t~GObӦMqsy=>qsE;s=>pNeϠ0>1!JZY`1gΜD)B8<[wXdI߾}uK]4wYwg 4Z6M YIK %}_uDO"ӧO袋_N>=^||_>q/F˲W0>1!JZ9 n[oU?:^$|饗r)s,tO(> O~rĈZ:pΡ57θhGgzN;rh~ YIK %,͛XG>~Rm{* _ZѮ1W}[)-F˺鷪0>1!JZ f֭.?Z-w0ٸOmg;"z3~mS܋k=Wnxl㯬yuE9=iM7޽^$Zߪ¤@V GC+i c<| ,7nȑ#x)԰x…7n\euS5ܣ^L{)}=PPCsK]O.}ِ&HIDMU%A V_9=q{,0~swٿm˥mި/=sM mg]ަ0[۠ߪ|%A V ۀ z=mLIܲsvʈ{h 7,rEbӮrOdWּ~cq޸0[۠ߪNZh`%-`  lޱg~)qם4$ ,Nr/3sg;3ifz_{^\pZIK %A8fG%Iy12sVuos7`; ILr7:heWEXގK:$>e-I &8-N%A V ۀܣg{+]jvʂ{mw~)DJ[mC3{L/Bg }xgT;Wlɞ@׿1nL[N;hcFOЕ m*LZ +i cC16 ޶ w;c|g/vʎ{ɹmWO6VϤ$M;^JV[ d9dvOlY_\Αjɱn.r(y;,*eivb=Τo36鷪0i%A V ۠^HUuՐ)0N]$/^xn[(7Ϥ$-vӬi+_Ք^Yxr,Jh\NY$R: V+mPx7xO]?ㆪ*}5;o-9v30뷗i\p/?9Sr.Io,➦ 1b,_5gj/:go95JK>cG=;M^Ce6|0M'_СC5 ̜9S;e1te5k~>_v2Ϟ=\k|3&8MtE2]w~>" ?\r$7'I9dƚL{WXsrgbPV>iqp^içod2U^mJ ?;,.Oxҥ>~O>Gο38㷿/sNݔN2EޫW䙳]tC=$%MI_xh <}l3ϊ(c|X+7YK[e7T9y^+Ap{L?g$?]NJK>}D7) @.Xׯ_Νu)9co馭[feA?A3Ϝ1cnV: 1/ݺ{\Qm(tM#}61\k| )]RY#x2gR9FOҞ\sIyGJ`V!]/b ݺu?~n_FdvY. \rIEEn_0Sr,hrJi[y_QGݻ߻Whr(M ݉GHgvwnUP8%WZ#L`0*p :I9;C2Mwy.0Rj)nek;᧧kwuǝh)c۝]KV4˞YW[U蓤9׵& qqikŝWZG-zF`0$_[f 2GH7׭[ۚJ^ZWZEIKtX=kZ35 ҜSGkw+->cݜ <~e h K`>?y 6qDƏSN'UXu=q6O#]¹?`*/~XvrbEa%=Ƣc9l[uE}<9d(rY؋αeIK>4˙}ج[ݯ;-V${[f869,.?Ig0ۗĒn_җt6y睺Inm4RIHv^jvJ -׽n;/kh(:yQxwfKvX+rrޜ@leްag>x7tnwR7p`~7jIpXm9}ms6yIZ\ǐ3Yi>D$> XY,{Bnݺ}|}svc!u!˗va. :Qo.U4mnMvm>>NEgW&w;c欟{i+_?=iw~o9%Jw_{H*si-~\&ɢ/^>*Ij˝-dW]ry&K,={n6l֭Yެ;Jm:-69k,.|G{_jɒ%۷oܙO|nݺg}_>^>cjx$>sׯw֨Ynҥ_~>niiѭOpSKӯ12_S/>}>ol,N^/eod v#>SO1Kb7M+R% Oʴ_<騣_ņ' >ilQ~Nݻ~qf$tyVMe[!]6^Ү>'tv„ t;|zڪ|djWɓ'k(|ɺ>ӦMN t,G }=OE5%S/_;w3^>Bׄ>6xo^gUhY6V@vlM~駵OIeee׮]uSĵo߾;N/~Q 3<X8wkn0gv}^8uEhNe[!]6Gծ>O=vž={?xݔݛxjN8 %MB;%apU}&%۶z_8s^|-{;?s=7(6Fˮ C`$ꦴW8v{xk˒^xn|FOB:L~Ŷeh4I7:,-˦*|I &~7nۻ~߽n6%hrG]+w[2k_vm뿒]wݥ3HN=#:|)^zI\}ک`ݿ퟊t|rQovoqg~qY~C %Av#U;/ry }G{M:9:k}^1A{}|V&08:$XIK|>cǎNX>g=iTI}oz5:-RO'hgߡߧ@V GC+i c7osurN]~pr55CqÙΚ } 7.DhZƭO~v>1!JZyz:9w>O-[LqPhx:9+p!T7_LåO?Oђ/c_@V GC+i c;0;]t0:9J] X㞄C%jpsYIK %Av##o\~SOڡќvyY+_oLG@V GC+i csd%-` p4tH0؍ 9@V GC+i csd%-` p4tH0Fh^i9u!,YDqPhO>:9 +p!(Pd%-` p4tH0Fhoo~ܑwu}١Cִw7Sg,k{' \ YIK %ZSh8$;vv @>1!JZ`Ç>O?v @>1!JZ`KgyꩧS``J%A V  tJZh`%-` rN%A V  tJZh`%-` rN%A V  tJZh`%-` [n߮39R;FPtJZh`%-` [nرcO=|ŗ_~Y;FPtJZh`%-` [npn(08:$XIK#OGNQ*yU7mL%A V&?g) [l9ctS;vh?o|ڵ= [n~Qki(HIuS|ƌ YIK %M~?pݞ>n8;wzꩺ>^xK`G+ ~b~hOJ-K Bd%-` p4tH0F6x{'?CyluuoHHyޫ]ݻwIIIc9W^^wER BdZ`N|)'5!J|`l+w7$wy#8BWϑG'| '|2hR:ɷ@T,LIl5tPMB>3gN-]4ѩ袋t~3@;Yf >_v bРA:َ8˗F';tYg3%\0e9s|ٌt777 eHGuk 0$S&Sq; "{}/nh` l,-ZԣG v7Ԥ&n:Cuqf"Ku!A``QSSs]wrIg1gݲ,k{օF_')nY`` l쨨x'/<?|ܹD7t… ukrd7pCϞ=/˿2}S2J15i"A`|ڭ[_~koÆ ;wlmm,|ǎ"]e>I֭['f0`k!@؎l0`#ۀ 6 A`; @؎l0`#ۀ 6 A`; @.Oxǎ/ҟ_guV޽̿s9+x^FݔbG!*I&JM&%MI0<׿WK¡ڣGIUUUYYȢdr R!CHyuA v9 _tN>}n_Ff̘! @+ERC v 555i}c{ned;Ld)uuune` lgϞ3)ҥʕ+u)od-+U晔NW|DH%AB2W{sI'=oP,Z讻򗿬gĈ <5YeEd]}1abZ` /NQؾ}{uVe˖ڵrKtS|R&s0>1abZ{Nz) 555ާ?ui?$k{@Y{ѣGk"@V Mi!cd%wiWIk) T{쩛Ҟ۵kj?( vnϳ> YIK6 ,N;E!pG?L%AB $WTT$ϖǦMT YIK6 ,Av>? yo}[sߓ"(Pd%-` pt00Fx޼ySL,pŊ ۷oիe O:җ$W#(Pd%-` pt00FtrNoI.//_/~j7#d`0@V Mi!c䜺;t~f'|`J%AB3?9y.///**~>sz)_ @>1abZ` ƍ=s8F23oD>ϾkΒ= YIK6 ,Av oذvJ+|'_ѥK3g#(Pd%-` pt00-,6o|ꩧj,Yt>`J%AB eŖ-[~_}U]\<`J%AB3;9_WXds8_@} +i cæŴ1 <^{}Ng̘+8(,2): YIK6 ,fMTX{.tc0@V Mi!cݲB2g%=C YIK6 ,AvI#Fْ3@PtJZ``1-` [NO?}Gl\|KPtJZ``1-`05k}sj[la{< 4(Ȓ YIK6 ,f.**'?) 3>Os= O=Tq"#(Pd%-` pt00F{NΩo]WpP$84h.(0@V Mi!c䜺;t38/`J%AB e+_w]%1[nEGPtJZP``1)0-tE;%~Μ9lK3F@!|?~7VC$3sL R(fX'|\$]ۓbKss#~>~͛t޵kO~__WWt|Ə5kv5j'؎Avq3>XuTUU%ڶY D`0p`3pw  ?ɓ'{2?:v< tr`%0ۅ%kr)r? /+8(,$yNs > 2 0 * zGدd={ʒ /%EY"-,&M$SIj۶m>h@lGvI0n`Ё.Og%znX"r]w@`&OAh@.$VE{tÆ G}nJ{ݺuۻwI_״k{7j(~)>Ah@.zO~ڻ;_~ꪫt;|_+N=TsWkM2EJާ>) _` lMnnn>>766jPڵkذax5]曫k(RF)nO=  ]6Xr-;N:iͧ뮻NVqs!̝;W7=頽U 4HV'+燬+Lt1s̭ު0eWXqG Ԥt8uI#MO  /7e褒4R|@.uc9F1u t6I٥I ]X̞=ٌt 'TTT}?^g6ґG)V770`I&L06ڵkuC[fͷm]a$?^740`Us޽l:kƍi 2Ʒٳg&C v9 |Ȑ!]tED{'t˲O쥰]wݖ-[t#A``ի뮟'g?p]\r!GqW .g Zuu,P+ ܹHWR@)SJ* JN:-ŤZ \s&!SjL_~…//8%Ϙ1cɒ%[l,ޒV?|)PʨK/W_ ,c!Mi!c5`} +i cæŴ16 YIK6 ,A@tJZ``1-`  "@V Mi!cm@!08l:XL l0>1abZ`DH%AB ۀ Bd%-` pt00F,I;M6M?T0|} +i cæŴ1ZMB>SLN(pSNG C%ABƸ馛4 < N>JP} ?tJZ``1-`_Ϗ~#w)#_@V Mi!c꫇r!nЏG>Yfi?08l:XL c{xz5zٳgϝ;w |XWTTd<_ _08l:XL dȐ!?//@ȇ%~xG_08l:XL dٲe'4;%} +i cæŴanME7߬?YIK6 , }$7 FC%AB)--/Gоo@>1abZH8}_b~d%-` pt00UEEСC:(MK@c3L%ABf[hѯ~|+P䣔T>V Dd%-` pt0(k׮2eK.d硠G&||!G*N%ABA%ABA%ABA%ABA%ABA%ABA%AUmm"h9::wi:w `0 `+V @X `0 `+V @X `0 `+V @X BQ]]bR-@Gg;~0 8l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08l:XL `08T:XL,cM:40 `+V @X `0 `+V @X `0 `+V @X `0 `+V @X `0 `+V @X `0 `+V @X!Y:tٳg~o2ԯ_?gR_Bwԩc߿N8 y駏:ꨊ =¯pn3~OR_ 92HIR9y;nF |ǜ/XSMNS(!*`0 ={ز-{ _<|4p| hᄱD]GlBrpN)M:w\0\,;N ``'8oSb>#y]r%Om `K կ~5-i0s\ 1G,^z+%Wї- -jDNgQ~Lw$ZsNyD 6{?;y]xޑ,V~~b+gS[}y>/r-?e cKl-Ap6t<_!䣗UD$_ Geʺ%xGgKN95J:ܯ$z3)QU-31-YM(d.W2:|p$dخak<"WOs:$/k eT7FY6,?mί%x&SGg/Ly9+2-_$s,YlmO,0*oYKo?=AfL?'Yko#8˳ίgIfLa}ȟ pl/9wZv+O(rKcgn lɊbr (Ȫݛ!b%BpǶug=);m{FȌ:I $ q>+)?n޾tv3$W$Ypj,?;ScEʍq$o9r%1* @7w]$!$Ɏ{ Ϟgw6 v_qByg;"ɦ'9?{"8KY̒k/pw6[p3+M=S|=UMd*KvH1-]#џ#ь)7, IOv$8qѽ<'Z]' $M$; $QS3S(aJn^#c5T8$E9/zނFO\r2.,?I eqxZNĿX[p*o-R}}cfO9c!'w$o9r%1e N[|%^qőrco3[nfLa`ӤE𜟝.^B lM7%>wAQU' nt/G8D%'s^t#5{-n5gݻǖ|IjogFt./I޾?U7{)H% dE,8baEt=wqv@{]l"s9 ,!ъ^tog[:S :ITp.3Eݤq_wx>2xyGi'8e᯿p{%R0oHX\q[G>ގ35wo|FKRKvƞ+EVS:-f 0X>bs`ȳÍlH 0Ћl8$SCs  );qEqFrc~wAX `0 `+V @X `0 `+ؿÃN0YIENDB`statcheck/man/checkdirs.Rd0000644000176200001440000000223314350273527015234 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/checkHTMLdir.R, R/checkPDFdir.R, R/checkdir.R, % R/doc-checkdirs.R \name{checkHTMLdir} \alias{checkHTMLdir} \alias{checkPDFdir} \alias{checkdir} \alias{checkdirs} \title{Extract statistics from folders with PDF/HTML articles and recalculate p-values} \usage{ checkHTMLdir(dir, subdir = TRUE, extension = TRUE, ...) checkPDFdir(dir, subdir = TRUE, ...) checkdir(dir, subdir = TRUE, ...) } \arguments{ \item{dir}{String indicating the directory to be used. If this is left empty, a window will pop up from which you can choose a directory.} \item{subdir}{Logical. Indicates whether you also want to check subfolders. Defaults to TRUE} \item{extension}{Logical. Indicates whether the HTML extension should be checked. Defaults to TRUE} \item{...}{Arguments sent to \code{statcheck}.} } \value{ A statcheck data frame with the extracted statistics. See \code{\link{statcheck}} for details. } \description{ These functions search for NHST results in all PDF and/or HTML articles in a certain folder and send the extracted statistics to \code{statcheck}. } statcheck/man/statcheck.Rd0000644000176200001440000001351614362536233015253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/statcheck-package.R, R/statcheck.R \name{statcheck} \alias{statcheck} \title{Extract statistics and recompute p-values} \usage{ statcheck( texts, stat = c("t", "F", "cor", "chisq", "Z", "Q"), OneTailedTests = FALSE, alpha = 0.05, pEqualAlphaSig = TRUE, pZeroError = TRUE, OneTailedTxt = FALSE, AllPValues = FALSE, messages = TRUE ) } \arguments{ \item{texts}{A vector of strings.} \item{stat}{Specify which test types you want to extract. "t" to extract t-values, "F" to extract F-values, "cor" to extract correlations, "chisq"to extract \eqn{\chi2} values, "Z" to extract Z-values, and "Q" to extract Q-values. Using \code{c()} you can specify multiple tests. Defaults to all tests.} \item{OneTailedTests}{Logical. Do you want to assume that all reported tests are one-tailed (TRUE) or two-tailed (FALSE, default)?} \item{alpha}{Assumed level of significance in the scanned texts. Defaults to .05.} \item{pEqualAlphaSig}{Logical. If TRUE, statcheck counts p <= alpha as significant (default), if FALSE, statcheck counts p < alpha as significant.} \item{pZeroError}{Logical. If TRUE, statcheck counts p = .000 as an error (because a p-value is never exactly zero, and should be reported as < .001), if FALSE, statcheck does not count p = .000 automatically as an error.} \item{OneTailedTxt}{Logical. If TRUE, statcheck searches the text for "one-sided", "one-tailed", and "directional" to identify the possible use of one-sided tests. If one or more of these strings is found in the text AND the result would have been correct if it was a one-sided test, the result is assumed to be indeed one-sided and is counted as correct.} \item{AllPValues}{Logical. If TRUE, the output will consist of a dataframe with all detected p values, also the ones that were not part of the full results in APA format.} \item{messages}{Logical. If TRUE, statcheck will print a progress bar while it's extracting statistics from text.} } \value{ A data frame containing for each extracted statistic: \describe{ \item{source}{Name of the file of which the statistic is extracted} \item{test_type}{Character indicating the statistic that is extracted} \item{df1}{First degree of freedom (if applicable)} \item{df2}{Second degree of freedom} \item{test_comp}{Reported comparison of the test statistic, when importing from pdf this will often not be converted properly} \item{test_value}{Reported value of the statistic} \item{p_comp}{Reported comparison, when importing from pdf this might not be converted properly} \item{reported_p}{The reported p-value, or NA if the reported value was n.s.} \item{computed_p}{The recomputed p-value} \item{raw}{Raw string of the statistical reference that is extracted} \item{error}{The computed p value is not congruent with the reported p-value} \item{decision_error}{The reported result is significant whereas the recomputed result is not, or vice versa.} \item{one_tailed_in_txt}{Logical. Does the text contain the string "sided", "tailed", and/or "directional"?} \item{apa_factor}{What proportion of all detected p-values was part of a fully APA reported result?} } } \description{ \code{statcheck} extracts Null Hypothesis Significance (NHST) results from strings and returns the extracted values, reported p-values and recomputed p-values. } \details{ \code{statcheck} roughly works in three steps. \strong{1. Scan text for statistical results} \code{statcheck} uses regular expressions to recognizes statistical results from t-tests, F-tests, \eqn{\chi2}-tests, Z-tests, Q-tests, and correlations. statcheck can only recognize these results if the results are reported exactly according to the APA guidelines: \itemize{ \item \emph{t}(df) = value, \emph{p} = value \item \emph{F}(df1, df2) = value, \emph{p} = value \item \emph{r}(df) = value, p = value \item \emph{\eqn{\chi2}} (df, N = value) = value, \emph{p} = value (N is optional) \item \emph{Z} = value, \emph{p} = value \item \emph{Q}(df) = value, \emph{p} = value (statcheck can distinguish between Q, Qw / Q-within, and Qb / Q-between) } \code{statcheck} takes into account that test statistics and p values may be exactly (=) or inexactly (< or >) reported. Different spacing has also been taken into account. \strong{2. Recompute p-value} \code{statcheck} uses the reported test statistic and degrees of freedom to recompute the p-value. By default, the recomputed p-value is two-sided \strong{3. Compare reported and recomputed p-value} This comparison takes into account how the results were reported, e.g., p < .05 is treated differently than p = .05. Incongruent p values are marked as an \code{error}. If the reported result is significant and the recomputed result is not, or vice versa, the result is marked as a \code{decision_error}. Correct rounding is taken into account. For instance, a reported t-value of 2.35 could correspond to an actual value of 2.345 to 2.354 with a range of p-values that can slightly deviate from the recomputed p-value. \code{statcheck} will not count cases like this as errors. Note that when \code{statcheck} flags an \code{error} or \code{decision_error}, it implicitly assumes that the p-value is the inconsistent value, but it could just as well be the case that the test statistic or degrees of freedom contain a reporting error. \code{statcheck} merely detects wether a set of numbers is consistent with each other. } \examples{ txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" statcheck(txt) } \seealso{ For more details, see the \href{https://rpubs.com/michelenuijten/statcheckmanual}{online manual}. } statcheck/DESCRIPTION0000644000176200001440000000577414363505732013756 0ustar liggesusersPackage: statcheck Title: Extract Statistics from Articles and Recompute P-Values Version: 1.4.0 Date: 2023-01-23 Authors@R: c( person("Michele B.", "Nuijten", email = "m.b.nuijten@uvt.nl", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-1468-8585")), person("Sacha", "Epskamp", email = "mail@sachaepskamp.com", role = "aut", comment = c(ORCID = "0000-0003-4884-8118")), person("Willem", "Sleegers", role = "ctb", comment = c(ORCID = "0000-0001-9058-3817")), person("Sean", "Rife", role = "ctb", comment = c(ORCID = "0000-0002-6748-0841")), person("John", "Sakaluk", role = "ctb", comment = c(ORCID = "0000-0002-2515-9822")), person("Paul", "van der Laken", role = "ctb", comment = c(ORCID = "0000-0002-0404-9114")), person("Chris", "Hartgerink", role = "ctb", comment = c(ORCID = "0000-0003-1050-6809")), person("Steve", "Haroz", role = "ctb", comment = c(ORCID = "0000-0002-2725-9173")) ) Description: A "spellchecker" for statistics. It checks whether your p-values match their accompanying test statistic and degrees of freedom. statcheck searches for null-hypothesis significance test (NHST) in APA style (e.g., t(28) = 2.2, p < .05). It recalculates the p-value using the reported test statistic and degrees of freedom. If the reported and computed p-values don't match, statcheck will flag the result as an error. If the reported p-value is statistically significant and the recomputed one is not, or vice versa, the result will be flagged as a decision error. You can use statcheck directly on a string of text, but you can also scan a PDF or HTML file, or even a folder of PDF and/or HTML files. Statcheck needs an external program to convert PDF to text: Xpdf. Instructions on where and how to download this program, how to install statcheck, and more details on what statcheck can and cannot do can be found in the online manual: . You can find a point-and-click web interface to scan PDF or HTML or DOCX articles on . Depends: R (>= 2.14.2) License: GPL-3 Imports: tcltk, plyr, ggplot2, rlang, rmarkdown Suggests: testthat LazyLoad: yes ByteCompile: yes Encoding: UTF-8 RoxygenNote: 7.2.3 NeedsCompilation: no Packaged: 2023-01-23 08:16:46 UTC; mnuijten Author: Michele B. Nuijten [aut, cre] (), Sacha Epskamp [aut] (), Willem Sleegers [ctb] (), Sean Rife [ctb] (), John Sakaluk [ctb] (), Paul van der Laken [ctb] (), Chris Hartgerink [ctb] (), Steve Haroz [ctb] () Maintainer: Michele B. Nuijten Repository: CRAN Date/Publication: 2023-01-23 13:30:02 UTC statcheck/tests/0000755000176200001440000000000014350273527013375 5ustar liggesusersstatcheck/tests/testthat/0000755000176200001440000000000014363505732015235 5ustar liggesusersstatcheck/tests/testthat/test-extract-z-tests.R0000644000176200001440000000366514350273527021430 0ustar liggesuserscontext("Extract z-tests from string") # test if the following z-tests are correctly retrieved ---------------------- # standard z-tests test_that("z-tests are correctly parsed", { txt1 <- " z = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "Z") expect_true(is.na(result[[VAR_DF1]])) expect_true(is.na(result[[VAR_DF2]])) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], 2.2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "z = 2.20, p = .03") }) # standard z-tests in text test_that("z-tests are retrieved from sentences", { txt1 <- "The effect was very significant, z = 2.20, p = .03." txt2 <- "Both effects were very significant, z = 2.20, p = .03, z = 1.23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variation in spacing test_that("z-tests with different spacing are retrieved from text", { txt1 <- " z = 2.20 , p = .03" txt2 <- " z=2.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # variation in capitalization test_that("upper case z-tests are retrieved from text", { txt <- " Z = 2.20 , p = .03" result <- statcheck(txt, messages = FALSE) expect_equal(nrow(result), 1) }) # test if the following incorrect z-tests are not retrieved -------------------- # z test cannot have df test_that("a z followed by degrees of freedom is not matched", { txt1 <- " z(28) = 2.20, p = .03" txt2 <- " Z(28) = 2.20, p = .03" expect_output(statcheck(c(txt1, txt2), messages = FALSE), "did not find any results") }) statcheck/tests/testthat/test-extract-correlations.R0000644000176200001440000000347514350273527022522 0ustar liggesuserscontext("Extract correlations from string") # test if the following correlations are correctly retrieved ---------------------- # standard correlation test_that("correlations are correctly parsed", { txt1 <- "r(28) = .20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "r") expect_true(is.na(result[[VAR_DF1]])) expect_equal(result[[VAR_DF2]], 28) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], .2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "r(28) = .20, p = .03") }) # standard correlations in text test_that("correlations are retrieved from sentences", { txt1 <- "The effect was very significant, r(28) = .20, p = .03." txt2 <- "Both effects were very significant, r(28) = .20, p = .03, r(28) = .23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variation in spacing test_that("correlations with different spacing are retrieved from text", { txt1 <- " r ( 28 ) = .20 , p = .03" txt2 <- "r(28)=.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # test if the following incorrect correlations are not retrieved ------------------ # do not extract correlations larger than 1 or smaller than -1 test_that("correlations with impossible values are ignored", { txt1 <- "r(16) = 26.05, p = .10" txt2 <- "r(28) = −59, p = .0008" expect_output(statcheck(c(txt1, txt2), messages = FALSE), "did not find any results") }) statcheck/tests/testthat/test-decisionerror.R0000644000176200001440000006325414350273527021216 0ustar liggesuserscontext("check if gross inconsistencies/decision errors are correctly classified") # test if the following cases are correctly identified as decision errors ----- # check classification of regular decision errors in all types of tests test_that("simple decision errors are classified as such", { txt1 <- "t(28) = 2.20, p = .06" txt2 <- "t(28) = 1.20, p = .03" txt3 <- "F(2, 28) = 22.20, p = .06" txt4 <- "F(2, 28) = 2.20, p = .03" txt5 <- "r(28) = .22, p = .03" txt6 <- "r(28) = .52, p = .06" txt7 <- "chi2(28) = 2.20, p = .03" txt8 <- "chi2(28) = 52.20, p = .06" txt9 <- " z = 1.20, p = .03" txt10 <- " z = 2.20, p = .06" txt11 <- "Q(28) = 2.20, p = .03" txt12 <- "Q(28) = 52.20, p = .06" expect_true(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt10, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt11, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt12, messages = FALSE)[[VAR_DEC_ERROR]]) }) # test if different arguments concerning decision errors work ----------------- # alpha: detect decision errors for different alpha levels test_that("decision errors are correctly classified when alpha levels are changed", { # all cases below are errors txt1 <- "t(28) = 2.20, p = .06" txt2 <- "t(28) = 1.20, p = .03" txt3 <- "t(28) = 2.20, p = .11" txt4 <- "t(28) = 1.20, p = .09" txt5 <- "t(28) = 5.20, p = .02" txt6 <- "t(28) = 1.20, p = .005" expect_true(statcheck(txt1, messages = FALSE, alpha = .05)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, alpha = .05)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE, alpha = .10)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE, alpha = .10)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE, alpha = .01)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE, alpha = .01)[[VAR_DEC_ERROR]]) }) # pEqualAlphaSig: should p = .05 be considered significant or not test_that("decision errors are correctly classified when argument p = alpha is changed", { txt1 <- "t(28) = 2.20, p = .05" txt2 <- "t(28) = 2.20, p = .10" expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) # check pEqualAlphaSig for different alpha expect_false(statcheck(txt2, messages = FALSE, alpha = .10)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE, alpha = .10)[[VAR_DEC_ERROR]]) }) # test classifications of (in)exact test statistcs and (in)exact p-values ---- # test statistics exactly reported & p-value exactly reported test_that("cases where t = ..., p = ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) = ", t.04, ", p = .04") txt2a <- paste0("t(28) = ", t.05 + .0001, ", p = .04") # approach computed p == .05 txt2b <- paste0("t(28) = ", t.05 - .0001, ", p = .04") # approach computed p == .05 txt3 <- paste0("t(28) = ", t.06, ", p = .04") txt4 <- paste0("t(28) = ", t.04, ", p = .05") txt5 <- paste0("t(28) = ", t.05, ", p = .05") txt6 <- paste0("t(28) = ", t.06, ", p = .05") txt7 <- paste0("t(28) = ", t.04, ", p = .06") txt8a <- paste0("t(28) = ", t.05 + .0001, ", p = .06") # approach computed p == .05 txt8b <- paste0("t(28) = ", t.05 - .0001, ", p = .06") # approach computed p == .05 txt9 <- paste0("t(28) = ", t.06, ", p = .06") # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics exactly reported & p-value < ... test_that("cases where t = ..., p < ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) = ", t.04 - .001, ", p < .04") # approach computed p == .04 txt2a <- paste0("t(28) = ", t.05 + .0001, ", p < .04") # approach computed p == .05 txt2b <- paste0("t(28) = ", t.05 - .0001, ", p < .04") # approach computed p == .05 txt3 <- paste0("t(28) = ", t.06, ", p < .04") txt4 <- paste0("t(28) = ", t.04, ", p < .05") txt5a <- paste0("t(28) = ", t.05 + .0001, ", p < .0500") # approach computed p == .05 txt5b <- paste0("t(28) = ", t.05 - .0001, ", p < .0500") # approach computed p == .05 txt6 <- paste0("t(28) = ", t.06, ", p < .05") txt7 <- paste0("t(28) = ", t.04, ", p < .06") txt8a <- paste0("t(28) = ", t.05 + .0001, ", p < .06") # approach computed p == .05 txt8b <- paste0("t(28) = ", t.05 - .0001, ", p < .06") # approach computed p == .05 txt9 <- paste0("t(28) = ", t.06, ", p < .06") # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics exactly reported & p-value > ... test_that("cases where t = ..., p > ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) = ", t.04 + .001, ", p > .04") # approach computed p == .04 txt2a <- paste0("t(28) = ", t.05 + .0001, ", p > .04") # approach computed p == .05 txt2b <- paste0("t(28) = ", t.05 - .0001, ", p > .04") # approach computed p == .05 txt3 <- paste0("t(28) = ", t.06, ", p > .04") txt4 <- paste0("t(28) = ", t.04, ", p > .05") txt5a <- paste0("t(28) = ", t.05 + .0001, ", p > .05") # approach computed p == .05 txt5b <- paste0("t(28) = ", t.05 - .0001, ", p > .05") # approach computed p == .05 txt6 <- paste0("t(28) = ", t.06, ", p > .05") txt7 <- paste0("t(28) = ", t.04, ", p > .06") txt8a <- paste0("t(28) = ", t.05 + .0001, ", p > .06") # approach computed p == .05 txt8b <- paste0("t(28) = ", t.05 - .0001, ", p > .06") # approach computed p == .05 txt9 <- paste0("t(28) = ", t.06, ", p > .06") # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8a, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8b, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics < & p-value exactly reported test_that("cases where t < ..., p = ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) < ", t.04 - .001, ", p = .0400") # approach computed p == .04 txt2 <- paste0("t(28) < ", t.05 - .0001, ", p = .04") # approach computed p == .05 txt3 <- paste0("t(28) < ", t.06, ", p = .04") txt4 <- paste0("t(28) < ", t.04, ", p = .05") txt5 <- paste0("t(28) < ", t.05 - .001, ", p = .0500") # approach computed p == .05 txt6 <- paste0("t(28) < ", t.06, ", p = .05") txt7 <- paste0("t(28) < ", t.04, ", p = .06") txt8 <- paste0("t(28) < ", t.05 - .0001, ", p = .0600") # approach computed p == .05 txt9 <- paste0("t(28) < ", t.06 - .001, ", p = .0600") # approach computed p == .06 # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics < & p-value < test_that("cases where t < ..., p < ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) < ", t.04, ", p < .04") txt2 <- paste0("t(28) < ", t.05 - .0001, ", p < .04") # approach computed p == .05 txt3 <- paste0("t(28) < ", t.06, ", p < .04") txt4 <- paste0("t(28) < ", t.04, ", p < .05") txt5 <- paste0("t(28) < ", t.05 - .0001, ", p < .05") # approach computed p == .05 txt6 <- paste0("t(28) < ", t.06, ", p < .05") txt7 <- paste0("t(28) < ", t.04, ", p < .06") txt8 <- paste0("t(28) < ", t.05 - .0001, ", p < .06") # approach computed p == .05 txt9 <- paste0("t(28) < ", t.06, ", p < .06") # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics < & p-value > test_that("cases where t < ..., p > ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) < ", t.04, ", p > .04") txt2 <- paste0("t(28) < ", t.05 - .0001, ", p > .04") # approach computed p == .05 txt3 <- paste0("t(28) < ", t.06, ", p > .04") txt4 <- paste0("t(28) < ", t.04, ", p > .05") txt5 <- paste0("t(28) < ", t.05 - .0001, ", p > .05") # approach computed p == .05 txt6 <- paste0("t(28) < ", t.06, ", p > .05") txt7 <- paste0("t(28) < ", t.04, ", p > .06") txt8 <- paste0("t(28) < ", t.05 - .0001, ", p > .06") # approach computed p == .05 txt9 <- paste0("t(28) < ", t.06, ", p > .06") # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics > & p-value exactly reported test_that("cases where t > ..., p = ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) > ", t.04 + .001, ", p = .0400") # approach computed p == .04 txt2 <- paste0("t(28) > ", t.05 + .0001, ", p = .04") # approach computed p == .05 txt3 <- paste0("t(28) > ", t.06, ", p = .04") txt4 <- paste0("t(28) > ", t.04, ", p = .05") txt5 <- paste0("t(28) > ", t.05 + .001, ", p = .0500") # approach computed p == .05 txt6 <- paste0("t(28) > ", t.06, ", p = .05") txt7 <- paste0("t(28) > ", t.04, ", p = .06") txt8 <- paste0("t(28) > ", t.05 + .001, ", p = .0600") # approach computed p == .05 txt9 <- paste0("t(28) > ", t.06 + .001, ", p = .0600") # approach computed p == .06 # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics > & p-value < test_that("cases where t > ..., p < ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) > ", t.04 + .001, ", p < .0400") # approach computed p == .04 txt2 <- paste0("t(28) > ", t.05 + .0001, ", p < .04") # approach computed p == .05 txt3 <- paste0("t(28) > ", t.06, ", p < .04") txt4 <- paste0("t(28) > ", t.04, ", p < .05") txt5 <- paste0("t(28) > ", t.05 + .001, ", p < .0500") # approach computed p == .05 txt6 <- paste0("t(28) > ", t.06, ", p < .05") txt7 <- paste0("t(28) > ", t.04, ", p < .06") txt8 <- paste0("t(28) > ", t.05 + .001, ", p < .0600") # approach computed p == .05 txt9 <- paste0("t(28) > ", t.06 + .001, ", p < .0600") # approach computed p == .06 # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) # test statistics > & p-value > test_that("cases where t > ..., p > ... are correctly classified", { # assume alpha = .05 # calculate which t-values correspond to p-values of .04, .05, and .06 t.04 <- qt(.04/2, 28, lower.tail = FALSE) t.05 <- qt(.05/2, 28, lower.tail = FALSE) t.06 <- qt(.06/2, 28, lower.tail = FALSE) txt1 <- paste0("t(28) > ", t.04 + .001, ", p > .0400") # approach computed p == .04 txt2 <- paste0("t(28) > ", t.05 + .0001, ", p > .04") # approach computed p == .05 txt3 <- paste0("t(28) > ", t.06, ", p > .04") txt4 <- paste0("t(28) > ", t.04, ", p > .05") txt5 <- paste0("t(28) > ", t.05 + .001, ", p > .0500") # approach computed p == .05 txt6 <- paste0("t(28) > ", t.06, ", p > .05") txt7 <- paste0("t(28) > ", t.04, ", p > .06") txt8 <- paste0("t(28) > ", t.05 + .001, ", p > .0600") # approach computed p == .05 txt9 <- paste0("t(28) > ", t.06 + .001, ", p > .0600") # approach computed p == .06 # if pEqualSig == TRUE expect_false(statcheck(txt1, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE)[[VAR_DEC_ERROR]]) # if pEqualSig == FALSE expect_false(statcheck(txt1, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt2, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt3, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt4, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt5, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt6, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt7, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_true(statcheck(txt8, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) expect_false(statcheck(txt9, messages = FALSE, pEqualAlphaSig = FALSE)[[VAR_DEC_ERROR]]) }) statcheck/tests/testthat/test-extract-t-tests.R0000644000176200001440000001024314362504560021405 0ustar liggesuserscontext("Extract t-tests from string") # test if the following t-tests are correctly retrieved ---------------------- # standard t-test test_that("t-tests are correctly parsed", { txt1 <- "t(28) = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "t") expect_true(is.na(result[[VAR_DF1]])) expect_equal(result[[VAR_DF2]], 28) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], 2.2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "t(28) = 2.20, p = .03") }) # standard t-tests in text test_that("t-tests are retrieved from sentences", { txt1 <- "The effect was very significant, t(28) = 2.20, p = .03." txt2 <- "Both effects were very significant, t(28) = 2.20, p = .03, t(28) = 1.23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variation in spacing test_that("t-tests with different spacing are retrieved from text", { txt1 <- " t ( 28 ) = 2.20 , p = .03" txt2 <- "t(28)=2.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # variations test statistic test_that("variations in the t-statistic are retrieved from text", { txt1 <- "t(28) = -2.20, p = .03" txt2 <- "t(28) = 2,000.20, p = .03" txt3 <- "t(28) < 2.20, p = .03" txt4 <- "t(28) > 2.20, p = .03" txt5 <- "t(28) = %^&2.20, p = .03" # read as -2.20 result <- statcheck(c(txt1, txt2, txt3, txt4, txt5), messages = FALSE) expect_equal(nrow(result), 5) }) # variations p-value test_that("variations in the p-value are retrieved from text", { txt1 <- "t(28) = 2.20, p = 0.03" txt2 <- "t(28) = 2.20, p < .03" txt3 <- "t(28) = 2.20, p > .03" txt4 <- "t(28) = 2.20, ns" txt5 <- "t(28) = 2.20, p = .5e-3" result <- statcheck(c(txt1, txt2, txt3, txt4, txt5), messages = FALSE) expect_equal(nrow(result), 5) }) # corrected degrees of freedom test_that("corrected degrees of freedom in t-tests are retrieved from text", { txt1 <- "t(28.1) = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(result[[VAR_DF2]], 28.1) }) # test if the following incorrect t-tests are not retrieved ------------------ # no test found test_that("statcheck doesn't throw an error when input is missing", { expect_output(statcheck(NA, messages = FALSE), "did not find any results") }) # punctuation test_that("incorrect punctuation in t-tests are not retrieved from text", { txt1 <- "t(28) = 2.20; p = .03" txt2 <- "t[28] = 2.20, p = .03" txt3 <- "t(28) = .2.20, p = .03" expect_output(statcheck(c(txt1, txt2), messages = FALSE), "did not find any results") }) test_that("capital t's are not retrieved from text", { txt1 <- "T(28) = 2.20, p = .03" expect_output(statcheck(txt1, messages = FALSE), "did not find any results") }) # not a p-value test_that("tests with 'p-values' larger than 1 are not retrieved from text", { txt1 <- "t(28) = 2.20, p = 1.03" expect_output(statcheck(txt1, messages = FALSE), "did not find any results") }) # wrong df test_that("t-tests with 2 dfs are not retrieved from text", { txt1 <- "t(2,28) = 2.20, p = .03" expect_output(statcheck(txt1, messages = FALSE), "did not find any results") }) # weird encoding in minus sign followed by space test_that("t-values with a weird minus sign and a space do not result in errors", { txt1 <- " t(553) = − 4.46, p < .0001" # this is an em dash or something expect_output(statcheck(txt1, messages = FALSE), "did not find any results") }) # multiple comparison signs test_that("t-values with multiple comparison signs are not retrieved", { txt1 <- "t(38) >= 2.25, p = .03" txt2 <- "t(38) = 2.25, p >= .03" expect_output(statcheck(c(txt1, txt2), messages = FALSE), "did not find any results") }) statcheck/tests/testthat/test-APAfactor.R0000644000176200001440000000175014350273527020140 0ustar liggesuserscontext("Calculate the APA factor") test_that("correct APA factor is calculated", { txt1 <- "This text has 50% of its stats in APA style: t(28) = 2.20, p < .05, some other p = .035." txt2 <- "This text has 100% of its stats in APA style: t(28) = 2.20, p < .05." result1 <- statcheck(txt1, messages = FALSE) result2 <- statcheck(txt2, messages = FALSE) result12 <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(result1[[VAR_APAFACTOR]], .5) expect_equal(result2[[VAR_APAFACTOR]], 1) expect_equal(result12[[VAR_APAFACTOR]], c(.5, 1)) }) test_that("APA factor is calculated without problems if 1 source has no NHST", { txt1 <- "This text has 50% of its stats in APA style: t(28) = 2.20, p < .05, some other p = .035." txt2 <- "This text has 0% of its stats in APA style: p < .05." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(result[[VAR_APAFACTOR]], .5) expect_equal(nrow(result), 1) }) statcheck/tests/testthat/test-extract-chi2-tests.R0000644000176200001440000000410214350273527021767 0ustar liggesuserscontext("Extract chi2-tests from string") # test if the following chi2-tests are correctly retrieved ---------------------- # standard chi2-test test_that("chi2-tests are correctly parsed", { txt1 <- "chi2(28) = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "Chi2") expect_equal(result[[VAR_DF1]], 28) expect_true(is.na(result[[VAR_DF2]])) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], 2.2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "i2(28) = 2.20, p = .03") }) # standard chi2-tests in text test_that("chi2-tests are retrieved from sentences", { txt1 <- "The effect was very significant, chi2(28) = 2.20, p = .03." txt2 <- "Both effects were very significant, chi2(28) = 2.20, p = .03, chi2(28) = 1.23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variations in extracted "chi" test_that("variations in spelling the Greek letter chi are picked up", { txt1 <- "X2(28) = 2.20, p = .03" txt2 <- "x2(28) = 2.20, p = .03" txt3 <- "chi_2(28) = 2.20, p = .03" result <- statcheck(c(txt1, txt2, txt3), messages = FALSE) expect_equal(nrow(result), 3) }) # variation in degrees of freedom test_that("different variations in df of chi2 are parsed correctly", { txt1 <- "chi2(28, N = 129) = 2.2, p = .03" txt2 <- "chi2(1, N = 11,455) = 16.78, p <.001" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # variation in spacing test_that("chi2-tests with different spacing are retrieved from text", { txt1 <- " chi2 ( 28 ) = 2.20 , p = .03" txt2 <- "chi2(28)=2.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) statcheck/tests/testthat/test-compute-pvalues.R0000644000176200001440000000324514350273527021472 0ustar liggesuserscontext("Correctly recalculate p-values") test_that("p-values for t-tests are correctly calculated", { txt <- "t(28) = 2.20, p = .03" computed <- pt(-1 * abs(2.20), 28) * 2 result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) test_that("p-values for F-tests are correctly calculated", { txt <- "F(2, 28) = 2.20, p = .15" computed <- pf(2.20, 2, 28, lower.tail = FALSE) result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) test_that("p-values for correlations are correctly calculated", { txt <- "r(28) = .22, p = .26" pComputed <- pmin(pt(-1 * abs(r2t(.22, 28)), 28) * 2, 1) pComputed[is.nan(pComputed)] <- NA computed <- pComputed result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) test_that("p-values for z-tests are correctly calculated", { txt <- " z = 2.20, p = .04" computed <- pnorm(abs(2.20), lower.tail = FALSE) * 2 result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) test_that("p-values for chi2-tests are correctly calculated", { txt <- "chi2(28) = 22.20, p = .79" computed <- pchisq(22.20, 28, lower.tail = FALSE) result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) test_that("p-values for Q-tests are correctly calculated", { txt <- "Q(28) = 22.20, p = .79" computed <- pchisq(22.20, 28, lower.tail = FALSE) result <- statcheck(txt, messages = FALSE) expect_equal(result[[VAR_COMPUTED_P]], computed) }) statcheck/tests/testthat/test-extract-F-tests.R0000644000176200001440000000356114350273527021337 0ustar liggesuserscontext("Extract F-tests from string") # test if the following F-tests are correctly retrieved ---------------------- # standard F-test test_that("F-tests are correctly parsed", { txt1 <- "F(2, 28) = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "F") expect_equal(result[[VAR_DF1]], 2) expect_equal(result[[VAR_DF2]], 28) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], 2.2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "F(2, 28) = 2.20, p = .03") }) # standard F-tests in text test_that("F-tests are retrieved from sentences", { txt1 <- "The effect was very significant, F(2, 28) = 2.20, p = .03." txt2 <- "Both effects were very significant, F(2, 28) = 2.20, p = .03, F(2, 28) = 1.23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variation in spacing test_that("F-tests with different spacing are retrieved from text", { txt1 <- " F ( 2 , 28 ) = 2.20 , p = .03" txt2 <- "F(2,28)=2.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # variations in the degrees of freedom test_that("corrected degrees of freedom in F-tests are retrieved from text", { txt1 <- "F(2.1, 28.1) = 2.20, p = .03" txt2 <- "F(l, 76) = 23.95, p <.001" # this wrong notation happens occasionally in articles result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) expect_equal(result[[VAR_DF1]], c(2.1, 1)) expect_equal(result[[VAR_DF2]], c(28.1, 76)) }) statcheck/tests/testthat/test-error.R0000644000176200001440000002135314362210351017457 0ustar liggesuserscontext("check if inconsistencies/errors are correctly classified") # test if the following cases are correctly identified as errors -------------- # check classification of regular errors in all types of tests test_that("simple errors are classified as such", { txt1 <- "t(28) = 2.20, p = .03" txt2 <- "F(2, 28) = 2.20, p = .15" txt3 <- "r(28) = .22, p = .26" txt4 <- "chi2(28) = 22.20, p = .79" txt5 <- " z = 2.20, p = .04" txt6 <- "Q(28) = 22.20, p = .79" expect_true(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt4, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_ERROR]]) }) # classify p-values of negative test statistics correctly test_that("p-values of negative tests are correctly classified", { txt1 <- " Z = -2.42, p = 0.016" # no error txt2 <- "t(28) = -2.20, p = .03" # error expect_false(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) }) # classify inexactly reported p-values correctly test_that("inexactly reported p-values are correctly classified",{ txt1 <- "t(28) = 2.20, ns" txt2 <- "t(28) = 2.20, p > .05" txt3 <- "t(28) = 2.0, p < .05" expect_true(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) }) # also classify decision errors as errors test_that("decision errors are also classified as errors",{ txt1 <- "t(28) = 1.20, p = .03" txt2 <- "t(28) = 2.20, p = .30" expect_true(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) }) # test if the following cases are correctly identified as correct ------------- # correct rounding test_that("correctly rounded p-values are not considered errors", { txt1 <- "t(28) = 2, p = .02" txt2 <- "t(28) = 2, p = .14" txt3 <- "t(28) = 2.2, p = .03" # rounded lower bound p-value txt4 <- "t(28) = 2.2, p = .04" txt5 <- "t(28) = 2.20, p = .036" txt6 <- "t(28) = 2.20, p = .037" expect_false(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt6, messages = FALSE)[[VAR_ERROR]]) }) # test if different arguments concerning errors work -------------------------- # OneTailedTests: assume all tests are one-tailed test_that("OneTailedTests considers everything as one-tailed", { txt1 <- "t(28) = 2.20, p = .02" txt2 <- "t(28) = 2.20, p = .04" txt3 <- "this test is one-tailed: t(28) = 2.20, p = .02, but this one is not: t(28) = 2.20, p = .04" expect_false(statcheck(txt1, messages = FALSE, OneTailedTests = TRUE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, OneTailedTests = TRUE)[[VAR_ERROR]]) expect_equal(statcheck(txt3, messages = FALSE, OneTailedTests = TRUE)[[VAR_ERROR]], c(FALSE, TRUE)) }) # OneTailedTxt: automated detection of one-tailed test in text test_that("automated one-tailed test detection works", { txt1 <- "t(28) = 2.20, p = .018" txt2 <- "t(28) = 2.20, p = .01, one-tailed" txt3 <- "t(28) = 2.20, p = .018, one-tailed" txt4 <- "t(28) = 2.20, p = .018, one-sided" txt5 <- "t(28) = 2.20, p = .018, directional" # don't correct for one-tailed testing here expect_true(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt1, messages = FALSE, OneTailedTxt = TRUE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, OneTailedTxt = TRUE)[[VAR_ERROR]]) expect_true(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) # correct for one-tailed testing here expect_false(statcheck(txt3, messages = FALSE, OneTailedTxt = TRUE)[[VAR_ERROR]]) expect_false(statcheck(txt4, messages = FALSE, OneTailedTxt = TRUE)[[VAR_ERROR]]) expect_false(statcheck(txt5, messages = FALSE, OneTailedTxt = TRUE)[[VAR_ERROR]]) # check that p-values were corrected in these cases p_1tail <- pt(2.20, 28, lower.tail = FALSE) expect_equal(statcheck(c(txt3, txt4, txt5), messages = FALSE, OneTailedTxt = TRUE)[[VAR_COMPUTED_P]], rep(p_1tail, 3)) }) # pZeroError: check if p = .000 is counted as an inconsistency or not test_that("you can adapt whether p = .000 is counted as inconsistent or not", { txt1 <- "t(28) = 22.20, p = .000" txt2 <- "t(28) = 22.20, p < .000" # this is always an Error expect_true(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt1, messages = FALSE, pZeroError = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt2, messages = FALSE, pZeroError = FALSE)[[VAR_ERROR]]) }) # test classifications of (in)exact test statistcs and (in)exact p-values ---- # test statistics exactly reported test_that("cases where t = ... are correctly classified", { # calculate range of correct p-values lowp <- pt(2.25, 28, lower.tail = FALSE)*2 upp <- pt(2.15, 28, lower.tail = FALSE)*2 # correct txt1 <- "t(28) = 2.2, p = .036" # correct txt2 <- "t(28) = 2.2, p < .08" # correct txt3 <- "t(28) = 2.2, p > .02" # correct # error txt4 <- paste("t(28) = 2.2, p >", upp) # error txt5 <- paste("t(28) = 2.2, p <", lowp) # error txt6 <- "t(28) = 2.2, p = .08" # error txt7 <- "t(28) = 2.2, p = .02" # error txt8 <- "t(28) = 2.2, p > .08" # error txt9 <- "t(28) = 2.2, p < .02" # error expect_false(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt4, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt5, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt9, messages = FALSE)[[VAR_ERROR]]) }) # test statistic reported as < test_that("cases where t < ... are correctly classified", { # calculate range of correct p-values lowp <- pt(2.25, 28, lower.tail = FALSE)*2 upp <- pt(2.15, 28, lower.tail = FALSE)*2 # correct txt1 <- paste("t(28) < 2.20, p >", upp) txt2 <- "t(28) < 2.2, p = .08" txt3 <- "t(28) < 2.2, p > .08" txt4 <- "t(28) < 2.2, p < .08" txt5 <- "t(28) < 2.2, p > .02" # error txt6 <- paste("t(28) < 2.2, p =", lowp) txt7 <- paste("t(28) < 2.2, p <", lowp) txt8 <- "t(28) < 2.2, p < .02" txt9 <- "t(28) < 2.2, p = .02" expect_false(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt9, messages = FALSE)[[VAR_ERROR]]) }) # test statistic reported as > test_that("cases where t > ... are correctly classified", { # calculate range of correct p-values lowp <- pt(2.25, 28, lower.tail = FALSE)*2 upp <- pt(2.15, 28, lower.tail = FALSE)*2 # correct txt1 <- paste("t(28) > 2.20, p <", upp) txt2 <- "t(28) > 2.2, p = .02" txt3 <- "t(28) > 2.2, p > .02" txt4 <- "t(28) > 2.2, p < .02" txt5 <- "t(28) > 2.2, p < .08" # error txt6 <- paste("t(28) > 2.2, p =", upp) txt7 <- paste("t(28) > 2.2, p >", upp) txt8 <- "t(28) > 2.2, p > .08" txt9 <- "t(28) > 2.2, p = .08" expect_false(statcheck(txt1, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt2, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt3, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt4, messages = FALSE)[[VAR_ERROR]]) expect_false(statcheck(txt5, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt6, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt7, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt8, messages = FALSE)[[VAR_ERROR]]) expect_true(statcheck(txt9, messages = FALSE)[[VAR_ERROR]]) }) statcheck/tests/testthat/test-file-to-txt.R0000644000176200001440000001043414362533741020513 0ustar liggesuserscontext("Check if statistics from an article are correctly retrieved and parsed") # tests concerning parsing stats from pdf files ------------------------------ # individual pdf files test_that("statistics from a pdf are correctly retrieved and parsed", { pdf_file <- system.file("test_materials/nuijten.pdf", package = "statcheck") # skip test if file is not available if(pdf_file == "") skip("Test file not available.") result <- checkPDF(pdf_file, messages = FALSE) result_1tailed <- checkPDF(pdf_file, messages = FALSE, OneTailedTxt = TRUE) # extract 4 tests from paper expect_equal(nrow(result), 8) expect_equal(as.character(result[[VAR_TYPE]]), c("t", "Chi2", "t", "F", "F", "F", "Chi2", "t")) expect_equal(result[[VAR_TEST_VALUE]], c(-4.93, 6.9, 2, 1.203, 12.03, 23.95, 6.53, 2)) # check errors expect_equal(result[[VAR_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE)) expect_equal(result[[VAR_DEC_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE)) # check errors with one-tailed test detection expect_equal(result_1tailed[[VAR_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)) expect_equal(result_1tailed[[VAR_DEC_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)) }) # pdfs in folder test_that("statistics from all pdfs in a folder are correctly retrieved and parsed", { pdf_folder <- system.file("test_materials", package = "statcheck") # skip test if files are not available if(!any(grepl(".pdf", list.files(pdf_folder)))) skip("Test files not available.") result <- checkPDFdir(pdf_folder, messages = FALSE, subdir = FALSE) # extract 53 tests from 4 papers expect_equal(nrow(result), 53) expect_equal(length(unique(result[[VAR_SOURCE]])), 4) }) # tests concerning parsing stats from html files ------------------------------ # individual html files test_that("statistics from a html are correctly retrieved and parsed", { html_file <- system.file("test_materials/nuijten.html", package = "statcheck") # skip test if file is not available if(html_file == "") skip("Test file not available.") result <- checkHTML(html_file, messages = FALSE) result_1tailed <- checkHTML(html_file, messages = FALSE, OneTailedTxt = TRUE) # extract 6 tests from paper expect_equal(nrow(result), 6) expect_equal(as.character(result[[VAR_TYPE]]), c("t", "Chi2", "t", "F", "F", "t")) expect_equal(result[[VAR_TEST_VALUE]], c(-4.93, 6.9, 2, 1.203, 12.03, 2)) # check errors expect_equal(result[[VAR_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)) expect_equal(result[[VAR_DEC_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE)) # check errors with one-tailed test detection expect_equal(result_1tailed[[VAR_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)) expect_equal(result_1tailed[[VAR_DEC_ERROR]], c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)) }) # htmls in folder test_that("statistics from all htmls in a folder are correctly retrieved and parsed", { html_dir <- system.file("test_materials", package = "statcheck") # skip test if files are not available if(!any(grepl(".htm*", list.files(html_dir)))) skip("Test files not available.") result <- checkHTMLdir(html_dir, messages = FALSE, subdir = FALSE) # extract 6+33 tests from papers expect_equal(nrow(result), 39) }) # tests concerning parsing stats from all files ------------------------------ # pdfs and htmls in folder test_that("statistics from all pdfs and htmls in a folder are correctly retrieved and parsed", { dir <- system.file("test_materials", package = "statcheck") # skip test if files are not available if(!any(grepl(".htm*|.pdf", list.files(dir)))) skip("Test files not available.") result <- checkdir(dir, subdir = FALSE, messages = FALSE) # extract 92 tests (39 from html and 53 from pdf) expect_equal(nrow(result), 92) }) statcheck/tests/testthat/test-S3-methods.R0000644000176200001440000000313014362533741020260 0ustar liggesuserscontext("Summarize statcheck output") # Note: so far I haven't found a straightforward way to test plot.statcheck() # and identify.statcheck() # test summary.statcheck() ----------------------------------------------------- test_that("summary.statcheck() works for a single source", { txt1 <- "t(28) = 2.20, p = .06" txt2 <- "F(2, 28) = 2.20, p = .15" txt3 <- "r(28) = .22, p = .26" txt4 <- "chi2(28) = 22.20, p = .77" txt5 <- " z = 2.20, p = .04" txt6 <- "Q(28) = 22.20, p = .03" txt <- paste(txt1, txt2, txt3, txt4, txt5, txt6) result <- statcheck(txt, messages = FALSE) summary <- summary(result) expect_equal(nrow(summary), 2) expect_equal(as.vector(summary[[VAR_SOURCE]]), c("01", "Total")) expect_equal(summary[[VAR_NR_PVALUES]], c(6, 6)) expect_equal(summary[[VAR_NR_ERRORS]], c(5, 5)) expect_equal(summary[[VAR_NR_DEC_ERRORS]], c(2, 2)) }) test_that("summary.statcheck() works for multiple sources", { txt1 <- "t(28) = 2.20, p = .06" txt2 <- "F(2, 28) = 2.20, p = .15" txt3 <- "r(28) = .22, p = .26" txt4 <- "chi2(28) = 22.20, p = .77" txt5 <- " z = 2.20, p = .04" txt6 <- "Q(28) = 22.20, p = .03" result <- statcheck(c(txt1, txt2, txt3, txt4, txt5, txt6), messages = FALSE) summary <- summary(result) expect_equal(nrow(summary), 7) expect_equal(as.vector(summary[[VAR_SOURCE]]), c(as.character(1:6), "Total")) expect_equal(summary[[VAR_NR_PVALUES]], c(rep(1, 6), 6)) expect_equal(summary[[VAR_NR_ERRORS]], c(1,1,1,0,1,1,5)) expect_equal(summary[[VAR_NR_DEC_ERRORS]], c(1,0,0,0,0,1,2)) }) statcheck/tests/testthat/test-extract-Q-tests.R0000644000176200001440000000447714350273527021361 0ustar liggesuserscontext("Extract Q-tests from string") # test if the following Q-tests are correctly retrieved ---------------------- # standard Q-tests test_that("Q-tests are correctly parsed", { txt1 <- "Q(2) = 2.20, p = .03" result <- statcheck(txt1, messages = FALSE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_TYPE]]), "Q") expect_equal(result[[VAR_DF1]], 2) expect_true(is.na(result[[VAR_DF2]])) expect_equal(as.character(result[[VAR_TEST_COMPARISON]]), "=") expect_equal(result[[VAR_TEST_VALUE]], 2.2) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "=") expect_equal(result[[VAR_REPORTED_P]], 0.03) expect_equal(as.character(result[[VAR_RAW]]), "Q(2) = 2.20, p = .03") }) # standard Q-tests in text test_that("Q-tests are retrieved from sentences", { txt1 <- "The effect was very significant, Q(2) = 2.20, p = .03." txt2 <- "Both effects were very significant, Q(2) = 2.20, p = .03, Q(2) = 1.23, p = .04." result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_SOURCE]]), c("1", "2", "2")) }) # variation in spacing test_that("Q-tests with different spacing are retrieved from text", { txt1 <- " Q ( 2 ) = 2.20 , p = .03" txt2 <- "Q(2)=2.20,p=.03" result <- statcheck(c(txt1, txt2), messages = FALSE) expect_equal(nrow(result), 2) }) # different types of Q-tests test_that("different types of Q-tests are correctly parsed", { txt1 <- "Qw(2) = 2.20, p = .03" txt2 <- "Qwithin(2) = 2.20, p = .03" txt3 <- "Q-within(2) = 2.20, p = .03" txt4 <- "Qb(2) = 2.20, p = .03" txt5 <- "Qbetween(2) = 2.20, p = .03" txt6 <- "Q-between(2) = 2.20, p = .03" result <- statcheck(c(txt1, txt2, txt3, txt4, txt5, txt6), messages = FALSE) expect_equal(nrow(result), 6) expect_equal(as.vector(result[[VAR_TYPE]]), c(rep("Qw", 3), rep("Qb", 3))) }) # test if the following 'incorrect' Q-tests are not retrieved ---------------- test_that("stats that only look like Q-tests are not retrieved", { # txt1 <- "q(2) = 2.2, p = .03" # lower case q is a different test txt2 <- "Qs(2) = 2.2, p = .03" txt3 <- "Qb(2, N = 187) = 2.20, p = .03" expect_output(statcheck(c(txt2, txt3), messages = FALSE), "did not find any results") }) statcheck/tests/testthat/test-extract-pvalues.R0000644000176200001440000000230714350273527021466 0ustar liggesuserscontext("Extract p-values from string") # test if the following p-values are correctly retrieved ---------------------- # standard p-values test_that("p-values are correctly parsed", { txt1 <- "p = .05" txt2 <- "p < .05" txt3 <- "p > .05" result <- statcheck(c(txt1, txt2, txt3), messages = FALSE, AllPValues = TRUE) expect_equal(nrow(result), 3) expect_equal(as.character(result[[VAR_P_COMPARISON]]), c("=", "<", ">")) expect_equal(result[[VAR_REPORTED_P]], rep(0.05, 3)) }) # non-significant results test_that("results reported as ns are correctly parsed", { txt1 <- "the result was not significant, ns" result <- statcheck(txt1, messages = FALSE, AllPValues = TRUE) expect_equal(nrow(result), 1) expect_equal(as.character(result[[VAR_P_COMPARISON]]), "ns") expect_true(is.na(result[[VAR_REPORTED_P]])) }) # test if the following non p-values are not retrieved ------------------ # page number test_that("page numbers are not extracted", { txt1 <- "see p. 01" expect_output(statcheck(txt1, messages = FALSE, AllPValues = TRUE), "did not find any p-values") }) statcheck/tests/testthat.R0000644000176200001440000000010214350273527015351 0ustar liggesuserslibrary(testthat) library(statcheck) test_check("statcheck") statcheck/R/0000755000176200001440000000000014362536723012437 5ustar liggesusersstatcheck/R/checkdir.R0000644000176200001440000000234514350273527014337 0ustar liggesusers#' @rdname checkdirs #' @export checkdir <- function(dir, subdir = TRUE, ...) { if (missing(dir)) dir <- tcltk::tk_choose.dir() pdfs <- any(grepl("\\.pdf$", list.files(dir, recursive = subdir), ignore.case = TRUE)) htmls <- any(grepl( "\\.html?$", list.files(dir, recursive = subdir), ignore.case = TRUE )) if (pdfs) pdfres <- checkPDFdir(dir, subdir, ...) if (htmls) htmlres <- checkHTMLdir(dir, subdir, ...) if (pdfs & htmls) { if (!is.null(pdfres) & !is.null(htmlres)) Res <- rbind(pdfres, htmlres) else stop("statcheck did not find any results") } else if (pdfs & !htmls) { if (!is.null(pdfres)) Res <- pdfres else stop("statcheck did not find any results") } else if (!pdfs & htmls) { if (!is.null(htmlres)) Res <- htmlres else stop("statcheck did not find any results") } else if (!pdfs & !htmls) stop("No PDF or HTML found") class(Res) <- c("statcheck", "data.frame") return(Res) }statcheck/R/regex.R0000644000176200001440000000716114362210351013663 0ustar liggesusers# this script contains the regular expressions that statcheck uses to extract # NHST results from text # test types RGX_T <- "t" RGX_R <- "r" RGX_Q <- "Q\\s?-?\\s?(w|W|(w|W)ithin|b|B|(b|B)etween)?" RGX_F <- "F" RGX_CHI2 <- "((\\[CHI\\]|\\[DELTA\\]G)\\s?|(\\s[^trFzZQWnD ]\\s?)|([^trFzZQWnD ]2\\s?))2?" RGX_Z <- "([^a-z](z|Z))" # degrees of freedom # the way dfs are reported differs per test type, except for t, r, and Q, where # they are always in the format "(28)". The regex for these tests can therefore # be combined # z-tests do not have dfs RGX_DF_T_R_Q <- "\\(\\s?\\d*\\.?\\d+\\s?\\)" RGX_DF_F <- "\\(\\s?\\d*\\.?(I|l|\\d+)\\s?,\\s?\\d*\\.?\\d+\\s?\\)" RGX_DF_CHI2 <- "\\(\\s?\\d*\\.?\\d+\\s?(,\\s?N\\s?\\=\\s?\\d*\\,?\\d*\\,?\\d+\\s?)?\\)" # combine test types with the correct type of df # put regex between () to create regex groups RGX_T_DF <- paste0("(", RGX_T, "\\s?", RGX_DF_T_R_Q, ")") RGX_R_DF <- paste0("(", RGX_R, "\\s?", RGX_DF_T_R_Q, ")") RGX_Q_DF <- paste0("(", RGX_Q, "\\s?", RGX_DF_T_R_Q, ")") RGX_F_DF <- paste0("(", RGX_F, "\\s?", RGX_DF_F, ")") RGX_CHI2_DF <- paste0("(", RGX_CHI2, "\\s?", RGX_DF_CHI2, ")") RGX_TEST_DF <- paste0("(", RGX_T_DF, "|", RGX_R_DF, "|", RGX_Q_DF, "|", RGX_F_DF, "|", RGX_CHI2_DF, "|", RGX_Z, ")") # test value # this is the same for every type of test # the part "[^a-zA-Z\\d\\.]{0,3}" is to extract punctuation marks that could # signal a weirdly encoded minus sign # note that impossible values such as r > 1 are excluded at a later stage RGX_TEST_VALUE <- "[<>=]\\s?[^a-zA-Z\\d\\.]{0,3}\\s?\\d*,?\\d*\\.?\\d+\\s?," # p-values # this is the same for every type of test RGX_NS <- "([^a-z]n\\.?s\\.?)" RGX_P <- "(p\\s?[<>=]\\s?\\d?\\.\\d+e?-?\\d*)" RGX_P_NS <- paste0("(", RGX_NS, "|", RGX_P, ")") # full result RGX_NHST <- paste(RGX_TEST_DF, RGX_TEST_VALUE, RGX_P_NS, sep = "\\s?") ################################################################################ # regex to recognize test type # match everything up until the first occurence of a "(" with a positive look # ahead. A "(" signals the start of the degrees of freedom, so everything before # that should be the test statistic. Also match the regex for a z-test # (because a z-test has no df) RGX_OPEN_BRACKET <- "(.+?(?=\\())" RGX_TEST_TYPE <- paste(RGX_Z, RGX_OPEN_BRACKET, sep = "|") # regex for Q-test # for the Q-test, we also need to distinguish between Q, Qw, and Qb # select all raw_nhst results that seem to have a Q-test in them # it suffices to simply search for the letters "w" and "b" RGX_QW <- "w" RGX_QB <- "b" # regex for degrees of freedom # combine the separate regexes for the different types of dfs # in one all-encompassing regex. Group the df-types with parentheses and # separate with an OR sign RGX_DF <- paste0("(", RGX_DF_T_R_Q, ")|(", RGX_DF_F, ")|(", RGX_DF_CHI2, ")") # regex for comparison symbols RGX_COMP <- "[<>=]" # regex for thousands separator # this regex matches commas flanked by digits on both sides RGX_1000_SEP <- "(?<=\\d),(?=\\d+)" # regex for numbers after a point # used to determine number of decimals RGX_DEC <- "\\.\\d+" # regex for weird symbols that should be a minus sign # match potentially a space, followed by one or more characters that are not a # digit, period, or space, followed by a digit or period (using a positive # lookahead) RGX_WEIRD_MINUS <- "\\s?[^\\d\\.\\s]+(?=\\d|\\.)" # regex for weird df1 in F-tests # for some reason, typesetting in articles sometimes goes wrong with # F-tests and when df1 == 1, it gets typeset as the letter l or I RGX_DF1_I_L <- "I|l" statcheck/R/error_test.R0000644000176200001440000000612214362210351014735 0ustar liggesuserserror_test <- function(reported_p, test_type, test_stat, df1, df2, p_comparison, test_comparison, p_dec, test_dec, two_tailed, alpha, pZeroError) { # replace 'ns' for > alpha ----------------------------------------------- reported_p[p_comparison == "ns"] <- alpha p_comparison[p_comparison == "ns"] <- ">" # compute p-values ------------------------------------------------------- # take into account that the reported test statistic may have been rounded # to that end, compute the upper and lower bound of the test statistic # based on the number of decimals that it was reported with. E.g., # a t-value of 2.0 could have been rounded from anywhere between 1.95-2.05. if(test_stat >= 0){ low_stat <- test_stat - (.5 / 10 ^ test_dec) up_stat <- test_stat + (.5 / 10 ^ test_dec) # switch around for negative test statistics } else if (test_stat < 0){ low_stat <- test_stat + (.5 / 10 ^ test_dec) up_stat <- test_stat - (.5 / 10 ^ test_dec) } # Compute the p-values that belong to the upper and lower bound of the test # statistic. This is the range of p-values that would be correct. up_p <- compute_p(test_type = test_type, test_stat = low_stat, df1 = df1, df2 = df2, two_tailed = two_tailed) low_p <- compute_p(test_type = test_type, test_stat = up_stat, df1 = df1, df2 = df2, two_tailed = two_tailed) # p values smaller or equal to zero are errors --------------------------- if(pZeroError == TRUE & reported_p <= 0){ error <- TRUE return(error) } # check errors for different combinations of <>= ------------------------- if(test_comparison == "="){ if(p_comparison == "="){ error <- reported_p > round(up_p, p_dec) | reported_p < round(low_p, p_dec) return(error) } else if(p_comparison == "<"){ error <- reported_p < low_p return(error) } else if(p_comparison == ">"){ error <- reported_p > up_p return(error) } } else if(test_comparison == "<"){ if(p_comparison == "="){ error <- reported_p < round(up_p, p_dec) return(error) } else if(p_comparison == "<"){ error <- reported_p < up_p return(error) } else if(p_comparison == ">"){ error <- FALSE return(error) } } else if(test_comparison == ">"){ if(p_comparison == "="){ error <- reported_p > round(low_p, p_dec) return(error) } else if(p_comparison == "<"){ error <- FALSE return(error) } else if(p_comparison == ">"){ error <- reported_p > low_p return(error) } } return(NA) } statcheck/R/statcheckReport.R0000644000176200001440000000551014350273527015725 0ustar liggesusers#' Generate HTML report for statcheck output #' #' This function uses R Markdown to generate a nicely formatted HTML report of #' \code{\link{statcheck}} output. #' #' This function temporarily saves the inserted \code{statcheck} output as an #' .RData file in the "output" folder in the statcheck package directory. This #' file is then called by the .Rmd template that is saved in the folder "rmd", #' also in the statcheck package directory. After the HTML report is generated, #' the .RData file is removed again. #' #' @param statcheckOutput statcheck output of one of the following functions: #' \code{\link{statcheck}}, \code{\link{checkPDFdir}}, \code{\link{checkPDF}}, #' \code{\link{checkHTMLdir}}, \code{\link{checkHTML}}, or #' \code{\link{checkdir}}. #' @param outputFileName String specifying the file name under which you want to #' save the generated HTML report. The extension ".html" is automatically added, #' so doesn't need to be specified in this argument. #' @param outputDir String specifying the directory in which you want to save #' the generated HTML report. #' #' @return An HTML report, saved in the directory specified in the argument #' "outputDir". #' #' @examples \dontrun{ #' #' # first generate statcheck output, for instance by using the statcheck() #' function #' #' txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" #' stat <- statcheck(txt) #' #' # next, use this output to generate a nice HTML report of the results #' statcheckReport(stat, outputFileName="statcheckHTMLReport", #' outputDir="C:/mydocuments/results") #' #' # you can now find your HTML report in the folder #' # "C:/mydocuments/results" under the name "statcheckHTMLReport.html". #' #' } #' #' @export statcheckReport <- function(statcheckOutput, outputFileName, outputDir) { # set working directory to output file in statcheck package library currentWD <- getwd() setwd(system.file("inst/rmd", package = "statcheck")) # temporarily save statcheck output as RData in the selected working directory save(statcheckOutput, file = "statcheckOutput.RData") # run the markdown/knitr script statcheckReport_template <- system.file("rmd/statcheckReport_template.Rmd", package = "statcheck") rmarkdown::render(statcheckReport_template) # save/move the file in/to the specified output directory curDir <- system.file("rmd", package = "statcheck") file.rename( from = paste(curDir, "statcheckReport_template.html", sep = "/"), to = paste(outputDir, "/", outputFileName, ".html", sep = "") ) # remove .RData file from package library folder file.remove(paste(curDir, "statcheckOutput.RData", sep = "/")) setwd(currentWD) }statcheck/R/doc-checkfiles.R0000644000176200001440000000075614350273527015432 0ustar liggesusers#' Extract statistics from PDF/HTML articles and recalculate p-values #' #' These functions search for NHST results in PDF and/or HTML articles and send #' the extracted statistics to \code{statcheck}. #' #' @param files Vector of strings containing file paths to HTML files to check. #' @param ... Arguments sent to \code{statcheck}. #' #' @name checkfiles #' #' @return A statcheck data frame with the extracted statistics. See #' \code{\link{statcheck}} for details. NULLstatcheck/R/file-to-txt.R0000644000176200001440000000766014362210351014731 0ustar liggesusers# HTML TO TXT ------------------------------------------------------------------ getHTML <- function(x){ strings <- lapply(x, function(fileName){ con <- file(fileName) on.exit(close(con)) raw_strings <- readChar(con, file.info(fileName)$size, useBytes = TRUE) return(raw_strings) }) # Remove subscripts (except for p_rep) strings <- lapply(strings, gsub, pattern = "(?!rep).*?", replacement = "", perl = TRUE) # Remove HTML tags: strings <- lapply(strings, gsub, pattern = "<(.|\n)*?>", replacement = "") # Replace html codes: # from: https://dev.w3.org/html5/html-author/charref strings <- lapply(strings, gsub, pattern = "<", replacement = "<", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "<", replacement = "<", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "<", replacement = "<", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "<", replacement = "<", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "<", replacement = "<", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "=", replacement = "=", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "=", replacement = "=", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "=", replacement = "=", fixed = TRUE) strings <- lapply(strings, gsub, pattern = ">", replacement = ">", fixed = TRUE) strings <- lapply(strings, gsub, pattern = ">", replacement = ">", fixed = TRUE) strings <- lapply(strings, gsub, pattern = ">", replacement = ">", fixed = TRUE) strings <- lapply(strings, gsub, pattern = ">", replacement = ">", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "(", replacement = "(", fixed = TRUE) strings <- lapply(strings, gsub, pattern = ")", replacement = ")", fixed = TRUE) strings <- lapply(strings, gsub, pattern = " ", replacement = " ", fixed = TRUE) strings <- lapply(strings, gsub, pattern = " ", replacement = " ", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "\n", replacement = "") strings <- lapply(strings, gsub, pattern = "\r", replacement = "") strings <- lapply(strings, gsub, pattern = "\\s+", replacement = " ") strings <- lapply(strings, gsub, pattern = "−", replacement = "-", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "−", replacement = "-", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "−", replacement = "-", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "Χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "Χ", replacement = "X", fixed = TRUE) strings <- lapply(strings, gsub, pattern = "Χ", replacement = "X", fixed = TRUE) return(strings) } # PDF TO TXT ------------------------------------------------------------------- getPDF <- function(x){ txtfiles <- character(length(x)) for (i in 1:length(x)){ system(paste('pdftotext -q -enc "ASCII7" "', x[i], '"', sep = "")) if (file.exists(gsub("\\.pdf$", "\\.txt", x[i]))) { fileName <- gsub("\\.pdf$", "\\.txt", x[i]) strings <- readChar(fileName, file.info(fileName)$size) # remove carriage returns and new lines strings <- gsub(x = strings, pattern = "[\r\n]", replacement = "") # save result in vector txtfiles[i] <- strings } else{ warning(paste("Failure in file", x[i])) txtfiles[i] <- "" } } return(txtfiles) } statcheck/R/checkHTML.R0000644000176200001440000000042014362533741014315 0ustar liggesusers#' @rdname checkfiles #' @export checkHTML <- function(files, ...) { if (missing(files)) files <- tcltk::tk_choose.files() txts <- sapply(files, getHTML) names(txts) <- basename(files) return(statcheck(txts, ...)) } statcheck/R/checkPDFdir.R0000644000176200001440000000147414362533741014673 0ustar liggesusers#' @rdname checkdirs #' @export checkPDFdir <- function(dir, subdir = TRUE, ...) { if (missing(dir)) dir <- tcltk::tk_choose.dir() all.files <- list.files(dir, pattern = "\\.pdf", full.names = TRUE, recursive = subdir) files <- all.files[grepl("\\.pdf$", all.files)] if (length(files) == 0) stop("No PDF found") txts <- character(length(files)) message("Importing PDF files...") pb <- utils::txtProgressBar(max = length(files), style = 3) for (i in 1:length(files)){ txts[i] <- getPDF(files[i]) utils::setTxtProgressBar(pb, i) } close(pb) names(txts) <- basename(files) return(statcheck(txts, ...)) } statcheck/R/doc-checkdirs.R0000644000176200001440000000145314350273527015264 0ustar liggesusers#' Extract statistics from folders with PDF/HTML articles and recalculate #' p-values #' #' These functions search for NHST results in all PDF and/or HTML articles in a #' certain folder and send the extracted statistics to \code{statcheck}. #' #' @param dir String indicating the directory to be used. If this is left empty, #' a window will pop up from which you can choose a directory. #' @param subdir Logical. Indicates whether you also want to check subfolders. #' Defaults to TRUE #' @param extension Logical. Indicates whether the HTML extension should be #' checked. Defaults to TRUE #' @param ... Arguments sent to \code{statcheck}. #' #' @name checkdirs #' #' @return A statcheck data frame with the extracted statistics. See #' \code{\link{statcheck}} for details. NULLstatcheck/R/compute_p.R0000644000176200001440000000253514350273527014557 0ustar liggesuserscompute_p <- function(test_type, test_stat, df1, df2, two_tailed){ stopifnot(test_type %in% c("t", "F", "Z", "r", "Chi2", "Q", "Qb", "Qw")) # compute p-values --------------------------------------------------------- if(test_type == "t"){ computed <- stats::pt(-1 * abs(test_stat), df2) } else if(test_type == "F"){ computed <- stats::pf(test_stat, df1, df2, lower.tail = FALSE) } else if(test_type == "Z"){ computed <- stats::pnorm(abs(test_stat), lower.tail = FALSE) } else if(test_type == "r"){ t <- r2t(test_stat, df2) computed <- stats::pt(-1 * abs(t), df2) } else if(test_type == "Chi2" | test_type == "Q" | test_type == "Qb" | test_type == "Qw"){ computed <- stats::pchisq(test_stat, df1, lower.tail = FALSE) } # compute two-tailed ------------------------------------------------------ if (!is.na(computed) & (test_type == "t" | test_type == "Z" | test_type == "r") & two_tailed) { computed <- computed * 2 } # return ------------------------------------------------------------------ return(computed) } # Function to transform correlations into t-values by use of raw r and degrees of freedom. r2t <- function(r, df){ t <- r / (sqrt((1 - r^2) / df)) return(t) } statcheck/R/constants.R0000644000176200001440000000161314350273527014574 0ustar liggesusers# This file contains constants. These are mainly fixed variable names used # throughout the package # The logic of having a "constants" file, is that it now becomes straightforward # to change a variable name, without having to go through all R scripts # variables in final statcheck data frame VAR_SOURCE <- "source" VAR_TYPE <- "test_type" VAR_DF1 <- "df1" VAR_DF2 <- "df2" VAR_TEST_COMPARISON <- "test_comp" VAR_TEST_VALUE <- "test_value" VAR_P_COMPARISON <- "p_comp" VAR_REPORTED_P <- "reported_p" VAR_COMPUTED_P <- "computed_p" VAR_RAW <- "raw" VAR_ERROR <- "error" VAR_DEC_ERROR <- "decision_error" VAR_1TAILTXT <- "one_tailed_in_txt" VAR_APAFACTOR <- "apa_factor" # additional variables to return VAR_P_DEC <- "p_decimals" # additional variables in summary function VAR_NR_PVALUES <- "nr_p_values" VAR_NR_ERRORS <- "nr_errors" VAR_NR_DEC_ERRORS <- "nr_decision_errors" statcheck/R/identify.statcheck.R0000644000176200001440000000263214350273527016345 0ustar liggesusers#' Identify specific points in a statcheck plot. #' #' With this function you can simply point and click on the datapoints in the #' plot to see the corresponding statcheck details, such as the paper from which #' the data came and the exact statistical results. #' #' @inheritParams plot.statcheck #' #' @examples \dontrun{ #' #' # First we need a statcheck object #' # Here, we create one by running statcheck on some raw text #' #' txt <- "This test is consistent t(28) = 0.2, p = .84, but this one is #' inconsistent: F(2, 28) = 4.2, p = .01. This final test is even a #' gross/decision inconsistency: z = 1.23, p = .03" #' #' result <- statcheck(txt) #' #' # Now, we can run identify.statcheck(), or shorter, simply identify(): #' identify(result) #' #' # Further instructions: #' # click on one or multiple points of interest #' # press Esc #' # a dataframe with information on the selected points will appear #' #' } #' #' @export identify.statcheck <- function(x, alpha = .05, ...) { reported <- x[[VAR_REPORTED_P]] computed <- x[[VAR_COMPUTED_P]] # replace 'ns' for > alpha reported[x[[VAR_P_COMPARISON]] == "ns"] <- alpha plot.statcheck(x, APAstyle = FALSE, ...) ID <- graphics::identify(reported, computed) res <- x[ID,] class(res) <- c("statcheck", "data.frame") return(res) } statcheck/R/summary.statcheck.R0000644000176200001440000000375514350273527016236 0ustar liggesusers#' Summary method for statcheck #' #' Gives the summaries for a \code{statcheck} object. #' #' @param object a \code{statcheck} object. #' @param ... additional arguments affecting the summary produced. #' #' @return A data frame containing for each source of statistics: #' \describe{ #' \item{source}{Name of the file/origin of which the statistics are #' extracted} #' \item{nr_p_values}{The number of extracted reported p values per article} #' \item{nr_errors}{The number of errors per article} #' \item{nr_decision_errors}{The number of decision errors per article} #' } #' #' @examples #' txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" #' stat <- statcheck(txt) #' summary(stat) #' #' @export summary.statcheck <- function(object, ...) { x <- object # Source Source <- c(as.vector(plyr::ddply(x, VAR_SOURCE, function(x) unique(x[[VAR_SOURCE]]))[, 1]), "Total") # Number of p values extracted per article and in total pValues <- c(plyr::ddply(x, VAR_SOURCE, function(x) nrow(x))[, 2], nrow(x)) # Number of errors per article and in total Errors <- c(plyr::ddply(x, VAR_SOURCE, function(x) sum(x[[VAR_ERROR]], na.rm = TRUE))[, 2], sum(x[[VAR_ERROR]], na.rm = TRUE)) # Number of decision errors per article and in total DecisionErrors <- c(plyr::ddply(x, VAR_SOURCE, function(x) sum(x[[VAR_DEC_ERROR]], na.rm = TRUE))[, 2], sum(x[[VAR_DEC_ERROR]], na.rm = TRUE)) # Results in dataframe res <- data.frame( Source = Source, pValues = pValues, Errors = Errors, DecisionErrors = DecisionErrors ) # Rename columns based on constants in constants.R file colnames(res) <- c(VAR_SOURCE, VAR_NR_PVALUES, VAR_NR_ERRORS, VAR_NR_DEC_ERRORS) class(res) <- c("statcheck", "data.frame") return(res) }statcheck/R/calc_APA_factor.R0000644000176200001440000000215714350273527015505 0ustar liggesuserscalc_APA_factor <- function(pRes, Res){ # select only the results of pRes that are from articles with at least 1 statcheck result pRes_selection <- pRes[pRes$Source %in% Res$Source, ] # Source should not be a factor. This would result in a bug down the road, if # one of the sources didn't have any APA results: # Error in by(Res_selection, Res_selection$Source, nrow)/by(pRes_selection, : # non-conformable arrays pRes_selection$Source <- as.vector(pRes_selection$Source) # select only the statcheck results that are from an article with at least one p value # this is relevant, because it sometimes happens that statcheck extracts less p values # p values than statcheck results. For instance in cases when a p value appears to be # greater than 1. Res_selection <- Res[Res$Source %in% pRes_selection$Source, ] APA <- by(Res_selection, Res_selection$Source, nrow) / by(pRes_selection, pRes_selection$Source, nrow) APAfactor <- round(as.numeric(apply(Res, 1, function(x) APA[which(names(APA) == x["Source"])])), 2) return(APAfactor) } statcheck/R/statcheck-package.R0000644000176200001440000001137614362536723016134 0ustar liggesusers#' statcheck: Extract statistics from articles and recompute p-values #' #' The package \code{statcheck} can extract Null Hypothesis Significance Test #' (NHST) results from articles (or plain text) and recomputes p-values to check #' whether a reported NHST result is internally consistent or not. #' #' \code{statcheck} can be used for multiple purposes, including: #' #' \itemize{ #' \item \strong{Self-checks}: you can use statcheck to make sure your #' manuscript doesn't contain copy-paste errors or other inconsistencies #' before you submit it to a journal. #' \item \strong{Peer review}: editors and reviewers can use statcheck to #' check submitted manuscripts for statistical inconsistencies. They can ask #' authors for a correction or clarification before publishing a manuscript. #' \item \strong{Research}: statcheck can be used to automatically extract #' statistical test results from articles that can then be analyzed. You can #' for instance investigate whether you can predict statistical #' inconsistencies (see e.g., Nuijten et al., 2017 ), #' or use it to analyze p-value distributions (see e.g., #' Hartgerink et al., 2016 ). #' } #' #' @section Using statcheck on a string of text: #' The most basic usage of \code{statcheck} is to directly extract NHST results #' and check for inconsistencies in a string of text. See #' \code{\link{statcheck}} for details and an example of how to do this. #' #' @section Using statcheck on an article: #' Another option is to run \code{statcheck} on an article (PDF or HTML). This #' is a useful option if you want to check for inconsistencies in a single #' article (e.g., as a final check before you submit it). Depending on whether #' you want to check an article in HTML or PDF, you can use #' \code{\link{checkHTML}} or \code{\link{checkPDF}}, respectively. Note: it is #' recommended to check articles in HTML, as converting PDF files to plain text #' sometimes results in some conversion errors. #' #' @section Using statcheck on a folder of articles: #' Finally, it is possible to run \code{statcheck} on an entire folder of #' articles. This is often useful for meta-research. To do so, you can use #' \code{\link{checkPDFdir}} to check all PDF articles in a folder, #' \code{\link{checkHTMLdir}} to check all PDF articles in a folder, and #' \code{\link{checkdir}} to check both PDF and HTML articles in a folder. #' #' @section Accuracy of the algorithm in detecting inconsistencies: #' It is important to note that \code{statcheck} is not perfect. Its performance #' in detecting NHST results depends on the type-setting and reporting style of #' an article and can vary widely. However, \code{statcheck} performs well in #' classifying the retrieved statistics in different consistency categories. We #' found that statcheck’s sensitivity (true positive rate) and specificity (true #' negative rate) were high: between 85.3% and 100%, and between 96.0% and 100%, #' respectively, depending on the assumptions and settings. The overall accuracy #' of statcheck ranged from 96.2% to 99.9%. More details on the validity study #' can be found in \href{https://psyarxiv.com/tcxaj/}{Nuijten et al., 2017}. #' #' @section Manual: #' Details on what statcheck can and cannot do, and how to install the package #' and the necessary program Xpdf can be found in the #' \href{https://rpubs.com/michelenuijten/statcheckmanual}{online manual}. #' #' @section Web app: #' \code{statcheck} is also available as a free, online web app at #' \url{http://statcheck.io}. #' #' @references #' Hartgerink, C. H. J., Van Aert, R. C. M., Nuijten, M. B., Wicherts, J. M., #' Van Assen, M. A. L. M. (2016). Distributions of p-values smaller than .05 in #' psychology: What is going on? \emph{PeerJ}, \emph{4}, e1935. #' doi: 10.7717/peerj.1935 #' #' Nuijten, M. B., Borghuis, J., Veldkamp, C. L. S., Dominguez-Alvarez, L., Van #' Assen, M. A. L. M., & Wicherts, J. M. (2017). Journal data sharing policies #' and statistical reporting inconsistencies in psychology. #' \emph{Collabra: Psychology}, \emph{3}(1), 1-22. doi: 10.1525/collabra.102. #' #' Nuijten, M. B., Van Assen, M. A. L. M., Hartgerink, C. H. J., Epskamp, S., & #' Wicherts, J. M. (2017). The validity of the tool "statcheck" in discovering #' statistical reporting inconsistencies. \emph{Preprint retrieved from #' https://psyarxiv.com/tcxaj/.} #' @keywords internal #' @aliases {statcheck}-package "_PACKAGE" #' @name statcheck # The following block is used by usethis to automatically manage # roxygen namespace tags. Modify with care! ## usethis namespace: start ## usethis namespace: end NULL statcheck/R/extract_1tail.R0000644000176200001440000000065614350273527015332 0ustar liggesusersextract_1tail <- function(txt){ # search for "one-sided"/"one-tailed"/"directional" in full text to detect one-sided testing onesided <- gregexpr("one.?sided|one.?tailed|directional", txt, ignore.case = TRUE)[[1]] if (onesided[1] != -1) { onesided <- 1 } else { onesided <- 0 } OneTailedInTxt <- as.logical(onesided) return(OneTailedInTxt) } statcheck/R/extract_stats.R0000644000176200001440000001415414362210351015441 0ustar liggesusersextract_stats <- function(txt, stat){ # step 1: extract all NHST results from text ----------------------------------- # if there are x NHST results in a text, this returns a character vector of # length x nhst_raw <- extract_pattern(txt = txt, # nhst is the regex for nhst results # it came from the regex.R script within the package pattern = RGX_NHST, # don't ignore case here: we only want to extract # stats reported in a specific way (e.g., t, not T) ignore.case = FALSE) # if there are no nhst results in the text, return an empty data frame if(is.null(nhst_raw)){ return(data.frame(NULL)) } # step 2: parse the extracted results ------------------------------------------ # empty vectors and data frames to store results in # where relevant, force the output to be of type "character" test_type <- character() df_result <- data.frame(NULL) # will contain both df1 and df2 test_stats <- data.frame(NULL) # will contain both test comparison and value pvals <- data.frame(NULL) # will contain both p-comparison and p-value # loop over all extracted, raw nhst results # each nhst result is parsed individually, in the order that they were extracted # from the text for(i in seq_along(nhst_raw)){ # extract the test types from the nhst results test_raw <- extract_pattern(txt = nhst_raw[i], pattern = RGX_TEST_TYPE) # classify the test types in standard classifications # for each test type, check where the vector with extracted, raw test types # matches the regex for each test type, and assign the appropriate category # the order of the classification matters: Q has to be tested first, # otherwise the regex for t will also match Qwithin and Qbetween, because # both have a t in them. Similarly: first check for Qb, because Qbetween # also has a w in it if (grepl(pattern = RGX_Q, x = test_raw)){ # distinguish between Q, Qw, and Qb if(grepl(pattern = RGX_QB, x = test_raw)){ test_type[i] <- "Qb" } else if (grepl(pattern = RGX_QW, x = test_raw)){ test_type[i] <- "Qw" } else { test_type[i] <- "Q" } } else if(grepl(pattern = RGX_T, x = test_raw)){ test_type[i] <- "t" } else if (grepl(pattern = RGX_F, x = test_raw)){ test_type[i] <- "F" } else if (grepl(pattern = RGX_R, x = test_raw)){ test_type[i] <- "r" } else if (grepl(pattern = RGX_Z, x = test_raw)){ test_type[i] <- "Z" } else if (grepl(pattern = RGX_CHI2, x = test_raw)){ test_type[i] <- "Chi2" } # extract degrees of freedom dfs <- extract_df(raw = nhst_raw[i], test_type = test_type[i]) df_result <- rbind(df_result, dfs) # extract test comparison and test value test <- extract_test_stats(raw = nhst_raw[i]) # ignore any cases with more than 1 test comparison (e.g., z >= 2) if(nrow(test) > 1){ test <- data.frame(test_comp = NA, test_value = NA, test_dec = NA) } test_stats <- rbind(test_stats, test) # extract p-comparison and p-value p <- extract_p_value(raw = nhst_raw[i]) # ignore any cases with more than 1 test comparison (e.g., p >= .01) if(nrow(p) > 1){ p <- data.frame(p_comp = NA, p_value = NA, p_dec = NA) } pvals <- rbind(pvals, p) } # create final data frame ------------------------------------------------------ nhst_parsed <- data.frame( # return raw result without leading/trailing whitespaces Raw = trimws(nhst_raw, which = "both"), Statistic = test_type, df1 = df_result$df1, df2 = df_result$df2, Test.Comparison = test_stats$test_comp, Value = test_stats$test_value, testdec = test_stats$test_dec, Reported.Comparison = pvals$p_comp, Reported.P.Value = pvals$p_value, dec = pvals$p_dec, stringsAsFactors = FALSE) if (nrow(nhst_parsed) > 0) { # remove p values greater than one nhst_parsed <- nhst_parsed[nhst_parsed$Reported.P.Value <= 1 | is.na(nhst_parsed$Reported.P.Value), ] # remove correlations greater than one or smaller than -1 # reason: there is a risk that statcheck simply misread this stat # this means that statcheck will not flag such incorrect correlations, # which you could also consider a disadvantage nhst_parsed <- nhst_parsed[!(nhst_parsed$Statistic == "r" & (nhst_parsed$Value > 1| nhst_parsed$Value < -1)), ] # remove rows with missing test values # reason: this can happen when a test statistic has a weird minus and a # space in front of it. statcheck can't convert the weird minus in that case # and would otherwise break down nhst_parsed <- nhst_parsed[!is.na(nhst_parsed$Value), ] # remove missing test comparisons or p comparisons # reason: these are marked as NA in cases where multiple comparisons were # reported. E.g., t(23) >= ..., p >= ... nhst_parsed <- nhst_parsed[!is.na(nhst_parsed$Test.Comparison) & !is.na(nhst_parsed$Reported.Comparison), ] # only return selected stats # to that end, rename test-types to match argument stat types <- as.vector(nhst_parsed$Statistic) types[types == "r"] <- "cor" types[types == "Chi2"] <- "chisq" types[types == "Z"] <- "Z" types[types == "Qw"| types == "Qb"] <- "Q" # only return rows where the test_type matches the selected stats nhst_parsed <- nhst_parsed[types %in% stat, ] } class(nhst_parsed) <- c("statcheck", "data.frame") return(nhst_parsed) }statcheck/R/checkPDF.R0000644000176200001440000000040414362533741014164 0ustar liggesusers#' @rdname checkfiles #' @export checkPDF <- function(files, ...) { if (missing(files)) files <- tcltk::tk_choose.files() txts <- sapply(files, getPDF) names(txts) <- basename(files) return(statcheck(txts, ...)) } statcheck/R/decision_error_test.R0000644000176200001440000000707114350273527016631 0ustar liggesusersdecision_error_test <- function(reported_p, computed_p, test_comparison, p_comparison, alpha, pEqualAlphaSig){ # replace 'ns' for > alpha ----------------------------------------------- reported_p[p_comparison == "ns"] <- alpha p_comparison[p_comparison == "ns"] <- ">" # check errors for different combinations of <>= ------------------------- # treat p = alpha as significant if(pEqualAlphaSig == TRUE){ if(test_comparison == "="){ if(p_comparison == "="){ dec_error <- (reported_p <= alpha & computed_p > alpha) | (reported_p > alpha & computed_p <= alpha) return(dec_error) } else if(p_comparison == "<"){ dec_error <- reported_p <= alpha & computed_p > alpha return(dec_error) } else if(p_comparison == ">"){ dec_error <- reported_p >= alpha & computed_p <= alpha return(dec_error) } } else if(test_comparison == "<"){ if(p_comparison == "="){ dec_error <- reported_p <= alpha & computed_p >= alpha return(dec_error) } else if(p_comparison == "<"){ dec_error <- reported_p <= alpha & computed_p >= alpha return(dec_error) } else if(p_comparison == ">"){ dec_error <- FALSE return(dec_error) } } else if(test_comparison == ">"){ if(p_comparison == "="){ dec_error <- reported_p > alpha & computed_p <= alpha return(dec_error) } else if(p_comparison == "<"){ dec_error <- FALSE return(dec_error) } else if(p_comparison == ">"){ dec_error <- reported_p >= alpha & computed_p <= alpha return(dec_error) } } return(NA) # treat p = alpha as significant } else if (pEqualAlphaSig == FALSE){ if(test_comparison == "="){ if(p_comparison == "="){ dec_error <- (reported_p < alpha & computed_p >= alpha) | (reported_p >= alpha & computed_p < alpha) return(dec_error) } else if(p_comparison == "<"){ dec_error <- reported_p <= alpha & computed_p >= alpha return(dec_error) } else if(p_comparison == ">"){ dec_error <- reported_p >= alpha & computed_p < alpha return(dec_error) } } else if(test_comparison == "<"){ if(p_comparison == "="){ dec_error <- reported_p < alpha & computed_p >= alpha return(dec_error) } else if(p_comparison == "<"){ dec_error <- reported_p <= alpha & computed_p >= alpha return(dec_error) } else if(p_comparison == ">"){ dec_error <- FALSE return(dec_error) } } else if(test_comparison == ">"){ if(p_comparison == "="){ dec_error <- reported_p >= alpha & computed_p <= alpha return(dec_error) } else if(p_comparison == "<"){ dec_error <- FALSE return(dec_error) } else if(p_comparison == ">"){ dec_error <- reported_p >= alpha & computed_p <= alpha return(dec_error) } } return(NA) } } statcheck/R/statcheck.R0000644000176200001440000003200014362533741014523 0ustar liggesusers#' Extract statistics and recompute p-values #' #' \code{statcheck} extracts Null Hypothesis Significance (NHST) results from #' strings and returns the extracted values, reported p-values and recomputed #' p-values. #' #' #' \code{statcheck} roughly works in three steps. #' #' \strong{1. Scan text for statistical results} #' #' \code{statcheck} uses regular expressions to recognizes statistical results #' from t-tests, F-tests, \eqn{\chi2}-tests, Z-tests, Q-tests, and correlations. #' statcheck can only recognize these results if the results are reported #' exactly according to the APA guidelines: #' \itemize{ #' \item \emph{t}(df) = value, \emph{p} = value #' \item \emph{F}(df1, df2) = value, \emph{p} = value #' \item \emph{r}(df) = value, p = value #' \item \emph{\eqn{\chi2}} (df, N = value) = value, \emph{p} = value #' (N is optional) #' \item \emph{Z} = value, \emph{p} = value #' \item \emph{Q}(df) = value, \emph{p} = value (statcheck can distinguish #' between Q, Qw / Q-within, and Qb / Q-between) #' } #' \code{statcheck} takes into account that test statistics and p values may be #' exactly (=) or inexactly (< or >) reported. Different spacing has also been #' taken into account. #' #' \strong{2. Recompute p-value} #' #' \code{statcheck} uses the reported test statistic and degrees of freedom to #' recompute the p-value. By default, the recomputed p-value is two-sided #' #' \strong{3. Compare reported and recomputed p-value} #' #' This comparison takes into account how the results were reported, e.g., #' p < .05 is treated differently than p = .05. Incongruent p values are marked #' as an \code{error}. If the reported result is significant and the recomputed #' result is not, or vice versa, the result is marked as a #' \code{decision_error}. #' #' Correct rounding is taken into account. For instance, a reported t-value of #' 2.35 could correspond to an actual value of 2.345 to 2.354 with a range of #' p-values that can slightly deviate from the recomputed p-value. #' \code{statcheck} will not count cases like this as errors. #' #' Note that when \code{statcheck} flags an \code{error} or #' \code{decision_error}, it implicitly assumes that the p-value is the #' inconsistent value, but it could just as well be the case that the test #' statistic or degrees of freedom contain a reporting error. \code{statcheck} #' merely detects wether a set of numbers is consistent with each other. #' #' @seealso #' For more details, see the #' \href{https://rpubs.com/michelenuijten/statcheckmanual}{online manual}. #' #' @param texts A vector of strings. #' @param stat Specify which test types you want to extract. "t" to extract #' t-values, "F" to extract F-values, "cor" to extract correlations, "chisq"to #' extract \eqn{\chi2} values, "Z" to extract Z-values, and "Q" to extract #' Q-values. Using \code{c()} you can specify multiple tests. Defaults to all #' tests. #' @param OneTailedTests Logical. Do you want to assume that all reported tests #' are one-tailed (TRUE) or two-tailed (FALSE, default)? #' @param alpha Assumed level of significance in the scanned texts. Defaults to #' .05. #' @param pEqualAlphaSig Logical. If TRUE, statcheck counts p <= alpha as #' significant (default), if FALSE, statcheck counts p < alpha as significant. #' @param pZeroError Logical. If TRUE, statcheck counts p = .000 as an error #' (because a p-value is never exactly zero, and should be reported as < .001), #' if FALSE, statcheck does not count p = .000 automatically as an error. #' @param OneTailedTxt Logical. If TRUE, statcheck searches the text for #' "one-sided", "one-tailed", and "directional" to identify the possible use of #' one-sided tests. If one or more of these strings is found in the text AND the #' result would have been correct if it was a one-sided test, the result is #' assumed to be indeed one-sided and is counted as correct. #' @param AllPValues Logical. If TRUE, the output will consist of a dataframe #' with all detected p values, also the ones that were not part of the full #' results in APA format. #' @param messages Logical. If TRUE, statcheck will print a progress bar while #' it's extracting statistics from text. #' #' @return A data frame containing for each extracted statistic: #' \describe{ #' \item{source}{Name of the file of which the statistic is extracted} #' \item{test_type}{Character indicating the statistic that is extracted} #' \item{df1}{First degree of freedom (if applicable)} #' \item{df2}{Second degree of freedom} #' \item{test_comp}{Reported comparison of the test statistic, when #' importing from pdf this will often not be converted properly} #' \item{test_value}{Reported value of the statistic} #' \item{p_comp}{Reported comparison, when importing from pdf this might not #' be converted properly} #' \item{reported_p}{The reported p-value, or NA if the reported value was #' n.s.} #' \item{computed_p}{The recomputed p-value} #' \item{raw}{Raw string of the statistical reference that is extracted} #' \item{error}{The computed p value is not congruent with the reported #' p-value} #' \item{decision_error}{The reported result is significant whereas the #' recomputed result is not, or vice versa.} #' \item{one_tailed_in_txt}{Logical. Does the text contain the string #' "sided", "tailed", and/or "directional"?} #' \item{apa_factor}{What proportion of all detected p-values was part of a #' fully APA reported result?} #' } #' #' @examples #' txt <- "blablabla the effect was very significant (t(100)=1, p < 0.001)" #' statcheck(txt) #' #' @export statcheck <- function(texts, stat = c("t", "F", "cor", "chisq", "Z", "Q"), OneTailedTests = FALSE, alpha = .05, pEqualAlphaSig = TRUE, pZeroError = TRUE, OneTailedTxt = FALSE, AllPValues = FALSE, messages = TRUE){ # We need empty data frames to store extracted statistics in # One for NHST results (Res) and one for p-values (pRes) Res <- data.frame(NULL) pRes <- data.frame(NULL) # to indicate where the statistics came from, we need a name for the input # texts. In some cases, this is the name of the file the text came from, but # if the text has no name, number them (with leading zeros to allow sorting) if (is.null(names(texts))){ number_names <- seq_along(texts) max_length <- ceiling(log10(max(number_names))) names(texts) <- formatC(number_names, width = max_length, format = "d", flag = "0") } # start progress bar. If the argument messages == FALSE, don't print this # progress bar. This is mainly useful for the unit tests; otherwise hundreds # of progress bars would be printed during testing and that makes the test # results hard to read if(messages == TRUE){ message("Extracting statistics...") pb <- utils::txtProgressBar(max = length(text), style = 3) } # for each text in the vector of input texts, extract all p-values and all # NHST results for (i in seq_along(texts)) { txt <- texts[i] # extract p-values ------------------------------------------ # extract all p values. This is based on a pretty rough regular expression # that will extract anything that resembles p =<> .... We need this info # later on to calculate the APA factor: the ratio (statcheck results)/ # (total # of p values). It is also possible to let statcheck return this # dataframe instead of the data frame with NHST results. pvalues <- extract_p_value(txt) # append and close: # in each repetition of the loop, the extracted p-values are appended # to the existing pRes data frame, so it grows in each step if(nrow(pvalues) > 0){ pvalues <- cbind(Source = names(txt), pvalues) pRes <- rbind(pRes, pvalues) } # after appending the pvalues dataframe to the main pRes dataframe, # the temporary dataframe pvalues can be removed. rm(pvalues) # extract NHST results ------------------------------------------ # extract all NHST results. This function scrapes the text for all APA # reported NHST results and parses it so that the separate elements are # returned in one large dataframe nhst <- extract_stats(txt = txt, stat = stat) # append and close: same logic as for the pvalues dataframe above if(nrow(nhst) > 0){ nhst$Source <- names(txt) nhst$OneTailedInTxt <- extract_1tail(txt) Res <- rbind(Res, nhst) rownames(Res) <- NULL # to avoid having duplicated row names (1, 1, 2 etc.) } rm(nhst) # update the progress bar if(messages == TRUE){ utils::setTxtProgressBar(pb, i) } } # close progress bar if(messages == TRUE){ close(pb) } ###--------------------------------------------------------------------- if (nrow(Res) > 0) { # If the argument OneTailedTests == TRUE, it forces statcheck to treat # every encountered NHST result as a one-tailed test. Note: this is not the # same as the automated 1-tailed test detection (switched on with the # argument: OneTailedTxt). The latter works more subtly (see comments in # process_stats()). if (OneTailedTests == TRUE) { two_tailed <- FALSE } else { two_tailed <- TRUE } # create empty variables to fill out during the loop Res$Computed <- rep(NA, nrow(Res)) Res$Error <- rep(NA, nrow(Res)) Res$DecisionError <- rep(NA, nrow(Res)) # row by row, process the extracted statistics in Res. Specifically, # compute the p-value, check if the result is an error and a decision error, # and if indicated in the options, check & correct for 1-tailed tests for(i in seq_len(nrow(Res))){ result <- process_stats(test_type = Res$Statistic[i], test_stat = Res$Value[i], df1 = Res$df1[i], df2 = Res$df2[i], reported_p = Res$Reported.P.Value[i], p_comparison = Res$Reported.Comparison[i], test_comparison = Res$Test.Comparison[i], p_dec = Res$dec[i], test_dec = Res$testdec[i], OneTailedInTxt = Res$OneTailedInTxt[i], # options: two_tailed = two_tailed, alpha = alpha, pZeroError = pZeroError, pEqualAlphaSig = pEqualAlphaSig, OneTailedTxt = OneTailedTxt, OneTailedTests = OneTailedTests) Res$Computed[i] <- result$computed_p Res$Error[i] <- result$error Res$DecisionError[i] <- result$decision_error } ###--------------------------------------------------------------------- # APAfactor: proportion of APA results (that statcheck reads) # in total number of p values Res$APAfactor <- calc_APA_factor(pRes, Res) ###--------------------------------------------------------------------- # select & reorder columns for final data frame Res <- Res[ , c("Source", "Statistic", "df1", "df2", "Test.Comparison", "Value", "Reported.Comparison", "Reported.P.Value", "Computed", "Raw", "Error", "DecisionError", "OneTailedInTxt", "APAfactor")] # rename columns based on the variable names in the script constants.R colnames(Res) <- c(VAR_SOURCE, VAR_TYPE, VAR_DF1, VAR_DF2, VAR_TEST_COMPARISON, VAR_TEST_VALUE, VAR_P_COMPARISON, VAR_REPORTED_P, VAR_COMPUTED_P, VAR_RAW, VAR_ERROR, VAR_DEC_ERROR, VAR_1TAILTXT, VAR_APAFACTOR) } # Return ------------------------------------------------------------------ if (AllPValues == FALSE) { # Return message when there are no results if (nrow(Res) > 0) { class(Res) <- c("statcheck", "data.frame") return(Res) } else { cat("statcheck did not find any results\n") } } else { if(nrow(pRes) > 0) { # rename columns based on the variable names in the script constants.R # first make sure that the columns are in the right order before renaming pRes <- pRes[, c("Source", "p_comp", "p_value", "p_dec")] colnames(pRes) <- c(VAR_SOURCE, VAR_P_COMPARISON, VAR_REPORTED_P, VAR_P_DEC) return(pRes) } else { cat("statcheck did not find any p-values\n") } } } statcheck/R/process_stats.R0000644000176200001440000001211314350273527015451 0ustar liggesusersprocess_stats <- function(test_type, test_stat, df1, df2, reported_p, p_comparison, test_comparison, p_dec, test_dec, OneTailedInTxt, # options: two_tailed, alpha, pZeroError, pEqualAlphaSig, OneTailedTxt, OneTailedTests){ # compute p-value ---------------------------------------------------------- computed_p <- compute_p(test_type = test_type, test_stat = test_stat, df1 = df1, df2 = df2, two_tailed = two_tailed) # check if the result is an error ------------------------------------------ error <- error_test(reported_p = reported_p, test_type = test_type, test_stat = test_stat, df1 = df1, df2 = df2, p_comparison = p_comparison, test_comparison = test_comparison, p_dec = p_dec, test_dec = test_dec, two_tailed = two_tailed, alpha = alpha, pZeroError = pZeroError) # check if the result is a decision error ---------------------------------- if(!error){ # if a result is not an error, it's automatically also not a decision error decision_error <- FALSE } else { # only if a result is an error, it makes sense to check if it's also a # decision error decision_error <- decision_error_test(reported_p = reported_p, computed_p = computed_p, test_comparison = test_comparison, p_comparison = p_comparison, alpha = alpha, pEqualAlphaSig = pEqualAlphaSig) } # correct for one-tailed tests in text ------------------------------------ # OneTailedTxt is an option that determines whether statcheck should # try to correct for 1-tailed tests as follows: # if the phrase one-tailed/one-sided/directional is in the full text, # AND if the reported p-value would have been correct if it was a one- # tailed test, classify the result as consistent # don't apply this correction if OneTailedTests == FALSE, because this already # forces statcheck to treat all results as one-tailed tests if(OneTailedTxt == TRUE & OneTailedTests == FALSE){ # select only results where the phrase "one-tailed", "one-sided" or # "directional" was mentioned in text, and that were an error when # we assumed two-tailed tests upForCorrection <- error & OneTailedInTxt # only start correction procedure if the result fits the criteria above if (upForCorrection){ # for this case, recompute the p-value, but this time assuming a # one-tailed test computed_p_1tail <- compute_p(test_type = test_type, test_stat = test_stat, df1 = df1, df2 = df2, two_tailed = FALSE) # check whether result would still be an error if 1-tailed error_1tail <- error_test(reported_p = reported_p, test_type = test_type, test_stat = test_stat, df1 = df1, df2 = df2, p_comparison = p_comparison, test_comparison = test_comparison, p_dec = p_dec, test_dec = test_dec, two_tailed = FALSE, alpha = alpha, pZeroError = pZeroError) if(!error_1tail){ # if a result is not an error, it's automatically also not a decision error decision_error_1tail <- FALSE } else { # only if a result is an error, it makes sense to check if it's also a # decision error decision_error_1tail <- decision_error_test(reported_p = reported_p, computed_p = computed_p_1tail, test_comparison = test_comparison, p_comparison = p_comparison, alpha = alpha, pEqualAlphaSig = pEqualAlphaSig) } # if the 1-tailed p-value is no longer an error, the original values of # error, decisionerror, and computed_p should be overwritten with the 1- # tailed versions if(error != error_1tail){ computed_p <- computed_p_1tail error <- error_1tail decision_error <- decision_error_1tail } } } result <- data.frame(computed_p = computed_p, error = error, decision_error = decision_error) return(result) } statcheck/R/plot.statcheck.R0000644000176200001440000002310014350273527015501 0ustar liggesusers#' Plot method for statcheck #' #' Function for plotting of \code{statcheck} objects. Reported p values are #' plotted against recalculated p values, which allows the user to easily spot #' if articles contain miscalculations of statistical results. #' #' If APAstyle = FALSE, inconsistencies between the reported and the recalculated p value are indicated with an orange dot. Recalculations of the p value that render a previously non significant result (p >= .5) as significant (p < .05), and vice versa, are considered decision errors, and are indicated with a red dot. Exactly reported p values (i.e. p = ..., as opposed to p < ... or p > ...) are indicated with a diamond. #' #' @section Acknowledgements: #' Many thanks to John Sakaluk who adapted the plot code to create graphs in #' APA style. #' #' @seealso \code{\link{statcheck}} #' #' @param x A statcheck object. See \code{\link{statcheck}}. #' @param alpha assumed level of significance in the scanned texts. Defaults to #' .05. #' @param APAstyle If TRUE, prints plot in APA style. #' @param group Indicate grouping variable to facet plot. Only works when #' \code{APAstyle==TRUE} #' @param ... arguments to be passed to methods, such as graphical parameters #' (see \code{\link{par}}). #' #' @examples #' # First we need a statcheck object #' # Here, we create one by running statcheck on some raw text #' #' txt <- "This test is consistent t(28) = 0.2, p = .84, but this one is #' inconsistent: F(2, 28) = 4.2, p = .01. This final test is even a #' gross/decision inconsistency: z = 1.23, p = .03" #' #' result <- statcheck(txt) #' #' # We can then plot the statcheck object 'result' by simply calling plot() on #' # "result". R will know what kind of plot to make, because "result" is of #' # class "statcheck" #' plot(result) #' #' @importFrom ggplot2 theme theme_bw element_blank element_line ggplot aes #' geom_point geom_vline geom_hline geom_abline annotate scale_x_continuous #' scale_y_continuous scale_color_manual facet_grid #' @importFrom rlang .data #' @importFrom graphics plot.default points abline text par legend #' #' @export plot.statcheck <- function( x, alpha = .05, APAstyle = TRUE, group = NULL, ... ){ # replace 'ns' for > alpha ns <- x[[VAR_P_COMPARISON]] == "ns" x[[VAR_P_COMPARISON]][ns] <- ">" x[[VAR_REPORTED_P]][ns] <- alpha if (APAstyle == TRUE) { # Add vector "Type" to statcheck object, specifying whether observations are # correctly reported, reporting inconsistencies, or decision errors. # First create an empty variable for Type to avoid a NOTE in the R CMD Check # that there is "no visible binding for global variable" Type <- rep(NA, nrow(x)) x <- cbind(x, Type) x$Type[x[[VAR_ERROR]] == "FALSE" & x[[VAR_DEC_ERROR]] == "FALSE"] <- "Correctly Reported" x$Type[x[[VAR_ERROR]] == "TRUE" & x[[VAR_DEC_ERROR]] == "FALSE"] <- "Reporting Inconsistency" x$Type[x[[VAR_ERROR]] == "TRUE" & x[[VAR_DEC_ERROR]] == "TRUE"] <- "Decision Error" #Create ggplot "APA format" theme apatheme <- theme_bw() + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line() ) #If no grouping variable is specified, don't use faceting if (is.null(group)) { #Create plot "p"; map computed p-values to x-axis, reported p-values to y-axis, and #color to the Type variable created earlier. Environment command allows apatheme to #be applied later because of bug when creating functions with ggplot2 p <- ggplot(x, aes(y = .data[[VAR_COMPUTED_P]], x = .data[[VAR_REPORTED_P]], col = Type), environment = environment()) #Add data points to plot p + geom_point(size = 2.5) + #Add vertical grey dashed line, located at specified alpha level geom_vline(xintercept = alpha, color = "grey60", linetype = "dashed") + #Add horizontal grey dashed line, located at specified alpha level geom_hline(yintercept = alpha, color = "grey60", linetype = "dashed") + #Add a line showing where accurately reported p-values should fall geom_abline(intercept = 0, slope = 1, color = "grey60") + #Add text annotations demarcating over-/under-estimated areas of the plot annotate("text", x = 0.5, y = .10, label = "overestimated") + annotate("text", x = 0.5, y = .90, label = "underestimated") + #Rename the x- and y-axis, and manually specify breaks scale_x_continuous( name = "Reported p-values", breaks = c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0), limits = c(0, 1) ) + scale_y_continuous( name = "Computed p-values", breaks = c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0), limits = c(0, 1) ) + #Manually specify greyscale colors for different levels of Type scale_color_manual( breaks = c( "Correctly Reported", "Reporting Inconsistency", "Decision Error" ), values = c("grey80", "black", "grey50") ) + apatheme } else { #If grouping variable is specified, use for faceting #Create plot "p"; map computed p-values to x-axis, reported p-values to y-axis, and #color to the Type variable created earlier. Environment command allows apatheme to #be applied later because of bug when creating functions with ggplot2 p <- ggplot(x, aes(y = rlang::.data[[VAR_COMPUTED_P]], x = rlang::.data[[VAR_REPORTED_P]], col = Type), environment = environment()) #Add data points to plot p + geom_point(size = 2.5) + #Add vertical grey dashed line, located at specified alpha level geom_vline(xintercept = alpha, color = "grey60", linetype = "dashed") + #Add horizontal grey dashed line, located at specified alpha level geom_hline(yintercept = alpha, color = "grey60", linetype = "dashed") + #Add a line showing where accurately reported p-values should fall geom_abline(intercept = 0, slope = 1, color = "grey60") + #Add text annotations demarcating over-/under-estimated areas of the plot annotate("text", x = 0.5, y = .10, label = "overestimated") + annotate("text", x = 0.5, y = .90, label = "underestimated") + #Rename the x- and y-axis, and manually specify breaks scale_x_continuous(name = "Reported p-values", breaks = c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0)) + scale_y_continuous(name = "Computed p-values", breaks = c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0)) + #Manually specify greyscale colors for different levels of Type scale_color_manual( breaks = c( "Correctly Reported", "Reporting Inconsistency", "Decision Error" ), values = c("grey80", "black", "grey50") ) + facet_grid(stats::as.formula(paste(group, "~ ."))) + apatheme } } else { # Extract limit args: args <- list(...) if (is.null(args$xlim)) args$xlim <- c(0, 1) if (is.null(args$ylim)) args$ylim <- c(0, 1) reported <- x[[VAR_REPORTED_P]] computed <- x[[VAR_COMPUTED_P]] # replace 'ns' for > alpha reported[x[[VAR_P_COMPARISON]] == "ns"] <- alpha # scatterplot of reported and recalculated p values do.call(plot.default, c( list( x = reported, y = computed, xlab = "reported p value", ylab = "recalculated p value", pch = 20 ), args )) # orange dot for error points(reported[x[[VAR_ERROR]]], computed[x[[VAR_ERROR]]], pch = 20, col = "orange") # red dot for gross error (non-sig reported as sig and vice versa) points(reported[x[[VAR_DEC_ERROR]]], computed[x[[VAR_DEC_ERROR]]], pch = 20, col = "red") # indicate exact p values with diamond points(x[[VAR_REPORTED_P]][x[[VAR_P_COMPARISON]] == "="], computed[x[[VAR_P_COMPARISON]] == "="], pch = 5) # general layout of figure: # lines & text to indicate under- and overestimates abline(h = .05) abline(v = .05) abline(0, 1) text(.8, .4, "overestimated") text(.4, .8, "underestimated") text(0, .53, "non-sig", cex = .7) text(0, .50, "reported", cex = .7) text(0, .47, "as sig", cex = .7) text(.5, 0, "sig reported as non-sig", cex = .7) par(xpd = TRUE) legend( .88, -.15, pch = c(20, 20, 5), col = c("orange", "red", "black"), legend = c("p inconsistency", "decision error", "exact (p = ...)"), cex = .8 ) par(xpd = FALSE) } }statcheck/R/helpers-parse-stats.R0000644000176200001440000001706314362504560016471 0ustar liggesusers# this script contains helper functions to extract and parse nhst results from # text # function to extract snippets of text from a string --------------------------- extract_pattern <- function(txt, pattern, ignore.case = TRUE) { # extract the locations of the matches in the text: # gregexpr returns the position of every match in a string # if there are multiple matches in the text, gregexpr will flag them all # the output is in list format, but the relevant information is all in [[1]] string_loc <- gregexpr(pattern = pattern, text = txt, ignore.case = ignore.case, perl = TRUE)[[1]] # perl is necessary for lookbehinds # if no match is found, or result is a missing value, return NULL if(string_loc[1] == -1 | is.na(string_loc[1])){ return(NULL) } # if a match is found: # extract the raw text of the regex match: # retrieve a 'substring' from the text that starts at string_loc: string_loc # is a vector of integers that indicate the location of the first characters of # the match. The end point of the substring is determined using the # attribute 'match.length' of string_loc This is a vector of integers indicating # how long each matched string is. By adding the length of the string to the # position of the first character, and subtracting 1, you obtain the location # of the last character of the string. string <- substring(text = txt, first = string_loc, last = string_loc + attr(string_loc, "match.length") - 1) return(string) } # function to extract dfs from a raw nhst result ------------------------------- extract_df <- function(raw, test_type){ # z tests do not have dfs, so return df1 = NA, and df2 = NA for z-tests if(test_type == "Z"){ df1 <- NA df2 <- NA } else { # for all other test types, extract dfs from the raw nhst result df_raw <- extract_pattern(txt = raw, pattern = RGX_DF)[[1]] # remove parentheses to only keep numbers df <- gsub("\\(|\\)", "", df_raw) # split string on comma to separate df1 and df2 / N # note: there can be no commas as thousand separators in the dfs; statcheck # would not have recognized these in the first place, so we don't have to take # this possibility into account here df <- strsplit(df, ",")[[1]] # remove leading/trailing whitespaces df <- trimws(df, which = "both") # there are three different types of degrees of freedom: # - t-tests, correlations, and Q-tests (a single number between brackets) # - F-tests (two degrees of freedom separated by a comma) # - chi2 (can also contain sample size) if(test_type %in% c("t", "r")){ df1 <- NA df2 <- df } else if(test_type == "F"){ # for some reason, typesetting in articles sometimes goes wrong with # F-tests and when df1 == 1, it gets typeset as the letter l or I # If this happens, replace the l or I with a 1 if(grepl(RGX_DF1_I_L, df[1])){ df[1] <- 1 } df1 <- df[1] df2 <- df[2] } else if(test_type %in% c("Chi2", "Q", "Qw", "Qb")){ df1 <- df[1] df2 <- NA } else { df1 <- NA df2 <- NA } } # return dfs as numeric values (to avoid R turning them into factors) return(data.frame(df1 = as.numeric(df1), df2 = as.numeric(df2))) } # function to remove commas that serve as thousands separators ----------------- remove_1000_sep <- function(raw){ # replace all matches in the raw nhst results with nothing output <- gsub(pattern = RGX_1000_SEP, replacement = "", x = raw, perl = TRUE) # for the lookaheads & lookbehinds in the regex return(output) } # function to replace weird symbols with a minus sign -------------------------- # sometimes the mathematical symbol for a minus sign is wrongly converted into # a strange symbol. Since it is very likely that any weird symbol in front of # a test statistic is in fact a minus sign, replace all such weird codings with # an actual minus sign recover_minus_sign <- function(raw){ # replace any weird string before the test value with a minus sign return(gsub(RGX_WEIRD_MINUS, " -", raw, perl = TRUE)) } # function to extract test-values and test comparisons ------------------------- extract_test_stats <- function(raw){ # remove N = ... from chi-square tests # otherwise, these sample sizes will wrongly be classified as test statistics raw_noN <- gsub(RGX_DF_CHI2, "", raw) # extract test comparison and test value test_raw <- extract_pattern(txt = raw_noN, pattern = RGX_TEST_VALUE) # extract test comparison test_comp <- extract_pattern(txt = test_raw, pattern = RGX_COMP) # remove test comparison to only keep numbers test_value <- gsub(RGX_COMP, "", test_raw) # remove thousand separators test_value <- remove_1000_sep(test_value) # replace weird coding before a test value with a minus sign test_value <- recover_minus_sign(test_value) # remove leading/trailing whitespaces test_value <- trimws(test_value, which = "both") # remove comma at the end of the value test_value <- gsub(",$", "", test_value) # record the number of decimals of the test statistic test_dec <- attr(regexpr(RGX_DEC, test_value), "match.length") - 1 test_dec[test_dec < 0] <- 0 # make test_value numeric; suppress warnings (these could arive if the test # value is unusual, e.g., a weird minus followed by a space can't be made # numeric) # note: this needs to happen AFTER extracting the nr of decimals test_value <- suppressWarnings(as.numeric(test_value)) return(data.frame(test_comp = test_comp, test_value = test_value, test_dec = test_dec, stringsAsFactors = FALSE)) } # function to extract and parse p-values -------------------------------------- extract_p_value <- function(raw){ p_raw <- extract_pattern(txt = raw, pattern = RGX_P_NS) p_comp <- character() p_value <- numeric() p_dec <- numeric() for(i in seq_along(p_raw)){ if(grepl(RGX_NS, p_raw[i], ignore.case = TRUE)){ p_comp[i] <- "ns" p_value[i] <- NA p_dec[i] <- NA } else { # extract p-comparison p_comp[i] <- extract_pattern(txt = p_raw[i], pattern = RGX_COMP) # remove p comparison to only keep numbers # split the string on the comparison, that splits the string into a p and # the actual value. Only select the second element: the value p_value[i] <- strsplit(p_raw[i], RGX_COMP)[[1]][2] # remove leading/trailing whitespaces p_value[i] <- trimws(p_value[i], which = "both") # record the number of decimals of the p-value dec <- attr(regexpr(RGX_DEC, p_value[i]), "match.length") - 1 dec[dec < 0] <- 0 p_dec[i] <- dec } } return(data.frame(p_comp = p_comp, p_value = as.numeric(p_value), p_dec = p_dec, stringsAsFactors = FALSE)) } statcheck/R/checkHTMLdir.R0000644000176200001440000000161514362533741015023 0ustar liggesusers#' @rdname checkdirs #' @export checkHTMLdir <- function(dir, subdir = TRUE, extension = TRUE, ...) { if (missing(dir)) { dir <- tcltk::tk_choose.dir() } if (extension == TRUE) { pat = ".html|.htm" } if (extension == FALSE) { pat = "" } files <- list.files(dir, pattern = pat, full.names = TRUE, recursive = subdir) if (length(files) == 0) { stop("No HTML found") } txts <- character(length(files)) message("Importing HTML files...") pb <- utils::txtProgressBar(max = length(files), style = 3) for (i in 1:length(files)) { txts[i] <- getHTML(files[i]) utils::setTxtProgressBar(pb, i) } close(pb) names(txts) <- basename(files) return(statcheck(txts, ...)) } statcheck/NEWS.md0000644000176200001440000002334414362533741013337 0ustar liggesusers# statcheck 1.4.0 ## Major external changes * The variable names from the output of `statcheck()` have changed to increase consistency in style and naming. This means that the variable names in the output of `checkPDF()`, `checkHTML()`, `checkdir()`, `checkPDFdir()`, and `checkHTMLdir()` have also changed. ## Major internal changes There have been major updates to the internal structure of statcheck. Some of the most notable are: * The main `statcheck()` function has been significantly shortened by summarizing a lot of repeating actions into general functions, and by moving functions from within `statcheck()` to their own scripts. * Combine the regular expressions for all separate tests into one main regex and write generic functions to parse the extracted NHST results. In the previous version, a lot of the regexes overlapped, and many actions were performed multiple times throughout the code, which made the script inefficient and error-prone * Update the way that errors and decision_errors are determined. Now, checking for correct rounding is done within the error function, instead of in a separate function * Calculate one-tailed p-values more sophisticatedly: instead of simply doing p/2, statcheck now actually calculates a one-tailed p-value based on the surface under one tail of the appropriate distribution. This ensures that for one-tailed p-values, correct rounding is also taken into account * All documentation and the NAMESPACE are now generated with roxygen2 * The variable names in the output are now based on a file with constants. This makes it easier to update the names in a later stage if necessary, without having to go through every script An overview of all internal functions and how they relate to each other can be found in the file `man/figures/overview_functions.pdf`. In this file, you'll also find a schematic overview of which results will be counted as an inconsistency or a decision inconsistency. ## Small updates * Don't show a message to warn for the potential presence of one-tailed tests and other significance levels. This text was mainly distracting. * When numbering unnamed sources, add leading zeros to allow for ordering of the data frame * Include file extension in source name (mainly useful if there are different file types with the same file name; those might give different results) ## Bug fixes * accurately take correct rounding into account with negative test statistics * extract punctuation that could signal a wrongly encoded minus sign * added additional html encodings of mathematical symbols * ignore result when test value == NA * don't throw an error when input is NA (e.g.: statcheck(NA)) * test results with multiple comparison signs are no longer extracted (e.g.: "t(38) >= 2.25, p = .03") # statcheck 1.3.2 ## Updates * Added unit tests for all main statcheck functions * Make it possible to suppress progress bars and other messages when running statcheck ## Small updates * In `checkdir()`, add an argument to specify whether or not to also search subdirectories. * Take case into account for Q-tests, so ## Bug fixes * Close connection after reading html file * In inexactly reported p-values, statcheck only recognized possible one-tailed tests in p < .05, not other numbers. Unclear why. Fixed. * Don't recognize Kolmogorov-Smirnov test statistic D as a chi-square * Take case into account for Q-tests to avoid wrongly considering Cohen's q as a heterogeneity test. # statcheck 1.3.1 ## Small updates * Updates to statcheck report template ## Bug fixes * Summary function now gives back the Source name (instead of Source number) * Reset working directory after running statcheckReport() # statcheck 1.3.0 ## New features * **Q-tests**: statcheck is now able to find Q-tests for heterogeneity (in meta-analyses). As always, the Q-tests need to be APA reported. statcheck recognizes general Q-tests, Q-within, and Q-between. * **HTML reports**: it is now possible to generate nicely formatted HTML reports with statcheck results with the function `statcheckReport()`. ## Small updates * Formatted code to improve readability * Removed text for the help files from the R scripts (the help files are not created automatically anymore, and having all this text in between the R code decreased readability) ## Bug fixes * Fixed mistake in error coding. statcheck flagged cases such as "F(1, 138) < 1, p = .812" as inconsistent, and opposite cases as consistent, but it should be the other way around. * Changed PDF import function so that statcheck can now also handle files saved with double file extensions (e.g., myfile.pdf.pdf or myfile.html.pdf). HT to Nick Brown for pointing out this problem. * Summary function now gives back the Source names instead of Source numbers * Recognize minus signs in HTML coded as `&minus` * Fixed bug in `summary.statcheck()` so that it gives back the number of articles instead of the article name # statcheck 1.2.3 ## Bug fixes * statcheck flagged cases such as "F(1, 138) < 1, p = .812" as inconsistent, and opposite cases as consistent, but it should be the other way around. * Fix issue with reading html in a Linux environment by using `useBytes = TRUE` # statcheck 1.2.2 ## Small internal updates * Updated documentation * Small updates in NAMESPACE to pass R CMD check # statcheck 1.2.1 ## Small internal updates * Import packages instead of Depending on them * Using `message()` instead of `cat()` # statcheck 1.2.0 ## New features * Make it optional to count p = .000 as an Error ## Small updates * Adapted plot function based on John Sakaluk's code. statcheck can now plot in APA style. * Removed CopyPaste test; this function checked if the same string of results was reported multiple times in a paper or text and flagged it as a possible copy-paste error. However, this function wasn't very useful and therefore removed. * Added axis limits to plot function so they won't get cut off when the re are no p-values > .5. ## Bug fixes * Updated regex for chi-square, so that it doesn't match t, F, or r with a subscript * statcheck sometimes read t-tests in old PDFs as correlations, resulting in correlations >1. This caused an Error in statcheck, but is now ignored. * In old PDFs "F(1, X) = Y" gets converted by pdftotext to "F(l, X) = Y". If this happens, convert "l" back into a "1". Thanks to Erika Salomon for pointing this out to me. # statcheck 1.0.2 ## New features * Add option to choose whether or not to count p == alpha as significant or not * Show pop-up window to select files for `checkPDF()` and `checkHTML()` ## Small updates * Improve search for subscripts in html * Also find chi2 with thousand separators in N * In the automated one-tailed test, search more specifically of "*one*-sided"", instead of "sided", etc. * Also plot ns statistics ## Bug fixes * Fixed bugs in determining correct rounding * If a result is not an error, it can also not be a decision error (this happened in some cases when reported p = .05) # statcheck 1.0.0 ## New features * Added `diagnose()` to guess a probable cause for an error * Recognize z-tests * Calculate the APA factor for each article ## Small updates * Small updates to the regular expressions * Recognize number of decimals to distinguish between p = .04 and p = .040 * Also extract and parse negative test statistics * Also recognize inexact test statistics * Also recognize values with thousand separators * Also detect result reported as ns. * Also recognize p-values in scientific notation * Recognize more types of spacing in HTML * Also accept .htm files instead of only .html * Search for one-tailed tests in text * Make it optional to count one-tailed tests as errors or not * Add an option to assume that all tests are one-sided * Add warnings for possible different significance levels * Add the option to also search subdirectories * Chris Hartgerink added inline documentation ## Bug fixes * Fixed bugs in extracting df for chi-square * Fixed bug in plotting inexact p-values * Fixed some bugs in identifying errors * Better recognition of rounding errors * Better recognition of p < 0 * Fixed bug so that statcheck doesn't crash if no results are extracted * Don't read t *space* (df) as a chi-square * Added Wald tests but removed them again as they were too buggy ## Other updates * Michele became maintainer of the package # statcheck 0.1.0 ## New features * plot.statcheck() to plot statcheck object * Include search for correlations and chi-square * Search HTML files * Search entire directories ## Small updates * Add progress bars ## Bug fixes * Fixed some bugs in summary function (na.rm = TRUE) ## Other updates * Michele Nuijten added as co-author # statcheck 0.0.1 * First version statcheck/MD50000644000176200001440000000615714363505732012554 0ustar liggesusersf76972a0eade6d910a4a963532dd36b5 *DESCRIPTION 6dac50bdd7fe9ba2c384d9332764b9fe *NAMESPACE a60d8df5fbf1c257ac48815c8e48dbec *NEWS.md c1931990ae65e0571414841d1c998c90 *R/calc_APA_factor.R e1463e4d583dbde90162221d4c19db76 *R/checkHTML.R f2716b23ee8ac90f324a5431d31768d5 *R/checkHTMLdir.R 0ac2eea5bde6b3ac0a4d29b96f68d3d3 *R/checkPDF.R ed7b3634a0e6e6f7edde45b9447c81c1 *R/checkPDFdir.R dd49dd1705a94328eab8ea66e5f46ada *R/checkdir.R 69084d216de1319f4d6fc8136c44e215 *R/compute_p.R bdf7e8a5125881a9d2f62c041b3fd21c *R/constants.R c7a73d5a3891f9c2e21136a2b815515c *R/decision_error_test.R 86f2cdce68d03d5bad579298de9f66c9 *R/doc-checkdirs.R 19682e9256556589cc9705d737ea55b4 *R/doc-checkfiles.R 946f20dad2cfb1ae75130023f92156fb *R/error_test.R 7266d80a3943c573191b22eaf5e288ad *R/extract_1tail.R 9c40ba9c0b6b5070033dbad582f26f65 *R/extract_stats.R 8c2d3bc075ff49868155a651a888b1d8 *R/file-to-txt.R 08cca385d56f44a4fe8c6701c99b7975 *R/helpers-parse-stats.R f55cbd5abaf09d7400f59eb24106125c *R/identify.statcheck.R 0de984eead651fa513a16b82f6ab7f2b *R/plot.statcheck.R 0d39853a4c2532239045010442264787 *R/process_stats.R 0fea06c3b7ae8ab9f38de82a69af18e4 *R/regex.R 981304c6bbf77fdf3c17dc1eaedd625c *R/statcheck-package.R dc1f53091f02c7750bcafdbc2e539f3b *R/statcheck.R c4325bfac39030e054def9ac316f0780 *R/statcheckReport.R cbee67a857cd07d4ddc2b6f60f97b9aa *R/summary.statcheck.R 8ce2e739a4877d702b99b7b9cc78fcdc *README.md 8b57b8a1dfefb9aa47c561927ea37e70 *inst/COPYRIGHT.txt 31dc84a3870fa9cb09188598d51e9aa1 *inst/GPL3.txt f430184a8086ba9a1b08926711f3ae68 *inst/rmd/statcheckReport_template.Rmd 7b83577b61d7430a08eba9a194f8d7be *man/checkdirs.Rd 8cb330e9ee4b7928bd8ad37d2d8b77b1 *man/checkfiles.Rd 7d4b3dece76ef34c11c34f51adb181c6 *man/figures/infograph.png 515266bf8e4cacedbeb7d6a0b3cd15b6 *man/figures/logo.jpg ee069d5591a62eecf586f073f1babe2e *man/figures/overview_functions.pdf 81a4c1fcf8981bac645e8a77003d62ff *man/identify.statcheck.Rd ba0f883a68c616f23c7b7be9476c73b2 *man/plot.statcheck.Rd b7ad61535f0353168b8e3cd816479939 *man/statcheck-package.Rd 1a38c0a0db91b545963cd35398f5c341 *man/statcheck.Rd e235e3095c9f57875ac66af7dd98a399 *man/statcheckReport.Rd ed51e1bed43c055f0a34b605226ab1df *man/summary.statcheck.Rd f6b22dfd66b682ad0e83fe0f4293bc62 *tests/testthat.R 44499c201a05a6e99c94cd513f5594b0 *tests/testthat/test-APAfactor.R 22742b85098540688bcf34e7120c3bbc *tests/testthat/test-S3-methods.R 5023b7049ed716080ca41559e6f167fb *tests/testthat/test-compute-pvalues.R a9677e3f1a852c0e0ae9741c0358f587 *tests/testthat/test-decisionerror.R a6927d152609bc438fb26160951251c8 *tests/testthat/test-error.R b18f17c97c42a3bb853a74247772163d *tests/testthat/test-extract-F-tests.R ab2ae9fcd9e0b331ef459d5230cf9c64 *tests/testthat/test-extract-Q-tests.R 35e6101abe6b4b670e4ba401dbbe6f94 *tests/testthat/test-extract-chi2-tests.R 2e658cc4db25b14c79e9e99a9e03b99d *tests/testthat/test-extract-correlations.R e8e8305a1c30e4aa2316947b633fa37b *tests/testthat/test-extract-pvalues.R bfd938bcd8bb93a164657af13311ed17 *tests/testthat/test-extract-t-tests.R 6389b77319f6189a27f7f05ff444fc47 *tests/testthat/test-extract-z-tests.R bb6633db6d021a62904a31315de69435 *tests/testthat/test-file-to-txt.R statcheck/inst/0000755000176200001440000000000014363441156013207 5ustar liggesusersstatcheck/inst/COPYRIGHT.txt0000644000176200001440000000136414350273527015325 0ustar liggesusersstatcheck: Extract statistics from articles and recompute p-values Copyright (C) <2020> 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 .statcheck/inst/rmd/0000755000176200001440000000000014350273527013772 5ustar liggesusersstatcheck/inst/rmd/statcheckReport_template.Rmd0000644000176200001440000001217314350273527021502 0ustar liggesusers--- title: 'Report: statcheck results' output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE, eval=TRUE, message=FALSE, warning=FALSE) ``` ```{r} library(statcheck) pack <- sessionInfo()$otherPkgs info_statcheck <- pack[[which(names(pack)=="statcheck")]] version <- info_statcheck$Version date <- info_statcheck$Date year <- strsplit(date,"-")[[1]][1] ``` *These results were automatically generated with the R package "statcheck" (Epskamp & Nuijten, `r year`), version `r version`.* ## Output statcheck The table below reports the statcheck results of your manuscript. The table lists all Null Hypothesis Significance Tests that are reported according to the APA style, and indicates whether the reported p-value matches a recomputed p-value based on the reported test statistic and degrees of freedom. The first column provides green dots to indicate a consistent result, yellow dots for an inconsistent result not bearing on significance, and red dots to indicate an inconsistent result that bears on significance at the .05 level. ```{r} setwd(system.file("rmd", package="statcheck")) load("statcheckOutput.RData") stat <- statcheckOutput stat$Consistency[stat$Error==FALSE & stat$DecisionError==FALSE] <- "Consistent" stat$Consistency[stat$Error==TRUE & stat$DecisionError==FALSE] <- "**Inconsistency**" stat$Consistency[stat$Error==TRUE & stat$DecisionError==TRUE] <- "**Decision Inconsistency**" stat_sparse <- stat[c("Source","Raw","Computed","Consistency")] colnames(stat_sparse) <- c("Article","Result As Given In Text","Computed P-Value","Consistency") ## # create color coding for the errors red <- "$\\bullet$" yellow <- "$\\bullet$" green <- "$\\bullet$" Code <- NA Code[stat_sparse$Consistency == "**Decision Inconsistency**"] <- red Code[stat_sparse$Consistency == "**Inconsistency**"] <- yellow Code[stat_sparse$Consistency == "Consistent"] <- green ## stat_sparse <- cbind(Code,stat_sparse) knitr::kable(stat_sparse) ``` *** ## What is statcheck? statcheck (Epskamp & Nuijten, `r year`) is an R package that automatically extracts statistical results from papers and checks the internal consistency of those results. statcheck roughly works as follows: 1. Convert PDF or HTML to raw text 2. Use regular expressions to search for APA reported t-tests, F-tests, $\chi^2$-tests, Q-tests, Z-tests, and correlations. 3. Use reported test statistics and degrees of freedom to recalculate the p-value 4. Compare the reported p-value with the recalculated p-value 5. Flag inconsistent results as an Inconsistency 6. When the reported p-value is significant ($\alpha$ = .05) and the recalculated p-value is not, or vice versa, flag this result as a Decision Inconsistency (also sometimes identified as a "Gross Inconsistency") statcheck takes into account one-sided testing as follows. If somewhere in the paper the words "one-sided", "one-tailed", or "directional" are mentioned, *and* the reported p-value would have been consistent if it was a one-sided test, statcheck counts it as a one-sided test and does not flag it as inconsistent. ## Interpretation The variables in the table above can be interpreted as follows. Variable | Interpretation ---------|----------------------------------------------------------------------------- Code | Color coding for inconsistencies. Green = Consistent, Yellow = Inconsistency, Red = Decision Inconsistency Source | The name of the file that was checked Raw | The full raw statistical result that was extracted Computed | The recomputed p-value based on the reported test statistic and degrees of freedom Consistency | Consistent = The reported p-value is consistent; Inconsistency = The reported p-value is not consistent; Decision Inconsistency = The reported p-value is not consistent and bears on significance ($\alpha$ = .05) ## Disclaimer Please note that statcheck is an automated procedure and does not offer any explanations for detected inconsistencies (e.g., incorrect rounding, erroneous retrieval from computer output, a copy-paste error, or a a typo). Also note that in the case of a flagged inconsistency, statcheck assumes that the p-value is the number that is misreported. However, it could well be the case that an inconsistent result is caused by a wrong test statistic or degrees of freedom. For more details on what statcheck can and cannot do, and a list of common reasons why statcheck either does not find statistics or flags them as inconsistent, see the manual at . *** ## References Nuijten, M.B., Hartgerink, C. H. J., van Assen, M. A. L. M., Epskamp, S., & Wicherts, J. M. (2016). The prevalence of statistical reporting errors in psychology (1985-2013). *Behavior Research Methods*, *48 (4)*, 1205-1226.. DOI: 10.3758/s13428-015-0664-2 Epskamp, S., & Nuijten, M. B. (`r year`). statcheck: Extract statistics from articles and recompute p-values. R package version `r version`.statcheck/inst/GPL3.txt0000644000176200001440000007657514350273527014502 0ustar liggesusersGNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS